From 6053795334fbd8851ff3b47d9b42ebb2e04da58c Mon Sep 17 00:00:00 2001 From: Luzian Serafin Date: Fri, 2 Jun 2017 22:58:13 +0200 Subject: [PATCH] Add Solidity --- gulpfile.js | 3 +- src/monaco.contribution.ts | 6 + src/solidity.ts | 177 ++++++++++++++++++++++++++++++ test/all.js | 3 +- test/solidity.test.ts | 218 +++++++++++++++++++++++++++++++++++++ 5 files changed, 405 insertions(+), 2 deletions(-) create mode 100644 src/solidity.ts create mode 100644 test/solidity.test.ts diff --git a/gulpfile.js b/gulpfile.js index 1a1af34c..57219673 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -74,7 +74,8 @@ gulp.task('release', ['clean-release','compile'], function() { bundleOne('src/swift'), bundleOne('src/vb'), bundleOne('src/xml'), - bundleOne('src/yaml') + bundleOne('src/yaml'), + bundleOne('src/solidity') ) .pipe(uglify({ preserveComments: 'some' diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index 318a204f..68fdb035 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -254,3 +254,9 @@ registerLanguage({ mimetypes: ['application/x-yaml'], module: './yaml' }); +registerLanguage({ + id: 'sol', + extensions: [ '.sol' ], + aliases: [ 'sol','solidity','Solidity' ], + module: './solidity' +}); diff --git a/src/solidity.ts b/src/solidity.ts new file mode 100644 index 00000000..abec0d41 --- /dev/null +++ b/src/solidity.ts @@ -0,0 +1,177 @@ +'use strict'; + +import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration; +import ILanguage = monaco.languages.IMonarchLanguage; + +export var conf:IRichLanguageConfiguration = { + comments: { + lineComment: '//', + blockComment: ['/*', '*/'], + }, + brackets: [['{','}'], ['[',']'], ['(',')'], ['<','>']], + autoClosingPairs: [ + { open: '"', close: '"', notIn: ['string', 'comment'] }, + { open: '{', close: '}', notIn: ['string', 'comment'] }, + { open: '[', close: ']', notIn: ['string', 'comment'] }, + { open: '(', close: ')', notIn: ['string', 'comment'] }, + ] +}; + +export var language = { + defaultToken: '', + tokenPostfix: '.sol', + + brackets: [ + { token: 'delimiter.curly', open: '{', close: '}' }, + { token: 'delimiter.parenthesis', open: '(', close: ')' }, + { token: 'delimiter.square', open: '[', close: ']' }, + { token: 'delimiter.angle', open: '<', close: '>' } + ], + + keywords: [ + // Main keywords + 'pragma', + 'solidity', + 'contract', + 'library', + 'using', + 'struct', + 'function', + 'modifier', + //Built-in types + 'address', + 'string', + 'bool', + //Other types + 'Int' , 'Uint' , 'Byte', 'Fixed' , 'Ufixed', + //All int + 'int' , 'int8' , 'int16' , 'int24' , 'int32' , 'int40' , 'int48' , 'int56' , 'int64' , 'int72' , 'int80' , 'int88' , 'int96' , 'int104' , 'int112' , 'int120' , 'int128' , 'int136' , 'int144' , 'int152' , 'int160' , 'int168' , 'int176' , 'int184' , 'int192' , 'int200' , 'int208' , 'int216' , 'int224' , 'int232' , 'int240' , 'int248' , 'int256', + //All uint + 'uint' , 'uint8' , 'uint16' , 'uint24' , 'uint32' , 'uint40' , 'uint48' , 'uint56' , 'uint64' , 'uint72' , 'uint80' , 'uint88' , 'uint96' , 'uint104' , 'uint112' , 'uint120' , 'uint128' , 'uint136' , 'uint144' , 'uint152' , 'uint160' , 'uint168' , 'uint176' , 'uint184' , 'uint192' , 'uint200' , 'uint208' , 'uint216' , 'uint224' , 'uint232' , 'uint240' , 'uint248' , 'uint256', + //All Byte + 'byte' , 'bytes' , 'bytes1' , 'bytes2' , 'bytes3' , 'bytes4' , 'bytes5' , 'bytes6' , 'bytes7' , 'bytes8' , 'bytes9' , 'bytes10' , 'bytes11' , 'bytes12' , 'bytes13' , 'bytes14' , 'bytes15' , 'bytes16' , 'bytes17' , 'bytes18' , 'bytes19' , 'bytes20' , 'bytes21' , 'bytes22' , 'bytes23' , 'bytes24' , 'bytes25' , 'bytes26' , 'bytes27' , 'bytes28' , 'bytes29' , 'bytes30' , 'bytes31' , 'bytes32', + //All fixed + 'fixed' , 'fixed0x8' , 'fixed0x16' , 'fixed0x24' , 'fixed0x32' , 'fixed0x40' , 'fixed0x48' , 'fixed0x56' , 'fixed0x64' , 'fixed0x72' , 'fixed0x80' , 'fixed0x88' , 'fixed0x96' , 'fixed0x104' , 'fixed0x112' , 'fixed0x120' , 'fixed0x128' , 'fixed0x136' , 'fixed0x144' , 'fixed0x152' , 'fixed0x160' , 'fixed0x168' , 'fixed0x176' , 'fixed0x184' , 'fixed0x192' , 'fixed0x200' , 'fixed0x208' , 'fixed0x216' , 'fixed0x224' , 'fixed0x232' , 'fixed0x240' , 'fixed0x248' , 'fixed0x256' , 'fixed8x8' , 'fixed8x16' , 'fixed8x24' , 'fixed8x32' , 'fixed8x40' , 'fixed8x48' , 'fixed8x56' , 'fixed8x64' , 'fixed8x72' , 'fixed8x80' , 'fixed8x88' , 'fixed8x96' , 'fixed8x104' , 'fixed8x112' , 'fixed8x120' , 'fixed8x128' , 'fixed8x136' , 'fixed8x144' , 'fixed8x152' , 'fixed8x160' , 'fixed8x168' , 'fixed8x176' , 'fixed8x184' , 'fixed8x192' , 'fixed8x200' , 'fixed8x208' , 'fixed8x216' , 'fixed8x224' , 'fixed8x232' , 'fixed8x240' , 'fixed8x248' , 'fixed16x8' , 'fixed16x16' , 'fixed16x24' , 'fixed16x32' , 'fixed16x40' , 'fixed16x48' , 'fixed16x56' , 'fixed16x64' , 'fixed16x72' , 'fixed16x80' , 'fixed16x88' , 'fixed16x96' , 'fixed16x104' , 'fixed16x112' , 'fixed16x120' , 'fixed16x128' , 'fixed16x136' , 'fixed16x144' , 'fixed16x152' , 'fixed16x160' , 'fixed16x168' , 'fixed16x176' , 'fixed16x184' , 'fixed16x192' , 'fixed16x200' , 'fixed16x208' , 'fixed16x216' , 'fixed16x224' , 'fixed16x232' , 'fixed16x240' , 'fixed24x8' , 'fixed24x16' , 'fixed24x24' , 'fixed24x32' , 'fixed24x40' , 'fixed24x48' , 'fixed24x56' , 'fixed24x64' , 'fixed24x72' , 'fixed24x80' , 'fixed24x88' , 'fixed24x96' , 'fixed24x104' , 'fixed24x112' , 'fixed24x120' , 'fixed24x128' , 'fixed24x136' , 'fixed24x144' , 'fixed24x152' , 'fixed24x160' , 'fixed24x168' , 'fixed24x176' , 'fixed24x184' , 'fixed24x192' , 'fixed24x200' , 'fixed24x208' , 'fixed24x216' , 'fixed24x224' , 'fixed24x232' , 'fixed32x8' , 'fixed32x16' , 'fixed32x24' , 'fixed32x32' , 'fixed32x40' , 'fixed32x48' , 'fixed32x56' , 'fixed32x64' , 'fixed32x72' , 'fixed32x80' , 'fixed32x88' , 'fixed32x96' , 'fixed32x104' , 'fixed32x112' , 'fixed32x120' , 'fixed32x128' , 'fixed32x136' , 'fixed32x144' , 'fixed32x152' , 'fixed32x160' , 'fixed32x168' , 'fixed32x176' , 'fixed32x184' , 'fixed32x192' , 'fixed32x200' , 'fixed32x208' , 'fixed32x216' , 'fixed32x224' , 'fixed40x8' , 'fixed40x16' , 'fixed40x24' , 'fixed40x32' , 'fixed40x40' , 'fixed40x48' , 'fixed40x56' , 'fixed40x64' , 'fixed40x72' , 'fixed40x80' , 'fixed40x88' , 'fixed40x96' , 'fixed40x104' , 'fixed40x112' , 'fixed40x120' , 'fixed40x128' , 'fixed40x136' , 'fixed40x144' , 'fixed40x152' , 'fixed40x160' , 'fixed40x168' , 'fixed40x176' , 'fixed40x184' , 'fixed40x192' , 'fixed40x200' , 'fixed40x208' , 'fixed40x216' , 'fixed48x8' , 'fixed48x16' , 'fixed48x24' , 'fixed48x32' , 'fixed48x40' , 'fixed48x48' , 'fixed48x56' , 'fixed48x64' , 'fixed48x72' , 'fixed48x80' , 'fixed48x88' , 'fixed48x96' , 'fixed48x104' , 'fixed48x112' , 'fixed48x120' , 'fixed48x128' , 'fixed48x136' , 'fixed48x144' , 'fixed48x152' , 'fixed48x160' , 'fixed48x168' , 'fixed48x176' , 'fixed48x184' , 'fixed48x192' , 'fixed48x200' , 'fixed48x208' , 'fixed56x8' , 'fixed56x16' , 'fixed56x24' , 'fixed56x32' , 'fixed56x40' , 'fixed56x48' , 'fixed56x56' , 'fixed56x64' , 'fixed56x72' , 'fixed56x80' , 'fixed56x88' , 'fixed56x96' , 'fixed56x104' , 'fixed56x112' , 'fixed56x120' , 'fixed56x128' , 'fixed56x136' , 'fixed56x144' , 'fixed56x152' , 'fixed56x160' , 'fixed56x168' , 'fixed56x176' , 'fixed56x184' , 'fixed56x192' , 'fixed56x200' , 'fixed64x8' , 'fixed64x16' , 'fixed64x24' , 'fixed64x32' , 'fixed64x40' , 'fixed64x48' , 'fixed64x56' , 'fixed64x64' , 'fixed64x72' , 'fixed64x80' , 'fixed64x88' , 'fixed64x96' , 'fixed64x104' , 'fixed64x112' , 'fixed64x120' , 'fixed64x128' , 'fixed64x136' , 'fixed64x144' , 'fixed64x152' , 'fixed64x160' , 'fixed64x168' , 'fixed64x176' , 'fixed64x184' , 'fixed64x192' , 'fixed72x8' , 'fixed72x16' , 'fixed72x24' , 'fixed72x32' , 'fixed72x40' , 'fixed72x48' , 'fixed72x56' , 'fixed72x64' , 'fixed72x72' , 'fixed72x80' , 'fixed72x88' , 'fixed72x96' , 'fixed72x104' , 'fixed72x112' , 'fixed72x120' , 'fixed72x128' , 'fixed72x136' , 'fixed72x144' , 'fixed72x152' , 'fixed72x160' , 'fixed72x168' , 'fixed72x176' , 'fixed72x184' , 'fixed80x8' , 'fixed80x16' , 'fixed80x24' , 'fixed80x32' , 'fixed80x40' , 'fixed80x48' , 'fixed80x56' , 'fixed80x64' , 'fixed80x72' , 'fixed80x80' , 'fixed80x88' , 'fixed80x96' , 'fixed80x104' , 'fixed80x112' , 'fixed80x120' , 'fixed80x128' , 'fixed80x136' , 'fixed80x144' , 'fixed80x152' , 'fixed80x160' , 'fixed80x168' , 'fixed80x176' , 'fixed88x8' , 'fixed88x16' , 'fixed88x24' , 'fixed88x32' , 'fixed88x40' , 'fixed88x48' , 'fixed88x56' , 'fixed88x64' , 'fixed88x72' , 'fixed88x80' , 'fixed88x88' , 'fixed88x96' , 'fixed88x104' , 'fixed88x112' , 'fixed88x120' , 'fixed88x128' , 'fixed88x136' , 'fixed88x144' , 'fixed88x152' , 'fixed88x160' , 'fixed88x168' , 'fixed96x8' , 'fixed96x16' , 'fixed96x24' , 'fixed96x32' , 'fixed96x40' , 'fixed96x48' , 'fixed96x56' , 'fixed96x64' , 'fixed96x72' , 'fixed96x80' , 'fixed96x88' , 'fixed96x96' , 'fixed96x104' , 'fixed96x112' , 'fixed96x120' , 'fixed96x128' , 'fixed96x136' , 'fixed96x144' , 'fixed96x152' , 'fixed96x160' , 'fixed104x8' , 'fixed104x16' , 'fixed104x24' , 'fixed104x32' , 'fixed104x40' , 'fixed104x48' , 'fixed104x56' , 'fixed104x64' , 'fixed104x72' , 'fixed104x80' , 'fixed104x88' , 'fixed104x96' , 'fixed104x104' , 'fixed104x112' , 'fixed104x120' , 'fixed104x128' , 'fixed104x136' , 'fixed104x144' , 'fixed104x152' , 'fixed112x8' , 'fixed112x16' , 'fixed112x24' , 'fixed112x32' , 'fixed112x40' , 'fixed112x48' , 'fixed112x56' , 'fixed112x64' , 'fixed112x72' , 'fixed112x80' , 'fixed112x88' , 'fixed112x96' , 'fixed112x104' , 'fixed112x112' , 'fixed112x120' , 'fixed112x128' , 'fixed112x136' , 'fixed112x144' , 'fixed120x8' , 'fixed120x16' , 'fixed120x24' , 'fixed120x32' , 'fixed120x40' , 'fixed120x48' , 'fixed120x56' , 'fixed120x64' , 'fixed120x72' , 'fixed120x80' , 'fixed120x88' , 'fixed120x96' , 'fixed120x104' , 'fixed120x112' , 'fixed120x120' , 'fixed120x128' , 'fixed120x136' , 'fixed128x8' , 'fixed128x16' , 'fixed128x24' , 'fixed128x32' , 'fixed128x40' , 'fixed128x48' , 'fixed128x56' , 'fixed128x64' , 'fixed128x72' , 'fixed128x80' , 'fixed128x88' , 'fixed128x96' , 'fixed128x104' , 'fixed128x112' , 'fixed128x120' , 'fixed128x128' , 'fixed136x8' , 'fixed136x16' , 'fixed136x24' , 'fixed136x32' , 'fixed136x40' , 'fixed136x48' , 'fixed136x56' , 'fixed136x64' , 'fixed136x72' , 'fixed136x80' , 'fixed136x88' , 'fixed136x96' , 'fixed136x104' , 'fixed136x112' , 'fixed136x120' , 'fixed144x8' , 'fixed144x16' , 'fixed144x24' , 'fixed144x32' , 'fixed144x40' , 'fixed144x48' , 'fixed144x56' , 'fixed144x64' , 'fixed144x72' , 'fixed144x80' , 'fixed144x88' , 'fixed144x96' , 'fixed144x104' , 'fixed144x112' , 'fixed152x8' , 'fixed152x16' , 'fixed152x24' , 'fixed152x32' , 'fixed152x40' , 'fixed152x48' , 'fixed152x56' , 'fixed152x64' , 'fixed152x72' , 'fixed152x80' , 'fixed152x88' , 'fixed152x96' , 'fixed152x104' , 'fixed160x8' , 'fixed160x16' , 'fixed160x24' , 'fixed160x32' , 'fixed160x40' , 'fixed160x48' , 'fixed160x56' , 'fixed160x64' , 'fixed160x72' , 'fixed160x80' , 'fixed160x88' , 'fixed160x96' , 'fixed168x8' , 'fixed168x16' , 'fixed168x24' , 'fixed168x32' , 'fixed168x40' , 'fixed168x48' , 'fixed168x56' , 'fixed168x64' , 'fixed168x72' , 'fixed168x80' , 'fixed168x88' , 'fixed176x8' , 'fixed176x16' , 'fixed176x24' , 'fixed176x32' , 'fixed176x40' , 'fixed176x48' , 'fixed176x56' , 'fixed176x64' , 'fixed176x72' , 'fixed176x80' , 'fixed184x8' , 'fixed184x16' , 'fixed184x24' , 'fixed184x32' , 'fixed184x40' , 'fixed184x48' , 'fixed184x56' , 'fixed184x64' , 'fixed184x72' , 'fixed192x8' , 'fixed192x16' , 'fixed192x24' , 'fixed192x32' , 'fixed192x40' , 'fixed192x48' , 'fixed192x56' , 'fixed192x64' , 'fixed200x8' , 'fixed200x16' , 'fixed200x24' , 'fixed200x32' , 'fixed200x40' , 'fixed200x48' , 'fixed200x56' , 'fixed208x8' , 'fixed208x16' , 'fixed208x24' , 'fixed208x32' , 'fixed208x40' , 'fixed208x48' , 'fixed216x8' , 'fixed216x16' , 'fixed216x24' , 'fixed216x32' , 'fixed216x40' , 'fixed224x8' , 'fixed224x16' , 'fixed224x24' , 'fixed224x32' , 'fixed232x8' , 'fixed232x16' , 'fixed232x24' , 'fixed240x8' , 'fixed240x16' , 'fixed248x8', + //All ufixed + 'ufixed' , 'ufixed0x8' , 'ufixed0x16' , 'ufixed0x24' , 'ufixed0x32' , 'ufixed0x40' , 'ufixed0x48' , 'ufixed0x56' , 'ufixed0x64' , 'ufixed0x72' , 'ufixed0x80' , 'ufixed0x88' , 'ufixed0x96' , 'ufixed0x104' , 'ufixed0x112' , 'ufixed0x120' , 'ufixed0x128' , 'ufixed0x136' , 'ufixed0x144' , 'ufixed0x152' , 'ufixed0x160' , 'ufixed0x168' , 'ufixed0x176' , 'ufixed0x184' , 'ufixed0x192' , 'ufixed0x200' , 'ufixed0x208' , 'ufixed0x216' , 'ufixed0x224' , 'ufixed0x232' , 'ufixed0x240' , 'ufixed0x248' , 'ufixed0x256' , 'ufixed8x8' , 'ufixed8x16' , 'ufixed8x24' , 'ufixed8x32' , 'ufixed8x40' , 'ufixed8x48' , 'ufixed8x56' , 'ufixed8x64' , 'ufixed8x72' , 'ufixed8x80' , 'ufixed8x88' , 'ufixed8x96' , 'ufixed8x104' , 'ufixed8x112' , 'ufixed8x120' , 'ufixed8x128' , 'ufixed8x136' , 'ufixed8x144' , 'ufixed8x152' , 'ufixed8x160' , 'ufixed8x168' , 'ufixed8x176' , 'ufixed8x184' , 'ufixed8x192' , 'ufixed8x200' , 'ufixed8x208' , 'ufixed8x216' , 'ufixed8x224' , 'ufixed8x232' , 'ufixed8x240' , 'ufixed8x248' , 'ufixed16x8' , 'ufixed16x16' , 'ufixed16x24' , 'ufixed16x32' , 'ufixed16x40' , 'ufixed16x48' , 'ufixed16x56' , 'ufixed16x64' , 'ufixed16x72' , 'ufixed16x80' , 'ufixed16x88' , 'ufixed16x96' , 'ufixed16x104' , 'ufixed16x112' , 'ufixed16x120' , 'ufixed16x128' , 'ufixed16x136' , 'ufixed16x144' , 'ufixed16x152' , 'ufixed16x160' , 'ufixed16x168' , 'ufixed16x176' , 'ufixed16x184' , 'ufixed16x192' , 'ufixed16x200' , 'ufixed16x208' , 'ufixed16x216' , 'ufixed16x224' , 'ufixed16x232' , 'ufixed16x240' , 'ufixed24x8' , 'ufixed24x16' , 'ufixed24x24' , 'ufixed24x32' , 'ufixed24x40' , 'ufixed24x48' , 'ufixed24x56' , 'ufixed24x64' , 'ufixed24x72' , 'ufixed24x80' , 'ufixed24x88' , 'ufixed24x96' , 'ufixed24x104' , 'ufixed24x112' , 'ufixed24x120' , 'ufixed24x128' , 'ufixed24x136' , 'ufixed24x144' , 'ufixed24x152' , 'ufixed24x160' , 'ufixed24x168' , 'ufixed24x176' , 'ufixed24x184' , 'ufixed24x192' , 'ufixed24x200' , 'ufixed24x208' , 'ufixed24x216' , 'ufixed24x224' , 'ufixed24x232' , 'ufixed32x8' , 'ufixed32x16' , 'ufixed32x24' , 'ufixed32x32' , 'ufixed32x40' , 'ufixed32x48' , 'ufixed32x56' , 'ufixed32x64' , 'ufixed32x72' , 'ufixed32x80' , 'ufixed32x88' , 'ufixed32x96' , 'ufixed32x104' , 'ufixed32x112' , 'ufixed32x120' , 'ufixed32x128' , 'ufixed32x136' , 'ufixed32x144' , 'ufixed32x152' , 'ufixed32x160' , 'ufixed32x168' , 'ufixed32x176' , 'ufixed32x184' , 'ufixed32x192' , 'ufixed32x200' , 'ufixed32x208' , 'ufixed32x216' , 'ufixed32x224' , 'ufixed40x8' , 'ufixed40x16' , 'ufixed40x24' , 'ufixed40x32' , 'ufixed40x40' , 'ufixed40x48' , 'ufixed40x56' , 'ufixed40x64' , 'ufixed40x72' , 'ufixed40x80' , 'ufixed40x88' , 'ufixed40x96' , 'ufixed40x104' , 'ufixed40x112' , 'ufixed40x120' , 'ufixed40x128' , 'ufixed40x136' , 'ufixed40x144' , 'ufixed40x152' , 'ufixed40x160' , 'ufixed40x168' , 'ufixed40x176' , 'ufixed40x184' , 'ufixed40x192' , 'ufixed40x200' , 'ufixed40x208' , 'ufixed40x216' , 'ufixed48x8' , 'ufixed48x16' , 'ufixed48x24' , 'ufixed48x32' , 'ufixed48x40' , 'ufixed48x48' , 'ufixed48x56' , 'ufixed48x64' , 'ufixed48x72' , 'ufixed48x80' , 'ufixed48x88' , 'ufixed48x96' , 'ufixed48x104' , 'ufixed48x112' , 'ufixed48x120' , 'ufixed48x128' , 'ufixed48x136' , 'ufixed48x144' , 'ufixed48x152' , 'ufixed48x160' , 'ufixed48x168' , 'ufixed48x176' , 'ufixed48x184' , 'ufixed48x192' , 'ufixed48x200' , 'ufixed48x208' , 'ufixed56x8' , 'ufixed56x16' , 'ufixed56x24' , 'ufixed56x32' , 'ufixed56x40' , 'ufixed56x48' , 'ufixed56x56' , 'ufixed56x64' , 'ufixed56x72' , 'ufixed56x80' , 'ufixed56x88' , 'ufixed56x96' , 'ufixed56x104' , 'ufixed56x112' , 'ufixed56x120' , 'ufixed56x128' , 'ufixed56x136' , 'ufixed56x144' , 'ufixed56x152' , 'ufixed56x160' , 'ufixed56x168' , 'ufixed56x176' , 'ufixed56x184' , 'ufixed56x192' , 'ufixed56x200' , 'ufixed64x8' , 'ufixed64x16' , 'ufixed64x24' , 'ufixed64x32' , 'ufixed64x40' , 'ufixed64x48' , 'ufixed64x56' , 'ufixed64x64' , 'ufixed64x72' , 'ufixed64x80' , 'ufixed64x88' , 'ufixed64x96' , 'ufixed64x104' , 'ufixed64x112' , 'ufixed64x120' , 'ufixed64x128' , 'ufixed64x136' , 'ufixed64x144' , 'ufixed64x152' , 'ufixed64x160' , 'ufixed64x168' , 'ufixed64x176' , 'ufixed64x184' , 'ufixed64x192' , 'ufixed72x8' , 'ufixed72x16' , 'ufixed72x24' , 'ufixed72x32' , 'ufixed72x40' , 'ufixed72x48' , 'ufixed72x56' , 'ufixed72x64' , 'ufixed72x72' , 'ufixed72x80' , 'ufixed72x88' , 'ufixed72x96' , 'ufixed72x104' , 'ufixed72x112' , 'ufixed72x120' , 'ufixed72x128' , 'ufixed72x136' , 'ufixed72x144' , 'ufixed72x152' , 'ufixed72x160' , 'ufixed72x168' , 'ufixed72x176' , 'ufixed72x184' , 'ufixed80x8' , 'ufixed80x16' , 'ufixed80x24' , 'ufixed80x32' , 'ufixed80x40' , 'ufixed80x48' , 'ufixed80x56' , 'ufixed80x64' , 'ufixed80x72' , 'ufixed80x80' , 'ufixed80x88' , 'ufixed80x96' , 'ufixed80x104' , 'ufixed80x112' , 'ufixed80x120' , 'ufixed80x128' , 'ufixed80x136' , 'ufixed80x144' , 'ufixed80x152' , 'ufixed80x160' , 'ufixed80x168' , 'ufixed80x176' , 'ufixed88x8' , 'ufixed88x16' , 'ufixed88x24' , 'ufixed88x32' , 'ufixed88x40' , 'ufixed88x48' , 'ufixed88x56' , 'ufixed88x64' , 'ufixed88x72' , 'ufixed88x80' , 'ufixed88x88' , 'ufixed88x96' , 'ufixed88x104' , 'ufixed88x112' , 'ufixed88x120' , 'ufixed88x128' , 'ufixed88x136' , 'ufixed88x144' , 'ufixed88x152' , 'ufixed88x160' , 'ufixed88x168' , 'ufixed96x8' , 'ufixed96x16' , 'ufixed96x24' , 'ufixed96x32' , 'ufixed96x40' , 'ufixed96x48' , 'ufixed96x56' , 'ufixed96x64' , 'ufixed96x72' , 'ufixed96x80' , 'ufixed96x88' , 'ufixed96x96' , 'ufixed96x104' , 'ufixed96x112' , 'ufixed96x120' , 'ufixed96x128' , 'ufixed96x136' , 'ufixed96x144' , 'ufixed96x152' , 'ufixed96x160' , 'ufixed104x8' , 'ufixed104x16' , 'ufixed104x24' , 'ufixed104x32' , 'ufixed104x40' , 'ufixed104x48' , 'ufixed104x56' , 'ufixed104x64' , 'ufixed104x72' , 'ufixed104x80' , 'ufixed104x88' , 'ufixed104x96' , 'ufixed104x104' , 'ufixed104x112' , 'ufixed104x120' , 'ufixed104x128' , 'ufixed104x136' , 'ufixed104x144' , 'ufixed104x152' , 'ufixed112x8' , 'ufixed112x16' , 'ufixed112x24' , 'ufixed112x32' , 'ufixed112x40' , 'ufixed112x48' , 'ufixed112x56' , 'ufixed112x64' , 'ufixed112x72' , 'ufixed112x80' , 'ufixed112x88' , 'ufixed112x96' , 'ufixed112x104' , 'ufixed112x112' , 'ufixed112x120' , 'ufixed112x128' , 'ufixed112x136' , 'ufixed112x144' , 'ufixed120x8' , 'ufixed120x16' , 'ufixed120x24' , 'ufixed120x32' , 'ufixed120x40' , 'ufixed120x48' , 'ufixed120x56' , 'ufixed120x64' , 'ufixed120x72' , 'ufixed120x80' , 'ufixed120x88' , 'ufixed120x96' , 'ufixed120x104' , 'ufixed120x112' , 'ufixed120x120' , 'ufixed120x128' , 'ufixed120x136' , 'ufixed128x8' , 'ufixed128x16' , 'ufixed128x24' , 'ufixed128x32' , 'ufixed128x40' , 'ufixed128x48' , 'ufixed128x56' , 'ufixed128x64' , 'ufixed128x72' , 'ufixed128x80' , 'ufixed128x88' , 'ufixed128x96' , 'ufixed128x104' , 'ufixed128x112' , 'ufixed128x120' , 'ufixed128x128' , 'ufixed136x8' , 'ufixed136x16' , 'ufixed136x24' , 'ufixed136x32' , 'ufixed136x40' , 'ufixed136x48' , 'ufixed136x56' , 'ufixed136x64' , 'ufixed136x72' , 'ufixed136x80' , 'ufixed136x88' , 'ufixed136x96' , 'ufixed136x104' , 'ufixed136x112' , 'ufixed136x120' , 'ufixed144x8' , 'ufixed144x16' , 'ufixed144x24' , 'ufixed144x32' , 'ufixed144x40' , 'ufixed144x48' , 'ufixed144x56' , 'ufixed144x64' , 'ufixed144x72' , 'ufixed144x80' , 'ufixed144x88' , 'ufixed144x96' , 'ufixed144x104' , 'ufixed144x112' , 'ufixed152x8' , 'ufixed152x16' , 'ufixed152x24' , 'ufixed152x32' , 'ufixed152x40' , 'ufixed152x48' , 'ufixed152x56' , 'ufixed152x64' , 'ufixed152x72' , 'ufixed152x80' , 'ufixed152x88' , 'ufixed152x96' , 'ufixed152x104' , 'ufixed160x8' , 'ufixed160x16' , 'ufixed160x24' , 'ufixed160x32' , 'ufixed160x40' , 'ufixed160x48' , 'ufixed160x56' , 'ufixed160x64' , 'ufixed160x72' , 'ufixed160x80' , 'ufixed160x88' , 'ufixed160x96' , 'ufixed168x8' , 'ufixed168x16' , 'ufixed168x24' , 'ufixed168x32' , 'ufixed168x40' , 'ufixed168x48' , 'ufixed168x56' , 'ufixed168x64' , 'ufixed168x72' , 'ufixed168x80' , 'ufixed168x88' , 'ufixed176x8' , 'ufixed176x16' , 'ufixed176x24' , 'ufixed176x32' , 'ufixed176x40' , 'ufixed176x48' , 'ufixed176x56' , 'ufixed176x64' , 'ufixed176x72' , 'ufixed176x80' , 'ufixed184x8' , 'ufixed184x16' , 'ufixed184x24' , 'ufixed184x32' , 'ufixed184x40' , 'ufixed184x48' , 'ufixed184x56' , 'ufixed184x64' , 'ufixed184x72' , 'ufixed192x8' , 'ufixed192x16' , 'ufixed192x24' , 'ufixed192x32' , 'ufixed192x40' , 'ufixed192x48' , 'ufixed192x56' , 'ufixed192x64' , 'ufixed200x8' , 'ufixed200x16' , 'ufixed200x24' , 'ufixed200x32' , 'ufixed200x40' , 'ufixed200x48' , 'ufixed200x56' , 'ufixed208x8' , 'ufixed208x16' , 'ufixed208x24' , 'ufixed208x32' , 'ufixed208x40' , 'ufixed208x48' , 'ufixed216x8' , 'ufixed216x16' , 'ufixed216x24' , 'ufixed216x32' , 'ufixed216x40' , 'ufixed224x8' , 'ufixed224x16' , 'ufixed224x24' , 'ufixed224x32' , 'ufixed232x8' , 'ufixed232x16' , 'ufixed232x24' , 'ufixed240x8' , 'ufixed240x16' , 'ufixed248x8', + 'event', + 'enum', + 'let', + 'mapping', + 'private', + 'public', + 'external', + 'inherited', + 'payable', + 'true', + 'false', + 'var', + 'import', + 'constant', + 'if', + 'else', + 'for', + 'else', + 'for', + 'while', + 'do', + 'break', + 'continue', + 'throw', + 'returns', + 'return', + 'suicide', + 'new', + 'is', + 'this', + 'super' + ], + + operators: [ + '=', '>', '<', '!', '~', '?', ':', + '==', '<=', '>=', '!=', '&&', '||', '++', '--', + '+', '-', '*', '/', '&', '|', '^', '%', '<<', + '>>', '>>>', '+=', '-=', '*=', '/=', '&=', '|=', + '^=', '%=', '<<=', '>>=', '>>>=' + ], + + // we include these common regular expressions + symbols: /[=>](?!@symbols)/, '@brackets'], + [/@symbols/, { cases: { '@operators': 'delimiter', + '@default' : '' } } ], + + // numbers + [/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/, 'number.float'], + [/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/, 'number.float'], + [/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/, 'number.hex'], + [/0[0-7']*[0-7](@integersuffix)/, 'number.octal'], + [/0[bB][0-1']*[0-1](@integersuffix)/, 'number.binary'], + [/\d[\d']*\d(@integersuffix)/, 'number'], + [/\d(@integersuffix)/, 'number'], + + // delimiter: after number because of .\d floats + [/[;,.]/, 'delimiter'], + + // strings + [/"([^"\\]|\\.)*$/, 'string.invalid' ], // non-teminated string + [/"/, 'string', '@string' ], + + // characters + [/'[^\\']'/, 'string'], + [/(')(@escapes)(')/, ['string','string.escape','string']], + [/'/, 'string.invalid'] + ], + + whitespace: [ + [/[ \t\r\n]+/, ''], + [/\/\*\*(?!\/)/, 'comment.doc', '@doccomment' ], + [/\/\*/, 'comment', '@comment' ], + [/\/\/.*$/, 'comment'], + ], + + comment: [ + [/[^\/*]+/, 'comment' ], + [/\*\//, 'comment', '@pop' ], + [/[\/*]/, 'comment' ] + ], + //Identical copy of comment above, except for the addition of .doc + doccomment: [ + [/[^\/*]+/, 'comment.doc' ], + [/\*\//, 'comment.doc', '@pop' ], + [/[\/*]/, 'comment.doc' ] + ], + + string: [ + [/[^\\"]+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/"/, 'string', '@pop' ] + ], + }, +}; \ No newline at end of file diff --git a/test/all.js b/test/all.js index 43de0c9e..5b731479 100644 --- a/test/all.js +++ b/test/all.js @@ -52,7 +52,8 @@ requirejs([ 'out/test/sql.test', 'out/test/vb.test', 'out/test/xml.test', - 'out/test/yaml.test' + 'out/test/yaml.test', + 'out/test/solidity.test', ], function() { run(); // We can launch the tests! }); diff --git a/test/solidity.test.ts b/test/solidity.test.ts new file mode 100644 index 00000000..fb7fadc3 --- /dev/null +++ b/test/solidity.test.ts @@ -0,0 +1,218 @@ +'use strict'; + +import {testTokenization} from './testRunner'; + +testTokenization('sol', [ + // Keywords + [{ + line: 'pragma solidity ^0.4.0;', + tokens: [ + { startIndex: 0, type: 'keyword.pragma.sol' }, + { startIndex: 6, type: '' }, + { startIndex: 7, type: 'keyword.solidity.sol' }, + { startIndex: 15, type: '' }, + { startIndex: 16, type: 'delimiter.sol' }, + { startIndex: 17, type: 'number.float.sol' }, + { startIndex: 22, type: 'delimiter.sol' }, + ]}], + + [{ + line: 'contract Ballot {', + tokens: [ + { startIndex: 0, type: 'keyword.contract.sol' }, + { startIndex: 8, type: '' }, + { startIndex: 9, type: 'identifier.sol' }, + { startIndex: 15, type: '' }, + { startIndex: 16, type: 'delimiter.curly.sol' } + ]}], + + [{ + line: 'struct Voter {', + tokens: [ + { startIndex: 0, type: 'keyword.struct.sol' }, + { startIndex: 6, type: '' }, + { startIndex: 7, type: 'identifier.sol' }, + { startIndex: 12, type: '' }, + { startIndex: 13, type: 'delimiter.curly.sol' } + ]}], + + [{ + line: 'address chairperson;', + tokens: [ + { startIndex: 0, type: 'keyword.address.sol' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'identifier.sol' }, + { startIndex: 19, type: 'delimiter.sol' } + ]}], + + [{ + line: 'int weight;', + tokens: [ + { startIndex: 0, type: 'keyword.int.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'identifier.sol' }, + { startIndex: 10, type: 'delimiter.sol' }, + ]}], + + [{ + line: 'mapping(address => Voter) voters;', + tokens: [ + { startIndex: 0, type: 'keyword.mapping.sol' }, + { startIndex: 7, type: 'delimiter.parenthesis.sol' }, + { startIndex: 8, type: 'keyword.address.sol' }, + { startIndex: 15, type: '' }, + { startIndex: 19, type: 'identifier.sol' }, + { startIndex: 24, type: 'delimiter.parenthesis.sol' }, + { startIndex: 25, type: '' }, + { startIndex: 26, type: 'identifier.sol' }, + { startIndex: 32, type: 'delimiter.sol' }, + ]}], + + [{ + line: 'function Ballot(uint8 _numProposals) {', + tokens: [ + { startIndex: 0, type: 'keyword.function.sol' }, + { startIndex: 8, type: '' }, + { startIndex: 9, type: 'identifier.sol' }, + { startIndex: 15, type: 'delimiter.parenthesis.sol' }, + { startIndex: 16, type: 'keyword.uint8.sol' }, + { startIndex: 21, type: '' }, + { startIndex: 22, type: 'identifier.sol' }, + { startIndex: 35, type: 'delimiter.parenthesis.sol' }, + { startIndex: 36, type: '' }, + { startIndex: 37, type: 'delimiter.curly.sol' }, + ]}], + + // Comments - single line + [{ + line: '//', + tokens: [ + { startIndex: 0, type: 'comment.sol' } + ]}], + + [{ + line: ' // a comment', + tokens: [ + { startIndex: 0, type: '' }, + { startIndex: 4, type: 'comment.sol' } + ]}], + + [{ + line: '// a comment', + tokens: [ + { startIndex: 0, type: 'comment.sol' } + ]}], + + [{ + line: '//sticky comment', + tokens: [ + { startIndex: 0, type: 'comment.sol' } + ]}], + + [{ + line: '/almost a comment', + tokens: [ + { startIndex: 0, type: 'delimiter.sol' }, + { startIndex: 1, type: 'identifier.sol' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'identifier.sol' }, + { startIndex: 9, type: '' }, + { startIndex: 10, type: 'identifier.sol' } + ]}], + + [{ + line: '/* //*/ a', + tokens: [ + { startIndex: 0, type: 'comment.sol' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'identifier.sol' } + ]}], + + [{ + line: '1 / 2; /* comment', + tokens: [ + { startIndex: 0, type: 'number.sol' }, + { startIndex: 1, type: '' }, + { startIndex: 2, type: 'delimiter.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'number.sol' }, + { startIndex: 5, type: 'delimiter.sol' }, + { startIndex: 6, type: '' }, + { startIndex: 7, type: 'comment.sol' } + ]}], + + [{ + line: 'int x = 1; // my comment // is a nice one', + tokens: [ + { startIndex: 0, type: 'keyword.int.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'identifier.sol' }, + { startIndex: 5, type: '' }, + { startIndex: 6, type: 'delimiter.sol' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'number.sol' }, + { startIndex: 9, type: 'delimiter.sol' }, + { startIndex: 10, type: '' }, + { startIndex: 11, type: 'comment.sol' } + ]}], + + // Comments - range comment, single line + [{ + line: '/* a simple comment */', + tokens: [ + { startIndex: 0, type: 'comment.sol' } + ]}], + + [{ + line: 'int x = /* a simple comment */ 1;', + tokens: [ + { startIndex: 0, type: 'keyword.int.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'identifier.sol' }, + { startIndex: 5, type: '' }, + { startIndex: 6, type: 'delimiter.sol' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'comment.sol' }, + { startIndex: 30, type: '' }, + { startIndex: 31, type: 'number.sol' }, + { startIndex: 32, type: 'delimiter.sol' } + ]}], + + [{ + line: 'int x = /* comment */ 1; */', + tokens: [ + { startIndex: 0, type: 'keyword.int.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'identifier.sol' }, + { startIndex: 5, type: '' }, + { startIndex: 6, type: 'delimiter.sol' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'comment.sol' }, + { startIndex: 21, type: '' }, + { startIndex: 22, type: 'number.sol' }, + { startIndex: 23, type: 'delimiter.sol' }, + { startIndex: 24, type: '' } + ]}], + + [{ + line: 'x = /**/;', + tokens: [ + { startIndex: 0, type: 'identifier.sol' }, + { startIndex: 1, type: '' }, + { startIndex: 2, type: 'delimiter.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'comment.sol' }, + { startIndex: 8, type: 'delimiter.sol' } + ]}], + + [{ + line: 'x = /*/;', + tokens: [ + { startIndex: 0, type: 'identifier.sol' }, + { startIndex: 1, type: '' }, + { startIndex: 2, type: 'delimiter.sol' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'comment.sol' } + ]}], + +]);