├── README.md ├── tsconfig.json ├── .gitignore ├── package.json ├── LICENSE ├── test.js.map ├── test.js ├── test.ts ├── fixtures ├── es5.js ├── es2015-script.js └── es2015-module.js ├── typings └── estree │ ├── flow.d.ts │ └── estree.d.ts ├── index.js.map ├── index.js └── index.ts /README.md: -------------------------------------------------------------------------------- 1 | # typescript-estree 2 | TypeScript => ESTree AST converter (WIP) 3 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "noImplicitAny": true, 5 | "sourceMap": true 6 | }, 7 | "files": [ 8 | "index.ts", 9 | "test.ts" 10 | ] 11 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-estree", 3 | "version": "1.0.0", 4 | "description": "TypeScript => ESTree AST converter", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "node test" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/rreverser/typescript-estree.git" 12 | }, 13 | "keywords": [ 14 | "typescript", 15 | "estree", 16 | "spidermonkey", 17 | "ast", 18 | "converter" 19 | ], 20 | "author": "Ingvar Stepanyan (https://rreverser.com/)", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/rreverser/typescript-estree/issues" 24 | }, 25 | "homepage": "https://github.com/rreverser/typescript-estree#readme", 26 | "dependencies": { 27 | "typescript": "^1.5.3" 28 | }, 29 | "devDependencies": { 30 | "acorn": "^2.1.0", 31 | "better-log": "^1.3.3", 32 | "source-map-support": "^0.3.2" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Ingvar Stepanyan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /test.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":["diffAST","test"],"mappings":"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"} -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | var better_log_1 = require('better-log'); 5 | require('source-map-support/register'); 6 | var acorn_1 = require('acorn'); 7 | var _1 = require('./'); 8 | var fs_1 = require('fs'); 9 | var ts = require('typescript'); 10 | better_log_1.install({ depth: 3 }); 11 | function diffAST(path) { 12 | var last = path[path.length - 1]; 13 | var src = last.src; 14 | var gen = last.gen; 15 | if (typeof src !== 'object' || src === null || typeof gen !== 'object' || gen === null) { 16 | if (src != gen) { 17 | var owner = last; 18 | if (path.length >= 2) { 19 | owner = path[path.length - 2]; 20 | if (owner.src.type === 'Program' && last.key === 'sourceType') { 21 | // KNOWN 22 | return; 23 | } 24 | if (owner.src.type === 'MethodDefinition' && last.key === 'kind') { 25 | // KNOWN 26 | return; 27 | } 28 | if (path.length >= 3 && path[path.length - 3].src.type) { 29 | owner = path[path.length - 3]; 30 | } 31 | } 32 | console.warn({ 33 | path: path.map(function (item) { 34 | return item.key; 35 | }).join('.'), 36 | srcCode: path[0].code.slice(owner.src.range[0], owner.src.range[1]), 37 | genCode: path[0].code.slice(owner.gen.range[0], owner.gen.range[1]), 38 | srcValue: src, 39 | genValue: gen 40 | }); 41 | } 42 | return; 43 | } 44 | /* 45 | if (src.range && gen.range && (src.range[0] !== gen.range[0] || src.range[1] !== gen.range[1])) { 46 | console.warn({ 47 | path: path.map(function (item) { 48 | return item.key; 49 | }).join('.'), 50 | srcCovers: path[0].code.slice(src.range[0], src.range[1]), 51 | genCovers: path[0].code.slice(gen.range[0], gen.range[1]) 52 | }); 53 | } 54 | */ 55 | for (var key in src) { 56 | var newSrc = src[key]; 57 | var newGen = gen[key]; 58 | if (key !== 'loc' && key !== 'range' && newGen !== undefined) { 59 | diffAST(path.concat([{ 60 | key: key, 61 | src: newSrc, 62 | gen: newGen 63 | }])); 64 | } 65 | } 66 | } 67 | function test(name, version, sourceType) { 68 | console.log(name + "..."); 69 | var sourceCode = fs_1.readFileSync(__dirname + "/fixtures/" + name + ".js", 'utf-8'); 70 | var sourceAst = acorn_1.parse(sourceCode, { 71 | ecmaVersion: version, 72 | locations: true, 73 | ranges: true, 74 | sourceType: sourceType, 75 | sourceFile: 'module.ts' 76 | }); 77 | var generatedAst = _1.checkAndConvert(sourceCode, { 78 | target: version === 5 ? 1 /* ES5 */ : 2 /* ES6 */ 79 | }); 80 | diffAST([{ 81 | key: 'Program', 82 | src: sourceAst, 83 | gen: generatedAst, 84 | code: sourceCode 85 | }]); 86 | console.log("Done " + name); 87 | } 88 | test('es5', 5); 89 | test('es2015-script', 6, 'script'); 90 | test('es2015-module', 6, 'module'); 91 | //# sourceMappingURL=test.js.map -------------------------------------------------------------------------------- /test.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | 5 | declare function installBetterLog(options: {}): void; 6 | declare function checkAndConvert(input: string, options?: ts.CompilerOptions): ESTree.Program; 7 | declare function acornParse(src: string, options: {}): ESTree.Program; 8 | declare function tsParse(src: string, options: ts.CompilerOptions): ESTree.Program; 9 | 10 | import { install as installBetterLog } from 'better-log'; 11 | import 'source-map-support/register'; 12 | import { parse as acornParse } from 'acorn'; 13 | import { checkAndConvert as tsParse } from './'; 14 | import { readFileSync as readFile } from 'fs'; 15 | import * as ts from 'typescript'; 16 | 17 | installBetterLog({ depth: 3 }); 18 | 19 | interface PathItem { 20 | key: string; 21 | src: any; 22 | gen: any; 23 | } 24 | 25 | interface NodePathItem extends PathItem { 26 | key: string; 27 | src: ESTree.Node; 28 | gen: ESTree.Node; 29 | } 30 | 31 | interface ProgramPathItem extends NodePathItem { 32 | code: string; 33 | } 34 | 35 | function diffAST(path: Array) { 36 | var last = path[path.length - 1]; 37 | var src = last.src; 38 | var gen = last.gen; 39 | if (typeof src !== 'object' || src === null || typeof gen !== 'object' || gen === null) { 40 | if (src != gen) { 41 | let owner = last; 42 | if (path.length >= 2) { 43 | owner = path[path.length - 2]; 44 | if (owner.src.type === 'Program' && last.key === 'sourceType') { 45 | // KNOWN 46 | return; 47 | } 48 | if (owner.src.type === 'MethodDefinition' && last.key === 'kind') { 49 | // KNOWN 50 | return; 51 | } 52 | if (path.length >= 3 && path[path.length - 3].src.type) { 53 | owner = path[path.length - 3]; 54 | } 55 | } 56 | console.warn({ 57 | path: path.map(function (item) { 58 | return item.key; 59 | }).join('.'), 60 | srcCode: (path[0]).code.slice(owner.src.range[0], owner.src.range[1]), 61 | genCode: (path[0]).code.slice(owner.gen.range[0], owner.gen.range[1]), 62 | srcValue: src, 63 | genValue: gen 64 | }); 65 | } 66 | return; 67 | } 68 | /* 69 | if (src.range && gen.range && (src.range[0] !== gen.range[0] || src.range[1] !== gen.range[1])) { 70 | console.warn({ 71 | path: path.map(function (item) { 72 | return item.key; 73 | }).join('.'), 74 | srcCovers: path[0].code.slice(src.range[0], src.range[1]), 75 | genCovers: path[0].code.slice(gen.range[0], gen.range[1]) 76 | }); 77 | } 78 | */ 79 | for (let key in src) { 80 | let newSrc = (src)[key]; 81 | let newGen = (gen)[key]; 82 | if (key !== 'loc' && key !== 'range' && newGen !== undefined) { 83 | diffAST(path.concat([{ 84 | key: key, 85 | src: newSrc, 86 | gen: newGen 87 | }])); 88 | } 89 | } 90 | } 91 | 92 | function test(name: string, version: number, sourceType?: string) { 93 | console.log(`${name}...`); 94 | var sourceCode = readFile(`${__dirname}/fixtures/${name}.js`, 'utf-8'); 95 | var sourceAst = acornParse(sourceCode, { 96 | ecmaVersion: version, 97 | locations: true, 98 | ranges: true, 99 | sourceType: sourceType, 100 | sourceFile: 'module.ts' 101 | }); 102 | var generatedAst = tsParse(sourceCode, { 103 | target: version === 5 ? ts.ScriptTarget.ES5 : ts.ScriptTarget.ES6 104 | }); 105 | diffAST([{ 106 | key: 'Program', 107 | src: sourceAst, 108 | gen: generatedAst, 109 | code: sourceCode 110 | }]); 111 | console.log(`Done ${name}`); 112 | } 113 | 114 | test('es5', 5); 115 | test('es2015-script', 6, 'script'); 116 | test('es2015-module', 6, 'module'); 117 | -------------------------------------------------------------------------------- /fixtures/es5.js: -------------------------------------------------------------------------------- 1 | /* this file contains all grammatical productions in ECMA-262 edition 5.1 ** * **/ 2 | 3 | // whitespace 4 | tab:for(;;)break tab; 5 | verticalTab:for(;;)break verticalTab; 6 | formFeed:for(;;)break formFeed; 7 | space:for(;;)break space; 8 | nbsp:for(;;)break nbsp; 9 | bom:for(;;)breakbom; 10 | 11 | // line terminators 12 | lineFeed:0 13 | 0; 14 | carriageReturn:0 15 | 0; 16 | carriageReturnLineFeed:0 17 | 0; 18 | lineSeparator:0
0; 19 | paragraphSeparator:0
0; 20 | 21 | // identifier names 22 | var $, _, \u0078, x$, x_, x\u0030, xa, x0, x0a, x0123456789, 23 | qwertyuiopasdfghjklzxcvbnm, QWERTYUIOPASDFGHJKLZXCVBNM; 24 | // a representative sample of unicode letters and numbers 25 | var œ一, ǻ둘, ɤ〩, φ, fiⅷ, ユニコード, x‌‍; 26 | 27 | null; true; false; 28 | 29 | 0; 00; 1234567890; /*UNSUPPORTED: 01234567;*/ 30 | 0.; 0.00; 10.00; .0; .00 31 | 0e0; 0E0; 0.e0; 0.00e+0; .00e-0; 32 | 0x0; 0X0; 0x0123456789abcdefABCDEF; 33 | 2e308; 34 | 35 | ""; "'"; "\'\"\\\b\f\n\r\t\v\0"; 36 | /*UNSUPPORTED: "\1\00\400\000";*/ 37 | "\x01\x23\x45\x67\x89\xAB\xCD\xEF"; 38 | "\u0123\u4567\u89AB\uCDEF"; "\ 39 | "; 40 | 41 | ''; '"'; '\'\"\\\b\f\n\r\t\v\0'; 42 | /*UNSUPPORTED: '\1\00\400\000';*/ 43 | '\x01\x23\x45\x67\x89\xAB\xCD\xEF'; 44 | '\u0123\u4567\u89AB\uCDEF'; '\ 45 | '; 46 | 47 | /x/; /|/; /|||/; 48 | /^$\b\B/; /(?=(?!(?:(.))))/; 49 | /a.\f\n\r\t\v\0\[\-\/\\\x00\u0000/; /\d\D\s\S\w\W/; 50 | /\ca\cb\cc\cd\ce\cf\cg\ch\ci\cj\ck\cl\cm\cn\co\cp\cq\cr\cs\ct\cu\cv\cw\cx\cy\cz/; 51 | /\cA\cB\cC\cD\cE\cF\cG\cH\cI\cJ\cK\cL\cM\cN\cO\cP\cQ\cR\cS\cT\cU\cV\cW\cX\cY\cZ/; 52 | /[a-z-]/; /[^\b\-^]/; /[/\]\\]/; 53 | /./i; /./g; /./m; /./igm; 54 | /.*/; /.*?/; /.+/; /.+?/; /.?/; /.??/; 55 | /.{0}/; /.{0,}/; /.{0,0}/; 56 | 57 | this; 58 | 59 | x; 60 | 61 | []; [,]; [0]; [0,]; [,0]; [0,0]; [0,0,]; [0,,0]; [,,]; 62 | 63 | ({}); ({x:0}); ({x:0,y:0}); ({x:0,}); ({'x':0,"y":0,var:0,}); 64 | ({0:0}); ({0.:0}); ({0.0:0}); ({.0:0}); ({0e0:0}); ({0x0:0}); 65 | ({ 66 | get x(){}, set x(a){}, get 'y'(){}, set "y"(a){}, 67 | get 0(){}, set 0(a){}, get var(){}, set var(x){}, 68 | }); 69 | 70 | 0..a; 71 | 72 | 0[0]; 73 | 74 | // this function makes the NewExpression and CallExpression tests not throw at runtime 75 | x = function f(){ return f; }; x[0] = x; x.a = x; 76 | 77 | new x(); new new x()(); 78 | new x[0](); new x.a(); new x[0].a(); new x.a[0](); 79 | new x; new new x; new new x(); 80 | new new x().a; new new x()[0]; 81 | 82 | x(); x()(); x(x); x(x, x); 83 | x.a().a(); x[0]()[0](); x().a[0](); 84 | 85 | x++; x--; 86 | 87 | delete void typeof+-~!x; ++x; --x; 88 | 89 | 0*0; 0/0; 0%0; 90 | 91 | 0+0; 0-0; 92 | 93 | 0<<0; 0>>0; 0>>>0; 94 | 95 | 0<0; 0>0; 0<=0; 0>=0; 96 | 0 instanceof function(){}; 97 | 0 in{}; 98 | 99 | 0==0; 0!=0; 0===0; 0!==0; 100 | 101 | 0&0; 0^0; 0|0; 0&&0; 0||0; 102 | 103 | 0?0:0; 0?0?0:0:0; 0||0?x=0:x=0; 104 | 105 | x=0; x*=0; x/=0; x%=0; x+=0; x-=0; 106 | x<<=0; x>>=0; x>>>=0; x&=0; x^=0; x|=0; 107 | 108 | 0,0; 0,0,0; x=0,x=0; 109 | 110 | 111 | {} {;} {0} {0;} {0;0} {0;0;} 112 | 113 | var x; var x,y; var x,y,z; 114 | var x=0; var x=0,y; var x,y=0; var x=0,y=0; 115 | 116 | ; 117 | 118 | if(0); if(0);else; 119 | 120 | do;while(0); 121 | while(0); 122 | for(;;)break; for(0;0;0); for((0 in[]);0;); 123 | for(var a;;)break; for(var a,b;0;0); 124 | for(var a=0;;)break; for(var a=(0 in[]);0;); 125 | for(x in{}); for(var x in{}); 126 | for(var x=[]in{}); for(var x=(0 in[])in{}); 127 | 128 | for(;0;)continue; x:for(;0;)continue x; 129 | 130 | for(;;)break; x:for(;;)break x; 131 | switch(0){case 0:break;} 132 | 133 | function f(){ return; } 134 | function f(){ return 0; } 135 | 136 | with(0); 137 | 138 | switch(0){} switch(0){case 0:} switch(0){case 0:case 0:} 139 | switch(0){default:} switch(0){case 0:default:case 0:} 140 | switch(0){case 0:;} switch(0){case 0:;;} 141 | switch(0){default:;} switch(0){default:;;} 142 | 143 | x:; x:y:; 144 | 145 | try { throw 0; }catch(x){} 146 | 147 | try{}catch(x){} 148 | try{}finally{} 149 | try{}catch(x){}finally{} 150 | 151 | debugger; 152 | 153 | function f(){} 154 | function f(x){} 155 | function f(x,y){} 156 | function f(){ function f(){} } 157 | 158 | function f(){ "use strict" } 159 | function f(){ 'use strict' } 160 | function f(){ "other directive" } 161 | function f(){ 'other directive' } 162 | function f(){ ("string") } 163 | function f(){ ('string') } 164 | function f(){ 165 | 'string' 166 | +0 167 | } 168 | 169 | (function(){}); 170 | (function(x){}); 171 | (function(x,y){}); 172 | (function(){ function f(){} }); 173 | (function f(){}); 174 | (function f(x){}); 175 | (function f(x,y){}); 176 | (function f(){ function f(){} }); 177 | -------------------------------------------------------------------------------- /typings/estree/flow.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module ESTree { 4 | interface FlowTypeAnnotation extends Node {} 5 | 6 | interface FlowBaseTypeAnnotation extends FlowTypeAnnotation {} 7 | 8 | interface FlowLiteralTypeAnnotation extends FlowTypeAnnotation, Literal {} 9 | 10 | interface FlowDeclaration extends Declaration {} 11 | 12 | interface AnyTypeAnnotation extends FlowBaseTypeAnnotation {} 13 | 14 | interface ArrayTypeAnnotation extends FlowTypeAnnotation { 15 | elementType: FlowTypeAnnotation; 16 | } 17 | 18 | interface BooleanLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} 19 | 20 | interface BooleanTypeAnnotation extends FlowBaseTypeAnnotation {} 21 | 22 | interface ClassImplements extends Node { 23 | id: Identifier; 24 | typeParameters?: TypeParameterInstantiation; 25 | } 26 | 27 | interface ClassProperty { 28 | key: Expression; 29 | value?: Expression; 30 | typeAnnotation?: TypeAnnotation; 31 | computed: boolean; 32 | static: boolean; 33 | } 34 | 35 | interface DeclareClass extends FlowDeclaration { 36 | id: Identifier; 37 | typeParameters?: TypeParameterDeclaration; 38 | body: ObjectTypeAnnotation; 39 | extends: Array; 40 | } 41 | 42 | interface DeclareFunction extends FlowDeclaration { 43 | id: Identifier; 44 | } 45 | 46 | interface DeclareModule extends FlowDeclaration { 47 | id: Literal | Identifier; 48 | body: BlockStatement; 49 | } 50 | 51 | interface DeclareVariable extends FlowDeclaration { 52 | id: Identifier; 53 | } 54 | 55 | interface FunctionTypeAnnotation extends FlowTypeAnnotation { 56 | params: Array; 57 | returnType: FlowTypeAnnotation; 58 | rest?: FunctionTypeParam; 59 | typeParameters?: TypeParameterDeclaration; 60 | } 61 | 62 | interface FunctionTypeParam { 63 | name: Identifier; 64 | typeAnnotation: FlowTypeAnnotation; 65 | optional: boolean; 66 | } 67 | 68 | interface GenericTypeAnnotation extends FlowTypeAnnotation { 69 | id: Identifier | QualifiedTypeIdentifier; 70 | typeParameters?: TypeParameterInstantiation; 71 | } 72 | 73 | interface InterfaceExtends extends Node { 74 | id: Identifier | QualifiedTypeIdentifier; 75 | typeParameters?: TypeParameterInstantiation; 76 | } 77 | 78 | interface InterfaceDeclaration extends FlowDeclaration { 79 | id: Identifier; 80 | typeParameters?: TypeParameterDeclaration; 81 | extends: Array; 82 | body: ObjectTypeAnnotation; 83 | } 84 | 85 | interface IntersectionTypeAnnotation extends FlowTypeAnnotation { 86 | types: Array; 87 | } 88 | 89 | interface MixedTypeAnnotation extends FlowBaseTypeAnnotation {} 90 | 91 | interface NullableTypeAnnotation extends FlowTypeAnnotation { 92 | typeAnnotation: TypeAnnotation; 93 | } 94 | 95 | interface NumberLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} 96 | 97 | interface NumberTypeAnnotation extends FlowBaseTypeAnnotation {} 98 | 99 | interface StringLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} 100 | 101 | interface StringTypeAnnotation extends FlowBaseTypeAnnotation {} 102 | 103 | interface TupleTypeAnnotation extends FlowTypeAnnotation { 104 | types: Array; 105 | } 106 | 107 | interface TypeofTypeAnnotation extends FlowTypeAnnotation { 108 | argument: FlowTypeAnnotation; 109 | } 110 | 111 | interface TypeAlias extends FlowDeclaration { 112 | id: Identifier; 113 | typeParameters?: TypeParameterDeclaration; 114 | right: FlowTypeAnnotation; 115 | } 116 | 117 | interface TypeAnnotation extends Node { 118 | typeAnnotation: FlowTypeAnnotation; 119 | } 120 | 121 | interface TypeCastExpression extends Expression { 122 | expression: Expression; 123 | typeAnnotation: TypeAnnotation; 124 | } 125 | 126 | interface TypeParameterDeclaration extends Node { 127 | params: Array; 128 | } 129 | 130 | interface TypeParameterInstantiation extends Node { 131 | params: Array; 132 | } 133 | 134 | interface ObjectTypeAnnotation extends FlowTypeAnnotation { 135 | properties: Array; 136 | indexers: Array; 137 | callProperties: Array; 138 | } 139 | 140 | interface ObjectTypeCallProperty extends Node { 141 | value: FunctionTypeAnnotation; 142 | static: boolean; 143 | } 144 | 145 | interface ObjectTypeIndexer extends Node { 146 | id: Identifier; 147 | key: FlowTypeAnnotation; 148 | value: FlowTypeAnnotation; 149 | static: boolean; 150 | } 151 | 152 | interface ObjectTypeProperty extends Node { 153 | key: Expression; 154 | value: FlowTypeAnnotation; 155 | optional: boolean; 156 | static: boolean; 157 | } 158 | 159 | interface QualifiedTypeIdentifier extends Node { 160 | qualification: Identifier | QualifiedTypeIdentifier; 161 | id: Identifier; 162 | } 163 | 164 | interface UnionTypeAnnotation extends FlowTypeAnnotation { 165 | types: Array; 166 | } 167 | 168 | interface VoidTypeAnnotation extends FlowBaseTypeAnnotation {} 169 | } -------------------------------------------------------------------------------- /fixtures/es2015-script.js: -------------------------------------------------------------------------------- 1 | /* this file contains all grammatical productions in ECMA-262 edition 5.1 ** * **/ 2 | // TODO: 3 | 4 | // whitespace 5 | tab:for(;;)break tab; 6 | verticalTab:for(;;)break verticalTab; 7 | formFeed:for(;;)break formFeed; 8 | space:for(;;)break space; 9 | nbsp:for(;;)break nbsp; 10 | bom:for(;;)breakbom; 11 | 12 | // line terminators 13 | lineFeed:0 14 | 0; 15 | carriageReturn:0 16 | 0; 17 | carriageReturnLineFeed:0 18 | 0; 19 | lineSeparator:0
0; 20 | paragraphSeparator:0
0; 21 | 22 | // identifier names 23 | var $, _/*UNSUPPORTED: , \u0078, \u{2F9F9}*/, x$, x_/*UNSUPPORTED: x\u0030, x\u{e01d5}*/, xa, x0, x0a, 24 | x0123456789, qwertyuiopasdfghjklzxcvbnm, QWERTYUIOPASDFGHJKLZXCVBNM; 25 | // a representative sample of ID_Start and ID_Continue 26 | var /*UNSUPPORTED: 䩶, x󠇕, œ一, ǻ둘, ɤ〩, φ, fiⅷ, ユニコード, */x‌‍; 27 | var _yield; let letx; let[x\u0078] = 0; const constx = 0; 28 | { let x; let y = 0; const z = 0; } 29 | 30 | null; true; false; 31 | 32 | 0; 00; 1234567890; /*UNSUPPORTED: 01234567;*/ 33 | 0.; 0.00; 10.00; .0; .00 34 | 0e0; 0E0; 0.e0; 0.00e+0; .00e-0; 35 | 0x0; 0X0; 0x0123456789abcdefABCDEF; 36 | 0b0; 0B0; 0b01; 0b10; 0b10101010; 37 | 0o0; 0O0; 0o01234567; 38 | 2e308; 39 | 40 | ""; "'"; "\'\"\\\b\f\n\r\t\v\0"; 41 | /*UNSUPPORTED: "\1\00\400\000";*/ 42 | "\x01\x23\x45\x67\x89\xAB\xCD\xEF\xab\xcd\xef"; 43 | "\u0123\u4567\u89AB\uCDEF\u00ab\ucdef"; 44 | "\uD834\uDF06\u2603\u03C6 \u{0000001F4a9}\u{1D306}\u{2603}\u{3c6} 𝌆☃φ"; "\ 45 | "; 46 | 47 | ''; '"'; '\'\"\\\b\f\n\r\t\v\0'; 48 | /*UNSUPPORTED: '\1\00\400\000';*/ 49 | '\x01\x23\x45\x67\x89\xAB\xCD\xEF\xab\xcd\xef'; 50 | '\u0123\u4567\u89AB\uCDEF\u00ab\ucdef'; 51 | '\uD834\uDF06\u2603\u03C6 \u{0000001F4a9} \u{1D306}\u{2603}\u{3c6} 𝌆☃φ'; '\ 52 | '; 53 | 54 | /x/; /|/; /|||/; 55 | /^$\b\B/; /(?=(?!(?:(.))))/; 56 | /a.\f\n\r\t\v\0\[\-\/\\\x00\u0000\uD834\uDF06/; /\u{00000001d306}/u; /\d\D\s\S\w\W/; 57 | /\ca\cb\cc\cd\ce\cf\cg\ch\ci\cj\ck\cl\cm\cn\co\cp\cq\cr\cs\ct\cu\cv\cw\cx\cy\cz/; 58 | /\cA\cB\cC\cD\cE\cF\cG\cH\cI\cJ\cK\cL\cM\cN\cO\cP\cQ\cR\cS\cT\cU\cV\cW\cX\cY\cZ/; 59 | /[a-z-]/; /[^\b\-^]/; /[/\]\\]/; 60 | /./i; /./g; /./m; /./igm; 61 | /.*/; /.*?/; /.+/; /.+?/; /.?/; /.??/; 62 | /.{0}/; /.{0,}/; /.{0,0}/; 63 | 64 | `a`; `${0}`; `0${0,1}2`; `0${`1${2}3`}4`; 65 | `\``; `a\${b`; `\0\n\x0A\u000A\u{A}`; 66 | 67 | this; 68 | 69 | x; 70 | 71 | []; [,]; [0]; [0,]; [,0]; [0,0]; [0,0,]; [0,,0]; [,,]; 72 | 73 | ({}); ({x}); ({x:0}); ({x:0,y:0}); ({x:0,}); ({'x':0,"y":0,in:0}); 74 | ({ 75 | 0: 0, 0.: 0, 0.0: 0, .0: 0, 0e0: 0, 0x0: 0, [0]: 0, 76 | get x(){}, set x(a){}, get 'y'(){}, set "y"(a){}, 77 | get 0(){}, set 0(a){}, get var(){}, set var(a){}, 78 | get [0](){}, set [0](a){}, [1](){}, 79 | a(){}, 'b'(){}, "c"(){}, 0(){}, .1(){}, 1.(){}, 1e1(){}, 80 | var(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){}, 81 | set in([a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k]){}, 82 | *d(){}, *'e'(){}, *"f"(){}, *2(){}, *.2(){}, *3.(){}, *2e2(){}, *in(){}, 83 | }); 84 | /*UNSUPPORTED: 85 | ({ __proto__: null, get __proto__(){}, set __proto__(a){}, }); 86 | ({ "__proto__": null, __proto__(){}, }); 87 | */ 88 | 89 | 0..a; 0 .a; (0).a; 90 | 91 | 0[0]; 92 | 93 | // this function makes the NewExpression and CallExpression tests not throw at runtime 94 | x = function f(){ return f; }; x[0] = x; x.a = x; 95 | 96 | new x(); new new x()(); 97 | new x[0](); new x.a(); new x[0].a(); new x.a[0](); 98 | new x; new new x; new new x(); 99 | new new x().a; new new x()[0]; 100 | 101 | x(); x()(); x(x); x(x, x); 102 | x.a().a(); x[0]()[0](); x().a[0](); 103 | x(...[0,1,], ...[], ...function* f(){ return yield 2; }); 104 | x`a`; x`0${1}2`; 105 | 106 | x++; x--; 107 | 108 | delete void typeof+-~!x; ++x; --x; 109 | 110 | 0*0; 0/0; 0%0; 111 | 112 | 0+0; 0-0; 113 | 114 | 0<<0; 0>>0; 0>>>0; 115 | 116 | 0<0; 0>0; 0<=0; 0>=0; 117 | 0 instanceof function(){}; 118 | 0 in{}; 119 | 120 | 0==0; 0!=0; 0===0; 0!==0; 121 | 122 | 0&0; 0^0; 0|0; 0&&0; 0||0; 123 | 124 | 0?0:0; 0?0?0:0:0; 0||0?x=0:x=0; 125 | 126 | x=0; x*=0; x/=0; x%=0; x+=0; x-=0; 127 | x<<=0; x>>=0; x>>>=0; x&=0; x^=0; x|=0; 128 | 129 | 0,0; 0,0,0; x=0,x=0; 130 | 131 | 132 | {} {;} {0} {0;} {0;0} {0;0;} 133 | 134 | var x; var x,y; var x,y,z; 135 | var x=0; var x=0,y; var x,y=0; var x=0,y=0; 136 | 137 | ; 138 | 139 | if(0); if(0);else; 140 | 141 | do;while(0) 0; 142 | do;while(0); 143 | do;while(0) 0 144 | while(0); 145 | for(;;)break; for(0;0;0); for((0 in[]);0;); 146 | for(var a;;)break; for(var a,b;0;0); 147 | for(var a=0;;)break; for(var a=(0 in[]);0;); 148 | for(x in{}); for(var x in{}); 149 | for(x of[]); for(var x of[]); 150 | 151 | for(;0;)continue; x:for(;0;)continue x; 152 | 153 | for(;;)break; x:for(;;)break x; 154 | switch(0){case 0:break;} 155 | 156 | function f(){ return; } 157 | function f(){ return 0; } 158 | 159 | with(0); 160 | 161 | switch(0){} switch(0){case 0:} switch(0){case 0:case 0:} 162 | switch(0){default:} switch(0){case 0:default:case 0:} 163 | switch(0){case 0:;} switch(0){case 0:;;} 164 | switch(0){default:;} switch(0){default:;;} 165 | 166 | x:; x:y:; 167 | 168 | try { throw 0; }catch(x){} 169 | 170 | try{}catch(x){} 171 | try{}finally{} 172 | try{}catch(x){}finally{} 173 | 174 | debugger; 175 | 176 | function f(){} 177 | function f(x){} 178 | function f(x,y){} 179 | function f(){ function f(){} } 180 | { function f(){} }; 181 | //for (;0;) label: function f(){} 0 182 | //do label: function f(){} while(0) 183 | 184 | function f(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){} 185 | function f(){ "use strict" } 186 | function f(){ 'use strict' } 187 | function f(){ "other directive" } 188 | function f(){ 'other directive' } 189 | function f(){ ("string") } 190 | function f(){ ('string') } 191 | function f(){ 192 | 'string' 193 | +0 194 | } 195 | 196 | function*g(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){ 197 | return a = yield* b = yield c = yield yield; 198 | } 199 | (function * g(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){ 200 | return a = yield* b = yield c = yield yield; 201 | }) 202 | yield; 203 | yield +0; 204 | yield * 0; 205 | 206 | (function(){}); 207 | (function(x){}); 208 | (function(x,y){}); 209 | (function(){ function f(){} }); 210 | (function f(){}); 211 | (function f(x){}); 212 | (function f(x,y){}); 213 | (function f(){ function f(){} }); 214 | 215 | () => 0; 216 | () => {;} 217 | x => x 218 | x => x = 0 219 | x => y => x 220 | x => {x} 221 | x => ({x}); 222 | (x) => x; 223 | (x) => {return x}; 224 | (x) => ({x}); 225 | ({x}) => ({x}); 226 | (a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k) => {;}; 227 | 228 | [a] = [...[0]]; 229 | ({a} = {}); 230 | try{}catch([e]){} 231 | try{}catch({e}){} 232 | 233 | class A {} 234 | class B extends new A { 235 | constructor(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k) { 236 | /*UNSUPPORTED: super(new.target);*/ 237 | super()`template`; 238 | () => super(this); 239 | } 240 | m(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k) { 241 | super.m(); 242 | super.m`template`; 243 | () => super.m(this); 244 | } 245 | 246 | ; 247 | 248 | static a(){} static 'b'(){} static 0(){} static [0](){} 249 | static *c(){ yield; } static *"d"() { yield; } static *1(){ yield; } static *[1](){ yield; } 250 | static var(){} static *in(){} 251 | 252 | static get e(){} static get 'f'(){} static get 2(){} static get [2](){} 253 | static set g(a){} static set "h"(a){} static set 3(a){} static set [3](a){} 254 | static get if(){} static set if(a){} 255 | 256 | a(){} 'b'(){} 0(){} [0](){} 257 | *c(){ yield; } *"d"(){ yield; } *1(){ yield; } *[1](){ yield; } 258 | var(){} *in(){ yield; } 259 | 260 | get e(){} get 'f'(){} get 2(){} get [2](){} 261 | set g(a){} set "h"(a){} set 3(a){} set [3](a){} 262 | get if() {} set if(f) {} 263 | } 264 | class C extends B { "constructor"(){ super(); } } 265 | -------------------------------------------------------------------------------- /fixtures/es2015-module.js: -------------------------------------------------------------------------------- 1 | /* this file contains all grammatical productions in ECMA-262 edition 5.1 ** * **/ 2 | 3 | import i0 from "module"; 4 | import * as i1 from "module"; 5 | import {} from "module"; 6 | import { i2, a as i3, } from "module"; 7 | import i4, * as i5 from "module"; 8 | import i6, {} from "module"; 9 | import i7, { i8, var as i9 } from "module"; 10 | import "module"; 11 | 12 | export * from "module"; 13 | export {} from "module"; 14 | export { i0, i1 as a, i2 as var, } from "module"; 15 | export {}; 16 | export { i3, i4 as in }; 17 | export var e5, e6 = 0; 18 | export let e7, e8 = 0; 19 | export const e9 = 0, e10 = 0; 20 | export function e11(){} 21 | export function* e12(){} 22 | export class e13 {} 23 | export class e14 extends e15 {} 24 | // Unfortunately (for us), we can only have a single default export. 25 | export default function (){} 26 | export default function* i16(){} 27 | export default function* (){} 28 | export default class i17 {} 29 | export default class i18 extends i19 {} 30 | export default class {} 31 | export default x = 0; 32 | export default function e16(){} 33 | export default 0; 34 | export default (0, 1); 35 | 36 | // whitespace 37 | tab:for(;;)break tab; 38 | verticalTab:for(;;)break verticalTab; 39 | formFeed:for(;;)break formFeed; 40 | space:for(;;)break space; 41 | nbsp:for(;;)break nbsp; 42 | bom:for(;;)breakbom; 43 | 44 | // line terminators 45 | lineFeed:0 46 | 0; 47 | carriageReturn:0 48 | 0; 49 | carriageReturnLineFeed:0 50 | 0; 51 | lineSeparator:0
0; 52 | paragraphSeparator:0
0; 53 | 54 | // identifier names 55 | var $, _/*UNSUPPORTED: , \u0078, \u{2F9F9}*/, x$, x_/*UNSUPPORTED: x\u0030, x\u{e01d5}*/, xa, x0, x0a, 56 | x0123456789, qwertyuiopasdfghjklzxcvbnm, QWERTYUIOPASDFGHJKLZXCVBNM; 57 | // a representative sample of ID_Start and ID_Continue 58 | var /*UNSUPPORTED: 䩶, x󠇕, œ一, ǻ둘, ɤ〩, φ, fiⅷ, ユニコード, */x‌‍; 59 | let letx; let[x\u0078] = 0; const constx = 0; 60 | { let x; let y = 0; const z = 0; } 61 | 62 | null; true; false; 63 | 64 | 0; 1234567890; 65 | 0.; 0.00; 10.00; .0; .00 66 | 0e0; 0E0; 0.e0; 0.00e+0; .00e-0; 67 | 0x0; 0X0; 0x0123456789abcdefABCDEF; 68 | 0b0; 0B0; 0b01; 0b10; 0b10101010; 69 | 0o0; 0O0; 0o01234567; 70 | 2e308; 71 | 72 | ""; "'"; "\'\"\\\b\f\n\r\t\v\0"; 73 | "\0"; 74 | "\x01\x23\x45\x67\x89\xAB\xCD\xEF\xab\xcd\xef"; 75 | "\u0123\u4567\u89AB\uCDEF\u00ab\ucdef"; 76 | "\uD834\uDF06\u2603\u03C6 \u{0000001F4a9}\u{1D306}\u{2603}\u{3c6} 𝌆☃φ"; "\ 77 | "; 78 | 79 | ''; '"'; '\'\"\\\b\f\n\r\t\v\0'; 80 | '\0'; 81 | '\x01\x23\x45\x67\x89\xAB\xCD\xEF\xab\xcd\xef'; 82 | '\u0123\u4567\u89AB\uCDEF\u00ab\ucdef'; 83 | '\uD834\uDF06\u2603\u03C6 \u{0000001F4a9} \u{1D306}\u{2603}\u{3c6} 𝌆☃φ'; '\ 84 | '; 85 | 86 | /x/; /|/; /|||/; 87 | /^$\b\B/; /(?=(?!(?:(.))))/; 88 | /a.\f\n\r\t\v\0\[\-\/\\\x00\u0000\uD834\uDF06/; /\u{00000001d306}/u; /\d\D\s\S\w\W/; 89 | /\ca\cb\cc\cd\ce\cf\cg\ch\ci\cj\ck\cl\cm\cn\co\cp\cq\cr\cs\ct\cu\cv\cw\cx\cy\cz/; 90 | /\cA\cB\cC\cD\cE\cF\cG\cH\cI\cJ\cK\cL\cM\cN\cO\cP\cQ\cR\cS\cT\cU\cV\cW\cX\cY\cZ/; 91 | /[a-z-]/; /[^\b\-^]/; /[/\]\\]/; 92 | /./i; /./g; /./m; /./igm; 93 | /.*/; /.*?/; /.+/; /.+?/; /.?/; /.??/; 94 | /.{0}/; /.{0,}/; /.{0,0}/; 95 | 96 | `a`; `${0}`; `0${0,1}2`; `0${`1${2}3`}4`; 97 | `\``; `a\${b`; `\0\n\x0A\u000A\u{A}`; 98 | 99 | this; 100 | 101 | x; 102 | 103 | []; [,]; [0]; [0,]; [,0]; [0,0]; [0,0,]; [0,,0]; [,,]; 104 | 105 | ({}); ({x}); ({x:0}); ({x:0,y:0}); ({x:0,}); ({'x':0,"y":0,in:0}); 106 | ({ 107 | 0: 0, 0.: 0, 0.0: 0, .0: 0, 0e0: 0, 0x0: 0, [0]: 0, 108 | get x(){}, set x(a){}, get 'y'(){}, set "y"(a){}, 109 | get 0(){}, set 0(a){}, get var(){}, set var(a){}, 110 | get [0](){}, set [0](a){}, [1](){}, 111 | a(){}, 'b'(){}, "c"(){}, 0(){}, .1(){}, 1.(){}, 1e1(){}, 112 | var(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){}, 113 | set in([a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k]){}, 114 | *d(){}, *'e'(){}, *"f"(){}, *2(){}, *.2(){}, *3.(){}, *2e2(){}, *in(){}, 115 | }); 116 | /*UNSUPPORTED: 117 | ({ __proto__: null, get __proto__(){}, set __proto__(a){}, }); 118 | ({ "__proto__": null, __proto__(){}, }); 119 | */ 120 | 121 | 0..a; 0 .a; (0).a; 122 | 123 | 0[0]; 124 | 125 | // this function makes the NewExpression and CallExpression tests not throw at runtime 126 | x = function f(){ return f; }; x[0] = x; x.a = x; 127 | 128 | new x(); new new x()(); 129 | new x[0](); new x.a(); new x[0].a(); new x.a[0](); 130 | new x; new new x; new new x(); 131 | new new x().a; new new x()[0]; 132 | 133 | x(); x()(); x(x); x(x, x); 134 | x.a().a(); x[0]()[0](); x().a[0](); 135 | x(...[0,1,], ...[], ...function* f(){ return yield 2; }); 136 | x`a`; x`0${1}2`; 137 | 138 | x++; x--; 139 | 140 | delete void typeof+-~!x; ++x; --x; 141 | 142 | 0*0; 0/0; 0%0; 143 | 144 | 0+0; 0-0; 145 | 146 | 0<<0; 0>>0; 0>>>0; 147 | 148 | 0<0; 0>0; 0<=0; 0>=0; 149 | 0 instanceof function(){}; 150 | 0 in{}; 151 | 152 | 0==0; 0!=0; 0===0; 0!==0; 153 | 154 | 0&0; 0^0; 0|0; 0&&0; 0||0; 155 | 156 | 0?0:0; 0?0?0:0:0; 0||0?x=0:x=0; 157 | 158 | x=0; x*=0; x/=0; x%=0; x+=0; x-=0; 159 | x<<=0; x>>=0; x>>>=0; x&=0; x^=0; x|=0; 160 | 161 | 0,0; 0,0,0; x=0,x=0; 162 | 163 | 164 | {} {;} {0} {0;} {0;0} {0;0;} 165 | 166 | var x0; var x1,y2; var x3,y4,z5; 167 | var x6=0; var x7=0,y8; var x9,y10=0; var x11=0,y12=0; 168 | 169 | ; 170 | 171 | if(0); if(0);else; 172 | 173 | do;while(0) 0; 174 | do;while(0); 175 | do;while(0) 0 176 | while(0); 177 | for(;;)break; for(0;0;0); for((0 in[]);0;); 178 | for(var a0;;)break; for(var a1,b2;0;0); 179 | for(var a3=0;;)break; for(var a4=(0 in[]);0;); 180 | for(x in{}); for(var x12 in{}); 181 | for(x of[]); for(var x13 of[]); 182 | 183 | for(;0;)continue; x:for(;0;)continue x; 184 | 185 | for(;;)break; x:for(;;)break x; 186 | switch(0){case 0:break;} 187 | 188 | function f0(){ return; } 189 | function f1(){ return 0; } 190 | 191 | switch(0){} switch(0){case 0:} switch(0){case 0:case 0:} 192 | switch(0){default:} switch(0){case 0:default:case 0:} 193 | switch(0){case 0:;} switch(0){case 0:;;} 194 | switch(0){default:;} switch(0){default:;;} 195 | 196 | x:; x:y:; 197 | 198 | try { throw 0; }catch(x){} 199 | 200 | try{}catch(x){} 201 | try{}finally{} 202 | try{}catch(x){}finally{} 203 | 204 | debugger; 205 | 206 | function f2(){} 207 | function f3(x){} 208 | function f4(x,y){} 209 | function f5(){ function f6(){} } 210 | { function f7(){} }; 211 | for (;0;) +function f8(){}; 0 212 | do +function f9(){}; while(0) 213 | 214 | function f10(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){} 215 | function f11(){ "use strict" } 216 | function f12(){ 'use strict' } 217 | function f13(){ "other directive" } 218 | function f14(){ 'other directive' } 219 | function f15(){ ("string") } 220 | function f16(){ ('string') } 221 | function f17(){ 222 | 'string' 223 | +0 224 | } 225 | 226 | function*g0(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){ 227 | return a = yield* b = yield c = yield yield; 228 | } 229 | (function * g1(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k){ 230 | return a = yield* b = yield c = yield yield; 231 | }) 232 | 233 | (function(){}); 234 | (function(x){}); 235 | (function(x,y){}); 236 | (function(){ function f(){} }); 237 | (function f(){}); 238 | (function f(x){}); 239 | (function f(x,y){}); 240 | (function f(){ function f(){} }); 241 | 242 | () => 0; 243 | () => {;} 244 | x => x 245 | x => x = 0 246 | x => y => x 247 | x => {x} 248 | x => ({x}); 249 | (x) => x; 250 | (x) => {return x}; 251 | (x) => ({x}); 252 | ({x}) => ({x}); 253 | (a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k) => {;}; 254 | 255 | [a] = [...[0]]; 256 | ({a} = {}); 257 | try{}catch([e]){} 258 | try{}catch({e}){} 259 | 260 | class A {} 261 | class B extends new A { 262 | constructor(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k) { 263 | /*UNSUPPORTED: super(new.target);*/ 264 | super()`template`; 265 | () => super(this); 266 | } 267 | m(a, b = 0, [c,, d = 0, ...e], {f, g: h, i = 0, i: j = 0}, ...k) { 268 | super.m(); 269 | super.m`template`; 270 | () => super.m(this); 271 | } 272 | 273 | ; 274 | 275 | static a(){} static 'b'(){} static 0(){} static [0](){} 276 | static *c(){ yield; } static *"d"() { yield; } static *1(){ yield; } static *[1](){ yield; } 277 | static var(){} static *in(){} 278 | 279 | static get e(){} static get 'f'(){} static get 2(){} static get [2](){} 280 | static set g(a){} static set "h"(a){} static set 3(a){} static set [3](a){} 281 | static get if(){} static set if(a){} 282 | 283 | a(){} 'b'(){} 0(){} [0](){} 284 | *c(){ yield; } *"d"(){ yield; } *1(){ yield; } *[1](){ yield; } 285 | var(){} *in(){ yield; } 286 | 287 | get e(){} get 'f'(){} get 2(){} get [2](){} 288 | set g(a){} set "h"(a){} set 3(a){} set [3](a){} 289 | get if() {} set if(f) {} 290 | } 291 | class C extends B { "constructor"(){ super(); } } 292 | -------------------------------------------------------------------------------- /typings/estree/estree.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for ESTree AST specification 2 | // Project: https://github.com/estree/estree 3 | // Definitions by: RReverser 4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped 5 | 6 | declare module ESTree { 7 | interface Node { 8 | type: string; 9 | loc?: SourceLocation; 10 | range?: [number, number]; 11 | } 12 | 13 | interface SourceLocation { 14 | source?: string; 15 | start: Position; 16 | end: Position; 17 | } 18 | 19 | interface Position { 20 | line: number; 21 | column: number; 22 | } 23 | 24 | interface Program extends Node { 25 | body: Array; 26 | sourceType: string; 27 | } 28 | 29 | interface Function extends Node { 30 | id?: Identifier; 31 | params: Array; 32 | body: BlockStatement | Expression; 33 | generator: boolean; 34 | } 35 | 36 | interface Statement extends Node {} 37 | 38 | interface EmptyStatement extends Statement {} 39 | 40 | interface BlockStatement extends Statement { 41 | body: Array; 42 | } 43 | 44 | interface ExpressionStatement extends Statement { 45 | expression: Expression; 46 | } 47 | 48 | interface IfStatement extends Statement { 49 | test: Expression; 50 | consequent: Statement; 51 | alternate?: Statement; 52 | } 53 | 54 | interface LabeledStatement extends Statement { 55 | label: Identifier; 56 | body: Statement; 57 | } 58 | 59 | interface BreakStatement extends Statement { 60 | label?: Identifier; 61 | } 62 | 63 | interface ContinueStatement extends Statement { 64 | label?: Identifier; 65 | } 66 | 67 | interface WithStatement extends Statement { 68 | object: Expression; 69 | body: Statement; 70 | } 71 | 72 | interface SwitchStatement extends Statement { 73 | discriminant: Expression; 74 | cases: Array; 75 | } 76 | 77 | interface ReturnStatement extends Statement { 78 | argument?: Expression; 79 | } 80 | 81 | interface ThrowStatement extends Statement { 82 | argument: Expression; 83 | } 84 | 85 | interface TryStatement extends Statement { 86 | block: BlockStatement; 87 | handler?: CatchClause; 88 | finalizer?: BlockStatement; 89 | } 90 | 91 | interface WhileStatement extends Statement { 92 | test: Expression; 93 | body: Statement; 94 | } 95 | 96 | interface DoWhileStatement extends Statement { 97 | body: Statement; 98 | test: Expression; 99 | } 100 | 101 | interface ForStatement extends Statement { 102 | init?: VariableDeclaration | Expression; 103 | test?: Expression; 104 | update?: Expression; 105 | body: Statement; 106 | } 107 | 108 | interface ForInStatement extends Statement { 109 | left: VariableDeclaration | Expression; 110 | right: Expression; 111 | body: Statement; 112 | } 113 | 114 | interface DebuggerStatement extends Statement {} 115 | 116 | interface Declaration extends Statement {} 117 | 118 | interface FunctionDeclaration extends Function, Declaration { 119 | id: Identifier; 120 | } 121 | 122 | interface VariableDeclaration extends Declaration { 123 | declarations: Array; 124 | kind: string; 125 | } 126 | 127 | interface VariableDeclarator extends Node { 128 | id: Pattern; 129 | init?: Expression; 130 | } 131 | 132 | interface Expression extends Node {} 133 | 134 | interface ThisExpression extends Expression {} 135 | 136 | interface ArrayExpression extends Expression { 137 | elements: Array; 138 | } 139 | 140 | interface ObjectExpression extends Expression { 141 | properties: Array; 142 | } 143 | 144 | interface Property extends Node { 145 | key: Expression; 146 | value: Expression; 147 | kind: string; 148 | method: boolean; 149 | shorthand: boolean; 150 | computed: boolean; 151 | } 152 | 153 | interface FunctionExpression extends Function, Expression {} 154 | 155 | interface SequenceExpression extends Expression { 156 | expressions: Array; 157 | } 158 | 159 | interface UnaryExpression extends Expression { 160 | operator: UnaryOperator; 161 | prefix: boolean; 162 | argument: Expression; 163 | } 164 | 165 | interface BinaryExpression extends Expression { 166 | operator: BinaryOperator; 167 | left: Expression; 168 | right: Expression; 169 | } 170 | 171 | interface AssignmentExpression extends Expression { 172 | operator: AssignmentOperator; 173 | left: Pattern | MemberExpression; 174 | right: Expression; 175 | } 176 | 177 | interface UpdateExpression extends Expression { 178 | operator: UpdateOperator; 179 | argument: Expression; 180 | prefix: boolean; 181 | } 182 | 183 | interface LogicalExpression extends Expression { 184 | operator: LogicalOperator; 185 | left: Expression; 186 | right: Expression; 187 | } 188 | 189 | interface ConditionalExpression extends Expression { 190 | test: Expression; 191 | alternate: Expression; 192 | consequent: Expression; 193 | } 194 | 195 | interface CallExpression extends Expression { 196 | callee: Expression | Super; 197 | arguments: Array; 198 | } 199 | 200 | interface NewExpression extends CallExpression {} 201 | 202 | interface MemberExpression extends Expression, Pattern { 203 | object: Expression | Super; 204 | property: Expression; 205 | computed: boolean; 206 | } 207 | 208 | interface Pattern extends Node {} 209 | 210 | interface SwitchCase extends Node { 211 | test?: Expression; 212 | consequent: Array; 213 | } 214 | 215 | interface CatchClause extends Node { 216 | param: Pattern; 217 | body: BlockStatement; 218 | } 219 | 220 | interface Identifier extends Node, Expression, Pattern { 221 | name: string; 222 | } 223 | 224 | interface Literal extends Node, Expression { 225 | value?: string | boolean | number | RegExp; 226 | } 227 | 228 | interface RegExpLiteral extends Literal { 229 | regex: { 230 | pattern: string; 231 | flags: string; 232 | }; 233 | } 234 | 235 | type UnaryOperator = string; 236 | 237 | type BinaryOperator = string; 238 | 239 | type LogicalOperator = string; 240 | 241 | type AssignmentOperator = string; 242 | 243 | type UpdateOperator = string; 244 | 245 | interface ForOfStatement extends ForInStatement {} 246 | 247 | interface Super extends Node {} 248 | 249 | interface SpreadElement extends Node { 250 | argument: Expression; 251 | } 252 | 253 | interface ArrowFunctionExpression extends Function, Expression { 254 | expression: boolean; 255 | } 256 | 257 | interface YieldExpression extends Expression { 258 | argument?: Expression; 259 | delegate: boolean; 260 | } 261 | 262 | interface TemplateLiteral extends Expression { 263 | quasis: Array; 264 | expressions: Array; 265 | } 266 | 267 | interface TaggedTemplateExpression extends Expression { 268 | tag: Expression; 269 | quasi: TemplateLiteral; 270 | } 271 | 272 | interface TemplateElement extends Node { 273 | tail: boolean; 274 | value: { 275 | cooked: string; 276 | raw: string; 277 | }; 278 | } 279 | 280 | interface AssignmentProperty extends Property { 281 | value: Pattern; 282 | kind: string; 283 | method: boolean; 284 | } 285 | 286 | interface ObjectPattern extends Pattern { 287 | properties: Array; 288 | } 289 | 290 | interface ArrayPattern extends Pattern { 291 | elements: Array; 292 | } 293 | 294 | interface RestElement extends Pattern { 295 | argument: Pattern; 296 | } 297 | 298 | interface AssignmentPattern extends Pattern { 299 | left: Pattern; 300 | right: Expression; 301 | } 302 | 303 | interface Class extends Node { 304 | id?: Identifier; 305 | superClass: Expression; 306 | body: ClassBody; 307 | } 308 | 309 | interface ClassBody extends Node { 310 | body: Array; 311 | } 312 | 313 | interface MethodDefinition extends Node { 314 | key: Expression; 315 | value: FunctionExpression; 316 | kind: string; 317 | computed: boolean; 318 | static: boolean; 319 | } 320 | 321 | interface ClassDeclaration extends Class, Declaration { 322 | id: Identifier; 323 | } 324 | 325 | interface ClassExpression extends Class, Expression {} 326 | 327 | interface MetaProperty extends Expression { 328 | meta: Identifier; 329 | property: Identifier; 330 | } 331 | 332 | interface ModuleDeclaration extends Node {} 333 | 334 | interface ModuleSpecifier extends Node { 335 | local: Identifier; 336 | } 337 | 338 | interface ImportDeclaration extends ModuleDeclaration { 339 | specifiers: Array; 340 | source: Literal; 341 | } 342 | 343 | interface ImportSpecifier extends ModuleSpecifier { 344 | imported: Identifier; 345 | } 346 | 347 | interface ImportDefaultSpecifier extends ModuleSpecifier {} 348 | 349 | interface ImportNamespaceSpecifier extends ModuleSpecifier {} 350 | 351 | interface ExportNamedDeclaration extends ModuleDeclaration { 352 | declaration?: Declaration; 353 | specifiers: Array; 354 | source?: Literal; 355 | } 356 | 357 | interface ExportSpecifier extends ModuleSpecifier { 358 | exported: Identifier; 359 | } 360 | 361 | interface ExportDefaultDeclaration extends ModuleDeclaration { 362 | declaration: Declaration | Expression; 363 | } 364 | 365 | interface ExportAllDeclaration extends ModuleDeclaration { 366 | source: Literal; 367 | } 368 | } 369 | -------------------------------------------------------------------------------- /index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":["convertPosition","unexpected","wrapPos","wrap","convertNullable","convertClassLikeDeclaration","convertClassElement","convertFunctionLikeClassElement","convertObjectBindingPattern","convertIdentifierOrBindingPattern","convertArrayBindingElement","convertArrayBindingPattern","convertBindingPattern","convertExpressionAsBindingPattern","convertDeclarationName","convertPropertyDeclaration","convertLiteral","convertTemplateSpanLiteral","convertTemplateExpression","convertTaggedTemplateExpression","convertExpressionStatement","convertTopStatement","convertImportDeclaration","convertImportClause","convertExportDeclaration","convertExportAssignment","convertStatement","convertThrowStatement","convertBreakOrContinuteStatement","convertReturnStatement","convertExpression","convertSpreadElementExpression","convertPropertyAccessExpression","convertElementAccessExpression","convertSourceFile","checkAndConvert","checkAndConvert.getSourceFile","checkAndConvert.writeFile","checkAndConvert.getDefaultLibFileName","checkAndConvert.useCaseSensitiveFileNames","checkAndConvert.getCanonicalFileName","checkAndConvert.getCurrentDirectory","checkAndConvert.getNewLine","convertVariableStatement","convertVariableDeclaration","convertSwitchStatement","convertCaseOrDefaultClause","convertLabeledStatement","convertIdentifier","convertBlock","convertTryStatement","convertCatchClause","convertYieldExpression","convertPrefixOrPostfixUnaryExpression","convertNamedUnaryExpression","convertBinaryExpression","convertConditionalExpression","convertFunction","convertFunctionLikeDeclaration","convertArrowFunction","convertFunctionDeclaration","convertParameterDeclaration","convertIfStatement","convertWhileStatement","convertVariableDeclarationOrExpression","convertForStatement","convertForInOrOfStatement","convertWithStatement","convertCallOrNewExpression","convertArrayLiteralExpression","convertObjectLiteralExpression","convertObjectLiteralElement","convertObjectLiteralPropertyElement","convertObjectBindingElement","convertObjectLiteralFunctionLikeElement","isAssignmentOperator","convertUnaryOperator","tryConvertUpdateOperator"],"mappings":"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"} -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | var ts = require('typescript'); 6 | var SyntaxName = ts.SyntaxKind; 7 | // patch SyntaxName in order to provide better names in debug 8 | [ 9 | 'FirstAssignment', 10 | 'LastAssignment', 11 | 'FirstReservedWord', 12 | 'LastReservedWord', 13 | 'FirstKeyword', 14 | 'LastKeyword', 15 | 'FirstFutureReservedWord', 16 | 'LastFutureReservedWord', 17 | 'FirstTypeNode', 18 | 'LastTypeNode', 19 | 'FirstPunctuation', 20 | 'LastPunctuation', 21 | 'FirstToken', 22 | 'LastToken', 23 | 'FirstTriviaToken', 24 | 'LastTriviaToken', 25 | 'FirstLiteralToken', 26 | 'LastLiteralToken', 27 | 'FirstTemplateToken', 28 | 'LastTemplateToken', 29 | 'FirstBinaryOperator', 30 | 'LastBinaryOperator', 31 | 'FirstNode' 32 | ].forEach(function (aliasName) { 33 | var kind = ts.SyntaxKind[aliasName]; 34 | for (var properName in SyntaxName) { 35 | if (aliasName !== properName && ts.SyntaxKind[properName] === kind) { 36 | SyntaxName[kind] = properName; 37 | return; 38 | } 39 | } 40 | }); 41 | function convertPosition(sourceFile, pos) { 42 | var _a = sourceFile.getLineAndCharacterOfPosition(pos), line = _a.line, column = _a.character; 43 | line++; // TypeScript uses 0-based lines while ESTree uses 1-based 44 | return { line: line, column: column }; 45 | } 46 | function unexpected(node) { 47 | var _a = convertPosition(node.getSourceFile(), node.pos), line = _a.line, column = _a.column; 48 | throw new TypeError("Unexpected node type " + SyntaxName[node.kind] + " (" + line + ":" + column + ")"); 49 | } 50 | function wrapPos(owner, range, props) { 51 | var sourceFile = owner.getSourceFile(); 52 | props.loc = { 53 | source: sourceFile.fileName, 54 | start: convertPosition(sourceFile, range.pos), 55 | end: convertPosition(sourceFile, range.end) 56 | }; 57 | props.range = [range.pos, range.end]; 58 | return props; 59 | } 60 | function wrap(node, props) { 61 | return wrapPos(node, { 62 | pos: node.getStart(), 63 | end: node.getEnd() 64 | }, props); 65 | } 66 | function convertNullable(node, convert) { 67 | return node != null ? convert(node) : null; 68 | } 69 | function convertClassLikeDeclaration(node, asExpression) { 70 | var superClass = null; 71 | (node.heritageClauses || []).some(function (clause) { 72 | if (clause.token === 79 /* ExtendsKeyword */) { 73 | superClass = convertExpression(clause.types[0].expression); 74 | return true; 75 | } 76 | else { 77 | return false; 78 | } 79 | }); 80 | return wrap(node, { 81 | type: asExpression ? 'ClassExpression' : 'ClassDeclaration', 82 | id: asExpression ? convertNullable(node.name, convertIdentifier) : convertIdentifier(node.name), 83 | superClass: superClass, 84 | body: wrapPos(node, node.members, { 85 | type: 'ClassBody', 86 | body: node.members.filter(function (element) { return element.kind !== 179 /* SemicolonClassElement */; }).map(convertClassElement) 87 | }) 88 | }); 89 | } 90 | function convertClassElement(node) { 91 | if (node.kind === 141 /* IndexSignature */) { 92 | // TODO 93 | unexpected(node); 94 | } 95 | return convertFunctionLikeClassElement(node); 96 | } 97 | function convertFunctionLikeClassElement(node) { 98 | var kind; 99 | switch (node.kind) { 100 | case 135 /* MethodDeclaration */: 101 | kind = 'method'; 102 | break; 103 | case 136 /* Constructor */: 104 | kind = 'constructor'; 105 | break; 106 | case 137 /* GetAccessor */: 107 | kind = 'get'; 108 | break; 109 | case 138 /* SetAccessor */: 110 | kind = 'set'; 111 | break; 112 | default: unexpected(node); 113 | } 114 | return wrap(node, { 115 | type: 'MethodDefinition', 116 | kind: kind, 117 | key: node.kind !== 136 /* Constructor */ ? convertDeclarationName(node.name) : wrap(node.getFirstToken(), { 118 | type: 'Identifier', 119 | name: node.getFirstToken().getText() 120 | }), 121 | value: convertFunctionLikeDeclaration(node, 2 /* Ignore */), 122 | computed: node.name != null && node.name.kind === 128 /* ComputedPropertyName */, 123 | static: !!(node.flags & 128 /* Static */) 124 | }); 125 | } 126 | function convertObjectBindingPattern(node) { 127 | return wrap(node, { 128 | type: 'ObjectPattern', 129 | properties: node.elements.map(convertObjectBindingElement) 130 | }); 131 | } 132 | function convertIdentifierOrBindingPattern(node) { 133 | return node.kind === 65 /* Identifier */ 134 | ? convertIdentifier(node) 135 | : convertBindingPattern(node); 136 | } 137 | function convertArrayBindingElement(node) { 138 | if (node.name == null) 139 | return null; 140 | var name = convertDeclarationName(node.name); 141 | if (node.dotDotDotToken) { 142 | return wrap(node, { 143 | type: 'RestElement', 144 | argument: name 145 | }); 146 | } 147 | else if (node.initializer) { 148 | return wrap(node, { 149 | type: 'AssignmentPattern', 150 | left: name, 151 | right: convertExpression(node.initializer) 152 | }); 153 | } 154 | else { 155 | return name; 156 | } 157 | } 158 | function convertArrayBindingPattern(node) { 159 | return wrap(node, { 160 | type: 'ArrayPattern', 161 | elements: node.elements.map(convertArrayBindingElement) 162 | }); 163 | } 164 | function convertBindingPattern(node) { 165 | switch (node.kind) { 166 | case 151 /* ObjectBindingPattern */: 167 | return convertObjectBindingPattern(node); 168 | case 152 /* ArrayBindingPattern */: 169 | return convertArrayBindingPattern(node); 170 | default: 171 | unexpected(node); 172 | } 173 | } 174 | function convertExpressionAsBindingPattern(node) { 175 | switch (node.kind) { 176 | case 155 /* ObjectLiteralExpression */: 177 | return wrap(node, { 178 | type: 'ObjectPattern', 179 | properties: node.properties.map(function (node) { 180 | switch (node.kind) { 181 | case 226 /* ShorthandPropertyAssignment */: 182 | case 225 /* PropertyAssignment */: { 183 | var isShorthand = node.kind === 226 /* ShorthandPropertyAssignment */; 184 | return wrap(node, { 185 | type: 'Property', 186 | key: convertDeclarationName(node.name), 187 | value: (isShorthand 188 | ? convertIdentifier(node.name) 189 | : convertExpressionAsBindingPattern(node.initializer)), 190 | kind: 'init', 191 | method: false, 192 | shorthand: isShorthand, 193 | computed: node.name.kind === 128 /* ComputedPropertyName */ 194 | }); 195 | } 196 | default: 197 | unexpected(node); 198 | } 199 | }) 200 | }); 201 | case 154 /* ArrayLiteralExpression */: 202 | return wrap(node, { 203 | type: 'ArrayPattern', 204 | elements: node.elements.map(function (elem) { return convertNullable(elem, convertExpressionAsBindingPattern); }) 205 | }); 206 | case 65 /* Identifier */: 207 | return convertIdentifier(node); 208 | case 157 /* ElementAccessExpression */: 209 | return wrap(node, { 210 | type: 'MemberExpression', 211 | object: convertExpressionAsBindingPattern(node.expression), 212 | property: convertExpression(node.argumentExpression), 213 | computed: true 214 | }); 215 | case 156 /* PropertyAccessExpression */: 216 | return wrap(node, { 217 | type: 'MemberExpression', 218 | object: convertExpressionAsBindingPattern(node.expression), 219 | property: convertIdentifier(node.name), 220 | computed: false 221 | }); 222 | default: 223 | unexpected(node); 224 | } 225 | } 226 | function convertDeclarationName(node) { 227 | switch (node.kind) { 228 | case 128 /* ComputedPropertyName */: 229 | return convertExpression(node.expression); 230 | case 151 /* ObjectBindingPattern */: 231 | case 152 /* ArrayBindingPattern */: 232 | return convertBindingPattern(node); 233 | default: 234 | return convertExpression(node); 235 | } 236 | } 237 | function convertPropertyDeclaration(node) { 238 | // TODO 239 | unexpected(node); 240 | } 241 | function convertLiteral(node) { 242 | var raw = node.getText(); 243 | switch (node.kind) { 244 | case 80 /* FalseKeyword */: 245 | case 95 /* TrueKeyword */: 246 | return wrap(node, { 247 | type: 'Literal', 248 | value: node.kind === 95 /* TrueKeyword */, 249 | raw: raw 250 | }); 251 | case 7 /* NumericLiteral */: 252 | return wrap(node, { 253 | type: 'Literal', 254 | value: Number(node.text), 255 | raw: raw 256 | }); 257 | case 10 /* NoSubstitutionTemplateLiteral */: 258 | return wrap(node, { 259 | type: 'TemplateLiteral', 260 | quasis: [wrapPos(node, { 261 | pos: node.getStart() + 1, 262 | end: node.getEnd() - 1 263 | }, { 264 | type: 'TemplateElement', 265 | value: { 266 | cooked: node.text, 267 | raw: raw.slice(1, -1) 268 | }, 269 | tail: true 270 | })], 271 | expressions: [] 272 | }); 273 | case 8 /* StringLiteral */: 274 | return wrap(node, { 275 | type: 'Literal', 276 | value: node.text, 277 | raw: raw 278 | }); 279 | case 9 /* RegularExpressionLiteral */: { 280 | var _a = raw.match(/^\/(.*)\/([a-z]*)$/), pattern = _a[1], flags = _a[2]; 281 | var value; 282 | try { 283 | value = new RegExp(pattern, flags); 284 | } 285 | catch (e) { 286 | value = null; 287 | } 288 | return wrap(node, { 289 | type: 'Literal', 290 | value: value, 291 | raw: raw, 292 | regex: { 293 | pattern: pattern, 294 | flags: flags 295 | } 296 | }); 297 | } 298 | case 89 /* NullKeyword */: 299 | return wrap(node, { 300 | type: 'Literal', 301 | value: null, 302 | raw: raw 303 | }); 304 | default: 305 | unexpected(node); 306 | } 307 | } 308 | function convertTemplateSpanLiteral(node, isFirst, isLast) { 309 | return wrapPos(node, { 310 | pos: node.getStart() + 1, 311 | end: node.getEnd() - (isLast ? 1 : 2) 312 | }, { 313 | type: 'TemplateElement', 314 | value: { 315 | cooked: node.text, 316 | raw: node.getText().slice(1, isLast ? -1 : -2) 317 | }, 318 | tail: isLast 319 | }); 320 | } 321 | function convertTemplateExpression(node) { 322 | var spansCount = node.templateSpans.length; 323 | var quasis = [convertTemplateSpanLiteral(node.head, true, spansCount === 0)]; 324 | var expressions = []; 325 | node.templateSpans.forEach(function (_a, i) { 326 | var expression = _a.expression, literal = _a.literal; 327 | expressions.push(convertExpression(expression)); 328 | quasis.push(convertTemplateSpanLiteral(literal, false, i === spansCount - 1)); 329 | }); 330 | return wrap(node, { 331 | type: 'TemplateLiteral', 332 | quasis: quasis, 333 | expressions: expressions 334 | }); 335 | } 336 | function convertTaggedTemplateExpression(node) { 337 | var tmpl = node.template; 338 | return wrap(node, { 339 | type: 'TaggedTemplateExpression', 340 | tag: convertExpression(node.tag), 341 | quasi: tmpl.kind === 172 /* TemplateExpression */ 342 | ? convertTemplateExpression(tmpl) 343 | : convertLiteral(tmpl) 344 | }); 345 | } 346 | function convertExpressionStatement(node) { 347 | return wrap(node, { 348 | type: 'ExpressionStatement', 349 | expression: convertExpression(node.expression) 350 | }); 351 | } 352 | function convertTopStatement(node) { 353 | if (node.flags & 1 /* Export */) { 354 | if (node.flags & 256 /* Default */) { 355 | var declaration; 356 | switch (node.kind) { 357 | case 201 /* FunctionDeclaration */: 358 | declaration = convertFunction(node, node.name ? 'FunctionDeclaration' : 'FunctionExpression', 0 /* AllowMissing */); 359 | break; 360 | case 202 /* ClassDeclaration */: 361 | declaration = convertClassLikeDeclaration(node, !node.name); 362 | break; 363 | default: 364 | unexpected(node); 365 | } 366 | return wrap(node, { 367 | type: 'ExportDefaultDeclaration', 368 | declaration: declaration 369 | }); 370 | } 371 | else { 372 | return wrap(node, { 373 | type: 'ExportNamedDeclaration', 374 | declaration: convertStatement(node), 375 | specifiers: [], 376 | source: null 377 | }); 378 | } 379 | } 380 | switch (node.kind) { 381 | case 210 /* ImportDeclaration */: 382 | return convertImportDeclaration(node); 383 | case 216 /* ExportDeclaration */: 384 | return convertExportDeclaration(node); 385 | case 215 /* ExportAssignment */: 386 | return convertExportAssignment(node); 387 | default: 388 | return convertStatement(node); 389 | } 390 | } 391 | function convertImportDeclaration(node) { 392 | if (node.moduleSpecifier.kind !== 8 /* StringLiteral */) { 393 | unexpected(node.moduleSpecifier); 394 | } 395 | return wrap(node, { 396 | type: 'ImportDeclaration', 397 | specifiers: convertImportClause(node.importClause), 398 | source: convertLiteral(node.moduleSpecifier) 399 | }); 400 | } 401 | function convertImportClause(node) { 402 | var specifiers = []; 403 | if (node == null) 404 | return specifiers; 405 | var name = node.name, namedBindings = node.namedBindings; 406 | if (name) { 407 | specifiers.push(wrap(name, { 408 | type: 'ImportDefaultSpecifier', 409 | local: convertIdentifier(name) 410 | })); 411 | } 412 | if (namedBindings) { 413 | switch (namedBindings.kind) { 414 | case 212 /* NamespaceImport */: 415 | specifiers.push(wrap(namedBindings, { 416 | type: 'ImportNamespaceSpecifier', 417 | local: convertIdentifier(namedBindings.name) 418 | })); 419 | break; 420 | case 213 /* NamedImports */: 421 | specifiers = specifiers.concat(namedBindings.elements.map(function (binding) { 422 | return wrap(binding, { 423 | type: 'ImportSpecifier', 424 | local: convertIdentifier(binding.name), 425 | imported: convertIdentifier(binding.propertyName || binding.name) 426 | }); 427 | })); 428 | break; 429 | default: 430 | unexpected(node.namedBindings); 431 | } 432 | } 433 | return specifiers; 434 | } 435 | function convertExportDeclaration(node) { 436 | var source; 437 | if (node.moduleSpecifier) { 438 | if (node.moduleSpecifier.kind !== 8 /* StringLiteral */) { 439 | unexpected(node.moduleSpecifier); 440 | } 441 | source = convertLiteral(node.moduleSpecifier); 442 | } 443 | else { 444 | source = null; 445 | } 446 | if (!node.exportClause) { 447 | return wrap(node, { 448 | type: 'ExportAllDeclaration', 449 | source: source 450 | }); 451 | } 452 | else { 453 | return wrap(node, { 454 | type: 'ExportNamedDeclaration', 455 | declaration: null, 456 | specifiers: node.exportClause.elements.map(function (element) { 457 | return wrap(element, { 458 | type: 'ExportSpecifier', 459 | local: convertIdentifier(element.propertyName || element.name), 460 | exported: convertIdentifier(element.name) 461 | }); 462 | }), 463 | source: source 464 | }); 465 | } 466 | } 467 | function convertExportAssignment(node) { 468 | return wrap(node, { 469 | type: 'ExportDefaultDeclaration', 470 | declaration: convertExpression(node.expression) 471 | }); 472 | } 473 | function convertStatement(node) { 474 | switch (node.kind) { 475 | case 180 /* Block */: 476 | return convertBlock(node); 477 | case 181 /* VariableStatement */: 478 | return convertVariableStatement(node); 479 | case 194 /* SwitchStatement */: 480 | return convertSwitchStatement(node); 481 | case 197 /* TryStatement */: 482 | return convertTryStatement(node); 483 | case 201 /* FunctionDeclaration */: 484 | return convertFunctionDeclaration(node); 485 | case 202 /* ClassDeclaration */: 486 | return convertClassLikeDeclaration(node); 487 | case 198 /* DebuggerStatement */: 488 | return wrap(node, { type: 'DebuggerStatement' }); 489 | case 182 /* EmptyStatement */: 490 | return wrap(node, { type: 'EmptyStatement' }); 491 | case 191 /* BreakStatement */: 492 | case 190 /* ContinueStatement */: 493 | return convertBreakOrContinuteStatement(node); 494 | case 192 /* ReturnStatement */: 495 | return convertReturnStatement(node); 496 | case 195 /* LabeledStatement */: 497 | return convertLabeledStatement(node); 498 | case 196 /* ThrowStatement */: 499 | return convertThrowStatement(node); 500 | case 183 /* ExpressionStatement */: 501 | return convertExpressionStatement(node); 502 | case 193 /* WithStatement */: 503 | return convertWithStatement(node); 504 | case 188 /* ForInStatement */: 505 | case 189 /* ForOfStatement */: 506 | return convertForInOrOfStatement(node); 507 | case 187 /* ForStatement */: 508 | return convertForStatement(node); 509 | case 186 /* WhileStatement */: 510 | case 185 /* DoStatement */: 511 | return convertWhileStatement(node); 512 | case 184 /* IfStatement */: 513 | return convertIfStatement(node); 514 | default: 515 | unexpected(node); 516 | } 517 | } 518 | function convertThrowStatement(node) { 519 | return wrap(node, { 520 | type: 'ThrowStatement', 521 | argument: convertExpression(node.expression) 522 | }); 523 | } 524 | function convertBreakOrContinuteStatement(node) { 525 | return wrap(node, { 526 | type: node.kind === 191 /* BreakStatement */ ? 'BreakStatement' : 'ContinueStatement', 527 | label: convertNullable(node.label, convertIdentifier) 528 | }); 529 | } 530 | function convertReturnStatement(node) { 531 | return wrap(node, { 532 | type: 'ReturnStatement', 533 | argument: convertNullable(node.expression, convertExpression) 534 | }); 535 | } 536 | function convertExpression(node) { 537 | switch (node.kind) { 538 | case 176 /* OmittedExpression */: 539 | return null; 540 | case 93 /* ThisKeyword */: 541 | return wrap(node, { type: 'ThisExpression' }); 542 | case 91 /* SuperKeyword */: 543 | return wrap(node, { type: 'Super' }); 544 | case 65 /* Identifier */: 545 | return convertIdentifier(node); 546 | case 170 /* BinaryExpression */: 547 | return convertBinaryExpression(node); 548 | case 168 /* PrefixUnaryExpression */: 549 | case 169 /* PostfixUnaryExpression */: 550 | return convertPrefixOrPostfixUnaryExpression(node); 551 | case 165 /* DeleteExpression */: 552 | case 166 /* TypeOfExpression */: 553 | case 167 /* VoidExpression */: 554 | return convertNamedUnaryExpression(node); 555 | case 171 /* ConditionalExpression */: 556 | return convertConditionalExpression(node); 557 | case 158 /* CallExpression */: 558 | case 159 /* NewExpression */: 559 | return convertCallOrNewExpression(node); 560 | case 162 /* ParenthesizedExpression */: 561 | return convertExpression(node.expression); 562 | case 154 /* ArrayLiteralExpression */: 563 | return convertArrayLiteralExpression(node); 564 | case 155 /* ObjectLiteralExpression */: 565 | return convertObjectLiteralExpression(node); 566 | case 164 /* ArrowFunction */: 567 | return convertArrowFunction(node); 568 | case 163 /* FunctionExpression */: 569 | return convertFunctionLikeDeclaration(node); 570 | case 175 /* ClassExpression */: 571 | return convertClassLikeDeclaration(node); 572 | case 156 /* PropertyAccessExpression */: 573 | return convertPropertyAccessExpression(node); 574 | case 157 /* ElementAccessExpression */: 575 | return convertElementAccessExpression(node); 576 | case 172 /* TemplateExpression */: 577 | return convertTemplateExpression(node); 578 | case 174 /* SpreadElementExpression */: 579 | return convertSpreadElementExpression(node); 580 | case 173 /* YieldExpression */: 581 | return convertYieldExpression(node); 582 | case 160 /* TaggedTemplateExpression */: 583 | return convertTaggedTemplateExpression(node); 584 | default: 585 | return convertLiteral(node); 586 | } 587 | } 588 | function convertSpreadElementExpression(node) { 589 | return wrap(node, { 590 | type: 'SpreadElement', 591 | argument: convertExpression(node.expression) 592 | }); 593 | } 594 | function convertPropertyAccessExpression(node) { 595 | return wrap(node, { 596 | type: 'MemberExpression', 597 | object: convertExpression(node.expression), 598 | property: convertIdentifier(node.name), 599 | computed: false 600 | }); 601 | } 602 | function convertElementAccessExpression(node) { 603 | return wrap(node, { 604 | type: 'MemberExpression', 605 | object: convertExpression(node.expression), 606 | property: convertExpression(node.argumentExpression), 607 | computed: true 608 | }); 609 | } 610 | function convertSourceFile(node) { 611 | return wrapPos(node, node, { 612 | type: 'Program', 613 | body: node.statements.map(convertTopStatement), 614 | sourceType: 'module' 615 | }); 616 | } 617 | exports.convertSourceFile = convertSourceFile; 618 | function checkAndConvert(input, options) { 619 | options = options ? ts.clone(options) : ts.getDefaultCompilerOptions(); 620 | options.noLib = true; 621 | options.noResolve = true; 622 | var inputFileName = "module.ts"; 623 | var sourceFile = ts.createSourceFile(inputFileName, input, options.target); 624 | // Create a compilerHost object to allow the compiler to read and write files 625 | var program = ts.createProgram([inputFileName], options, { 626 | getSourceFile: function (fileName, target) { return fileName === inputFileName ? sourceFile : undefined; }, 627 | writeFile: function (name, text, writeByteOrderMark) { 628 | throw new Error("Not implemented"); 629 | }, 630 | getDefaultLibFileName: function () { return "lib.d.ts"; }, 631 | useCaseSensitiveFileNames: function () { return true; }, 632 | getCanonicalFileName: function (fileName) { return fileName; }, 633 | getCurrentDirectory: function () { return ""; }, 634 | getNewLine: function () { return "\n"; } 635 | }); 636 | program.getSemanticDiagnostics(); 637 | return convertSourceFile(sourceFile); 638 | } 639 | exports.checkAndConvert = checkAndConvert; 640 | function convertVariableStatement(node) { 641 | var _a = node.declarationList, flags = _a.flags, declarations = _a.declarations; 642 | return wrap(node, { 643 | type: 'VariableDeclaration', 644 | kind: (flags & 8192 /* Const */) ? 'const' : (flags & 4096 /* Let */) ? 'let' : 'var', 645 | declarations: declarations.map(convertVariableDeclaration) 646 | }); 647 | } 648 | function convertVariableDeclaration(node) { 649 | return wrap(node, { 650 | type: 'VariableDeclarator', 651 | id: convertDeclarationName(node.name), 652 | init: convertNullable(node.initializer, convertExpression) 653 | }); 654 | } 655 | function convertSwitchStatement(node) { 656 | return wrap(node, { 657 | type: 'SwitchStatement', 658 | discriminant: convertExpression(node.expression), 659 | cases: node.caseBlock.clauses.map(convertCaseOrDefaultClause) 660 | }); 661 | } 662 | function convertCaseOrDefaultClause(node) { 663 | return wrap(node, { 664 | type: 'SwitchCase', 665 | test: node.kind === 221 /* CaseClause */ ? convertExpression(node.expression) : null, 666 | consequent: node.statements.map(convertStatement) 667 | }); 668 | } 669 | function convertLabeledStatement(node) { 670 | return wrap(node, { 671 | type: 'LabeledStatement', 672 | label: convertIdentifier(node.label), 673 | body: convertStatement(node.statement) 674 | }); 675 | } 676 | function convertIdentifier(node) { 677 | return wrap(node, { 678 | type: 'Identifier', 679 | name: node.text 680 | }); 681 | } 682 | function convertBlock(node) { 683 | return wrap(node, { 684 | type: 'BlockStatement', 685 | body: node.statements.map(convertStatement) 686 | }); 687 | } 688 | function convertTryStatement(node) { 689 | return wrap(node, { 690 | type: 'TryStatement', 691 | block: convertBlock(node.tryBlock), 692 | handler: convertNullable(node.catchClause, convertCatchClause), 693 | finalizer: convertNullable(node.finallyBlock, convertBlock) 694 | }); 695 | } 696 | function convertCatchClause(node) { 697 | return wrap(node, { 698 | type: 'CatchClause', 699 | param: convertDeclarationName(node.variableDeclaration.name), 700 | body: convertBlock(node.block) 701 | }); 702 | } 703 | function convertYieldExpression(node) { 704 | return wrap(node, { 705 | type: 'YieldExpression', 706 | argument: convertNullable(node.expression, convertExpression), 707 | delegate: !!node.asteriskToken 708 | }); 709 | } 710 | function convertPrefixOrPostfixUnaryExpression(node) { 711 | var operator = tryConvertUpdateOperator(node.operator); 712 | var isUnary = operator === undefined; 713 | if (isUnary) { 714 | operator = convertUnaryOperator(node.operator); 715 | } 716 | return wrap(node, { 717 | type: isUnary ? 'UnaryExpression' : 'UpdateExpression', 718 | operator: operator, 719 | prefix: node.kind === 168 /* PrefixUnaryExpression */, 720 | argument: convertExpression(node.operand) 721 | }); 722 | } 723 | function convertNamedUnaryExpression(node) { 724 | var operator; 725 | switch (node.kind) { 726 | case 165 /* DeleteExpression */: 727 | operator = "delete"; 728 | break; 729 | case 166 /* TypeOfExpression */: 730 | operator = "typeof"; 731 | break; 732 | case 167 /* VoidExpression */: 733 | operator = "void"; 734 | break; 735 | default: 736 | unexpected(node); 737 | } 738 | return wrap(node, { 739 | type: 'UnaryExpression', 740 | operator: operator, 741 | prefix: true, 742 | argument: convertExpression(node.expression) 743 | }); 744 | } 745 | function convertBinaryExpression(node) { 746 | switch (node.operatorToken.kind) { 747 | case 49 /* BarBarToken */: 748 | case 48 /* AmpersandAmpersandToken */: 749 | return wrap(node, { 750 | type: 'LogicalExpression', 751 | operator: node.operatorToken.getText(), 752 | left: convertExpression(node.left), 753 | right: convertExpression(node.right) 754 | }); 755 | case 23 /* CommaToken */: { 756 | var expressions = []; 757 | var expr = node; 758 | do { 759 | expressions.unshift(convertExpression(expr.right)); 760 | expr = expr.left; 761 | } while (expr.kind === 170 /* BinaryExpression */ && expr.operatorToken.kind === 23 /* CommaToken */); 762 | expressions.unshift(convertExpression(expr)); 763 | return wrap(node, { 764 | type: 'SequenceExpression', 765 | expressions: expressions 766 | }); 767 | } 768 | default: 769 | if (isAssignmentOperator(node.operatorToken.kind)) { 770 | return wrap(node, { 771 | type: 'AssignmentExpression', 772 | operator: node.operatorToken.getText(), 773 | left: convertExpressionAsBindingPattern(node.left), 774 | right: convertExpression(node.right) 775 | }); 776 | } 777 | else { 778 | return wrap(node, { 779 | type: 'BinaryExpression', 780 | operator: node.operatorToken.getText(), 781 | left: convertExpression(node.left), 782 | right: convertExpression(node.right) 783 | }); 784 | } 785 | } 786 | } 787 | function convertConditionalExpression(node) { 788 | return wrap(node, { 789 | type: 'ConditionalExpression', 790 | test: convertExpression(node.condition), 791 | consequent: convertExpression(node.whenTrue), 792 | alternate: convertExpression(node.whenFalse) 793 | }); 794 | } 795 | function convertFunction(node, type, idBehavior, allowExpressionBody) { 796 | var body = node.body; 797 | if (body.kind !== 180 /* Block */ && !allowExpressionBody) { 798 | unexpected(body); 799 | } 800 | return wrap(node, { 801 | type: type, 802 | id: idBehavior === 1 /* Enforce */ || idBehavior === 0 /* AllowMissing */ && node.name ? convertIdentifier(node.name) : null, 803 | params: node.parameters.map(convertParameterDeclaration), 804 | body: body.kind === 180 /* Block */ ? convertBlock(body) : convertExpression(body), 805 | generator: !!node.asteriskToken 806 | }); 807 | } 808 | function convertFunctionLikeDeclaration(node, idBehavior) { 809 | if (idBehavior === void 0) { idBehavior = 0 /* AllowMissing */; } 810 | return convertFunction(node, 'FunctionExpression', idBehavior); 811 | } 812 | function convertArrowFunction(node) { 813 | var arrowFn = convertFunction(node, 'ArrowFunctionExpression', 2 /* Ignore */, true); 814 | arrowFn.expression = node.body.kind !== 180 /* Block */; 815 | return arrowFn; 816 | } 817 | function convertFunctionDeclaration(node) { 818 | return convertFunction(node, 'FunctionDeclaration', 1 /* Enforce */); 819 | } 820 | function convertParameterDeclaration(node) { 821 | var name = convertDeclarationName(node.name); 822 | if (node.dotDotDotToken) { 823 | return wrap(node, { 824 | type: 'RestElement', 825 | argument: name 826 | }); 827 | } 828 | else if (node.initializer) { 829 | return wrap(node, { 830 | type: 'AssignmentPattern', 831 | left: name, 832 | right: convertExpression(node.initializer) 833 | }); 834 | } 835 | else { 836 | return name; 837 | } 838 | } 839 | function convertIfStatement(node) { 840 | return wrap(node, { 841 | type: 'IfStatement', 842 | test: convertExpression(node.expression), 843 | consequent: convertStatement(node.thenStatement), 844 | alternate: convertNullable(node.elseStatement, convertStatement) 845 | }); 846 | } 847 | function convertWhileStatement(node) { 848 | return wrap(node, { 849 | type: node.kind === 186 /* WhileStatement */ ? 'WhileStatement' : 'DoWhileStatement', 850 | test: convertExpression(node.expression), 851 | body: convertStatement(node.statement) 852 | }); 853 | } 854 | function convertVariableDeclarationOrExpression(node) { 855 | return node.kind === 200 /* VariableDeclarationList */ 856 | ? wrapPos(node, node, { 857 | type: 'VariableDeclaration', 858 | kind: 'var', 859 | declarations: node.declarations.map(convertVariableDeclaration) 860 | }) 861 | : convertExpression(node); 862 | } 863 | function convertForStatement(node) { 864 | return wrap(node, { 865 | type: 'ForStatement', 866 | init: convertNullable(node.initializer, convertVariableDeclarationOrExpression), 867 | test: convertNullable(node.condition, convertExpression), 868 | update: convertNullable(node.incrementor, convertExpression), 869 | body: convertStatement(node.statement) 870 | }); 871 | } 872 | function convertForInOrOfStatement(node) { 873 | return wrap(node, { 874 | type: node.kind === 188 /* ForInStatement */ ? 'ForInStatement' : 'ForOfStatement', 875 | left: convertVariableDeclarationOrExpression(node.initializer), 876 | right: convertExpression(node.expression), 877 | body: convertStatement(node.statement) 878 | }); 879 | } 880 | function convertWithStatement(node) { 881 | return wrap(node, { 882 | type: 'WithStatement', 883 | object: convertExpression(node.expression), 884 | body: convertStatement(node.statement) 885 | }); 886 | } 887 | function convertCallOrNewExpression(node) { 888 | return wrap(node, { 889 | type: node.kind === 158 /* CallExpression */ ? 'CallExpression' : 'NewExpression', 890 | callee: convertExpression(node.expression), 891 | arguments: node.arguments ? node.arguments.map(convertExpression) : [] 892 | }); 893 | } 894 | function convertArrayLiteralExpression(node) { 895 | return wrap(node, { 896 | type: 'ArrayExpression', 897 | elements: node.elements.map(convertExpression) 898 | }); 899 | } 900 | function convertObjectLiteralExpression(node) { 901 | return wrap(node, { 902 | type: 'ObjectExpression', 903 | properties: node.properties.map(convertObjectLiteralElement) 904 | }); 905 | } 906 | function convertObjectLiteralElement(node) { 907 | switch (node.kind) { 908 | case 226 /* ShorthandPropertyAssignment */: 909 | case 225 /* PropertyAssignment */: 910 | return convertObjectLiteralPropertyElement(node); 911 | case 135 /* MethodDeclaration */: 912 | case 137 /* GetAccessor */: 913 | case 138 /* SetAccessor */: 914 | return convertObjectLiteralFunctionLikeElement(node); 915 | default: 916 | unexpected(node); 917 | } 918 | } 919 | function convertObjectLiteralPropertyElement(node) { 920 | var isShorthand = node.kind === 226 /* ShorthandPropertyAssignment */; 921 | return wrap(node, { 922 | type: 'Property', 923 | key: convertDeclarationName(node.name), 924 | value: (isShorthand 925 | ? convertIdentifier(node.name) 926 | : convertExpression(node.initializer)), 927 | kind: 'init', 928 | method: false, 929 | shorthand: isShorthand, 930 | computed: node.name.kind === 128 /* ComputedPropertyName */ 931 | }); 932 | } 933 | function convertObjectBindingElement(node) { 934 | var isShorthand = !node.propertyName; 935 | var value = convertIdentifierOrBindingPattern(node.name); 936 | if (node.initializer) { 937 | value = { 938 | type: 'AssignmentPattern', 939 | left: value, 940 | right: convertExpression(node.initializer) 941 | }; 942 | } 943 | return wrap(node, { 944 | type: 'Property', 945 | key: convertIdentifierOrBindingPattern(node.propertyName || node.name), 946 | value: value, 947 | kind: 'init', 948 | method: false, 949 | shorthand: isShorthand, 950 | computed: node.name.kind === 128 /* ComputedPropertyName */ 951 | }); 952 | } 953 | function convertObjectLiteralFunctionLikeElement(node) { 954 | return wrap(node, { 955 | type: 'Property', 956 | key: convertDeclarationName(node.name), 957 | value: convertFunctionLikeDeclaration(node, 2 /* Ignore */), 958 | kind: node.kind === 137 /* GetAccessor */ ? 'get' : node.kind === 138 /* SetAccessor */ ? 'set' : 'init', 959 | method: node.kind === 135 /* MethodDeclaration */, 960 | shorthand: false, 961 | computed: node.name.kind === 128 /* ComputedPropertyName */ 962 | }); 963 | } 964 | function isAssignmentOperator(op) { 965 | switch (op) { 966 | case 53 /* EqualsToken */: 967 | case 54 /* PlusEqualsToken */: 968 | case 55 /* MinusEqualsToken */: 969 | case 56 /* AsteriskEqualsToken */: 970 | case 57 /* SlashEqualsToken */: 971 | case 58 /* PercentEqualsToken */: 972 | case 59 /* LessThanLessThanEqualsToken */: 973 | case 60 /* GreaterThanGreaterThanEqualsToken */: 974 | case 61 /* GreaterThanGreaterThanGreaterThanEqualsToken */: 975 | case 63 /* BarEqualsToken */: 976 | case 64 /* CaretEqualsToken */: 977 | case 62 /* AmpersandEqualsToken */: 978 | return true; 979 | default: 980 | return false; 981 | } 982 | } 983 | function convertUnaryOperator(op) { 984 | switch (op) { 985 | case 34 /* MinusToken */: 986 | return "-"; 987 | case 33 /* PlusToken */: 988 | return "+"; 989 | case 46 /* ExclamationToken */: 990 | return "!"; 991 | case 47 /* TildeToken */: 992 | return "~"; 993 | default: 994 | throw new TypeError("Unknown unary operator: " + SyntaxName[op]); 995 | } 996 | } 997 | function tryConvertUpdateOperator(op) { 998 | switch (op) { 999 | case 38 /* PlusPlusToken */: 1000 | return "++"; 1001 | case 39 /* MinusMinusToken */: 1002 | return "--"; 1003 | } 1004 | } 1005 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | 6 | import * as ts from 'typescript'; 7 | 8 | var SyntaxName: { [kind: number]: string } = (ts).SyntaxKind; 9 | 10 | // patch SyntaxName in order to provide better names in debug 11 | [ 12 | 'FirstAssignment', 13 | 'LastAssignment', 14 | 'FirstReservedWord', 15 | 'LastReservedWord', 16 | 'FirstKeyword', 17 | 'LastKeyword', 18 | 'FirstFutureReservedWord', 19 | 'LastFutureReservedWord', 20 | 'FirstTypeNode', 21 | 'LastTypeNode', 22 | 'FirstPunctuation', 23 | 'LastPunctuation', 24 | 'FirstToken', 25 | 'LastToken', 26 | 'FirstTriviaToken', 27 | 'LastTriviaToken', 28 | 'FirstLiteralToken', 29 | 'LastLiteralToken', 30 | 'FirstTemplateToken', 31 | 'LastTemplateToken', 32 | 'FirstBinaryOperator', 33 | 'LastBinaryOperator', 34 | 'FirstNode' 35 | ].forEach(aliasName => { 36 | var kind = (ts).SyntaxKind[aliasName]; 37 | for (let properName in SyntaxName) { 38 | if (aliasName !== properName && (ts).SyntaxKind[properName] === kind) { 39 | SyntaxName[kind] = properName; 40 | return; 41 | } 42 | } 43 | }); 44 | 45 | function convertPosition(sourceFile: ts.SourceFile, pos: number): ESTree.Position { 46 | var { line, character: column } = sourceFile.getLineAndCharacterOfPosition(pos); 47 | line++; // TypeScript uses 0-based lines while ESTree uses 1-based 48 | return { line, column }; 49 | } 50 | 51 | function unexpected(node: ts.Node) { 52 | var { line, column } = convertPosition(node.getSourceFile(), node.pos); 53 | throw new TypeError(`Unexpected node type ${SyntaxName[node.kind]} (${line}:${column})`); 54 | } 55 | 56 | function wrapPos(owner: ts.Node, range: ts.TextRange, props: T): T { 57 | var sourceFile = owner.getSourceFile(); 58 | props.loc = { 59 | source: sourceFile.fileName, 60 | start: convertPosition(sourceFile, range.pos), 61 | end: convertPosition(sourceFile, range.end) 62 | }; 63 | props.range = [range.pos, range.end]; 64 | return props; 65 | } 66 | 67 | function wrap(node: ts.Node, props: T): T { 68 | return wrapPos(node, { 69 | pos: node.getStart(), 70 | end: node.getEnd() 71 | }, props); 72 | } 73 | 74 | function convertNullable(node: From, convert: (node: From) => To): To { 75 | return node != null ? convert(node) : null; 76 | } 77 | 78 | function convertClassLikeDeclaration(node: ts.ClassLikeDeclaration, asExpression?: boolean) { 79 | var superClass: ESTree.Expression = null; 80 | (node.heritageClauses || []).some(clause => { 81 | if (clause.token === ts.SyntaxKind.ExtendsKeyword) { 82 | superClass = convertExpression(clause.types[0].expression); 83 | return true; 84 | } else { 85 | return false; 86 | } 87 | }); 88 | return wrap(node, { 89 | type: asExpression ? 'ClassExpression' : 'ClassDeclaration', 90 | id: asExpression ? convertNullable(node.name, convertIdentifier) : convertIdentifier(node.name), 91 | superClass, 92 | body: wrapPos(node, node.members, { 93 | type: 'ClassBody', 94 | body: node.members.filter(element => element.kind !== ts.SyntaxKind.SemicolonClassElement).map(convertClassElement) 95 | }) 96 | }); 97 | } 98 | 99 | type ts_FunctionLikeClassElement = ts.MethodDeclaration | ts.ConstructorDeclaration | ts.AccessorDeclaration; 100 | 101 | function convertClassElement(node: ts.ClassElement) { 102 | if (node.kind === ts.SyntaxKind.IndexSignature) { 103 | // TODO 104 | unexpected(node); 105 | } 106 | return convertFunctionLikeClassElement(node); 107 | } 108 | 109 | function convertFunctionLikeClassElement(node: ts_FunctionLikeClassElement) { 110 | var kind: string; 111 | switch (node.kind) { 112 | case ts.SyntaxKind.MethodDeclaration: kind = 'method'; break; 113 | case ts.SyntaxKind.Constructor: kind = 'constructor'; break; 114 | case ts.SyntaxKind.GetAccessor: kind = 'get'; break; 115 | case ts.SyntaxKind.SetAccessor: kind = 'set'; break; 116 | default: unexpected(node); 117 | } 118 | var key: ESTree.Expression; 119 | if (node.kind !== ts.SyntaxKind.Constructor) { 120 | key = convertDeclarationName(node.name); 121 | } else { 122 | let token = node.getFirstToken(); 123 | key = wrap(token, { 124 | type: 'Identifier', 125 | name: token.getText() 126 | }); 127 | } 128 | return wrap(node, { 129 | type: 'MethodDefinition', 130 | kind, 131 | key, 132 | value: convertFunctionLikeDeclaration(node, IdBehavior.Ignore), 133 | computed: node.name != null && node.name.kind === ts.SyntaxKind.ComputedPropertyName, 134 | static: !!(node.flags & ts.NodeFlags.Static) 135 | }); 136 | } 137 | 138 | function convertObjectBindingPattern(node: ts.BindingPattern) { 139 | return wrap(node, { 140 | type: 'ObjectPattern', 141 | properties: node.elements.map(convertObjectBindingElement) 142 | }); 143 | } 144 | 145 | function convertIdentifierOrBindingPattern(node: ts.Identifier | ts.BindingPattern): ESTree.Pattern { 146 | return node.kind === ts.SyntaxKind.Identifier 147 | ? convertIdentifier(node) 148 | : convertBindingPattern(node); 149 | } 150 | 151 | function convertArrayBindingElement(node: ts.BindingElement) { 152 | if (node.name == null) return null; 153 | var name = convertDeclarationName(node.name); 154 | if (node.dotDotDotToken) { 155 | return wrap(node, { 156 | type: 'RestElement', 157 | argument: name 158 | }); 159 | } else if (node.initializer) { 160 | return wrap(node, { 161 | type: 'AssignmentPattern', 162 | left: name, 163 | right: convertExpression(node.initializer) 164 | }); 165 | } else { 166 | return name; 167 | } 168 | } 169 | 170 | function convertArrayBindingPattern(node: ts.BindingPattern) { 171 | return wrap(node, { 172 | type: 'ArrayPattern', 173 | elements: node.elements.map(convertArrayBindingElement) 174 | }); 175 | } 176 | 177 | function convertBindingPattern(node: ts.BindingPattern): ESTree.Pattern { 178 | switch (node.kind) { 179 | case ts.SyntaxKind.ObjectBindingPattern: 180 | return convertObjectBindingPattern(node); 181 | 182 | case ts.SyntaxKind.ArrayBindingPattern: 183 | return convertArrayBindingPattern(node); 184 | 185 | default: 186 | unexpected(node); 187 | } 188 | } 189 | 190 | function convertExpressionAsBindingPattern(node: ts.Expression): ESTree.Pattern { 191 | switch (node.kind) { 192 | case ts.SyntaxKind.ObjectLiteralExpression: 193 | return wrap(node, { 194 | type: 'ObjectPattern', 195 | properties: (node).properties.map(node => { 196 | switch (node.kind) { 197 | case ts.SyntaxKind.ShorthandPropertyAssignment: 198 | case ts.SyntaxKind.PropertyAssignment: { 199 | var isShorthand = node.kind === ts.SyntaxKind.ShorthandPropertyAssignment; 200 | return wrap(node, { 201 | type: 'Property', 202 | key: convertDeclarationName(node.name), 203 | value: ( 204 | isShorthand 205 | ? convertIdentifier((node).name) 206 | : convertExpressionAsBindingPattern((node).initializer) 207 | ), 208 | kind: 'init', 209 | method: false, 210 | shorthand: isShorthand, 211 | computed: node.name.kind === ts.SyntaxKind.ComputedPropertyName 212 | }); 213 | } 214 | 215 | default: 216 | unexpected(node); 217 | } 218 | }) 219 | }); 220 | 221 | case ts.SyntaxKind.ArrayLiteralExpression: 222 | return wrap(node, { 223 | type: 'ArrayPattern', 224 | elements: (node).elements.map(elem => convertNullable(elem, convertExpressionAsBindingPattern)) 225 | }); 226 | 227 | case ts.SyntaxKind.Identifier: 228 | return convertIdentifier(node); 229 | 230 | case ts.SyntaxKind.ElementAccessExpression: 231 | return wrap(node, { 232 | type: 'MemberExpression', 233 | object: convertExpressionAsBindingPattern((node).expression), 234 | property: convertExpression((node).argumentExpression), 235 | computed: true 236 | }); 237 | 238 | case ts.SyntaxKind.PropertyAccessExpression: 239 | return wrap(node, { 240 | type: 'MemberExpression', 241 | object: convertExpressionAsBindingPattern((node).expression), 242 | property: convertIdentifier((node).name), 243 | computed: false 244 | }); 245 | 246 | default: 247 | unexpected(node); 248 | } 249 | } 250 | 251 | function convertDeclarationName(node: ts.DeclarationName) { 252 | switch (node.kind) { 253 | case ts.SyntaxKind.ComputedPropertyName: 254 | return convertExpression((node).expression); 255 | 256 | case ts.SyntaxKind.ObjectBindingPattern: 257 | case ts.SyntaxKind.ArrayBindingPattern: 258 | return convertBindingPattern(node); 259 | 260 | default: 261 | return convertExpression(node); 262 | } 263 | } 264 | 265 | function convertPropertyDeclaration(node: ts.PropertyDeclaration): ESTree.MethodDefinition { 266 | // TODO 267 | unexpected(node); 268 | } 269 | 270 | function convertLiteral(node: ts.LiteralExpression): ESTree.Literal { 271 | var raw = node.getText(); 272 | switch (node.kind) { 273 | case ts.SyntaxKind.FalseKeyword: 274 | case ts.SyntaxKind.TrueKeyword: 275 | return wrap(node, { 276 | type: 'Literal', 277 | value: node.kind === ts.SyntaxKind.TrueKeyword, 278 | raw 279 | }); 280 | 281 | case ts.SyntaxKind.NumericLiteral: 282 | return wrap(node, { 283 | type: 'Literal', 284 | value: Number(node.text), 285 | raw 286 | }); 287 | 288 | case ts.SyntaxKind.NoSubstitutionTemplateLiteral: 289 | return wrap(node, { 290 | type: 'TemplateLiteral', 291 | quasis: [wrapPos(node, { 292 | pos: node.getStart() + 1, 293 | end: node.getEnd() - 1 294 | }, { 295 | type: 'TemplateElement', 296 | value: { 297 | cooked: node.text, 298 | raw: raw.slice(1, -1) 299 | }, 300 | tail: true 301 | })], 302 | expressions: [] 303 | }); 304 | 305 | case ts.SyntaxKind.StringLiteral: 306 | return wrap(node, { 307 | type: 'Literal', 308 | value: node.text, 309 | raw 310 | }); 311 | 312 | case ts.SyntaxKind.RegularExpressionLiteral: { 313 | let [, pattern, flags] = raw.match(/^\/(.*)\/([a-z]*)$/); 314 | let value: RegExp; 315 | try { 316 | value = new RegExp(pattern, flags); 317 | } catch (e) { 318 | value = null; 319 | } 320 | return wrap(node, { 321 | type: 'Literal', 322 | value, 323 | raw, 324 | regex: { 325 | pattern, 326 | flags 327 | } 328 | }); 329 | } 330 | 331 | case ts.SyntaxKind.NullKeyword: 332 | return wrap(node, { 333 | type: 'Literal', 334 | value: null, 335 | raw 336 | }); 337 | 338 | default: 339 | unexpected(node); 340 | } 341 | } 342 | 343 | function convertTemplateSpanLiteral(node: ts.LiteralExpression, isFirst: boolean, isLast: boolean) { 344 | return wrapPos(node, { 345 | pos: node.getStart() + 1, 346 | end: node.getEnd() - (isLast ? 1 : 2) 347 | }, { 348 | type: 'TemplateElement', 349 | value: { 350 | cooked: node.text, 351 | raw: node.getText().slice(1, isLast ? -1 : -2) 352 | }, 353 | tail: isLast 354 | }); 355 | } 356 | 357 | function convertTemplateExpression(node: ts.TemplateExpression) { 358 | var spansCount = node.templateSpans.length; 359 | var quasis = [convertTemplateSpanLiteral(node.head, true, spansCount === 0)]; 360 | var expressions: Array = []; 361 | node.templateSpans.forEach(({ expression, literal }, i) => { 362 | expressions.push(convertExpression(expression)); 363 | quasis.push(convertTemplateSpanLiteral(literal, false, i === spansCount - 1)); 364 | }); 365 | return wrap(node, { 366 | type: 'TemplateLiteral', 367 | quasis, 368 | expressions 369 | }); 370 | } 371 | 372 | function convertTaggedTemplateExpression(node: ts.TaggedTemplateExpression) { 373 | var tmpl = node.template; 374 | return wrap(node, { 375 | type: 'TaggedTemplateExpression', 376 | tag: convertExpression(node.tag), 377 | quasi: tmpl.kind === ts.SyntaxKind.TemplateExpression 378 | ? convertTemplateExpression(tmpl) 379 | : convertLiteral(tmpl) 380 | }); 381 | } 382 | 383 | function convertExpressionStatement(node: ts.ExpressionStatement) { 384 | return wrap(node, { 385 | type: 'ExpressionStatement', 386 | expression: convertExpression(node.expression) 387 | }); 388 | } 389 | 390 | function convertTopStatement(node: ts.ModuleElement): ESTree.Statement | ESTree.ModuleDeclaration { 391 | if (node.flags & ts.NodeFlags.Export) { 392 | if (node.flags & ts.NodeFlags.Default) { 393 | let declaration: ESTree.Declaration | ESTree.Expression; 394 | switch (node.kind) { 395 | case ts.SyntaxKind.FunctionDeclaration: 396 | declaration = convertFunction(node, (node).name ? 'FunctionDeclaration' : 'FunctionExpression', IdBehavior.AllowMissing); 397 | break; 398 | 399 | case ts.SyntaxKind.ClassDeclaration: 400 | declaration = convertClassLikeDeclaration(node, !(node).name); 401 | break; 402 | 403 | default: 404 | unexpected(node); 405 | } 406 | return wrap(node, { 407 | type: 'ExportDefaultDeclaration', 408 | declaration 409 | }); 410 | } else { 411 | return wrap(node, { 412 | type: 'ExportNamedDeclaration', 413 | declaration: convertStatement(node), 414 | specifiers: [], 415 | source: null 416 | }); 417 | } 418 | } 419 | switch (node.kind) { 420 | case ts.SyntaxKind.ImportDeclaration: 421 | return convertImportDeclaration(node); 422 | 423 | case ts.SyntaxKind.ExportDeclaration: 424 | return convertExportDeclaration(node); 425 | 426 | case ts.SyntaxKind.ExportAssignment: 427 | return convertExportAssignment(node); 428 | 429 | default: 430 | return convertStatement(node); 431 | } 432 | } 433 | 434 | function convertImportDeclaration(node: ts.ImportDeclaration) { 435 | if (node.moduleSpecifier.kind !== ts.SyntaxKind.StringLiteral) { 436 | unexpected(node.moduleSpecifier); 437 | } 438 | return wrap(node, { 439 | type: 'ImportDeclaration', 440 | specifiers: convertImportClause(node.importClause), 441 | source: convertLiteral(node.moduleSpecifier) 442 | }); 443 | } 444 | 445 | function convertImportClause(node: ts.ImportClause) { 446 | var specifiers: Array = []; 447 | if (node == null) return specifiers; 448 | var { name, namedBindings } = node; 449 | if (name) { 450 | specifiers.push(wrap(name, { 451 | type: 'ImportDefaultSpecifier', 452 | local: convertIdentifier(name) 453 | })) 454 | } 455 | if (namedBindings) { 456 | switch (namedBindings.kind) { 457 | case ts.SyntaxKind.NamespaceImport: 458 | specifiers.push(wrap(namedBindings, { 459 | type: 'ImportNamespaceSpecifier', 460 | local: convertIdentifier((namedBindings).name) 461 | })); 462 | break; 463 | 464 | case ts.SyntaxKind.NamedImports: 465 | specifiers = specifiers.concat((namedBindings).elements.map(binding => { 466 | return wrap(binding, { 467 | type: 'ImportSpecifier', 468 | local: convertIdentifier(binding.name), 469 | imported: convertIdentifier(binding.propertyName || binding.name) 470 | }); 471 | })); 472 | break; 473 | 474 | default: 475 | unexpected(node.namedBindings); 476 | } 477 | } 478 | return specifiers; 479 | } 480 | 481 | function convertExportDeclaration(node: ts.ExportDeclaration): ESTree.ExportAllDeclaration | ESTree.ExportNamedDeclaration { 482 | var source: ESTree.Literal; 483 | if (node.moduleSpecifier) { 484 | if (node.moduleSpecifier.kind !== ts.SyntaxKind.StringLiteral) { 485 | unexpected(node.moduleSpecifier); 486 | } 487 | source = convertLiteral(node.moduleSpecifier); 488 | } else { 489 | source = null; 490 | } 491 | if (!node.exportClause) { 492 | return wrap(node, { 493 | type: 'ExportAllDeclaration', 494 | source 495 | }); 496 | } else { 497 | return wrap(node, { 498 | type: 'ExportNamedDeclaration', 499 | declaration: null, 500 | specifiers: node.exportClause.elements.map(element => { 501 | return wrap(element, { 502 | type: 'ExportSpecifier', 503 | local: convertIdentifier(element.propertyName || element.name), 504 | exported: convertIdentifier(element.name) 505 | }); 506 | }), 507 | source 508 | }); 509 | } 510 | } 511 | 512 | function convertExportAssignment(node: ts.ExportAssignment): ESTree.ExportNamedDeclaration | ESTree.ExportDefaultDeclaration { 513 | return wrap(node, { 514 | type: 'ExportDefaultDeclaration', 515 | declaration: convertExpression(node.expression) 516 | }); 517 | } 518 | 519 | function convertStatement(node: ts.Statement | ts.ModuleElement): ESTree.Statement { 520 | switch (node.kind) { 521 | case ts.SyntaxKind.Block: 522 | return convertBlock(node); 523 | 524 | case ts.SyntaxKind.VariableStatement: 525 | return convertVariableStatement(node); 526 | 527 | case ts.SyntaxKind.SwitchStatement: 528 | return convertSwitchStatement(node); 529 | 530 | case ts.SyntaxKind.TryStatement: 531 | return convertTryStatement(node); 532 | 533 | case ts.SyntaxKind.FunctionDeclaration: 534 | return convertFunctionDeclaration(node); 535 | 536 | case ts.SyntaxKind.ClassDeclaration: 537 | return convertClassLikeDeclaration(node); 538 | 539 | case ts.SyntaxKind.DebuggerStatement: 540 | return wrap(node, { type: 'DebuggerStatement' }); 541 | 542 | case ts.SyntaxKind.EmptyStatement: 543 | return wrap(node, { type: 'EmptyStatement' }); 544 | 545 | case ts.SyntaxKind.BreakStatement: 546 | case ts.SyntaxKind.ContinueStatement: 547 | return convertBreakOrContinuteStatement(node); 548 | 549 | case ts.SyntaxKind.ReturnStatement: 550 | return convertReturnStatement(node); 551 | 552 | case ts.SyntaxKind.LabeledStatement: 553 | return convertLabeledStatement(node); 554 | 555 | case ts.SyntaxKind.ThrowStatement: 556 | return convertThrowStatement(node); 557 | 558 | case ts.SyntaxKind.ExpressionStatement: 559 | return convertExpressionStatement(node); 560 | 561 | case ts.SyntaxKind.WithStatement: 562 | return convertWithStatement(node); 563 | 564 | case ts.SyntaxKind.ForInStatement: 565 | case ts.SyntaxKind.ForOfStatement: 566 | return convertForInOrOfStatement(node); 567 | 568 | case ts.SyntaxKind.ForStatement: 569 | return convertForStatement(node); 570 | 571 | case ts.SyntaxKind.WhileStatement: 572 | case ts.SyntaxKind.DoStatement: 573 | return convertWhileStatement(node); 574 | 575 | case ts.SyntaxKind.IfStatement: 576 | return convertIfStatement(node); 577 | 578 | default: 579 | unexpected(node); 580 | } 581 | } 582 | 583 | function convertThrowStatement(node: ts.ThrowStatement) { 584 | return wrap(node, { 585 | type: 'ThrowStatement', 586 | argument: convertExpression(node.expression) 587 | }); 588 | } 589 | 590 | function convertBreakOrContinuteStatement(node: ts.BreakOrContinueStatement) { 591 | return wrap(node, { 592 | type: node.kind === ts.SyntaxKind.BreakStatement ? 'BreakStatement' : 'ContinueStatement', 593 | label: convertNullable(node.label, convertIdentifier) 594 | }); 595 | } 596 | 597 | function convertReturnStatement(node: ts.ReturnStatement) { 598 | return wrap(node, { 599 | type: 'ReturnStatement', 600 | argument: convertNullable(node.expression, convertExpression) 601 | }); 602 | } 603 | 604 | function convertExpression(node: ts.Expression): ESTree.Expression { 605 | switch (node.kind) { 606 | case ts.SyntaxKind.OmittedExpression: 607 | return null; 608 | 609 | case ts.SyntaxKind.ThisKeyword: 610 | return wrap(node, { type: 'ThisExpression' }); 611 | 612 | case ts.SyntaxKind.SuperKeyword: 613 | return wrap(node, { type: 'Super' }); 614 | 615 | case ts.SyntaxKind.Identifier: 616 | return convertIdentifier(node); 617 | 618 | case ts.SyntaxKind.BinaryExpression: 619 | return convertBinaryExpression(node); 620 | 621 | case ts.SyntaxKind.PrefixUnaryExpression: 622 | case ts.SyntaxKind.PostfixUnaryExpression: 623 | return convertPrefixOrPostfixUnaryExpression(node); 624 | 625 | case ts.SyntaxKind.DeleteExpression: 626 | case ts.SyntaxKind.TypeOfExpression: 627 | case ts.SyntaxKind.VoidExpression: 628 | return convertNamedUnaryExpression(node); 629 | 630 | case ts.SyntaxKind.ConditionalExpression: 631 | return convertConditionalExpression(node); 632 | 633 | case ts.SyntaxKind.CallExpression: 634 | case ts.SyntaxKind.NewExpression: 635 | return convertCallOrNewExpression(node); 636 | 637 | case ts.SyntaxKind.ParenthesizedExpression: 638 | return convertExpression((node).expression); 639 | 640 | case ts.SyntaxKind.ArrayLiteralExpression: 641 | return convertArrayLiteralExpression(node); 642 | 643 | case ts.SyntaxKind.ObjectLiteralExpression: 644 | return convertObjectLiteralExpression(node); 645 | 646 | case ts.SyntaxKind.ArrowFunction: 647 | return convertArrowFunction(node); 648 | 649 | case ts.SyntaxKind.FunctionExpression: 650 | return convertFunctionLikeDeclaration(node); 651 | 652 | case ts.SyntaxKind.ClassExpression: 653 | return convertClassLikeDeclaration(node); 654 | 655 | case ts.SyntaxKind.PropertyAccessExpression: 656 | return convertPropertyAccessExpression(node); 657 | 658 | case ts.SyntaxKind.ElementAccessExpression: 659 | return convertElementAccessExpression(node); 660 | 661 | case ts.SyntaxKind.TemplateExpression: 662 | return convertTemplateExpression(node); 663 | 664 | case ts.SyntaxKind.SpreadElementExpression: 665 | return convertSpreadElementExpression(node); 666 | 667 | case ts.SyntaxKind.YieldExpression: 668 | return convertYieldExpression(node); 669 | 670 | case ts.SyntaxKind.TaggedTemplateExpression: 671 | return convertTaggedTemplateExpression(node); 672 | 673 | default: 674 | return convertLiteral(node); 675 | } 676 | } 677 | 678 | function convertSpreadElementExpression(node: ts.SpreadElementExpression) { 679 | return wrap(node, { 680 | type: 'SpreadElement', 681 | argument: convertExpression(node.expression) 682 | }); 683 | } 684 | 685 | function convertPropertyAccessExpression(node: ts.PropertyAccessExpression) { 686 | return wrap(node, { 687 | type: 'MemberExpression', 688 | object: convertExpression(node.expression), 689 | property: convertIdentifier(node.name), 690 | computed: false 691 | }); 692 | } 693 | 694 | function convertElementAccessExpression(node: ts.ElementAccessExpression) { 695 | return wrap(node, { 696 | type: 'MemberExpression', 697 | object: convertExpression(node.expression), 698 | property: convertExpression(node.argumentExpression), 699 | computed: true 700 | }); 701 | } 702 | 703 | export function convertSourceFile(node: ts.SourceFile) { 704 | return wrapPos(node, node, { 705 | type: 'Program', 706 | body: node.statements.map(convertTopStatement), 707 | sourceType: 'module' 708 | }); 709 | } 710 | 711 | export function checkAndConvert(input: string, options?: ts.CompilerOptions) { 712 | options = options ? ts.clone(options) : ts.getDefaultCompilerOptions(); 713 | options.noLib = true; 714 | options.noResolve = true; 715 | var inputFileName = "module.ts"; 716 | var sourceFile = ts.createSourceFile(inputFileName, input, options.target); 717 | // Create a compilerHost object to allow the compiler to read and write files 718 | var program = ts.createProgram([inputFileName], options, { 719 | getSourceFile(fileName, target) { return fileName === inputFileName ? sourceFile : undefined; }, 720 | writeFile(name, text, writeByteOrderMark) { 721 | throw new Error("Not implemented"); 722 | }, 723 | getDefaultLibFileName() { return "lib.d.ts"; }, 724 | useCaseSensitiveFileNames() { return true; }, 725 | getCanonicalFileName(fileName) { return fileName; }, 726 | getCurrentDirectory() { return ""; }, 727 | getNewLine() { return "\n"; } 728 | }); 729 | program.getSemanticDiagnostics(); 730 | return convertSourceFile(sourceFile); 731 | } 732 | 733 | function convertVariableStatement(node: ts.VariableStatement) { 734 | var { flags, declarations } = node.declarationList; 735 | return wrap(node, { 736 | type: 'VariableDeclaration', 737 | kind: (flags & ts.NodeFlags.Const) ? 'const' : (flags & ts.NodeFlags.Let) ? 'let' : 'var', 738 | declarations: declarations.map(convertVariableDeclaration) 739 | }); 740 | } 741 | 742 | function convertVariableDeclaration(node: ts.VariableDeclaration) { 743 | return wrap(node, { 744 | type: 'VariableDeclarator', 745 | id: convertDeclarationName(node.name), 746 | init: convertNullable(node.initializer, convertExpression) 747 | }); 748 | } 749 | 750 | function convertSwitchStatement(node: ts.SwitchStatement) { 751 | return wrap(node, { 752 | type: 'SwitchStatement', 753 | discriminant: convertExpression(node.expression), 754 | cases: node.caseBlock.clauses.map(convertCaseOrDefaultClause) 755 | }); 756 | } 757 | 758 | function convertCaseOrDefaultClause(node: ts.CaseOrDefaultClause) { 759 | return wrap(node, { 760 | type: 'SwitchCase', 761 | test: node.kind === ts.SyntaxKind.CaseClause ? convertExpression((node).expression) : null, 762 | consequent: node.statements.map(convertStatement) 763 | }); 764 | } 765 | 766 | function convertLabeledStatement(node: ts.LabeledStatement) { 767 | return wrap(node, { 768 | type: 'LabeledStatement', 769 | label: convertIdentifier(node.label), 770 | body: convertStatement(node.statement) 771 | }); 772 | } 773 | 774 | function convertIdentifier(node: ts.Identifier) { 775 | return wrap(node, { 776 | type: 'Identifier', 777 | name: node.text 778 | }); 779 | } 780 | 781 | function convertBlock(node: ts.Block) { 782 | return wrap(node, { 783 | type: 'BlockStatement', 784 | body: node.statements.map(convertStatement) 785 | }); 786 | } 787 | 788 | function convertTryStatement(node: ts.TryStatement) { 789 | return wrap(node, { 790 | type: 'TryStatement', 791 | block: convertBlock(node.tryBlock), 792 | handler: convertNullable(node.catchClause, convertCatchClause), 793 | finalizer: convertNullable(node.finallyBlock, convertBlock) 794 | }); 795 | } 796 | 797 | function convertCatchClause(node: ts.CatchClause) { 798 | return wrap(node, { 799 | type: 'CatchClause', 800 | param: convertDeclarationName(node.variableDeclaration.name), 801 | body: convertBlock(node.block) 802 | }); 803 | } 804 | 805 | function convertYieldExpression(node: ts.YieldExpression) { 806 | return wrap(node, { 807 | type: 'YieldExpression', 808 | argument: convertNullable(node.expression, convertExpression), 809 | delegate: !!node.asteriskToken 810 | }); 811 | } 812 | 813 | type ts_PrefixOrPostfixUnaryExpression = ts.PrefixUnaryExpression | ts.PostfixUnaryExpression; 814 | 815 | function convertPrefixOrPostfixUnaryExpression(node: ts_PrefixOrPostfixUnaryExpression) { 816 | var operator = tryConvertUpdateOperator(node.operator); 817 | var isUnary = operator === undefined; 818 | if (isUnary) { 819 | operator = convertUnaryOperator(node.operator); 820 | } 821 | return wrap(node, { 822 | type: isUnary ? 'UnaryExpression' : 'UpdateExpression', 823 | operator, 824 | prefix: node.kind === ts.SyntaxKind.PrefixUnaryExpression, 825 | argument: convertExpression(node.operand) 826 | }); 827 | } 828 | 829 | type ts_NamedUnaryExpression = ts.DeleteExpression | ts.TypeOfExpression | ts.VoidExpression; 830 | 831 | function convertNamedUnaryExpression(node: ts_NamedUnaryExpression) { 832 | var operator: string; 833 | switch (node.kind) { 834 | case ts.SyntaxKind.DeleteExpression: 835 | operator = "delete"; 836 | break; 837 | 838 | case ts.SyntaxKind.TypeOfExpression: 839 | operator = "typeof"; 840 | break; 841 | 842 | case ts.SyntaxKind.VoidExpression: 843 | operator = "void"; 844 | break; 845 | 846 | default: 847 | unexpected(node); 848 | } 849 | return wrap(node, { 850 | type: 'UnaryExpression', 851 | operator, 852 | prefix: true, 853 | argument: convertExpression(node.expression) 854 | }); 855 | } 856 | 857 | function convertBinaryExpression(node: ts.BinaryExpression): ESTree.BinaryExpression | ESTree.LogicalExpression | ESTree.SequenceExpression | ESTree.AssignmentExpression { 858 | switch (node.operatorToken.kind) { 859 | case ts.SyntaxKind.BarBarToken: 860 | case ts.SyntaxKind.AmpersandAmpersandToken: 861 | return wrap(node, { 862 | type: 'LogicalExpression', 863 | operator: node.operatorToken.getText(), 864 | left: convertExpression(node.left), 865 | right: convertExpression(node.right) 866 | }); 867 | 868 | case ts.SyntaxKind.CommaToken: { 869 | let expressions: Array = []; 870 | let expr: ts.Expression = node; 871 | do { 872 | expressions.unshift(convertExpression((expr).right)); 873 | expr = (expr).left; 874 | } while (expr.kind === ts.SyntaxKind.BinaryExpression && (expr).operatorToken.kind === ts.SyntaxKind.CommaToken); 875 | expressions.unshift(convertExpression(expr)); 876 | return wrap(node, { 877 | type: 'SequenceExpression', 878 | expressions 879 | }); 880 | } 881 | 882 | default: 883 | if (isAssignmentOperator(node.operatorToken.kind)) { 884 | return wrap(node, { 885 | type: 'AssignmentExpression', 886 | operator: node.operatorToken.getText(), 887 | left: convertExpressionAsBindingPattern(node.left), 888 | right: convertExpression(node.right) 889 | }); 890 | } else { 891 | return wrap(node, { 892 | type: 'BinaryExpression', 893 | operator: node.operatorToken.getText(), 894 | left: convertExpression(node.left), 895 | right: convertExpression(node.right) 896 | }); 897 | } 898 | } 899 | } 900 | 901 | function convertConditionalExpression(node: ts.ConditionalExpression) { 902 | return wrap(node, { 903 | type: 'ConditionalExpression', 904 | test: convertExpression(node.condition), 905 | consequent: convertExpression(node.whenTrue), 906 | alternate: convertExpression(node.whenFalse) 907 | }); 908 | } 909 | 910 | const enum IdBehavior { 911 | AllowMissing, 912 | Enforce, 913 | Ignore 914 | } 915 | 916 | function convertFunction(node: ts.FunctionLikeDeclaration, type: string, idBehavior: IdBehavior, allowExpressionBody?: boolean) { 917 | var { body } = node; 918 | if (body.kind !== ts.SyntaxKind.Block && !allowExpressionBody) { 919 | unexpected(body); 920 | } 921 | return wrap(node, { 922 | type, 923 | id: idBehavior === IdBehavior.Enforce || idBehavior === IdBehavior.AllowMissing && node.name ? convertIdentifier(node.name) : null, 924 | params: node.parameters.map(convertParameterDeclaration), 925 | body: body.kind === ts.SyntaxKind.Block ? convertBlock(body) : convertExpression(body), 926 | generator: !!node.asteriskToken 927 | }); 928 | } 929 | 930 | function convertFunctionLikeDeclaration(node: ts.FunctionLikeDeclaration, idBehavior: IdBehavior = IdBehavior.AllowMissing) { 931 | return convertFunction(node, 'FunctionExpression', idBehavior); 932 | } 933 | 934 | function convertArrowFunction(node: ts.ArrowFunction) { 935 | var arrowFn = convertFunction(node, 'ArrowFunctionExpression', IdBehavior.Ignore, true); 936 | arrowFn.expression = node.body.kind !== ts.SyntaxKind.Block; 937 | return arrowFn; 938 | } 939 | 940 | function convertFunctionDeclaration(node: ts.FunctionDeclaration) { 941 | return convertFunction(node, 'FunctionDeclaration', IdBehavior.Enforce); 942 | } 943 | 944 | function convertParameterDeclaration(node: ts.ParameterDeclaration): ESTree.Pattern { 945 | var name = convertDeclarationName(node.name); 946 | if (node.dotDotDotToken) { 947 | return wrap(node, { 948 | type: 'RestElement', 949 | argument: name 950 | }); 951 | } else if (node.initializer) { 952 | return wrap(node, { 953 | type: 'AssignmentPattern', 954 | left: name, 955 | right: convertExpression(node.initializer) 956 | }); 957 | } else { 958 | return name; 959 | } 960 | } 961 | 962 | function convertIfStatement(node: ts.IfStatement) { 963 | return wrap(node, { 964 | type: 'IfStatement', 965 | test: convertExpression(node.expression), 966 | consequent: convertStatement(node.thenStatement), 967 | alternate: convertNullable(node.elseStatement, convertStatement) 968 | }); 969 | } 970 | 971 | type ts_WhileStatement = ts.WhileStatement | ts.DoStatement; 972 | 973 | function convertWhileStatement(node: ts_WhileStatement) { 974 | return wrap(node, { 975 | type: node.kind === ts.SyntaxKind.WhileStatement ? 'WhileStatement' : 'DoWhileStatement', 976 | test: convertExpression(node.expression), 977 | body: convertStatement(node.statement) 978 | }); 979 | } 980 | 981 | function convertVariableDeclarationOrExpression(node: ts.VariableDeclarationList | ts.Expression): ESTree.VariableDeclaration | ESTree.Expression { 982 | return node.kind === ts.SyntaxKind.VariableDeclarationList 983 | ? wrapPos(node, node, { 984 | type: 'VariableDeclaration', 985 | kind: 'var', 986 | declarations: (node).declarations.map(convertVariableDeclaration) 987 | }) 988 | : convertExpression(node); 989 | } 990 | 991 | function convertForStatement(node: ts.ForStatement) { 992 | return wrap(node, { 993 | type: 'ForStatement', 994 | init: convertNullable(node.initializer, convertVariableDeclarationOrExpression), 995 | test: convertNullable(node.condition, convertExpression), 996 | update: convertNullable(node.incrementor, convertExpression), 997 | body: convertStatement(node.statement) 998 | }); 999 | } 1000 | 1001 | function convertForInOrOfStatement(node: ts.ForInStatement | ts.ForOfStatement) { 1002 | return wrap(node, { 1003 | type: node.kind === ts.SyntaxKind.ForInStatement ? 'ForInStatement' : 'ForOfStatement', 1004 | left: convertVariableDeclarationOrExpression(node.initializer), 1005 | right: convertExpression(node.expression), 1006 | body: convertStatement(node.statement) 1007 | }); 1008 | } 1009 | 1010 | function convertWithStatement(node: ts.WithStatement) { 1011 | return wrap(node, { 1012 | type: 'WithStatement', 1013 | object: convertExpression(node.expression), 1014 | body: convertStatement(node.statement) 1015 | }); 1016 | } 1017 | 1018 | type ts_CallOrNewExpression = ts.CallExpression | ts.NewExpression; 1019 | 1020 | function convertCallOrNewExpression(node: ts_CallOrNewExpression) { 1021 | return wrap(node, { 1022 | type: node.kind === ts.SyntaxKind.CallExpression ? 'CallExpression' : 'NewExpression', 1023 | callee: convertExpression(node.expression), 1024 | arguments: node.arguments ? node.arguments.map(convertExpression) : [] 1025 | }); 1026 | } 1027 | 1028 | function convertArrayLiteralExpression(node: ts.ArrayLiteralExpression) { 1029 | return wrap(node, { 1030 | type: 'ArrayExpression', 1031 | elements: node.elements.map(convertExpression) 1032 | }); 1033 | } 1034 | 1035 | function convertObjectLiteralExpression(node: ts.ObjectLiteralExpression) { 1036 | return wrap(node, { 1037 | type: 'ObjectExpression', 1038 | properties: node.properties.map(convertObjectLiteralElement) 1039 | }); 1040 | } 1041 | 1042 | function convertObjectLiteralElement(node: ts.ObjectLiteralElement) { 1043 | switch (node.kind) { 1044 | case ts.SyntaxKind.ShorthandPropertyAssignment: 1045 | case ts.SyntaxKind.PropertyAssignment: 1046 | return convertObjectLiteralPropertyElement(node); 1047 | 1048 | case ts.SyntaxKind.MethodDeclaration: 1049 | case ts.SyntaxKind.GetAccessor: 1050 | case ts.SyntaxKind.SetAccessor: 1051 | return convertObjectLiteralFunctionLikeElement(node); 1052 | 1053 | default: 1054 | unexpected(node); 1055 | } 1056 | } 1057 | 1058 | type ts_ObjectLiteralPropertyElement = ts.ShorthandPropertyAssignment | ts.PropertyAssignment; 1059 | 1060 | function convertObjectLiteralPropertyElement(node: ts_ObjectLiteralPropertyElement) { 1061 | var isShorthand = node.kind === ts.SyntaxKind.ShorthandPropertyAssignment; 1062 | return wrap(node, { 1063 | type: 'Property', 1064 | key: convertDeclarationName(node.name), 1065 | value: ( 1066 | isShorthand 1067 | ? convertIdentifier((node).name) 1068 | : convertExpression((node).initializer) 1069 | ), 1070 | kind: 'init', 1071 | method: false, 1072 | shorthand: isShorthand, 1073 | computed: node.name.kind === ts.SyntaxKind.ComputedPropertyName 1074 | }); 1075 | } 1076 | 1077 | function convertObjectBindingElement(node: ts.BindingElement) { 1078 | var isShorthand = !node.propertyName; 1079 | var value = convertIdentifierOrBindingPattern(node.name); 1080 | if (node.initializer) { 1081 | value = { 1082 | type: 'AssignmentPattern', 1083 | left: value, 1084 | right: convertExpression(node.initializer) 1085 | }; 1086 | } 1087 | return wrap(node, { 1088 | type: 'Property', 1089 | key: convertIdentifierOrBindingPattern(node.propertyName || node.name), 1090 | value, 1091 | kind: 'init', 1092 | method: false, 1093 | shorthand: isShorthand, 1094 | computed: node.name.kind === ts.SyntaxKind.ComputedPropertyName 1095 | }); 1096 | } 1097 | 1098 | type ts_ObjectLiteralFunctionLikeElement = ts.MethodDeclaration | ts.AccessorDeclaration; 1099 | 1100 | function convertObjectLiteralFunctionLikeElement(node: ts_ObjectLiteralFunctionLikeElement) { 1101 | return wrap(node, { 1102 | type: 'Property', 1103 | key: convertDeclarationName(node.name), 1104 | value: convertFunctionLikeDeclaration(node, IdBehavior.Ignore), 1105 | kind: node.kind === ts.SyntaxKind.GetAccessor ? 'get' : node.kind === ts.SyntaxKind.SetAccessor ? 'set' : 'init', 1106 | method: node.kind === ts.SyntaxKind.MethodDeclaration, 1107 | shorthand: false, 1108 | computed: node.name.kind === ts.SyntaxKind.ComputedPropertyName 1109 | }); 1110 | } 1111 | 1112 | function isAssignmentOperator(op: ts.SyntaxKind): boolean { 1113 | switch (op) { 1114 | case ts.SyntaxKind.EqualsToken: 1115 | case ts.SyntaxKind.PlusEqualsToken: 1116 | case ts.SyntaxKind.MinusEqualsToken: 1117 | case ts.SyntaxKind.AsteriskEqualsToken: 1118 | case ts.SyntaxKind.SlashEqualsToken: 1119 | case ts.SyntaxKind.PercentEqualsToken: 1120 | case ts.SyntaxKind.LessThanLessThanEqualsToken: 1121 | case ts.SyntaxKind.GreaterThanGreaterThanEqualsToken: 1122 | case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken: 1123 | case ts.SyntaxKind.BarEqualsToken: 1124 | case ts.SyntaxKind.CaretEqualsToken: 1125 | case ts.SyntaxKind.AmpersandEqualsToken: 1126 | return true; 1127 | 1128 | default: 1129 | return false; 1130 | } 1131 | } 1132 | 1133 | function convertUnaryOperator(op: ts.SyntaxKind): ESTree.UnaryOperator { 1134 | switch (op) { 1135 | case ts.SyntaxKind.MinusToken: 1136 | return "-"; 1137 | 1138 | case ts.SyntaxKind.PlusToken: 1139 | return "+"; 1140 | 1141 | case ts.SyntaxKind.ExclamationToken: 1142 | return "!"; 1143 | 1144 | case ts.SyntaxKind.TildeToken: 1145 | return "~"; 1146 | 1147 | default: 1148 | throw new TypeError(`Unknown unary operator: ${SyntaxName[op]}`); 1149 | } 1150 | } 1151 | 1152 | function tryConvertUpdateOperator(op: ts.SyntaxKind): ESTree.UpdateOperator { 1153 | switch (op) { 1154 | case ts.SyntaxKind.PlusPlusToken: 1155 | return "++"; 1156 | 1157 | case ts.SyntaxKind.MinusMinusToken: 1158 | return "--"; 1159 | } 1160 | } --------------------------------------------------------------------------------