From f2c0907584bd6d82d279caabd61284fb2cae6d3e Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Mon, 21 Aug 2023 23:29:28 +0100 Subject: [PATCH 01/16] Update APIs to reflect upstream lara-framework API changes --- jsAst/.project | 11 ++++ jsweaver/.project | 11 ++++ jsweaver/bin/jackdaw/tests/File.lara | 18 +++--- .../bin/jackdaw/tests/IfStatementTest.lara | 16 ++--- jsweaver/bin/jackdaw/tests/Insert.lara | 14 ++--- jsweaver/bin/jackdaw/tests/src/insert.js | 6 +- .../bin/jackdaw/tests/src/test-ifStatement.js | 6 +- .../lara-lara/jackdaw/lara/code/Timer.lara | 4 +- .../jackdaw/obfuscation/Flatted.lara | 4 +- .../jackdaw/obfuscation/Obfuscator.lara | 14 ++--- .../jackdaw/obfuscation/OpaquePredicates.lara | 2 +- .../lara-lara/jackdaw/weaver/JoinPoints.lara | 62 +------------------ .../jackdaw/tests/ApplyWhilePredicate.lara | 2 +- .../jackdaw/tests/CustomObfuscationTest | 2 +- .../tests/DiscoverObfuscableFunctions.lara | 2 +- .../resources/jackdaw/tests/JoinPoints.lara | 7 +-- test.lara | 2 +- 17 files changed, 72 insertions(+), 111 deletions(-) diff --git a/jsAst/.project b/jsAst/.project index a6ee148..1acfafb 100644 --- a/jsAst/.project +++ b/jsAst/.project @@ -15,4 +15,15 @@ org.eclipse.jdt.core.javanature org.apache.ivyde.eclipse.ivynature + + + 1692656713794 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/jsweaver/.project b/jsweaver/.project index 9c27da3..37882fd 100644 --- a/jsweaver/.project +++ b/jsweaver/.project @@ -15,4 +15,15 @@ org.eclipse.jdt.core.javanature org.apache.ivyde.eclipse.ivynature + + + 1692656713797 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/jsweaver/bin/jackdaw/tests/File.lara b/jsweaver/bin/jackdaw/tests/File.lara index 2eeccab..54dc3a0 100644 --- a/jsweaver/bin/jackdaw/tests/File.lara +++ b/jsweaver/bin/jackdaw/tests/File.lara @@ -1,10 +1,10 @@ -import lara.Io; - -aspectdef FileTest - - select file end - apply - println("filepath:"+ Io.getPath($file.path).getName()); - end - +import lara.Io; + +aspectdef FileTest + + select file end + apply + println("filepath:"+ Io.getPath($file.path).getName()); + end + end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/IfStatementTest.lara b/jsweaver/bin/jackdaw/tests/IfStatementTest.lara index 691d150..4710ce1 100644 --- a/jsweaver/bin/jackdaw/tests/IfStatementTest.lara +++ b/jsweaver/bin/jackdaw/tests/IfStatementTest.lara @@ -1,9 +1,9 @@ -aspectdef Test - select file.ifStatement end - apply - if($ifStatement.test.instanceOf("literal")){ - println("Test expression: " + $ifStatement.test.raw); - } - - end +aspectdef Test + select file.ifStatement end + apply + if($ifStatement.test.instanceOf("literal")){ + println("Test expression: " + $ifStatement.test.raw); + } + + end end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/Insert.lara b/jsweaver/bin/jackdaw/tests/Insert.lara index 2ca74dc..c8ffb2e 100644 --- a/jsweaver/bin/jackdaw/tests/Insert.lara +++ b/jsweaver/bin/jackdaw/tests/Insert.lara @@ -1,8 +1,8 @@ -aspectdef InsertTest - select file.functionDeclaration end - apply - var functionName = $functionDeclaration.id.name; - $functionDeclaration.insert after "let a = 2"; - println("Inserted code"); - end +aspectdef InsertTest + select file.functionDeclaration end + apply + var functionName = $functionDeclaration.id.name; + $functionDeclaration.insert after "let a = 2"; + println("Inserted code"); + end end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/src/insert.js b/jsweaver/bin/jackdaw/tests/src/insert.js index 62a0dec..d0e4044 100644 --- a/jsweaver/bin/jackdaw/tests/src/insert.js +++ b/jsweaver/bin/jackdaw/tests/src/insert.js @@ -1,4 +1,4 @@ - -function testFunction(a,b,c){ - + +function testFunction(a,b,c){ + } \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js b/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js index ea28f6f..59f9014 100644 --- a/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js +++ b/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js @@ -1,4 +1,4 @@ -if(true) -{ - let a = 1 +if(true) +{ + let a = 1 } \ No newline at end of file diff --git a/jsweaver/lara-lara/jackdaw/lara/code/Timer.lara b/jsweaver/lara-lara/jackdaw/lara/code/Timer.lara index fb97056..5b0137c 100644 --- a/jsweaver/lara-lara/jackdaw/lara/code/Timer.lara +++ b/jsweaver/lara-lara/jackdaw/lara/code/Timer.lara @@ -1,5 +1,5 @@ import lara.code.TimerBase; -import lara._JavaTypes; +import lara.util.JavaTypes; /** * Times the code of a given section. @@ -10,7 +10,7 @@ import lara._JavaTypes; * @return name of the variable where the time is stored */ Timer.prototype.time = function($start, prefix, $end) { - var uuid = _JavaTypes.getUuid().randomUUID().toString(); + var uuid = JavaTypes.getUuid().randomUUID().toString(); if (prefix === undefined) { var timerStart = 'console.time("' + uuid + '")'; var timerEnd = 'console.timeEnd("' + uuid + '")'; diff --git a/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara b/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara index 7967ae2..a60f161 100644 --- a/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara +++ b/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara @@ -1,5 +1,5 @@ import lara.Strings; -import weaver.WeaverJps; +import weaver.Query; @@ -385,7 +385,7 @@ function getBlockParts($block){ function outputDeclarations($block){ var declarations = ""; - for(var $dec of WeaverJps.searchFrom($block, 'declaration').get()) { + for(var $dec of Query.searchFrom($block, 'declaration').get()) { for(var a of $dec.children){ if(a.type == "VariableDeclarator"){ a.refactor(getUuid()); diff --git a/jsweaver/lara-lara/jackdaw/obfuscation/Obfuscator.lara b/jsweaver/lara-lara/jackdaw/obfuscation/Obfuscator.lara index 6f6408e..eb224b0 100644 --- a/jsweaver/lara-lara/jackdaw/obfuscation/Obfuscator.lara +++ b/jsweaver/lara-lara/jackdaw/obfuscation/Obfuscator.lara @@ -1,5 +1,5 @@ import lara.Strings; -import weaver.WeaverJps; +import weaver.Query; import obfuscation.Flatted; import obfuscation.OpaquePredicates; @@ -11,7 +11,7 @@ function obfuscateFile($file){ //Obfuscating all functions in the file. - var functions = WeaverJps.searchFrom($file, 'functionDeclaration').get(); + var functions = Query.searchFrom($file, 'functionDeclaration').get(); for(var $f of functions){ var p = $f.parent; @@ -34,7 +34,7 @@ function applyObfuscationDebug($file){ var numberOfPredicates = getRandomInt(3, 6); addOpaquePredicates($file,numberOfPredicates); //Obfuscating all functions in the file. - var functions = WeaverJps.searchFrom($file, 'functionDeclaration').get(); + var functions = Query.searchFrom($file, 'functionDeclaration').get(); for(var $f of functions){ var d = new Date(); var t = d.getTime(); @@ -51,7 +51,7 @@ function applyCustomObfuscation($file,configuration){ // Adding opaque predicates. var numberOfPredicates = getRandomInt(configuration.predicates.min, configuration.predicates.max); addOpaquePredicates($file,numberOfPredicates); - var functions = WeaverJps.searchFrom($file, 'functionDeclaration').get(); + var functions = Query.searchFrom($file, 'functionDeclaration').get(); for(var $f of functions){ if(functionInConfiguration($f,configuration)){ println("Obfuscating -> " + $f.name); @@ -71,7 +71,7 @@ function discoverObfuscableFunctions($file,excludedFunctions){ var numberOfPredicates = getRandomInt(3, 6); addOpaquePredicates($file,numberOfPredicates); var configFunctions = []; - var functions = WeaverJps.searchFrom($file, 'functionDeclaration').get(); + var functions = Query.searchFrom($file, 'functionDeclaration').get(); for(var i=0;i " + functionName ); - var functions = WeaverJps.searchFrom($file, 'functionDeclaration', {'name': functionName}).get(); + var functions = Query.searchFrom($file, 'functionDeclaration', {'name': functionName}).get(); var $function = functions[0]; var previousCode = $file.code; @@ -203,7 +203,7 @@ function discoverObfuscableFunctions($file,excludedFunctions){ } function getFunctionNames($file){ - var functions = WeaverJps.searchFrom($file, 'functionDeclaration').get(); + var functions = Query.searchFrom($file, 'functionDeclaration').get(); var functionNames = []; for(var i=0;i Date: Tue, 22 Aug 2023 00:04:30 +0100 Subject: [PATCH 02/16] Update Language Specification to reflect new conventions --- .../jackdaw/obfuscation/Flatted.lara | 38 +- .../jackdaw/obfuscation/Obfuscator.lara | 4 +- .../jackdaw/obfuscation/OpaquePredicates.lara | 2 +- jsweaver/src/jackdaw/specs/artifacts.xml | 18 +- .../pt/up/fe/specs/jackdaw/JackdawWeaver.json | 13810 +++++++--------- .../pt/up/fe/specs/jackdaw/JackdawWeaver.png | Bin 89701 -> 132522 bytes .../pt/up/fe/specs/jackdaw/JackdawWeaver.svg | 276 +- .../abstracts/AJackdawWeaverJoinPoint.java | 4 +- .../joinpoints/AAssignmentExpression.java | 28 +- .../joinpoints/ABinaryExpression.java | 28 +- .../abstracts/joinpoints/ABlockStatement.java | 28 +- .../abstracts/joinpoints/ABreakStatement.java | 4 +- .../abstracts/joinpoints/ACallExpression.java | 28 +- .../abstracts/joinpoints/ACatchClause.java | 4 +- .../abstracts/joinpoints/AClassBody.java | 4 +- .../joinpoints/AClassDeclaration.java | 4 +- .../joinpoints/AContinueStatement.java | 4 +- .../abstracts/joinpoints/ADeclaration.java | 4 +- .../abstracts/joinpoints/ADeclarator.java | 4 +- .../joinpoints/ADoWhileStatement.java | 28 +- .../abstracts/joinpoints/AExpression.java | 4 +- .../joinpoints/AExpressionStatement.java | 4 +- .../jackdaw/abstracts/joinpoints/AFile.java | 4 +- .../abstracts/joinpoints/AForStatement.java | 28 +- .../joinpoints/AFunctionDeclaration.java | 4 +- .../joinpoints/AFunctionExpression.java | 28 +- .../abstracts/joinpoints/AIdentifier.java | 4 +- .../abstracts/joinpoints/AIfStatement.java | 4 +- .../abstracts/joinpoints/AJoinPoint.java | 28 +- .../abstracts/joinpoints/ALiteral.java | 4 +- .../jackdaw/abstracts/joinpoints/ALoop.java | 4 +- .../joinpoints/AMemberExpression.java | 28 +- .../joinpoints/AMethodDefinition.java | 4 +- .../abstracts/joinpoints/AProject.java | 4 +- .../jackdaw/abstracts/joinpoints/AScope.java | 4 +- .../abstracts/joinpoints/AStatement.java | 4 +- .../abstracts/joinpoints/ASwitchCase.java | 4 +- .../joinpoints/ASwitchStatement.java | 4 +- .../abstracts/joinpoints/AThisExpression.java | 28 +- .../abstracts/joinpoints/ATryStatement.java | 4 +- .../joinpoints/AUpdateExpression.java | 28 +- .../abstracts/joinpoints/AWhileStatement.java | 28 +- 42 files changed, 6047 insertions(+), 8529 deletions(-) diff --git a/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara b/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara index a60f161..f9a52b6 100644 --- a/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara +++ b/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara @@ -17,7 +17,7 @@ function obfuscate($block){ //If function is an opaque predicate there is no need to refactor. if(!isPredicate($block)){ $block.refactor(getUuid()); - ///var numberParams = $block.field("params").length; + ///var numberParams = $block.getField("params").length; //for(i=0;i - - + + - - + @@ -28,7 +28,7 @@ - + @@ -150,7 +150,7 @@ - + @@ -160,8 +160,8 @@ - - + + diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json index bb3f3e4..90a1d09 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json @@ -1,8147 +1,5665 @@ -{ - "root": "project", - "rootAlias": "project", - "children": [ - { - "type": "joinpoint", - "name": "joinpoint", - "extends": "" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "assignmentExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "tooltip": "Left part of the binary expression.", - "children": [ - { - "type": "joinpoint", - "name": "left" - }] - }, - { - "type": "attribute", - "tooltip": "Operator of the binary expression.", - "children": [ - { - "type": "String", - "name": "operator" - }] - }, - { - "type": "attribute", - "tooltip": "Expression of the binary expression.", - "children": [ - { - "type": "joinpoint", - "name": "right" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "binaryExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "tooltip": "Left part of the binary expression.", - "children": [ - { - "type": "joinpoint", - "name": "left" - }] - }, - { - "type": "attribute", - "tooltip": "Operator of the binary expression.", - "children": [ - { - "type": "String", - "name": "operator" - }] - }, - { - "type": "attribute", - "tooltip": "Expression of the binary expression.", - "children": [ - { - "type": "joinpoint", - "name": "right" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "blockStatement", - "extends": "statement" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "scope", - "alias": "" - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "classBody", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "breakStatement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "callExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "tooltip": "Arguments of this expression call.", - "children": [ - { - "type": "joinpoint[]", - "name": "arguments" - }] - }, - { - "type": "attribute", - "tooltip": "Identifier of this expression call.", - "children": [ - { - "type": "joinpoint", - "name": "callee" - }] - }, - { - "type": "attribute", - "tooltip": "Name of the callee or callee type.", - "children": [ - { - "type": "String", - "name": "name" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "catchClause", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Parameter of this catch clause.", - "children": [ - { - "type": "joinpoint", - "name": "param" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "classBody", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "scope", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "classDeclaration", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Identifier of this class", - "children": [ - { - "type": "joinpoint", - "name": "id" - }] - }, - { - "type": "attribute", - "tooltip": "superclass of this class", - "children": [ - { - "type": "joinpoint", - "name": "superclass" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "classBody", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "continueStatement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "declaration", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Kind of declaration.", - "children": [ - { - "type": "String", - "name": "kind" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "declarator", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "declarator", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Identifier of this declarator.", - "children": [ - { - "type": "joinpoint", - "name": "id" - }] - }, - { - "type": "attribute", - "tooltip": "Initialization of this declarator.", - "children": [ - { - "type": "joinpoint", - "name": "init" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "identifier", - "alias": "" - }, - { - "type": "action", - "tooltip": "Refactor this declarator.", - "children": [ - { - "type": "void", - "name": "refactor" - }, - { - "type": "String", - "name": "name", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "doWhileStatement", - "extends": "loop" , - "children": [ - { - "type": "attribute", - "tooltip": "Test expression of this do while statement.", - "children": [ - { - "type": "joinpoint", - "name": "test" - }] - }, - { - "type": "attribute", - "tooltip": "If the loop is innermost.", - "children": [ - { - "type": "boolean", - "name": "isInnermost" - }] - }, - { - "type": "attribute", - "tooltip": "The kind of the loop", - "children": [ - { - "type": "LoopKind", - "name": "kind" - }] - }, - { - "type": "attribute", - "tooltip": "Loop nest nevel.", - "children": [ - { - "type": "int", - "name": "nestedLevel" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "expression", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "expressionStatement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Directive of this expression statement.", - "children": [ - { - "type": "String", - "name": "directive" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "callExpression", - "alias": "" - }, - { - "type": "select", - "clazz": "callExpression", - "alias": "call" - }, - { - "type": "select", - "clazz": "assignmentExpression", - "alias": "" - }, - { - "type": "select", - "clazz": "updateExpression", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "file", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Name of the file.", - "children": [ - { - "type": "String", - "name": "name" - }] - }, - { - "type": "attribute", - "tooltip": "Absolute path of the program file.", - "children": [ - { - "type": "String", - "name": "path" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "scope", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "forStatement", - "extends": "loop" , - "children": [ - { - "type": "attribute", - "tooltip": "Initialization expression of this for statement.", - "children": [ - { - "type": "joinpoint", - "name": "init" - }] - }, - { - "type": "attribute", - "tooltip": "Test expression of this for statement.", - "children": [ - { - "type": "joinpoint", - "name": "test" - }] - }, - { - "type": "attribute", - "tooltip": "Update expression of this for statement.", - "children": [ - { - "type": "joinpoint", - "name": "update" - }] - }, - { - "type": "attribute", - "tooltip": "If the loop is innermost.", - "children": [ - { - "type": "boolean", - "name": "isInnermost" - }] - }, - { - "type": "attribute", - "tooltip": "The kind of the loop", - "children": [ - { - "type": "LoopKind", - "name": "kind" - }] - }, - { - "type": "attribute", - "tooltip": "Loop nest nevel.", - "children": [ - { - "type": "int", - "name": "nestedLevel" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "functionDeclaration", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "If the function is async.", - "children": [ - { - "type": "boolean", - "name": "async" - }] - }, - { - "type": "attribute", - "tooltip": "", - "children": [ - { - "type": "boolean", - "name": "expression" - }] - }, - { - "type": "attribute", - "tooltip": "", - "children": [ - { - "type": "boolean", - "name": "generator" - }] - }, - { - "type": "attribute", - "tooltip": "Identifier of this function.", - "children": [ - { - "type": "joinpoint", - "name": "id" - }] - }, - { - "type": "attribute", - "tooltip": "Name of this function.", - "children": [ - { - "type": "String", - "name": "name" - }] - }, - { - "type": "attribute", - "tooltip": "Parameters of this function.", - "children": [ - { - "type": "joinpoint[]", - "name": "params" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "action", - "tooltip": "Refactor this function", - "children": [ - { - "type": "void", - "name": "refactor" - }, - { - "type": "String", - "name": "name", - "defaultValue": "" - }] - }, - { - "type": "action", - "tooltip": "Refactor this function", - "children": [ - { - "type": "void", - "name": "refactorParam" - }, - { - "type": "int", - "name": "index", - "defaultValue": "" - }, - { - "type": "String", - "name": "name", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "functionExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "tooltip": "If the function is async.", - "children": [ - { - "type": "boolean", - "name": "async" - }] - }, - { - "type": "attribute", - "tooltip": "", - "children": [ - { - "type": "boolean", - "name": "expression" - }] - }, - { - "type": "attribute", - "tooltip": "", - "children": [ - { - "type": "boolean", - "name": "generator" - }] - }, - { - "type": "attribute", - "tooltip": "Identifier of this function.", - "children": [ - { - "type": "joinpoint", - "name": "id" - }] - }, - { - "type": "attribute", - "tooltip": "Parameters of this function.", - "children": [ - { - "type": "joinpoint[]", - "name": "params" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "identifier", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Name of the identifier.", - "children": [ - { - "type": "String", - "name": "name" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "tooltip": "Rename this identifier.", - "children": [ - { - "type": "void", - "name": "setName" - }, - { - "type": "String", - "name": "name", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "ifStatement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Test expression of this if statement", - "children": [ - { - "type": "joinpoint", - "name": "test" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "scope", - "alias": "then" - }, - { - "type": "select", - "clazz": "scope", - "alias": "else" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "literal", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Raw value of this literal.", - "children": [ - { - "type": "String", - "name": "raw" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "loop", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "If the loop is innermost.", - "children": [ - { - "type": "boolean", - "name": "isInnermost" - }] - }, - { - "type": "attribute", - "tooltip": "The kind of the loop", - "children": [ - { - "type": "LoopKind", - "name": "kind" - }] - }, - { - "type": "attribute", - "tooltip": "Loop nest nevel.", - "children": [ - { - "type": "int", - "name": "nestedLevel" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "memberExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "tooltip": "If the member expression is computed or not.", - "children": [ - { - "type": "boolean", - "name": "computed" - }] - }, - { - "type": "attribute", - "tooltip": "Expression of the matching object.", - "children": [ - { - "type": "joinpoint", - "name": "object" - }] - }, - { - "type": "attribute", - "tooltip": "Expression of the object property.", - "children": [ - { - "type": "joinpoint", - "name": "property" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "methodDefinition", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "If the method is computed.", - "children": [ - { - "type": "boolean", - "name": "computed" - }] - }, - { - "type": "attribute", - "tooltip": "Key of this method.", - "children": [ - { - "type": "joinpoint", - "name": "key" - }] - }, - { - "type": "attribute", - "tooltip": "The kind of method.", - "children": [ - { - "type": "String", - "name": "kind" - }] - }, - { - "type": "attribute", - "tooltip": "If the method is static.", - "children": [ - { - "type": "boolean", - "name": "static" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "functionExpression", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "project", - "extends": "joinpoint" , - "tooltip": "Represents the complete program and is the topmost joint point in the hierarchy.", - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "file", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "scope", - "extends": "joinpoint" , - "tooltip": "Represents a code region.", - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "statement", - "alias": "" - }, - { - "type": "select", - "clazz": "expressionStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "whileStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "whileStatement", - "alias": "while" - }, - { - "type": "select", - "clazz": "doWhileStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "whileStatement", - "alias": "do" - }, - { - "type": "select", - "clazz": "ifStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "ifStatement", - "alias": "if" - }, - { - "type": "select", - "clazz": "loop", - "alias": "" - }, - { - "type": "select", - "clazz": "forStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "forStatement", - "alias": "for" - }, - { - "type": "select", - "clazz": "tryStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "tryStatement", - "alias": "try" - }, - { - "type": "select", - "clazz": "switchStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "switchStatement", - "alias": "switch" - }, - { - "type": "select", - "clazz": "functionDeclaration", - "alias": "" - }, - { - "type": "select", - "clazz": "functionDeclaration", - "alias": "function" - }, - { - "type": "select", - "clazz": "classDeclaration", - "alias": "" - }, - { - "type": "select", - "clazz": "classDeclaration", - "alias": "class" - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "declaration", - "alias": "" - }, - { - "type": "select", - "clazz": "methodDefinition", - "alias": "" - }, - { - "type": "select", - "clazz": "expression", - "alias": "" - }, - { - "type": "select", - "clazz": "assignmentExpression", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "statement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "select", - "clazz": "classBody", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "switchCase", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Test value of this switch case.", - "children": [ - { - "type": "joinpoint", - "name": "test" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "scope", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "switchStatement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "tooltip": "Discriminant value of this switch statement.", - "children": [ - { - "type": "joinpoint", - "name": "discriminant" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "switchCase", - "alias": "" - }, - { - "type": "select", - "clazz": "switchCase", - "alias": "case" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "thisExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "tryStatement", - "extends": "joinpoint" , - "children": [ - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "scope", - "alias": "block" - }, - { - "type": "select", - "clazz": "catchClause", - "alias": "" - }, - { - "type": "select", - "clazz": "catchClause", - "alias": "catch" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "updateExpression", - "extends": "expression" , - "children": [ - { - "type": "attribute", - "tooltip": "Argument of this update expression.", - "children": [ - { - "type": "joinpoint", - "name": "argument" - }] - }, - { - "type": "attribute", - "tooltip": "Operator of this update expression.", - "children": [ - { - "type": "String", - "name": "operator" - }] - }, - { - "type": "attribute", - "tooltip": "If the operator of this update expression is a prefix.", - "children": [ - { - "type": "boolean", - "name": "prefix" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "joinpoint", - "name": "whileStatement", - "extends": "loop" , - "children": [ - { - "type": "attribute", - "tooltip": "Test expression of this while statement.", - "children": [ - { - "type": "joinpoint", - "name": "test" - }] - }, - { - "type": "attribute", - "tooltip": "If the loop is innermost.", - "children": [ - { - "type": "boolean", - "name": "isInnermost" - }] - }, - { - "type": "attribute", - "tooltip": "The kind of the loop", - "children": [ - { - "type": "LoopKind", - "name": "kind" - }] - }, - { - "type": "attribute", - "tooltip": "Loop nest nevel.", - "children": [ - { - "type": "int", - "name": "nestedLevel" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "attributes" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "selects" - }] - }, - { - "type": "attribute", - "children": [ - { - "type": "String[]", - "name": "actions" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", - "children": [ - { - "type": "joinpoint", - "name": "ancestor" - }, - { - "type": "String", - "name": "joinPointType" - }] - }, - { - "type": "attribute", - "tooltip": "The ast corresponding to this join point", - "children": [ - { - "type": "String", - "name": "ast" - }] - }, - { - "type": "attribute", - "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "children" - }] - }, - { - "type": "attribute", - "tooltip": "Equivalent javascript code of this joinpoint.", - "children": [ - { - "type": "String", - "name": "code" - }] - }, - { - "type": "attribute", - "tooltip": "Column of this joinpoint.", - "children": [ - { - "type": "int", - "name": "column" - }] - }, - { - "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the value of the given field", - "children": [ - { - "type": "Object", - "name": "field" - }, - { - "type": "String", - "name": "fieldName" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "The name of the join point.", - "children": [ - { - "type": "String", - "name": "joinPointName" - }] - }, - { - "type": "attribute", - "tooltip": "Line of this joinpoint.", - "children": [ - { - "type": "int", - "name": "line" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'parent' node of this joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "parent" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'project' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "root" - }] - }, - { - "type": "attribute", - "tooltip": "The type of the join point", - "children": [ - { - "type": "String", - "name": "type" - }] - }, - { - "type": "attribute", - "tooltip": "Uniquely identifies the AST node.", - "children": [ - { - "type": "String", - "name": "uuid" - }] - }, - { - "type": "attribute", - "tooltip": "true if the current join point is an instance of the given type", - "children": [ - { - "type": "Boolean", - "name": "instanceOf" - }, - { - "type": "String", - "name": "name" - }] - }, - { - "type": "select", - "clazz": "blockStatement", - "alias": "" - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "insert" - }, - { - "type": "[before| after| replace]", - "name": "position", - "defaultValue": "" - }, - { - "type": "String", - "name": "code", - "defaultValue": "" - }] - }, - { - "type": "action", - "children": [ - { - "type": "void", - "name": "def" - }, - { - "type": "String", - "name": "attribute", - "defaultValue": "" - }, - { - "type": "Object", - "name": "value", - "defaultValue": "" - }] - }] - }, - { - "type": "enum", - "name": "LoopKind" - , - "children": [ - { - "string": "null", - "value": "DO" - }, - { - "string": "null", - "value": "FOR" - }, - { - "string": "null", - "value": "WHILE" - }] - }] +{ + "root": "project", + "rootAlias": "project", + "children": [ + { + "type": "joinpoint", + "name": "joinpoint", + "extends": "" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "assignmentExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "Left part of the binary expression.", + "children": [ + { + "type": "joinpoint", + "name": "left" + }] + }, + { + "type": "attribute", + "tooltip": "Operator of the binary expression.", + "children": [ + { + "type": "String", + "name": "operator" + }] + }, + { + "type": "attribute", + "tooltip": "Expression of the binary expression.", + "children": [ + { + "type": "joinpoint", + "name": "right" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "binaryExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "Left part of the binary expression.", + "children": [ + { + "type": "joinpoint", + "name": "left" + }] + }, + { + "type": "attribute", + "tooltip": "Operator of the binary expression.", + "children": [ + { + "type": "String", + "name": "operator" + }] + }, + { + "type": "attribute", + "tooltip": "Expression of the binary expression.", + "children": [ + { + "type": "joinpoint", + "name": "right" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "blockStatement", + "extends": "statement" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "scope", + "alias": "" + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "classBody", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "breakStatement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "callExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "Arguments of this expression call.", + "children": [ + { + "type": "joinpoint[]", + "name": "arguments" + }] + }, + { + "type": "attribute", + "tooltip": "Identifier of this expression call.", + "children": [ + { + "type": "joinpoint", + "name": "callee" + }] + }, + { + "type": "attribute", + "tooltip": "Name of the callee or callee type.", + "children": [ + { + "type": "String", + "name": "name" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "catchClause", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Parameter of this catch clause.", + "children": [ + { + "type": "joinpoint", + "name": "param" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "classBody", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "scope", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "classDeclaration", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Identifier of this class", + "children": [ + { + "type": "joinpoint", + "name": "id" + }] + }, + { + "type": "attribute", + "tooltip": "superclass of this class", + "children": [ + { + "type": "joinpoint", + "name": "superclass" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "classBody", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "continueStatement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "declaration", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Kind of declaration.", + "children": [ + { + "type": "String", + "name": "kind" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "declarator", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "declarator", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Identifier of this declarator.", + "children": [ + { + "type": "joinpoint", + "name": "id" + }] + }, + { + "type": "attribute", + "tooltip": "Initialization of this declarator.", + "children": [ + { + "type": "joinpoint", + "name": "init" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "identifier", + "alias": "" + }, + { + "type": "action", + "tooltip": "Refactor this declarator.", + "children": [ + { + "type": "void", + "name": "refactor" + }, + { + "type": "String", + "name": "name", + "defaultValue": "" + }] + }] + }, + { + "type": "joinpoint", + "name": "doWhileStatement", + "extends": "loop" , + "children": [ + { + "type": "attribute", + "tooltip": "Test expression of this do while statement.", + "children": [ + { + "type": "joinpoint", + "name": "test" + }] + }, + { + "type": "attribute", + "tooltip": "If the loop is innermost.", + "children": [ + { + "type": "boolean", + "name": "isInnermost" + }] + }, + { + "type": "attribute", + "tooltip": "The kind of the loop", + "children": [ + { + "type": "LoopKind", + "name": "kind" + }] + }, + { + "type": "attribute", + "tooltip": "Loop nest nevel.", + "children": [ + { + "type": "int", + "name": "nestedLevel" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "expression", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "expressionStatement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Directive of this expression statement.", + "children": [ + { + "type": "String", + "name": "directive" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "callExpression", + "alias": "" + }, + { + "type": "select", + "clazz": "callExpression", + "alias": "call" + }, + { + "type": "select", + "clazz": "assignmentExpression", + "alias": "" + }, + { + "type": "select", + "clazz": "updateExpression", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "file", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Name of the file.", + "children": [ + { + "type": "String", + "name": "name" + }] + }, + { + "type": "attribute", + "tooltip": "Absolute path of the program file.", + "children": [ + { + "type": "String", + "name": "path" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "scope", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "forStatement", + "extends": "loop" , + "children": [ + { + "type": "attribute", + "tooltip": "Initialization expression of this for statement.", + "children": [ + { + "type": "joinpoint", + "name": "init" + }] + }, + { + "type": "attribute", + "tooltip": "Test expression of this for statement.", + "children": [ + { + "type": "joinpoint", + "name": "test" + }] + }, + { + "type": "attribute", + "tooltip": "Update expression of this for statement.", + "children": [ + { + "type": "joinpoint", + "name": "update" + }] + }, + { + "type": "attribute", + "tooltip": "If the loop is innermost.", + "children": [ + { + "type": "boolean", + "name": "isInnermost" + }] + }, + { + "type": "attribute", + "tooltip": "The kind of the loop", + "children": [ + { + "type": "LoopKind", + "name": "kind" + }] + }, + { + "type": "attribute", + "tooltip": "Loop nest nevel.", + "children": [ + { + "type": "int", + "name": "nestedLevel" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "functionDeclaration", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "If the function is async.", + "children": [ + { + "type": "boolean", + "name": "async" + }] + }, + { + "type": "attribute", + "tooltip": "", + "children": [ + { + "type": "boolean", + "name": "expression" + }] + }, + { + "type": "attribute", + "tooltip": "", + "children": [ + { + "type": "boolean", + "name": "generator" + }] + }, + { + "type": "attribute", + "tooltip": "Identifier of this function.", + "children": [ + { + "type": "joinpoint", + "name": "id" + }] + }, + { + "type": "attribute", + "tooltip": "Name of this function.", + "children": [ + { + "type": "String", + "name": "name" + }] + }, + { + "type": "attribute", + "tooltip": "Parameters of this function.", + "children": [ + { + "type": "joinpoint[]", + "name": "params" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }, + { + "type": "action", + "tooltip": "Refactor this function", + "children": [ + { + "type": "void", + "name": "refactor" + }, + { + "type": "String", + "name": "name", + "defaultValue": "" + }] + }, + { + "type": "action", + "tooltip": "Refactor this function", + "children": [ + { + "type": "void", + "name": "refactorParam" + }, + { + "type": "int", + "name": "index", + "defaultValue": "" + }, + { + "type": "String", + "name": "name", + "defaultValue": "" + }] + }] + }, + { + "type": "joinpoint", + "name": "functionExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "If the function is async.", + "children": [ + { + "type": "boolean", + "name": "async" + }] + }, + { + "type": "attribute", + "tooltip": "", + "children": [ + { + "type": "boolean", + "name": "expression" + }] + }, + { + "type": "attribute", + "tooltip": "", + "children": [ + { + "type": "boolean", + "name": "generator" + }] + }, + { + "type": "attribute", + "tooltip": "Identifier of this function.", + "children": [ + { + "type": "joinpoint", + "name": "id" + }] + }, + { + "type": "attribute", + "tooltip": "Parameters of this function.", + "children": [ + { + "type": "joinpoint[]", + "name": "params" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "identifier", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Name of the identifier.", + "children": [ + { + "type": "String", + "name": "name" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "action", + "tooltip": "Rename this identifier.", + "children": [ + { + "type": "void", + "name": "setName" + }, + { + "type": "String", + "name": "name", + "defaultValue": "" + }] + }] + }, + { + "type": "joinpoint", + "name": "ifStatement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Test expression of this if statement", + "children": [ + { + "type": "joinpoint", + "name": "test" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "scope", + "alias": "then" + }, + { + "type": "select", + "clazz": "scope", + "alias": "else" + }] + }, + { + "type": "joinpoint", + "name": "literal", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Raw value of this literal.", + "children": [ + { + "type": "String", + "name": "raw" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "loop", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "If the loop is innermost.", + "children": [ + { + "type": "boolean", + "name": "isInnermost" + }] + }, + { + "type": "attribute", + "tooltip": "The kind of the loop", + "children": [ + { + "type": "LoopKind", + "name": "kind" + }] + }, + { + "type": "attribute", + "tooltip": "Loop nest nevel.", + "children": [ + { + "type": "int", + "name": "nestedLevel" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "memberExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "If the member expression is computed or not.", + "children": [ + { + "type": "boolean", + "name": "computed" + }] + }, + { + "type": "attribute", + "tooltip": "Expression of the matching object.", + "children": [ + { + "type": "joinpoint", + "name": "object" + }] + }, + { + "type": "attribute", + "tooltip": "Expression of the object property.", + "children": [ + { + "type": "joinpoint", + "name": "property" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "methodDefinition", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "If the method is computed.", + "children": [ + { + "type": "boolean", + "name": "computed" + }] + }, + { + "type": "attribute", + "tooltip": "Key of this method.", + "children": [ + { + "type": "joinpoint", + "name": "key" + }] + }, + { + "type": "attribute", + "tooltip": "The kind of method.", + "children": [ + { + "type": "String", + "name": "kind" + }] + }, + { + "type": "attribute", + "tooltip": "If the method is static.", + "children": [ + { + "type": "boolean", + "name": "static" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "functionExpression", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "project", + "extends": "joinpoint" , + "tooltip": "Represents the complete program and is the topmost joint point in the hierarchy.", + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "file", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "scope", + "extends": "joinpoint" , + "tooltip": "Represents a code region.", + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "statement", + "alias": "" + }, + { + "type": "select", + "clazz": "expressionStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "whileStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "whileStatement", + "alias": "while" + }, + { + "type": "select", + "clazz": "doWhileStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "whileStatement", + "alias": "do" + }, + { + "type": "select", + "clazz": "ifStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "ifStatement", + "alias": "if" + }, + { + "type": "select", + "clazz": "loop", + "alias": "" + }, + { + "type": "select", + "clazz": "forStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "forStatement", + "alias": "for" + }, + { + "type": "select", + "clazz": "tryStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "tryStatement", + "alias": "try" + }, + { + "type": "select", + "clazz": "switchStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "switchStatement", + "alias": "switch" + }, + { + "type": "select", + "clazz": "functionDeclaration", + "alias": "" + }, + { + "type": "select", + "clazz": "functionDeclaration", + "alias": "function" + }, + { + "type": "select", + "clazz": "classDeclaration", + "alias": "" + }, + { + "type": "select", + "clazz": "classDeclaration", + "alias": "class" + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "declaration", + "alias": "" + }, + { + "type": "select", + "clazz": "methodDefinition", + "alias": "" + }, + { + "type": "select", + "clazz": "expression", + "alias": "" + }, + { + "type": "select", + "clazz": "assignmentExpression", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "statement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }, + { + "type": "select", + "clazz": "classBody", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "switchCase", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Test value of this switch case.", + "children": [ + { + "type": "joinpoint", + "name": "test" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "scope", + "alias": "" + }] + }, + { + "type": "joinpoint", + "name": "switchStatement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "Discriminant value of this switch statement.", + "children": [ + { + "type": "joinpoint", + "name": "discriminant" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "switchCase", + "alias": "" + }, + { + "type": "select", + "clazz": "switchCase", + "alias": "case" + }] + }, + { + "type": "joinpoint", + "name": "thisExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "tryStatement", + "extends": "joinpoint" , + "children": [ + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "scope", + "alias": "block" + }, + { + "type": "select", + "clazz": "catchClause", + "alias": "" + }, + { + "type": "select", + "clazz": "catchClause", + "alias": "catch" + }] + }, + { + "type": "joinpoint", + "name": "updateExpression", + "extends": "expression" , + "children": [ + { + "type": "attribute", + "tooltip": "Argument of this update expression.", + "children": [ + { + "type": "joinpoint", + "name": "argument" + }] + }, + { + "type": "attribute", + "tooltip": "Operator of this update expression.", + "children": [ + { + "type": "String", + "name": "operator" + }] + }, + { + "type": "attribute", + "tooltip": "If the operator of this update expression is a prefix.", + "children": [ + { + "type": "boolean", + "name": "prefix" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }] + }, + { + "type": "joinpoint", + "name": "whileStatement", + "extends": "loop" , + "children": [ + { + "type": "attribute", + "tooltip": "Test expression of this while statement.", + "children": [ + { + "type": "joinpoint", + "name": "test" + }] + }, + { + "type": "attribute", + "tooltip": "If the loop is innermost.", + "children": [ + { + "type": "boolean", + "name": "isInnermost" + }] + }, + { + "type": "attribute", + "tooltip": "The kind of the loop", + "children": [ + { + "type": "LoopKind", + "name": "kind" + }] + }, + { + "type": "attribute", + "tooltip": "Loop nest nevel.", + "children": [ + { + "type": "int", + "name": "nestedLevel" + }] + }, + { + "type": "attribute", + "tooltip": "The ast corresponding to this join point", + "children": [ + { + "type": "String", + "name": "ast" + }] + }, + { + "type": "attribute", + "tooltip": "Children (direct nodes) joinpoints of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "children" + }] + }, + { + "type": "attribute", + "tooltip": "Equivalent javascript code of this joinpoint.", + "children": [ + { + "type": "String", + "name": "code" + }] + }, + { + "type": "attribute", + "tooltip": "Column of this joinpoint.", + "children": [ + { + "type": "int", + "name": "column" + }] + }, + { + "type": "attribute", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", + "children": [ + { + "type": "joinpoint[]", + "name": "descendants" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "getAncestor" + }, + { + "type": "String", + "name": "joinPointType" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the value of the given field", + "children": [ + { + "type": "Object", + "name": "getField" + }, + { + "type": "String", + "name": "fieldName" + }] + }, + { + "type": "attribute", + "tooltip": "The name of the join point.", + "children": [ + { + "type": "String", + "name": "joinPointName" + }] + }, + { + "type": "attribute", + "tooltip": "Line of this joinpoint.", + "children": [ + { + "type": "int", + "name": "line" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'parent' node of this joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "parent" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'project' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "root" + }] + }, + { + "type": "attribute", + "tooltip": "The type of the join point", + "children": [ + { + "type": "String", + "name": "type" + }] + }, + { + "type": "attribute", + "tooltip": "Uniquely identifies the AST node.", + "children": [ + { + "type": "String", + "name": "uuid" + }] + }, + { + "type": "select", + "clazz": "blockStatement", + "alias": "" + }] + }, + { + "type": "enum", + "name": "LoopKind" + , + "children": [ + { + "string": "null", + "value": "DO" + }, + { + "string": "null", + "value": "FOR" + }, + { + "string": "null", + "value": "WHILE" + }] + }] } \ No newline at end of file diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.png b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.png index c46e4617f8a1fcf1e69b4b8e4c18901d830150bd..7f9c85562a9b8f12bfef67b0e0a5395b23351266 100644 GIT binary patch literal 132522 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 N0#8>zmvv4FO#nO73eW%m literal 89701 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 c?~L - - + JackdawWeaver_join_point_hierarchy_join_point_hierarchy - + assignmentExpression - -assignmentExpression + +assignmentExpression expression - -expression + +expression assignmentExpression->expression - - + + joinpoint - -joinpoint + +joinpoint expression->joinpoint - - + + binaryExpression - -binaryExpression + +binaryExpression binaryExpression->expression - - + + blockStatement - -blockStatement + +blockStatement statement - -statement + +statement blockStatement->statement - - + + statement->joinpoint - - + + breakStatement - -breakStatement + +breakStatement breakStatement->joinpoint - - + + callExpression - -callExpression + +callExpression callExpression->expression - - + + catchClause - -catchClause + +catchClause catchClause->joinpoint - - + + classBody - -classBody + +classBody classBody->joinpoint - - + + classDeclaration - -classDeclaration + +classDeclaration classDeclaration->joinpoint - - + + continueStatement - -continueStatement + +continueStatement continueStatement->joinpoint - - + + declaration - -declaration + +declaration declaration->joinpoint - - + + declarator - -declarator + +declarator declarator->joinpoint - - + + doWhileStatement - -doWhileStatement + +doWhileStatement loop - -loop + +loop doWhileStatement->loop - - + + loop->joinpoint - - + + expressionStatement - -expressionStatement + +expressionStatement expressionStatement->joinpoint - - + + file - -file + +file file->joinpoint - - + + forStatement - -forStatement + +forStatement forStatement->loop - - + + functionDeclaration - -functionDeclaration + +functionDeclaration functionDeclaration->joinpoint - - + + functionExpression - -functionExpression + +functionExpression functionExpression->expression - - + + identifier - -identifier + +identifier identifier->joinpoint - - + + ifStatement - -ifStatement + +ifStatement ifStatement->joinpoint - - + + literal - -literal + +literal literal->joinpoint - - + + memberExpression - -memberExpression + +memberExpression memberExpression->expression - - + + methodDefinition - -methodDefinition + +methodDefinition methodDefinition->joinpoint - - + + project - -project + +project project->joinpoint - - + + scope - -scope + +scope scope->joinpoint - - + + switchCase - -switchCase + +switchCase switchCase->joinpoint - - + + switchStatement - -switchStatement + +switchStatement switchStatement->joinpoint - - + + thisExpression - -thisExpression + +thisExpression thisExpression->expression - - + + tryStatement - -tryStatement + +tryStatement tryStatement->joinpoint - - + + updateExpression - -updateExpression + +updateExpression updateExpression->expression - - + + whileStatement - -whileStatement + +whileStatement whileStatement->loop - - + + diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java index a0e08d5..4fbdc90 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java @@ -73,7 +73,7 @@ public AJoinPoint getParentImpl() { } @Override - public AJoinPoint ancestorImpl(String joinPointType) { + public AJoinPoint getAncestorImpl(String joinPointType) { AJoinPoint currentParent = getParentImpl(); while (currentParent != null) { if (currentParent.instanceOf(joinPointType)) { @@ -117,7 +117,7 @@ public AJoinPoint[] insertImpl(String position, JoinPoint JoinPoint) { } @Override - public Object fieldImpl(String fieldName) { + public Object getFieldImpl(String fieldName) { JsonElement field = getNode().get(fieldName); if (field.isJsonObject() && field.getAsJsonObject().has("type")) { return JoinpointCreator.create(field.getAsJsonObject()); diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java index f73ecb5..fa0e712 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java @@ -140,12 +140,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -193,15 +202,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum AssignmentExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java index fb6a1a5..a7ee71a 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java @@ -140,12 +140,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -193,15 +202,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum BinaryExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java index f1b6587..365f790 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java @@ -96,12 +96,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aStatement.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aStatement.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aStatement.getFieldImpl(fieldName); } /** @@ -149,15 +158,6 @@ public AJoinPoint getFileImpl() { return this.aStatement.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aStatement.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -292,13 +292,13 @@ protected enum BlockStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java index 179b343..9fc0fbd 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java @@ -81,13 +81,13 @@ protected enum BreakStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java index 0d84320..90d9b75 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java @@ -150,12 +150,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -203,15 +212,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -342,13 +342,13 @@ protected enum CallExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java index f2d5df5..80dd48b 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java @@ -121,13 +121,13 @@ protected enum CatchClauseAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java index f50e0ce..067352e 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java @@ -94,13 +94,13 @@ protected enum ClassBodyAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java index a7553be..f1ba676 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java @@ -146,13 +146,13 @@ protected enum ClassDeclarationAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java index 1384349..140e656 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java @@ -81,13 +81,13 @@ protected enum ContinueStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java index 270ff3d..01b705b 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java @@ -121,13 +121,13 @@ protected enum DeclarationAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java index 0365acf..7c8e967 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java @@ -174,13 +174,13 @@ protected enum DeclaratorAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java index 05a4129..613d117 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java @@ -131,12 +131,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aLoop.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aLoop.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aLoop.getFieldImpl(fieldName); } /** @@ -184,15 +193,6 @@ public AJoinPoint getFileImpl() { return this.aLoop.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aLoop.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -326,13 +326,13 @@ protected enum DoWhileStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java index 43fd8e6..055be7c 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java @@ -81,13 +81,13 @@ protected enum ExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java index 5ed748e..a1d38d9 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java @@ -157,13 +157,13 @@ protected enum ExpressionStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java index 4191914..8590977 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java @@ -146,13 +146,13 @@ protected enum FileAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java index dc8db05..10af27d 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java @@ -177,12 +177,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aLoop.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aLoop.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aLoop.getFieldImpl(fieldName); } /** @@ -230,15 +239,6 @@ public AJoinPoint getFileImpl() { return this.aLoop.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aLoop.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -376,13 +376,13 @@ protected enum ForStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java index c365f92..b7e8900 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java @@ -313,13 +313,13 @@ protected enum FunctionDeclarationAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java index e3e9292..c16993c 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java @@ -205,12 +205,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -258,15 +267,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -405,13 +405,13 @@ protected enum FunctionExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java index c7ed96e..e6e043d 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java @@ -150,13 +150,13 @@ protected enum IdentifierAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java index 6adeadb..5902451 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java @@ -133,13 +133,13 @@ protected enum IfStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java index 390183b..4050ed8 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java @@ -66,9 +66,9 @@ protected void fillWithAttributes(List attributes) { attributes.add("root"); attributes.add("file"); attributes.add("parent"); - attributes.add("ancestor(String joinPointType)"); + attributes.add("getAncestor(String joinPointType)"); attributes.add("type"); - attributes.add("field(String fieldName)"); + attributes.add("getField(String fieldName)"); attributes.add("joinPointName"); attributes.add("ast"); attributes.add("children"); @@ -153,25 +153,25 @@ public final Object getParent() { * @param joinPointType * @return */ - public abstract AJoinPoint ancestorImpl(String joinPointType); + public abstract AJoinPoint getAncestorImpl(String joinPointType); /** * * @param joinPointType * @return */ - public final Object ancestor(String joinPointType) { + public final Object getAncestor(String joinPointType) { try { if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.BEGIN, this, "ancestor", Optional.empty(), joinPointType); + eventTrigger().triggerAttribute(Stage.BEGIN, this, "getAncestor", Optional.empty(), joinPointType); } - AJoinPoint result = this.ancestorImpl(joinPointType); + AJoinPoint result = this.getAncestorImpl(joinPointType); if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.END, this, "ancestor", Optional.ofNullable(result), joinPointType); + eventTrigger().triggerAttribute(Stage.END, this, "getAncestor", Optional.ofNullable(result), joinPointType); } return result!=null?result:getUndefinedValue(); } catch(Exception e) { - throw new AttributeException(get_class(), "ancestor", e); + throw new AttributeException(get_class(), "getAncestor", e); } } @@ -203,25 +203,25 @@ public final Object getType() { * @param fieldName * @return */ - public abstract Object fieldImpl(String fieldName); + public abstract Object getFieldImpl(String fieldName); /** * * @param fieldName * @return */ - public final Object field(String fieldName) { + public final Object getField(String fieldName) { try { if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.BEGIN, this, "field", Optional.empty(), fieldName); + eventTrigger().triggerAttribute(Stage.BEGIN, this, "getField", Optional.empty(), fieldName); } - Object result = this.fieldImpl(fieldName); + Object result = this.getFieldImpl(fieldName); if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.END, this, "field", Optional.ofNullable(result), fieldName); + eventTrigger().triggerAttribute(Stage.END, this, "getField", Optional.ofNullable(result), fieldName); } return result!=null?result:getUndefinedValue(); } catch(Exception e) { - throw new AttributeException(get_class(), "field", e); + throw new AttributeException(get_class(), "getField", e); } } diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java index 26a987d..63a7fe0 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java @@ -108,13 +108,13 @@ protected enum LiteralAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java index c49c004..2fba85b 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java @@ -159,13 +159,13 @@ protected enum LoopAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java index 53a9d50..e9c31de 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java @@ -140,12 +140,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -193,15 +202,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum MemberExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java index ab36527..9ca7a36 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java @@ -196,13 +196,13 @@ protected enum MethodDefinitionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java index 93b0837..4a3aa5d 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java @@ -94,13 +94,13 @@ protected enum ProjectAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java index 6460c2c..796d69e 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java @@ -370,13 +370,13 @@ protected enum ScopeAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java index 4de53a0..60a34bd 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java @@ -106,13 +106,13 @@ protected enum StatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java index 50220de..5c8b09a 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java @@ -121,13 +121,13 @@ protected enum SwitchCaseAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java index 406cd2b..1453dcf 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java @@ -133,13 +133,13 @@ protected enum SwitchStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java index 7ec9cc6..c8fdb05 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java @@ -69,12 +69,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -122,15 +131,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -255,13 +255,13 @@ protected enum ThisExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java index ca41761..a94c450 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java @@ -118,13 +118,13 @@ protected enum TryStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java index b480e91..c9952d8 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java @@ -140,12 +140,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aExpression.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aExpression.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aExpression.getFieldImpl(fieldName); } /** @@ -193,15 +202,6 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aExpression.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum UpdateExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java index dca21fa..9881371 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java @@ -131,12 +131,21 @@ public Integer getLineImpl() { } /** - * Get value on attribute ancestor + * Get value on attribute getAncestor * @return the attribute's value */ @Override - public AJoinPoint ancestorImpl(String joinPointType) { - return this.aLoop.ancestorImpl(joinPointType); + public AJoinPoint getAncestorImpl(String joinPointType) { + return this.aLoop.getAncestorImpl(joinPointType); + } + + /** + * Get value on attribute getField + * @return the attribute's value + */ + @Override + public Object getFieldImpl(String fieldName) { + return this.aLoop.getFieldImpl(fieldName); } /** @@ -184,15 +193,6 @@ public AJoinPoint getFileImpl() { return this.aLoop.getFileImpl(); } - /** - * Get value on attribute field - * @return the attribute's value - */ - @Override - public Object fieldImpl(String fieldName) { - return this.aLoop.fieldImpl(fieldName); - } - /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -326,13 +326,13 @@ protected enum WhileStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - ANCESTOR("ancestor"), + GETANCESTOR("getAncestor"), + GETFIELD("getField"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), - FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; From 0bebd571e1fdfa9451b80c0da28aa899d9c247dd Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Fri, 25 Aug 2023 03:37:49 +0100 Subject: [PATCH 03/16] Delete obsolete API --- .../lara-lara/jackdaw/weaver/JoinPoints.lara | 29 ------------------- .../specs/jackdaw/api/JackdawWeaverApi.java | 4 +-- 2 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 jsweaver/lara-lara/jackdaw/weaver/JoinPoints.lara diff --git a/jsweaver/lara-lara/jackdaw/weaver/JoinPoints.lara b/jsweaver/lara-lara/jackdaw/weaver/JoinPoints.lara deleted file mode 100644 index b2426ff..0000000 --- a/jsweaver/lara-lara/jackdaw/weaver/JoinPoints.lara +++ /dev/null @@ -1,29 +0,0 @@ -import weaver.JoinPointsBase; -import jackdaw._JackdawAspects; - -var JoinPoints = JoinPointsBase; - -/** - * - * @return {$jp[]} the children of the given node - */ -JoinPoints.prototype._all_children = function($jp) { - return $jp.children; -} - - -/** - * - * @return {$jp[]} the descendants of the given node - */ -JoinPoints.prototype._all_descendants = function($jp) { - return $jp.descendants; -} - -/** - * - * @return {$jp[]} all the nodes that are inside the scope of a given node - */ -JoinPoints.prototype._all_scope_nodes = function($jp) { - throw "JoinPoints._all_scope_nodes not implemented yet"; -} diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/api/JackdawWeaverApi.java b/jsweaver/src/pt/up/fe/specs/jackdaw/api/JackdawWeaverApi.java index 146baf4..8a466b6 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/api/JackdawWeaverApi.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/api/JackdawWeaverApi.java @@ -24,8 +24,8 @@ public enum JackdawWeaverApi implements LaraResourceProvider { JACKDAW_CLASS_JP("jp/JackdawClassJp.lara"), JACKDAW_JOIN_POINT("jp/JackdawJoinPoint.lara"), - COMMON_JOIN_POINTS("jp/CommonJoinPoints.lara"), - JOINPOINTS("JoinPoints.lara"); + COMMON_JOIN_POINTS("jp/CommonJoinPoints.lara"); + //JOINPOINTS("JoinPoints.lara"); private final String resource; From 9c35ee134e300408e57f3300b74c70575a066bbe Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Mon, 18 Sep 2023 23:06:51 +0100 Subject: [PATCH 04/16] Reverts recent LaguageSpecification changes --- .../jackdaw/obfuscation/Flatted.lara | 38 +- .../jackdaw/obfuscation/Obfuscator.lara | 4 +- .../jackdaw/obfuscation/OpaquePredicates.lara | 2 +- jsweaver/src/jackdaw/specs/artifacts.xml | 4 +- .../pt/up/fe/specs/jackdaw/JackdawWeaver.json | 1442 +++++++++-------- .../abstracts/AJackdawWeaverJoinPoint.java | 4 +- .../joinpoints/AAssignmentExpression.java | 28 +- .../joinpoints/ABinaryExpression.java | 28 +- .../abstracts/joinpoints/ABlockStatement.java | 28 +- .../abstracts/joinpoints/ABreakStatement.java | 4 +- .../abstracts/joinpoints/ACallExpression.java | 28 +- .../abstracts/joinpoints/ACatchClause.java | 4 +- .../abstracts/joinpoints/AClassBody.java | 4 +- .../joinpoints/AClassDeclaration.java | 4 +- .../joinpoints/AContinueStatement.java | 4 +- .../abstracts/joinpoints/ADeclaration.java | 4 +- .../abstracts/joinpoints/ADeclarator.java | 4 +- .../joinpoints/ADoWhileStatement.java | 31 +- .../abstracts/joinpoints/AExpression.java | 4 +- .../joinpoints/AExpressionStatement.java | 4 +- .../jackdaw/abstracts/joinpoints/AFile.java | 4 +- .../abstracts/joinpoints/AForStatement.java | 31 +- .../joinpoints/AFunctionDeclaration.java | 4 +- .../joinpoints/AFunctionExpression.java | 28 +- .../abstracts/joinpoints/AIdentifier.java | 4 +- .../abstracts/joinpoints/AIfStatement.java | 4 +- .../abstracts/joinpoints/AJoinPoint.java | 28 +- .../abstracts/joinpoints/ALiteral.java | 4 +- .../jackdaw/abstracts/joinpoints/ALoop.java | 9 +- .../joinpoints/AMemberExpression.java | 28 +- .../joinpoints/AMethodDefinition.java | 4 +- .../abstracts/joinpoints/AProject.java | 4 +- .../jackdaw/abstracts/joinpoints/AScope.java | 4 +- .../abstracts/joinpoints/AStatement.java | 4 +- .../abstracts/joinpoints/ASwitchCase.java | 4 +- .../joinpoints/ASwitchStatement.java | 4 +- .../abstracts/joinpoints/AThisExpression.java | 28 +- .../abstracts/joinpoints/ATryStatement.java | 4 +- .../joinpoints/AUpdateExpression.java | 28 +- .../abstracts/joinpoints/AWhileStatement.java | 31 +- .../statements/JsDoWhileStatement.java | 4 +- .../joinpoints/statements/JsForStatement.java | 4 +- .../jackdaw/joinpoints/statements/JsLoop.java | 2 +- .../statements/JsWhileStatement.java | 4 +- 44 files changed, 1005 insertions(+), 941 deletions(-) diff --git a/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara b/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara index f9a52b6..a60f161 100644 --- a/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara +++ b/jsweaver/lara-lara/jackdaw/obfuscation/Flatted.lara @@ -17,7 +17,7 @@ function obfuscate($block){ //If function is an opaque predicate there is no need to refactor. if(!isPredicate($block)){ $block.refactor(getUuid()); - ///var numberParams = $block.getField("params").length; + ///var numberParams = $block.field("params").length; //for(i=0;i - - + diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json index 90a1d09..260f4b6 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.json @@ -7,6 +7,20 @@ "name": "joinpoint", "extends": "" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -54,37 +68,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -174,6 +176,20 @@ "name": "right" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -221,37 +237,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -341,6 +345,20 @@ "name": "right" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -388,37 +406,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -481,6 +487,20 @@ "name": "blockStatement", "extends": "statement" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -528,37 +548,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -636,6 +644,20 @@ "name": "breakStatement", "extends": "joinpoint" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -683,37 +705,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -803,6 +813,20 @@ "name": "name" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -850,37 +874,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -952,6 +964,20 @@ "name": "param" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -999,37 +1025,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -1097,6 +1111,20 @@ "name": "classBody", "extends": "joinpoint" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -1144,37 +1172,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -1260,6 +1276,20 @@ "name": "superclass" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -1307,37 +1337,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -1405,6 +1423,20 @@ "name": "continueStatement", "extends": "joinpoint" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -1452,37 +1484,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -1554,6 +1574,20 @@ "name": "kind" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -1601,37 +1635,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -1717,6 +1739,20 @@ "name": "init" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -1764,37 +1800,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -1912,6 +1936,20 @@ "name": "nestedLevel" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -1959,37 +1997,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -2057,6 +2083,20 @@ "name": "expression", "extends": "joinpoint" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -2104,37 +2144,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -2206,6 +2234,20 @@ "name": "directive" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -2253,37 +2295,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -2384,6 +2414,20 @@ "name": "path" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -2431,37 +2475,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -2583,6 +2615,20 @@ "name": "nestedLevel" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -2630,37 +2676,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -2782,6 +2816,20 @@ "name": "params" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -2829,37 +2877,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3005,6 +3041,20 @@ "name": "params" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -3052,37 +3102,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3159,6 +3197,20 @@ "name": "name" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -3206,37 +3258,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3322,6 +3362,20 @@ "name": "test" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -3369,37 +3423,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3481,6 +3523,20 @@ "name": "raw" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -3528,37 +3584,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3648,6 +3692,20 @@ "name": "nestedLevel" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -3695,37 +3753,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3815,6 +3861,20 @@ "name": "property" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -3862,37 +3922,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -3991,6 +4039,20 @@ "name": "static" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -4038,37 +4100,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -4137,6 +4187,20 @@ "extends": "joinpoint" , "tooltip": "Represents the complete program and is the topmost joint point in the hierarchy.", "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -4184,37 +4248,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -4283,6 +4335,20 @@ "extends": "joinpoint" , "tooltip": "Represents a code region.", "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -4321,33 +4387,11 @@ }, { "type": "attribute", - "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", - "children": [ - { - "type": "joinpoint[]", - "name": "descendants" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Children joinpoints (indirect nodes) of this joinpoint.", "children": [ { - "type": "joinpoint", - "name": "getAncestor" - }, - { - "type": "String", - "name": "joinPointType" + "type": "joinpoint[]", + "name": "descendants" }] }, { @@ -4356,11 +4400,21 @@ "children": [ { "type": "Object", - "name": "getField" + "name": "field" }, { "type": "String", - "name": "fieldName" + "name": "fieldName", + "defaultValue": "" + }] + }, + { + "type": "attribute", + "tooltip": "Returns the 'file' joinpoint", + "children": [ + { + "type": "joinpoint", + "name": "file" }] }, { @@ -4543,6 +4597,20 @@ "name": "statement", "extends": "joinpoint" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -4590,37 +4658,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -4702,6 +4758,20 @@ "name": "test" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -4749,37 +4819,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -4856,6 +4914,20 @@ "name": "discriminant" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -4903,37 +4975,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -5006,6 +5066,20 @@ "name": "thisExpression", "extends": "expression" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -5053,37 +5127,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -5146,6 +5208,20 @@ "name": "tryStatement", "extends": "joinpoint" , "children": [ + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -5193,37 +5269,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -5328,6 +5392,20 @@ "name": "prefix" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -5375,37 +5453,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { @@ -5504,6 +5570,20 @@ "name": "nestedLevel" }] }, + { + "type": "attribute", + "tooltip": "Returns the first ancestor of the given type", + "children": [ + { + "type": "joinpoint", + "name": "ancestor" + }, + { + "type": "String", + "name": "joinPointType", + "defaultValue": "" + }] + }, { "type": "attribute", "tooltip": "The ast corresponding to this join point", @@ -5551,37 +5631,25 @@ }, { "type": "attribute", - "tooltip": "Returns the 'file' joinpoint", - "children": [ - { - "type": "joinpoint", - "name": "file" - }] - }, - { - "type": "attribute", - "tooltip": "Returns the first ancestor of the given type", + "tooltip": "Returns the value of the given field", "children": [ { - "type": "joinpoint", - "name": "getAncestor" + "type": "Object", + "name": "field" }, { "type": "String", - "name": "joinPointType" + "name": "fieldName", + "defaultValue": "" }] }, { "type": "attribute", - "tooltip": "Returns the value of the given field", + "tooltip": "Returns the 'file' joinpoint", "children": [ { - "type": "Object", - "name": "getField" - }, - { - "type": "String", - "name": "fieldName" + "type": "joinpoint", + "name": "file" }] }, { diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java index 4fbdc90..a0e08d5 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/AJackdawWeaverJoinPoint.java @@ -73,7 +73,7 @@ public AJoinPoint getParentImpl() { } @Override - public AJoinPoint getAncestorImpl(String joinPointType) { + public AJoinPoint ancestorImpl(String joinPointType) { AJoinPoint currentParent = getParentImpl(); while (currentParent != null) { if (currentParent.instanceOf(joinPointType)) { @@ -117,7 +117,7 @@ public AJoinPoint[] insertImpl(String position, JoinPoint JoinPoint) { } @Override - public Object getFieldImpl(String fieldName) { + public Object fieldImpl(String fieldName) { JsonElement field = getNode().get(fieldName); if (field.isJsonObject() && field.getAsJsonObject().has("type")) { return JoinpointCreator.create(field.getAsJsonObject()); diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java index fa0e712..f73ecb5 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AAssignmentExpression.java @@ -140,21 +140,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -202,6 +193,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum AssignmentExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java index a7ee71a..fb6a1a5 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABinaryExpression.java @@ -140,21 +140,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -202,6 +193,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum BinaryExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java index 365f790..f1b6587 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABlockStatement.java @@ -96,21 +96,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aStatement.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aStatement.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aStatement.ancestorImpl(joinPointType); } /** @@ -158,6 +149,15 @@ public AJoinPoint getFileImpl() { return this.aStatement.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aStatement.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -292,13 +292,13 @@ protected enum BlockStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java index 9fc0fbd..179b343 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ABreakStatement.java @@ -81,13 +81,13 @@ protected enum BreakStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java index 90d9b75..0d84320 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACallExpression.java @@ -150,21 +150,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -212,6 +203,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -342,13 +342,13 @@ protected enum CallExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java index 80dd48b..f2d5df5 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ACatchClause.java @@ -121,13 +121,13 @@ protected enum CatchClauseAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java index 067352e..f50e0ce 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassBody.java @@ -94,13 +94,13 @@ protected enum ClassBodyAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java index f1ba676..a7553be 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AClassDeclaration.java @@ -146,13 +146,13 @@ protected enum ClassDeclarationAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java index 140e656..1384349 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AContinueStatement.java @@ -81,13 +81,13 @@ protected enum ContinueStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java index 01b705b..270ff3d 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclaration.java @@ -121,13 +121,13 @@ protected enum DeclarationAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java index 7c8e967..0365acf 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADeclarator.java @@ -174,13 +174,13 @@ protected enum DeclaratorAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java index 613d117..c0e9876 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ADoWhileStatement.java @@ -5,7 +5,6 @@ import org.lara.interpreter.exception.AttributeException; import java.util.List; import org.lara.interpreter.weaver.interf.SelectOp; -import pt.up.fe.specs.jackdaw.enums.LoopKind; import org.lara.interpreter.weaver.interf.JoinPoint; import java.util.stream.Collectors; import java.util.Arrays; @@ -63,7 +62,7 @@ public List selectBlockStatement() { * @return the attribute's value */ @Override - public LoopKind getKindImpl() { + public String getKindImpl() { return this.aLoop.getKindImpl(); } @@ -131,21 +130,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aLoop.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aLoop.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aLoop.ancestorImpl(joinPointType); } /** @@ -193,6 +183,15 @@ public AJoinPoint getFileImpl() { return this.aLoop.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aLoop.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -326,13 +325,13 @@ protected enum DoWhileStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java index 055be7c..43fd8e6 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpression.java @@ -81,13 +81,13 @@ protected enum ExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java index a1d38d9..5ed748e 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AExpressionStatement.java @@ -157,13 +157,13 @@ protected enum ExpressionStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java index 8590977..4191914 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFile.java @@ -146,13 +146,13 @@ protected enum FileAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java index 10af27d..09d325a 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AForStatement.java @@ -5,7 +5,6 @@ import org.lara.interpreter.exception.AttributeException; import java.util.List; import org.lara.interpreter.weaver.interf.SelectOp; -import pt.up.fe.specs.jackdaw.enums.LoopKind; import org.lara.interpreter.weaver.interf.JoinPoint; import java.util.stream.Collectors; import java.util.Arrays; @@ -109,7 +108,7 @@ public List selectBlockStatement() { * @return the attribute's value */ @Override - public LoopKind getKindImpl() { + public String getKindImpl() { return this.aLoop.getKindImpl(); } @@ -177,21 +176,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aLoop.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aLoop.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aLoop.ancestorImpl(joinPointType); } /** @@ -239,6 +229,15 @@ public AJoinPoint getFileImpl() { return this.aLoop.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aLoop.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -376,13 +375,13 @@ protected enum ForStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java index b7e8900..c365f92 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionDeclaration.java @@ -313,13 +313,13 @@ protected enum FunctionDeclarationAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java index c16993c..e3e9292 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AFunctionExpression.java @@ -205,21 +205,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -267,6 +258,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -405,13 +405,13 @@ protected enum FunctionExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java index e6e043d..c7ed96e 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIdentifier.java @@ -150,13 +150,13 @@ protected enum IdentifierAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java index 5902451..6adeadb 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AIfStatement.java @@ -133,13 +133,13 @@ protected enum IfStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java index 4050ed8..390183b 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AJoinPoint.java @@ -66,9 +66,9 @@ protected void fillWithAttributes(List attributes) { attributes.add("root"); attributes.add("file"); attributes.add("parent"); - attributes.add("getAncestor(String joinPointType)"); + attributes.add("ancestor(String joinPointType)"); attributes.add("type"); - attributes.add("getField(String fieldName)"); + attributes.add("field(String fieldName)"); attributes.add("joinPointName"); attributes.add("ast"); attributes.add("children"); @@ -153,25 +153,25 @@ public final Object getParent() { * @param joinPointType * @return */ - public abstract AJoinPoint getAncestorImpl(String joinPointType); + public abstract AJoinPoint ancestorImpl(String joinPointType); /** * * @param joinPointType * @return */ - public final Object getAncestor(String joinPointType) { + public final Object ancestor(String joinPointType) { try { if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.BEGIN, this, "getAncestor", Optional.empty(), joinPointType); + eventTrigger().triggerAttribute(Stage.BEGIN, this, "ancestor", Optional.empty(), joinPointType); } - AJoinPoint result = this.getAncestorImpl(joinPointType); + AJoinPoint result = this.ancestorImpl(joinPointType); if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.END, this, "getAncestor", Optional.ofNullable(result), joinPointType); + eventTrigger().triggerAttribute(Stage.END, this, "ancestor", Optional.ofNullable(result), joinPointType); } return result!=null?result:getUndefinedValue(); } catch(Exception e) { - throw new AttributeException(get_class(), "getAncestor", e); + throw new AttributeException(get_class(), "ancestor", e); } } @@ -203,25 +203,25 @@ public final Object getType() { * @param fieldName * @return */ - public abstract Object getFieldImpl(String fieldName); + public abstract Object fieldImpl(String fieldName); /** * * @param fieldName * @return */ - public final Object getField(String fieldName) { + public final Object field(String fieldName) { try { if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.BEGIN, this, "getField", Optional.empty(), fieldName); + eventTrigger().triggerAttribute(Stage.BEGIN, this, "field", Optional.empty(), fieldName); } - Object result = this.getFieldImpl(fieldName); + Object result = this.fieldImpl(fieldName); if(hasListeners()) { - eventTrigger().triggerAttribute(Stage.END, this, "getField", Optional.ofNullable(result), fieldName); + eventTrigger().triggerAttribute(Stage.END, this, "field", Optional.ofNullable(result), fieldName); } return result!=null?result:getUndefinedValue(); } catch(Exception e) { - throw new AttributeException(get_class(), "getField", e); + throw new AttributeException(get_class(), "field", e); } } diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java index 63a7fe0..26a987d 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALiteral.java @@ -108,13 +108,13 @@ protected enum LiteralAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java index 2fba85b..71414b5 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ALoop.java @@ -1,6 +1,5 @@ package pt.up.fe.specs.jackdaw.abstracts.joinpoints; -import pt.up.fe.specs.jackdaw.enums.LoopKind; import org.lara.interpreter.weaver.interf.events.Stage; import java.util.Optional; import org.lara.interpreter.exception.AttributeException; @@ -22,7 +21,7 @@ public abstract class ALoop extends AJackdawWeaverJoinPoint { /** * The kind of the loop */ - public abstract LoopKind getKindImpl(); + public abstract String getKindImpl(); /** * The kind of the loop @@ -32,7 +31,7 @@ public final Object getKind() { if(hasListeners()) { eventTrigger().triggerAttribute(Stage.BEGIN, this, "kind", Optional.empty()); } - LoopKind result = this.getKindImpl(); + String result = this.getKindImpl(); if(hasListeners()) { eventTrigger().triggerAttribute(Stage.END, this, "kind", Optional.ofNullable(result)); } @@ -159,13 +158,13 @@ protected enum LoopAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java index e9c31de..53a9d50 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMemberExpression.java @@ -140,21 +140,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -202,6 +193,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum MemberExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java index 9ca7a36..ab36527 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AMethodDefinition.java @@ -196,13 +196,13 @@ protected enum MethodDefinitionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java index 4a3aa5d..93b0837 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AProject.java @@ -94,13 +94,13 @@ protected enum ProjectAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java index 796d69e..6460c2c 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AScope.java @@ -370,13 +370,13 @@ protected enum ScopeAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java index 60a34bd..4de53a0 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AStatement.java @@ -106,13 +106,13 @@ protected enum StatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java index 5c8b09a..50220de 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchCase.java @@ -121,13 +121,13 @@ protected enum SwitchCaseAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java index 1453dcf..406cd2b 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ASwitchStatement.java @@ -133,13 +133,13 @@ protected enum SwitchStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java index c8fdb05..7ec9cc6 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AThisExpression.java @@ -69,21 +69,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -131,6 +122,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -255,13 +255,13 @@ protected enum ThisExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java index a94c450..ca41761 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/ATryStatement.java @@ -118,13 +118,13 @@ protected enum TryStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java index c9952d8..b480e91 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AUpdateExpression.java @@ -140,21 +140,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aExpression.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aExpression.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aExpression.ancestorImpl(joinPointType); } /** @@ -202,6 +193,15 @@ public AJoinPoint getFileImpl() { return this.aExpression.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aExpression.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -332,13 +332,13 @@ protected enum UpdateExpressionAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java index 9881371..057cba7 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/joinpoints/AWhileStatement.java @@ -5,7 +5,6 @@ import org.lara.interpreter.exception.AttributeException; import java.util.List; import org.lara.interpreter.weaver.interf.SelectOp; -import pt.up.fe.specs.jackdaw.enums.LoopKind; import org.lara.interpreter.weaver.interf.JoinPoint; import java.util.stream.Collectors; import java.util.Arrays; @@ -63,7 +62,7 @@ public List selectBlockStatement() { * @return the attribute's value */ @Override - public LoopKind getKindImpl() { + public String getKindImpl() { return this.aLoop.getKindImpl(); } @@ -131,21 +130,12 @@ public Integer getLineImpl() { } /** - * Get value on attribute getAncestor + * Get value on attribute ancestor * @return the attribute's value */ @Override - public AJoinPoint getAncestorImpl(String joinPointType) { - return this.aLoop.getAncestorImpl(joinPointType); - } - - /** - * Get value on attribute getField - * @return the attribute's value - */ - @Override - public Object getFieldImpl(String fieldName) { - return this.aLoop.getFieldImpl(fieldName); + public AJoinPoint ancestorImpl(String joinPointType) { + return this.aLoop.ancestorImpl(joinPointType); } /** @@ -193,6 +183,15 @@ public AJoinPoint getFileImpl() { return this.aLoop.getFileImpl(); } + /** + * Get value on attribute field + * @return the attribute's value + */ + @Override + public Object fieldImpl(String fieldName) { + return this.aLoop.fieldImpl(fieldName); + } + /** * Get value on attribute childrenArrayImpl * @return the attribute's value @@ -326,13 +325,13 @@ protected enum WhileStatementAttributes { AST("ast"), CODE("code"), LINE("line"), - GETANCESTOR("getAncestor"), - GETFIELD("getField"), + ANCESTOR("ancestor"), COLUMN("column"), TYPE("type"), DESCENDANTS("descendants"), UUID("uuid"), FILE("file"), + FIELD("field"), CHILDREN("children"), ROOT("root"); private String name; diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsDoWhileStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsDoWhileStatement.java index b3addf0..a3b6c62 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsDoWhileStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsDoWhileStatement.java @@ -26,8 +26,8 @@ public JsonObject getNode() { } @Override - public LoopKind getKindImpl() { - return LoopKind.DO; + public String getKindImpl() { + return LoopKind.DO.getName(); } diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsForStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsForStatement.java index 5f73ef1..2dc8b0c 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsForStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsForStatement.java @@ -45,8 +45,8 @@ public JsonObject getNode() { } @Override - public LoopKind getKindImpl() { - return LoopKind.FOR; + public String getKindImpl() { + return LoopKind.FOR.getString(); } } diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsLoop.java b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsLoop.java index de94289..e6df572 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsLoop.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsLoop.java @@ -30,7 +30,7 @@ public JsonObject getNode() { } @Override - public LoopKind getKindImpl() { + public String getKindImpl() { throw new NotImplementedException(this); } diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsWhileStatement.java b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsWhileStatement.java index e96e047..ac86b25 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsWhileStatement.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/joinpoints/statements/JsWhileStatement.java @@ -26,8 +26,8 @@ public JsonObject getNode() { } @Override - public LoopKind getKindImpl() { - return LoopKind.WHILE; + public String getKindImpl() { + return LoopKind.WHILE.getName(); } } From c7eaafa50121f843bd5fb5588b6c8e5395f0c843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Tue, 23 Jul 2024 16:01:40 +0100 Subject: [PATCH 05/16] Adds GitHub action for branch lara-2.0-legacy --- .github/workflows/ant-lara-2.0-legacy.yml | 62 +++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/ant-lara-2.0-legacy.yml diff --git a/.github/workflows/ant-lara-2.0-legacy.yml b/.github/workflows/ant-lara-2.0-legacy.yml new file mode 100644 index 0000000..45f7351 --- /dev/null +++ b/.github/workflows/ant-lara-2.0-legacy.yml @@ -0,0 +1,62 @@ +# This workflow will build a Java project with Ant +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant + +name: Java CI - Lara 2.0 Legacy + +on: + push: + branches: [ lara-2.0-legacy ] + pull_request: + branches: [ lara-2.0-legacy ] + + # Weekly on Monday at midnight + schedule: + - cron: '0 0 * * 1' + +permissions: + checks: write + +jobs: + build: + + runs-on: ubuntu-latest + + + steps: + - uses: actions/checkout@v3 + + - name: Cache ivy dependencies + id: cache-nivy + uses: actions/cache@v3 + env: + cache-name: cache-ivy-dependencies + with: + # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS + path: ~/.ivy2 + key: ${{ runner.os }}-build-${{ env.cache-name }} + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + - name: Generate build.xml + run: | + wget -N http://specs.fe.up.pt/tools/eclipse-build.jar + java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework ./ + wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar + - name: Build with Ant + run: | + ant -noinput -buildfile build.xml + #- name: Copy test results + # run: | + # Tried relative paths (not supported by junit action) and symlinks (are not followed by glob) + # Resorted to copying the tests to a folder in the repo folder + # cp -a reports-eclipse-build/. jsweaver/junit-reports/ + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3.0.1 + if: always() # always run even if the previous step fails + with: + report_paths: '**/reports-eclipse-build/TEST-*.xml' + summary: true + #exclude_sources: '' From 33e38b0684a92d052f53f3875733492482014b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Tue, 23 Jul 2024 17:23:01 +0100 Subject: [PATCH 06/16] Updates workflows to use Java 17, main also has scheduled run --- .github/workflows/ant-lara-2.0-legacy.yml | 4 ++-- .github/workflows/ant-main.yml | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ant-lara-2.0-legacy.yml b/.github/workflows/ant-lara-2.0-legacy.yml index 45f7351..efae94d 100644 --- a/.github/workflows/ant-lara-2.0-legacy.yml +++ b/.github/workflows/ant-lara-2.0-legacy.yml @@ -35,10 +35,10 @@ jobs: path: ~/.ivy2 key: ${{ runner.os }}-build-${{ env.cache-name }} - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'temurin' - name: Generate build.xml run: | diff --git a/.github/workflows/ant-main.yml b/.github/workflows/ant-main.yml index 16b5b11..d285ee2 100644 --- a/.github/workflows/ant-main.yml +++ b/.github/workflows/ant-main.yml @@ -9,6 +9,10 @@ on: pull_request: branches: [ master ] + # Weekly on Monday at midnight + schedule: + - cron: '0 0 * * 1' + permissions: checks: write @@ -31,10 +35,10 @@ jobs: path: ~/.ivy2 key: ${{ runner.os }}-build-${{ env.cache-name }} - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '17' distribution: 'temurin' - name: Generate build.xml run: | From cb78d778d06c49a68bf5b91cef01bdd99569299d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Wed, 24 Jul 2024 11:01:00 +0100 Subject: [PATCH 07/16] Fixes GitHub actions --- .github/workflows/ant-lara-2.0-legacy.yml | 6 +++--- .github/workflows/ant-main.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ant-lara-2.0-legacy.yml b/.github/workflows/ant-lara-2.0-legacy.yml index efae94d..c2fb6bc 100644 --- a/.github/workflows/ant-lara-2.0-legacy.yml +++ b/.github/workflows/ant-lara-2.0-legacy.yml @@ -9,9 +9,9 @@ on: pull_request: branches: [ lara-2.0-legacy ] - # Weekly on Monday at midnight + # Daily at midnight schedule: - - cron: '0 0 * * 1' + - cron: '0 0 * * *' permissions: checks: write @@ -43,7 +43,7 @@ jobs: - name: Generate build.xml run: | wget -N http://specs.fe.up.pt/tools/eclipse-build.jar - java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework ./ + java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=lara-2.0-legacy ./ wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar - name: Build with Ant run: | diff --git a/.github/workflows/ant-main.yml b/.github/workflows/ant-main.yml index d285ee2..3bf1d10 100644 --- a/.github/workflows/ant-main.yml +++ b/.github/workflows/ant-main.yml @@ -9,9 +9,9 @@ on: pull_request: branches: [ master ] - # Weekly on Monday at midnight + # Daily at midnight schedule: - - cron: '0 0 * * 1' + - cron: '0 0 * * *' permissions: checks: write @@ -43,7 +43,7 @@ jobs: - name: Generate build.xml run: | wget -N http://specs.fe.up.pt/tools/eclipse-build.jar - java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework ./ + java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=staging ./ wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar - name: Build with Ant run: | From bad3d3347a50ab86dbfea075e6aaa47ae7a0f27f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Fri, 2 Aug 2024 14:54:33 +0100 Subject: [PATCH 08/16] Adds support for Gradle build system --- .gitignore | 4 + jsAst/build.gradle | 41 ++ jsAst/settings.gradle | 4 + jsweaver/build.gradle | 81 ++++ .../jackdaw/specs/actionModel.xml | 32 +- .../jackdaw/specs/artifacts.xml | 346 ++++++++--------- .../jackdaw/specs/joinPointModel.xml | 358 +++++++++--------- jsweaver/settings.gradle | 15 + .../pt/up/fe/specs/jackdaw/JackdawWeaver.png | Bin 132522 -> 89701 bytes .../pt/up/fe/specs/jackdaw/JackdawWeaver.svg | 276 +++++++------- .../abstracts/weaver/AJackdawWeaver.java | 4 +- jsweaverTasks/build.gradle | 43 +++ jsweaverTasks/settings.gradle | 20 + 13 files changed, 716 insertions(+), 508 deletions(-) create mode 100644 jsAst/build.gradle create mode 100644 jsAst/settings.gradle create mode 100644 jsweaver/build.gradle rename jsweaver/{src => resources}/jackdaw/specs/actionModel.xml (97%) rename jsweaver/{src => resources}/jackdaw/specs/artifacts.xml (97%) rename jsweaver/{src => resources}/jackdaw/specs/joinPointModel.xml (95%) create mode 100644 jsweaver/settings.gradle create mode 100644 jsweaverTasks/build.gradle create mode 100644 jsweaverTasks/settings.gradle diff --git a/.gitignore b/.gitignore index 42749cf..6bc835c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ bin/ +### Gradle +**/.gradle/** +**/build/** + ### Default folder for executing applications **/run/** !**/run/*.launch diff --git a/jsAst/build.gradle b/jsAst/build.gradle new file mode 100644 index 0000000..10fd283 --- /dev/null +++ b/jsAst/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'distribution' +} + +// Java project +apply plugin: 'java' + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + + +// Repositories providers +repositories { + mavenCentral() +} + +dependencies { + implementation "junit:junit:4.11" + + implementation ':JsEngine' + implementation ':SpecsUtils' + + implementation group: 'com.google.code.gson', name: 'gson', version: '2.4' +} + +java { + withSourcesJar() +} + +// Project sources +sourceSets { + main { + java { + srcDir 'src' + } + + } + +} diff --git a/jsAst/settings.gradle b/jsAst/settings.gradle new file mode 100644 index 0000000..dae3dcf --- /dev/null +++ b/jsAst/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = 'jsAst' + +includeBuild("../../specs-java-libs/JsEngine") +includeBuild("../../specs-java-libs/SpecsUtils") diff --git a/jsweaver/build.gradle b/jsweaver/build.gradle new file mode 100644 index 0000000..40db5ea --- /dev/null +++ b/jsweaver/build.gradle @@ -0,0 +1,81 @@ +plugins { + id 'distribution' +} + +// Java project +apply plugin: 'java' + +// Executable +apply plugin: 'application' + + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + + +// Repositories providers +repositories { + // Gearman + maven { url "https://oss.sonatype.org/content/repositories/snapshots"} + + mavenCentral() +} +dependencies { + implementation "junit:junit:4.11" + + + implementation ':jOptions' + implementation ':JsEngine' + implementation ':SpecsUtils' + + implementation ':LanguageSpecification' + implementation ':LaraCommonLanguageApi' + implementation ':LaraDoc' + implementation ':LaraFramework' + implementation ':LARAI' + implementation ':LaraUtils' + implementation ':WeaverInterface' + + implementation ':jsAst' + + implementation group: 'com.google.code.gson', name: 'gson', version: '2.4' + implementation group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0.1' +} + +java { + withSourcesJar() +} + +// Project sources +sourceSets { + main { + java { + srcDir 'src' + } + + resources { + srcDir 'lara-lara' + srcDir 'lara-jackdaw' + srcDir 'resources' + } + } + + test { + java { + srcDir 'test' + } + + resources { + srcDir 'lara-lara' + srcDir 'lara-jackdaw' + srcDir 'resources' + } + } +} + +application { + mainClass.set("pt.up.fe.specs.jackdaw.JackdawLauncher") +} + diff --git a/jsweaver/src/jackdaw/specs/actionModel.xml b/jsweaver/resources/jackdaw/specs/actionModel.xml similarity index 97% rename from jsweaver/src/jackdaw/specs/actionModel.xml rename to jsweaver/resources/jackdaw/specs/actionModel.xml index 7247422..8d34be1 100644 --- a/jsweaver/src/jackdaw/specs/actionModel.xml +++ b/jsweaver/resources/jackdaw/specs/actionModel.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jsweaver/src/jackdaw/specs/artifacts.xml b/jsweaver/resources/jackdaw/specs/artifacts.xml similarity index 97% rename from jsweaver/src/jackdaw/specs/artifacts.xml rename to jsweaver/resources/jackdaw/specs/artifacts.xml index 1a9a005..37f3744 100644 --- a/jsweaver/src/jackdaw/specs/artifacts.xml +++ b/jsweaver/resources/jackdaw/specs/artifacts.xml @@ -1,174 +1,174 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jsweaver/src/jackdaw/specs/joinPointModel.xml b/jsweaver/resources/jackdaw/specs/joinPointModel.xml similarity index 95% rename from jsweaver/src/jackdaw/specs/joinPointModel.xml rename to jsweaver/resources/jackdaw/specs/joinPointModel.xml index 933dc25..db0cc48 100644 --- a/jsweaver/src/jackdaw/specs/joinPointModel.xml +++ b/jsweaver/resources/jackdaw/specs/joinPointModel.xml @@ -1,180 +1,180 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jsweaver/settings.gradle b/jsweaver/settings.gradle new file mode 100644 index 0000000..bad314b --- /dev/null +++ b/jsweaver/settings.gradle @@ -0,0 +1,15 @@ +rootProject.name = 'jsweaver' + +includeBuild("../../specs-java-libs/jOptions") +includeBuild("../../specs-java-libs/JsEngine") +includeBuild("../../specs-java-libs/SpecsUtils") + +includeBuild("../../lara-framework/LanguageSpecification") +includeBuild("../../lara-framework/LaraCommonLanguageApi") +includeBuild("../../lara-framework/LaraDoc") +includeBuild("../../lara-framework/LaraFramework") +includeBuild("../../lara-framework/LARAI") +includeBuild("../../lara-framework/LaraUtils") +includeBuild("../../lara-framework/WeaverInterface") + +includeBuild("../../jsweaver/jsAst") \ No newline at end of file diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.png b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.png index 7f9c85562a9b8f12bfef67b0e0a5395b23351266..c46e4617f8a1fcf1e69b4b8e4c18901d830150bd 100644 GIT binary patch literal 89701 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 c?~L%KCY?mJULTDu#S5y?bEXhn0g7h=H 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 N0#8>zmvv4FO#nO73eW%m diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.svg b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.svg index 327f7cb..7c99957 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.svg +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/JackdawWeaver.svg @@ -1,415 +1,415 @@ - - + JackdawWeaver_join_point_hierarchy_join_point_hierarchy - + assignmentExpression - -assignmentExpression + +assignmentExpression expression - -expression + +expression assignmentExpression->expression - - + + joinpoint - -joinpoint + +joinpoint expression->joinpoint - - + + binaryExpression - -binaryExpression + +binaryExpression binaryExpression->expression - - + + blockStatement - -blockStatement + +blockStatement statement - -statement + +statement blockStatement->statement - - + + statement->joinpoint - - + + breakStatement - -breakStatement + +breakStatement breakStatement->joinpoint - - + + callExpression - -callExpression + +callExpression callExpression->expression - - + + catchClause - -catchClause + +catchClause catchClause->joinpoint - - + + classBody - -classBody + +classBody classBody->joinpoint - - + + classDeclaration - -classDeclaration + +classDeclaration classDeclaration->joinpoint - - + + continueStatement - -continueStatement + +continueStatement continueStatement->joinpoint - - + + declaration - -declaration + +declaration declaration->joinpoint - - + + declarator - -declarator + +declarator declarator->joinpoint - - + + doWhileStatement - -doWhileStatement + +doWhileStatement loop - -loop + +loop doWhileStatement->loop - - + + loop->joinpoint - - + + expressionStatement - -expressionStatement + +expressionStatement expressionStatement->joinpoint - - + + file - -file + +file file->joinpoint - - + + forStatement - -forStatement + +forStatement forStatement->loop - - + + functionDeclaration - -functionDeclaration + +functionDeclaration functionDeclaration->joinpoint - - + + functionExpression - -functionExpression + +functionExpression functionExpression->expression - - + + identifier - -identifier + +identifier identifier->joinpoint - - + + ifStatement - -ifStatement + +ifStatement ifStatement->joinpoint - - + + literal - -literal + +literal literal->joinpoint - - + + memberExpression - -memberExpression + +memberExpression memberExpression->expression - - + + methodDefinition - -methodDefinition + +methodDefinition methodDefinition->joinpoint - - + + project - -project + +project project->joinpoint - - + + scope - -scope + +scope scope->joinpoint - - + + switchCase - -switchCase + +switchCase switchCase->joinpoint - - + + switchStatement - -switchStatement + +switchStatement switchStatement->joinpoint - - + + thisExpression - -thisExpression + +thisExpression thisExpression->expression - - + + tryStatement - -tryStatement + +tryStatement tryStatement->joinpoint - - + + updateExpression - -updateExpression + +updateExpression updateExpression->expression - - + + whileStatement - -whileStatement + +whileStatement whileStatement->loop - - + + diff --git a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/weaver/AJackdawWeaver.java b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/weaver/AJackdawWeaver.java index 5b6d601..d412426 100644 --- a/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/weaver/AJackdawWeaver.java +++ b/jsweaver/src/pt/up/fe/specs/jackdaw/abstracts/weaver/AJackdawWeaver.java @@ -8,8 +8,8 @@ /** * Abstract Weaver Implementation for JackdawWeaver
- * Since the generated abstract classes are always overwritten, their implementation should be done by extending those abstract classes with user-defined classes.
- * The abstract class {@link pt.up.fe.specs.jackdaw.abstracts.AJackdawWeaverJoinPoint} can be used to add user-defined methods and fields which the user intends to add for all join points and are not intended to be used in LARA aspects. +Since the generated abstract classes are always overwritten, their implementation should be done by extending those abstract classes with user-defined classes.
+The abstract class {@link pt.up.fe.specs.jackdaw.abstracts.AJackdawWeaverJoinPoint} can be used to add user-defined methods and fields which the user intends to add for all join points and are not intended to be used in LARA aspects. * The implementation of the abstract methods is mandatory! * @author Lara C. */ diff --git a/jsweaverTasks/build.gradle b/jsweaverTasks/build.gradle new file mode 100644 index 0000000..5867d52 --- /dev/null +++ b/jsweaverTasks/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'distribution' +} + +// Java project +apply plugin: 'java' + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + + +// Repositories providers +repositories { + // Gearman + maven { url "https://oss.sonatype.org/content/repositories/snapshots"} + + mavenCentral() +} + +dependencies { + implementation ":WeaverGenerator" +} + + +// Weaver Generator +task weaverGenerator(type: JavaExec) { + group = "Execution" + description = "Generates the join point classes from the Language Specification" + classpath = sourceSets.main.runtimeClasspath + mainClass = 'org.lara.interpreter.weaver.generator.commandline.WeaverGenerator' + args = [ + '-w', 'JackdawWeaver', + '-x', '../jsweaver/src/jackdaw/specs', + '-o', '../jsweaver/src', + '-p', 'pt.up.fe.specs.jackdaw', + '-n', 'com.google.gson.JsonObject', + '-j', + '-e', + '-d' + ] +} diff --git a/jsweaverTasks/settings.gradle b/jsweaverTasks/settings.gradle new file mode 100644 index 0000000..e6dc418 --- /dev/null +++ b/jsweaverTasks/settings.gradle @@ -0,0 +1,20 @@ +rootProject.name = 'jsweaverTasks' + +includeBuild("../../specs-java-libs/CommonsLangPlus") +includeBuild("../../specs-java-libs/GsonPlus") +includeBuild("../../specs-java-libs/jOptions") +includeBuild("../../specs-java-libs/JsEngine") +includeBuild("../../specs-java-libs/SpecsUtils") +includeBuild("../../specs-java-libs/XStreamPlus") +includeBuild("../../specs-java-libs/tdrcLibrary") + +includeBuild("../../lara-framework/LanguageSpecification") +includeBuild("../../lara-framework/LaraCommonLanguageApi") +includeBuild("../../lara-framework/LaraDoc") +includeBuild("../../lara-framework/LaraFramework") +includeBuild("../../lara-framework/LARAI") +includeBuild("../../lara-framework/LaraLoc") +includeBuild("../../lara-framework/LaraUnit") +includeBuild("../../lara-framework/LaraUtils") +includeBuild("../../lara-framework/WeaverGenerator") +includeBuild("../../lara-framework/WeaverInterface") From c24992ec5da83721644131473c7f278369dd8e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Fri, 2 Aug 2024 15:15:19 +0100 Subject: [PATCH 09/16] Fixes build.gradle, moves resource files to their own folder --- jsAst/build.gradle | 33 +- .../esprima/escodegen.browser.js | 10162 ++++++------ .../esprima/esprima-walk.js | 60 +- jsAst/{src => resources}/esprima/esprima.js | 13416 ++++++++-------- .../javascript/generateJavascript.js | 10 +- .../javascript/parseJavascript.js | 26 +- jsAst/src/libraries/gson-2.6.2.jar | Bin 229650 -> 0 bytes 7 files changed, 11856 insertions(+), 11851 deletions(-) rename jsAst/{src => resources}/esprima/escodegen.browser.js (97%) rename jsAst/{src => resources}/esprima/esprima-walk.js (95%) rename jsAst/{src => resources}/esprima/esprima.js (97%) rename jsAst/{src => resources}/javascript/generateJavascript.js (96%) rename jsAst/{src => resources}/javascript/parseJavascript.js (95%) delete mode 100644 jsAst/src/libraries/gson-2.6.2.jar diff --git a/jsAst/build.gradle b/jsAst/build.gradle index 10fd283..5b26a66 100644 --- a/jsAst/build.gradle +++ b/jsAst/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'distribution' + id 'distribution' } // Java project @@ -17,25 +17,30 @@ repositories { } dependencies { - implementation "junit:junit:4.11" - - implementation ':JsEngine' - implementation ':SpecsUtils' + implementation "junit:junit:4.11" - implementation group: 'com.google.code.gson', name: 'gson', version: '2.4' + implementation ':JsEngine' + implementation ':SpecsUtils' + + implementation group: 'com.google.code.gson', name: 'gson', version: '2.4' } java { - withSourcesJar() + withSourcesJar() } // Project sources sourceSets { - main { - java { - srcDir 'src' - } - - } - + main { + java { + srcDir 'src' + } + + resources { + srcDir 'resources' + } + + } + + } diff --git a/jsAst/src/esprima/escodegen.browser.js b/jsAst/resources/esprima/escodegen.browser.js similarity index 97% rename from jsAst/src/esprima/escodegen.browser.js rename to jsAst/resources/esprima/escodegen.browser.js index 0c80704..d4356f3 100644 --- a/jsAst/src/esprima/escodegen.browser.js +++ b/jsAst/resources/esprima/escodegen.browser.js @@ -1,5081 +1,5081 @@ -// Generated by CommonJS Everywhere 0.9.7 -(function (global) { - function require(file, parentModule) { - if ({}.hasOwnProperty.call(require.cache, file)) - return require.cache[file]; - var resolved = require.resolve(file); - if (!resolved) - throw new Error('Failed to resolve module ' + file); - var module$ = { - id: file, - require: require, - filename: file, - exports: {}, - loaded: false, - parent: parentModule, - children: [] - }; - if (parentModule) - parentModule.children.push(module$); - var dirname = file.slice(0, file.lastIndexOf('/') + 1); - require.cache[file] = module$.exports; - resolved.call(module$.exports, module$, module$.exports, dirname, file); - module$.loaded = true; - return require.cache[file] = module$.exports; - } - require.modules = {}; - require.cache = {}; - require.resolve = function (file) { - return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0; - }; - require.define = function (file, fn) { - require.modules[file] = fn; - }; - var process = function () { - var cwd = '/'; - return { - title: 'browser', - version: 'v10.11.0', - browser: true, - env: {}, - argv: [], - nextTick: global.setImmediate || function (fn) { - setTimeout(fn, 0); - }, - cwd: function () { - return cwd; - }, - chdir: function (dir) { - cwd = dir; - } - }; - }(); - require.define('/tools/entry-point.js', function (module, exports, __dirname, __filename) { - (function () { - 'use strict'; - global.escodegen = require('/escodegen.js', module); - escodegen.browser = true; - }()); - }); - require.define('/escodegen.js', function (module, exports, __dirname, __filename) { - (function () { - 'use strict'; - var Syntax, Precedence, BinaryPrecedence, SourceNode, estraverse, esutils, base, indent, json, renumber, hexadecimal, quotes, escapeless, newline, space, parentheses, semicolons, safeConcatenation, directive, extra, parse, sourceMap, sourceCode, preserveBlankLines, FORMAT_MINIFY, FORMAT_DEFAULTS; - estraverse = require('/node_modules/estraverse/estraverse.js', module); - esutils = require('/node_modules/esutils/lib/utils.js', module); - Syntax = estraverse.Syntax; - function isExpression(node) { - return CodeGenerator.Expression.hasOwnProperty(node.type); - } - function isStatement(node) { - return CodeGenerator.Statement.hasOwnProperty(node.type); - } - Precedence = { - Sequence: 0, - Yield: 1, - Assignment: 1, - Conditional: 2, - ArrowFunction: 2, - LogicalOR: 3, - LogicalAND: 4, - BitwiseOR: 5, - BitwiseXOR: 6, - BitwiseAND: 7, - Equality: 8, - Relational: 9, - BitwiseSHIFT: 10, - Additive: 11, - Multiplicative: 12, - Await: 13, - Unary: 13, - Postfix: 14, - Call: 15, - New: 16, - TaggedTemplate: 17, - Member: 18, - Primary: 19 - }; - BinaryPrecedence = { - '||': Precedence.LogicalOR, - '&&': Precedence.LogicalAND, - '|': Precedence.BitwiseOR, - '^': Precedence.BitwiseXOR, - '&': Precedence.BitwiseAND, - '==': Precedence.Equality, - '!=': Precedence.Equality, - '===': Precedence.Equality, - '!==': Precedence.Equality, - 'is': Precedence.Equality, - 'isnt': Precedence.Equality, - '<': Precedence.Relational, - '>': Precedence.Relational, - '<=': Precedence.Relational, - '>=': Precedence.Relational, - 'in': Precedence.Relational, - 'instanceof': Precedence.Relational, - '<<': Precedence.BitwiseSHIFT, - '>>': Precedence.BitwiseSHIFT, - '>>>': Precedence.BitwiseSHIFT, - '+': Precedence.Additive, - '-': Precedence.Additive, - '*': Precedence.Multiplicative, - '%': Precedence.Multiplicative, - '/': Precedence.Multiplicative - }; - var F_ALLOW_IN = 1, F_ALLOW_CALL = 1 << 1, F_ALLOW_UNPARATH_NEW = 1 << 2, F_FUNC_BODY = 1 << 3, F_DIRECTIVE_CTX = 1 << 4, F_SEMICOLON_OPT = 1 << 5; - var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW, E_TTF = F_ALLOW_IN | F_ALLOW_CALL, E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW, E_TFF = F_ALLOW_IN, E_FFT = F_ALLOW_UNPARATH_NEW, E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW; - var S_TFFF = F_ALLOW_IN, S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT, S_FFFF = 0, S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX, S_TTFF = F_ALLOW_IN | F_FUNC_BODY; - function getDefaultOptions() { - return { - indent: null, - base: null, - parse: null, - comment: false, - format: { - indent: { - style: ' ', - base: 0, - adjustMultilineComment: false - }, - newline: '\n', - space: ' ', - json: false, - renumber: false, - hexadecimal: false, - quotes: 'single', - escapeless: false, - compact: false, - parentheses: true, - semicolons: true, - safeConcatenation: false, - preserveBlankLines: false - }, - moz: { - comprehensionExpressionStartsWithAssignment: false, - starlessGenerator: false - }, - sourceMap: null, - sourceMapRoot: null, - sourceMapWithCode: false, - directive: false, - raw: true, - verbatim: null, - sourceCode: null - }; - } - function stringRepeat(str, num) { - var result = ''; - for (num |= 0; num > 0; num >>>= 1, str += str) { - if (num & 1) { - result += str; - } - } - return result; - } - function hasLineTerminator(str) { - return /[\r\n]/g.test(str); - } - function endsWithLineTerminator(str) { - var len = str.length; - return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1)); - } - function merge(target, override) { - var key; - for (key in override) { - if (override.hasOwnProperty(key)) { - target[key] = override[key]; - } - } - return target; - } - function updateDeeply(target, override) { - var key, val; - function isHashObject(target) { - return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp); - } - for (key in override) { - if (override.hasOwnProperty(key)) { - val = override[key]; - if (isHashObject(val)) { - if (isHashObject(target[key])) { - updateDeeply(target[key], val); - } else { - target[key] = updateDeeply({}, val); - } - } else { - target[key] = val; - } - } - } - return target; - } - function generateNumber(value) { - var result, point, temp, exponent, pos; - if (value !== value) { - throw new Error('Numeric literal whose value is NaN'); - } - if (value < 0 || value === 0 && 1 / value < 0) { - throw new Error('Numeric literal whose value is negative'); - } - if (value === 1 / 0) { - return json ? 'null' : renumber ? '1e400' : '1e+400'; - } - result = '' + value; - if (!renumber || result.length < 3) { - return result; - } - point = result.indexOf('.'); - if (!json && result.charCodeAt(0) === 48 && point === 1) { - point = 0; - result = result.slice(1); - } - temp = result; - result = result.replace('e+', 'e'); - exponent = 0; - if ((pos = temp.indexOf('e')) > 0) { - exponent = +temp.slice(pos + 1); - temp = temp.slice(0, pos); - } - if (point >= 0) { - exponent -= temp.length - point - 1; - temp = +(temp.slice(0, point) + temp.slice(point + 1)) + ''; - } - pos = 0; - while (temp.charCodeAt(temp.length + pos - 1) === 48) { - --pos; - } - if (pos !== 0) { - exponent -= pos; - temp = temp.slice(0, pos); - } - if (exponent !== 0) { - temp += 'e' + exponent; - } - if ((temp.length < result.length || hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length) && +temp === value) { - result = temp; - } - return result; - } - function escapeRegExpCharacter(ch, previousIsBackslash) { - if ((ch & ~1) === 8232) { - return (previousIsBackslash ? 'u' : '\\u') + (ch === 8232 ? '2028' : '2029'); - } else if (ch === 10 || ch === 13) { - return (previousIsBackslash ? '' : '\\') + (ch === 10 ? 'n' : 'r'); - } - return String.fromCharCode(ch); - } - function generateRegExp(reg) { - var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash; - result = reg.toString(); - if (reg.source) { - match = result.match(/\/([^\/]*)$/); - if (!match) { - return result; - } - flags = match[1]; - result = ''; - characterInBrack = false; - previousIsBackslash = false; - for (i = 0, iz = reg.source.length; i < iz; ++i) { - ch = reg.source.charCodeAt(i); - if (!previousIsBackslash) { - if (characterInBrack) { - if (ch === 93) { - characterInBrack = false; - } - } else { - if (ch === 47) { - result += '\\'; - } else if (ch === 91) { - characterInBrack = true; - } - } - result += escapeRegExpCharacter(ch, previousIsBackslash); - previousIsBackslash = ch === 92; - } else { - result += escapeRegExpCharacter(ch, previousIsBackslash); - previousIsBackslash = false; - } - } - return '/' + result + '/' + flags; - } - return result; - } - function escapeAllowedCharacter(code, next) { - var hex; - if (code === 8) { - return '\\b'; - } - if (code === 12) { - return '\\f'; - } - if (code === 9) { - return '\\t'; - } - hex = code.toString(16).toUpperCase(); - if (json || code > 255) { - return '\\u' + '0000'.slice(hex.length) + hex; - } else if (code === 0 && !esutils.code.isDecimalDigit(next)) { - return '\\0'; - } else if (code === 11) { - return '\\x0B'; - } else { - return '\\x' + '00'.slice(hex.length) + hex; - } - } - function escapeDisallowedCharacter(code) { - if (code === 92) { - return '\\\\'; - } - if (code === 10) { - return '\\n'; - } - if (code === 13) { - return '\\r'; - } - if (code === 8232) { - return '\\u2028'; - } - if (code === 8233) { - return '\\u2029'; - } - throw new Error('Incorrectly classified character'); - } - function escapeDirective(str) { - var i, iz, code, quote; - quote = quotes === 'double' ? '"' : "'"; - for (i = 0, iz = str.length; i < iz; ++i) { - code = str.charCodeAt(i); - if (code === 39) { - quote = '"'; - break; - } else if (code === 34) { - quote = "'"; - break; - } else if (code === 92) { - ++i; - } - } - return quote + str + quote; - } - function escapeString(str) { - var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote; - for (i = 0, len = str.length; i < len; ++i) { - code = str.charCodeAt(i); - if (code === 39) { - ++singleQuotes; - } else if (code === 34) { - ++doubleQuotes; - } else if (code === 47 && json) { - result += '\\'; - } else if (esutils.code.isLineTerminator(code) || code === 92) { - result += escapeDisallowedCharacter(code); - continue; - } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 32 || !json && !escapeless && (code < 32 || code > 126))) { - result += escapeAllowedCharacter(code, str.charCodeAt(i + 1)); - continue; - } - result += String.fromCharCode(code); - } - single = !(quotes === 'double' || quotes === 'auto' && doubleQuotes < singleQuotes); - quote = single ? "'" : '"'; - if (!(single ? singleQuotes : doubleQuotes)) { - return quote + result + quote; - } - str = result; - result = quote; - for (i = 0, len = str.length; i < len; ++i) { - code = str.charCodeAt(i); - if (code === 39 && single || code === 34 && !single) { - result += '\\'; - } - result += String.fromCharCode(code); - } - return result + quote; - } - function flattenToString(arr) { - var i, iz, elem, result = ''; - for (i = 0, iz = arr.length; i < iz; ++i) { - elem = arr[i]; - result += Array.isArray(elem) ? flattenToString(elem) : elem; - } - return result; - } - function toSourceNodeWhenNeeded(generated, node) { - if (!sourceMap) { - if (Array.isArray(generated)) { - return flattenToString(generated); - } else { - return generated; - } - } - if (node == null) { - if (generated instanceof SourceNode) { - return generated; - } else { - node = {}; - } - } - if (node.loc == null) { - return new SourceNode(null, null, sourceMap, generated, node.name || null); - } - return new SourceNode(node.loc.start.line, node.loc.start.column, sourceMap === true ? node.loc.source || null : sourceMap, generated, node.name || null); - } - function noEmptySpace() { - return space ? space : ' '; - } - function join(left, right) { - var leftSource, rightSource, leftCharCode, rightCharCode; - leftSource = toSourceNodeWhenNeeded(left).toString(); - if (leftSource.length === 0) { - return [right]; - } - rightSource = toSourceNodeWhenNeeded(right).toString(); - if (rightSource.length === 0) { - return [left]; - } - leftCharCode = leftSource.charCodeAt(leftSource.length - 1); - rightCharCode = rightSource.charCodeAt(0); - if ((leftCharCode === 43 || leftCharCode === 45) && leftCharCode === rightCharCode || esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) || leftCharCode === 47 && rightCharCode === 105) { - return [ - left, - noEmptySpace(), - right - ]; - } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) || esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) { - return [ - left, - right - ]; - } - return [ - left, - space, - right - ]; - } - function addIndent(stmt) { - return [ - base, - stmt - ]; - } - function withIndent(fn) { - var previousBase; - previousBase = base; - base += indent; - fn(base); - base = previousBase; - } - function calculateSpaces(str) { - var i; - for (i = str.length - 1; i >= 0; --i) { - if (esutils.code.isLineTerminator(str.charCodeAt(i))) { - break; - } - } - return str.length - 1 - i; - } - function adjustMultilineComment(value, specialBase) { - var array, i, len, line, j, spaces, previousBase, sn; - array = value.split(/\r\n|[\r\n]/); - spaces = Number.MAX_VALUE; - for (i = 1, len = array.length; i < len; ++i) { - line = array[i]; - j = 0; - while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) { - ++j; - } - if (spaces > j) { - spaces = j; - } - } - if (typeof specialBase !== 'undefined') { - previousBase = base; - if (array[1][spaces] === '*') { - specialBase += ' '; - } - base = specialBase; - } else { - if (spaces & 1) { - --spaces; - } - previousBase = base; - } - for (i = 1, len = array.length; i < len; ++i) { - sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces))); - array[i] = sourceMap ? sn.join('') : sn; - } - base = previousBase; - return array.join('\n'); - } - function generateComment(comment, specialBase) { - if (comment.type === 'Line') { - if (endsWithLineTerminator(comment.value)) { - return '//' + comment.value; - } else { - var result = '//' + comment.value; - if (!preserveBlankLines) { - result += '\n'; - } - return result; - } - } - if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) { - return adjustMultilineComment('/*' + comment.value + '*/', specialBase); - } - return '/*' + comment.value + '*/'; - } - function addComments(stmt, result) { - var i, len, comment, save, tailingToStatement, specialBase, fragment, extRange, range, prevRange, prefix, infix, suffix, count; - if (stmt.leadingComments && stmt.leadingComments.length > 0) { - save = result; - if (preserveBlankLines) { - comment = stmt.leadingComments[0]; - result = []; - extRange = comment.extendedRange; - range = comment.range; - prefix = sourceCode.substring(extRange[0], range[0]); - count = (prefix.match(/\n/g) || []).length; - if (count > 0) { - result.push(stringRepeat('\n', count)); - result.push(addIndent(generateComment(comment))); - } else { - result.push(prefix); - result.push(generateComment(comment)); - } - prevRange = range; - for (i = 1, len = stmt.leadingComments.length; i < len; i++) { - comment = stmt.leadingComments[i]; - range = comment.range; - infix = sourceCode.substring(prevRange[1], range[0]); - count = (infix.match(/\n/g) || []).length; - result.push(stringRepeat('\n', count)); - result.push(addIndent(generateComment(comment))); - prevRange = range; - } - suffix = sourceCode.substring(range[1], extRange[1]); - count = (suffix.match(/\n/g) || []).length; - result.push(stringRepeat('\n', count)); - } else { - comment = stmt.leadingComments[0]; - result = []; - if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) { - result.push('\n'); - } - result.push(generateComment(comment)); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push('\n'); - } - for (i = 1, len = stmt.leadingComments.length; i < len; ++i) { - comment = stmt.leadingComments[i]; - fragment = [generateComment(comment)]; - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { - fragment.push('\n'); - } - result.push(addIndent(fragment)); - } - } - result.push(addIndent(save)); - } - if (stmt.trailingComments) { - if (preserveBlankLines) { - comment = stmt.trailingComments[0]; - extRange = comment.extendedRange; - range = comment.range; - prefix = sourceCode.substring(extRange[0], range[0]); - count = (prefix.match(/\n/g) || []).length; - if (count > 0) { - result.push(stringRepeat('\n', count)); - result.push(addIndent(generateComment(comment))); - } else { - result.push(prefix); - result.push(generateComment(comment)); - } - } else { - tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); - specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([ - base, - result, - indent - ]).toString())); - for (i = 0, len = stmt.trailingComments.length; i < len; ++i) { - comment = stmt.trailingComments[i]; - if (tailingToStatement) { - if (i === 0) { - result = [ - result, - indent - ]; - } else { - result = [ - result, - specialBase - ]; - } - result.push(generateComment(comment, specialBase)); - } else { - result = [ - result, - addIndent(generateComment(comment)) - ]; - } - if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result = [ - result, - '\n' - ]; - } - } - } - } - return result; - } - function generateBlankLines(start, end, result) { - var j, newlineCount = 0; - for (j = start; j < end; j++) { - if (sourceCode[j] === '\n') { - newlineCount++; - } - } - for (j = 1; j < newlineCount; j++) { - result.push(newline); - } - } - function parenthesize(text, current, should) { - if (current < should) { - return [ - '(', - text, - ')' - ]; - } - return text; - } - function generateVerbatimString(string) { - var i, iz, result; - result = string.split(/\r\n|\n/); - for (i = 1, iz = result.length; i < iz; i++) { - result[i] = newline + base + result[i]; - } - return result; - } - function generateVerbatim(expr, precedence) { - var verbatim, result, prec; - verbatim = expr[extra.verbatim]; - if (typeof verbatim === 'string') { - result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence); - } else { - result = generateVerbatimString(verbatim.content); - prec = verbatim.precedence != null ? verbatim.precedence : Precedence.Sequence; - result = parenthesize(result, prec, precedence); - } - return toSourceNodeWhenNeeded(result, expr); - } - function CodeGenerator() { - } - CodeGenerator.prototype.maybeBlock = function (stmt, flags) { - var result, noLeadingComment, that = this; - noLeadingComment = !extra.comment || !stmt.leadingComments; - if (stmt.type === Syntax.BlockStatement && noLeadingComment) { - return [ - space, - this.generateStatement(stmt, flags) - ]; - } - if (stmt.type === Syntax.EmptyStatement && noLeadingComment) { - return ';'; - } - withIndent(function () { - result = [ - newline, - addIndent(that.generateStatement(stmt, flags)) - ]; - }); - return result; - }; - CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) { - var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); - if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) { - return [ - result, - space - ]; - } - if (ends) { - return [ - result, - base - ]; - } - return [ - result, - newline, - base - ]; - }; - function generateIdentifier(node) { - return toSourceNodeWhenNeeded(node.name, node); - } - function generateAsyncPrefix(node, spaceRequired) { - return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : ''; - } - function generateStarSuffix(node) { - var isGenerator = node.generator && !extra.moz.starlessGenerator; - return isGenerator ? '*' + space : ''; - } - function generateMethodPrefix(prop) { - var func = prop.value, prefix = ''; - if (func.async) { - prefix += generateAsyncPrefix(func, !prop.computed); - } - if (func.generator) { - prefix += generateStarSuffix(func) ? '*' : ''; - } - return prefix; - } - CodeGenerator.prototype.generatePattern = function (node, precedence, flags) { - if (node.type === Syntax.Identifier) { - return generateIdentifier(node); - } - return this.generateExpression(node, precedence, flags); - }; - CodeGenerator.prototype.generateFunctionParams = function (node) { - var i, iz, result, hasDefault; - hasDefault = false; - if (node.type === Syntax.ArrowFunctionExpression && !node.rest && (!node.defaults || node.defaults.length === 0) && node.params.length === 1 && node.params[0].type === Syntax.Identifier) { - result = [ - generateAsyncPrefix(node, true), - generateIdentifier(node.params[0]) - ]; - } else { - result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : []; - result.push('('); - if (node.defaults) { - hasDefault = true; - } - for (i = 0, iz = node.params.length; i < iz; ++i) { - if (hasDefault && node.defaults[i]) { - result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT)); - } else { - result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT)); - } - if (i + 1 < iz) { - result.push(',' + space); - } - } - if (node.rest) { - if (node.params.length) { - result.push(',' + space); - } - result.push('...'); - result.push(generateIdentifier(node.rest)); - } - result.push(')'); - } - return result; - }; - CodeGenerator.prototype.generateFunctionBody = function (node) { - var result, expr; - result = this.generateFunctionParams(node); - if (node.type === Syntax.ArrowFunctionExpression) { - result.push(space); - result.push('=>'); - } - if (node.expression) { - result.push(space); - expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT); - if (expr.toString().charAt(0) === '{') { - expr = [ - '(', - expr, - ')' - ]; - } - result.push(expr); - } else { - result.push(this.maybeBlock(node.body, S_TTFF)); - } - return result; - }; - CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) { - var result = ['for' + space + (stmt.await ? 'await' + space : '') + '('], that = this; - withIndent(function () { - if (stmt.left.type === Syntax.VariableDeclaration) { - withIndent(function () { - result.push(stmt.left.kind + noEmptySpace()); - result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF)); - }); - } else { - result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT)); - } - result = join(result, operator); - result = [ - join(result, that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)), - ')' - ]; - }); - result.push(this.maybeBlock(stmt.body, flags)); - return result; - }; - CodeGenerator.prototype.generatePropertyKey = function (expr, computed) { - var result = []; - if (computed) { - result.push('['); - } - result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT)); - if (computed) { - result.push(']'); - } - return result; - }; - CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) { - if (Precedence.Assignment < precedence) { - flags |= F_ALLOW_IN; - } - return parenthesize([ - this.generateExpression(left, Precedence.Call, flags), - space + operator + space, - this.generateExpression(right, Precedence.Assignment, flags) - ], Precedence.Assignment, precedence); - }; - CodeGenerator.prototype.semicolon = function (flags) { - if (!semicolons && flags & F_SEMICOLON_OPT) { - return ''; - } - return ';'; - }; - CodeGenerator.Statement = { - BlockStatement: function (stmt, flags) { - var range, content, result = [ - '{', - newline - ], that = this; - withIndent(function () { - if (stmt.body.length === 0 && preserveBlankLines) { - range = stmt.range; - if (range[1] - range[0] > 2) { - content = sourceCode.substring(range[0] + 1, range[1] - 1); - if (content[0] === '\n') { - result = ['{']; - } - result.push(content); - } - } - var i, iz, fragment, bodyFlags; - bodyFlags = S_TFFF; - if (flags & F_FUNC_BODY) { - bodyFlags |= F_DIRECTIVE_CTX; - } - for (i = 0, iz = stmt.body.length; i < iz; ++i) { - if (preserveBlankLines) { - if (i === 0) { - if (stmt.body[0].leadingComments) { - range = stmt.body[0].leadingComments[0].extendedRange; - content = sourceCode.substring(range[0], range[1]); - if (content[0] === '\n') { - result = ['{']; - } - } - if (!stmt.body[0].leadingComments) { - generateBlankLines(stmt.range[0], stmt.body[0].range[0], result); - } - } - if (i > 0) { - if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) { - generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result); - } - } - } - if (i === iz - 1) { - bodyFlags |= F_SEMICOLON_OPT; - } - if (stmt.body[i].leadingComments && preserveBlankLines) { - fragment = that.generateStatement(stmt.body[i], bodyFlags); - } else { - fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags)); - } - result.push(fragment); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { - if (preserveBlankLines && i < iz - 1) { - if (!stmt.body[i + 1].leadingComments) { - result.push(newline); - } - } else { - result.push(newline); - } - } - if (preserveBlankLines) { - if (i === iz - 1) { - if (!stmt.body[i].trailingComments) { - generateBlankLines(stmt.body[i].range[1], stmt.range[1], result); - } - } - } - } - }); - result.push(addIndent('}')); - return result; - }, - BreakStatement: function (stmt, flags) { - if (stmt.label) { - return 'break ' + stmt.label.name + this.semicolon(flags); - } - return 'break' + this.semicolon(flags); - }, - ContinueStatement: function (stmt, flags) { - if (stmt.label) { - return 'continue ' + stmt.label.name + this.semicolon(flags); - } - return 'continue' + this.semicolon(flags); - }, - ClassBody: function (stmt, flags) { - var result = [ - '{', - newline - ], that = this; - withIndent(function (indent) { - var i, iz; - for (i = 0, iz = stmt.body.length; i < iz; ++i) { - result.push(indent); - result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT)); - if (i + 1 < iz) { - result.push(newline); - } - } - }); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - result.push(base); - result.push('}'); - return result; - }, - ClassDeclaration: function (stmt, flags) { - var result, fragment; - result = ['class']; - if (stmt.id) { - result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT)); - } - if (stmt.superClass) { - fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Assignment, E_TTT)); - result = join(result, fragment); - } - result.push(space); - result.push(this.generateStatement(stmt.body, S_TFFT)); - return result; - }, - DirectiveStatement: function (stmt, flags) { - if (extra.raw && stmt.raw) { - return stmt.raw + this.semicolon(flags); - } - return escapeDirective(stmt.directive) + this.semicolon(flags); - }, - DoWhileStatement: function (stmt, flags) { - var result = join('do', this.maybeBlock(stmt.body, S_TFFF)); - result = this.maybeBlockSuffix(stmt.body, result); - return join(result, [ - 'while' + space + '(', - this.generateExpression(stmt.test, Precedence.Sequence, E_TTT), - ')' + this.semicolon(flags) - ]); - }, - CatchClause: function (stmt, flags) { - var result, that = this; - withIndent(function () { - var guard; - result = [ - 'catch' + space + '(', - that.generateExpression(stmt.param, Precedence.Sequence, E_TTT), - ')' - ]; - if (stmt.guard) { - guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT); - result.splice(2, 0, ' if ', guard); - } - }); - result.push(this.maybeBlock(stmt.body, S_TFFF)); - return result; - }, - DebuggerStatement: function (stmt, flags) { - return 'debugger' + this.semicolon(flags); - }, - EmptyStatement: function (stmt, flags) { - return ';'; - }, - ExportDefaultDeclaration: function (stmt, flags) { - var result = ['export'], bodyFlags; - bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF; - result = join(result, 'default'); - if (isStatement(stmt.declaration)) { - result = join(result, this.generateStatement(stmt.declaration, bodyFlags)); - } else { - result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags)); - } - return result; - }, - ExportNamedDeclaration: function (stmt, flags) { - var result = ['export'], bodyFlags, that = this; - bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF; - if (stmt.declaration) { - return join(result, this.generateStatement(stmt.declaration, bodyFlags)); - } - if (stmt.specifiers) { - if (stmt.specifiers.length === 0) { - result = join(result, '{' + space + '}'); - } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) { - result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT)); - } else { - result = join(result, '{'); - withIndent(function (indent) { - var i, iz; - result.push(newline); - for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) { - result.push(indent); - result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT)); - if (i + 1 < iz) { - result.push(',' + newline); - } - } - }); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - result.push(base + '}'); - } - if (stmt.source) { - result = join(result, [ - 'from' + space, - this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), - this.semicolon(flags) - ]); - } else { - result.push(this.semicolon(flags)); - } - } - return result; - }, - ExportAllDeclaration: function (stmt, flags) { - return [ - 'export' + space, - '*' + space, - 'from' + space, - this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), - this.semicolon(flags) - ]; - }, - ExpressionStatement: function (stmt, flags) { - var result, fragment; - function isClassPrefixed(fragment) { - var code; - if (fragment.slice(0, 5) !== 'class') { - return false; - } - code = fragment.charCodeAt(5); - return code === 123 || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code); - } - function isFunctionPrefixed(fragment) { - var code; - if (fragment.slice(0, 8) !== 'function') { - return false; - } - code = fragment.charCodeAt(8); - return code === 40 || esutils.code.isWhiteSpace(code) || code === 42 || esutils.code.isLineTerminator(code); - } - function isAsyncPrefixed(fragment) { - var code, i, iz; - if (fragment.slice(0, 5) !== 'async') { - return false; - } - if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) { - return false; - } - for (i = 6, iz = fragment.length; i < iz; ++i) { - if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) { - break; - } - } - if (i === iz) { - return false; - } - if (fragment.slice(i, i + 8) !== 'function') { - return false; - } - code = fragment.charCodeAt(i + 8); - return code === 40 || esutils.code.isWhiteSpace(code) || code === 42 || esutils.code.isLineTerminator(code); - } - result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)]; - fragment = toSourceNodeWhenNeeded(result).toString(); - if (fragment.charCodeAt(0) === 123 || isClassPrefixed(fragment) || isFunctionPrefixed(fragment) || isAsyncPrefixed(fragment) || directive && flags & F_DIRECTIVE_CTX && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string') { - result = [ - '(', - result, - ')' + this.semicolon(flags) - ]; - } else { - result.push(this.semicolon(flags)); - } - return result; - }, - ImportDeclaration: function (stmt, flags) { - var result, cursor, that = this; - if (stmt.specifiers.length === 0) { - return [ - 'import', - space, - this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), - this.semicolon(flags) - ]; - } - result = ['import']; - cursor = 0; - if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) { - result = join(result, [this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)]); - ++cursor; - } - if (stmt.specifiers[cursor]) { - if (cursor !== 0) { - result.push(','); - } - if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) { - result = join(result, [ - space, - this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT) - ]); - } else { - result.push(space + '{'); - if (stmt.specifiers.length - cursor === 1) { - result.push(space); - result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)); - result.push(space + '}' + space); - } else { - withIndent(function (indent) { - var i, iz; - result.push(newline); - for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) { - result.push(indent); - result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT)); - if (i + 1 < iz) { - result.push(',' + newline); - } - } - }); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - result.push(base + '}' + space); - } - } - } - result = join(result, [ - 'from' + space, - this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), - this.semicolon(flags) - ]); - return result; - }, - VariableDeclarator: function (stmt, flags) { - var itemFlags = flags & F_ALLOW_IN ? E_TTT : E_FTT; - if (stmt.init) { - return [ - this.generateExpression(stmt.id, Precedence.Assignment, itemFlags), - space, - '=', - space, - this.generateExpression(stmt.init, Precedence.Assignment, itemFlags) - ]; - } - return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags); - }, - VariableDeclaration: function (stmt, flags) { - var result, i, iz, node, bodyFlags, that = this; - result = [stmt.kind]; - bodyFlags = flags & F_ALLOW_IN ? S_TFFF : S_FFFF; - function block() { - node = stmt.declarations[0]; - if (extra.comment && node.leadingComments) { - result.push('\n'); - result.push(addIndent(that.generateStatement(node, bodyFlags))); - } else { - result.push(noEmptySpace()); - result.push(that.generateStatement(node, bodyFlags)); - } - for (i = 1, iz = stmt.declarations.length; i < iz; ++i) { - node = stmt.declarations[i]; - if (extra.comment && node.leadingComments) { - result.push(',' + newline); - result.push(addIndent(that.generateStatement(node, bodyFlags))); - } else { - result.push(',' + space); - result.push(that.generateStatement(node, bodyFlags)); - } - } - } - if (stmt.declarations.length > 1) { - withIndent(block); - } else { - block(); - } - result.push(this.semicolon(flags)); - return result; - }, - ThrowStatement: function (stmt, flags) { - return [ - join('throw', this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)), - this.semicolon(flags) - ]; - }, - TryStatement: function (stmt, flags) { - var result, i, iz, guardedHandlers; - result = [ - 'try', - this.maybeBlock(stmt.block, S_TFFF) - ]; - result = this.maybeBlockSuffix(stmt.block, result); - if (stmt.handlers) { - for (i = 0, iz = stmt.handlers.length; i < iz; ++i) { - result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF)); - if (stmt.finalizer || i + 1 !== iz) { - result = this.maybeBlockSuffix(stmt.handlers[i].body, result); - } - } - } else { - guardedHandlers = stmt.guardedHandlers || []; - for (i = 0, iz = guardedHandlers.length; i < iz; ++i) { - result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF)); - if (stmt.finalizer || i + 1 !== iz) { - result = this.maybeBlockSuffix(guardedHandlers[i].body, result); - } - } - if (stmt.handler) { - if (Array.isArray(stmt.handler)) { - for (i = 0, iz = stmt.handler.length; i < iz; ++i) { - result = join(result, this.generateStatement(stmt.handler[i], S_TFFF)); - if (stmt.finalizer || i + 1 !== iz) { - result = this.maybeBlockSuffix(stmt.handler[i].body, result); - } - } - } else { - result = join(result, this.generateStatement(stmt.handler, S_TFFF)); - if (stmt.finalizer) { - result = this.maybeBlockSuffix(stmt.handler.body, result); - } - } - } - } - if (stmt.finalizer) { - result = join(result, [ - 'finally', - this.maybeBlock(stmt.finalizer, S_TFFF) - ]); - } - return result; - }, - SwitchStatement: function (stmt, flags) { - var result, fragment, i, iz, bodyFlags, that = this; - withIndent(function () { - result = [ - 'switch' + space + '(', - that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT), - ')' + space + '{' + newline - ]; - }); - if (stmt.cases) { - bodyFlags = S_TFFF; - for (i = 0, iz = stmt.cases.length; i < iz; ++i) { - if (i === iz - 1) { - bodyFlags |= F_SEMICOLON_OPT; - } - fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags)); - result.push(fragment); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { - result.push(newline); - } - } - } - result.push(addIndent('}')); - return result; - }, - SwitchCase: function (stmt, flags) { - var result, fragment, i, iz, bodyFlags, that = this; - withIndent(function () { - if (stmt.test) { - result = [ - join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)), - ':' - ]; - } else { - result = ['default:']; - } - i = 0; - iz = stmt.consequent.length; - if (iz && stmt.consequent[0].type === Syntax.BlockStatement) { - fragment = that.maybeBlock(stmt.consequent[0], S_TFFF); - result.push(fragment); - i = 1; - } - if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - bodyFlags = S_TFFF; - for (; i < iz; ++i) { - if (i === iz - 1 && flags & F_SEMICOLON_OPT) { - bodyFlags |= F_SEMICOLON_OPT; - } - fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags)); - result.push(fragment); - if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { - result.push(newline); - } - } - }); - return result; - }, - IfStatement: function (stmt, flags) { - var result, bodyFlags, semicolonOptional, that = this; - withIndent(function () { - result = [ - 'if' + space + '(', - that.generateExpression(stmt.test, Precedence.Sequence, E_TTT), - ')' - ]; - }); - semicolonOptional = flags & F_SEMICOLON_OPT; - bodyFlags = S_TFFF; - if (semicolonOptional) { - bodyFlags |= F_SEMICOLON_OPT; - } - if (stmt.alternate) { - result.push(this.maybeBlock(stmt.consequent, S_TFFF)); - result = this.maybeBlockSuffix(stmt.consequent, result); - if (stmt.alternate.type === Syntax.IfStatement) { - result = join(result, [ - 'else ', - this.generateStatement(stmt.alternate, bodyFlags) - ]); - } else { - result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags))); - } - } else { - result.push(this.maybeBlock(stmt.consequent, bodyFlags)); - } - return result; - }, - ForStatement: function (stmt, flags) { - var result, that = this; - withIndent(function () { - result = ['for' + space + '(']; - if (stmt.init) { - if (stmt.init.type === Syntax.VariableDeclaration) { - result.push(that.generateStatement(stmt.init, S_FFFF)); - } else { - result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT)); - result.push(';'); - } - } else { - result.push(';'); - } - if (stmt.test) { - result.push(space); - result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)); - result.push(';'); - } else { - result.push(';'); - } - if (stmt.update) { - result.push(space); - result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT)); - result.push(')'); - } else { - result.push(')'); - } - }); - result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); - return result; - }, - ForInStatement: function (stmt, flags) { - return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF); - }, - ForOfStatement: function (stmt, flags) { - return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF); - }, - LabeledStatement: function (stmt, flags) { - return [ - stmt.label.name + ':', - this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF) - ]; - }, - Program: function (stmt, flags) { - var result, fragment, i, iz, bodyFlags; - iz = stmt.body.length; - result = [safeConcatenation && iz > 0 ? '\n' : '']; - bodyFlags = S_TFTF; - for (i = 0; i < iz; ++i) { - if (!safeConcatenation && i === iz - 1) { - bodyFlags |= F_SEMICOLON_OPT; - } - if (preserveBlankLines) { - if (i === 0) { - if (!stmt.body[0].leadingComments) { - generateBlankLines(stmt.range[0], stmt.body[i].range[0], result); - } - } - if (i > 0) { - if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) { - generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result); - } - } - } - fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags)); - result.push(fragment); - if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { - if (preserveBlankLines) { - if (!stmt.body[i + 1].leadingComments) { - result.push(newline); - } - } else { - result.push(newline); - } - } - if (preserveBlankLines) { - if (i === iz - 1) { - if (!stmt.body[i].trailingComments) { - generateBlankLines(stmt.body[i].range[1], stmt.range[1], result); - } - } - } - } - return result; - }, - FunctionDeclaration: function (stmt, flags) { - return [ - generateAsyncPrefix(stmt, true), - 'function', - generateStarSuffix(stmt) || noEmptySpace(), - stmt.id ? generateIdentifier(stmt.id) : '', - this.generateFunctionBody(stmt) - ]; - }, - ReturnStatement: function (stmt, flags) { - if (stmt.argument) { - return [ - join('return', this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)), - this.semicolon(flags) - ]; - } - return ['return' + this.semicolon(flags)]; - }, - WhileStatement: function (stmt, flags) { - var result, that = this; - withIndent(function () { - result = [ - 'while' + space + '(', - that.generateExpression(stmt.test, Precedence.Sequence, E_TTT), - ')' - ]; - }); - result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); - return result; - }, - WithStatement: function (stmt, flags) { - var result, that = this; - withIndent(function () { - result = [ - 'with' + space + '(', - that.generateExpression(stmt.object, Precedence.Sequence, E_TTT), - ')' - ]; - }); - result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); - return result; - } - }; - merge(CodeGenerator.prototype, CodeGenerator.Statement); - CodeGenerator.Expression = { - SequenceExpression: function (expr, precedence, flags) { - var result, i, iz; - if (Precedence.Sequence < precedence) { - flags |= F_ALLOW_IN; - } - result = []; - for (i = 0, iz = expr.expressions.length; i < iz; ++i) { - result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags)); - if (i + 1 < iz) { - result.push(',' + space); - } - } - return parenthesize(result, Precedence.Sequence, precedence); - }, - AssignmentExpression: function (expr, precedence, flags) { - return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags); - }, - ArrowFunctionExpression: function (expr, precedence, flags) { - return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence); - }, - ConditionalExpression: function (expr, precedence, flags) { - if (Precedence.Conditional < precedence) { - flags |= F_ALLOW_IN; - } - return parenthesize([ - this.generateExpression(expr.test, Precedence.LogicalOR, flags), - space + '?' + space, - this.generateExpression(expr.consequent, Precedence.Assignment, flags), - space + ':' + space, - this.generateExpression(expr.alternate, Precedence.Assignment, flags) - ], Precedence.Conditional, precedence); - }, - LogicalExpression: function (expr, precedence, flags) { - return this.BinaryExpression(expr, precedence, flags); - }, - BinaryExpression: function (expr, precedence, flags) { - var result, currentPrecedence, fragment, leftSource; - currentPrecedence = BinaryPrecedence[expr.operator]; - if (currentPrecedence < precedence) { - flags |= F_ALLOW_IN; - } - fragment = this.generateExpression(expr.left, currentPrecedence, flags); - leftSource = fragment.toString(); - if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) { - result = [ - fragment, - noEmptySpace(), - expr.operator - ]; - } else { - result = join(fragment, expr.operator); - } - fragment = this.generateExpression(expr.right, currentPrecedence + 1, flags); - if (expr.operator === '/' && fragment.toString().charAt(0) === '/' || expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') { - result.push(noEmptySpace()); - result.push(fragment); - } else { - result = join(result, fragment); - } - if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) { - return [ - '(', - result, - ')' - ]; - } - return parenthesize(result, currentPrecedence, precedence); - }, - CallExpression: function (expr, precedence, flags) { - var result, i, iz; - result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)]; - result.push('('); - for (i = 0, iz = expr['arguments'].length; i < iz; ++i) { - result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT)); - if (i + 1 < iz) { - result.push(',' + space); - } - } - result.push(')'); - if (!(flags & F_ALLOW_CALL)) { - return [ - '(', - result, - ')' - ]; - } - return parenthesize(result, Precedence.Call, precedence); - }, - NewExpression: function (expr, precedence, flags) { - var result, length, i, iz, itemFlags; - length = expr['arguments'].length; - itemFlags = flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0 ? E_TFT : E_TFF; - result = join('new', this.generateExpression(expr.callee, Precedence.New, itemFlags)); - if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) { - result.push('('); - for (i = 0, iz = length; i < iz; ++i) { - result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT)); - if (i + 1 < iz) { - result.push(',' + space); - } - } - result.push(')'); - } - return parenthesize(result, Precedence.New, precedence); - }, - MemberExpression: function (expr, precedence, flags) { - var result, fragment; - result = [this.generateExpression(expr.object, Precedence.Call, flags & F_ALLOW_CALL ? E_TTF : E_TFF)]; - if (expr.computed) { - result.push('['); - result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT)); - result.push(']'); - } else { - if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') { - fragment = toSourceNodeWhenNeeded(result).toString(); - if (fragment.indexOf('.') < 0 && !/[eExX]/.test(fragment) && esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) && !(fragment.length >= 2 && fragment.charCodeAt(0) === 48)) { - result.push(' '); - } - } - result.push('.'); - result.push(generateIdentifier(expr.property)); - } - return parenthesize(result, Precedence.Member, precedence); - }, - MetaProperty: function (expr, precedence, flags) { - var result; - result = []; - result.push(typeof expr.meta === 'string' ? expr.meta : generateIdentifier(expr.meta)); - result.push('.'); - result.push(typeof expr.property === 'string' ? expr.property : generateIdentifier(expr.property)); - return parenthesize(result, Precedence.Member, precedence); - }, - UnaryExpression: function (expr, precedence, flags) { - var result, fragment, rightCharCode, leftSource, leftCharCode; - fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT); - if (space === '') { - result = join(expr.operator, fragment); - } else { - result = [expr.operator]; - if (expr.operator.length > 2) { - result = join(result, fragment); - } else { - leftSource = toSourceNodeWhenNeeded(result).toString(); - leftCharCode = leftSource.charCodeAt(leftSource.length - 1); - rightCharCode = fragment.toString().charCodeAt(0); - if ((leftCharCode === 43 || leftCharCode === 45) && leftCharCode === rightCharCode || esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode)) { - result.push(noEmptySpace()); - result.push(fragment); - } else { - result.push(fragment); - } - } - } - return parenthesize(result, Precedence.Unary, precedence); - }, - YieldExpression: function (expr, precedence, flags) { - var result; - if (expr.delegate) { - result = 'yield*'; - } else { - result = 'yield'; - } - if (expr.argument) { - result = join(result, this.generateExpression(expr.argument, Precedence.Yield, E_TTT)); - } - return parenthesize(result, Precedence.Yield, precedence); - }, - AwaitExpression: function (expr, precedence, flags) { - var result = join(expr.all ? 'await*' : 'await', this.generateExpression(expr.argument, Precedence.Await, E_TTT)); - return parenthesize(result, Precedence.Await, precedence); - }, - UpdateExpression: function (expr, precedence, flags) { - if (expr.prefix) { - return parenthesize([ - expr.operator, - this.generateExpression(expr.argument, Precedence.Unary, E_TTT) - ], Precedence.Unary, precedence); - } - return parenthesize([ - this.generateExpression(expr.argument, Precedence.Postfix, E_TTT), - expr.operator - ], Precedence.Postfix, precedence); - }, - FunctionExpression: function (expr, precedence, flags) { - var result = [ - generateAsyncPrefix(expr, true), - 'function' - ]; - if (expr.id) { - result.push(generateStarSuffix(expr) || noEmptySpace()); - result.push(generateIdentifier(expr.id)); - } else { - result.push(generateStarSuffix(expr) || space); - } - result.push(this.generateFunctionBody(expr)); - return result; - }, - ArrayPattern: function (expr, precedence, flags) { - return this.ArrayExpression(expr, precedence, flags, true); - }, - ArrayExpression: function (expr, precedence, flags, isPattern) { - var result, multiline, that = this; - if (!expr.elements.length) { - return '[]'; - } - multiline = isPattern ? false : expr.elements.length > 1; - result = [ - '[', - multiline ? newline : '' - ]; - withIndent(function (indent) { - var i, iz; - for (i = 0, iz = expr.elements.length; i < iz; ++i) { - if (!expr.elements[i]) { - if (multiline) { - result.push(indent); - } - if (i + 1 === iz) { - result.push(','); - } - } else { - result.push(multiline ? indent : ''); - result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT)); - } - if (i + 1 < iz) { - result.push(',' + (multiline ? newline : space)); - } - } - }); - if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - result.push(multiline ? base : ''); - result.push(']'); - return result; - }, - RestElement: function (expr, precedence, flags) { - return '...' + this.generatePattern(expr.argument); - }, - ClassExpression: function (expr, precedence, flags) { - var result, fragment; - result = ['class']; - if (expr.id) { - result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT)); - } - if (expr.superClass) { - fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Assignment, E_TTT)); - result = join(result, fragment); - } - result.push(space); - result.push(this.generateStatement(expr.body, S_TFFT)); - return result; - }, - MethodDefinition: function (expr, precedence, flags) { - var result, fragment; - if (expr['static']) { - result = ['static' + space]; - } else { - result = []; - } - if (expr.kind === 'get' || expr.kind === 'set') { - fragment = [ - join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)), - this.generateFunctionBody(expr.value) - ]; - } else { - fragment = [ - generateMethodPrefix(expr), - this.generatePropertyKey(expr.key, expr.computed), - this.generateFunctionBody(expr.value) - ]; - } - return join(result, fragment); - }, - Property: function (expr, precedence, flags) { - if (expr.kind === 'get' || expr.kind === 'set') { - return [ - expr.kind, - noEmptySpace(), - this.generatePropertyKey(expr.key, expr.computed), - this.generateFunctionBody(expr.value) - ]; - } - if (expr.shorthand) { - if (expr.value.type === 'AssignmentPattern') { - return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT); - } - return this.generatePropertyKey(expr.key, expr.computed); - } - if (expr.method) { - return [ - generateMethodPrefix(expr), - this.generatePropertyKey(expr.key, expr.computed), - this.generateFunctionBody(expr.value) - ]; - } - return [ - this.generatePropertyKey(expr.key, expr.computed), - ':' + space, - this.generateExpression(expr.value, Precedence.Assignment, E_TTT) - ]; - }, - ObjectExpression: function (expr, precedence, flags) { - var multiline, result, fragment, that = this; - if (!expr.properties.length) { - return '{}'; - } - multiline = expr.properties.length > 1; - withIndent(function () { - fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT); - }); - if (!multiline) { - if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { - return [ - '{', - space, - fragment, - space, - '}' - ]; - } - } - withIndent(function (indent) { - var i, iz; - result = [ - '{', - newline, - indent, - fragment - ]; - if (multiline) { - result.push(',' + newline); - for (i = 1, iz = expr.properties.length; i < iz; ++i) { - result.push(indent); - result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT)); - if (i + 1 < iz) { - result.push(',' + newline); - } - } - } - }); - if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - result.push(base); - result.push('}'); - return result; - }, - AssignmentPattern: function (expr, precedence, flags) { - return this.generateAssignment(expr.left, expr.right, '=', precedence, flags); - }, - ObjectPattern: function (expr, precedence, flags) { - var result, i, iz, multiline, property, that = this; - if (!expr.properties.length) { - return '{}'; - } - multiline = false; - if (expr.properties.length === 1) { - property = expr.properties[0]; - if (property.value.type !== Syntax.Identifier) { - multiline = true; - } - } else { - for (i = 0, iz = expr.properties.length; i < iz; ++i) { - property = expr.properties[i]; - if (!property.shorthand) { - multiline = true; - break; - } - } - } - result = [ - '{', - multiline ? newline : '' - ]; - withIndent(function (indent) { - var i, iz; - for (i = 0, iz = expr.properties.length; i < iz; ++i) { - result.push(multiline ? indent : ''); - result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT)); - if (i + 1 < iz) { - result.push(',' + (multiline ? newline : space)); - } - } - }); - if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { - result.push(newline); - } - result.push(multiline ? base : ''); - result.push('}'); - return result; - }, - ThisExpression: function (expr, precedence, flags) { - return 'this'; - }, - Super: function (expr, precedence, flags) { - return 'super'; - }, - Identifier: function (expr, precedence, flags) { - return generateIdentifier(expr); - }, - ImportDefaultSpecifier: function (expr, precedence, flags) { - return generateIdentifier(expr.id || expr.local); - }, - ImportNamespaceSpecifier: function (expr, precedence, flags) { - var result = ['*']; - var id = expr.id || expr.local; - if (id) { - result.push(space + 'as' + noEmptySpace() + generateIdentifier(id)); - } - return result; - }, - ImportSpecifier: function (expr, precedence, flags) { - var imported = expr.imported; - var result = [imported.name]; - var local = expr.local; - if (local && local.name !== imported.name) { - result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local)); - } - return result; - }, - ExportSpecifier: function (expr, precedence, flags) { - var local = expr.local; - var result = [local.name]; - var exported = expr.exported; - if (exported && exported.name !== local.name) { - result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported)); - } - return result; - }, - Literal: function (expr, precedence, flags) { - var raw; - if (expr.hasOwnProperty('raw') && parse && extra.raw) { - try { - raw = parse(expr.raw).body[0].expression; - if (raw.type === Syntax.Literal) { - if (raw.value === expr.value) { - return expr.raw; - } - } - } catch (e) { - } - } - if (expr.value === null) { - return 'null'; - } - if (typeof expr.value === 'string') { - return escapeString(expr.value); - } - if (typeof expr.value === 'number') { - return generateNumber(expr.value); - } - if (typeof expr.value === 'boolean') { - return expr.value ? 'true' : 'false'; - } - if (expr.regex) { - return '/' + expr.regex.pattern + '/' + expr.regex.flags; - } - return generateRegExp(expr.value); - }, - GeneratorExpression: function (expr, precedence, flags) { - return this.ComprehensionExpression(expr, precedence, flags); - }, - ComprehensionExpression: function (expr, precedence, flags) { - var result, i, iz, fragment, that = this; - result = expr.type === Syntax.GeneratorExpression ? ['('] : ['[']; - if (extra.moz.comprehensionExpressionStartsWithAssignment) { - fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT); - result.push(fragment); - } - if (expr.blocks) { - withIndent(function () { - for (i = 0, iz = expr.blocks.length; i < iz; ++i) { - fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT); - if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) { - result = join(result, fragment); - } else { - result.push(fragment); - } - } - }); - } - if (expr.filter) { - result = join(result, 'if' + space); - fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT); - result = join(result, [ - '(', - fragment, - ')' - ]); - } - if (!extra.moz.comprehensionExpressionStartsWithAssignment) { - fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT); - result = join(result, fragment); - } - result.push(expr.type === Syntax.GeneratorExpression ? ')' : ']'); - return result; - }, - ComprehensionBlock: function (expr, precedence, flags) { - var fragment; - if (expr.left.type === Syntax.VariableDeclaration) { - fragment = [ - expr.left.kind, - noEmptySpace(), - this.generateStatement(expr.left.declarations[0], S_FFFF) - ]; - } else { - fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT); - } - fragment = join(fragment, expr.of ? 'of' : 'in'); - fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT)); - return [ - 'for' + space + '(', - fragment, - ')' - ]; - }, - SpreadElement: function (expr, precedence, flags) { - return [ - '...', - this.generateExpression(expr.argument, Precedence.Assignment, E_TTT) - ]; - }, - TaggedTemplateExpression: function (expr, precedence, flags) { - var itemFlags = E_TTF; - if (!(flags & F_ALLOW_CALL)) { - itemFlags = E_TFF; - } - var result = [ - this.generateExpression(expr.tag, Precedence.Call, itemFlags), - this.generateExpression(expr.quasi, Precedence.Primary, E_FFT) - ]; - return parenthesize(result, Precedence.TaggedTemplate, precedence); - }, - TemplateElement: function (expr, precedence, flags) { - return expr.value.raw; - }, - TemplateLiteral: function (expr, precedence, flags) { - var result, i, iz; - result = ['`']; - for (i = 0, iz = expr.quasis.length; i < iz; ++i) { - result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT)); - if (i + 1 < iz) { - result.push('${' + space); - result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT)); - result.push(space + '}'); - } - } - result.push('`'); - return result; - }, - ModuleSpecifier: function (expr, precedence, flags) { - return this.Literal(expr, precedence, flags); - } - }; - merge(CodeGenerator.prototype, CodeGenerator.Expression); - CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) { - var result, type; - type = expr.type || Syntax.Property; - if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) { - return generateVerbatim(expr, precedence); - } - result = this[type](expr, precedence, flags); - if (extra.comment) { - result = addComments(expr, result); - } - return toSourceNodeWhenNeeded(result, expr); - }; - CodeGenerator.prototype.generateStatement = function (stmt, flags) { - var result, fragment; - result = this[stmt.type](stmt, flags); - if (extra.comment) { - result = addComments(stmt, result); - } - fragment = toSourceNodeWhenNeeded(result).toString(); - if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') { - result = sourceMap ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, ''); - } - return toSourceNodeWhenNeeded(result, stmt); - }; - function generateInternal(node) { - var codegen; - codegen = new CodeGenerator; - if (isStatement(node)) { - return codegen.generateStatement(node, S_TFFF); - } - if (isExpression(node)) { - return codegen.generateExpression(node, Precedence.Sequence, E_TTT); - } - throw new Error('Unknown node type: ' + node.type); - } - function generate(node, options) { - var defaultOptions = getDefaultOptions(), result, pair; - if (options != null) { - if (typeof options.indent === 'string') { - defaultOptions.format.indent.style = options.indent; - } - if (typeof options.base === 'number') { - defaultOptions.format.indent.base = options.base; - } - options = updateDeeply(defaultOptions, options); - indent = options.format.indent.style; - if (typeof options.base === 'string') { - base = options.base; - } else { - base = stringRepeat(indent, options.format.indent.base); - } - } else { - options = defaultOptions; - indent = options.format.indent.style; - base = stringRepeat(indent, options.format.indent.base); - } - json = options.format.json; - renumber = options.format.renumber; - hexadecimal = json ? false : options.format.hexadecimal; - quotes = json ? 'double' : options.format.quotes; - escapeless = options.format.escapeless; - newline = options.format.newline; - space = options.format.space; - if (options.format.compact) { - newline = space = indent = base = ''; - } - parentheses = options.format.parentheses; - semicolons = options.format.semicolons; - safeConcatenation = options.format.safeConcatenation; - directive = options.directive; - parse = json ? null : options.parse; - sourceMap = options.sourceMap; - sourceCode = options.sourceCode; - preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null; - extra = options; - if (sourceMap) { - if (!exports.browser) { - SourceNode = require('/node_modules/source-map/source-map.js', module).SourceNode; - } else { - SourceNode = global.sourceMap.SourceNode; - } - } - result = generateInternal(node); - if (!sourceMap) { - pair = { - code: result.toString(), - map: null - }; - return options.sourceMapWithCode ? pair : pair.code; - } - pair = result.toStringWithSourceMap({ - file: options.file, - sourceRoot: options.sourceMapRoot - }); - if (options.sourceContent) { - pair.map.setSourceContent(options.sourceMap, options.sourceContent); - } - if (options.sourceMapWithCode) { - return pair; - } - return pair.map.toString(); - } - FORMAT_MINIFY = { - indent: { - style: '', - base: 0 - }, - renumber: true, - hexadecimal: true, - quotes: 'auto', - escapeless: true, - compact: true, - parentheses: false, - semicolons: false - }; - FORMAT_DEFAULTS = getDefaultOptions().format; - exports.version = require('/package.json', module).version; - exports.generate = generate; - exports.attachComments = estraverse.attachComments; - exports.Precedence = updateDeeply({}, Precedence); - exports.browser = false; - exports.FORMAT_MINIFY = FORMAT_MINIFY; - exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS; - }()); - }); - require.define('/package.json', function (module, exports, __dirname, __filename) { - module.exports = { - 'name': 'escodegen', - 'description': 'ECMAScript code generator', - 'homepage': 'http://github.com/estools/escodegen', - 'main': 'escodegen.js', - 'bin': { - 'esgenerate': './bin/esgenerate.js', - 'escodegen': './bin/escodegen.js' - }, - 'files': [ - 'LICENSE.BSD', - 'README.md', - 'bin', - 'escodegen.js', - 'package.json' - ], - 'version': '1.11.0', - 'engines': { 'node': '>=4.0' }, - 'maintainers': [{ - 'name': 'Yusuke Suzuki', - 'email': 'utatane.tea@gmail.com', - 'web': 'http://github.com/Constellation' - }], - 'repository': { - 'type': 'git', - 'url': 'http://github.com/estools/escodegen.git' - }, - 'dependencies': { - 'estraverse': '^4.2.0', - 'esutils': '^2.0.2', - 'esprima': '^3.1.3', - 'optionator': '^0.8.1' - }, - 'optionalDependencies': { 'source-map': '~0.6.1' }, - 'devDependencies': { - 'acorn': '^4.0.4', - 'bluebird': '^3.4.7', - 'bower-registry-client': '^1.0.0', - 'chai': '^3.5.0', - 'commonjs-everywhere': '^0.9.7', - 'gulp': '^3.8.10', - 'gulp-eslint': '^3.0.1', - 'gulp-mocha': '^3.0.1', - 'semver': '^5.1.0' - }, - 'license': 'BSD-2-Clause', - 'scripts': { - 'test': 'gulp travis', - 'unit-test': 'gulp test', - 'lint': 'gulp lint', - 'release': 'node tools/release.js', - 'build-min': './node_modules/.bin/cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js', - 'build': './node_modules/.bin/cjsify -a path: tools/entry-point.js > escodegen.browser.js' - } - }; - }); - require.define('/node_modules/source-map/source-map.js', function (module, exports, __dirname, __filename) { - exports.SourceMapGenerator = require('/node_modules/source-map/lib/source-map-generator.js', module).SourceMapGenerator; - exports.SourceMapConsumer = require('/node_modules/source-map/lib/source-map-consumer.js', module).SourceMapConsumer; - exports.SourceNode = require('/node_modules/source-map/lib/source-node.js', module).SourceNode; - }); - require.define('/node_modules/source-map/lib/source-node.js', function (module, exports, __dirname, __filename) { - var SourceMapGenerator = require('/node_modules/source-map/lib/source-map-generator.js', module).SourceMapGenerator; - var util = require('/node_modules/source-map/lib/util.js', module); - var REGEX_NEWLINE = /(\r?\n)/; - var NEWLINE_CODE = 10; - var isSourceNode = '$$$isSourceNode$$$'; - function SourceNode(aLine, aColumn, aSource, aChunks, aName) { - this.children = []; - this.sourceContents = {}; - this.line = aLine == null ? null : aLine; - this.column = aColumn == null ? null : aColumn; - this.source = aSource == null ? null : aSource; - this.name = aName == null ? null : aName; - this[isSourceNode] = true; - if (aChunks != null) - this.add(aChunks); - } - SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { - var node = new SourceNode; - var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); - var remainingLinesIndex = 0; - var shiftNextLine = function () { - var lineContents = getNextLine(); - var newLine = getNextLine() || ''; - return lineContents + newLine; - function getNextLine() { - return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : undefined; - } - }; - var lastGeneratedLine = 1, lastGeneratedColumn = 0; - var lastMapping = null; - aSourceMapConsumer.eachMapping(function (mapping) { - if (lastMapping !== null) { - if (lastGeneratedLine < mapping.generatedLine) { - addMappingWithCode(lastMapping, shiftNextLine()); - lastGeneratedLine++; - lastGeneratedColumn = 0; - } else { - var nextLine = remainingLines[remainingLinesIndex] || ''; - var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn); - remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn); - lastGeneratedColumn = mapping.generatedColumn; - addMappingWithCode(lastMapping, code); - lastMapping = mapping; - return; - } - } - while (lastGeneratedLine < mapping.generatedLine) { - node.add(shiftNextLine()); - lastGeneratedLine++; - } - if (lastGeneratedColumn < mapping.generatedColumn) { - var nextLine = remainingLines[remainingLinesIndex] || ''; - node.add(nextLine.substr(0, mapping.generatedColumn)); - remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); - lastGeneratedColumn = mapping.generatedColumn; - } - lastMapping = mapping; - }, this); - if (remainingLinesIndex < remainingLines.length) { - if (lastMapping) { - addMappingWithCode(lastMapping, shiftNextLine()); - } - node.add(remainingLines.splice(remainingLinesIndex).join('')); - } - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aRelativePath != null) { - sourceFile = util.join(aRelativePath, sourceFile); - } - node.setSourceContent(sourceFile, content); - } - }); - return node; - function addMappingWithCode(mapping, code) { - if (mapping === null || mapping.source === undefined) { - node.add(code); - } else { - var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source; - node.add(new SourceNode(mapping.originalLine, mapping.originalColumn, source, code, mapping.name)); - } - } - }; - SourceNode.prototype.add = function SourceNode_add(aChunk) { - if (Array.isArray(aChunk)) { - aChunk.forEach(function (chunk) { - this.add(chunk); - }, this); - } else if (aChunk[isSourceNode] || typeof aChunk === 'string') { - if (aChunk) { - this.children.push(aChunk); - } - } else { - throw new TypeError('Expected a SourceNode, string, or an array of SourceNodes and strings. Got ' + aChunk); - } - return this; - }; - SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { - if (Array.isArray(aChunk)) { - for (var i = aChunk.length - 1; i >= 0; i--) { - this.prepend(aChunk[i]); - } - } else if (aChunk[isSourceNode] || typeof aChunk === 'string') { - this.children.unshift(aChunk); - } else { - throw new TypeError('Expected a SourceNode, string, or an array of SourceNodes and strings. Got ' + aChunk); - } - return this; - }; - SourceNode.prototype.walk = function SourceNode_walk(aFn) { - var chunk; - for (var i = 0, len = this.children.length; i < len; i++) { - chunk = this.children[i]; - if (chunk[isSourceNode]) { - chunk.walk(aFn); - } else { - if (chunk !== '') { - aFn(chunk, { - source: this.source, - line: this.line, - column: this.column, - name: this.name - }); - } - } - } - }; - SourceNode.prototype.join = function SourceNode_join(aSep) { - var newChildren; - var i; - var len = this.children.length; - if (len > 0) { - newChildren = []; - for (i = 0; i < len - 1; i++) { - newChildren.push(this.children[i]); - newChildren.push(aSep); - } - newChildren.push(this.children[i]); - this.children = newChildren; - } - return this; - }; - SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { - var lastChild = this.children[this.children.length - 1]; - if (lastChild[isSourceNode]) { - lastChild.replaceRight(aPattern, aReplacement); - } else if (typeof lastChild === 'string') { - this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); - } else { - this.children.push(''.replace(aPattern, aReplacement)); - } - return this; - }; - SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) { - this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; - }; - SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) { - for (var i = 0, len = this.children.length; i < len; i++) { - if (this.children[i][isSourceNode]) { - this.children[i].walkSourceContents(aFn); - } - } - var sources = Object.keys(this.sourceContents); - for (var i = 0, len = sources.length; i < len; i++) { - aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); - } - }; - SourceNode.prototype.toString = function SourceNode_toString() { - var str = ''; - this.walk(function (chunk) { - str += chunk; - }); - return str; - }; - SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { - var generated = { - code: '', - line: 1, - column: 0 - }; - var map = new SourceMapGenerator(aArgs); - var sourceMappingActive = false; - var lastOriginalSource = null; - var lastOriginalLine = null; - var lastOriginalColumn = null; - var lastOriginalName = null; - this.walk(function (chunk, original) { - generated.code += chunk; - if (original.source !== null && original.line !== null && original.column !== null) { - if (lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - lastOriginalSource = original.source; - lastOriginalLine = original.line; - lastOriginalColumn = original.column; - lastOriginalName = original.name; - sourceMappingActive = true; - } else if (sourceMappingActive) { - map.addMapping({ - generated: { - line: generated.line, - column: generated.column - } - }); - lastOriginalSource = null; - sourceMappingActive = false; - } - for (var idx = 0, length = chunk.length; idx < length; idx++) { - if (chunk.charCodeAt(idx) === NEWLINE_CODE) { - generated.line++; - generated.column = 0; - if (idx + 1 === length) { - lastOriginalSource = null; - sourceMappingActive = false; - } else if (sourceMappingActive) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - } else { - generated.column++; - } - } - }); - this.walkSourceContents(function (sourceFile, sourceContent) { - map.setSourceContent(sourceFile, sourceContent); - }); - return { - code: generated.code, - map: map - }; - }; - exports.SourceNode = SourceNode; - }); - require.define('/node_modules/source-map/lib/util.js', function (module, exports, __dirname, __filename) { - function getArg(aArgs, aName, aDefaultValue) { - if (aName in aArgs) { - return aArgs[aName]; - } else if (arguments.length === 3) { - return aDefaultValue; - } else { - throw new Error('"' + aName + '" is a required argument.'); - } - } - exports.getArg = getArg; - var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; - var dataUrlRegexp = /^data:.+\,.+$/; - function urlParse(aUrl) { - var match = aUrl.match(urlRegexp); - if (!match) { - return null; - } - return { - scheme: match[1], - auth: match[2], - host: match[3], - port: match[4], - path: match[5] - }; - } - exports.urlParse = urlParse; - function urlGenerate(aParsedUrl) { - var url = ''; - if (aParsedUrl.scheme) { - url += aParsedUrl.scheme + ':'; - } - url += '//'; - if (aParsedUrl.auth) { - url += aParsedUrl.auth + '@'; - } - if (aParsedUrl.host) { - url += aParsedUrl.host; - } - if (aParsedUrl.port) { - url += ':' + aParsedUrl.port; - } - if (aParsedUrl.path) { - url += aParsedUrl.path; - } - return url; - } - exports.urlGenerate = urlGenerate; - function normalize(aPath) { - var path = aPath; - var url = urlParse(aPath); - if (url) { - if (!url.path) { - return aPath; - } - path = url.path; - } - var isAbsolute = exports.isAbsolute(path); - var parts = path.split(/\/+/); - for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { - part = parts[i]; - if (part === '.') { - parts.splice(i, 1); - } else if (part === '..') { - up++; - } else if (up > 0) { - if (part === '') { - parts.splice(i + 1, up); - up = 0; - } else { - parts.splice(i, 2); - up--; - } - } - } - path = parts.join('/'); - if (path === '') { - path = isAbsolute ? '/' : '.'; - } - if (url) { - url.path = path; - return urlGenerate(url); - } - return path; - } - exports.normalize = normalize; - function join(aRoot, aPath) { - if (aRoot === '') { - aRoot = '.'; - } - if (aPath === '') { - aPath = '.'; - } - var aPathUrl = urlParse(aPath); - var aRootUrl = urlParse(aRoot); - if (aRootUrl) { - aRoot = aRootUrl.path || '/'; - } - if (aPathUrl && !aPathUrl.scheme) { - if (aRootUrl) { - aPathUrl.scheme = aRootUrl.scheme; - } - return urlGenerate(aPathUrl); - } - if (aPathUrl || aPath.match(dataUrlRegexp)) { - return aPath; - } - if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { - aRootUrl.host = aPath; - return urlGenerate(aRootUrl); - } - var joined = aPath.charAt(0) === '/' ? aPath : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); - if (aRootUrl) { - aRootUrl.path = joined; - return urlGenerate(aRootUrl); - } - return joined; - } - exports.join = join; - exports.isAbsolute = function (aPath) { - return aPath.charAt(0) === '/' || urlRegexp.test(aPath); - }; - function relative(aRoot, aPath) { - if (aRoot === '') { - aRoot = '.'; - } - aRoot = aRoot.replace(/\/$/, ''); - var level = 0; - while (aPath.indexOf(aRoot + '/') !== 0) { - var index = aRoot.lastIndexOf('/'); - if (index < 0) { - return aPath; - } - aRoot = aRoot.slice(0, index); - if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { - return aPath; - } - ++level; - } - return Array(level + 1).join('../') + aPath.substr(aRoot.length + 1); - } - exports.relative = relative; - var supportsNullProto = function () { - var obj = Object.create(null); - return !('__proto__' in obj); - }(); - function identity(s) { - return s; - } - function toSetString(aStr) { - if (isProtoString(aStr)) { - return '$' + aStr; - } - return aStr; - } - exports.toSetString = supportsNullProto ? identity : toSetString; - function fromSetString(aStr) { - if (isProtoString(aStr)) { - return aStr.slice(1); - } - return aStr; - } - exports.fromSetString = supportsNullProto ? identity : fromSetString; - function isProtoString(s) { - if (!s) { - return false; - } - var length = s.length; - if (length < 9) { - return false; - } - if (s.charCodeAt(length - 1) !== 95 || s.charCodeAt(length - 2) !== 95 || s.charCodeAt(length - 3) !== 111 || s.charCodeAt(length - 4) !== 116 || s.charCodeAt(length - 5) !== 111 || s.charCodeAt(length - 6) !== 114 || s.charCodeAt(length - 7) !== 112 || s.charCodeAt(length - 8) !== 95 || s.charCodeAt(length - 9) !== 95) { - return false; - } - for (var i = length - 10; i >= 0; i--) { - if (s.charCodeAt(i) !== 36) { - return false; - } - } - return true; - } - function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { - var cmp = strcmp(mappingA.source, mappingB.source); - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp !== 0 || onlyCompareOriginal) { - return cmp; - } - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp !== 0) { - return cmp; - } - return strcmp(mappingA.name, mappingB.name); - } - exports.compareByOriginalPositions = compareByOriginalPositions; - function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { - var cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp !== 0 || onlyCompareGenerated) { - return cmp; - } - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp !== 0) { - return cmp; - } - return strcmp(mappingA.name, mappingB.name); - } - exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; - function strcmp(aStr1, aStr2) { - if (aStr1 === aStr2) { - return 0; - } - if (aStr1 === null) { - return 1; - } - if (aStr2 === null) { - return -1; - } - if (aStr1 > aStr2) { - return 1; - } - return -1; - } - function compareByGeneratedPositionsInflated(mappingA, mappingB) { - var cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp !== 0) { - return cmp; - } - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp !== 0) { - return cmp; - } - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp !== 0) { - return cmp; - } - return strcmp(mappingA.name, mappingB.name); - } - exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; - function parseSourceMapInput(str) { - return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); - } - exports.parseSourceMapInput = parseSourceMapInput; - function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { - sourceURL = sourceURL || ''; - if (sourceRoot) { - if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { - sourceRoot += '/'; - } - sourceURL = sourceRoot + sourceURL; - } - if (sourceMapURL) { - var parsed = urlParse(sourceMapURL); - if (!parsed) { - throw new Error('sourceMapURL could not be parsed'); - } - if (parsed.path) { - var index = parsed.path.lastIndexOf('/'); - if (index >= 0) { - parsed.path = parsed.path.substring(0, index + 1); - } - } - sourceURL = join(urlGenerate(parsed), sourceURL); - } - return normalize(sourceURL); - } - exports.computeSourceURL = computeSourceURL; - }); - require.define('/node_modules/source-map/lib/source-map-generator.js', function (module, exports, __dirname, __filename) { - var base64VLQ = require('/node_modules/source-map/lib/base64-vlq.js', module); - var util = require('/node_modules/source-map/lib/util.js', module); - var ArraySet = require('/node_modules/source-map/lib/array-set.js', module).ArraySet; - var MappingList = require('/node_modules/source-map/lib/mapping-list.js', module).MappingList; - function SourceMapGenerator(aArgs) { - if (!aArgs) { - aArgs = {}; - } - this._file = util.getArg(aArgs, 'file', null); - this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); - this._skipValidation = util.getArg(aArgs, 'skipValidation', false); - this._sources = new ArraySet; - this._names = new ArraySet; - this._mappings = new MappingList; - this._sourcesContents = null; - } - SourceMapGenerator.prototype._version = 3; - SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { - var sourceRoot = aSourceMapConsumer.sourceRoot; - var generator = new SourceMapGenerator({ - file: aSourceMapConsumer.file, - sourceRoot: sourceRoot - }); - aSourceMapConsumer.eachMapping(function (mapping) { - var newMapping = { - generated: { - line: mapping.generatedLine, - column: mapping.generatedColumn - } - }; - if (mapping.source != null) { - newMapping.source = mapping.source; - if (sourceRoot != null) { - newMapping.source = util.relative(sourceRoot, newMapping.source); - } - newMapping.original = { - line: mapping.originalLine, - column: mapping.originalColumn - }; - if (mapping.name != null) { - newMapping.name = mapping.name; - } - } - generator.addMapping(newMapping); - }); - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var sourceRelative = sourceFile; - if (sourceRoot !== null) { - sourceRelative = util.relative(sourceRoot, sourceFile); - } - if (!generator._sources.has(sourceRelative)) { - generator._sources.add(sourceRelative); - } - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - generator.setSourceContent(sourceFile, content); - } - }); - return generator; - }; - SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { - var generated = util.getArg(aArgs, 'generated'); - var original = util.getArg(aArgs, 'original', null); - var source = util.getArg(aArgs, 'source', null); - var name = util.getArg(aArgs, 'name', null); - if (!this._skipValidation) { - this._validateMapping(generated, original, source, name); - } - if (source != null) { - source = String(source); - if (!this._sources.has(source)) { - this._sources.add(source); - } - } - if (name != null) { - name = String(name); - if (!this._names.has(name)) { - this._names.add(name); - } - } - this._mappings.add({ - generatedLine: generated.line, - generatedColumn: generated.column, - originalLine: original != null && original.line, - originalColumn: original != null && original.column, - source: source, - name: name - }); - }; - SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { - var source = aSourceFile; - if (this._sourceRoot != null) { - source = util.relative(this._sourceRoot, source); - } - if (aSourceContent != null) { - if (!this._sourcesContents) { - this._sourcesContents = Object.create(null); - } - this._sourcesContents[util.toSetString(source)] = aSourceContent; - } else if (this._sourcesContents) { - delete this._sourcesContents[util.toSetString(source)]; - if (Object.keys(this._sourcesContents).length === 0) { - this._sourcesContents = null; - } - } - }; - SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { - var sourceFile = aSourceFile; - if (aSourceFile == null) { - if (aSourceMapConsumer.file == null) { - throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + 'or the source map\'s "file" property. Both were omitted.'); - } - sourceFile = aSourceMapConsumer.file; - } - var sourceRoot = this._sourceRoot; - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - var newSources = new ArraySet; - var newNames = new ArraySet; - this._mappings.unsortedForEach(function (mapping) { - if (mapping.source === sourceFile && mapping.originalLine != null) { - var original = aSourceMapConsumer.originalPositionFor({ - line: mapping.originalLine, - column: mapping.originalColumn - }); - if (original.source != null) { - mapping.source = original.source; - if (aSourceMapPath != null) { - mapping.source = util.join(aSourceMapPath, mapping.source); - } - if (sourceRoot != null) { - mapping.source = util.relative(sourceRoot, mapping.source); - } - mapping.originalLine = original.line; - mapping.originalColumn = original.column; - if (original.name != null) { - mapping.name = original.name; - } - } - } - var source = mapping.source; - if (source != null && !newSources.has(source)) { - newSources.add(source); - } - var name = mapping.name; - if (name != null && !newNames.has(name)) { - newNames.add(name); - } - }, this); - this._sources = newSources; - this._names = newNames; - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aSourceMapPath != null) { - sourceFile = util.join(aSourceMapPath, sourceFile); - } - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - this.setSourceContent(sourceFile, content); - } - }, this); - }; - SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { - if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { - throw new Error('original.line and original.column are not numbers -- you probably meant to omit ' + 'the original mapping entirely and only map the generated position. If so, pass ' + 'null for the original mapping instead of an object with empty or null values.'); - } - if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { - return; - } else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aOriginal && 'line' in aOriginal && 'column' in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { - return; - } else { - throw new Error('Invalid mapping: ' + JSON.stringify({ - generated: aGenerated, - source: aSource, - original: aOriginal, - name: aName - })); - } - }; - SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { - var previousGeneratedColumn = 0; - var previousGeneratedLine = 1; - var previousOriginalColumn = 0; - var previousOriginalLine = 0; - var previousName = 0; - var previousSource = 0; - var result = ''; - var next; - var mapping; - var nameIdx; - var sourceIdx; - var mappings = this._mappings.toArray(); - for (var i = 0, len = mappings.length; i < len; i++) { - mapping = mappings[i]; - next = ''; - if (mapping.generatedLine !== previousGeneratedLine) { - previousGeneratedColumn = 0; - while (mapping.generatedLine !== previousGeneratedLine) { - next += ';'; - previousGeneratedLine++; - } - } else { - if (i > 0) { - if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { - continue; - } - next += ','; - } - } - next += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn); - previousGeneratedColumn = mapping.generatedColumn; - if (mapping.source != null) { - sourceIdx = this._sources.indexOf(mapping.source); - next += base64VLQ.encode(sourceIdx - previousSource); - previousSource = sourceIdx; - next += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine); - previousOriginalLine = mapping.originalLine - 1; - next += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn); - previousOriginalColumn = mapping.originalColumn; - if (mapping.name != null) { - nameIdx = this._names.indexOf(mapping.name); - next += base64VLQ.encode(nameIdx - previousName); - previousName = nameIdx; - } - } - result += next; - } - return result; - }; - SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { - return aSources.map(function (source) { - if (!this._sourcesContents) { - return null; - } - if (aSourceRoot != null) { - source = util.relative(aSourceRoot, source); - } - var key = util.toSetString(source); - return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null; - }, this); - }; - SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { - var map = { - version: this._version, - sources: this._sources.toArray(), - names: this._names.toArray(), - mappings: this._serializeMappings() - }; - if (this._file != null) { - map.file = this._file; - } - if (this._sourceRoot != null) { - map.sourceRoot = this._sourceRoot; - } - if (this._sourcesContents) { - map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); - } - return map; - }; - SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { - return JSON.stringify(this.toJSON()); - }; - exports.SourceMapGenerator = SourceMapGenerator; - }); - require.define('/node_modules/source-map/lib/mapping-list.js', function (module, exports, __dirname, __filename) { - var util = require('/node_modules/source-map/lib/util.js', module); - function generatedPositionAfter(mappingA, mappingB) { - var lineA = mappingA.generatedLine; - var lineB = mappingB.generatedLine; - var columnA = mappingA.generatedColumn; - var columnB = mappingB.generatedColumn; - return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; - } - function MappingList() { - this._array = []; - this._sorted = true; - this._last = { - generatedLine: -1, - generatedColumn: 0 - }; - } - MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { - this._array.forEach(aCallback, aThisArg); - }; - MappingList.prototype.add = function MappingList_add(aMapping) { - if (generatedPositionAfter(this._last, aMapping)) { - this._last = aMapping; - this._array.push(aMapping); - } else { - this._sorted = false; - this._array.push(aMapping); - } - }; - MappingList.prototype.toArray = function MappingList_toArray() { - if (!this._sorted) { - this._array.sort(util.compareByGeneratedPositionsInflated); - this._sorted = true; - } - return this._array; - }; - exports.MappingList = MappingList; - }); - require.define('/node_modules/source-map/lib/array-set.js', function (module, exports, __dirname, __filename) { - var util = require('/node_modules/source-map/lib/util.js', module); - var has = Object.prototype.hasOwnProperty; - var hasNativeMap = typeof Map !== 'undefined'; - function ArraySet() { - this._array = []; - this._set = hasNativeMap ? new Map : Object.create(null); - } - ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { - var set = new ArraySet; - for (var i = 0, len = aArray.length; i < len; i++) { - set.add(aArray[i], aAllowDuplicates); - } - return set; - }; - ArraySet.prototype.size = function ArraySet_size() { - return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; - }; - ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { - var sStr = hasNativeMap ? aStr : util.toSetString(aStr); - var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); - var idx = this._array.length; - if (!isDuplicate || aAllowDuplicates) { - this._array.push(aStr); - } - if (!isDuplicate) { - if (hasNativeMap) { - this._set.set(aStr, idx); - } else { - this._set[sStr] = idx; - } - } - }; - ArraySet.prototype.has = function ArraySet_has(aStr) { - if (hasNativeMap) { - return this._set.has(aStr); - } else { - var sStr = util.toSetString(aStr); - return has.call(this._set, sStr); - } - }; - ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { - if (hasNativeMap) { - var idx = this._set.get(aStr); - if (idx >= 0) { - return idx; - } - } else { - var sStr = util.toSetString(aStr); - if (has.call(this._set, sStr)) { - return this._set[sStr]; - } - } - throw new Error('"' + aStr + '" is not in the set.'); - }; - ArraySet.prototype.at = function ArraySet_at(aIdx) { - if (aIdx >= 0 && aIdx < this._array.length) { - return this._array[aIdx]; - } - throw new Error('No element indexed by ' + aIdx); - }; - ArraySet.prototype.toArray = function ArraySet_toArray() { - return this._array.slice(); - }; - exports.ArraySet = ArraySet; - }); - require.define('/node_modules/source-map/lib/base64-vlq.js', function (module, exports, __dirname, __filename) { - var base64 = require('/node_modules/source-map/lib/base64.js', module); - var VLQ_BASE_SHIFT = 5; - var VLQ_BASE = 1 << VLQ_BASE_SHIFT; - var VLQ_BASE_MASK = VLQ_BASE - 1; - var VLQ_CONTINUATION_BIT = VLQ_BASE; - function toVLQSigned(aValue) { - return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0; - } - function fromVLQSigned(aValue) { - var isNegative = (aValue & 1) === 1; - var shifted = aValue >> 1; - return isNegative ? -shifted : shifted; - } - exports.encode = function base64VLQ_encode(aValue) { - var encoded = ''; - var digit; - var vlq = toVLQSigned(aValue); - do { - digit = vlq & VLQ_BASE_MASK; - vlq >>>= VLQ_BASE_SHIFT; - if (vlq > 0) { - digit |= VLQ_CONTINUATION_BIT; - } - encoded += base64.encode(digit); - } while (vlq > 0); - return encoded; - }; - exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { - var strLen = aStr.length; - var result = 0; - var shift = 0; - var continuation, digit; - do { - if (aIndex >= strLen) { - throw new Error('Expected more digits in base 64 VLQ value.'); - } - digit = base64.decode(aStr.charCodeAt(aIndex++)); - if (digit === -1) { - throw new Error('Invalid base64 digit: ' + aStr.charAt(aIndex - 1)); - } - continuation = !!(digit & VLQ_CONTINUATION_BIT); - digit &= VLQ_BASE_MASK; - result = result + (digit << shift); - shift += VLQ_BASE_SHIFT; - } while (continuation); - aOutParam.value = fromVLQSigned(result); - aOutParam.rest = aIndex; - }; - }); - require.define('/node_modules/source-map/lib/base64.js', function (module, exports, __dirname, __filename) { - var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); - exports.encode = function (number) { - if (0 <= number && number < intToCharMap.length) { - return intToCharMap[number]; - } - throw new TypeError('Must be between 0 and 63: ' + number); - }; - exports.decode = function (charCode) { - var bigA = 65; - var bigZ = 90; - var littleA = 97; - var littleZ = 122; - var zero = 48; - var nine = 57; - var plus = 43; - var slash = 47; - var littleOffset = 26; - var numberOffset = 52; - if (bigA <= charCode && charCode <= bigZ) { - return charCode - bigA; - } - if (littleA <= charCode && charCode <= littleZ) { - return charCode - littleA + littleOffset; - } - if (zero <= charCode && charCode <= nine) { - return charCode - zero + numberOffset; - } - if (charCode == plus) { - return 62; - } - if (charCode == slash) { - return 63; - } - return -1; - }; - }); - require.define('/node_modules/source-map/lib/source-map-consumer.js', function (module, exports, __dirname, __filename) { - var util = require('/node_modules/source-map/lib/util.js', module); - var binarySearch = require('/node_modules/source-map/lib/binary-search.js', module); - var ArraySet = require('/node_modules/source-map/lib/array-set.js', module).ArraySet; - var base64VLQ = require('/node_modules/source-map/lib/base64-vlq.js', module); - var quickSort = require('/node_modules/source-map/lib/quick-sort.js', module).quickSort; - function SourceMapConsumer(aSourceMap, aSourceMapURL) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = util.parseSourceMapInput(aSourceMap); - } - return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); - } - SourceMapConsumer.fromSourceMap = function (aSourceMap, aSourceMapURL) { - return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); - }; - SourceMapConsumer.prototype._version = 3; - SourceMapConsumer.prototype.__generatedMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { - configurable: true, - enumerable: true, - get: function () { - if (!this.__generatedMappings) { - this._parseMappings(this._mappings, this.sourceRoot); - } - return this.__generatedMappings; - } - }); - SourceMapConsumer.prototype.__originalMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { - configurable: true, - enumerable: true, - get: function () { - if (!this.__originalMappings) { - this._parseMappings(this._mappings, this.sourceRoot); - } - return this.__originalMappings; - } - }); - SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) { - var c = aStr.charAt(index); - return c === ';' || c === ','; - }; - SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - throw new Error('Subclasses must implement _parseMappings'); - }; - SourceMapConsumer.GENERATED_ORDER = 1; - SourceMapConsumer.ORIGINAL_ORDER = 2; - SourceMapConsumer.GREATEST_LOWER_BOUND = 1; - SourceMapConsumer.LEAST_UPPER_BOUND = 2; - SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { - var context = aContext || null; - var order = aOrder || SourceMapConsumer.GENERATED_ORDER; - var mappings; - switch (order) { - case SourceMapConsumer.GENERATED_ORDER: - mappings = this._generatedMappings; - break; - case SourceMapConsumer.ORIGINAL_ORDER: - mappings = this._originalMappings; - break; - default: - throw new Error('Unknown order of iteration.'); - } - var sourceRoot = this.sourceRoot; - mappings.map(function (mapping) { - var source = mapping.source === null ? null : this._sources.at(mapping.source); - source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); - return { - source: source, - generatedLine: mapping.generatedLine, - generatedColumn: mapping.generatedColumn, - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: mapping.name === null ? null : this._names.at(mapping.name) - }; - }, this).forEach(aCallback, context); - }; - SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { - var line = util.getArg(aArgs, 'line'); - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: line, - originalColumn: util.getArg(aArgs, 'column', 0) - }; - needle.source = this._findSourceIndex(needle.source); - if (needle.source < 0) { - return []; - } - var mappings = []; - var index = this._findMapping(needle, this._originalMappings, 'originalLine', 'originalColumn', util.compareByOriginalPositions, binarySearch.LEAST_UPPER_BOUND); - if (index >= 0) { - var mapping = this._originalMappings[index]; - if (aArgs.column === undefined) { - var originalLine = mapping.originalLine; - while (mapping && mapping.originalLine === originalLine) { - mappings.push({ - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }); - mapping = this._originalMappings[++index]; - } - } else { - var originalColumn = mapping.originalColumn; - while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) { - mappings.push({ - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }); - mapping = this._originalMappings[++index]; - } - } - } - return mappings; - }; - exports.SourceMapConsumer = SourceMapConsumer; - function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = util.parseSourceMapInput(aSourceMap); - } - var version = util.getArg(sourceMap, 'version'); - var sources = util.getArg(sourceMap, 'sources'); - var names = util.getArg(sourceMap, 'names', []); - var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); - var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); - var mappings = util.getArg(sourceMap, 'mappings'); - var file = util.getArg(sourceMap, 'file', null); - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - if (sourceRoot) { - sourceRoot = util.normalize(sourceRoot); - } - sources = sources.map(String).map(util.normalize).map(function (source) { - return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source; - }); - this._names = ArraySet.fromArray(names.map(String), true); - this._sources = ArraySet.fromArray(sources, true); - this._absoluteSources = this._sources.toArray().map(function (s) { - return util.computeSourceURL(sourceRoot, s, aSourceMapURL); - }); - this.sourceRoot = sourceRoot; - this.sourcesContent = sourcesContent; - this._mappings = mappings; - this._sourceMapURL = aSourceMapURL; - this.file = file; - } - BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); - BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; - BasicSourceMapConsumer.prototype._findSourceIndex = function (aSource) { - var relativeSource = aSource; - if (this.sourceRoot != null) { - relativeSource = util.relative(this.sourceRoot, relativeSource); - } - if (this._sources.has(relativeSource)) { - return this._sources.indexOf(relativeSource); - } - var i; - for (i = 0; i < this._absoluteSources.length; ++i) { - if (this._absoluteSources[i] == aSource) { - return i; - } - } - return -1; - }; - BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { - var smc = Object.create(BasicSourceMapConsumer.prototype); - var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); - var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); - smc.sourceRoot = aSourceMap._sourceRoot; - smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), smc.sourceRoot); - smc.file = aSourceMap._file; - smc._sourceMapURL = aSourceMapURL; - smc._absoluteSources = smc._sources.toArray().map(function (s) { - return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); - }); - var generatedMappings = aSourceMap._mappings.toArray().slice(); - var destGeneratedMappings = smc.__generatedMappings = []; - var destOriginalMappings = smc.__originalMappings = []; - for (var i = 0, length = generatedMappings.length; i < length; i++) { - var srcMapping = generatedMappings[i]; - var destMapping = new Mapping; - destMapping.generatedLine = srcMapping.generatedLine; - destMapping.generatedColumn = srcMapping.generatedColumn; - if (srcMapping.source) { - destMapping.source = sources.indexOf(srcMapping.source); - destMapping.originalLine = srcMapping.originalLine; - destMapping.originalColumn = srcMapping.originalColumn; - if (srcMapping.name) { - destMapping.name = names.indexOf(srcMapping.name); - } - destOriginalMappings.push(destMapping); - } - destGeneratedMappings.push(destMapping); - } - quickSort(smc.__originalMappings, util.compareByOriginalPositions); - return smc; - }; - BasicSourceMapConsumer.prototype._version = 3; - Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { - get: function () { - return this._absoluteSources.slice(); - } - }); - function Mapping() { - this.generatedLine = 0; - this.generatedColumn = 0; - this.source = null; - this.originalLine = null; - this.originalColumn = null; - this.name = null; - } - BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - var generatedLine = 1; - var previousGeneratedColumn = 0; - var previousOriginalLine = 0; - var previousOriginalColumn = 0; - var previousSource = 0; - var previousName = 0; - var length = aStr.length; - var index = 0; - var cachedSegments = {}; - var temp = {}; - var originalMappings = []; - var generatedMappings = []; - var mapping, str, segment, end, value; - while (index < length) { - if (aStr.charAt(index) === ';') { - generatedLine++; - index++; - previousGeneratedColumn = 0; - } else if (aStr.charAt(index) === ',') { - index++; - } else { - mapping = new Mapping; - mapping.generatedLine = generatedLine; - for (end = index; end < length; end++) { - if (this._charIsMappingSeparator(aStr, end)) { - break; - } - } - str = aStr.slice(index, end); - segment = cachedSegments[str]; - if (segment) { - index += str.length; - } else { - segment = []; - while (index < end) { - base64VLQ.decode(aStr, index, temp); - value = temp.value; - index = temp.rest; - segment.push(value); - } - if (segment.length === 2) { - throw new Error('Found a source, but no line and column'); - } - if (segment.length === 3) { - throw new Error('Found a source and line, but no column'); - } - cachedSegments[str] = segment; - } - mapping.generatedColumn = previousGeneratedColumn + segment[0]; - previousGeneratedColumn = mapping.generatedColumn; - if (segment.length > 1) { - mapping.source = previousSource + segment[1]; - previousSource += segment[1]; - mapping.originalLine = previousOriginalLine + segment[2]; - previousOriginalLine = mapping.originalLine; - mapping.originalLine += 1; - mapping.originalColumn = previousOriginalColumn + segment[3]; - previousOriginalColumn = mapping.originalColumn; - if (segment.length > 4) { - mapping.name = previousName + segment[4]; - previousName += segment[4]; - } - } - generatedMappings.push(mapping); - if (typeof mapping.originalLine === 'number') { - originalMappings.push(mapping); - } - } - } - quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); - this.__generatedMappings = generatedMappings; - quickSort(originalMappings, util.compareByOriginalPositions); - this.__originalMappings = originalMappings; - }; - BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) { - if (aNeedle[aLineName] <= 0) { - throw new TypeError('Line must be greater than or equal to 1, got ' + aNeedle[aLineName]); - } - if (aNeedle[aColumnName] < 0) { - throw new TypeError('Column must be greater than or equal to 0, got ' + aNeedle[aColumnName]); - } - return binarySearch.search(aNeedle, aMappings, aComparator, aBias); - }; - BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { - for (var index = 0; index < this._generatedMappings.length; ++index) { - var mapping = this._generatedMappings[index]; - if (index + 1 < this._generatedMappings.length) { - var nextMapping = this._generatedMappings[index + 1]; - if (mapping.generatedLine === nextMapping.generatedLine) { - mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; - continue; - } - } - mapping.lastGeneratedColumn = Infinity; - } - }; - BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - var index = this._findMapping(needle, this._generatedMappings, 'generatedLine', 'generatedColumn', util.compareByGeneratedPositionsDeflated, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)); - if (index >= 0) { - var mapping = this._generatedMappings[index]; - if (mapping.generatedLine === needle.generatedLine) { - var source = util.getArg(mapping, 'source', null); - if (source !== null) { - source = this._sources.at(source); - source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); - } - var name = util.getArg(mapping, 'name', null); - if (name !== null) { - name = this._names.at(name); - } - return { - source: source, - line: util.getArg(mapping, 'originalLine', null), - column: util.getArg(mapping, 'originalColumn', null), - name: name - }; - } - } - return { - source: null, - line: null, - column: null, - name: null - }; - }; - BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { - if (!this.sourcesContent) { - return false; - } - return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (sc) { - return sc == null; - }); - }; - BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { - if (!this.sourcesContent) { - return null; - } - var index = this._findSourceIndex(aSource); - if (index >= 0) { - return this.sourcesContent[index]; - } - var relativeSource = aSource; - if (this.sourceRoot != null) { - relativeSource = util.relative(this.sourceRoot, relativeSource); - } - var url; - if (this.sourceRoot != null && (url = util.urlParse(this.sourceRoot))) { - var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ''); - if (url.scheme == 'file' && this._sources.has(fileUriAbsPath)) { - return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]; - } - if ((!url.path || url.path == '/') && this._sources.has('/' + relativeSource)) { - return this.sourcesContent[this._sources.indexOf('/' + relativeSource)]; - } - } - if (nullOnMissing) { - return null; - } else { - throw new Error('"' + relativeSource + '" is not in the SourceMap.'); - } - }; - BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) { - var source = util.getArg(aArgs, 'source'); - source = this._findSourceIndex(source); - if (source < 0) { - return { - line: null, - column: null, - lastColumn: null - }; - } - var needle = { - source: source, - originalLine: util.getArg(aArgs, 'line'), - originalColumn: util.getArg(aArgs, 'column') - }; - var index = this._findMapping(needle, this._originalMappings, 'originalLine', 'originalColumn', util.compareByOriginalPositions, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)); - if (index >= 0) { - var mapping = this._originalMappings[index]; - if (mapping.source === needle.source) { - return { - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }; - } - } - return { - line: null, - column: null, - lastColumn: null - }; - }; - exports.BasicSourceMapConsumer = BasicSourceMapConsumer; - function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = util.parseSourceMapInput(aSourceMap); - } - var version = util.getArg(sourceMap, 'version'); - var sections = util.getArg(sourceMap, 'sections'); - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - this._sources = new ArraySet; - this._names = new ArraySet; - var lastOffset = { - line: -1, - column: 0 - }; - this._sections = sections.map(function (s) { - if (s.url) { - throw new Error('Support for url field in sections not implemented.'); - } - var offset = util.getArg(s, 'offset'); - var offsetLine = util.getArg(offset, 'line'); - var offsetColumn = util.getArg(offset, 'column'); - if (offsetLine < lastOffset.line || offsetLine === lastOffset.line && offsetColumn < lastOffset.column) { - throw new Error('Section offsets must be ordered and non-overlapping.'); - } - lastOffset = offset; - return { - generatedOffset: { - generatedLine: offsetLine + 1, - generatedColumn: offsetColumn + 1 - }, - consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL) - }; - }); - } - IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); - IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; - IndexedSourceMapConsumer.prototype._version = 3; - Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { - get: function () { - var sources = []; - for (var i = 0; i < this._sections.length; i++) { - for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { - sources.push(this._sections[i].consumer.sources[j]); - } - } - return sources; - } - }); - IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - var sectionIndex = binarySearch.search(needle, this._sections, function (needle, section) { - var cmp = needle.generatedLine - section.generatedOffset.generatedLine; - if (cmp) { - return cmp; - } - return needle.generatedColumn - section.generatedOffset.generatedColumn; - }); - var section = this._sections[sectionIndex]; - if (!section) { - return { - source: null, - line: null, - column: null, - name: null - }; - } - return section.consumer.originalPositionFor({ - line: needle.generatedLine - (section.generatedOffset.generatedLine - 1), - column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), - bias: aArgs.bias - }); - }; - IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { - return this._sections.every(function (s) { - return s.consumer.hasContentsOfAllSources(); - }); - }; - IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { - for (var i = 0; i < this._sections.length; i++) { - var section = this._sections[i]; - var content = section.consumer.sourceContentFor(aSource, true); - if (content) { - return content; - } - } - if (nullOnMissing) { - return null; - } else { - throw new Error('"' + aSource + '" is not in the SourceMap.'); - } - }; - IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { - for (var i = 0; i < this._sections.length; i++) { - var section = this._sections[i]; - if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { - continue; - } - var generatedPosition = section.consumer.generatedPositionFor(aArgs); - if (generatedPosition) { - var ret = { - line: generatedPosition.line + (section.generatedOffset.generatedLine - 1), - column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0) - }; - return ret; - } - } - return { - line: null, - column: null - }; - }; - IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { - this.__generatedMappings = []; - this.__originalMappings = []; - for (var i = 0; i < this._sections.length; i++) { - var section = this._sections[i]; - var sectionMappings = section.consumer._generatedMappings; - for (var j = 0; j < sectionMappings.length; j++) { - var mapping = sectionMappings[j]; - var source = section.consumer._sources.at(mapping.source); - source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); - this._sources.add(source); - source = this._sources.indexOf(source); - var name = null; - if (mapping.name) { - name = section.consumer._names.at(mapping.name); - this._names.add(name); - name = this._names.indexOf(name); - } - var adjustedMapping = { - source: source, - generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1), - generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: name - }; - this.__generatedMappings.push(adjustedMapping); - if (typeof adjustedMapping.originalLine === 'number') { - this.__originalMappings.push(adjustedMapping); - } - } - } - quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); - quickSort(this.__originalMappings, util.compareByOriginalPositions); - }; - exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; - }); - require.define('/node_modules/source-map/lib/quick-sort.js', function (module, exports, __dirname, __filename) { - function swap(ary, x, y) { - var temp = ary[x]; - ary[x] = ary[y]; - ary[y] = temp; - } - function randomIntInRange(low, high) { - return Math.round(low + Math.random() * (high - low)); - } - function doQuickSort(ary, comparator, p, r) { - if (p < r) { - var pivotIndex = randomIntInRange(p, r); - var i = p - 1; - swap(ary, pivotIndex, r); - var pivot = ary[r]; - for (var j = p; j < r; j++) { - if (comparator(ary[j], pivot) <= 0) { - i += 1; - swap(ary, i, j); - } - } - swap(ary, i + 1, j); - var q = i + 1; - doQuickSort(ary, comparator, p, q - 1); - doQuickSort(ary, comparator, q + 1, r); - } - } - exports.quickSort = function (ary, comparator) { - doQuickSort(ary, comparator, 0, ary.length - 1); - }; - }); - require.define('/node_modules/source-map/lib/binary-search.js', function (module, exports, __dirname, __filename) { - exports.GREATEST_LOWER_BOUND = 1; - exports.LEAST_UPPER_BOUND = 2; - function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { - var mid = Math.floor((aHigh - aLow) / 2) + aLow; - var cmp = aCompare(aNeedle, aHaystack[mid], true); - if (cmp === 0) { - return mid; - } else if (cmp > 0) { - if (aHigh - mid > 1) { - return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); - } - if (aBias == exports.LEAST_UPPER_BOUND) { - return aHigh < aHaystack.length ? aHigh : -1; - } else { - return mid; - } - } else { - if (mid - aLow > 1) { - return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); - } - if (aBias == exports.LEAST_UPPER_BOUND) { - return mid; - } else { - return aLow < 0 ? -1 : aLow; - } - } - } - exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { - if (aHaystack.length === 0) { - return -1; - } - var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare, aBias || exports.GREATEST_LOWER_BOUND); - if (index < 0) { - return -1; - } - while (index - 1 >= 0) { - if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { - break; - } - --index; - } - return index; - }; - }); - require.define('/node_modules/esutils/lib/utils.js', function (module, exports, __dirname, __filename) { - (function () { - 'use strict'; - exports.ast = require('/node_modules/esutils/lib/ast.js', module); - exports.code = require('/node_modules/esutils/lib/code.js', module); - exports.keyword = require('/node_modules/esutils/lib/keyword.js', module); - }()); - }); - require.define('/node_modules/esutils/lib/keyword.js', function (module, exports, __dirname, __filename) { - (function () { - 'use strict'; - var code = require('/node_modules/esutils/lib/code.js', module); - function isStrictModeReservedWordES6(id) { - switch (id) { - case 'implements': - case 'interface': - case 'package': - case 'private': - case 'protected': - case 'public': - case 'static': - case 'let': - return true; - default: - return false; - } - } - function isKeywordES5(id, strict) { - if (!strict && id === 'yield') { - return false; - } - return isKeywordES6(id, strict); - } - function isKeywordES6(id, strict) { - if (strict && isStrictModeReservedWordES6(id)) { - return true; - } - switch (id.length) { - case 2: - return id === 'if' || id === 'in' || id === 'do'; - case 3: - return id === 'var' || id === 'for' || id === 'new' || id === 'try'; - case 4: - return id === 'this' || id === 'else' || id === 'case' || id === 'void' || id === 'with' || id === 'enum'; - case 5: - return id === 'while' || id === 'break' || id === 'catch' || id === 'throw' || id === 'const' || id === 'yield' || id === 'class' || id === 'super'; - case 6: - return id === 'return' || id === 'typeof' || id === 'delete' || id === 'switch' || id === 'export' || id === 'import'; - case 7: - return id === 'default' || id === 'finally' || id === 'extends'; - case 8: - return id === 'function' || id === 'continue' || id === 'debugger'; - case 10: - return id === 'instanceof'; - default: - return false; - } - } - function isReservedWordES5(id, strict) { - return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); - } - function isReservedWordES6(id, strict) { - return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); - } - function isRestrictedWord(id) { - return id === 'eval' || id === 'arguments'; - } - function isIdentifierNameES5(id) { - var i, iz, ch; - if (id.length === 0) { - return false; - } - ch = id.charCodeAt(0); - if (!code.isIdentifierStartES5(ch)) { - return false; - } - for (i = 1, iz = id.length; i < iz; ++i) { - ch = id.charCodeAt(i); - if (!code.isIdentifierPartES5(ch)) { - return false; - } - } - return true; - } - function decodeUtf16(lead, trail) { - return (lead - 55296) * 1024 + (trail - 56320) + 65536; - } - function isIdentifierNameES6(id) { - var i, iz, ch, lowCh, check; - if (id.length === 0) { - return false; - } - check = code.isIdentifierStartES6; - for (i = 0, iz = id.length; i < iz; ++i) { - ch = id.charCodeAt(i); - if (55296 <= ch && ch <= 56319) { - ++i; - if (i >= iz) { - return false; - } - lowCh = id.charCodeAt(i); - if (!(56320 <= lowCh && lowCh <= 57343)) { - return false; - } - ch = decodeUtf16(ch, lowCh); - } - if (!check(ch)) { - return false; - } - check = code.isIdentifierPartES6; - } - return true; - } - function isIdentifierES5(id, strict) { - return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); - } - function isIdentifierES6(id, strict) { - return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); - } - module.exports = { - isKeywordES5: isKeywordES5, - isKeywordES6: isKeywordES6, - isReservedWordES5: isReservedWordES5, - isReservedWordES6: isReservedWordES6, - isRestrictedWord: isRestrictedWord, - isIdentifierNameES5: isIdentifierNameES5, - isIdentifierNameES6: isIdentifierNameES6, - isIdentifierES5: isIdentifierES5, - isIdentifierES6: isIdentifierES6 - }; - }()); - }); - require.define('/node_modules/esutils/lib/code.js', function (module, exports, __dirname, __filename) { - (function () { - 'use strict'; - var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; - ES5Regex = { - NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, - NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ - }; - ES6Regex = { - NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]/, - NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDD0-\uDDDA\uDE00-\uDE11\uDE13-\uDE37\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ - }; - function isDecimalDigit(ch) { - return 48 <= ch && ch <= 57; - } - function isHexDigit(ch) { - return 48 <= ch && ch <= 57 || 97 <= ch && ch <= 102 || 65 <= ch && ch <= 70; - } - function isOctalDigit(ch) { - return ch >= 48 && ch <= 55; - } - NON_ASCII_WHITESPACES = [ - 5760, - 6158, - 8192, - 8193, - 8194, - 8195, - 8196, - 8197, - 8198, - 8199, - 8200, - 8201, - 8202, - 8239, - 8287, - 12288, - 65279 - ]; - function isWhiteSpace(ch) { - return ch === 32 || ch === 9 || ch === 11 || ch === 12 || ch === 160 || ch >= 5760 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; - } - function isLineTerminator(ch) { - return ch === 10 || ch === 13 || ch === 8232 || ch === 8233; - } - function fromCodePoint(cp) { - if (cp <= 65535) { - return String.fromCharCode(cp); - } - var cu1 = String.fromCharCode(Math.floor((cp - 65536) / 1024) + 55296); - var cu2 = String.fromCharCode((cp - 65536) % 1024 + 56320); - return cu1 + cu2; - } - IDENTIFIER_START = new Array(128); - for (ch = 0; ch < 128; ++ch) { - IDENTIFIER_START[ch] = ch >= 97 && ch <= 122 || ch >= 65 && ch <= 90 || ch === 36 || ch === 95; - } - IDENTIFIER_PART = new Array(128); - for (ch = 0; ch < 128; ++ch) { - IDENTIFIER_PART[ch] = ch >= 97 && ch <= 122 || ch >= 65 && ch <= 90 || ch >= 48 && ch <= 57 || ch === 36 || ch === 95; - } - function isIdentifierStartES5(ch) { - return ch < 128 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); - } - function isIdentifierPartES5(ch) { - return ch < 128 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); - } - function isIdentifierStartES6(ch) { - return ch < 128 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); - } - function isIdentifierPartES6(ch) { - return ch < 128 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); - } - module.exports = { - isDecimalDigit: isDecimalDigit, - isHexDigit: isHexDigit, - isOctalDigit: isOctalDigit, - isWhiteSpace: isWhiteSpace, - isLineTerminator: isLineTerminator, - isIdentifierStartES5: isIdentifierStartES5, - isIdentifierPartES5: isIdentifierPartES5, - isIdentifierStartES6: isIdentifierStartES6, - isIdentifierPartES6: isIdentifierPartES6 - }; - }()); - }); - require.define('/node_modules/esutils/lib/ast.js', function (module, exports, __dirname, __filename) { - (function () { - 'use strict'; - function isExpression(node) { - if (node == null) { - return false; - } - switch (node.type) { - case 'ArrayExpression': - case 'AssignmentExpression': - case 'BinaryExpression': - case 'CallExpression': - case 'ConditionalExpression': - case 'FunctionExpression': - case 'Identifier': - case 'Literal': - case 'LogicalExpression': - case 'MemberExpression': - case 'NewExpression': - case 'ObjectExpression': - case 'SequenceExpression': - case 'ThisExpression': - case 'UnaryExpression': - case 'UpdateExpression': - return true; - } - return false; - } - function isIterationStatement(node) { - if (node == null) { - return false; - } - switch (node.type) { - case 'DoWhileStatement': - case 'ForInStatement': - case 'ForStatement': - case 'WhileStatement': - return true; - } - return false; - } - function isStatement(node) { - if (node == null) { - return false; - } - switch (node.type) { - case 'BlockStatement': - case 'BreakStatement': - case 'ContinueStatement': - case 'DebuggerStatement': - case 'DoWhileStatement': - case 'EmptyStatement': - case 'ExpressionStatement': - case 'ForInStatement': - case 'ForStatement': - case 'IfStatement': - case 'LabeledStatement': - case 'ReturnStatement': - case 'SwitchStatement': - case 'ThrowStatement': - case 'TryStatement': - case 'VariableDeclaration': - case 'WhileStatement': - case 'WithStatement': - return true; - } - return false; - } - function isSourceElement(node) { - return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; - } - function trailingStatement(node) { - switch (node.type) { - case 'IfStatement': - if (node.alternate != null) { - return node.alternate; - } - return node.consequent; - case 'LabeledStatement': - case 'ForStatement': - case 'ForInStatement': - case 'WhileStatement': - case 'WithStatement': - return node.body; - } - return null; - } - function isProblematicIfStatement(node) { - var current; - if (node.type !== 'IfStatement') { - return false; - } - if (node.alternate == null) { - return false; - } - current = node.consequent; - do { - if (current.type === 'IfStatement') { - if (current.alternate == null) { - return true; - } - } - current = trailingStatement(current); - } while (current); - return false; - } - module.exports = { - isExpression: isExpression, - isStatement: isStatement, - isIterationStatement: isIterationStatement, - isSourceElement: isSourceElement, - isProblematicIfStatement: isProblematicIfStatement, - trailingStatement: trailingStatement - }; - }()); - }); - require.define('/node_modules/estraverse/estraverse.js', function (module, exports, __dirname, __filename) { - (function clone(exports) { - 'use strict'; - var Syntax, isArray, VisitorOption, VisitorKeys, objectCreate, objectKeys, BREAK, SKIP, REMOVE; - function ignoreJSHintError() { - } - isArray = Array.isArray; - if (!isArray) { - isArray = function isArray(array) { - return Object.prototype.toString.call(array) === '[object Array]'; - }; - } - function deepCopy(obj) { - var ret = {}, key, val; - for (key in obj) { - if (obj.hasOwnProperty(key)) { - val = obj[key]; - if (typeof val === 'object' && val !== null) { - ret[key] = deepCopy(val); - } else { - ret[key] = val; - } - } - } - return ret; - } - function shallowCopy(obj) { - var ret = {}, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) { - ret[key] = obj[key]; - } - } - return ret; - } - ignoreJSHintError(shallowCopy); - function upperBound(array, func) { - var diff, len, i, current; - len = array.length; - i = 0; - while (len) { - diff = len >>> 1; - current = i + diff; - if (func(array[current])) { - len = diff; - } else { - i = current + 1; - len -= diff + 1; - } - } - return i; - } - function lowerBound(array, func) { - var diff, len, i, current; - len = array.length; - i = 0; - while (len) { - diff = len >>> 1; - current = i + diff; - if (func(array[current])) { - i = current + 1; - len -= diff + 1; - } else { - len = diff; - } - } - return i; - } - ignoreJSHintError(lowerBound); - objectCreate = Object.create || function () { - function F() { - } - return function (o) { - F.prototype = o; - return new F; - }; - }(); - objectKeys = Object.keys || function (o) { - var keys = [], key; - for (key in o) { - keys.push(key); - } - return keys; - }; - function extend(to, from) { - var keys = objectKeys(from), key, i, len; - for (i = 0, len = keys.length; i < len; i += 1) { - key = keys[i]; - to[key] = from[key]; - } - return to; - } - Syntax = { - AssignmentExpression: 'AssignmentExpression', - AssignmentPattern: 'AssignmentPattern', - ArrayExpression: 'ArrayExpression', - ArrayPattern: 'ArrayPattern', - ArrowFunctionExpression: 'ArrowFunctionExpression', - AwaitExpression: 'AwaitExpression', - BlockStatement: 'BlockStatement', - BinaryExpression: 'BinaryExpression', - BreakStatement: 'BreakStatement', - CallExpression: 'CallExpression', - CatchClause: 'CatchClause', - ClassBody: 'ClassBody', - ClassDeclaration: 'ClassDeclaration', - ClassExpression: 'ClassExpression', - ComprehensionBlock: 'ComprehensionBlock', - ComprehensionExpression: 'ComprehensionExpression', - ConditionalExpression: 'ConditionalExpression', - ContinueStatement: 'ContinueStatement', - DebuggerStatement: 'DebuggerStatement', - DirectiveStatement: 'DirectiveStatement', - DoWhileStatement: 'DoWhileStatement', - EmptyStatement: 'EmptyStatement', - ExportAllDeclaration: 'ExportAllDeclaration', - ExportDefaultDeclaration: 'ExportDefaultDeclaration', - ExportNamedDeclaration: 'ExportNamedDeclaration', - ExportSpecifier: 'ExportSpecifier', - ExpressionStatement: 'ExpressionStatement', - ForStatement: 'ForStatement', - ForInStatement: 'ForInStatement', - ForOfStatement: 'ForOfStatement', - FunctionDeclaration: 'FunctionDeclaration', - FunctionExpression: 'FunctionExpression', - GeneratorExpression: 'GeneratorExpression', - Identifier: 'Identifier', - IfStatement: 'IfStatement', - ImportDeclaration: 'ImportDeclaration', - ImportDefaultSpecifier: 'ImportDefaultSpecifier', - ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', - ImportSpecifier: 'ImportSpecifier', - Literal: 'Literal', - LabeledStatement: 'LabeledStatement', - LogicalExpression: 'LogicalExpression', - MemberExpression: 'MemberExpression', - MetaProperty: 'MetaProperty', - MethodDefinition: 'MethodDefinition', - ModuleSpecifier: 'ModuleSpecifier', - NewExpression: 'NewExpression', - ObjectExpression: 'ObjectExpression', - ObjectPattern: 'ObjectPattern', - Program: 'Program', - Property: 'Property', - RestElement: 'RestElement', - ReturnStatement: 'ReturnStatement', - SequenceExpression: 'SequenceExpression', - SpreadElement: 'SpreadElement', - Super: 'Super', - SwitchStatement: 'SwitchStatement', - SwitchCase: 'SwitchCase', - TaggedTemplateExpression: 'TaggedTemplateExpression', - TemplateElement: 'TemplateElement', - TemplateLiteral: 'TemplateLiteral', - ThisExpression: 'ThisExpression', - ThrowStatement: 'ThrowStatement', - TryStatement: 'TryStatement', - UnaryExpression: 'UnaryExpression', - UpdateExpression: 'UpdateExpression', - VariableDeclaration: 'VariableDeclaration', - VariableDeclarator: 'VariableDeclarator', - WhileStatement: 'WhileStatement', - WithStatement: 'WithStatement', - YieldExpression: 'YieldExpression' - }; - VisitorKeys = { - AssignmentExpression: [ - 'left', - 'right' - ], - AssignmentPattern: [ - 'left', - 'right' - ], - ArrayExpression: ['elements'], - ArrayPattern: ['elements'], - ArrowFunctionExpression: [ - 'params', - 'body' - ], - AwaitExpression: ['argument'], - BlockStatement: ['body'], - BinaryExpression: [ - 'left', - 'right' - ], - BreakStatement: ['label'], - CallExpression: [ - 'callee', - 'arguments' - ], - CatchClause: [ - 'param', - 'body' - ], - ClassBody: ['body'], - ClassDeclaration: [ - 'id', - 'superClass', - 'body' - ], - ClassExpression: [ - 'id', - 'superClass', - 'body' - ], - ComprehensionBlock: [ - 'left', - 'right' - ], - ComprehensionExpression: [ - 'blocks', - 'filter', - 'body' - ], - ConditionalExpression: [ - 'test', - 'consequent', - 'alternate' - ], - ContinueStatement: ['label'], - DebuggerStatement: [], - DirectiveStatement: [], - DoWhileStatement: [ - 'body', - 'test' - ], - EmptyStatement: [], - ExportAllDeclaration: ['source'], - ExportDefaultDeclaration: ['declaration'], - ExportNamedDeclaration: [ - 'declaration', - 'specifiers', - 'source' - ], - ExportSpecifier: [ - 'exported', - 'local' - ], - ExpressionStatement: ['expression'], - ForStatement: [ - 'init', - 'test', - 'update', - 'body' - ], - ForInStatement: [ - 'left', - 'right', - 'body' - ], - ForOfStatement: [ - 'left', - 'right', - 'body' - ], - FunctionDeclaration: [ - 'id', - 'params', - 'body' - ], - FunctionExpression: [ - 'id', - 'params', - 'body' - ], - GeneratorExpression: [ - 'blocks', - 'filter', - 'body' - ], - Identifier: [], - IfStatement: [ - 'test', - 'consequent', - 'alternate' - ], - ImportDeclaration: [ - 'specifiers', - 'source' - ], - ImportDefaultSpecifier: ['local'], - ImportNamespaceSpecifier: ['local'], - ImportSpecifier: [ - 'imported', - 'local' - ], - Literal: [], - LabeledStatement: [ - 'label', - 'body' - ], - LogicalExpression: [ - 'left', - 'right' - ], - MemberExpression: [ - 'object', - 'property' - ], - MetaProperty: [ - 'meta', - 'property' - ], - MethodDefinition: [ - 'key', - 'value' - ], - ModuleSpecifier: [], - NewExpression: [ - 'callee', - 'arguments' - ], - ObjectExpression: ['properties'], - ObjectPattern: ['properties'], - Program: ['body'], - Property: [ - 'key', - 'value' - ], - RestElement: ['argument'], - ReturnStatement: ['argument'], - SequenceExpression: ['expressions'], - SpreadElement: ['argument'], - Super: [], - SwitchStatement: [ - 'discriminant', - 'cases' - ], - SwitchCase: [ - 'test', - 'consequent' - ], - TaggedTemplateExpression: [ - 'tag', - 'quasi' - ], - TemplateElement: [], - TemplateLiteral: [ - 'quasis', - 'expressions' - ], - ThisExpression: [], - ThrowStatement: ['argument'], - TryStatement: [ - 'block', - 'handler', - 'finalizer' - ], - UnaryExpression: ['argument'], - UpdateExpression: ['argument'], - VariableDeclaration: ['declarations'], - VariableDeclarator: [ - 'id', - 'init' - ], - WhileStatement: [ - 'test', - 'body' - ], - WithStatement: [ - 'object', - 'body' - ], - YieldExpression: ['argument'] - }; - BREAK = {}; - SKIP = {}; - REMOVE = {}; - VisitorOption = { - Break: BREAK, - Skip: SKIP, - Remove: REMOVE - }; - function Reference(parent, key) { - this.parent = parent; - this.key = key; - } - Reference.prototype.replace = function replace(node) { - this.parent[this.key] = node; - }; - Reference.prototype.remove = function remove() { - if (isArray(this.parent)) { - this.parent.splice(this.key, 1); - return true; - } else { - this.replace(null); - return false; - } - }; - function Element(node, path, wrap, ref) { - this.node = node; - this.path = path; - this.wrap = wrap; - this.ref = ref; - } - function Controller() { - } - Controller.prototype.path = function path() { - var i, iz, j, jz, result, element; - function addToPath(result, path) { - if (isArray(path)) { - for (j = 0, jz = path.length; j < jz; ++j) { - result.push(path[j]); - } - } else { - result.push(path); - } - } - if (!this.__current.path) { - return null; - } - result = []; - for (i = 2, iz = this.__leavelist.length; i < iz; ++i) { - element = this.__leavelist[i]; - addToPath(result, element.path); - } - addToPath(result, this.__current.path); - return result; - }; - Controller.prototype.type = function () { - var node = this.current(); - return node.type || this.__current.wrap; - }; - Controller.prototype.parents = function parents() { - var i, iz, result; - result = []; - for (i = 1, iz = this.__leavelist.length; i < iz; ++i) { - result.push(this.__leavelist[i].node); - } - return result; - }; - Controller.prototype.current = function current() { - return this.__current.node; - }; - Controller.prototype.__execute = function __execute(callback, element) { - var previous, result; - result = undefined; - previous = this.__current; - this.__current = element; - this.__state = null; - if (callback) { - result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node); - } - this.__current = previous; - return result; - }; - Controller.prototype.notify = function notify(flag) { - this.__state = flag; - }; - Controller.prototype.skip = function () { - this.notify(SKIP); - }; - Controller.prototype['break'] = function () { - this.notify(BREAK); - }; - Controller.prototype.remove = function () { - this.notify(REMOVE); - }; - Controller.prototype.__initialize = function (root, visitor) { - this.visitor = visitor; - this.root = root; - this.__worklist = []; - this.__leavelist = []; - this.__current = null; - this.__state = null; - this.__fallback = null; - if (visitor.fallback === 'iteration') { - this.__fallback = objectKeys; - } else if (typeof visitor.fallback === 'function') { - this.__fallback = visitor.fallback; - } - this.__keys = VisitorKeys; - if (visitor.keys) { - this.__keys = extend(objectCreate(this.__keys), visitor.keys); - } - }; - function isNode(node) { - if (node == null) { - return false; - } - return typeof node === 'object' && typeof node.type === 'string'; - } - function isProperty(nodeType, key) { - return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key; - } - Controller.prototype.traverse = function traverse(root, visitor) { - var worklist, leavelist, element, node, nodeType, ret, key, current, current2, candidates, candidate, sentinel; - this.__initialize(root, visitor); - sentinel = {}; - worklist = this.__worklist; - leavelist = this.__leavelist; - worklist.push(new Element(root, null, null, null)); - leavelist.push(new Element(null, null, null, null)); - while (worklist.length) { - element = worklist.pop(); - if (element === sentinel) { - element = leavelist.pop(); - ret = this.__execute(visitor.leave, element); - if (this.__state === BREAK || ret === BREAK) { - return; - } - continue; - } - if (element.node) { - ret = this.__execute(visitor.enter, element); - if (this.__state === BREAK || ret === BREAK) { - return; - } - worklist.push(sentinel); - leavelist.push(element); - if (this.__state === SKIP || ret === SKIP) { - continue; - } - node = element.node; - nodeType = node.type || element.wrap; - candidates = this.__keys[nodeType]; - if (!candidates) { - if (this.__fallback) { - candidates = this.__fallback(node); - } else { - throw new Error('Unknown node type ' + nodeType + '.'); - } - } - current = candidates.length; - while ((current -= 1) >= 0) { - key = candidates[current]; - candidate = node[key]; - if (!candidate) { - continue; - } - if (isArray(candidate)) { - current2 = candidate.length; - while ((current2 -= 1) >= 0) { - if (!candidate[current2]) { - continue; - } - if (isProperty(nodeType, candidates[current])) { - element = new Element(candidate[current2], [ - key, - current2 - ], 'Property', null); - } else if (isNode(candidate[current2])) { - element = new Element(candidate[current2], [ - key, - current2 - ], null, null); - } else { - continue; - } - worklist.push(element); - } - } else if (isNode(candidate)) { - worklist.push(new Element(candidate, key, null, null)); - } - } - } - } - }; - Controller.prototype.replace = function replace(root, visitor) { - var worklist, leavelist, node, nodeType, target, element, current, current2, candidates, candidate, sentinel, outer, key; - function removeElem(element) { - var i, key, nextElem, parent; - if (element.ref.remove()) { - key = element.ref.key; - parent = element.ref.parent; - i = worklist.length; - while (i--) { - nextElem = worklist[i]; - if (nextElem.ref && nextElem.ref.parent === parent) { - if (nextElem.ref.key < key) { - break; - } - --nextElem.ref.key; - } - } - } - } - this.__initialize(root, visitor); - sentinel = {}; - worklist = this.__worklist; - leavelist = this.__leavelist; - outer = { root: root }; - element = new Element(root, null, null, new Reference(outer, 'root')); - worklist.push(element); - leavelist.push(element); - while (worklist.length) { - element = worklist.pop(); - if (element === sentinel) { - element = leavelist.pop(); - target = this.__execute(visitor.leave, element); - if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) { - element.ref.replace(target); - } - if (this.__state === REMOVE || target === REMOVE) { - removeElem(element); - } - if (this.__state === BREAK || target === BREAK) { - return outer.root; - } - continue; - } - target = this.__execute(visitor.enter, element); - if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) { - element.ref.replace(target); - element.node = target; - } - if (this.__state === REMOVE || target === REMOVE) { - removeElem(element); - element.node = null; - } - if (this.__state === BREAK || target === BREAK) { - return outer.root; - } - node = element.node; - if (!node) { - continue; - } - worklist.push(sentinel); - leavelist.push(element); - if (this.__state === SKIP || target === SKIP) { - continue; - } - nodeType = node.type || element.wrap; - candidates = this.__keys[nodeType]; - if (!candidates) { - if (this.__fallback) { - candidates = this.__fallback(node); - } else { - throw new Error('Unknown node type ' + nodeType + '.'); - } - } - current = candidates.length; - while ((current -= 1) >= 0) { - key = candidates[current]; - candidate = node[key]; - if (!candidate) { - continue; - } - if (isArray(candidate)) { - current2 = candidate.length; - while ((current2 -= 1) >= 0) { - if (!candidate[current2]) { - continue; - } - if (isProperty(nodeType, candidates[current])) { - element = new Element(candidate[current2], [ - key, - current2 - ], 'Property', new Reference(candidate, current2)); - } else if (isNode(candidate[current2])) { - element = new Element(candidate[current2], [ - key, - current2 - ], null, new Reference(candidate, current2)); - } else { - continue; - } - worklist.push(element); - } - } else if (isNode(candidate)) { - worklist.push(new Element(candidate, key, null, new Reference(node, key))); - } - } - } - return outer.root; - }; - function traverse(root, visitor) { - var controller = new Controller; - return controller.traverse(root, visitor); - } - function replace(root, visitor) { - var controller = new Controller; - return controller.replace(root, visitor); - } - function extendCommentRange(comment, tokens) { - var target; - target = upperBound(tokens, function search(token) { - return token.range[0] > comment.range[0]; - }); - comment.extendedRange = [ - comment.range[0], - comment.range[1] - ]; - if (target !== tokens.length) { - comment.extendedRange[1] = tokens[target].range[0]; - } - target -= 1; - if (target >= 0) { - comment.extendedRange[0] = tokens[target].range[1]; - } - return comment; - } - function attachComments(tree, providedComments, tokens) { - var comments = [], comment, len, i, cursor; - if (!tree.range) { - throw new Error('attachComments needs range information'); - } - if (!tokens.length) { - if (providedComments.length) { - for (i = 0, len = providedComments.length; i < len; i += 1) { - comment = deepCopy(providedComments[i]); - comment.extendedRange = [ - 0, - tree.range[0] - ]; - comments.push(comment); - } - tree.leadingComments = comments; - } - return tree; - } - for (i = 0, len = providedComments.length; i < len; i += 1) { - comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens)); - } - cursor = 0; - traverse(tree, { - enter: function (node) { - var comment; - while (cursor < comments.length) { - comment = comments[cursor]; - if (comment.extendedRange[1] > node.range[0]) { - break; - } - if (comment.extendedRange[1] === node.range[0]) { - if (!node.leadingComments) { - node.leadingComments = []; - } - node.leadingComments.push(comment); - comments.splice(cursor, 1); - } else { - cursor += 1; - } - } - if (cursor === comments.length) { - return VisitorOption.Break; - } - if (comments[cursor].extendedRange[0] > node.range[1]) { - return VisitorOption.Skip; - } - } - }); - cursor = 0; - traverse(tree, { - leave: function (node) { - var comment; - while (cursor < comments.length) { - comment = comments[cursor]; - if (node.range[1] < comment.extendedRange[0]) { - break; - } - if (node.range[1] === comment.extendedRange[0]) { - if (!node.trailingComments) { - node.trailingComments = []; - } - node.trailingComments.push(comment); - comments.splice(cursor, 1); - } else { - cursor += 1; - } - } - if (cursor === comments.length) { - return VisitorOption.Break; - } - if (comments[cursor].extendedRange[0] > node.range[1]) { - return VisitorOption.Skip; - } - } - }); - return tree; - } - exports.version = require('/node_modules/estraverse/package.json', module).version; - exports.Syntax = Syntax; - exports.traverse = traverse; - exports.replace = replace; - exports.attachComments = attachComments; - exports.VisitorKeys = VisitorKeys; - exports.VisitorOption = VisitorOption; - exports.Controller = Controller; - exports.cloneEnvironment = function () { - return clone({}); - }; - return exports; - }(exports)); - }); - require.define('/node_modules/estraverse/package.json', function (module, exports, __dirname, __filename) { - module.exports = { - '_from': 'estraverse@^4.2.0', - '_id': 'estraverse@4.2.0', - '_inBundle': false, - '_integrity': 'sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=', - '_location': '/estraverse', - '_phantomChildren': {}, - '_requested': { - 'type': 'range', - 'registry': true, - 'raw': 'estraverse@^4.2.0', - 'name': 'estraverse', - 'escapedName': 'estraverse', - 'rawSpec': '^4.2.0', - 'saveSpec': null, - 'fetchSpec': '^4.2.0' - }, - '_requiredBy': [ - '/', - '/eslint', - '/eslint/escope', - '/esquery', - '/esrecurse' - ], - '_resolved': 'https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz', - '_shasum': '0dee3fed31fcd469618ce7342099fc1afa0bdb13', - '_spec': 'estraverse@^4.2.0', - '_where': 'C:\\Users\\Ricardo\\Desktop\\escodegen-master', - 'bugs': { 'url': 'https://github.com/estools/estraverse/issues' }, - 'bundleDependencies': false, - 'deprecated': false, - 'description': 'ECMAScript JS AST traversal functions', - 'devDependencies': { - 'babel-preset-es2015': '^6.3.13', - 'babel-register': '^6.3.13', - 'chai': '^2.1.1', - 'espree': '^1.11.0', - 'gulp': '^3.8.10', - 'gulp-bump': '^0.2.2', - 'gulp-filter': '^2.0.0', - 'gulp-git': '^1.0.1', - 'gulp-tag-version': '^1.2.1', - 'jshint': '^2.5.6', - 'mocha': '^2.1.0' - }, - 'engines': { 'node': '>=0.10.0' }, - 'homepage': 'https://github.com/estools/estraverse', - 'license': 'BSD-2-Clause', - 'main': 'estraverse.js', - 'maintainers': [{ - 'name': 'Yusuke Suzuki', - 'email': 'utatane.tea@gmail.com', - 'url': 'http://github.com/Constellation' - }], - 'name': 'estraverse', - 'repository': { - 'type': 'git', - 'url': 'git+ssh://git@github.com/estools/estraverse.git' - }, - 'scripts': { - 'lint': 'jshint estraverse.js', - 'test': 'npm run-script lint && npm run-script unit-test', - 'unit-test': 'mocha --compilers js:babel-register' - }, - 'version': '4.2.0' - }; - }); - require('/tools/entry-point.js'); -}.call(this, this)); +// Generated by CommonJS Everywhere 0.9.7 +(function (global) { + function require(file, parentModule) { + if ({}.hasOwnProperty.call(require.cache, file)) + return require.cache[file]; + var resolved = require.resolve(file); + if (!resolved) + throw new Error('Failed to resolve module ' + file); + var module$ = { + id: file, + require: require, + filename: file, + exports: {}, + loaded: false, + parent: parentModule, + children: [] + }; + if (parentModule) + parentModule.children.push(module$); + var dirname = file.slice(0, file.lastIndexOf('/') + 1); + require.cache[file] = module$.exports; + resolved.call(module$.exports, module$, module$.exports, dirname, file); + module$.loaded = true; + return require.cache[file] = module$.exports; + } + require.modules = {}; + require.cache = {}; + require.resolve = function (file) { + return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0; + }; + require.define = function (file, fn) { + require.modules[file] = fn; + }; + var process = function () { + var cwd = '/'; + return { + title: 'browser', + version: 'v10.11.0', + browser: true, + env: {}, + argv: [], + nextTick: global.setImmediate || function (fn) { + setTimeout(fn, 0); + }, + cwd: function () { + return cwd; + }, + chdir: function (dir) { + cwd = dir; + } + }; + }(); + require.define('/tools/entry-point.js', function (module, exports, __dirname, __filename) { + (function () { + 'use strict'; + global.escodegen = require('/escodegen.js', module); + escodegen.browser = true; + }()); + }); + require.define('/escodegen.js', function (module, exports, __dirname, __filename) { + (function () { + 'use strict'; + var Syntax, Precedence, BinaryPrecedence, SourceNode, estraverse, esutils, base, indent, json, renumber, hexadecimal, quotes, escapeless, newline, space, parentheses, semicolons, safeConcatenation, directive, extra, parse, sourceMap, sourceCode, preserveBlankLines, FORMAT_MINIFY, FORMAT_DEFAULTS; + estraverse = require('/node_modules/estraverse/estraverse.js', module); + esutils = require('/node_modules/esutils/lib/utils.js', module); + Syntax = estraverse.Syntax; + function isExpression(node) { + return CodeGenerator.Expression.hasOwnProperty(node.type); + } + function isStatement(node) { + return CodeGenerator.Statement.hasOwnProperty(node.type); + } + Precedence = { + Sequence: 0, + Yield: 1, + Assignment: 1, + Conditional: 2, + ArrowFunction: 2, + LogicalOR: 3, + LogicalAND: 4, + BitwiseOR: 5, + BitwiseXOR: 6, + BitwiseAND: 7, + Equality: 8, + Relational: 9, + BitwiseSHIFT: 10, + Additive: 11, + Multiplicative: 12, + Await: 13, + Unary: 13, + Postfix: 14, + Call: 15, + New: 16, + TaggedTemplate: 17, + Member: 18, + Primary: 19 + }; + BinaryPrecedence = { + '||': Precedence.LogicalOR, + '&&': Precedence.LogicalAND, + '|': Precedence.BitwiseOR, + '^': Precedence.BitwiseXOR, + '&': Precedence.BitwiseAND, + '==': Precedence.Equality, + '!=': Precedence.Equality, + '===': Precedence.Equality, + '!==': Precedence.Equality, + 'is': Precedence.Equality, + 'isnt': Precedence.Equality, + '<': Precedence.Relational, + '>': Precedence.Relational, + '<=': Precedence.Relational, + '>=': Precedence.Relational, + 'in': Precedence.Relational, + 'instanceof': Precedence.Relational, + '<<': Precedence.BitwiseSHIFT, + '>>': Precedence.BitwiseSHIFT, + '>>>': Precedence.BitwiseSHIFT, + '+': Precedence.Additive, + '-': Precedence.Additive, + '*': Precedence.Multiplicative, + '%': Precedence.Multiplicative, + '/': Precedence.Multiplicative + }; + var F_ALLOW_IN = 1, F_ALLOW_CALL = 1 << 1, F_ALLOW_UNPARATH_NEW = 1 << 2, F_FUNC_BODY = 1 << 3, F_DIRECTIVE_CTX = 1 << 4, F_SEMICOLON_OPT = 1 << 5; + var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW, E_TTF = F_ALLOW_IN | F_ALLOW_CALL, E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW, E_TFF = F_ALLOW_IN, E_FFT = F_ALLOW_UNPARATH_NEW, E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW; + var S_TFFF = F_ALLOW_IN, S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT, S_FFFF = 0, S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX, S_TTFF = F_ALLOW_IN | F_FUNC_BODY; + function getDefaultOptions() { + return { + indent: null, + base: null, + parse: null, + comment: false, + format: { + indent: { + style: ' ', + base: 0, + adjustMultilineComment: false + }, + newline: '\n', + space: ' ', + json: false, + renumber: false, + hexadecimal: false, + quotes: 'single', + escapeless: false, + compact: false, + parentheses: true, + semicolons: true, + safeConcatenation: false, + preserveBlankLines: false + }, + moz: { + comprehensionExpressionStartsWithAssignment: false, + starlessGenerator: false + }, + sourceMap: null, + sourceMapRoot: null, + sourceMapWithCode: false, + directive: false, + raw: true, + verbatim: null, + sourceCode: null + }; + } + function stringRepeat(str, num) { + var result = ''; + for (num |= 0; num > 0; num >>>= 1, str += str) { + if (num & 1) { + result += str; + } + } + return result; + } + function hasLineTerminator(str) { + return /[\r\n]/g.test(str); + } + function endsWithLineTerminator(str) { + var len = str.length; + return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1)); + } + function merge(target, override) { + var key; + for (key in override) { + if (override.hasOwnProperty(key)) { + target[key] = override[key]; + } + } + return target; + } + function updateDeeply(target, override) { + var key, val; + function isHashObject(target) { + return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp); + } + for (key in override) { + if (override.hasOwnProperty(key)) { + val = override[key]; + if (isHashObject(val)) { + if (isHashObject(target[key])) { + updateDeeply(target[key], val); + } else { + target[key] = updateDeeply({}, val); + } + } else { + target[key] = val; + } + } + } + return target; + } + function generateNumber(value) { + var result, point, temp, exponent, pos; + if (value !== value) { + throw new Error('Numeric literal whose value is NaN'); + } + if (value < 0 || value === 0 && 1 / value < 0) { + throw new Error('Numeric literal whose value is negative'); + } + if (value === 1 / 0) { + return json ? 'null' : renumber ? '1e400' : '1e+400'; + } + result = '' + value; + if (!renumber || result.length < 3) { + return result; + } + point = result.indexOf('.'); + if (!json && result.charCodeAt(0) === 48 && point === 1) { + point = 0; + result = result.slice(1); + } + temp = result; + result = result.replace('e+', 'e'); + exponent = 0; + if ((pos = temp.indexOf('e')) > 0) { + exponent = +temp.slice(pos + 1); + temp = temp.slice(0, pos); + } + if (point >= 0) { + exponent -= temp.length - point - 1; + temp = +(temp.slice(0, point) + temp.slice(point + 1)) + ''; + } + pos = 0; + while (temp.charCodeAt(temp.length + pos - 1) === 48) { + --pos; + } + if (pos !== 0) { + exponent -= pos; + temp = temp.slice(0, pos); + } + if (exponent !== 0) { + temp += 'e' + exponent; + } + if ((temp.length < result.length || hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length) && +temp === value) { + result = temp; + } + return result; + } + function escapeRegExpCharacter(ch, previousIsBackslash) { + if ((ch & ~1) === 8232) { + return (previousIsBackslash ? 'u' : '\\u') + (ch === 8232 ? '2028' : '2029'); + } else if (ch === 10 || ch === 13) { + return (previousIsBackslash ? '' : '\\') + (ch === 10 ? 'n' : 'r'); + } + return String.fromCharCode(ch); + } + function generateRegExp(reg) { + var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash; + result = reg.toString(); + if (reg.source) { + match = result.match(/\/([^\/]*)$/); + if (!match) { + return result; + } + flags = match[1]; + result = ''; + characterInBrack = false; + previousIsBackslash = false; + for (i = 0, iz = reg.source.length; i < iz; ++i) { + ch = reg.source.charCodeAt(i); + if (!previousIsBackslash) { + if (characterInBrack) { + if (ch === 93) { + characterInBrack = false; + } + } else { + if (ch === 47) { + result += '\\'; + } else if (ch === 91) { + characterInBrack = true; + } + } + result += escapeRegExpCharacter(ch, previousIsBackslash); + previousIsBackslash = ch === 92; + } else { + result += escapeRegExpCharacter(ch, previousIsBackslash); + previousIsBackslash = false; + } + } + return '/' + result + '/' + flags; + } + return result; + } + function escapeAllowedCharacter(code, next) { + var hex; + if (code === 8) { + return '\\b'; + } + if (code === 12) { + return '\\f'; + } + if (code === 9) { + return '\\t'; + } + hex = code.toString(16).toUpperCase(); + if (json || code > 255) { + return '\\u' + '0000'.slice(hex.length) + hex; + } else if (code === 0 && !esutils.code.isDecimalDigit(next)) { + return '\\0'; + } else if (code === 11) { + return '\\x0B'; + } else { + return '\\x' + '00'.slice(hex.length) + hex; + } + } + function escapeDisallowedCharacter(code) { + if (code === 92) { + return '\\\\'; + } + if (code === 10) { + return '\\n'; + } + if (code === 13) { + return '\\r'; + } + if (code === 8232) { + return '\\u2028'; + } + if (code === 8233) { + return '\\u2029'; + } + throw new Error('Incorrectly classified character'); + } + function escapeDirective(str) { + var i, iz, code, quote; + quote = quotes === 'double' ? '"' : "'"; + for (i = 0, iz = str.length; i < iz; ++i) { + code = str.charCodeAt(i); + if (code === 39) { + quote = '"'; + break; + } else if (code === 34) { + quote = "'"; + break; + } else if (code === 92) { + ++i; + } + } + return quote + str + quote; + } + function escapeString(str) { + var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote; + for (i = 0, len = str.length; i < len; ++i) { + code = str.charCodeAt(i); + if (code === 39) { + ++singleQuotes; + } else if (code === 34) { + ++doubleQuotes; + } else if (code === 47 && json) { + result += '\\'; + } else if (esutils.code.isLineTerminator(code) || code === 92) { + result += escapeDisallowedCharacter(code); + continue; + } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 32 || !json && !escapeless && (code < 32 || code > 126))) { + result += escapeAllowedCharacter(code, str.charCodeAt(i + 1)); + continue; + } + result += String.fromCharCode(code); + } + single = !(quotes === 'double' || quotes === 'auto' && doubleQuotes < singleQuotes); + quote = single ? "'" : '"'; + if (!(single ? singleQuotes : doubleQuotes)) { + return quote + result + quote; + } + str = result; + result = quote; + for (i = 0, len = str.length; i < len; ++i) { + code = str.charCodeAt(i); + if (code === 39 && single || code === 34 && !single) { + result += '\\'; + } + result += String.fromCharCode(code); + } + return result + quote; + } + function flattenToString(arr) { + var i, iz, elem, result = ''; + for (i = 0, iz = arr.length; i < iz; ++i) { + elem = arr[i]; + result += Array.isArray(elem) ? flattenToString(elem) : elem; + } + return result; + } + function toSourceNodeWhenNeeded(generated, node) { + if (!sourceMap) { + if (Array.isArray(generated)) { + return flattenToString(generated); + } else { + return generated; + } + } + if (node == null) { + if (generated instanceof SourceNode) { + return generated; + } else { + node = {}; + } + } + if (node.loc == null) { + return new SourceNode(null, null, sourceMap, generated, node.name || null); + } + return new SourceNode(node.loc.start.line, node.loc.start.column, sourceMap === true ? node.loc.source || null : sourceMap, generated, node.name || null); + } + function noEmptySpace() { + return space ? space : ' '; + } + function join(left, right) { + var leftSource, rightSource, leftCharCode, rightCharCode; + leftSource = toSourceNodeWhenNeeded(left).toString(); + if (leftSource.length === 0) { + return [right]; + } + rightSource = toSourceNodeWhenNeeded(right).toString(); + if (rightSource.length === 0) { + return [left]; + } + leftCharCode = leftSource.charCodeAt(leftSource.length - 1); + rightCharCode = rightSource.charCodeAt(0); + if ((leftCharCode === 43 || leftCharCode === 45) && leftCharCode === rightCharCode || esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) || leftCharCode === 47 && rightCharCode === 105) { + return [ + left, + noEmptySpace(), + right + ]; + } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) || esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) { + return [ + left, + right + ]; + } + return [ + left, + space, + right + ]; + } + function addIndent(stmt) { + return [ + base, + stmt + ]; + } + function withIndent(fn) { + var previousBase; + previousBase = base; + base += indent; + fn(base); + base = previousBase; + } + function calculateSpaces(str) { + var i; + for (i = str.length - 1; i >= 0; --i) { + if (esutils.code.isLineTerminator(str.charCodeAt(i))) { + break; + } + } + return str.length - 1 - i; + } + function adjustMultilineComment(value, specialBase) { + var array, i, len, line, j, spaces, previousBase, sn; + array = value.split(/\r\n|[\r\n]/); + spaces = Number.MAX_VALUE; + for (i = 1, len = array.length; i < len; ++i) { + line = array[i]; + j = 0; + while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) { + ++j; + } + if (spaces > j) { + spaces = j; + } + } + if (typeof specialBase !== 'undefined') { + previousBase = base; + if (array[1][spaces] === '*') { + specialBase += ' '; + } + base = specialBase; + } else { + if (spaces & 1) { + --spaces; + } + previousBase = base; + } + for (i = 1, len = array.length; i < len; ++i) { + sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces))); + array[i] = sourceMap ? sn.join('') : sn; + } + base = previousBase; + return array.join('\n'); + } + function generateComment(comment, specialBase) { + if (comment.type === 'Line') { + if (endsWithLineTerminator(comment.value)) { + return '//' + comment.value; + } else { + var result = '//' + comment.value; + if (!preserveBlankLines) { + result += '\n'; + } + return result; + } + } + if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) { + return adjustMultilineComment('/*' + comment.value + '*/', specialBase); + } + return '/*' + comment.value + '*/'; + } + function addComments(stmt, result) { + var i, len, comment, save, tailingToStatement, specialBase, fragment, extRange, range, prevRange, prefix, infix, suffix, count; + if (stmt.leadingComments && stmt.leadingComments.length > 0) { + save = result; + if (preserveBlankLines) { + comment = stmt.leadingComments[0]; + result = []; + extRange = comment.extendedRange; + range = comment.range; + prefix = sourceCode.substring(extRange[0], range[0]); + count = (prefix.match(/\n/g) || []).length; + if (count > 0) { + result.push(stringRepeat('\n', count)); + result.push(addIndent(generateComment(comment))); + } else { + result.push(prefix); + result.push(generateComment(comment)); + } + prevRange = range; + for (i = 1, len = stmt.leadingComments.length; i < len; i++) { + comment = stmt.leadingComments[i]; + range = comment.range; + infix = sourceCode.substring(prevRange[1], range[0]); + count = (infix.match(/\n/g) || []).length; + result.push(stringRepeat('\n', count)); + result.push(addIndent(generateComment(comment))); + prevRange = range; + } + suffix = sourceCode.substring(range[1], extRange[1]); + count = (suffix.match(/\n/g) || []).length; + result.push(stringRepeat('\n', count)); + } else { + comment = stmt.leadingComments[0]; + result = []; + if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) { + result.push('\n'); + } + result.push(generateComment(comment)); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push('\n'); + } + for (i = 1, len = stmt.leadingComments.length; i < len; ++i) { + comment = stmt.leadingComments[i]; + fragment = [generateComment(comment)]; + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { + fragment.push('\n'); + } + result.push(addIndent(fragment)); + } + } + result.push(addIndent(save)); + } + if (stmt.trailingComments) { + if (preserveBlankLines) { + comment = stmt.trailingComments[0]; + extRange = comment.extendedRange; + range = comment.range; + prefix = sourceCode.substring(extRange[0], range[0]); + count = (prefix.match(/\n/g) || []).length; + if (count > 0) { + result.push(stringRepeat('\n', count)); + result.push(addIndent(generateComment(comment))); + } else { + result.push(prefix); + result.push(generateComment(comment)); + } + } else { + tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); + specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([ + base, + result, + indent + ]).toString())); + for (i = 0, len = stmt.trailingComments.length; i < len; ++i) { + comment = stmt.trailingComments[i]; + if (tailingToStatement) { + if (i === 0) { + result = [ + result, + indent + ]; + } else { + result = [ + result, + specialBase + ]; + } + result.push(generateComment(comment, specialBase)); + } else { + result = [ + result, + addIndent(generateComment(comment)) + ]; + } + if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result = [ + result, + '\n' + ]; + } + } + } + } + return result; + } + function generateBlankLines(start, end, result) { + var j, newlineCount = 0; + for (j = start; j < end; j++) { + if (sourceCode[j] === '\n') { + newlineCount++; + } + } + for (j = 1; j < newlineCount; j++) { + result.push(newline); + } + } + function parenthesize(text, current, should) { + if (current < should) { + return [ + '(', + text, + ')' + ]; + } + return text; + } + function generateVerbatimString(string) { + var i, iz, result; + result = string.split(/\r\n|\n/); + for (i = 1, iz = result.length; i < iz; i++) { + result[i] = newline + base + result[i]; + } + return result; + } + function generateVerbatim(expr, precedence) { + var verbatim, result, prec; + verbatim = expr[extra.verbatim]; + if (typeof verbatim === 'string') { + result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence); + } else { + result = generateVerbatimString(verbatim.content); + prec = verbatim.precedence != null ? verbatim.precedence : Precedence.Sequence; + result = parenthesize(result, prec, precedence); + } + return toSourceNodeWhenNeeded(result, expr); + } + function CodeGenerator() { + } + CodeGenerator.prototype.maybeBlock = function (stmt, flags) { + var result, noLeadingComment, that = this; + noLeadingComment = !extra.comment || !stmt.leadingComments; + if (stmt.type === Syntax.BlockStatement && noLeadingComment) { + return [ + space, + this.generateStatement(stmt, flags) + ]; + } + if (stmt.type === Syntax.EmptyStatement && noLeadingComment) { + return ';'; + } + withIndent(function () { + result = [ + newline, + addIndent(that.generateStatement(stmt, flags)) + ]; + }); + return result; + }; + CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) { + var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); + if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) { + return [ + result, + space + ]; + } + if (ends) { + return [ + result, + base + ]; + } + return [ + result, + newline, + base + ]; + }; + function generateIdentifier(node) { + return toSourceNodeWhenNeeded(node.name, node); + } + function generateAsyncPrefix(node, spaceRequired) { + return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : ''; + } + function generateStarSuffix(node) { + var isGenerator = node.generator && !extra.moz.starlessGenerator; + return isGenerator ? '*' + space : ''; + } + function generateMethodPrefix(prop) { + var func = prop.value, prefix = ''; + if (func.async) { + prefix += generateAsyncPrefix(func, !prop.computed); + } + if (func.generator) { + prefix += generateStarSuffix(func) ? '*' : ''; + } + return prefix; + } + CodeGenerator.prototype.generatePattern = function (node, precedence, flags) { + if (node.type === Syntax.Identifier) { + return generateIdentifier(node); + } + return this.generateExpression(node, precedence, flags); + }; + CodeGenerator.prototype.generateFunctionParams = function (node) { + var i, iz, result, hasDefault; + hasDefault = false; + if (node.type === Syntax.ArrowFunctionExpression && !node.rest && (!node.defaults || node.defaults.length === 0) && node.params.length === 1 && node.params[0].type === Syntax.Identifier) { + result = [ + generateAsyncPrefix(node, true), + generateIdentifier(node.params[0]) + ]; + } else { + result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : []; + result.push('('); + if (node.defaults) { + hasDefault = true; + } + for (i = 0, iz = node.params.length; i < iz; ++i) { + if (hasDefault && node.defaults[i]) { + result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT)); + } else { + result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT)); + } + if (i + 1 < iz) { + result.push(',' + space); + } + } + if (node.rest) { + if (node.params.length) { + result.push(',' + space); + } + result.push('...'); + result.push(generateIdentifier(node.rest)); + } + result.push(')'); + } + return result; + }; + CodeGenerator.prototype.generateFunctionBody = function (node) { + var result, expr; + result = this.generateFunctionParams(node); + if (node.type === Syntax.ArrowFunctionExpression) { + result.push(space); + result.push('=>'); + } + if (node.expression) { + result.push(space); + expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT); + if (expr.toString().charAt(0) === '{') { + expr = [ + '(', + expr, + ')' + ]; + } + result.push(expr); + } else { + result.push(this.maybeBlock(node.body, S_TTFF)); + } + return result; + }; + CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) { + var result = ['for' + space + (stmt.await ? 'await' + space : '') + '('], that = this; + withIndent(function () { + if (stmt.left.type === Syntax.VariableDeclaration) { + withIndent(function () { + result.push(stmt.left.kind + noEmptySpace()); + result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF)); + }); + } else { + result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT)); + } + result = join(result, operator); + result = [ + join(result, that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)), + ')' + ]; + }); + result.push(this.maybeBlock(stmt.body, flags)); + return result; + }; + CodeGenerator.prototype.generatePropertyKey = function (expr, computed) { + var result = []; + if (computed) { + result.push('['); + } + result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT)); + if (computed) { + result.push(']'); + } + return result; + }; + CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) { + if (Precedence.Assignment < precedence) { + flags |= F_ALLOW_IN; + } + return parenthesize([ + this.generateExpression(left, Precedence.Call, flags), + space + operator + space, + this.generateExpression(right, Precedence.Assignment, flags) + ], Precedence.Assignment, precedence); + }; + CodeGenerator.prototype.semicolon = function (flags) { + if (!semicolons && flags & F_SEMICOLON_OPT) { + return ''; + } + return ';'; + }; + CodeGenerator.Statement = { + BlockStatement: function (stmt, flags) { + var range, content, result = [ + '{', + newline + ], that = this; + withIndent(function () { + if (stmt.body.length === 0 && preserveBlankLines) { + range = stmt.range; + if (range[1] - range[0] > 2) { + content = sourceCode.substring(range[0] + 1, range[1] - 1); + if (content[0] === '\n') { + result = ['{']; + } + result.push(content); + } + } + var i, iz, fragment, bodyFlags; + bodyFlags = S_TFFF; + if (flags & F_FUNC_BODY) { + bodyFlags |= F_DIRECTIVE_CTX; + } + for (i = 0, iz = stmt.body.length; i < iz; ++i) { + if (preserveBlankLines) { + if (i === 0) { + if (stmt.body[0].leadingComments) { + range = stmt.body[0].leadingComments[0].extendedRange; + content = sourceCode.substring(range[0], range[1]); + if (content[0] === '\n') { + result = ['{']; + } + } + if (!stmt.body[0].leadingComments) { + generateBlankLines(stmt.range[0], stmt.body[0].range[0], result); + } + } + if (i > 0) { + if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) { + generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result); + } + } + } + if (i === iz - 1) { + bodyFlags |= F_SEMICOLON_OPT; + } + if (stmt.body[i].leadingComments && preserveBlankLines) { + fragment = that.generateStatement(stmt.body[i], bodyFlags); + } else { + fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags)); + } + result.push(fragment); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { + if (preserveBlankLines && i < iz - 1) { + if (!stmt.body[i + 1].leadingComments) { + result.push(newline); + } + } else { + result.push(newline); + } + } + if (preserveBlankLines) { + if (i === iz - 1) { + if (!stmt.body[i].trailingComments) { + generateBlankLines(stmt.body[i].range[1], stmt.range[1], result); + } + } + } + } + }); + result.push(addIndent('}')); + return result; + }, + BreakStatement: function (stmt, flags) { + if (stmt.label) { + return 'break ' + stmt.label.name + this.semicolon(flags); + } + return 'break' + this.semicolon(flags); + }, + ContinueStatement: function (stmt, flags) { + if (stmt.label) { + return 'continue ' + stmt.label.name + this.semicolon(flags); + } + return 'continue' + this.semicolon(flags); + }, + ClassBody: function (stmt, flags) { + var result = [ + '{', + newline + ], that = this; + withIndent(function (indent) { + var i, iz; + for (i = 0, iz = stmt.body.length; i < iz; ++i) { + result.push(indent); + result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT)); + if (i + 1 < iz) { + result.push(newline); + } + } + }); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + result.push(base); + result.push('}'); + return result; + }, + ClassDeclaration: function (stmt, flags) { + var result, fragment; + result = ['class']; + if (stmt.id) { + result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT)); + } + if (stmt.superClass) { + fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Assignment, E_TTT)); + result = join(result, fragment); + } + result.push(space); + result.push(this.generateStatement(stmt.body, S_TFFT)); + return result; + }, + DirectiveStatement: function (stmt, flags) { + if (extra.raw && stmt.raw) { + return stmt.raw + this.semicolon(flags); + } + return escapeDirective(stmt.directive) + this.semicolon(flags); + }, + DoWhileStatement: function (stmt, flags) { + var result = join('do', this.maybeBlock(stmt.body, S_TFFF)); + result = this.maybeBlockSuffix(stmt.body, result); + return join(result, [ + 'while' + space + '(', + this.generateExpression(stmt.test, Precedence.Sequence, E_TTT), + ')' + this.semicolon(flags) + ]); + }, + CatchClause: function (stmt, flags) { + var result, that = this; + withIndent(function () { + var guard; + result = [ + 'catch' + space + '(', + that.generateExpression(stmt.param, Precedence.Sequence, E_TTT), + ')' + ]; + if (stmt.guard) { + guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT); + result.splice(2, 0, ' if ', guard); + } + }); + result.push(this.maybeBlock(stmt.body, S_TFFF)); + return result; + }, + DebuggerStatement: function (stmt, flags) { + return 'debugger' + this.semicolon(flags); + }, + EmptyStatement: function (stmt, flags) { + return ';'; + }, + ExportDefaultDeclaration: function (stmt, flags) { + var result = ['export'], bodyFlags; + bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF; + result = join(result, 'default'); + if (isStatement(stmt.declaration)) { + result = join(result, this.generateStatement(stmt.declaration, bodyFlags)); + } else { + result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags)); + } + return result; + }, + ExportNamedDeclaration: function (stmt, flags) { + var result = ['export'], bodyFlags, that = this; + bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF; + if (stmt.declaration) { + return join(result, this.generateStatement(stmt.declaration, bodyFlags)); + } + if (stmt.specifiers) { + if (stmt.specifiers.length === 0) { + result = join(result, '{' + space + '}'); + } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) { + result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT)); + } else { + result = join(result, '{'); + withIndent(function (indent) { + var i, iz; + result.push(newline); + for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) { + result.push(indent); + result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT)); + if (i + 1 < iz) { + result.push(',' + newline); + } + } + }); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + result.push(base + '}'); + } + if (stmt.source) { + result = join(result, [ + 'from' + space, + this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), + this.semicolon(flags) + ]); + } else { + result.push(this.semicolon(flags)); + } + } + return result; + }, + ExportAllDeclaration: function (stmt, flags) { + return [ + 'export' + space, + '*' + space, + 'from' + space, + this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), + this.semicolon(flags) + ]; + }, + ExpressionStatement: function (stmt, flags) { + var result, fragment; + function isClassPrefixed(fragment) { + var code; + if (fragment.slice(0, 5) !== 'class') { + return false; + } + code = fragment.charCodeAt(5); + return code === 123 || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code); + } + function isFunctionPrefixed(fragment) { + var code; + if (fragment.slice(0, 8) !== 'function') { + return false; + } + code = fragment.charCodeAt(8); + return code === 40 || esutils.code.isWhiteSpace(code) || code === 42 || esutils.code.isLineTerminator(code); + } + function isAsyncPrefixed(fragment) { + var code, i, iz; + if (fragment.slice(0, 5) !== 'async') { + return false; + } + if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) { + return false; + } + for (i = 6, iz = fragment.length; i < iz; ++i) { + if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) { + break; + } + } + if (i === iz) { + return false; + } + if (fragment.slice(i, i + 8) !== 'function') { + return false; + } + code = fragment.charCodeAt(i + 8); + return code === 40 || esutils.code.isWhiteSpace(code) || code === 42 || esutils.code.isLineTerminator(code); + } + result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)]; + fragment = toSourceNodeWhenNeeded(result).toString(); + if (fragment.charCodeAt(0) === 123 || isClassPrefixed(fragment) || isFunctionPrefixed(fragment) || isAsyncPrefixed(fragment) || directive && flags & F_DIRECTIVE_CTX && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string') { + result = [ + '(', + result, + ')' + this.semicolon(flags) + ]; + } else { + result.push(this.semicolon(flags)); + } + return result; + }, + ImportDeclaration: function (stmt, flags) { + var result, cursor, that = this; + if (stmt.specifiers.length === 0) { + return [ + 'import', + space, + this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), + this.semicolon(flags) + ]; + } + result = ['import']; + cursor = 0; + if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) { + result = join(result, [this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)]); + ++cursor; + } + if (stmt.specifiers[cursor]) { + if (cursor !== 0) { + result.push(','); + } + if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) { + result = join(result, [ + space, + this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT) + ]); + } else { + result.push(space + '{'); + if (stmt.specifiers.length - cursor === 1) { + result.push(space); + result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)); + result.push(space + '}' + space); + } else { + withIndent(function (indent) { + var i, iz; + result.push(newline); + for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) { + result.push(indent); + result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT)); + if (i + 1 < iz) { + result.push(',' + newline); + } + } + }); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + result.push(base + '}' + space); + } + } + } + result = join(result, [ + 'from' + space, + this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), + this.semicolon(flags) + ]); + return result; + }, + VariableDeclarator: function (stmt, flags) { + var itemFlags = flags & F_ALLOW_IN ? E_TTT : E_FTT; + if (stmt.init) { + return [ + this.generateExpression(stmt.id, Precedence.Assignment, itemFlags), + space, + '=', + space, + this.generateExpression(stmt.init, Precedence.Assignment, itemFlags) + ]; + } + return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags); + }, + VariableDeclaration: function (stmt, flags) { + var result, i, iz, node, bodyFlags, that = this; + result = [stmt.kind]; + bodyFlags = flags & F_ALLOW_IN ? S_TFFF : S_FFFF; + function block() { + node = stmt.declarations[0]; + if (extra.comment && node.leadingComments) { + result.push('\n'); + result.push(addIndent(that.generateStatement(node, bodyFlags))); + } else { + result.push(noEmptySpace()); + result.push(that.generateStatement(node, bodyFlags)); + } + for (i = 1, iz = stmt.declarations.length; i < iz; ++i) { + node = stmt.declarations[i]; + if (extra.comment && node.leadingComments) { + result.push(',' + newline); + result.push(addIndent(that.generateStatement(node, bodyFlags))); + } else { + result.push(',' + space); + result.push(that.generateStatement(node, bodyFlags)); + } + } + } + if (stmt.declarations.length > 1) { + withIndent(block); + } else { + block(); + } + result.push(this.semicolon(flags)); + return result; + }, + ThrowStatement: function (stmt, flags) { + return [ + join('throw', this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)), + this.semicolon(flags) + ]; + }, + TryStatement: function (stmt, flags) { + var result, i, iz, guardedHandlers; + result = [ + 'try', + this.maybeBlock(stmt.block, S_TFFF) + ]; + result = this.maybeBlockSuffix(stmt.block, result); + if (stmt.handlers) { + for (i = 0, iz = stmt.handlers.length; i < iz; ++i) { + result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF)); + if (stmt.finalizer || i + 1 !== iz) { + result = this.maybeBlockSuffix(stmt.handlers[i].body, result); + } + } + } else { + guardedHandlers = stmt.guardedHandlers || []; + for (i = 0, iz = guardedHandlers.length; i < iz; ++i) { + result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF)); + if (stmt.finalizer || i + 1 !== iz) { + result = this.maybeBlockSuffix(guardedHandlers[i].body, result); + } + } + if (stmt.handler) { + if (Array.isArray(stmt.handler)) { + for (i = 0, iz = stmt.handler.length; i < iz; ++i) { + result = join(result, this.generateStatement(stmt.handler[i], S_TFFF)); + if (stmt.finalizer || i + 1 !== iz) { + result = this.maybeBlockSuffix(stmt.handler[i].body, result); + } + } + } else { + result = join(result, this.generateStatement(stmt.handler, S_TFFF)); + if (stmt.finalizer) { + result = this.maybeBlockSuffix(stmt.handler.body, result); + } + } + } + } + if (stmt.finalizer) { + result = join(result, [ + 'finally', + this.maybeBlock(stmt.finalizer, S_TFFF) + ]); + } + return result; + }, + SwitchStatement: function (stmt, flags) { + var result, fragment, i, iz, bodyFlags, that = this; + withIndent(function () { + result = [ + 'switch' + space + '(', + that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT), + ')' + space + '{' + newline + ]; + }); + if (stmt.cases) { + bodyFlags = S_TFFF; + for (i = 0, iz = stmt.cases.length; i < iz; ++i) { + if (i === iz - 1) { + bodyFlags |= F_SEMICOLON_OPT; + } + fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags)); + result.push(fragment); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { + result.push(newline); + } + } + } + result.push(addIndent('}')); + return result; + }, + SwitchCase: function (stmt, flags) { + var result, fragment, i, iz, bodyFlags, that = this; + withIndent(function () { + if (stmt.test) { + result = [ + join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)), + ':' + ]; + } else { + result = ['default:']; + } + i = 0; + iz = stmt.consequent.length; + if (iz && stmt.consequent[0].type === Syntax.BlockStatement) { + fragment = that.maybeBlock(stmt.consequent[0], S_TFFF); + result.push(fragment); + i = 1; + } + if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + bodyFlags = S_TFFF; + for (; i < iz; ++i) { + if (i === iz - 1 && flags & F_SEMICOLON_OPT) { + bodyFlags |= F_SEMICOLON_OPT; + } + fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags)); + result.push(fragment); + if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { + result.push(newline); + } + } + }); + return result; + }, + IfStatement: function (stmt, flags) { + var result, bodyFlags, semicolonOptional, that = this; + withIndent(function () { + result = [ + 'if' + space + '(', + that.generateExpression(stmt.test, Precedence.Sequence, E_TTT), + ')' + ]; + }); + semicolonOptional = flags & F_SEMICOLON_OPT; + bodyFlags = S_TFFF; + if (semicolonOptional) { + bodyFlags |= F_SEMICOLON_OPT; + } + if (stmt.alternate) { + result.push(this.maybeBlock(stmt.consequent, S_TFFF)); + result = this.maybeBlockSuffix(stmt.consequent, result); + if (stmt.alternate.type === Syntax.IfStatement) { + result = join(result, [ + 'else ', + this.generateStatement(stmt.alternate, bodyFlags) + ]); + } else { + result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags))); + } + } else { + result.push(this.maybeBlock(stmt.consequent, bodyFlags)); + } + return result; + }, + ForStatement: function (stmt, flags) { + var result, that = this; + withIndent(function () { + result = ['for' + space + '(']; + if (stmt.init) { + if (stmt.init.type === Syntax.VariableDeclaration) { + result.push(that.generateStatement(stmt.init, S_FFFF)); + } else { + result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT)); + result.push(';'); + } + } else { + result.push(';'); + } + if (stmt.test) { + result.push(space); + result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)); + result.push(';'); + } else { + result.push(';'); + } + if (stmt.update) { + result.push(space); + result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT)); + result.push(')'); + } else { + result.push(')'); + } + }); + result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); + return result; + }, + ForInStatement: function (stmt, flags) { + return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF); + }, + ForOfStatement: function (stmt, flags) { + return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF); + }, + LabeledStatement: function (stmt, flags) { + return [ + stmt.label.name + ':', + this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF) + ]; + }, + Program: function (stmt, flags) { + var result, fragment, i, iz, bodyFlags; + iz = stmt.body.length; + result = [safeConcatenation && iz > 0 ? '\n' : '']; + bodyFlags = S_TFTF; + for (i = 0; i < iz; ++i) { + if (!safeConcatenation && i === iz - 1) { + bodyFlags |= F_SEMICOLON_OPT; + } + if (preserveBlankLines) { + if (i === 0) { + if (!stmt.body[0].leadingComments) { + generateBlankLines(stmt.range[0], stmt.body[i].range[0], result); + } + } + if (i > 0) { + if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) { + generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result); + } + } + } + fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags)); + result.push(fragment); + if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { + if (preserveBlankLines) { + if (!stmt.body[i + 1].leadingComments) { + result.push(newline); + } + } else { + result.push(newline); + } + } + if (preserveBlankLines) { + if (i === iz - 1) { + if (!stmt.body[i].trailingComments) { + generateBlankLines(stmt.body[i].range[1], stmt.range[1], result); + } + } + } + } + return result; + }, + FunctionDeclaration: function (stmt, flags) { + return [ + generateAsyncPrefix(stmt, true), + 'function', + generateStarSuffix(stmt) || noEmptySpace(), + stmt.id ? generateIdentifier(stmt.id) : '', + this.generateFunctionBody(stmt) + ]; + }, + ReturnStatement: function (stmt, flags) { + if (stmt.argument) { + return [ + join('return', this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)), + this.semicolon(flags) + ]; + } + return ['return' + this.semicolon(flags)]; + }, + WhileStatement: function (stmt, flags) { + var result, that = this; + withIndent(function () { + result = [ + 'while' + space + '(', + that.generateExpression(stmt.test, Precedence.Sequence, E_TTT), + ')' + ]; + }); + result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); + return result; + }, + WithStatement: function (stmt, flags) { + var result, that = this; + withIndent(function () { + result = [ + 'with' + space + '(', + that.generateExpression(stmt.object, Precedence.Sequence, E_TTT), + ')' + ]; + }); + result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); + return result; + } + }; + merge(CodeGenerator.prototype, CodeGenerator.Statement); + CodeGenerator.Expression = { + SequenceExpression: function (expr, precedence, flags) { + var result, i, iz; + if (Precedence.Sequence < precedence) { + flags |= F_ALLOW_IN; + } + result = []; + for (i = 0, iz = expr.expressions.length; i < iz; ++i) { + result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags)); + if (i + 1 < iz) { + result.push(',' + space); + } + } + return parenthesize(result, Precedence.Sequence, precedence); + }, + AssignmentExpression: function (expr, precedence, flags) { + return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags); + }, + ArrowFunctionExpression: function (expr, precedence, flags) { + return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence); + }, + ConditionalExpression: function (expr, precedence, flags) { + if (Precedence.Conditional < precedence) { + flags |= F_ALLOW_IN; + } + return parenthesize([ + this.generateExpression(expr.test, Precedence.LogicalOR, flags), + space + '?' + space, + this.generateExpression(expr.consequent, Precedence.Assignment, flags), + space + ':' + space, + this.generateExpression(expr.alternate, Precedence.Assignment, flags) + ], Precedence.Conditional, precedence); + }, + LogicalExpression: function (expr, precedence, flags) { + return this.BinaryExpression(expr, precedence, flags); + }, + BinaryExpression: function (expr, precedence, flags) { + var result, currentPrecedence, fragment, leftSource; + currentPrecedence = BinaryPrecedence[expr.operator]; + if (currentPrecedence < precedence) { + flags |= F_ALLOW_IN; + } + fragment = this.generateExpression(expr.left, currentPrecedence, flags); + leftSource = fragment.toString(); + if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) { + result = [ + fragment, + noEmptySpace(), + expr.operator + ]; + } else { + result = join(fragment, expr.operator); + } + fragment = this.generateExpression(expr.right, currentPrecedence + 1, flags); + if (expr.operator === '/' && fragment.toString().charAt(0) === '/' || expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') { + result.push(noEmptySpace()); + result.push(fragment); + } else { + result = join(result, fragment); + } + if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) { + return [ + '(', + result, + ')' + ]; + } + return parenthesize(result, currentPrecedence, precedence); + }, + CallExpression: function (expr, precedence, flags) { + var result, i, iz; + result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)]; + result.push('('); + for (i = 0, iz = expr['arguments'].length; i < iz; ++i) { + result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT)); + if (i + 1 < iz) { + result.push(',' + space); + } + } + result.push(')'); + if (!(flags & F_ALLOW_CALL)) { + return [ + '(', + result, + ')' + ]; + } + return parenthesize(result, Precedence.Call, precedence); + }, + NewExpression: function (expr, precedence, flags) { + var result, length, i, iz, itemFlags; + length = expr['arguments'].length; + itemFlags = flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0 ? E_TFT : E_TFF; + result = join('new', this.generateExpression(expr.callee, Precedence.New, itemFlags)); + if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) { + result.push('('); + for (i = 0, iz = length; i < iz; ++i) { + result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT)); + if (i + 1 < iz) { + result.push(',' + space); + } + } + result.push(')'); + } + return parenthesize(result, Precedence.New, precedence); + }, + MemberExpression: function (expr, precedence, flags) { + var result, fragment; + result = [this.generateExpression(expr.object, Precedence.Call, flags & F_ALLOW_CALL ? E_TTF : E_TFF)]; + if (expr.computed) { + result.push('['); + result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT)); + result.push(']'); + } else { + if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') { + fragment = toSourceNodeWhenNeeded(result).toString(); + if (fragment.indexOf('.') < 0 && !/[eExX]/.test(fragment) && esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) && !(fragment.length >= 2 && fragment.charCodeAt(0) === 48)) { + result.push(' '); + } + } + result.push('.'); + result.push(generateIdentifier(expr.property)); + } + return parenthesize(result, Precedence.Member, precedence); + }, + MetaProperty: function (expr, precedence, flags) { + var result; + result = []; + result.push(typeof expr.meta === 'string' ? expr.meta : generateIdentifier(expr.meta)); + result.push('.'); + result.push(typeof expr.property === 'string' ? expr.property : generateIdentifier(expr.property)); + return parenthesize(result, Precedence.Member, precedence); + }, + UnaryExpression: function (expr, precedence, flags) { + var result, fragment, rightCharCode, leftSource, leftCharCode; + fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT); + if (space === '') { + result = join(expr.operator, fragment); + } else { + result = [expr.operator]; + if (expr.operator.length > 2) { + result = join(result, fragment); + } else { + leftSource = toSourceNodeWhenNeeded(result).toString(); + leftCharCode = leftSource.charCodeAt(leftSource.length - 1); + rightCharCode = fragment.toString().charCodeAt(0); + if ((leftCharCode === 43 || leftCharCode === 45) && leftCharCode === rightCharCode || esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode)) { + result.push(noEmptySpace()); + result.push(fragment); + } else { + result.push(fragment); + } + } + } + return parenthesize(result, Precedence.Unary, precedence); + }, + YieldExpression: function (expr, precedence, flags) { + var result; + if (expr.delegate) { + result = 'yield*'; + } else { + result = 'yield'; + } + if (expr.argument) { + result = join(result, this.generateExpression(expr.argument, Precedence.Yield, E_TTT)); + } + return parenthesize(result, Precedence.Yield, precedence); + }, + AwaitExpression: function (expr, precedence, flags) { + var result = join(expr.all ? 'await*' : 'await', this.generateExpression(expr.argument, Precedence.Await, E_TTT)); + return parenthesize(result, Precedence.Await, precedence); + }, + UpdateExpression: function (expr, precedence, flags) { + if (expr.prefix) { + return parenthesize([ + expr.operator, + this.generateExpression(expr.argument, Precedence.Unary, E_TTT) + ], Precedence.Unary, precedence); + } + return parenthesize([ + this.generateExpression(expr.argument, Precedence.Postfix, E_TTT), + expr.operator + ], Precedence.Postfix, precedence); + }, + FunctionExpression: function (expr, precedence, flags) { + var result = [ + generateAsyncPrefix(expr, true), + 'function' + ]; + if (expr.id) { + result.push(generateStarSuffix(expr) || noEmptySpace()); + result.push(generateIdentifier(expr.id)); + } else { + result.push(generateStarSuffix(expr) || space); + } + result.push(this.generateFunctionBody(expr)); + return result; + }, + ArrayPattern: function (expr, precedence, flags) { + return this.ArrayExpression(expr, precedence, flags, true); + }, + ArrayExpression: function (expr, precedence, flags, isPattern) { + var result, multiline, that = this; + if (!expr.elements.length) { + return '[]'; + } + multiline = isPattern ? false : expr.elements.length > 1; + result = [ + '[', + multiline ? newline : '' + ]; + withIndent(function (indent) { + var i, iz; + for (i = 0, iz = expr.elements.length; i < iz; ++i) { + if (!expr.elements[i]) { + if (multiline) { + result.push(indent); + } + if (i + 1 === iz) { + result.push(','); + } + } else { + result.push(multiline ? indent : ''); + result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT)); + } + if (i + 1 < iz) { + result.push(',' + (multiline ? newline : space)); + } + } + }); + if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + result.push(multiline ? base : ''); + result.push(']'); + return result; + }, + RestElement: function (expr, precedence, flags) { + return '...' + this.generatePattern(expr.argument); + }, + ClassExpression: function (expr, precedence, flags) { + var result, fragment; + result = ['class']; + if (expr.id) { + result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT)); + } + if (expr.superClass) { + fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Assignment, E_TTT)); + result = join(result, fragment); + } + result.push(space); + result.push(this.generateStatement(expr.body, S_TFFT)); + return result; + }, + MethodDefinition: function (expr, precedence, flags) { + var result, fragment; + if (expr['static']) { + result = ['static' + space]; + } else { + result = []; + } + if (expr.kind === 'get' || expr.kind === 'set') { + fragment = [ + join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)), + this.generateFunctionBody(expr.value) + ]; + } else { + fragment = [ + generateMethodPrefix(expr), + this.generatePropertyKey(expr.key, expr.computed), + this.generateFunctionBody(expr.value) + ]; + } + return join(result, fragment); + }, + Property: function (expr, precedence, flags) { + if (expr.kind === 'get' || expr.kind === 'set') { + return [ + expr.kind, + noEmptySpace(), + this.generatePropertyKey(expr.key, expr.computed), + this.generateFunctionBody(expr.value) + ]; + } + if (expr.shorthand) { + if (expr.value.type === 'AssignmentPattern') { + return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT); + } + return this.generatePropertyKey(expr.key, expr.computed); + } + if (expr.method) { + return [ + generateMethodPrefix(expr), + this.generatePropertyKey(expr.key, expr.computed), + this.generateFunctionBody(expr.value) + ]; + } + return [ + this.generatePropertyKey(expr.key, expr.computed), + ':' + space, + this.generateExpression(expr.value, Precedence.Assignment, E_TTT) + ]; + }, + ObjectExpression: function (expr, precedence, flags) { + var multiline, result, fragment, that = this; + if (!expr.properties.length) { + return '{}'; + } + multiline = expr.properties.length > 1; + withIndent(function () { + fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT); + }); + if (!multiline) { + if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { + return [ + '{', + space, + fragment, + space, + '}' + ]; + } + } + withIndent(function (indent) { + var i, iz; + result = [ + '{', + newline, + indent, + fragment + ]; + if (multiline) { + result.push(',' + newline); + for (i = 1, iz = expr.properties.length; i < iz; ++i) { + result.push(indent); + result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT)); + if (i + 1 < iz) { + result.push(',' + newline); + } + } + } + }); + if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + result.push(base); + result.push('}'); + return result; + }, + AssignmentPattern: function (expr, precedence, flags) { + return this.generateAssignment(expr.left, expr.right, '=', precedence, flags); + }, + ObjectPattern: function (expr, precedence, flags) { + var result, i, iz, multiline, property, that = this; + if (!expr.properties.length) { + return '{}'; + } + multiline = false; + if (expr.properties.length === 1) { + property = expr.properties[0]; + if (property.value.type !== Syntax.Identifier) { + multiline = true; + } + } else { + for (i = 0, iz = expr.properties.length; i < iz; ++i) { + property = expr.properties[i]; + if (!property.shorthand) { + multiline = true; + break; + } + } + } + result = [ + '{', + multiline ? newline : '' + ]; + withIndent(function (indent) { + var i, iz; + for (i = 0, iz = expr.properties.length; i < iz; ++i) { + result.push(multiline ? indent : ''); + result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT)); + if (i + 1 < iz) { + result.push(',' + (multiline ? newline : space)); + } + } + }); + if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { + result.push(newline); + } + result.push(multiline ? base : ''); + result.push('}'); + return result; + }, + ThisExpression: function (expr, precedence, flags) { + return 'this'; + }, + Super: function (expr, precedence, flags) { + return 'super'; + }, + Identifier: function (expr, precedence, flags) { + return generateIdentifier(expr); + }, + ImportDefaultSpecifier: function (expr, precedence, flags) { + return generateIdentifier(expr.id || expr.local); + }, + ImportNamespaceSpecifier: function (expr, precedence, flags) { + var result = ['*']; + var id = expr.id || expr.local; + if (id) { + result.push(space + 'as' + noEmptySpace() + generateIdentifier(id)); + } + return result; + }, + ImportSpecifier: function (expr, precedence, flags) { + var imported = expr.imported; + var result = [imported.name]; + var local = expr.local; + if (local && local.name !== imported.name) { + result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local)); + } + return result; + }, + ExportSpecifier: function (expr, precedence, flags) { + var local = expr.local; + var result = [local.name]; + var exported = expr.exported; + if (exported && exported.name !== local.name) { + result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported)); + } + return result; + }, + Literal: function (expr, precedence, flags) { + var raw; + if (expr.hasOwnProperty('raw') && parse && extra.raw) { + try { + raw = parse(expr.raw).body[0].expression; + if (raw.type === Syntax.Literal) { + if (raw.value === expr.value) { + return expr.raw; + } + } + } catch (e) { + } + } + if (expr.value === null) { + return 'null'; + } + if (typeof expr.value === 'string') { + return escapeString(expr.value); + } + if (typeof expr.value === 'number') { + return generateNumber(expr.value); + } + if (typeof expr.value === 'boolean') { + return expr.value ? 'true' : 'false'; + } + if (expr.regex) { + return '/' + expr.regex.pattern + '/' + expr.regex.flags; + } + return generateRegExp(expr.value); + }, + GeneratorExpression: function (expr, precedence, flags) { + return this.ComprehensionExpression(expr, precedence, flags); + }, + ComprehensionExpression: function (expr, precedence, flags) { + var result, i, iz, fragment, that = this; + result = expr.type === Syntax.GeneratorExpression ? ['('] : ['[']; + if (extra.moz.comprehensionExpressionStartsWithAssignment) { + fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT); + result.push(fragment); + } + if (expr.blocks) { + withIndent(function () { + for (i = 0, iz = expr.blocks.length; i < iz; ++i) { + fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT); + if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) { + result = join(result, fragment); + } else { + result.push(fragment); + } + } + }); + } + if (expr.filter) { + result = join(result, 'if' + space); + fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT); + result = join(result, [ + '(', + fragment, + ')' + ]); + } + if (!extra.moz.comprehensionExpressionStartsWithAssignment) { + fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT); + result = join(result, fragment); + } + result.push(expr.type === Syntax.GeneratorExpression ? ')' : ']'); + return result; + }, + ComprehensionBlock: function (expr, precedence, flags) { + var fragment; + if (expr.left.type === Syntax.VariableDeclaration) { + fragment = [ + expr.left.kind, + noEmptySpace(), + this.generateStatement(expr.left.declarations[0], S_FFFF) + ]; + } else { + fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT); + } + fragment = join(fragment, expr.of ? 'of' : 'in'); + fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT)); + return [ + 'for' + space + '(', + fragment, + ')' + ]; + }, + SpreadElement: function (expr, precedence, flags) { + return [ + '...', + this.generateExpression(expr.argument, Precedence.Assignment, E_TTT) + ]; + }, + TaggedTemplateExpression: function (expr, precedence, flags) { + var itemFlags = E_TTF; + if (!(flags & F_ALLOW_CALL)) { + itemFlags = E_TFF; + } + var result = [ + this.generateExpression(expr.tag, Precedence.Call, itemFlags), + this.generateExpression(expr.quasi, Precedence.Primary, E_FFT) + ]; + return parenthesize(result, Precedence.TaggedTemplate, precedence); + }, + TemplateElement: function (expr, precedence, flags) { + return expr.value.raw; + }, + TemplateLiteral: function (expr, precedence, flags) { + var result, i, iz; + result = ['`']; + for (i = 0, iz = expr.quasis.length; i < iz; ++i) { + result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT)); + if (i + 1 < iz) { + result.push('${' + space); + result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT)); + result.push(space + '}'); + } + } + result.push('`'); + return result; + }, + ModuleSpecifier: function (expr, precedence, flags) { + return this.Literal(expr, precedence, flags); + } + }; + merge(CodeGenerator.prototype, CodeGenerator.Expression); + CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) { + var result, type; + type = expr.type || Syntax.Property; + if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) { + return generateVerbatim(expr, precedence); + } + result = this[type](expr, precedence, flags); + if (extra.comment) { + result = addComments(expr, result); + } + return toSourceNodeWhenNeeded(result, expr); + }; + CodeGenerator.prototype.generateStatement = function (stmt, flags) { + var result, fragment; + result = this[stmt.type](stmt, flags); + if (extra.comment) { + result = addComments(stmt, result); + } + fragment = toSourceNodeWhenNeeded(result).toString(); + if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') { + result = sourceMap ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, ''); + } + return toSourceNodeWhenNeeded(result, stmt); + }; + function generateInternal(node) { + var codegen; + codegen = new CodeGenerator; + if (isStatement(node)) { + return codegen.generateStatement(node, S_TFFF); + } + if (isExpression(node)) { + return codegen.generateExpression(node, Precedence.Sequence, E_TTT); + } + throw new Error('Unknown node type: ' + node.type); + } + function generate(node, options) { + var defaultOptions = getDefaultOptions(), result, pair; + if (options != null) { + if (typeof options.indent === 'string') { + defaultOptions.format.indent.style = options.indent; + } + if (typeof options.base === 'number') { + defaultOptions.format.indent.base = options.base; + } + options = updateDeeply(defaultOptions, options); + indent = options.format.indent.style; + if (typeof options.base === 'string') { + base = options.base; + } else { + base = stringRepeat(indent, options.format.indent.base); + } + } else { + options = defaultOptions; + indent = options.format.indent.style; + base = stringRepeat(indent, options.format.indent.base); + } + json = options.format.json; + renumber = options.format.renumber; + hexadecimal = json ? false : options.format.hexadecimal; + quotes = json ? 'double' : options.format.quotes; + escapeless = options.format.escapeless; + newline = options.format.newline; + space = options.format.space; + if (options.format.compact) { + newline = space = indent = base = ''; + } + parentheses = options.format.parentheses; + semicolons = options.format.semicolons; + safeConcatenation = options.format.safeConcatenation; + directive = options.directive; + parse = json ? null : options.parse; + sourceMap = options.sourceMap; + sourceCode = options.sourceCode; + preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null; + extra = options; + if (sourceMap) { + if (!exports.browser) { + SourceNode = require('/node_modules/source-map/source-map.js', module).SourceNode; + } else { + SourceNode = global.sourceMap.SourceNode; + } + } + result = generateInternal(node); + if (!sourceMap) { + pair = { + code: result.toString(), + map: null + }; + return options.sourceMapWithCode ? pair : pair.code; + } + pair = result.toStringWithSourceMap({ + file: options.file, + sourceRoot: options.sourceMapRoot + }); + if (options.sourceContent) { + pair.map.setSourceContent(options.sourceMap, options.sourceContent); + } + if (options.sourceMapWithCode) { + return pair; + } + return pair.map.toString(); + } + FORMAT_MINIFY = { + indent: { + style: '', + base: 0 + }, + renumber: true, + hexadecimal: true, + quotes: 'auto', + escapeless: true, + compact: true, + parentheses: false, + semicolons: false + }; + FORMAT_DEFAULTS = getDefaultOptions().format; + exports.version = require('/package.json', module).version; + exports.generate = generate; + exports.attachComments = estraverse.attachComments; + exports.Precedence = updateDeeply({}, Precedence); + exports.browser = false; + exports.FORMAT_MINIFY = FORMAT_MINIFY; + exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS; + }()); + }); + require.define('/package.json', function (module, exports, __dirname, __filename) { + module.exports = { + 'name': 'escodegen', + 'description': 'ECMAScript code generator', + 'homepage': 'http://github.com/estools/escodegen', + 'main': 'escodegen.js', + 'bin': { + 'esgenerate': './bin/esgenerate.js', + 'escodegen': './bin/escodegen.js' + }, + 'files': [ + 'LICENSE.BSD', + 'README.md', + 'bin', + 'escodegen.js', + 'package.json' + ], + 'version': '1.11.0', + 'engines': { 'node': '>=4.0' }, + 'maintainers': [{ + 'name': 'Yusuke Suzuki', + 'email': 'utatane.tea@gmail.com', + 'web': 'http://github.com/Constellation' + }], + 'repository': { + 'type': 'git', + 'url': 'http://github.com/estools/escodegen.git' + }, + 'dependencies': { + 'estraverse': '^4.2.0', + 'esutils': '^2.0.2', + 'esprima': '^3.1.3', + 'optionator': '^0.8.1' + }, + 'optionalDependencies': { 'source-map': '~0.6.1' }, + 'devDependencies': { + 'acorn': '^4.0.4', + 'bluebird': '^3.4.7', + 'bower-registry-client': '^1.0.0', + 'chai': '^3.5.0', + 'commonjs-everywhere': '^0.9.7', + 'gulp': '^3.8.10', + 'gulp-eslint': '^3.0.1', + 'gulp-mocha': '^3.0.1', + 'semver': '^5.1.0' + }, + 'license': 'BSD-2-Clause', + 'scripts': { + 'test': 'gulp travis', + 'unit-test': 'gulp test', + 'lint': 'gulp lint', + 'release': 'node tools/release.js', + 'build-min': './node_modules/.bin/cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js', + 'build': './node_modules/.bin/cjsify -a path: tools/entry-point.js > escodegen.browser.js' + } + }; + }); + require.define('/node_modules/source-map/source-map.js', function (module, exports, __dirname, __filename) { + exports.SourceMapGenerator = require('/node_modules/source-map/lib/source-map-generator.js', module).SourceMapGenerator; + exports.SourceMapConsumer = require('/node_modules/source-map/lib/source-map-consumer.js', module).SourceMapConsumer; + exports.SourceNode = require('/node_modules/source-map/lib/source-node.js', module).SourceNode; + }); + require.define('/node_modules/source-map/lib/source-node.js', function (module, exports, __dirname, __filename) { + var SourceMapGenerator = require('/node_modules/source-map/lib/source-map-generator.js', module).SourceMapGenerator; + var util = require('/node_modules/source-map/lib/util.js', module); + var REGEX_NEWLINE = /(\r?\n)/; + var NEWLINE_CODE = 10; + var isSourceNode = '$$$isSourceNode$$$'; + function SourceNode(aLine, aColumn, aSource, aChunks, aName) { + this.children = []; + this.sourceContents = {}; + this.line = aLine == null ? null : aLine; + this.column = aColumn == null ? null : aColumn; + this.source = aSource == null ? null : aSource; + this.name = aName == null ? null : aName; + this[isSourceNode] = true; + if (aChunks != null) + this.add(aChunks); + } + SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { + var node = new SourceNode; + var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); + var remainingLinesIndex = 0; + var shiftNextLine = function () { + var lineContents = getNextLine(); + var newLine = getNextLine() || ''; + return lineContents + newLine; + function getNextLine() { + return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : undefined; + } + }; + var lastGeneratedLine = 1, lastGeneratedColumn = 0; + var lastMapping = null; + aSourceMapConsumer.eachMapping(function (mapping) { + if (lastMapping !== null) { + if (lastGeneratedLine < mapping.generatedLine) { + addMappingWithCode(lastMapping, shiftNextLine()); + lastGeneratedLine++; + lastGeneratedColumn = 0; + } else { + var nextLine = remainingLines[remainingLinesIndex] || ''; + var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn); + lastGeneratedColumn = mapping.generatedColumn; + addMappingWithCode(lastMapping, code); + lastMapping = mapping; + return; + } + } + while (lastGeneratedLine < mapping.generatedLine) { + node.add(shiftNextLine()); + lastGeneratedLine++; + } + if (lastGeneratedColumn < mapping.generatedColumn) { + var nextLine = remainingLines[remainingLinesIndex] || ''; + node.add(nextLine.substr(0, mapping.generatedColumn)); + remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); + lastGeneratedColumn = mapping.generatedColumn; + } + lastMapping = mapping; + }, this); + if (remainingLinesIndex < remainingLines.length) { + if (lastMapping) { + addMappingWithCode(lastMapping, shiftNextLine()); + } + node.add(remainingLines.splice(remainingLinesIndex).join('')); + } + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aRelativePath != null) { + sourceFile = util.join(aRelativePath, sourceFile); + } + node.setSourceContent(sourceFile, content); + } + }); + return node; + function addMappingWithCode(mapping, code) { + if (mapping === null || mapping.source === undefined) { + node.add(code); + } else { + var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source; + node.add(new SourceNode(mapping.originalLine, mapping.originalColumn, source, code, mapping.name)); + } + } + }; + SourceNode.prototype.add = function SourceNode_add(aChunk) { + if (Array.isArray(aChunk)) { + aChunk.forEach(function (chunk) { + this.add(chunk); + }, this); + } else if (aChunk[isSourceNode] || typeof aChunk === 'string') { + if (aChunk) { + this.children.push(aChunk); + } + } else { + throw new TypeError('Expected a SourceNode, string, or an array of SourceNodes and strings. Got ' + aChunk); + } + return this; + }; + SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { + if (Array.isArray(aChunk)) { + for (var i = aChunk.length - 1; i >= 0; i--) { + this.prepend(aChunk[i]); + } + } else if (aChunk[isSourceNode] || typeof aChunk === 'string') { + this.children.unshift(aChunk); + } else { + throw new TypeError('Expected a SourceNode, string, or an array of SourceNodes and strings. Got ' + aChunk); + } + return this; + }; + SourceNode.prototype.walk = function SourceNode_walk(aFn) { + var chunk; + for (var i = 0, len = this.children.length; i < len; i++) { + chunk = this.children[i]; + if (chunk[isSourceNode]) { + chunk.walk(aFn); + } else { + if (chunk !== '') { + aFn(chunk, { + source: this.source, + line: this.line, + column: this.column, + name: this.name + }); + } + } + } + }; + SourceNode.prototype.join = function SourceNode_join(aSep) { + var newChildren; + var i; + var len = this.children.length; + if (len > 0) { + newChildren = []; + for (i = 0; i < len - 1; i++) { + newChildren.push(this.children[i]); + newChildren.push(aSep); + } + newChildren.push(this.children[i]); + this.children = newChildren; + } + return this; + }; + SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { + var lastChild = this.children[this.children.length - 1]; + if (lastChild[isSourceNode]) { + lastChild.replaceRight(aPattern, aReplacement); + } else if (typeof lastChild === 'string') { + this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); + } else { + this.children.push(''.replace(aPattern, aReplacement)); + } + return this; + }; + SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) { + this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; + }; + SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) { + for (var i = 0, len = this.children.length; i < len; i++) { + if (this.children[i][isSourceNode]) { + this.children[i].walkSourceContents(aFn); + } + } + var sources = Object.keys(this.sourceContents); + for (var i = 0, len = sources.length; i < len; i++) { + aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); + } + }; + SourceNode.prototype.toString = function SourceNode_toString() { + var str = ''; + this.walk(function (chunk) { + str += chunk; + }); + return str; + }; + SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { + var generated = { + code: '', + line: 1, + column: 0 + }; + var map = new SourceMapGenerator(aArgs); + var sourceMappingActive = false; + var lastOriginalSource = null; + var lastOriginalLine = null; + var lastOriginalColumn = null; + var lastOriginalName = null; + this.walk(function (chunk, original) { + generated.code += chunk; + if (original.source !== null && original.line !== null && original.column !== null) { + if (lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + lastOriginalSource = original.source; + lastOriginalLine = original.line; + lastOriginalColumn = original.column; + lastOriginalName = original.name; + sourceMappingActive = true; + } else if (sourceMappingActive) { + map.addMapping({ + generated: { + line: generated.line, + column: generated.column + } + }); + lastOriginalSource = null; + sourceMappingActive = false; + } + for (var idx = 0, length = chunk.length; idx < length; idx++) { + if (chunk.charCodeAt(idx) === NEWLINE_CODE) { + generated.line++; + generated.column = 0; + if (idx + 1 === length) { + lastOriginalSource = null; + sourceMappingActive = false; + } else if (sourceMappingActive) { + map.addMapping({ + source: original.source, + original: { + line: original.line, + column: original.column + }, + generated: { + line: generated.line, + column: generated.column + }, + name: original.name + }); + } + } else { + generated.column++; + } + } + }); + this.walkSourceContents(function (sourceFile, sourceContent) { + map.setSourceContent(sourceFile, sourceContent); + }); + return { + code: generated.code, + map: map + }; + }; + exports.SourceNode = SourceNode; + }); + require.define('/node_modules/source-map/lib/util.js', function (module, exports, __dirname, __filename) { + function getArg(aArgs, aName, aDefaultValue) { + if (aName in aArgs) { + return aArgs[aName]; + } else if (arguments.length === 3) { + return aDefaultValue; + } else { + throw new Error('"' + aName + '" is a required argument.'); + } + } + exports.getArg = getArg; + var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; + var dataUrlRegexp = /^data:.+\,.+$/; + function urlParse(aUrl) { + var match = aUrl.match(urlRegexp); + if (!match) { + return null; + } + return { + scheme: match[1], + auth: match[2], + host: match[3], + port: match[4], + path: match[5] + }; + } + exports.urlParse = urlParse; + function urlGenerate(aParsedUrl) { + var url = ''; + if (aParsedUrl.scheme) { + url += aParsedUrl.scheme + ':'; + } + url += '//'; + if (aParsedUrl.auth) { + url += aParsedUrl.auth + '@'; + } + if (aParsedUrl.host) { + url += aParsedUrl.host; + } + if (aParsedUrl.port) { + url += ':' + aParsedUrl.port; + } + if (aParsedUrl.path) { + url += aParsedUrl.path; + } + return url; + } + exports.urlGenerate = urlGenerate; + function normalize(aPath) { + var path = aPath; + var url = urlParse(aPath); + if (url) { + if (!url.path) { + return aPath; + } + path = url.path; + } + var isAbsolute = exports.isAbsolute(path); + var parts = path.split(/\/+/); + for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { + part = parts[i]; + if (part === '.') { + parts.splice(i, 1); + } else if (part === '..') { + up++; + } else if (up > 0) { + if (part === '') { + parts.splice(i + 1, up); + up = 0; + } else { + parts.splice(i, 2); + up--; + } + } + } + path = parts.join('/'); + if (path === '') { + path = isAbsolute ? '/' : '.'; + } + if (url) { + url.path = path; + return urlGenerate(url); + } + return path; + } + exports.normalize = normalize; + function join(aRoot, aPath) { + if (aRoot === '') { + aRoot = '.'; + } + if (aPath === '') { + aPath = '.'; + } + var aPathUrl = urlParse(aPath); + var aRootUrl = urlParse(aRoot); + if (aRootUrl) { + aRoot = aRootUrl.path || '/'; + } + if (aPathUrl && !aPathUrl.scheme) { + if (aRootUrl) { + aPathUrl.scheme = aRootUrl.scheme; + } + return urlGenerate(aPathUrl); + } + if (aPathUrl || aPath.match(dataUrlRegexp)) { + return aPath; + } + if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { + aRootUrl.host = aPath; + return urlGenerate(aRootUrl); + } + var joined = aPath.charAt(0) === '/' ? aPath : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); + if (aRootUrl) { + aRootUrl.path = joined; + return urlGenerate(aRootUrl); + } + return joined; + } + exports.join = join; + exports.isAbsolute = function (aPath) { + return aPath.charAt(0) === '/' || urlRegexp.test(aPath); + }; + function relative(aRoot, aPath) { + if (aRoot === '') { + aRoot = '.'; + } + aRoot = aRoot.replace(/\/$/, ''); + var level = 0; + while (aPath.indexOf(aRoot + '/') !== 0) { + var index = aRoot.lastIndexOf('/'); + if (index < 0) { + return aPath; + } + aRoot = aRoot.slice(0, index); + if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { + return aPath; + } + ++level; + } + return Array(level + 1).join('../') + aPath.substr(aRoot.length + 1); + } + exports.relative = relative; + var supportsNullProto = function () { + var obj = Object.create(null); + return !('__proto__' in obj); + }(); + function identity(s) { + return s; + } + function toSetString(aStr) { + if (isProtoString(aStr)) { + return '$' + aStr; + } + return aStr; + } + exports.toSetString = supportsNullProto ? identity : toSetString; + function fromSetString(aStr) { + if (isProtoString(aStr)) { + return aStr.slice(1); + } + return aStr; + } + exports.fromSetString = supportsNullProto ? identity : fromSetString; + function isProtoString(s) { + if (!s) { + return false; + } + var length = s.length; + if (length < 9) { + return false; + } + if (s.charCodeAt(length - 1) !== 95 || s.charCodeAt(length - 2) !== 95 || s.charCodeAt(length - 3) !== 111 || s.charCodeAt(length - 4) !== 116 || s.charCodeAt(length - 5) !== 111 || s.charCodeAt(length - 6) !== 114 || s.charCodeAt(length - 7) !== 112 || s.charCodeAt(length - 8) !== 95 || s.charCodeAt(length - 9) !== 95) { + return false; + } + for (var i = length - 10; i >= 0; i--) { + if (s.charCodeAt(i) !== 36) { + return false; + } + } + return true; + } + function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { + var cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0 || onlyCompareOriginal) { + return cmp; + } + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByOriginalPositions = compareByOriginalPositions; + function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0 || onlyCompareGenerated) { + return cmp; + } + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; + function strcmp(aStr1, aStr2) { + if (aStr1 === aStr2) { + return 0; + } + if (aStr1 === null) { + return 1; + } + if (aStr2 === null) { + return -1; + } + if (aStr1 > aStr2) { + return 1; + } + return -1; + } + function compareByGeneratedPositionsInflated(mappingA, mappingB) { + var cmp = mappingA.generatedLine - mappingB.generatedLine; + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.generatedColumn - mappingB.generatedColumn; + if (cmp !== 0) { + return cmp; + } + cmp = strcmp(mappingA.source, mappingB.source); + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.originalLine - mappingB.originalLine; + if (cmp !== 0) { + return cmp; + } + cmp = mappingA.originalColumn - mappingB.originalColumn; + if (cmp !== 0) { + return cmp; + } + return strcmp(mappingA.name, mappingB.name); + } + exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; + function parseSourceMapInput(str) { + return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); + } + exports.parseSourceMapInput = parseSourceMapInput; + function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { + sourceURL = sourceURL || ''; + if (sourceRoot) { + if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { + sourceRoot += '/'; + } + sourceURL = sourceRoot + sourceURL; + } + if (sourceMapURL) { + var parsed = urlParse(sourceMapURL); + if (!parsed) { + throw new Error('sourceMapURL could not be parsed'); + } + if (parsed.path) { + var index = parsed.path.lastIndexOf('/'); + if (index >= 0) { + parsed.path = parsed.path.substring(0, index + 1); + } + } + sourceURL = join(urlGenerate(parsed), sourceURL); + } + return normalize(sourceURL); + } + exports.computeSourceURL = computeSourceURL; + }); + require.define('/node_modules/source-map/lib/source-map-generator.js', function (module, exports, __dirname, __filename) { + var base64VLQ = require('/node_modules/source-map/lib/base64-vlq.js', module); + var util = require('/node_modules/source-map/lib/util.js', module); + var ArraySet = require('/node_modules/source-map/lib/array-set.js', module).ArraySet; + var MappingList = require('/node_modules/source-map/lib/mapping-list.js', module).MappingList; + function SourceMapGenerator(aArgs) { + if (!aArgs) { + aArgs = {}; + } + this._file = util.getArg(aArgs, 'file', null); + this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); + this._skipValidation = util.getArg(aArgs, 'skipValidation', false); + this._sources = new ArraySet; + this._names = new ArraySet; + this._mappings = new MappingList; + this._sourcesContents = null; + } + SourceMapGenerator.prototype._version = 3; + SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { + var sourceRoot = aSourceMapConsumer.sourceRoot; + var generator = new SourceMapGenerator({ + file: aSourceMapConsumer.file, + sourceRoot: sourceRoot + }); + aSourceMapConsumer.eachMapping(function (mapping) { + var newMapping = { + generated: { + line: mapping.generatedLine, + column: mapping.generatedColumn + } + }; + if (mapping.source != null) { + newMapping.source = mapping.source; + if (sourceRoot != null) { + newMapping.source = util.relative(sourceRoot, newMapping.source); + } + newMapping.original = { + line: mapping.originalLine, + column: mapping.originalColumn + }; + if (mapping.name != null) { + newMapping.name = mapping.name; + } + } + generator.addMapping(newMapping); + }); + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var sourceRelative = sourceFile; + if (sourceRoot !== null) { + sourceRelative = util.relative(sourceRoot, sourceFile); + } + if (!generator._sources.has(sourceRelative)) { + generator._sources.add(sourceRelative); + } + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + generator.setSourceContent(sourceFile, content); + } + }); + return generator; + }; + SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { + var generated = util.getArg(aArgs, 'generated'); + var original = util.getArg(aArgs, 'original', null); + var source = util.getArg(aArgs, 'source', null); + var name = util.getArg(aArgs, 'name', null); + if (!this._skipValidation) { + this._validateMapping(generated, original, source, name); + } + if (source != null) { + source = String(source); + if (!this._sources.has(source)) { + this._sources.add(source); + } + } + if (name != null) { + name = String(name); + if (!this._names.has(name)) { + this._names.add(name); + } + } + this._mappings.add({ + generatedLine: generated.line, + generatedColumn: generated.column, + originalLine: original != null && original.line, + originalColumn: original != null && original.column, + source: source, + name: name + }); + }; + SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { + var source = aSourceFile; + if (this._sourceRoot != null) { + source = util.relative(this._sourceRoot, source); + } + if (aSourceContent != null) { + if (!this._sourcesContents) { + this._sourcesContents = Object.create(null); + } + this._sourcesContents[util.toSetString(source)] = aSourceContent; + } else if (this._sourcesContents) { + delete this._sourcesContents[util.toSetString(source)]; + if (Object.keys(this._sourcesContents).length === 0) { + this._sourcesContents = null; + } + } + }; + SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { + var sourceFile = aSourceFile; + if (aSourceFile == null) { + if (aSourceMapConsumer.file == null) { + throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + 'or the source map\'s "file" property. Both were omitted.'); + } + sourceFile = aSourceMapConsumer.file; + } + var sourceRoot = this._sourceRoot; + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + var newSources = new ArraySet; + var newNames = new ArraySet; + this._mappings.unsortedForEach(function (mapping) { + if (mapping.source === sourceFile && mapping.originalLine != null) { + var original = aSourceMapConsumer.originalPositionFor({ + line: mapping.originalLine, + column: mapping.originalColumn + }); + if (original.source != null) { + mapping.source = original.source; + if (aSourceMapPath != null) { + mapping.source = util.join(aSourceMapPath, mapping.source); + } + if (sourceRoot != null) { + mapping.source = util.relative(sourceRoot, mapping.source); + } + mapping.originalLine = original.line; + mapping.originalColumn = original.column; + if (original.name != null) { + mapping.name = original.name; + } + } + } + var source = mapping.source; + if (source != null && !newSources.has(source)) { + newSources.add(source); + } + var name = mapping.name; + if (name != null && !newNames.has(name)) { + newNames.add(name); + } + }, this); + this._sources = newSources; + this._names = newNames; + aSourceMapConsumer.sources.forEach(function (sourceFile) { + var content = aSourceMapConsumer.sourceContentFor(sourceFile); + if (content != null) { + if (aSourceMapPath != null) { + sourceFile = util.join(aSourceMapPath, sourceFile); + } + if (sourceRoot != null) { + sourceFile = util.relative(sourceRoot, sourceFile); + } + this.setSourceContent(sourceFile, content); + } + }, this); + }; + SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { + if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { + throw new Error('original.line and original.column are not numbers -- you probably meant to omit ' + 'the original mapping entirely and only map the generated position. If so, pass ' + 'null for the original mapping instead of an object with empty or null values.'); + } + if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { + return; + } else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aOriginal && 'line' in aOriginal && 'column' in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { + return; + } else { + throw new Error('Invalid mapping: ' + JSON.stringify({ + generated: aGenerated, + source: aSource, + original: aOriginal, + name: aName + })); + } + }; + SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { + var previousGeneratedColumn = 0; + var previousGeneratedLine = 1; + var previousOriginalColumn = 0; + var previousOriginalLine = 0; + var previousName = 0; + var previousSource = 0; + var result = ''; + var next; + var mapping; + var nameIdx; + var sourceIdx; + var mappings = this._mappings.toArray(); + for (var i = 0, len = mappings.length; i < len; i++) { + mapping = mappings[i]; + next = ''; + if (mapping.generatedLine !== previousGeneratedLine) { + previousGeneratedColumn = 0; + while (mapping.generatedLine !== previousGeneratedLine) { + next += ';'; + previousGeneratedLine++; + } + } else { + if (i > 0) { + if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { + continue; + } + next += ','; + } + } + next += base64VLQ.encode(mapping.generatedColumn - previousGeneratedColumn); + previousGeneratedColumn = mapping.generatedColumn; + if (mapping.source != null) { + sourceIdx = this._sources.indexOf(mapping.source); + next += base64VLQ.encode(sourceIdx - previousSource); + previousSource = sourceIdx; + next += base64VLQ.encode(mapping.originalLine - 1 - previousOriginalLine); + previousOriginalLine = mapping.originalLine - 1; + next += base64VLQ.encode(mapping.originalColumn - previousOriginalColumn); + previousOriginalColumn = mapping.originalColumn; + if (mapping.name != null) { + nameIdx = this._names.indexOf(mapping.name); + next += base64VLQ.encode(nameIdx - previousName); + previousName = nameIdx; + } + } + result += next; + } + return result; + }; + SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { + return aSources.map(function (source) { + if (!this._sourcesContents) { + return null; + } + if (aSourceRoot != null) { + source = util.relative(aSourceRoot, source); + } + var key = util.toSetString(source); + return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null; + }, this); + }; + SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { + var map = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + }; + if (this._file != null) { + map.file = this._file; + } + if (this._sourceRoot != null) { + map.sourceRoot = this._sourceRoot; + } + if (this._sourcesContents) { + map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); + } + return map; + }; + SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { + return JSON.stringify(this.toJSON()); + }; + exports.SourceMapGenerator = SourceMapGenerator; + }); + require.define('/node_modules/source-map/lib/mapping-list.js', function (module, exports, __dirname, __filename) { + var util = require('/node_modules/source-map/lib/util.js', module); + function generatedPositionAfter(mappingA, mappingB) { + var lineA = mappingA.generatedLine; + var lineB = mappingB.generatedLine; + var columnA = mappingA.generatedColumn; + var columnB = mappingB.generatedColumn; + return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; + } + function MappingList() { + this._array = []; + this._sorted = true; + this._last = { + generatedLine: -1, + generatedColumn: 0 + }; + } + MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { + this._array.forEach(aCallback, aThisArg); + }; + MappingList.prototype.add = function MappingList_add(aMapping) { + if (generatedPositionAfter(this._last, aMapping)) { + this._last = aMapping; + this._array.push(aMapping); + } else { + this._sorted = false; + this._array.push(aMapping); + } + }; + MappingList.prototype.toArray = function MappingList_toArray() { + if (!this._sorted) { + this._array.sort(util.compareByGeneratedPositionsInflated); + this._sorted = true; + } + return this._array; + }; + exports.MappingList = MappingList; + }); + require.define('/node_modules/source-map/lib/array-set.js', function (module, exports, __dirname, __filename) { + var util = require('/node_modules/source-map/lib/util.js', module); + var has = Object.prototype.hasOwnProperty; + var hasNativeMap = typeof Map !== 'undefined'; + function ArraySet() { + this._array = []; + this._set = hasNativeMap ? new Map : Object.create(null); + } + ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { + var set = new ArraySet; + for (var i = 0, len = aArray.length; i < len; i++) { + set.add(aArray[i], aAllowDuplicates); + } + return set; + }; + ArraySet.prototype.size = function ArraySet_size() { + return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; + }; + ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { + var sStr = hasNativeMap ? aStr : util.toSetString(aStr); + var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); + var idx = this._array.length; + if (!isDuplicate || aAllowDuplicates) { + this._array.push(aStr); + } + if (!isDuplicate) { + if (hasNativeMap) { + this._set.set(aStr, idx); + } else { + this._set[sStr] = idx; + } + } + }; + ArraySet.prototype.has = function ArraySet_has(aStr) { + if (hasNativeMap) { + return this._set.has(aStr); + } else { + var sStr = util.toSetString(aStr); + return has.call(this._set, sStr); + } + }; + ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { + if (hasNativeMap) { + var idx = this._set.get(aStr); + if (idx >= 0) { + return idx; + } + } else { + var sStr = util.toSetString(aStr); + if (has.call(this._set, sStr)) { + return this._set[sStr]; + } + } + throw new Error('"' + aStr + '" is not in the set.'); + }; + ArraySet.prototype.at = function ArraySet_at(aIdx) { + if (aIdx >= 0 && aIdx < this._array.length) { + return this._array[aIdx]; + } + throw new Error('No element indexed by ' + aIdx); + }; + ArraySet.prototype.toArray = function ArraySet_toArray() { + return this._array.slice(); + }; + exports.ArraySet = ArraySet; + }); + require.define('/node_modules/source-map/lib/base64-vlq.js', function (module, exports, __dirname, __filename) { + var base64 = require('/node_modules/source-map/lib/base64.js', module); + var VLQ_BASE_SHIFT = 5; + var VLQ_BASE = 1 << VLQ_BASE_SHIFT; + var VLQ_BASE_MASK = VLQ_BASE - 1; + var VLQ_CONTINUATION_BIT = VLQ_BASE; + function toVLQSigned(aValue) { + return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0; + } + function fromVLQSigned(aValue) { + var isNegative = (aValue & 1) === 1; + var shifted = aValue >> 1; + return isNegative ? -shifted : shifted; + } + exports.encode = function base64VLQ_encode(aValue) { + var encoded = ''; + var digit; + var vlq = toVLQSigned(aValue); + do { + digit = vlq & VLQ_BASE_MASK; + vlq >>>= VLQ_BASE_SHIFT; + if (vlq > 0) { + digit |= VLQ_CONTINUATION_BIT; + } + encoded += base64.encode(digit); + } while (vlq > 0); + return encoded; + }; + exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { + var strLen = aStr.length; + var result = 0; + var shift = 0; + var continuation, digit; + do { + if (aIndex >= strLen) { + throw new Error('Expected more digits in base 64 VLQ value.'); + } + digit = base64.decode(aStr.charCodeAt(aIndex++)); + if (digit === -1) { + throw new Error('Invalid base64 digit: ' + aStr.charAt(aIndex - 1)); + } + continuation = !!(digit & VLQ_CONTINUATION_BIT); + digit &= VLQ_BASE_MASK; + result = result + (digit << shift); + shift += VLQ_BASE_SHIFT; + } while (continuation); + aOutParam.value = fromVLQSigned(result); + aOutParam.rest = aIndex; + }; + }); + require.define('/node_modules/source-map/lib/base64.js', function (module, exports, __dirname, __filename) { + var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); + exports.encode = function (number) { + if (0 <= number && number < intToCharMap.length) { + return intToCharMap[number]; + } + throw new TypeError('Must be between 0 and 63: ' + number); + }; + exports.decode = function (charCode) { + var bigA = 65; + var bigZ = 90; + var littleA = 97; + var littleZ = 122; + var zero = 48; + var nine = 57; + var plus = 43; + var slash = 47; + var littleOffset = 26; + var numberOffset = 52; + if (bigA <= charCode && charCode <= bigZ) { + return charCode - bigA; + } + if (littleA <= charCode && charCode <= littleZ) { + return charCode - littleA + littleOffset; + } + if (zero <= charCode && charCode <= nine) { + return charCode - zero + numberOffset; + } + if (charCode == plus) { + return 62; + } + if (charCode == slash) { + return 63; + } + return -1; + }; + }); + require.define('/node_modules/source-map/lib/source-map-consumer.js', function (module, exports, __dirname, __filename) { + var util = require('/node_modules/source-map/lib/util.js', module); + var binarySearch = require('/node_modules/source-map/lib/binary-search.js', module); + var ArraySet = require('/node_modules/source-map/lib/array-set.js', module).ArraySet; + var base64VLQ = require('/node_modules/source-map/lib/base64-vlq.js', module); + var quickSort = require('/node_modules/source-map/lib/quick-sort.js', module).quickSort; + function SourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); + } + SourceMapConsumer.fromSourceMap = function (aSourceMap, aSourceMapURL) { + return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); + }; + SourceMapConsumer.prototype._version = 3; + SourceMapConsumer.prototype.__generatedMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { + configurable: true, + enumerable: true, + get: function () { + if (!this.__generatedMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + return this.__generatedMappings; + } + }); + SourceMapConsumer.prototype.__originalMappings = null; + Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { + configurable: true, + enumerable: true, + get: function () { + if (!this.__originalMappings) { + this._parseMappings(this._mappings, this.sourceRoot); + } + return this.__originalMappings; + } + }); + SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) { + var c = aStr.charAt(index); + return c === ';' || c === ','; + }; + SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + throw new Error('Subclasses must implement _parseMappings'); + }; + SourceMapConsumer.GENERATED_ORDER = 1; + SourceMapConsumer.ORIGINAL_ORDER = 2; + SourceMapConsumer.GREATEST_LOWER_BOUND = 1; + SourceMapConsumer.LEAST_UPPER_BOUND = 2; + SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { + var context = aContext || null; + var order = aOrder || SourceMapConsumer.GENERATED_ORDER; + var mappings; + switch (order) { + case SourceMapConsumer.GENERATED_ORDER: + mappings = this._generatedMappings; + break; + case SourceMapConsumer.ORIGINAL_ORDER: + mappings = this._originalMappings; + break; + default: + throw new Error('Unknown order of iteration.'); + } + var sourceRoot = this.sourceRoot; + mappings.map(function (mapping) { + var source = mapping.source === null ? null : this._sources.at(mapping.source); + source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); + return { + source: source, + generatedLine: mapping.generatedLine, + generatedColumn: mapping.generatedColumn, + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: mapping.name === null ? null : this._names.at(mapping.name) + }; + }, this).forEach(aCallback, context); + }; + SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { + var line = util.getArg(aArgs, 'line'); + var needle = { + source: util.getArg(aArgs, 'source'), + originalLine: line, + originalColumn: util.getArg(aArgs, 'column', 0) + }; + needle.source = this._findSourceIndex(needle.source); + if (needle.source < 0) { + return []; + } + var mappings = []; + var index = this._findMapping(needle, this._originalMappings, 'originalLine', 'originalColumn', util.compareByOriginalPositions, binarySearch.LEAST_UPPER_BOUND); + if (index >= 0) { + var mapping = this._originalMappings[index]; + if (aArgs.column === undefined) { + var originalLine = mapping.originalLine; + while (mapping && mapping.originalLine === originalLine) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + mapping = this._originalMappings[++index]; + } + } else { + var originalColumn = mapping.originalColumn; + while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) { + mappings.push({ + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }); + mapping = this._originalMappings[++index]; + } + } + } + return mappings; + }; + exports.SourceMapConsumer = SourceMapConsumer; + function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + var version = util.getArg(sourceMap, 'version'); + var sources = util.getArg(sourceMap, 'sources'); + var names = util.getArg(sourceMap, 'names', []); + var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); + var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); + var mappings = util.getArg(sourceMap, 'mappings'); + var file = util.getArg(sourceMap, 'file', null); + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + if (sourceRoot) { + sourceRoot = util.normalize(sourceRoot); + } + sources = sources.map(String).map(util.normalize).map(function (source) { + return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source; + }); + this._names = ArraySet.fromArray(names.map(String), true); + this._sources = ArraySet.fromArray(sources, true); + this._absoluteSources = this._sources.toArray().map(function (s) { + return util.computeSourceURL(sourceRoot, s, aSourceMapURL); + }); + this.sourceRoot = sourceRoot; + this.sourcesContent = sourcesContent; + this._mappings = mappings; + this._sourceMapURL = aSourceMapURL; + this.file = file; + } + BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer; + BasicSourceMapConsumer.prototype._findSourceIndex = function (aSource) { + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + if (this._sources.has(relativeSource)) { + return this._sources.indexOf(relativeSource); + } + var i; + for (i = 0; i < this._absoluteSources.length; ++i) { + if (this._absoluteSources[i] == aSource) { + return i; + } + } + return -1; + }; + BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { + var smc = Object.create(BasicSourceMapConsumer.prototype); + var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); + var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); + smc.sourceRoot = aSourceMap._sourceRoot; + smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), smc.sourceRoot); + smc.file = aSourceMap._file; + smc._sourceMapURL = aSourceMapURL; + smc._absoluteSources = smc._sources.toArray().map(function (s) { + return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); + }); + var generatedMappings = aSourceMap._mappings.toArray().slice(); + var destGeneratedMappings = smc.__generatedMappings = []; + var destOriginalMappings = smc.__originalMappings = []; + for (var i = 0, length = generatedMappings.length; i < length; i++) { + var srcMapping = generatedMappings[i]; + var destMapping = new Mapping; + destMapping.generatedLine = srcMapping.generatedLine; + destMapping.generatedColumn = srcMapping.generatedColumn; + if (srcMapping.source) { + destMapping.source = sources.indexOf(srcMapping.source); + destMapping.originalLine = srcMapping.originalLine; + destMapping.originalColumn = srcMapping.originalColumn; + if (srcMapping.name) { + destMapping.name = names.indexOf(srcMapping.name); + } + destOriginalMappings.push(destMapping); + } + destGeneratedMappings.push(destMapping); + } + quickSort(smc.__originalMappings, util.compareByOriginalPositions); + return smc; + }; + BasicSourceMapConsumer.prototype._version = 3; + Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { + get: function () { + return this._absoluteSources.slice(); + } + }); + function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; + } + BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { + var generatedLine = 1; + var previousGeneratedColumn = 0; + var previousOriginalLine = 0; + var previousOriginalColumn = 0; + var previousSource = 0; + var previousName = 0; + var length = aStr.length; + var index = 0; + var cachedSegments = {}; + var temp = {}; + var originalMappings = []; + var generatedMappings = []; + var mapping, str, segment, end, value; + while (index < length) { + if (aStr.charAt(index) === ';') { + generatedLine++; + index++; + previousGeneratedColumn = 0; + } else if (aStr.charAt(index) === ',') { + index++; + } else { + mapping = new Mapping; + mapping.generatedLine = generatedLine; + for (end = index; end < length; end++) { + if (this._charIsMappingSeparator(aStr, end)) { + break; + } + } + str = aStr.slice(index, end); + segment = cachedSegments[str]; + if (segment) { + index += str.length; + } else { + segment = []; + while (index < end) { + base64VLQ.decode(aStr, index, temp); + value = temp.value; + index = temp.rest; + segment.push(value); + } + if (segment.length === 2) { + throw new Error('Found a source, but no line and column'); + } + if (segment.length === 3) { + throw new Error('Found a source and line, but no column'); + } + cachedSegments[str] = segment; + } + mapping.generatedColumn = previousGeneratedColumn + segment[0]; + previousGeneratedColumn = mapping.generatedColumn; + if (segment.length > 1) { + mapping.source = previousSource + segment[1]; + previousSource += segment[1]; + mapping.originalLine = previousOriginalLine + segment[2]; + previousOriginalLine = mapping.originalLine; + mapping.originalLine += 1; + mapping.originalColumn = previousOriginalColumn + segment[3]; + previousOriginalColumn = mapping.originalColumn; + if (segment.length > 4) { + mapping.name = previousName + segment[4]; + previousName += segment[4]; + } + } + generatedMappings.push(mapping); + if (typeof mapping.originalLine === 'number') { + originalMappings.push(mapping); + } + } + } + quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); + this.__generatedMappings = generatedMappings; + quickSort(originalMappings, util.compareByOriginalPositions); + this.__originalMappings = originalMappings; + }; + BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) { + if (aNeedle[aLineName] <= 0) { + throw new TypeError('Line must be greater than or equal to 1, got ' + aNeedle[aLineName]); + } + if (aNeedle[aColumnName] < 0) { + throw new TypeError('Column must be greater than or equal to 0, got ' + aNeedle[aColumnName]); + } + return binarySearch.search(aNeedle, aMappings, aComparator, aBias); + }; + BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { + for (var index = 0; index < this._generatedMappings.length; ++index) { + var mapping = this._generatedMappings[index]; + if (index + 1 < this._generatedMappings.length) { + var nextMapping = this._generatedMappings[index + 1]; + if (mapping.generatedLine === nextMapping.generatedLine) { + mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; + continue; + } + } + mapping.lastGeneratedColumn = Infinity; + } + }; + BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + var index = this._findMapping(needle, this._generatedMappings, 'generatedLine', 'generatedColumn', util.compareByGeneratedPositionsDeflated, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)); + if (index >= 0) { + var mapping = this._generatedMappings[index]; + if (mapping.generatedLine === needle.generatedLine) { + var source = util.getArg(mapping, 'source', null); + if (source !== null) { + source = this._sources.at(source); + source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); + } + var name = util.getArg(mapping, 'name', null); + if (name !== null) { + name = this._names.at(name); + } + return { + source: source, + line: util.getArg(mapping, 'originalLine', null), + column: util.getArg(mapping, 'originalColumn', null), + name: name + }; + } + } + return { + source: null, + line: null, + column: null, + name: null + }; + }; + BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (sc) { + return sc == null; + }); + }; + BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + var index = this._findSourceIndex(aSource); + if (index >= 0) { + return this.sourcesContent[index]; + } + var relativeSource = aSource; + if (this.sourceRoot != null) { + relativeSource = util.relative(this.sourceRoot, relativeSource); + } + var url; + if (this.sourceRoot != null && (url = util.urlParse(this.sourceRoot))) { + var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ''); + if (url.scheme == 'file' && this._sources.has(fileUriAbsPath)) { + return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]; + } + if ((!url.path || url.path == '/') && this._sources.has('/' + relativeSource)) { + return this.sourcesContent[this._sources.indexOf('/' + relativeSource)]; + } + } + if (nullOnMissing) { + return null; + } else { + throw new Error('"' + relativeSource + '" is not in the SourceMap.'); + } + }; + BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) { + var source = util.getArg(aArgs, 'source'); + source = this._findSourceIndex(source); + if (source < 0) { + return { + line: null, + column: null, + lastColumn: null + }; + } + var needle = { + source: source, + originalLine: util.getArg(aArgs, 'line'), + originalColumn: util.getArg(aArgs, 'column') + }; + var index = this._findMapping(needle, this._originalMappings, 'originalLine', 'originalColumn', util.compareByOriginalPositions, util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)); + if (index >= 0) { + var mapping = this._originalMappings[index]; + if (mapping.source === needle.source) { + return { + line: util.getArg(mapping, 'generatedLine', null), + column: util.getArg(mapping, 'generatedColumn', null), + lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) + }; + } + } + return { + line: null, + column: null, + lastColumn: null + }; + }; + exports.BasicSourceMapConsumer = BasicSourceMapConsumer; + function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { + var sourceMap = aSourceMap; + if (typeof aSourceMap === 'string') { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + var version = util.getArg(sourceMap, 'version'); + var sections = util.getArg(sourceMap, 'sections'); + if (version != this._version) { + throw new Error('Unsupported version: ' + version); + } + this._sources = new ArraySet; + this._names = new ArraySet; + var lastOffset = { + line: -1, + column: 0 + }; + this._sections = sections.map(function (s) { + if (s.url) { + throw new Error('Support for url field in sections not implemented.'); + } + var offset = util.getArg(s, 'offset'); + var offsetLine = util.getArg(offset, 'line'); + var offsetColumn = util.getArg(offset, 'column'); + if (offsetLine < lastOffset.line || offsetLine === lastOffset.line && offsetColumn < lastOffset.column) { + throw new Error('Section offsets must be ordered and non-overlapping.'); + } + lastOffset = offset; + return { + generatedOffset: { + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL) + }; + }); + } + IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype); + IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer; + IndexedSourceMapConsumer.prototype._version = 3; + Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { + get: function () { + var sources = []; + for (var i = 0; i < this._sections.length; i++) { + for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + }); + IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) { + var needle = { + generatedLine: util.getArg(aArgs, 'line'), + generatedColumn: util.getArg(aArgs, 'column') + }; + var sectionIndex = binarySearch.search(needle, this._sections, function (needle, section) { + var cmp = needle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + return needle.generatedColumn - section.generatedOffset.generatedColumn; + }); + var section = this._sections[sectionIndex]; + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + return section.consumer.originalPositionFor({ + line: needle.generatedLine - (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), + bias: aArgs.bias + }); + }; + IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + }; + IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } else { + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + }; + IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { + continue; + } + var generatedPosition = section.consumer.generatedPositionFor(aArgs); + if (generatedPosition) { + var ret = { + line: generatedPosition.line + (section.generatedOffset.generatedLine - 1), + column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0) + }; + return ret; + } + } + return { + line: null, + column: null + }; + }; + IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { + this.__generatedMappings = []; + this.__originalMappings = []; + for (var i = 0; i < this._sections.length; i++) { + var section = this._sections[i]; + var sectionMappings = section.consumer._generatedMappings; + for (var j = 0; j < sectionMappings.length; j++) { + var mapping = sectionMappings[j]; + var source = section.consumer._sources.at(mapping.source); + source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); + this._sources.add(source); + source = this._sources.indexOf(source); + var name = null; + if (mapping.name) { + name = section.consumer._names.at(mapping.name); + this._names.add(name); + name = this._names.indexOf(name); + } + var adjustedMapping = { + source: source, + generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1), + generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), + originalLine: mapping.originalLine, + originalColumn: mapping.originalColumn, + name: name + }; + this.__generatedMappings.push(adjustedMapping); + if (typeof adjustedMapping.originalLine === 'number') { + this.__originalMappings.push(adjustedMapping); + } + } + } + quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); + quickSort(this.__originalMappings, util.compareByOriginalPositions); + }; + exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; + }); + require.define('/node_modules/source-map/lib/quick-sort.js', function (module, exports, __dirname, __filename) { + function swap(ary, x, y) { + var temp = ary[x]; + ary[x] = ary[y]; + ary[y] = temp; + } + function randomIntInRange(low, high) { + return Math.round(low + Math.random() * (high - low)); + } + function doQuickSort(ary, comparator, p, r) { + if (p < r) { + var pivotIndex = randomIntInRange(p, r); + var i = p - 1; + swap(ary, pivotIndex, r); + var pivot = ary[r]; + for (var j = p; j < r; j++) { + if (comparator(ary[j], pivot) <= 0) { + i += 1; + swap(ary, i, j); + } + } + swap(ary, i + 1, j); + var q = i + 1; + doQuickSort(ary, comparator, p, q - 1); + doQuickSort(ary, comparator, q + 1, r); + } + } + exports.quickSort = function (ary, comparator) { + doQuickSort(ary, comparator, 0, ary.length - 1); + }; + }); + require.define('/node_modules/source-map/lib/binary-search.js', function (module, exports, __dirname, __filename) { + exports.GREATEST_LOWER_BOUND = 1; + exports.LEAST_UPPER_BOUND = 2; + function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { + var mid = Math.floor((aHigh - aLow) / 2) + aLow; + var cmp = aCompare(aNeedle, aHaystack[mid], true); + if (cmp === 0) { + return mid; + } else if (cmp > 0) { + if (aHigh - mid > 1) { + return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); + } + if (aBias == exports.LEAST_UPPER_BOUND) { + return aHigh < aHaystack.length ? aHigh : -1; + } else { + return mid; + } + } else { + if (mid - aLow > 1) { + return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); + } + if (aBias == exports.LEAST_UPPER_BOUND) { + return mid; + } else { + return aLow < 0 ? -1 : aLow; + } + } + } + exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { + if (aHaystack.length === 0) { + return -1; + } + var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare, aBias || exports.GREATEST_LOWER_BOUND); + if (index < 0) { + return -1; + } + while (index - 1 >= 0) { + if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { + break; + } + --index; + } + return index; + }; + }); + require.define('/node_modules/esutils/lib/utils.js', function (module, exports, __dirname, __filename) { + (function () { + 'use strict'; + exports.ast = require('/node_modules/esutils/lib/ast.js', module); + exports.code = require('/node_modules/esutils/lib/code.js', module); + exports.keyword = require('/node_modules/esutils/lib/keyword.js', module); + }()); + }); + require.define('/node_modules/esutils/lib/keyword.js', function (module, exports, __dirname, __filename) { + (function () { + 'use strict'; + var code = require('/node_modules/esutils/lib/code.js', module); + function isStrictModeReservedWordES6(id) { + switch (id) { + case 'implements': + case 'interface': + case 'package': + case 'private': + case 'protected': + case 'public': + case 'static': + case 'let': + return true; + default: + return false; + } + } + function isKeywordES5(id, strict) { + if (!strict && id === 'yield') { + return false; + } + return isKeywordES6(id, strict); + } + function isKeywordES6(id, strict) { + if (strict && isStrictModeReservedWordES6(id)) { + return true; + } + switch (id.length) { + case 2: + return id === 'if' || id === 'in' || id === 'do'; + case 3: + return id === 'var' || id === 'for' || id === 'new' || id === 'try'; + case 4: + return id === 'this' || id === 'else' || id === 'case' || id === 'void' || id === 'with' || id === 'enum'; + case 5: + return id === 'while' || id === 'break' || id === 'catch' || id === 'throw' || id === 'const' || id === 'yield' || id === 'class' || id === 'super'; + case 6: + return id === 'return' || id === 'typeof' || id === 'delete' || id === 'switch' || id === 'export' || id === 'import'; + case 7: + return id === 'default' || id === 'finally' || id === 'extends'; + case 8: + return id === 'function' || id === 'continue' || id === 'debugger'; + case 10: + return id === 'instanceof'; + default: + return false; + } + } + function isReservedWordES5(id, strict) { + return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); + } + function isReservedWordES6(id, strict) { + return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); + } + function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; + } + function isIdentifierNameES5(id) { + var i, iz, ch; + if (id.length === 0) { + return false; + } + ch = id.charCodeAt(0); + if (!code.isIdentifierStartES5(ch)) { + return false; + } + for (i = 1, iz = id.length; i < iz; ++i) { + ch = id.charCodeAt(i); + if (!code.isIdentifierPartES5(ch)) { + return false; + } + } + return true; + } + function decodeUtf16(lead, trail) { + return (lead - 55296) * 1024 + (trail - 56320) + 65536; + } + function isIdentifierNameES6(id) { + var i, iz, ch, lowCh, check; + if (id.length === 0) { + return false; + } + check = code.isIdentifierStartES6; + for (i = 0, iz = id.length; i < iz; ++i) { + ch = id.charCodeAt(i); + if (55296 <= ch && ch <= 56319) { + ++i; + if (i >= iz) { + return false; + } + lowCh = id.charCodeAt(i); + if (!(56320 <= lowCh && lowCh <= 57343)) { + return false; + } + ch = decodeUtf16(ch, lowCh); + } + if (!check(ch)) { + return false; + } + check = code.isIdentifierPartES6; + } + return true; + } + function isIdentifierES5(id, strict) { + return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); + } + function isIdentifierES6(id, strict) { + return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); + } + module.exports = { + isKeywordES5: isKeywordES5, + isKeywordES6: isKeywordES6, + isReservedWordES5: isReservedWordES5, + isReservedWordES6: isReservedWordES6, + isRestrictedWord: isRestrictedWord, + isIdentifierNameES5: isIdentifierNameES5, + isIdentifierNameES6: isIdentifierNameES6, + isIdentifierES5: isIdentifierES5, + isIdentifierES6: isIdentifierES6 + }; + }()); + }); + require.define('/node_modules/esutils/lib/code.js', function (module, exports, __dirname, __filename) { + (function () { + 'use strict'; + var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; + ES5Regex = { + NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, + NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ + }; + ES6Regex = { + NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]/, + NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDD0-\uDDDA\uDE00-\uDE11\uDE13-\uDE37\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ + }; + function isDecimalDigit(ch) { + return 48 <= ch && ch <= 57; + } + function isHexDigit(ch) { + return 48 <= ch && ch <= 57 || 97 <= ch && ch <= 102 || 65 <= ch && ch <= 70; + } + function isOctalDigit(ch) { + return ch >= 48 && ch <= 55; + } + NON_ASCII_WHITESPACES = [ + 5760, + 6158, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8201, + 8202, + 8239, + 8287, + 12288, + 65279 + ]; + function isWhiteSpace(ch) { + return ch === 32 || ch === 9 || ch === 11 || ch === 12 || ch === 160 || ch >= 5760 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; + } + function isLineTerminator(ch) { + return ch === 10 || ch === 13 || ch === 8232 || ch === 8233; + } + function fromCodePoint(cp) { + if (cp <= 65535) { + return String.fromCharCode(cp); + } + var cu1 = String.fromCharCode(Math.floor((cp - 65536) / 1024) + 55296); + var cu2 = String.fromCharCode((cp - 65536) % 1024 + 56320); + return cu1 + cu2; + } + IDENTIFIER_START = new Array(128); + for (ch = 0; ch < 128; ++ch) { + IDENTIFIER_START[ch] = ch >= 97 && ch <= 122 || ch >= 65 && ch <= 90 || ch === 36 || ch === 95; + } + IDENTIFIER_PART = new Array(128); + for (ch = 0; ch < 128; ++ch) { + IDENTIFIER_PART[ch] = ch >= 97 && ch <= 122 || ch >= 65 && ch <= 90 || ch >= 48 && ch <= 57 || ch === 36 || ch === 95; + } + function isIdentifierStartES5(ch) { + return ch < 128 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); + } + function isIdentifierPartES5(ch) { + return ch < 128 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); + } + function isIdentifierStartES6(ch) { + return ch < 128 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); + } + function isIdentifierPartES6(ch) { + return ch < 128 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); + } + module.exports = { + isDecimalDigit: isDecimalDigit, + isHexDigit: isHexDigit, + isOctalDigit: isOctalDigit, + isWhiteSpace: isWhiteSpace, + isLineTerminator: isLineTerminator, + isIdentifierStartES5: isIdentifierStartES5, + isIdentifierPartES5: isIdentifierPartES5, + isIdentifierStartES6: isIdentifierStartES6, + isIdentifierPartES6: isIdentifierPartES6 + }; + }()); + }); + require.define('/node_modules/esutils/lib/ast.js', function (module, exports, __dirname, __filename) { + (function () { + 'use strict'; + function isExpression(node) { + if (node == null) { + return false; + } + switch (node.type) { + case 'ArrayExpression': + case 'AssignmentExpression': + case 'BinaryExpression': + case 'CallExpression': + case 'ConditionalExpression': + case 'FunctionExpression': + case 'Identifier': + case 'Literal': + case 'LogicalExpression': + case 'MemberExpression': + case 'NewExpression': + case 'ObjectExpression': + case 'SequenceExpression': + case 'ThisExpression': + case 'UnaryExpression': + case 'UpdateExpression': + return true; + } + return false; + } + function isIterationStatement(node) { + if (node == null) { + return false; + } + switch (node.type) { + case 'DoWhileStatement': + case 'ForInStatement': + case 'ForStatement': + case 'WhileStatement': + return true; + } + return false; + } + function isStatement(node) { + if (node == null) { + return false; + } + switch (node.type) { + case 'BlockStatement': + case 'BreakStatement': + case 'ContinueStatement': + case 'DebuggerStatement': + case 'DoWhileStatement': + case 'EmptyStatement': + case 'ExpressionStatement': + case 'ForInStatement': + case 'ForStatement': + case 'IfStatement': + case 'LabeledStatement': + case 'ReturnStatement': + case 'SwitchStatement': + case 'ThrowStatement': + case 'TryStatement': + case 'VariableDeclaration': + case 'WhileStatement': + case 'WithStatement': + return true; + } + return false; + } + function isSourceElement(node) { + return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; + } + function trailingStatement(node) { + switch (node.type) { + case 'IfStatement': + if (node.alternate != null) { + return node.alternate; + } + return node.consequent; + case 'LabeledStatement': + case 'ForStatement': + case 'ForInStatement': + case 'WhileStatement': + case 'WithStatement': + return node.body; + } + return null; + } + function isProblematicIfStatement(node) { + var current; + if (node.type !== 'IfStatement') { + return false; + } + if (node.alternate == null) { + return false; + } + current = node.consequent; + do { + if (current.type === 'IfStatement') { + if (current.alternate == null) { + return true; + } + } + current = trailingStatement(current); + } while (current); + return false; + } + module.exports = { + isExpression: isExpression, + isStatement: isStatement, + isIterationStatement: isIterationStatement, + isSourceElement: isSourceElement, + isProblematicIfStatement: isProblematicIfStatement, + trailingStatement: trailingStatement + }; + }()); + }); + require.define('/node_modules/estraverse/estraverse.js', function (module, exports, __dirname, __filename) { + (function clone(exports) { + 'use strict'; + var Syntax, isArray, VisitorOption, VisitorKeys, objectCreate, objectKeys, BREAK, SKIP, REMOVE; + function ignoreJSHintError() { + } + isArray = Array.isArray; + if (!isArray) { + isArray = function isArray(array) { + return Object.prototype.toString.call(array) === '[object Array]'; + }; + } + function deepCopy(obj) { + var ret = {}, key, val; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + val = obj[key]; + if (typeof val === 'object' && val !== null) { + ret[key] = deepCopy(val); + } else { + ret[key] = val; + } + } + } + return ret; + } + function shallowCopy(obj) { + var ret = {}, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + ignoreJSHintError(shallowCopy); + function upperBound(array, func) { + var diff, len, i, current; + len = array.length; + i = 0; + while (len) { + diff = len >>> 1; + current = i + diff; + if (func(array[current])) { + len = diff; + } else { + i = current + 1; + len -= diff + 1; + } + } + return i; + } + function lowerBound(array, func) { + var diff, len, i, current; + len = array.length; + i = 0; + while (len) { + diff = len >>> 1; + current = i + diff; + if (func(array[current])) { + i = current + 1; + len -= diff + 1; + } else { + len = diff; + } + } + return i; + } + ignoreJSHintError(lowerBound); + objectCreate = Object.create || function () { + function F() { + } + return function (o) { + F.prototype = o; + return new F; + }; + }(); + objectKeys = Object.keys || function (o) { + var keys = [], key; + for (key in o) { + keys.push(key); + } + return keys; + }; + function extend(to, from) { + var keys = objectKeys(from), key, i, len; + for (i = 0, len = keys.length; i < len; i += 1) { + key = keys[i]; + to[key] = from[key]; + } + return to; + } + Syntax = { + AssignmentExpression: 'AssignmentExpression', + AssignmentPattern: 'AssignmentPattern', + ArrayExpression: 'ArrayExpression', + ArrayPattern: 'ArrayPattern', + ArrowFunctionExpression: 'ArrowFunctionExpression', + AwaitExpression: 'AwaitExpression', + BlockStatement: 'BlockStatement', + BinaryExpression: 'BinaryExpression', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ClassBody: 'ClassBody', + ClassDeclaration: 'ClassDeclaration', + ClassExpression: 'ClassExpression', + ComprehensionBlock: 'ComprehensionBlock', + ComprehensionExpression: 'ComprehensionExpression', + ConditionalExpression: 'ConditionalExpression', + ContinueStatement: 'ContinueStatement', + DebuggerStatement: 'DebuggerStatement', + DirectiveStatement: 'DirectiveStatement', + DoWhileStatement: 'DoWhileStatement', + EmptyStatement: 'EmptyStatement', + ExportAllDeclaration: 'ExportAllDeclaration', + ExportDefaultDeclaration: 'ExportDefaultDeclaration', + ExportNamedDeclaration: 'ExportNamedDeclaration', + ExportSpecifier: 'ExportSpecifier', + ExpressionStatement: 'ExpressionStatement', + ForStatement: 'ForStatement', + ForInStatement: 'ForInStatement', + ForOfStatement: 'ForOfStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + GeneratorExpression: 'GeneratorExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + ImportDeclaration: 'ImportDeclaration', + ImportDefaultSpecifier: 'ImportDefaultSpecifier', + ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', + ImportSpecifier: 'ImportSpecifier', + Literal: 'Literal', + LabeledStatement: 'LabeledStatement', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + MetaProperty: 'MetaProperty', + MethodDefinition: 'MethodDefinition', + ModuleSpecifier: 'ModuleSpecifier', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + ObjectPattern: 'ObjectPattern', + Program: 'Program', + Property: 'Property', + RestElement: 'RestElement', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SpreadElement: 'SpreadElement', + Super: 'Super', + SwitchStatement: 'SwitchStatement', + SwitchCase: 'SwitchCase', + TaggedTemplateExpression: 'TaggedTemplateExpression', + TemplateElement: 'TemplateElement', + TemplateLiteral: 'TemplateLiteral', + ThisExpression: 'ThisExpression', + ThrowStatement: 'ThrowStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement', + WithStatement: 'WithStatement', + YieldExpression: 'YieldExpression' + }; + VisitorKeys = { + AssignmentExpression: [ + 'left', + 'right' + ], + AssignmentPattern: [ + 'left', + 'right' + ], + ArrayExpression: ['elements'], + ArrayPattern: ['elements'], + ArrowFunctionExpression: [ + 'params', + 'body' + ], + AwaitExpression: ['argument'], + BlockStatement: ['body'], + BinaryExpression: [ + 'left', + 'right' + ], + BreakStatement: ['label'], + CallExpression: [ + 'callee', + 'arguments' + ], + CatchClause: [ + 'param', + 'body' + ], + ClassBody: ['body'], + ClassDeclaration: [ + 'id', + 'superClass', + 'body' + ], + ClassExpression: [ + 'id', + 'superClass', + 'body' + ], + ComprehensionBlock: [ + 'left', + 'right' + ], + ComprehensionExpression: [ + 'blocks', + 'filter', + 'body' + ], + ConditionalExpression: [ + 'test', + 'consequent', + 'alternate' + ], + ContinueStatement: ['label'], + DebuggerStatement: [], + DirectiveStatement: [], + DoWhileStatement: [ + 'body', + 'test' + ], + EmptyStatement: [], + ExportAllDeclaration: ['source'], + ExportDefaultDeclaration: ['declaration'], + ExportNamedDeclaration: [ + 'declaration', + 'specifiers', + 'source' + ], + ExportSpecifier: [ + 'exported', + 'local' + ], + ExpressionStatement: ['expression'], + ForStatement: [ + 'init', + 'test', + 'update', + 'body' + ], + ForInStatement: [ + 'left', + 'right', + 'body' + ], + ForOfStatement: [ + 'left', + 'right', + 'body' + ], + FunctionDeclaration: [ + 'id', + 'params', + 'body' + ], + FunctionExpression: [ + 'id', + 'params', + 'body' + ], + GeneratorExpression: [ + 'blocks', + 'filter', + 'body' + ], + Identifier: [], + IfStatement: [ + 'test', + 'consequent', + 'alternate' + ], + ImportDeclaration: [ + 'specifiers', + 'source' + ], + ImportDefaultSpecifier: ['local'], + ImportNamespaceSpecifier: ['local'], + ImportSpecifier: [ + 'imported', + 'local' + ], + Literal: [], + LabeledStatement: [ + 'label', + 'body' + ], + LogicalExpression: [ + 'left', + 'right' + ], + MemberExpression: [ + 'object', + 'property' + ], + MetaProperty: [ + 'meta', + 'property' + ], + MethodDefinition: [ + 'key', + 'value' + ], + ModuleSpecifier: [], + NewExpression: [ + 'callee', + 'arguments' + ], + ObjectExpression: ['properties'], + ObjectPattern: ['properties'], + Program: ['body'], + Property: [ + 'key', + 'value' + ], + RestElement: ['argument'], + ReturnStatement: ['argument'], + SequenceExpression: ['expressions'], + SpreadElement: ['argument'], + Super: [], + SwitchStatement: [ + 'discriminant', + 'cases' + ], + SwitchCase: [ + 'test', + 'consequent' + ], + TaggedTemplateExpression: [ + 'tag', + 'quasi' + ], + TemplateElement: [], + TemplateLiteral: [ + 'quasis', + 'expressions' + ], + ThisExpression: [], + ThrowStatement: ['argument'], + TryStatement: [ + 'block', + 'handler', + 'finalizer' + ], + UnaryExpression: ['argument'], + UpdateExpression: ['argument'], + VariableDeclaration: ['declarations'], + VariableDeclarator: [ + 'id', + 'init' + ], + WhileStatement: [ + 'test', + 'body' + ], + WithStatement: [ + 'object', + 'body' + ], + YieldExpression: ['argument'] + }; + BREAK = {}; + SKIP = {}; + REMOVE = {}; + VisitorOption = { + Break: BREAK, + Skip: SKIP, + Remove: REMOVE + }; + function Reference(parent, key) { + this.parent = parent; + this.key = key; + } + Reference.prototype.replace = function replace(node) { + this.parent[this.key] = node; + }; + Reference.prototype.remove = function remove() { + if (isArray(this.parent)) { + this.parent.splice(this.key, 1); + return true; + } else { + this.replace(null); + return false; + } + }; + function Element(node, path, wrap, ref) { + this.node = node; + this.path = path; + this.wrap = wrap; + this.ref = ref; + } + function Controller() { + } + Controller.prototype.path = function path() { + var i, iz, j, jz, result, element; + function addToPath(result, path) { + if (isArray(path)) { + for (j = 0, jz = path.length; j < jz; ++j) { + result.push(path[j]); + } + } else { + result.push(path); + } + } + if (!this.__current.path) { + return null; + } + result = []; + for (i = 2, iz = this.__leavelist.length; i < iz; ++i) { + element = this.__leavelist[i]; + addToPath(result, element.path); + } + addToPath(result, this.__current.path); + return result; + }; + Controller.prototype.type = function () { + var node = this.current(); + return node.type || this.__current.wrap; + }; + Controller.prototype.parents = function parents() { + var i, iz, result; + result = []; + for (i = 1, iz = this.__leavelist.length; i < iz; ++i) { + result.push(this.__leavelist[i].node); + } + return result; + }; + Controller.prototype.current = function current() { + return this.__current.node; + }; + Controller.prototype.__execute = function __execute(callback, element) { + var previous, result; + result = undefined; + previous = this.__current; + this.__current = element; + this.__state = null; + if (callback) { + result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node); + } + this.__current = previous; + return result; + }; + Controller.prototype.notify = function notify(flag) { + this.__state = flag; + }; + Controller.prototype.skip = function () { + this.notify(SKIP); + }; + Controller.prototype['break'] = function () { + this.notify(BREAK); + }; + Controller.prototype.remove = function () { + this.notify(REMOVE); + }; + Controller.prototype.__initialize = function (root, visitor) { + this.visitor = visitor; + this.root = root; + this.__worklist = []; + this.__leavelist = []; + this.__current = null; + this.__state = null; + this.__fallback = null; + if (visitor.fallback === 'iteration') { + this.__fallback = objectKeys; + } else if (typeof visitor.fallback === 'function') { + this.__fallback = visitor.fallback; + } + this.__keys = VisitorKeys; + if (visitor.keys) { + this.__keys = extend(objectCreate(this.__keys), visitor.keys); + } + }; + function isNode(node) { + if (node == null) { + return false; + } + return typeof node === 'object' && typeof node.type === 'string'; + } + function isProperty(nodeType, key) { + return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key; + } + Controller.prototype.traverse = function traverse(root, visitor) { + var worklist, leavelist, element, node, nodeType, ret, key, current, current2, candidates, candidate, sentinel; + this.__initialize(root, visitor); + sentinel = {}; + worklist = this.__worklist; + leavelist = this.__leavelist; + worklist.push(new Element(root, null, null, null)); + leavelist.push(new Element(null, null, null, null)); + while (worklist.length) { + element = worklist.pop(); + if (element === sentinel) { + element = leavelist.pop(); + ret = this.__execute(visitor.leave, element); + if (this.__state === BREAK || ret === BREAK) { + return; + } + continue; + } + if (element.node) { + ret = this.__execute(visitor.enter, element); + if (this.__state === BREAK || ret === BREAK) { + return; + } + worklist.push(sentinel); + leavelist.push(element); + if (this.__state === SKIP || ret === SKIP) { + continue; + } + node = element.node; + nodeType = node.type || element.wrap; + candidates = this.__keys[nodeType]; + if (!candidates) { + if (this.__fallback) { + candidates = this.__fallback(node); + } else { + throw new Error('Unknown node type ' + nodeType + '.'); + } + } + current = candidates.length; + while ((current -= 1) >= 0) { + key = candidates[current]; + candidate = node[key]; + if (!candidate) { + continue; + } + if (isArray(candidate)) { + current2 = candidate.length; + while ((current2 -= 1) >= 0) { + if (!candidate[current2]) { + continue; + } + if (isProperty(nodeType, candidates[current])) { + element = new Element(candidate[current2], [ + key, + current2 + ], 'Property', null); + } else if (isNode(candidate[current2])) { + element = new Element(candidate[current2], [ + key, + current2 + ], null, null); + } else { + continue; + } + worklist.push(element); + } + } else if (isNode(candidate)) { + worklist.push(new Element(candidate, key, null, null)); + } + } + } + } + }; + Controller.prototype.replace = function replace(root, visitor) { + var worklist, leavelist, node, nodeType, target, element, current, current2, candidates, candidate, sentinel, outer, key; + function removeElem(element) { + var i, key, nextElem, parent; + if (element.ref.remove()) { + key = element.ref.key; + parent = element.ref.parent; + i = worklist.length; + while (i--) { + nextElem = worklist[i]; + if (nextElem.ref && nextElem.ref.parent === parent) { + if (nextElem.ref.key < key) { + break; + } + --nextElem.ref.key; + } + } + } + } + this.__initialize(root, visitor); + sentinel = {}; + worklist = this.__worklist; + leavelist = this.__leavelist; + outer = { root: root }; + element = new Element(root, null, null, new Reference(outer, 'root')); + worklist.push(element); + leavelist.push(element); + while (worklist.length) { + element = worklist.pop(); + if (element === sentinel) { + element = leavelist.pop(); + target = this.__execute(visitor.leave, element); + if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) { + element.ref.replace(target); + } + if (this.__state === REMOVE || target === REMOVE) { + removeElem(element); + } + if (this.__state === BREAK || target === BREAK) { + return outer.root; + } + continue; + } + target = this.__execute(visitor.enter, element); + if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) { + element.ref.replace(target); + element.node = target; + } + if (this.__state === REMOVE || target === REMOVE) { + removeElem(element); + element.node = null; + } + if (this.__state === BREAK || target === BREAK) { + return outer.root; + } + node = element.node; + if (!node) { + continue; + } + worklist.push(sentinel); + leavelist.push(element); + if (this.__state === SKIP || target === SKIP) { + continue; + } + nodeType = node.type || element.wrap; + candidates = this.__keys[nodeType]; + if (!candidates) { + if (this.__fallback) { + candidates = this.__fallback(node); + } else { + throw new Error('Unknown node type ' + nodeType + '.'); + } + } + current = candidates.length; + while ((current -= 1) >= 0) { + key = candidates[current]; + candidate = node[key]; + if (!candidate) { + continue; + } + if (isArray(candidate)) { + current2 = candidate.length; + while ((current2 -= 1) >= 0) { + if (!candidate[current2]) { + continue; + } + if (isProperty(nodeType, candidates[current])) { + element = new Element(candidate[current2], [ + key, + current2 + ], 'Property', new Reference(candidate, current2)); + } else if (isNode(candidate[current2])) { + element = new Element(candidate[current2], [ + key, + current2 + ], null, new Reference(candidate, current2)); + } else { + continue; + } + worklist.push(element); + } + } else if (isNode(candidate)) { + worklist.push(new Element(candidate, key, null, new Reference(node, key))); + } + } + } + return outer.root; + }; + function traverse(root, visitor) { + var controller = new Controller; + return controller.traverse(root, visitor); + } + function replace(root, visitor) { + var controller = new Controller; + return controller.replace(root, visitor); + } + function extendCommentRange(comment, tokens) { + var target; + target = upperBound(tokens, function search(token) { + return token.range[0] > comment.range[0]; + }); + comment.extendedRange = [ + comment.range[0], + comment.range[1] + ]; + if (target !== tokens.length) { + comment.extendedRange[1] = tokens[target].range[0]; + } + target -= 1; + if (target >= 0) { + comment.extendedRange[0] = tokens[target].range[1]; + } + return comment; + } + function attachComments(tree, providedComments, tokens) { + var comments = [], comment, len, i, cursor; + if (!tree.range) { + throw new Error('attachComments needs range information'); + } + if (!tokens.length) { + if (providedComments.length) { + for (i = 0, len = providedComments.length; i < len; i += 1) { + comment = deepCopy(providedComments[i]); + comment.extendedRange = [ + 0, + tree.range[0] + ]; + comments.push(comment); + } + tree.leadingComments = comments; + } + return tree; + } + for (i = 0, len = providedComments.length; i < len; i += 1) { + comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens)); + } + cursor = 0; + traverse(tree, { + enter: function (node) { + var comment; + while (cursor < comments.length) { + comment = comments[cursor]; + if (comment.extendedRange[1] > node.range[0]) { + break; + } + if (comment.extendedRange[1] === node.range[0]) { + if (!node.leadingComments) { + node.leadingComments = []; + } + node.leadingComments.push(comment); + comments.splice(cursor, 1); + } else { + cursor += 1; + } + } + if (cursor === comments.length) { + return VisitorOption.Break; + } + if (comments[cursor].extendedRange[0] > node.range[1]) { + return VisitorOption.Skip; + } + } + }); + cursor = 0; + traverse(tree, { + leave: function (node) { + var comment; + while (cursor < comments.length) { + comment = comments[cursor]; + if (node.range[1] < comment.extendedRange[0]) { + break; + } + if (node.range[1] === comment.extendedRange[0]) { + if (!node.trailingComments) { + node.trailingComments = []; + } + node.trailingComments.push(comment); + comments.splice(cursor, 1); + } else { + cursor += 1; + } + } + if (cursor === comments.length) { + return VisitorOption.Break; + } + if (comments[cursor].extendedRange[0] > node.range[1]) { + return VisitorOption.Skip; + } + } + }); + return tree; + } + exports.version = require('/node_modules/estraverse/package.json', module).version; + exports.Syntax = Syntax; + exports.traverse = traverse; + exports.replace = replace; + exports.attachComments = attachComments; + exports.VisitorKeys = VisitorKeys; + exports.VisitorOption = VisitorOption; + exports.Controller = Controller; + exports.cloneEnvironment = function () { + return clone({}); + }; + return exports; + }(exports)); + }); + require.define('/node_modules/estraverse/package.json', function (module, exports, __dirname, __filename) { + module.exports = { + '_from': 'estraverse@^4.2.0', + '_id': 'estraverse@4.2.0', + '_inBundle': false, + '_integrity': 'sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=', + '_location': '/estraverse', + '_phantomChildren': {}, + '_requested': { + 'type': 'range', + 'registry': true, + 'raw': 'estraverse@^4.2.0', + 'name': 'estraverse', + 'escapedName': 'estraverse', + 'rawSpec': '^4.2.0', + 'saveSpec': null, + 'fetchSpec': '^4.2.0' + }, + '_requiredBy': [ + '/', + '/eslint', + '/eslint/escope', + '/esquery', + '/esrecurse' + ], + '_resolved': 'https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz', + '_shasum': '0dee3fed31fcd469618ce7342099fc1afa0bdb13', + '_spec': 'estraverse@^4.2.0', + '_where': 'C:\\Users\\Ricardo\\Desktop\\escodegen-master', + 'bugs': { 'url': 'https://github.com/estools/estraverse/issues' }, + 'bundleDependencies': false, + 'deprecated': false, + 'description': 'ECMAScript JS AST traversal functions', + 'devDependencies': { + 'babel-preset-es2015': '^6.3.13', + 'babel-register': '^6.3.13', + 'chai': '^2.1.1', + 'espree': '^1.11.0', + 'gulp': '^3.8.10', + 'gulp-bump': '^0.2.2', + 'gulp-filter': '^2.0.0', + 'gulp-git': '^1.0.1', + 'gulp-tag-version': '^1.2.1', + 'jshint': '^2.5.6', + 'mocha': '^2.1.0' + }, + 'engines': { 'node': '>=0.10.0' }, + 'homepage': 'https://github.com/estools/estraverse', + 'license': 'BSD-2-Clause', + 'main': 'estraverse.js', + 'maintainers': [{ + 'name': 'Yusuke Suzuki', + 'email': 'utatane.tea@gmail.com', + 'url': 'http://github.com/Constellation' + }], + 'name': 'estraverse', + 'repository': { + 'type': 'git', + 'url': 'git+ssh://git@github.com/estools/estraverse.git' + }, + 'scripts': { + 'lint': 'jshint estraverse.js', + 'test': 'npm run-script lint && npm run-script unit-test', + 'unit-test': 'mocha --compilers js:babel-register' + }, + 'version': '4.2.0' + }; + }); + require('/tools/entry-point.js'); +}.call(this, this)); diff --git a/jsAst/src/esprima/esprima-walk.js b/jsAst/resources/esprima/esprima-walk.js similarity index 95% rename from jsAst/src/esprima/esprima-walk.js rename to jsAst/resources/esprima/esprima-walk.js index f21b919..f61f483 100644 --- a/jsAst/src/esprima/esprima-walk.js +++ b/jsAst/resources/esprima/esprima-walk.js @@ -1,31 +1,31 @@ -function addParents(ast, key) { - walk(ast, key || 'parent') - return ast - } - - function walk(node, keyname, parent) { - if (parent) Object.defineProperty(node, keyname, { - value: parent - , configurable: true - , enumerable: false - , writable: true - }) - - for (var key in node) { - if (key === 'parent') continue - if (!node.hasOwnProperty(key)) continue - - var child = node[key] - if (Array.isArray(child)) { - var l = child.length - - for (var i = 0; i < l; i++) { - if (child[i] && child[i].type) - walk(child[i], keyname, node) - } - } else - if (child && child.type) { - walk(child, keyname, node) - } - } +function addParents(ast, key) { + walk(ast, key || 'parent') + return ast + } + + function walk(node, keyname, parent) { + if (parent) Object.defineProperty(node, keyname, { + value: parent + , configurable: true + , enumerable: false + , writable: true + }) + + for (var key in node) { + if (key === 'parent') continue + if (!node.hasOwnProperty(key)) continue + + var child = node[key] + if (Array.isArray(child)) { + var l = child.length + + for (var i = 0; i < l; i++) { + if (child[i] && child[i].type) + walk(child[i], keyname, node) + } + } else + if (child && child.type) { + walk(child, keyname, node) + } + } } \ No newline at end of file diff --git a/jsAst/src/esprima/esprima.js b/jsAst/resources/esprima/esprima.js similarity index 97% rename from jsAst/src/esprima/esprima.js rename to jsAst/resources/esprima/esprima.js index 41a8ab0..2af3eee 100644 --- a/jsAst/src/esprima/esprima.js +++ b/jsAst/resources/esprima/esprima.js @@ -1,6709 +1,6709 @@ -(function webpackUniversalModuleDefinition(root, factory) { -/* istanbul ignore next */ - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); -/* istanbul ignore next */ - else if(typeof exports === 'object') - exports["esprima"] = factory(); - else - root["esprima"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/* istanbul ignore if */ -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - /* - Copyright JS Foundation and other contributors, https://js.foundation/ - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - Object.defineProperty(exports, "__esModule", { value: true }); - var comment_handler_1 = __webpack_require__(1); - var jsx_parser_1 = __webpack_require__(3); - var parser_1 = __webpack_require__(8); - var tokenizer_1 = __webpack_require__(15); - function parse(code, options, delegate) { - var commentHandler = null; - var proxyDelegate = function (node, metadata) { - if (delegate) { - delegate(node, metadata); - } - if (commentHandler) { - commentHandler.visit(node, metadata); - } - }; - var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null; - var collectComment = false; - if (options) { - collectComment = (typeof options.comment === 'boolean' && options.comment); - var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment); - if (collectComment || attachComment) { - commentHandler = new comment_handler_1.CommentHandler(); - commentHandler.attach = attachComment; - options.comment = true; - parserDelegate = proxyDelegate; - } - } - var isModule = false; - if (options && typeof options.sourceType === 'string') { - isModule = (options.sourceType === 'module'); - } - var parser; - if (options && typeof options.jsx === 'boolean' && options.jsx) { - parser = new jsx_parser_1.JSXParser(code, options, parserDelegate); - } - else { - parser = new parser_1.Parser(code, options, parserDelegate); - } - var program = isModule ? parser.parseModule() : parser.parseScript(); - var ast = program; - if (collectComment && commentHandler) { - ast.comments = commentHandler.comments; - } - if (parser.config.tokens) { - ast.tokens = parser.tokens; - } - if (parser.config.tolerant) { - ast.errors = parser.errorHandler.errors; - } - return ast; - } - exports.parse = parse; - function parseModule(code, options, delegate) { - var parsingOptions = options || {}; - parsingOptions.sourceType = 'module'; - return parse(code, parsingOptions, delegate); - } - exports.parseModule = parseModule; - function parseScript(code, options, delegate) { - var parsingOptions = options || {}; - parsingOptions.sourceType = 'script'; - return parse(code, parsingOptions, delegate); - } - exports.parseScript = parseScript; - function tokenize(code, options, delegate) { - var tokenizer = new tokenizer_1.Tokenizer(code, options); - var tokens; - tokens = []; - try { - while (true) { - var token = tokenizer.getNextToken(); - if (!token) { - break; - } - if (delegate) { - token = delegate(token); - } - tokens.push(token); - } - } - catch (e) { - tokenizer.errorHandler.tolerate(e); - } - if (tokenizer.errorHandler.tolerant) { - tokens.errors = tokenizer.errors(); - } - return tokens; - } - exports.tokenize = tokenize; - var syntax_1 = __webpack_require__(2); - exports.Syntax = syntax_1.Syntax; - // Sync with *.json manifests. - exports.version = '4.0.1'; - - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var syntax_1 = __webpack_require__(2); - var CommentHandler = (function () { - function CommentHandler() { - this.attach = false; - this.comments = []; - this.stack = []; - this.leading = []; - this.trailing = []; - } - CommentHandler.prototype.insertInnerComments = function (node, metadata) { - // innnerComments for properties empty block - // `function a() {/** comments **\/}` - if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) { - var innerComments = []; - for (var i = this.leading.length - 1; i >= 0; --i) { - var entry = this.leading[i]; - if (metadata.end.offset >= entry.start) { - innerComments.unshift(entry.comment); - this.leading.splice(i, 1); - this.trailing.splice(i, 1); - } - } - if (innerComments.length) { - node.innerComments = innerComments; - } - } - }; - CommentHandler.prototype.findTrailingComments = function (metadata) { - var trailingComments = []; - if (this.trailing.length > 0) { - for (var i = this.trailing.length - 1; i >= 0; --i) { - var entry_1 = this.trailing[i]; - if (entry_1.start >= metadata.end.offset) { - trailingComments.unshift(entry_1.comment); - } - } - this.trailing.length = 0; - return trailingComments; - } - var entry = this.stack[this.stack.length - 1]; - if (entry && entry.node.trailingComments) { - var firstComment = entry.node.trailingComments[0]; - if (firstComment && firstComment.range[0] >= metadata.end.offset) { - trailingComments = entry.node.trailingComments; - delete entry.node.trailingComments; - } - } - return trailingComments; - }; - CommentHandler.prototype.findLeadingComments = function (metadata) { - var leadingComments = []; - var target; - while (this.stack.length > 0) { - var entry = this.stack[this.stack.length - 1]; - if (entry && entry.start >= metadata.start.offset) { - target = entry.node; - this.stack.pop(); - } - else { - break; - } - } - if (target) { - var count = target.leadingComments ? target.leadingComments.length : 0; - for (var i = count - 1; i >= 0; --i) { - var comment = target.leadingComments[i]; - if (comment.range[1] <= metadata.start.offset) { - leadingComments.unshift(comment); - target.leadingComments.splice(i, 1); - } - } - if (target.leadingComments && target.leadingComments.length === 0) { - delete target.leadingComments; - } - return leadingComments; - } - for (var i = this.leading.length - 1; i >= 0; --i) { - var entry = this.leading[i]; - if (entry.start <= metadata.start.offset) { - leadingComments.unshift(entry.comment); - this.leading.splice(i, 1); - } - } - return leadingComments; - }; - CommentHandler.prototype.visitNode = function (node, metadata) { - if (node.type === syntax_1.Syntax.Program && node.body.length > 0) { - return; - } - this.insertInnerComments(node, metadata); - var trailingComments = this.findTrailingComments(metadata); - var leadingComments = this.findLeadingComments(metadata); - if (leadingComments.length > 0) { - node.leadingComments = leadingComments; - } - if (trailingComments.length > 0) { - node.trailingComments = trailingComments; - } - this.stack.push({ - node: node, - start: metadata.start.offset - }); - }; - CommentHandler.prototype.visitComment = function (node, metadata) { - var type = (node.type[0] === 'L') ? 'Line' : 'Block'; - var comment = { - type: type, - value: node.value - }; - if (node.range) { - comment.range = node.range; - } - if (node.loc) { - comment.loc = node.loc; - } - this.comments.push(comment); - if (this.attach) { - var entry = { - comment: { - type: type, - value: node.value, - range: [metadata.start.offset, metadata.end.offset] - }, - start: metadata.start.offset - }; - if (node.loc) { - entry.comment.loc = node.loc; - } - node.type = type; - this.leading.push(entry); - this.trailing.push(entry); - } - }; - CommentHandler.prototype.visit = function (node, metadata) { - if (node.type === 'LineComment') { - this.visitComment(node, metadata); - } - else if (node.type === 'BlockComment') { - this.visitComment(node, metadata); - } - else if (this.attach) { - this.visitNode(node, metadata); - } - }; - return CommentHandler; - }()); - exports.CommentHandler = CommentHandler; - - -/***/ }, -/* 2 */ -/***/ function(module, exports) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.Syntax = { - AssignmentExpression: 'AssignmentExpression', - AssignmentPattern: 'AssignmentPattern', - ArrayExpression: 'ArrayExpression', - ArrayPattern: 'ArrayPattern', - ArrowFunctionExpression: 'ArrowFunctionExpression', - AwaitExpression: 'AwaitExpression', - BlockStatement: 'BlockStatement', - BinaryExpression: 'BinaryExpression', - BreakStatement: 'BreakStatement', - CallExpression: 'CallExpression', - CatchClause: 'CatchClause', - ClassBody: 'ClassBody', - ClassDeclaration: 'ClassDeclaration', - ClassExpression: 'ClassExpression', - ConditionalExpression: 'ConditionalExpression', - ContinueStatement: 'ContinueStatement', - DoWhileStatement: 'DoWhileStatement', - DebuggerStatement: 'DebuggerStatement', - EmptyStatement: 'EmptyStatement', - ExportAllDeclaration: 'ExportAllDeclaration', - ExportDefaultDeclaration: 'ExportDefaultDeclaration', - ExportNamedDeclaration: 'ExportNamedDeclaration', - ExportSpecifier: 'ExportSpecifier', - ExpressionStatement: 'ExpressionStatement', - ForStatement: 'ForStatement', - ForOfStatement: 'ForOfStatement', - ForInStatement: 'ForInStatement', - FunctionDeclaration: 'FunctionDeclaration', - FunctionExpression: 'FunctionExpression', - Identifier: 'Identifier', - IfStatement: 'IfStatement', - ImportDeclaration: 'ImportDeclaration', - ImportDefaultSpecifier: 'ImportDefaultSpecifier', - ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', - ImportSpecifier: 'ImportSpecifier', - Literal: 'Literal', - LabeledStatement: 'LabeledStatement', - LogicalExpression: 'LogicalExpression', - MemberExpression: 'MemberExpression', - MetaProperty: 'MetaProperty', - MethodDefinition: 'MethodDefinition', - NewExpression: 'NewExpression', - ObjectExpression: 'ObjectExpression', - ObjectPattern: 'ObjectPattern', - Program: 'Program', - Property: 'Property', - RestElement: 'RestElement', - ReturnStatement: 'ReturnStatement', - SequenceExpression: 'SequenceExpression', - SpreadElement: 'SpreadElement', - Super: 'Super', - SwitchCase: 'SwitchCase', - SwitchStatement: 'SwitchStatement', - TaggedTemplateExpression: 'TaggedTemplateExpression', - TemplateElement: 'TemplateElement', - TemplateLiteral: 'TemplateLiteral', - ThisExpression: 'ThisExpression', - ThrowStatement: 'ThrowStatement', - TryStatement: 'TryStatement', - UnaryExpression: 'UnaryExpression', - UpdateExpression: 'UpdateExpression', - VariableDeclaration: 'VariableDeclaration', - VariableDeclarator: 'VariableDeclarator', - WhileStatement: 'WhileStatement', - WithStatement: 'WithStatement', - YieldExpression: 'YieldExpression' - }; - - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; -/* istanbul ignore next */ - var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; - })(); - Object.defineProperty(exports, "__esModule", { value: true }); - var character_1 = __webpack_require__(4); - var JSXNode = __webpack_require__(5); - var jsx_syntax_1 = __webpack_require__(6); - var Node = __webpack_require__(7); - var parser_1 = __webpack_require__(8); - var token_1 = __webpack_require__(13); - var xhtml_entities_1 = __webpack_require__(14); - token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier'; - token_1.TokenName[101 /* Text */] = 'JSXText'; - // Fully qualified element name, e.g. returns "svg:path" - function getQualifiedElementName(elementName) { - var qualifiedName; - switch (elementName.type) { - case jsx_syntax_1.JSXSyntax.JSXIdentifier: - var id = elementName; - qualifiedName = id.name; - break; - case jsx_syntax_1.JSXSyntax.JSXNamespacedName: - var ns = elementName; - qualifiedName = getQualifiedElementName(ns.namespace) + ':' + - getQualifiedElementName(ns.name); - break; - case jsx_syntax_1.JSXSyntax.JSXMemberExpression: - var expr = elementName; - qualifiedName = getQualifiedElementName(expr.object) + '.' + - getQualifiedElementName(expr.property); - break; - /* istanbul ignore next */ - default: - break; - } - return qualifiedName; - } - var JSXParser = (function (_super) { - __extends(JSXParser, _super); - function JSXParser(code, options, delegate) { - return _super.call(this, code, options, delegate) || this; - } - JSXParser.prototype.parsePrimaryExpression = function () { - return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this); - }; - JSXParser.prototype.startJSX = function () { - // Unwind the scanner before the lookahead token. - this.scanner.index = this.startMarker.index; - this.scanner.lineNumber = this.startMarker.line; - this.scanner.lineStart = this.startMarker.index - this.startMarker.column; - }; - JSXParser.prototype.finishJSX = function () { - // Prime the next lookahead. - this.nextToken(); - }; - JSXParser.prototype.reenterJSX = function () { - this.startJSX(); - this.expectJSX('}'); - // Pop the closing '}' added from the lookahead. - if (this.config.tokens) { - this.tokens.pop(); - } - }; - JSXParser.prototype.createJSXNode = function () { - this.collectComments(); - return { - index: this.scanner.index, - line: this.scanner.lineNumber, - column: this.scanner.index - this.scanner.lineStart - }; - }; - JSXParser.prototype.createJSXChildNode = function () { - return { - index: this.scanner.index, - line: this.scanner.lineNumber, - column: this.scanner.index - this.scanner.lineStart - }; - }; - JSXParser.prototype.scanXHTMLEntity = function (quote) { - var result = '&'; - var valid = true; - var terminated = false; - var numeric = false; - var hex = false; - while (!this.scanner.eof() && valid && !terminated) { - var ch = this.scanner.source[this.scanner.index]; - if (ch === quote) { - break; - } - terminated = (ch === ';'); - result += ch; - ++this.scanner.index; - if (!terminated) { - switch (result.length) { - case 2: - // e.g. '{' - numeric = (ch === '#'); - break; - case 3: - if (numeric) { - // e.g. 'A' - hex = (ch === 'x'); - valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0)); - numeric = numeric && !hex; - } - break; - default: - valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0))); - valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0))); - break; - } - } - } - if (valid && terminated && result.length > 2) { - // e.g. 'A' becomes just '#x41' - var str = result.substr(1, result.length - 2); - if (numeric && str.length > 1) { - result = String.fromCharCode(parseInt(str.substr(1), 10)); - } - else if (hex && str.length > 2) { - result = String.fromCharCode(parseInt('0' + str.substr(1), 16)); - } - else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) { - result = xhtml_entities_1.XHTMLEntities[str]; - } - } - return result; - }; - // Scan the next JSX token. This replaces Scanner#lex when in JSX mode. - JSXParser.prototype.lexJSX = function () { - var cp = this.scanner.source.charCodeAt(this.scanner.index); - // < > / : = { } - if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) { - var value = this.scanner.source[this.scanner.index++]; - return { - type: 7 /* Punctuator */, - value: value, - lineNumber: this.scanner.lineNumber, - lineStart: this.scanner.lineStart, - start: this.scanner.index - 1, - end: this.scanner.index - }; - } - // " ' - if (cp === 34 || cp === 39) { - var start = this.scanner.index; - var quote = this.scanner.source[this.scanner.index++]; - var str = ''; - while (!this.scanner.eof()) { - var ch = this.scanner.source[this.scanner.index++]; - if (ch === quote) { - break; - } - else if (ch === '&') { - str += this.scanXHTMLEntity(quote); - } - else { - str += ch; - } - } - return { - type: 8 /* StringLiteral */, - value: str, - lineNumber: this.scanner.lineNumber, - lineStart: this.scanner.lineStart, - start: start, - end: this.scanner.index - }; - } - // ... or . - if (cp === 46) { - var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1); - var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2); - var value = (n1 === 46 && n2 === 46) ? '...' : '.'; - var start = this.scanner.index; - this.scanner.index += value.length; - return { - type: 7 /* Punctuator */, - value: value, - lineNumber: this.scanner.lineNumber, - lineStart: this.scanner.lineStart, - start: start, - end: this.scanner.index - }; - } - // ` - if (cp === 96) { - // Only placeholder, since it will be rescanned as a real assignment expression. - return { - type: 10 /* Template */, - value: '', - lineNumber: this.scanner.lineNumber, - lineStart: this.scanner.lineStart, - start: this.scanner.index, - end: this.scanner.index - }; - } - // Identifer can not contain backslash (char code 92). - if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) { - var start = this.scanner.index; - ++this.scanner.index; - while (!this.scanner.eof()) { - var ch = this.scanner.source.charCodeAt(this.scanner.index); - if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) { - ++this.scanner.index; - } - else if (ch === 45) { - // Hyphen (char code 45) can be part of an identifier. - ++this.scanner.index; - } - else { - break; - } - } - var id = this.scanner.source.slice(start, this.scanner.index); - return { - type: 100 /* Identifier */, - value: id, - lineNumber: this.scanner.lineNumber, - lineStart: this.scanner.lineStart, - start: start, - end: this.scanner.index - }; - } - return this.scanner.lex(); - }; - JSXParser.prototype.nextJSXToken = function () { - this.collectComments(); - this.startMarker.index = this.scanner.index; - this.startMarker.line = this.scanner.lineNumber; - this.startMarker.column = this.scanner.index - this.scanner.lineStart; - var token = this.lexJSX(); - this.lastMarker.index = this.scanner.index; - this.lastMarker.line = this.scanner.lineNumber; - this.lastMarker.column = this.scanner.index - this.scanner.lineStart; - if (this.config.tokens) { - this.tokens.push(this.convertToken(token)); - } - return token; - }; - JSXParser.prototype.nextJSXText = function () { - this.startMarker.index = this.scanner.index; - this.startMarker.line = this.scanner.lineNumber; - this.startMarker.column = this.scanner.index - this.scanner.lineStart; - var start = this.scanner.index; - var text = ''; - while (!this.scanner.eof()) { - var ch = this.scanner.source[this.scanner.index]; - if (ch === '{' || ch === '<') { - break; - } - ++this.scanner.index; - text += ch; - if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { - ++this.scanner.lineNumber; - if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') { - ++this.scanner.index; - } - this.scanner.lineStart = this.scanner.index; - } - } - this.lastMarker.index = this.scanner.index; - this.lastMarker.line = this.scanner.lineNumber; - this.lastMarker.column = this.scanner.index - this.scanner.lineStart; - var token = { - type: 101 /* Text */, - value: text, - lineNumber: this.scanner.lineNumber, - lineStart: this.scanner.lineStart, - start: start, - end: this.scanner.index - }; - if ((text.length > 0) && this.config.tokens) { - this.tokens.push(this.convertToken(token)); - } - return token; - }; - JSXParser.prototype.peekJSXToken = function () { - var state = this.scanner.saveState(); - this.scanner.scanComments(); - var next = this.lexJSX(); - this.scanner.restoreState(state); - return next; - }; - // Expect the next JSX token to match the specified punctuator. - // If not, an exception will be thrown. - JSXParser.prototype.expectJSX = function (value) { - var token = this.nextJSXToken(); - if (token.type !== 7 /* Punctuator */ || token.value !== value) { - this.throwUnexpectedToken(token); - } - }; - // Return true if the next JSX token matches the specified punctuator. - JSXParser.prototype.matchJSX = function (value) { - var next = this.peekJSXToken(); - return next.type === 7 /* Punctuator */ && next.value === value; - }; - JSXParser.prototype.parseJSXIdentifier = function () { - var node = this.createJSXNode(); - var token = this.nextJSXToken(); - if (token.type !== 100 /* Identifier */) { - this.throwUnexpectedToken(token); - } - return this.finalize(node, new JSXNode.JSXIdentifier(token.value)); - }; - JSXParser.prototype.parseJSXElementName = function () { - var node = this.createJSXNode(); - var elementName = this.parseJSXIdentifier(); - if (this.matchJSX(':')) { - var namespace = elementName; - this.expectJSX(':'); - var name_1 = this.parseJSXIdentifier(); - elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1)); - } - else if (this.matchJSX('.')) { - while (this.matchJSX('.')) { - var object = elementName; - this.expectJSX('.'); - var property = this.parseJSXIdentifier(); - elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property)); - } - } - return elementName; - }; - JSXParser.prototype.parseJSXAttributeName = function () { - var node = this.createJSXNode(); - var attributeName; - var identifier = this.parseJSXIdentifier(); - if (this.matchJSX(':')) { - var namespace = identifier; - this.expectJSX(':'); - var name_2 = this.parseJSXIdentifier(); - attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2)); - } - else { - attributeName = identifier; - } - return attributeName; - }; - JSXParser.prototype.parseJSXStringLiteralAttribute = function () { - var node = this.createJSXNode(); - var token = this.nextJSXToken(); - if (token.type !== 8 /* StringLiteral */) { - this.throwUnexpectedToken(token); - } - var raw = this.getTokenRaw(token); - return this.finalize(node, new Node.Literal(token.value, raw)); - }; - JSXParser.prototype.parseJSXExpressionAttribute = function () { - var node = this.createJSXNode(); - this.expectJSX('{'); - this.finishJSX(); - if (this.match('}')) { - this.tolerateError('JSX attributes must only be assigned a non-empty expression'); - } - var expression = this.parseAssignmentExpression(); - this.reenterJSX(); - return this.finalize(node, new JSXNode.JSXExpressionContainer(expression)); - }; - JSXParser.prototype.parseJSXAttributeValue = function () { - return this.matchJSX('{') ? this.parseJSXExpressionAttribute() : - this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute(); - }; - JSXParser.prototype.parseJSXNameValueAttribute = function () { - var node = this.createJSXNode(); - var name = this.parseJSXAttributeName(); - var value = null; - if (this.matchJSX('=')) { - this.expectJSX('='); - value = this.parseJSXAttributeValue(); - } - return this.finalize(node, new JSXNode.JSXAttribute(name, value)); - }; - JSXParser.prototype.parseJSXSpreadAttribute = function () { - var node = this.createJSXNode(); - this.expectJSX('{'); - this.expectJSX('...'); - this.finishJSX(); - var argument = this.parseAssignmentExpression(); - this.reenterJSX(); - return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument)); - }; - JSXParser.prototype.parseJSXAttributes = function () { - var attributes = []; - while (!this.matchJSX('/') && !this.matchJSX('>')) { - var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() : - this.parseJSXNameValueAttribute(); - attributes.push(attribute); - } - return attributes; - }; - JSXParser.prototype.parseJSXOpeningElement = function () { - var node = this.createJSXNode(); - this.expectJSX('<'); - var name = this.parseJSXElementName(); - var attributes = this.parseJSXAttributes(); - var selfClosing = this.matchJSX('/'); - if (selfClosing) { - this.expectJSX('/'); - } - this.expectJSX('>'); - return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes)); - }; - JSXParser.prototype.parseJSXBoundaryElement = function () { - var node = this.createJSXNode(); - this.expectJSX('<'); - if (this.matchJSX('/')) { - this.expectJSX('/'); - var name_3 = this.parseJSXElementName(); - this.expectJSX('>'); - return this.finalize(node, new JSXNode.JSXClosingElement(name_3)); - } - var name = this.parseJSXElementName(); - var attributes = this.parseJSXAttributes(); - var selfClosing = this.matchJSX('/'); - if (selfClosing) { - this.expectJSX('/'); - } - this.expectJSX('>'); - return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes)); - }; - JSXParser.prototype.parseJSXEmptyExpression = function () { - var node = this.createJSXChildNode(); - this.collectComments(); - this.lastMarker.index = this.scanner.index; - this.lastMarker.line = this.scanner.lineNumber; - this.lastMarker.column = this.scanner.index - this.scanner.lineStart; - return this.finalize(node, new JSXNode.JSXEmptyExpression()); - }; - JSXParser.prototype.parseJSXExpressionContainer = function () { - var node = this.createJSXNode(); - this.expectJSX('{'); - var expression; - if (this.matchJSX('}')) { - expression = this.parseJSXEmptyExpression(); - this.expectJSX('}'); - } - else { - this.finishJSX(); - expression = this.parseAssignmentExpression(); - this.reenterJSX(); - } - return this.finalize(node, new JSXNode.JSXExpressionContainer(expression)); - }; - JSXParser.prototype.parseJSXChildren = function () { - var children = []; - while (!this.scanner.eof()) { - var node = this.createJSXChildNode(); - var token = this.nextJSXText(); - if (token.start < token.end) { - var raw = this.getTokenRaw(token); - var child = this.finalize(node, new JSXNode.JSXText(token.value, raw)); - children.push(child); - } - if (this.scanner.source[this.scanner.index] === '{') { - var container = this.parseJSXExpressionContainer(); - children.push(container); - } - else { - break; - } - } - return children; - }; - JSXParser.prototype.parseComplexJSXElement = function (el) { - var stack = []; - while (!this.scanner.eof()) { - el.children = el.children.concat(this.parseJSXChildren()); - var node = this.createJSXChildNode(); - var element = this.parseJSXBoundaryElement(); - if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) { - var opening = element; - if (opening.selfClosing) { - var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null)); - el.children.push(child); - } - else { - stack.push(el); - el = { node: node, opening: opening, closing: null, children: [] }; - } - } - if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) { - el.closing = element; - var open_1 = getQualifiedElementName(el.opening.name); - var close_1 = getQualifiedElementName(el.closing.name); - if (open_1 !== close_1) { - this.tolerateError('Expected corresponding JSX closing tag for %0', open_1); - } - if (stack.length > 0) { - var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing)); - el = stack[stack.length - 1]; - el.children.push(child); - stack.pop(); - } - else { - break; - } - } - } - return el; - }; - JSXParser.prototype.parseJSXElement = function () { - var node = this.createJSXNode(); - var opening = this.parseJSXOpeningElement(); - var children = []; - var closing = null; - if (!opening.selfClosing) { - var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children }); - children = el.children; - closing = el.closing; - } - return this.finalize(node, new JSXNode.JSXElement(opening, children, closing)); - }; - JSXParser.prototype.parseJSXRoot = function () { - // Pop the opening '<' added from the lookahead. - if (this.config.tokens) { - this.tokens.pop(); - } - this.startJSX(); - var element = this.parseJSXElement(); - this.finishJSX(); - return element; - }; - JSXParser.prototype.isStartOfExpression = function () { - return _super.prototype.isStartOfExpression.call(this) || this.match('<'); - }; - return JSXParser; - }(parser_1.Parser)); - exports.JSXParser = JSXParser; - - -/***/ }, -/* 4 */ -/***/ function(module, exports) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - // See also tools/generate-unicode-regex.js. - var Regex = { - // Unicode v8.0.0 NonAsciiIdentifierStart: - NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, - // Unicode v8.0.0 NonAsciiIdentifierPart: - NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ - }; - exports.Character = { - /* tslint:disable:no-bitwise */ - fromCodePoint: function (cp) { - return (cp < 0x10000) ? String.fromCharCode(cp) : - String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) + - String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023)); - }, - // https://tc39.github.io/ecma262/#sec-white-space - isWhiteSpace: function (cp) { - return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) || - (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0); - }, - // https://tc39.github.io/ecma262/#sec-line-terminators - isLineTerminator: function (cp) { - return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029); - }, - // https://tc39.github.io/ecma262/#sec-names-and-keywords - isIdentifierStart: function (cp) { - return (cp === 0x24) || (cp === 0x5F) || - (cp >= 0x41 && cp <= 0x5A) || - (cp >= 0x61 && cp <= 0x7A) || - (cp === 0x5C) || - ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp))); - }, - isIdentifierPart: function (cp) { - return (cp === 0x24) || (cp === 0x5F) || - (cp >= 0x41 && cp <= 0x5A) || - (cp >= 0x61 && cp <= 0x7A) || - (cp >= 0x30 && cp <= 0x39) || - (cp === 0x5C) || - ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp))); - }, - // https://tc39.github.io/ecma262/#sec-literals-numeric-literals - isDecimalDigit: function (cp) { - return (cp >= 0x30 && cp <= 0x39); // 0..9 - }, - isHexDigit: function (cp) { - return (cp >= 0x30 && cp <= 0x39) || - (cp >= 0x41 && cp <= 0x46) || - (cp >= 0x61 && cp <= 0x66); // a..f - }, - isOctalDigit: function (cp) { - return (cp >= 0x30 && cp <= 0x37); // 0..7 - } - }; - - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var jsx_syntax_1 = __webpack_require__(6); - /* tslint:disable:max-classes-per-file */ - var JSXClosingElement = (function () { - function JSXClosingElement(name) { - this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement; - this.name = name; - } - return JSXClosingElement; - }()); - exports.JSXClosingElement = JSXClosingElement; - var JSXElement = (function () { - function JSXElement(openingElement, children, closingElement) { - this.type = jsx_syntax_1.JSXSyntax.JSXElement; - this.openingElement = openingElement; - this.children = children; - this.closingElement = closingElement; - } - return JSXElement; - }()); - exports.JSXElement = JSXElement; - var JSXEmptyExpression = (function () { - function JSXEmptyExpression() { - this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression; - } - return JSXEmptyExpression; - }()); - exports.JSXEmptyExpression = JSXEmptyExpression; - var JSXExpressionContainer = (function () { - function JSXExpressionContainer(expression) { - this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer; - this.expression = expression; - } - return JSXExpressionContainer; - }()); - exports.JSXExpressionContainer = JSXExpressionContainer; - var JSXIdentifier = (function () { - function JSXIdentifier(name) { - this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier; - this.name = name; - } - return JSXIdentifier; - }()); - exports.JSXIdentifier = JSXIdentifier; - var JSXMemberExpression = (function () { - function JSXMemberExpression(object, property) { - this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression; - this.object = object; - this.property = property; - } - return JSXMemberExpression; - }()); - exports.JSXMemberExpression = JSXMemberExpression; - var JSXAttribute = (function () { - function JSXAttribute(name, value) { - this.type = jsx_syntax_1.JSXSyntax.JSXAttribute; - this.name = name; - this.value = value; - } - return JSXAttribute; - }()); - exports.JSXAttribute = JSXAttribute; - var JSXNamespacedName = (function () { - function JSXNamespacedName(namespace, name) { - this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName; - this.namespace = namespace; - this.name = name; - } - return JSXNamespacedName; - }()); - exports.JSXNamespacedName = JSXNamespacedName; - var JSXOpeningElement = (function () { - function JSXOpeningElement(name, selfClosing, attributes) { - this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement; - this.name = name; - this.selfClosing = selfClosing; - this.attributes = attributes; - } - return JSXOpeningElement; - }()); - exports.JSXOpeningElement = JSXOpeningElement; - var JSXSpreadAttribute = (function () { - function JSXSpreadAttribute(argument) { - this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute; - this.argument = argument; - } - return JSXSpreadAttribute; - }()); - exports.JSXSpreadAttribute = JSXSpreadAttribute; - var JSXText = (function () { - function JSXText(value, raw) { - this.type = jsx_syntax_1.JSXSyntax.JSXText; - this.value = value; - this.raw = raw; - } - return JSXText; - }()); - exports.JSXText = JSXText; - - -/***/ }, -/* 6 */ -/***/ function(module, exports) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.JSXSyntax = { - JSXAttribute: 'JSXAttribute', - JSXClosingElement: 'JSXClosingElement', - JSXElement: 'JSXElement', - JSXEmptyExpression: 'JSXEmptyExpression', - JSXExpressionContainer: 'JSXExpressionContainer', - JSXIdentifier: 'JSXIdentifier', - JSXMemberExpression: 'JSXMemberExpression', - JSXNamespacedName: 'JSXNamespacedName', - JSXOpeningElement: 'JSXOpeningElement', - JSXSpreadAttribute: 'JSXSpreadAttribute', - JSXText: 'JSXText' - }; - - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var syntax_1 = __webpack_require__(2); - /* tslint:disable:max-classes-per-file */ - var ArrayExpression = (function () { - function ArrayExpression(elements) { - this.type = syntax_1.Syntax.ArrayExpression; - this.elements = elements; - } - return ArrayExpression; - }()); - exports.ArrayExpression = ArrayExpression; - var ArrayPattern = (function () { - function ArrayPattern(elements) { - this.type = syntax_1.Syntax.ArrayPattern; - this.elements = elements; - } - return ArrayPattern; - }()); - exports.ArrayPattern = ArrayPattern; - var ArrowFunctionExpression = (function () { - function ArrowFunctionExpression(params, body, expression) { - this.type = syntax_1.Syntax.ArrowFunctionExpression; - this.id = null; - this.params = params; - this.body = body; - this.generator = false; - this.expression = expression; - this.async = false; - } - return ArrowFunctionExpression; - }()); - exports.ArrowFunctionExpression = ArrowFunctionExpression; - var AssignmentExpression = (function () { - function AssignmentExpression(operator, left, right) { - this.type = syntax_1.Syntax.AssignmentExpression; - this.operator = operator; - this.left = left; - this.right = right; - } - return AssignmentExpression; - }()); - exports.AssignmentExpression = AssignmentExpression; - var AssignmentPattern = (function () { - function AssignmentPattern(left, right) { - this.type = syntax_1.Syntax.AssignmentPattern; - this.left = left; - this.right = right; - } - return AssignmentPattern; - }()); - exports.AssignmentPattern = AssignmentPattern; - var AsyncArrowFunctionExpression = (function () { - function AsyncArrowFunctionExpression(params, body, expression) { - this.type = syntax_1.Syntax.ArrowFunctionExpression; - this.id = null; - this.params = params; - this.body = body; - this.generator = false; - this.expression = expression; - this.async = true; - } - return AsyncArrowFunctionExpression; - }()); - exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression; - var AsyncFunctionDeclaration = (function () { - function AsyncFunctionDeclaration(id, params, body) { - this.type = syntax_1.Syntax.FunctionDeclaration; - this.id = id; - this.params = params; - this.body = body; - this.generator = false; - this.expression = false; - this.async = true; - } - return AsyncFunctionDeclaration; - }()); - exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration; - var AsyncFunctionExpression = (function () { - function AsyncFunctionExpression(id, params, body) { - this.type = syntax_1.Syntax.FunctionExpression; - this.id = id; - this.params = params; - this.body = body; - this.generator = false; - this.expression = false; - this.async = true; - } - return AsyncFunctionExpression; - }()); - exports.AsyncFunctionExpression = AsyncFunctionExpression; - var AwaitExpression = (function () { - function AwaitExpression(argument) { - this.type = syntax_1.Syntax.AwaitExpression; - this.argument = argument; - } - return AwaitExpression; - }()); - exports.AwaitExpression = AwaitExpression; - var BinaryExpression = (function () { - function BinaryExpression(operator, left, right) { - var logical = (operator === '||' || operator === '&&'); - this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression; - this.operator = operator; - this.left = left; - this.right = right; - } - return BinaryExpression; - }()); - exports.BinaryExpression = BinaryExpression; - var BlockStatement = (function () { - function BlockStatement(body) { - this.type = syntax_1.Syntax.BlockStatement; - this.body = body; - } - return BlockStatement; - }()); - exports.BlockStatement = BlockStatement; - var BreakStatement = (function () { - function BreakStatement(label) { - this.type = syntax_1.Syntax.BreakStatement; - this.label = label; - } - return BreakStatement; - }()); - exports.BreakStatement = BreakStatement; - var CallExpression = (function () { - function CallExpression(callee, args) { - this.type = syntax_1.Syntax.CallExpression; - this.callee = callee; - this.arguments = args; - } - return CallExpression; - }()); - exports.CallExpression = CallExpression; - var CatchClause = (function () { - function CatchClause(param, body) { - this.type = syntax_1.Syntax.CatchClause; - this.param = param; - this.body = body; - } - return CatchClause; - }()); - exports.CatchClause = CatchClause; - var ClassBody = (function () { - function ClassBody(body) { - this.type = syntax_1.Syntax.ClassBody; - this.body = body; - } - return ClassBody; - }()); - exports.ClassBody = ClassBody; - var ClassDeclaration = (function () { - function ClassDeclaration(id, superClass, body) { - this.type = syntax_1.Syntax.ClassDeclaration; - this.id = id; - this.superClass = superClass; - this.body = body; - } - return ClassDeclaration; - }()); - exports.ClassDeclaration = ClassDeclaration; - var ClassExpression = (function () { - function ClassExpression(id, superClass, body) { - this.type = syntax_1.Syntax.ClassExpression; - this.id = id; - this.superClass = superClass; - this.body = body; - } - return ClassExpression; - }()); - exports.ClassExpression = ClassExpression; - var ComputedMemberExpression = (function () { - function ComputedMemberExpression(object, property) { - this.type = syntax_1.Syntax.MemberExpression; - this.computed = true; - this.object = object; - this.property = property; - } - return ComputedMemberExpression; - }()); - exports.ComputedMemberExpression = ComputedMemberExpression; - var ConditionalExpression = (function () { - function ConditionalExpression(test, consequent, alternate) { - this.type = syntax_1.Syntax.ConditionalExpression; - this.test = test; - this.consequent = consequent; - this.alternate = alternate; - } - return ConditionalExpression; - }()); - exports.ConditionalExpression = ConditionalExpression; - var ContinueStatement = (function () { - function ContinueStatement(label) { - this.type = syntax_1.Syntax.ContinueStatement; - this.label = label; - } - return ContinueStatement; - }()); - exports.ContinueStatement = ContinueStatement; - var DebuggerStatement = (function () { - function DebuggerStatement() { - this.type = syntax_1.Syntax.DebuggerStatement; - } - return DebuggerStatement; - }()); - exports.DebuggerStatement = DebuggerStatement; - var Directive = (function () { - function Directive(expression, directive) { - this.type = syntax_1.Syntax.ExpressionStatement; - this.expression = expression; - this.directive = directive; - } - return Directive; - }()); - exports.Directive = Directive; - var DoWhileStatement = (function () { - function DoWhileStatement(body, test) { - this.type = syntax_1.Syntax.DoWhileStatement; - this.body = body; - this.test = test; - } - return DoWhileStatement; - }()); - exports.DoWhileStatement = DoWhileStatement; - var EmptyStatement = (function () { - function EmptyStatement() { - this.type = syntax_1.Syntax.EmptyStatement; - } - return EmptyStatement; - }()); - exports.EmptyStatement = EmptyStatement; - var ExportAllDeclaration = (function () { - function ExportAllDeclaration(source) { - this.type = syntax_1.Syntax.ExportAllDeclaration; - this.source = source; - } - return ExportAllDeclaration; - }()); - exports.ExportAllDeclaration = ExportAllDeclaration; - var ExportDefaultDeclaration = (function () { - function ExportDefaultDeclaration(declaration) { - this.type = syntax_1.Syntax.ExportDefaultDeclaration; - this.declaration = declaration; - } - return ExportDefaultDeclaration; - }()); - exports.ExportDefaultDeclaration = ExportDefaultDeclaration; - var ExportNamedDeclaration = (function () { - function ExportNamedDeclaration(declaration, specifiers, source) { - this.type = syntax_1.Syntax.ExportNamedDeclaration; - this.declaration = declaration; - this.specifiers = specifiers; - this.source = source; - } - return ExportNamedDeclaration; - }()); - exports.ExportNamedDeclaration = ExportNamedDeclaration; - var ExportSpecifier = (function () { - function ExportSpecifier(local, exported) { - this.type = syntax_1.Syntax.ExportSpecifier; - this.exported = exported; - this.local = local; - } - return ExportSpecifier; - }()); - exports.ExportSpecifier = ExportSpecifier; - var ExpressionStatement = (function () { - function ExpressionStatement(expression) { - this.type = syntax_1.Syntax.ExpressionStatement; - this.expression = expression; - } - return ExpressionStatement; - }()); - exports.ExpressionStatement = ExpressionStatement; - var ForInStatement = (function () { - function ForInStatement(left, right, body) { - this.type = syntax_1.Syntax.ForInStatement; - this.left = left; - this.right = right; - this.body = body; - this.each = false; - } - return ForInStatement; - }()); - exports.ForInStatement = ForInStatement; - var ForOfStatement = (function () { - function ForOfStatement(left, right, body) { - this.type = syntax_1.Syntax.ForOfStatement; - this.left = left; - this.right = right; - this.body = body; - } - return ForOfStatement; - }()); - exports.ForOfStatement = ForOfStatement; - var ForStatement = (function () { - function ForStatement(init, test, update, body) { - this.type = syntax_1.Syntax.ForStatement; - this.init = init; - this.test = test; - this.update = update; - this.body = body; - } - return ForStatement; - }()); - exports.ForStatement = ForStatement; - var FunctionDeclaration = (function () { - function FunctionDeclaration(id, params, body, generator) { - this.type = syntax_1.Syntax.FunctionDeclaration; - this.id = id; - this.params = params; - this.body = body; - this.generator = generator; - this.expression = false; - this.async = false; - } - return FunctionDeclaration; - }()); - exports.FunctionDeclaration = FunctionDeclaration; - var FunctionExpression = (function () { - function FunctionExpression(id, params, body, generator) { - this.type = syntax_1.Syntax.FunctionExpression; - this.id = id; - this.params = params; - this.body = body; - this.generator = generator; - this.expression = false; - this.async = false; - } - return FunctionExpression; - }()); - exports.FunctionExpression = FunctionExpression; - var Identifier = (function () { - function Identifier(name) { - this.type = syntax_1.Syntax.Identifier; - this.name = name; - } - return Identifier; - }()); - exports.Identifier = Identifier; - var IfStatement = (function () { - function IfStatement(test, consequent, alternate) { - this.type = syntax_1.Syntax.IfStatement; - this.test = test; - this.consequent = consequent; - this.alternate = alternate; - } - return IfStatement; - }()); - exports.IfStatement = IfStatement; - var ImportDeclaration = (function () { - function ImportDeclaration(specifiers, source) { - this.type = syntax_1.Syntax.ImportDeclaration; - this.specifiers = specifiers; - this.source = source; - } - return ImportDeclaration; - }()); - exports.ImportDeclaration = ImportDeclaration; - var ImportDefaultSpecifier = (function () { - function ImportDefaultSpecifier(local) { - this.type = syntax_1.Syntax.ImportDefaultSpecifier; - this.local = local; - } - return ImportDefaultSpecifier; - }()); - exports.ImportDefaultSpecifier = ImportDefaultSpecifier; - var ImportNamespaceSpecifier = (function () { - function ImportNamespaceSpecifier(local) { - this.type = syntax_1.Syntax.ImportNamespaceSpecifier; - this.local = local; - } - return ImportNamespaceSpecifier; - }()); - exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier; - var ImportSpecifier = (function () { - function ImportSpecifier(local, imported) { - this.type = syntax_1.Syntax.ImportSpecifier; - this.local = local; - this.imported = imported; - } - return ImportSpecifier; - }()); - exports.ImportSpecifier = ImportSpecifier; - var LabeledStatement = (function () { - function LabeledStatement(label, body) { - this.type = syntax_1.Syntax.LabeledStatement; - this.label = label; - this.body = body; - } - return LabeledStatement; - }()); - exports.LabeledStatement = LabeledStatement; - var Literal = (function () { - function Literal(value, raw) { - this.type = syntax_1.Syntax.Literal; - this.value = value; - this.raw = raw; - } - return Literal; - }()); - exports.Literal = Literal; - var MetaProperty = (function () { - function MetaProperty(meta, property) { - this.type = syntax_1.Syntax.MetaProperty; - this.meta = meta; - this.property = property; - } - return MetaProperty; - }()); - exports.MetaProperty = MetaProperty; - var MethodDefinition = (function () { - function MethodDefinition(key, computed, value, kind, isStatic) { - this.type = syntax_1.Syntax.MethodDefinition; - this.key = key; - this.computed = computed; - this.value = value; - this.kind = kind; - this.static = isStatic; - } - return MethodDefinition; - }()); - exports.MethodDefinition = MethodDefinition; - var Module = (function () { - function Module(body) { - this.type = syntax_1.Syntax.Program; - this.body = body; - this.sourceType = 'module'; - } - return Module; - }()); - exports.Module = Module; - var NewExpression = (function () { - function NewExpression(callee, args) { - this.type = syntax_1.Syntax.NewExpression; - this.callee = callee; - this.arguments = args; - } - return NewExpression; - }()); - exports.NewExpression = NewExpression; - var ObjectExpression = (function () { - function ObjectExpression(properties) { - this.type = syntax_1.Syntax.ObjectExpression; - this.properties = properties; - } - return ObjectExpression; - }()); - exports.ObjectExpression = ObjectExpression; - var ObjectPattern = (function () { - function ObjectPattern(properties) { - this.type = syntax_1.Syntax.ObjectPattern; - this.properties = properties; - } - return ObjectPattern; - }()); - exports.ObjectPattern = ObjectPattern; - var Property = (function () { - function Property(kind, key, computed, value, method, shorthand) { - this.type = syntax_1.Syntax.Property; - this.key = key; - this.computed = computed; - this.value = value; - this.kind = kind; - this.method = method; - this.shorthand = shorthand; - } - return Property; - }()); - exports.Property = Property; - var RegexLiteral = (function () { - function RegexLiteral(value, raw, pattern, flags) { - this.type = syntax_1.Syntax.Literal; - this.value = value; - this.raw = raw; - this.regex = { pattern: pattern, flags: flags }; - } - return RegexLiteral; - }()); - exports.RegexLiteral = RegexLiteral; - var RestElement = (function () { - function RestElement(argument) { - this.type = syntax_1.Syntax.RestElement; - this.argument = argument; - } - return RestElement; - }()); - exports.RestElement = RestElement; - var ReturnStatement = (function () { - function ReturnStatement(argument) { - this.type = syntax_1.Syntax.ReturnStatement; - this.argument = argument; - } - return ReturnStatement; - }()); - exports.ReturnStatement = ReturnStatement; - var Script = (function () { - function Script(body) { - this.type = syntax_1.Syntax.Program; - this.body = body; - this.sourceType = 'script'; - } - return Script; - }()); - exports.Script = Script; - var SequenceExpression = (function () { - function SequenceExpression(expressions) { - this.type = syntax_1.Syntax.SequenceExpression; - this.expressions = expressions; - } - return SequenceExpression; - }()); - exports.SequenceExpression = SequenceExpression; - var SpreadElement = (function () { - function SpreadElement(argument) { - this.type = syntax_1.Syntax.SpreadElement; - this.argument = argument; - } - return SpreadElement; - }()); - exports.SpreadElement = SpreadElement; - var StaticMemberExpression = (function () { - function StaticMemberExpression(object, property) { - this.type = syntax_1.Syntax.MemberExpression; - this.computed = false; - this.object = object; - this.property = property; - } - return StaticMemberExpression; - }()); - exports.StaticMemberExpression = StaticMemberExpression; - var Super = (function () { - function Super() { - this.type = syntax_1.Syntax.Super; - } - return Super; - }()); - exports.Super = Super; - var SwitchCase = (function () { - function SwitchCase(test, consequent) { - this.type = syntax_1.Syntax.SwitchCase; - this.test = test; - this.consequent = consequent; - } - return SwitchCase; - }()); - exports.SwitchCase = SwitchCase; - var SwitchStatement = (function () { - function SwitchStatement(discriminant, cases) { - this.type = syntax_1.Syntax.SwitchStatement; - this.discriminant = discriminant; - this.cases = cases; - } - return SwitchStatement; - }()); - exports.SwitchStatement = SwitchStatement; - var TaggedTemplateExpression = (function () { - function TaggedTemplateExpression(tag, quasi) { - this.type = syntax_1.Syntax.TaggedTemplateExpression; - this.tag = tag; - this.quasi = quasi; - } - return TaggedTemplateExpression; - }()); - exports.TaggedTemplateExpression = TaggedTemplateExpression; - var TemplateElement = (function () { - function TemplateElement(value, tail) { - this.type = syntax_1.Syntax.TemplateElement; - this.value = value; - this.tail = tail; - } - return TemplateElement; - }()); - exports.TemplateElement = TemplateElement; - var TemplateLiteral = (function () { - function TemplateLiteral(quasis, expressions) { - this.type = syntax_1.Syntax.TemplateLiteral; - this.quasis = quasis; - this.expressions = expressions; - } - return TemplateLiteral; - }()); - exports.TemplateLiteral = TemplateLiteral; - var ThisExpression = (function () { - function ThisExpression() { - this.type = syntax_1.Syntax.ThisExpression; - } - return ThisExpression; - }()); - exports.ThisExpression = ThisExpression; - var ThrowStatement = (function () { - function ThrowStatement(argument) { - this.type = syntax_1.Syntax.ThrowStatement; - this.argument = argument; - } - return ThrowStatement; - }()); - exports.ThrowStatement = ThrowStatement; - var TryStatement = (function () { - function TryStatement(block, handler, finalizer) { - this.type = syntax_1.Syntax.TryStatement; - this.block = block; - this.handler = handler; - this.finalizer = finalizer; - } - return TryStatement; - }()); - exports.TryStatement = TryStatement; - var UnaryExpression = (function () { - function UnaryExpression(operator, argument) { - this.type = syntax_1.Syntax.UnaryExpression; - this.operator = operator; - this.argument = argument; - this.prefix = true; - } - return UnaryExpression; - }()); - exports.UnaryExpression = UnaryExpression; - var UpdateExpression = (function () { - function UpdateExpression(operator, argument, prefix) { - this.type = syntax_1.Syntax.UpdateExpression; - this.operator = operator; - this.argument = argument; - this.prefix = prefix; - } - return UpdateExpression; - }()); - exports.UpdateExpression = UpdateExpression; - var VariableDeclaration = (function () { - function VariableDeclaration(declarations, kind) { - this.type = syntax_1.Syntax.VariableDeclaration; - this.declarations = declarations; - this.kind = kind; - } - return VariableDeclaration; - }()); - exports.VariableDeclaration = VariableDeclaration; - var VariableDeclarator = (function () { - function VariableDeclarator(id, init) { - this.type = syntax_1.Syntax.VariableDeclarator; - this.id = id; - this.init = init; - } - return VariableDeclarator; - }()); - exports.VariableDeclarator = VariableDeclarator; - var WhileStatement = (function () { - function WhileStatement(test, body) { - this.type = syntax_1.Syntax.WhileStatement; - this.test = test; - this.body = body; - } - return WhileStatement; - }()); - exports.WhileStatement = WhileStatement; - var WithStatement = (function () { - function WithStatement(object, body) { - this.type = syntax_1.Syntax.WithStatement; - this.object = object; - this.body = body; - } - return WithStatement; - }()); - exports.WithStatement = WithStatement; - var YieldExpression = (function () { - function YieldExpression(argument, delegate) { - this.type = syntax_1.Syntax.YieldExpression; - this.argument = argument; - this.delegate = delegate; - } - return YieldExpression; - }()); - exports.YieldExpression = YieldExpression; - - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var assert_1 = __webpack_require__(9); - var error_handler_1 = __webpack_require__(10); - var messages_1 = __webpack_require__(11); - var Node = __webpack_require__(7); - var scanner_1 = __webpack_require__(12); - var syntax_1 = __webpack_require__(2); - var token_1 = __webpack_require__(13); - var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder'; - var Parser = (function () { - function Parser(code, options, delegate) { - if (options === void 0) { options = {}; } - this.config = { - range: (typeof options.range === 'boolean') && options.range, - loc: (typeof options.loc === 'boolean') && options.loc, - source: null, - tokens: (typeof options.tokens === 'boolean') && options.tokens, - comment: (typeof options.comment === 'boolean') && options.comment, - tolerant: (typeof options.tolerant === 'boolean') && options.tolerant - }; - if (this.config.loc && options.source && options.source !== null) { - this.config.source = String(options.source); - } - this.delegate = delegate; - this.errorHandler = new error_handler_1.ErrorHandler(); - this.errorHandler.tolerant = this.config.tolerant; - this.scanner = new scanner_1.Scanner(code, this.errorHandler); - this.scanner.trackComment = this.config.comment; - this.operatorPrecedence = { - ')': 0, - ';': 0, - ',': 0, - '=': 0, - ']': 0, - '||': 1, - '&&': 2, - '|': 3, - '^': 4, - '&': 5, - '==': 6, - '!=': 6, - '===': 6, - '!==': 6, - '<': 7, - '>': 7, - '<=': 7, - '>=': 7, - '<<': 8, - '>>': 8, - '>>>': 8, - '+': 9, - '-': 9, - '*': 11, - '/': 11, - '%': 11 - }; - this.lookahead = { - type: 2 /* EOF */, - value: '', - lineNumber: this.scanner.lineNumber, - lineStart: 0, - start: 0, - end: 0 - }; - this.hasLineTerminator = false; - this.context = { - isModule: false, - await: false, - allowIn: true, - allowStrictDirective: true, - allowYield: true, - firstCoverInitializedNameError: null, - isAssignmentTarget: false, - isBindingElement: false, - inFunctionBody: false, - inIteration: false, - inSwitch: false, - labelSet: {}, - strict: false - }; - this.tokens = []; - this.startMarker = { - index: 0, - line: this.scanner.lineNumber, - column: 0 - }; - this.lastMarker = { - index: 0, - line: this.scanner.lineNumber, - column: 0 - }; - this.nextToken(); - this.lastMarker = { - index: this.scanner.index, - line: this.scanner.lineNumber, - column: this.scanner.index - this.scanner.lineStart - }; - } - Parser.prototype.throwError = function (messageFormat) { - var values = []; - for (var _i = 1; _i < arguments.length; _i++) { - values[_i - 1] = arguments[_i]; - } - var args = Array.prototype.slice.call(arguments, 1); - var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) { - assert_1.assert(idx < args.length, 'Message reference must be in range'); - return args[idx]; - }); - var index = this.lastMarker.index; - var line = this.lastMarker.line; - var column = this.lastMarker.column + 1; - throw this.errorHandler.createError(index, line, column, msg); - }; - Parser.prototype.tolerateError = function (messageFormat) { - var values = []; - for (var _i = 1; _i < arguments.length; _i++) { - values[_i - 1] = arguments[_i]; - } - var args = Array.prototype.slice.call(arguments, 1); - var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) { - assert_1.assert(idx < args.length, 'Message reference must be in range'); - return args[idx]; - }); - var index = this.lastMarker.index; - var line = this.scanner.lineNumber; - var column = this.lastMarker.column + 1; - this.errorHandler.tolerateError(index, line, column, msg); - }; - // Throw an exception because of the token. - Parser.prototype.unexpectedTokenError = function (token, message) { - var msg = message || messages_1.Messages.UnexpectedToken; - var value; - if (token) { - if (!message) { - msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS : - (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier : - (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber : - (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString : - (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate : - messages_1.Messages.UnexpectedToken; - if (token.type === 4 /* Keyword */) { - if (this.scanner.isFutureReservedWord(token.value)) { - msg = messages_1.Messages.UnexpectedReserved; - } - else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) { - msg = messages_1.Messages.StrictReservedWord; - } - } - } - value = token.value; - } - else { - value = 'ILLEGAL'; - } - msg = msg.replace('%0', value); - if (token && typeof token.lineNumber === 'number') { - var index = token.start; - var line = token.lineNumber; - var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column; - var column = token.start - lastMarkerLineStart + 1; - return this.errorHandler.createError(index, line, column, msg); - } - else { - var index = this.lastMarker.index; - var line = this.lastMarker.line; - var column = this.lastMarker.column + 1; - return this.errorHandler.createError(index, line, column, msg); - } - }; - Parser.prototype.throwUnexpectedToken = function (token, message) { - throw this.unexpectedTokenError(token, message); - }; - Parser.prototype.tolerateUnexpectedToken = function (token, message) { - this.errorHandler.tolerate(this.unexpectedTokenError(token, message)); - }; - Parser.prototype.collectComments = function () { - if (!this.config.comment) { - this.scanner.scanComments(); - } - else { - var comments = this.scanner.scanComments(); - if (comments.length > 0 && this.delegate) { - for (var i = 0; i < comments.length; ++i) { - var e = comments[i]; - var node = void 0; - node = { - type: e.multiLine ? 'BlockComment' : 'LineComment', - value: this.scanner.source.slice(e.slice[0], e.slice[1]) - }; - if (this.config.range) { - node.range = e.range; - } - if (this.config.loc) { - node.loc = e.loc; - } - var metadata = { - start: { - line: e.loc.start.line, - column: e.loc.start.column, - offset: e.range[0] - }, - end: { - line: e.loc.end.line, - column: e.loc.end.column, - offset: e.range[1] - } - }; - this.delegate(node, metadata); - } - } - } - }; - // From internal representation to an external structure - Parser.prototype.getTokenRaw = function (token) { - return this.scanner.source.slice(token.start, token.end); - }; - Parser.prototype.convertToken = function (token) { - var t = { - type: token_1.TokenName[token.type], - value: this.getTokenRaw(token) - }; - if (this.config.range) { - t.range = [token.start, token.end]; - } - if (this.config.loc) { - t.loc = { - start: { - line: this.startMarker.line, - column: this.startMarker.column - }, - end: { - line: this.scanner.lineNumber, - column: this.scanner.index - this.scanner.lineStart - } - }; - } - if (token.type === 9 /* RegularExpression */) { - var pattern = token.pattern; - var flags = token.flags; - t.regex = { pattern: pattern, flags: flags }; - } - return t; - }; - Parser.prototype.nextToken = function () { - var token = this.lookahead; - this.lastMarker.index = this.scanner.index; - this.lastMarker.line = this.scanner.lineNumber; - this.lastMarker.column = this.scanner.index - this.scanner.lineStart; - this.collectComments(); - if (this.scanner.index !== this.startMarker.index) { - this.startMarker.index = this.scanner.index; - this.startMarker.line = this.scanner.lineNumber; - this.startMarker.column = this.scanner.index - this.scanner.lineStart; - } - var next = this.scanner.lex(); - this.hasLineTerminator = (token.lineNumber !== next.lineNumber); - if (next && this.context.strict && next.type === 3 /* Identifier */) { - if (this.scanner.isStrictModeReservedWord(next.value)) { - next.type = 4 /* Keyword */; - } - } - this.lookahead = next; - if (this.config.tokens && next.type !== 2 /* EOF */) { - this.tokens.push(this.convertToken(next)); - } - return token; - }; - Parser.prototype.nextRegexToken = function () { - this.collectComments(); - var token = this.scanner.scanRegExp(); - if (this.config.tokens) { - // Pop the previous token, '/' or '/=' - // This is added from the lookahead token. - this.tokens.pop(); - this.tokens.push(this.convertToken(token)); - } - // Prime the next lookahead. - this.lookahead = token; - this.nextToken(); - return token; - }; - Parser.prototype.createNode = function () { - return { - index: this.startMarker.index, - line: this.startMarker.line, - column: this.startMarker.column - }; - }; - Parser.prototype.startNode = function (token, lastLineStart) { - if (lastLineStart === void 0) { lastLineStart = 0; } - var column = token.start - token.lineStart; - var line = token.lineNumber; - if (column < 0) { - column += lastLineStart; - line--; - } - return { - index: token.start, - line: line, - column: column - }; - }; - Parser.prototype.finalize = function (marker, node) { - if (this.config.range) { - node.range = [marker.index, this.lastMarker.index]; - } - if (this.config.loc) { - node.loc = { - start: { - line: marker.line, - column: marker.column, - }, - end: { - line: this.lastMarker.line, - column: this.lastMarker.column - } - }; - if (this.config.source) { - node.loc.source = this.config.source; - } - } - if (this.delegate) { - var metadata = { - start: { - line: marker.line, - column: marker.column, - offset: marker.index - }, - end: { - line: this.lastMarker.line, - column: this.lastMarker.column, - offset: this.lastMarker.index - } - }; - this.delegate(node, metadata); - } - return node; - }; - // Expect the next token to match the specified punctuator. - // If not, an exception will be thrown. - Parser.prototype.expect = function (value) { - var token = this.nextToken(); - if (token.type !== 7 /* Punctuator */ || token.value !== value) { - this.throwUnexpectedToken(token); - } - }; - // Quietly expect a comma when in tolerant mode, otherwise delegates to expect(). - Parser.prototype.expectCommaSeparator = function () { - if (this.config.tolerant) { - var token = this.lookahead; - if (token.type === 7 /* Punctuator */ && token.value === ',') { - this.nextToken(); - } - else if (token.type === 7 /* Punctuator */ && token.value === ';') { - this.nextToken(); - this.tolerateUnexpectedToken(token); - } - else { - this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken); - } - } - else { - this.expect(','); - } - }; - // Expect the next token to match the specified keyword. - // If not, an exception will be thrown. - Parser.prototype.expectKeyword = function (keyword) { - var token = this.nextToken(); - if (token.type !== 4 /* Keyword */ || token.value !== keyword) { - this.throwUnexpectedToken(token); - } - }; - // Return true if the next token matches the specified punctuator. - Parser.prototype.match = function (value) { - return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value; - }; - // Return true if the next token matches the specified keyword - Parser.prototype.matchKeyword = function (keyword) { - return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword; - }; - // Return true if the next token matches the specified contextual keyword - // (where an identifier is sometimes a keyword depending on the context) - Parser.prototype.matchContextualKeyword = function (keyword) { - return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword; - }; - // Return true if the next token is an assignment operator - Parser.prototype.matchAssign = function () { - if (this.lookahead.type !== 7 /* Punctuator */) { - return false; - } - var op = this.lookahead.value; - return op === '=' || - op === '*=' || - op === '**=' || - op === '/=' || - op === '%=' || - op === '+=' || - op === '-=' || - op === '<<=' || - op === '>>=' || - op === '>>>=' || - op === '&=' || - op === '^=' || - op === '|='; - }; - // Cover grammar support. - // - // When an assignment expression position starts with an left parenthesis, the determination of the type - // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead) - // or the first comma. This situation also defers the determination of all the expressions nested in the pair. - // - // There are three productions that can be parsed in a parentheses pair that needs to be determined - // after the outermost pair is closed. They are: - // - // 1. AssignmentExpression - // 2. BindingElements - // 3. AssignmentTargets - // - // In order to avoid exponential backtracking, we use two flags to denote if the production can be - // binding element or assignment target. - // - // The three productions have the relationship: - // - // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression - // - // with a single exception that CoverInitializedName when used directly in an Expression, generates - // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the - // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair. - // - // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not - // effect the current flags. This means the production the parser parses is only used as an expression. Therefore - // the CoverInitializedName check is conducted. - // - // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates - // the flags outside of the parser. This means the production the parser parses is used as a part of a potential - // pattern. The CoverInitializedName check is deferred. - Parser.prototype.isolateCoverGrammar = function (parseFunction) { - var previousIsBindingElement = this.context.isBindingElement; - var previousIsAssignmentTarget = this.context.isAssignmentTarget; - var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; - this.context.isBindingElement = true; - this.context.isAssignmentTarget = true; - this.context.firstCoverInitializedNameError = null; - var result = parseFunction.call(this); - if (this.context.firstCoverInitializedNameError !== null) { - this.throwUnexpectedToken(this.context.firstCoverInitializedNameError); - } - this.context.isBindingElement = previousIsBindingElement; - this.context.isAssignmentTarget = previousIsAssignmentTarget; - this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError; - return result; - }; - Parser.prototype.inheritCoverGrammar = function (parseFunction) { - var previousIsBindingElement = this.context.isBindingElement; - var previousIsAssignmentTarget = this.context.isAssignmentTarget; - var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; - this.context.isBindingElement = true; - this.context.isAssignmentTarget = true; - this.context.firstCoverInitializedNameError = null; - var result = parseFunction.call(this); - this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement; - this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget; - this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError; - return result; - }; - Parser.prototype.consumeSemicolon = function () { - if (this.match(';')) { - this.nextToken(); - } - else if (!this.hasLineTerminator) { - if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) { - this.throwUnexpectedToken(this.lookahead); - } - this.lastMarker.index = this.startMarker.index; - this.lastMarker.line = this.startMarker.line; - this.lastMarker.column = this.startMarker.column; - } - }; - // https://tc39.github.io/ecma262/#sec-primary-expression - Parser.prototype.parsePrimaryExpression = function () { - var node = this.createNode(); - var expr; - var token, raw; - switch (this.lookahead.type) { - case 3 /* Identifier */: - if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') { - this.tolerateUnexpectedToken(this.lookahead); - } - expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value)); - break; - case 6 /* NumericLiteral */: - case 8 /* StringLiteral */: - if (this.context.strict && this.lookahead.octal) { - this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral); - } - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - token = this.nextToken(); - raw = this.getTokenRaw(token); - expr = this.finalize(node, new Node.Literal(token.value, raw)); - break; - case 1 /* BooleanLiteral */: - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - token = this.nextToken(); - raw = this.getTokenRaw(token); - expr = this.finalize(node, new Node.Literal(token.value === 'true', raw)); - break; - case 5 /* NullLiteral */: - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - token = this.nextToken(); - raw = this.getTokenRaw(token); - expr = this.finalize(node, new Node.Literal(null, raw)); - break; - case 10 /* Template */: - expr = this.parseTemplateLiteral(); - break; - case 7 /* Punctuator */: - switch (this.lookahead.value) { - case '(': - this.context.isBindingElement = false; - expr = this.inheritCoverGrammar(this.parseGroupExpression); - break; - case '[': - expr = this.inheritCoverGrammar(this.parseArrayInitializer); - break; - case '{': - expr = this.inheritCoverGrammar(this.parseObjectInitializer); - break; - case '/': - case '/=': - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - this.scanner.index = this.startMarker.index; - token = this.nextRegexToken(); - raw = this.getTokenRaw(token); - expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags)); - break; - default: - expr = this.throwUnexpectedToken(this.nextToken()); - } - break; - case 4 /* Keyword */: - if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) { - expr = this.parseIdentifierName(); - } - else if (!this.context.strict && this.matchKeyword('let')) { - expr = this.finalize(node, new Node.Identifier(this.nextToken().value)); - } - else { - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - if (this.matchKeyword('function')) { - expr = this.parseFunctionExpression(); - } - else if (this.matchKeyword('this')) { - this.nextToken(); - expr = this.finalize(node, new Node.ThisExpression()); - } - else if (this.matchKeyword('class')) { - expr = this.parseClassExpression(); - } - else { - expr = this.throwUnexpectedToken(this.nextToken()); - } - } - break; - default: - expr = this.throwUnexpectedToken(this.nextToken()); - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-array-initializer - Parser.prototype.parseSpreadElement = function () { - var node = this.createNode(); - this.expect('...'); - var arg = this.inheritCoverGrammar(this.parseAssignmentExpression); - return this.finalize(node, new Node.SpreadElement(arg)); - }; - Parser.prototype.parseArrayInitializer = function () { - var node = this.createNode(); - var elements = []; - this.expect('['); - while (!this.match(']')) { - if (this.match(',')) { - this.nextToken(); - elements.push(null); - } - else if (this.match('...')) { - var element = this.parseSpreadElement(); - if (!this.match(']')) { - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - this.expect(','); - } - elements.push(element); - } - else { - elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); - if (!this.match(']')) { - this.expect(','); - } - } - } - this.expect(']'); - return this.finalize(node, new Node.ArrayExpression(elements)); - }; - // https://tc39.github.io/ecma262/#sec-object-initializer - Parser.prototype.parsePropertyMethod = function (params) { - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - var previousStrict = this.context.strict; - var previousAllowStrictDirective = this.context.allowStrictDirective; - this.context.allowStrictDirective = params.simple; - var body = this.isolateCoverGrammar(this.parseFunctionSourceElements); - if (this.context.strict && params.firstRestricted) { - this.tolerateUnexpectedToken(params.firstRestricted, params.message); - } - if (this.context.strict && params.stricted) { - this.tolerateUnexpectedToken(params.stricted, params.message); - } - this.context.strict = previousStrict; - this.context.allowStrictDirective = previousAllowStrictDirective; - return body; - }; - Parser.prototype.parsePropertyMethodFunction = function () { - var isGenerator = false; - var node = this.createNode(); - var previousAllowYield = this.context.allowYield; - this.context.allowYield = true; - var params = this.parseFormalParameters(); - var method = this.parsePropertyMethod(params); - this.context.allowYield = previousAllowYield; - return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); - }; - Parser.prototype.parsePropertyMethodAsyncFunction = function () { - var node = this.createNode(); - var previousAllowYield = this.context.allowYield; - var previousAwait = this.context.await; - this.context.allowYield = false; - this.context.await = true; - var params = this.parseFormalParameters(); - var method = this.parsePropertyMethod(params); - this.context.allowYield = previousAllowYield; - this.context.await = previousAwait; - return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method)); - }; - Parser.prototype.parseObjectPropertyKey = function () { - var node = this.createNode(); - var token = this.nextToken(); - var key; - switch (token.type) { - case 8 /* StringLiteral */: - case 6 /* NumericLiteral */: - if (this.context.strict && token.octal) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral); - } - var raw = this.getTokenRaw(token); - key = this.finalize(node, new Node.Literal(token.value, raw)); - break; - case 3 /* Identifier */: - case 1 /* BooleanLiteral */: - case 5 /* NullLiteral */: - case 4 /* Keyword */: - key = this.finalize(node, new Node.Identifier(token.value)); - break; - case 7 /* Punctuator */: - if (token.value === '[') { - key = this.isolateCoverGrammar(this.parseAssignmentExpression); - this.expect(']'); - } - else { - key = this.throwUnexpectedToken(token); - } - break; - default: - key = this.throwUnexpectedToken(token); - } - return key; - }; - Parser.prototype.isPropertyKey = function (key, value) { - return (key.type === syntax_1.Syntax.Identifier && key.name === value) || - (key.type === syntax_1.Syntax.Literal && key.value === value); - }; - Parser.prototype.parseObjectProperty = function (hasProto) { - var node = this.createNode(); - var token = this.lookahead; - var kind; - var key = null; - var value = null; - var computed = false; - var method = false; - var shorthand = false; - var isAsync = false; - if (token.type === 3 /* Identifier */) { - var id = token.value; - this.nextToken(); - computed = this.match('['); - isAsync = !this.hasLineTerminator && (id === 'async') && - !this.match(':') && !this.match('(') && !this.match('*') && !this.match(','); - key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id)); - } - else if (this.match('*')) { - this.nextToken(); - } - else { - computed = this.match('['); - key = this.parseObjectPropertyKey(); - } - var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); - if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) { - kind = 'get'; - computed = this.match('['); - key = this.parseObjectPropertyKey(); - this.context.allowYield = false; - value = this.parseGetterMethod(); - } - else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) { - kind = 'set'; - computed = this.match('['); - key = this.parseObjectPropertyKey(); - value = this.parseSetterMethod(); - } - else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { - kind = 'init'; - computed = this.match('['); - key = this.parseObjectPropertyKey(); - value = this.parseGeneratorMethod(); - method = true; - } - else { - if (!key) { - this.throwUnexpectedToken(this.lookahead); - } - kind = 'init'; - if (this.match(':') && !isAsync) { - if (!computed && this.isPropertyKey(key, '__proto__')) { - if (hasProto.value) { - this.tolerateError(messages_1.Messages.DuplicateProtoProperty); - } - hasProto.value = true; - } - this.nextToken(); - value = this.inheritCoverGrammar(this.parseAssignmentExpression); - } - else if (this.match('(')) { - value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); - method = true; - } - else if (token.type === 3 /* Identifier */) { - var id = this.finalize(node, new Node.Identifier(token.value)); - if (this.match('=')) { - this.context.firstCoverInitializedNameError = this.lookahead; - this.nextToken(); - shorthand = true; - var init = this.isolateCoverGrammar(this.parseAssignmentExpression); - value = this.finalize(node, new Node.AssignmentPattern(id, init)); - } - else { - shorthand = true; - value = id; - } - } - else { - this.throwUnexpectedToken(this.nextToken()); - } - } - return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand)); - }; - Parser.prototype.parseObjectInitializer = function () { - var node = this.createNode(); - this.expect('{'); - var properties = []; - var hasProto = { value: false }; - while (!this.match('}')) { - properties.push(this.parseObjectProperty(hasProto)); - if (!this.match('}')) { - this.expectCommaSeparator(); - } - } - this.expect('}'); - return this.finalize(node, new Node.ObjectExpression(properties)); - }; - // https://tc39.github.io/ecma262/#sec-template-literals - Parser.prototype.parseTemplateHead = function () { - assert_1.assert(this.lookahead.head, 'Template literal must start with a template head'); - var node = this.createNode(); - var token = this.nextToken(); - var raw = token.value; - var cooked = token.cooked; - return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); - }; - Parser.prototype.parseTemplateElement = function () { - if (this.lookahead.type !== 10 /* Template */) { - this.throwUnexpectedToken(); - } - var node = this.createNode(); - var token = this.nextToken(); - var raw = token.value; - var cooked = token.cooked; - return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); - }; - Parser.prototype.parseTemplateLiteral = function () { - var node = this.createNode(); - var expressions = []; - var quasis = []; - var quasi = this.parseTemplateHead(); - quasis.push(quasi); - while (!quasi.tail) { - expressions.push(this.parseExpression()); - quasi = this.parseTemplateElement(); - quasis.push(quasi); - } - return this.finalize(node, new Node.TemplateLiteral(quasis, expressions)); - }; - // https://tc39.github.io/ecma262/#sec-grouping-operator - Parser.prototype.reinterpretExpressionAsPattern = function (expr) { - switch (expr.type) { - case syntax_1.Syntax.Identifier: - case syntax_1.Syntax.MemberExpression: - case syntax_1.Syntax.RestElement: - case syntax_1.Syntax.AssignmentPattern: - break; - case syntax_1.Syntax.SpreadElement: - expr.type = syntax_1.Syntax.RestElement; - this.reinterpretExpressionAsPattern(expr.argument); - break; - case syntax_1.Syntax.ArrayExpression: - expr.type = syntax_1.Syntax.ArrayPattern; - for (var i = 0; i < expr.elements.length; i++) { - if (expr.elements[i] !== null) { - this.reinterpretExpressionAsPattern(expr.elements[i]); - } - } - break; - case syntax_1.Syntax.ObjectExpression: - expr.type = syntax_1.Syntax.ObjectPattern; - for (var i = 0; i < expr.properties.length; i++) { - this.reinterpretExpressionAsPattern(expr.properties[i].value); - } - break; - case syntax_1.Syntax.AssignmentExpression: - expr.type = syntax_1.Syntax.AssignmentPattern; - delete expr.operator; - this.reinterpretExpressionAsPattern(expr.left); - break; - default: - // Allow other node type for tolerant parsing. - break; - } - }; - Parser.prototype.parseGroupExpression = function () { - var expr; - this.expect('('); - if (this.match(')')) { - this.nextToken(); - if (!this.match('=>')) { - this.expect('=>'); - } - expr = { - type: ArrowParameterPlaceHolder, - params: [], - async: false - }; - } - else { - var startToken = this.lookahead; - var params = []; - if (this.match('...')) { - expr = this.parseRestElement(params); - this.expect(')'); - if (!this.match('=>')) { - this.expect('=>'); - } - expr = { - type: ArrowParameterPlaceHolder, - params: [expr], - async: false - }; - } - else { - var arrow = false; - this.context.isBindingElement = true; - expr = this.inheritCoverGrammar(this.parseAssignmentExpression); - if (this.match(',')) { - var expressions = []; - this.context.isAssignmentTarget = false; - expressions.push(expr); - while (this.lookahead.type !== 2 /* EOF */) { - if (!this.match(',')) { - break; - } - this.nextToken(); - if (this.match(')')) { - this.nextToken(); - for (var i = 0; i < expressions.length; i++) { - this.reinterpretExpressionAsPattern(expressions[i]); - } - arrow = true; - expr = { - type: ArrowParameterPlaceHolder, - params: expressions, - async: false - }; - } - else if (this.match('...')) { - if (!this.context.isBindingElement) { - this.throwUnexpectedToken(this.lookahead); - } - expressions.push(this.parseRestElement(params)); - this.expect(')'); - if (!this.match('=>')) { - this.expect('=>'); - } - this.context.isBindingElement = false; - for (var i = 0; i < expressions.length; i++) { - this.reinterpretExpressionAsPattern(expressions[i]); - } - arrow = true; - expr = { - type: ArrowParameterPlaceHolder, - params: expressions, - async: false - }; - } - else { - expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); - } - if (arrow) { - break; - } - } - if (!arrow) { - expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); - } - } - if (!arrow) { - this.expect(')'); - if (this.match('=>')) { - if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') { - arrow = true; - expr = { - type: ArrowParameterPlaceHolder, - params: [expr], - async: false - }; - } - if (!arrow) { - if (!this.context.isBindingElement) { - this.throwUnexpectedToken(this.lookahead); - } - if (expr.type === syntax_1.Syntax.SequenceExpression) { - for (var i = 0; i < expr.expressions.length; i++) { - this.reinterpretExpressionAsPattern(expr.expressions[i]); - } - } - else { - this.reinterpretExpressionAsPattern(expr); - } - var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]); - expr = { - type: ArrowParameterPlaceHolder, - params: parameters, - async: false - }; - } - } - this.context.isBindingElement = false; - } - } - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions - Parser.prototype.parseArguments = function () { - this.expect('('); - var args = []; - if (!this.match(')')) { - while (true) { - var expr = this.match('...') ? this.parseSpreadElement() : - this.isolateCoverGrammar(this.parseAssignmentExpression); - args.push(expr); - if (this.match(')')) { - break; - } - this.expectCommaSeparator(); - if (this.match(')')) { - break; - } - } - } - this.expect(')'); - return args; - }; - Parser.prototype.isIdentifierName = function (token) { - return token.type === 3 /* Identifier */ || - token.type === 4 /* Keyword */ || - token.type === 1 /* BooleanLiteral */ || - token.type === 5 /* NullLiteral */; - }; - Parser.prototype.parseIdentifierName = function () { - var node = this.createNode(); - var token = this.nextToken(); - if (!this.isIdentifierName(token)) { - this.throwUnexpectedToken(token); - } - return this.finalize(node, new Node.Identifier(token.value)); - }; - Parser.prototype.parseNewExpression = function () { - var node = this.createNode(); - var id = this.parseIdentifierName(); - assert_1.assert(id.name === 'new', 'New expression must start with `new`'); - var expr; - if (this.match('.')) { - this.nextToken(); - if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') { - var property = this.parseIdentifierName(); - expr = new Node.MetaProperty(id, property); - } - else { - this.throwUnexpectedToken(this.lookahead); - } - } - else { - var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression); - var args = this.match('(') ? this.parseArguments() : []; - expr = new Node.NewExpression(callee, args); - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - } - return this.finalize(node, expr); - }; - Parser.prototype.parseAsyncArgument = function () { - var arg = this.parseAssignmentExpression(); - this.context.firstCoverInitializedNameError = null; - return arg; - }; - Parser.prototype.parseAsyncArguments = function () { - this.expect('('); - var args = []; - if (!this.match(')')) { - while (true) { - var expr = this.match('...') ? this.parseSpreadElement() : - this.isolateCoverGrammar(this.parseAsyncArgument); - args.push(expr); - if (this.match(')')) { - break; - } - this.expectCommaSeparator(); - if (this.match(')')) { - break; - } - } - } - this.expect(')'); - return args; - }; - Parser.prototype.parseLeftHandSideExpressionAllowCall = function () { - var startToken = this.lookahead; - var maybeAsync = this.matchContextualKeyword('async'); - var previousAllowIn = this.context.allowIn; - this.context.allowIn = true; - var expr; - if (this.matchKeyword('super') && this.context.inFunctionBody) { - expr = this.createNode(); - this.nextToken(); - expr = this.finalize(expr, new Node.Super()); - if (!this.match('(') && !this.match('.') && !this.match('[')) { - this.throwUnexpectedToken(this.lookahead); - } - } - else { - expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); - } - while (true) { - if (this.match('.')) { - this.context.isBindingElement = false; - this.context.isAssignmentTarget = true; - this.expect('.'); - var property = this.parseIdentifierName(); - expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property)); - } - else if (this.match('(')) { - var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber); - this.context.isBindingElement = false; - this.context.isAssignmentTarget = false; - var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments(); - expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args)); - if (asyncArrow && this.match('=>')) { - for (var i = 0; i < args.length; ++i) { - this.reinterpretExpressionAsPattern(args[i]); - } - expr = { - type: ArrowParameterPlaceHolder, - params: args, - async: true - }; - } - } - else if (this.match('[')) { - this.context.isBindingElement = false; - this.context.isAssignmentTarget = true; - this.expect('['); - var property = this.isolateCoverGrammar(this.parseExpression); - this.expect(']'); - expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property)); - } - else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { - var quasi = this.parseTemplateLiteral(); - expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi)); - } - else { - break; - } - } - this.context.allowIn = previousAllowIn; - return expr; - }; - Parser.prototype.parseSuper = function () { - var node = this.createNode(); - this.expectKeyword('super'); - if (!this.match('[') && !this.match('.')) { - this.throwUnexpectedToken(this.lookahead); - } - return this.finalize(node, new Node.Super()); - }; - Parser.prototype.parseLeftHandSideExpression = function () { - assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.'); - var node = this.startNode(this.lookahead); - var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() : - this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); - while (true) { - if (this.match('[')) { - this.context.isBindingElement = false; - this.context.isAssignmentTarget = true; - this.expect('['); - var property = this.isolateCoverGrammar(this.parseExpression); - this.expect(']'); - expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property)); - } - else if (this.match('.')) { - this.context.isBindingElement = false; - this.context.isAssignmentTarget = true; - this.expect('.'); - var property = this.parseIdentifierName(); - expr = this.finalize(node, new Node.StaticMemberExpression(expr, property)); - } - else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { - var quasi = this.parseTemplateLiteral(); - expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi)); - } - else { - break; - } - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-update-expressions - Parser.prototype.parseUpdateExpression = function () { - var expr; - var startToken = this.lookahead; - if (this.match('++') || this.match('--')) { - var node = this.startNode(startToken); - var token = this.nextToken(); - expr = this.inheritCoverGrammar(this.parseUnaryExpression); - if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { - this.tolerateError(messages_1.Messages.StrictLHSPrefix); - } - if (!this.context.isAssignmentTarget) { - this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); - } - var prefix = true; - expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix)); - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - } - else { - expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall); - if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) { - if (this.match('++') || this.match('--')) { - if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { - this.tolerateError(messages_1.Messages.StrictLHSPostfix); - } - if (!this.context.isAssignmentTarget) { - this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); - } - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - var operator = this.nextToken().value; - var prefix = false; - expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix)); - } - } - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-unary-operators - Parser.prototype.parseAwaitExpression = function () { - var node = this.createNode(); - this.nextToken(); - var argument = this.parseUnaryExpression(); - return this.finalize(node, new Node.AwaitExpression(argument)); - }; - Parser.prototype.parseUnaryExpression = function () { - var expr; - if (this.match('+') || this.match('-') || this.match('~') || this.match('!') || - this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) { - var node = this.startNode(this.lookahead); - var token = this.nextToken(); - expr = this.inheritCoverGrammar(this.parseUnaryExpression); - expr = this.finalize(node, new Node.UnaryExpression(token.value, expr)); - if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) { - this.tolerateError(messages_1.Messages.StrictDelete); - } - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - } - else if (this.context.await && this.matchContextualKeyword('await')) { - expr = this.parseAwaitExpression(); - } - else { - expr = this.parseUpdateExpression(); - } - return expr; - }; - Parser.prototype.parseExponentiationExpression = function () { - var startToken = this.lookahead; - var expr = this.inheritCoverGrammar(this.parseUnaryExpression); - if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) { - this.nextToken(); - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - var left = expr; - var right = this.isolateCoverGrammar(this.parseExponentiationExpression); - expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right)); - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-exp-operator - // https://tc39.github.io/ecma262/#sec-multiplicative-operators - // https://tc39.github.io/ecma262/#sec-additive-operators - // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators - // https://tc39.github.io/ecma262/#sec-relational-operators - // https://tc39.github.io/ecma262/#sec-equality-operators - // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators - // https://tc39.github.io/ecma262/#sec-binary-logical-operators - Parser.prototype.binaryPrecedence = function (token) { - var op = token.value; - var precedence; - if (token.type === 7 /* Punctuator */) { - precedence = this.operatorPrecedence[op] || 0; - } - else if (token.type === 4 /* Keyword */) { - precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0; - } - else { - precedence = 0; - } - return precedence; - }; - Parser.prototype.parseBinaryExpression = function () { - var startToken = this.lookahead; - var expr = this.inheritCoverGrammar(this.parseExponentiationExpression); - var token = this.lookahead; - var prec = this.binaryPrecedence(token); - if (prec > 0) { - this.nextToken(); - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - var markers = [startToken, this.lookahead]; - var left = expr; - var right = this.isolateCoverGrammar(this.parseExponentiationExpression); - var stack = [left, token.value, right]; - var precedences = [prec]; - while (true) { - prec = this.binaryPrecedence(this.lookahead); - if (prec <= 0) { - break; - } - // Reduce: make a binary expression from the three topmost entries. - while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) { - right = stack.pop(); - var operator = stack.pop(); - precedences.pop(); - left = stack.pop(); - markers.pop(); - var node = this.startNode(markers[markers.length - 1]); - stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right))); - } - // Shift. - stack.push(this.nextToken().value); - precedences.push(prec); - markers.push(this.lookahead); - stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression)); - } - // Final reduce to clean-up the stack. - var i = stack.length - 1; - expr = stack[i]; - var lastMarker = markers.pop(); - while (i > 1) { - var marker = markers.pop(); - var lastLineStart = lastMarker && lastMarker.lineStart; - var node = this.startNode(marker, lastLineStart); - var operator = stack[i - 1]; - expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr)); - i -= 2; - lastMarker = marker; - } - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-conditional-operator - Parser.prototype.parseConditionalExpression = function () { - var startToken = this.lookahead; - var expr = this.inheritCoverGrammar(this.parseBinaryExpression); - if (this.match('?')) { - this.nextToken(); - var previousAllowIn = this.context.allowIn; - this.context.allowIn = true; - var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression); - this.context.allowIn = previousAllowIn; - this.expect(':'); - var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression); - expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate)); - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-assignment-operators - Parser.prototype.checkPatternParam = function (options, param) { - switch (param.type) { - case syntax_1.Syntax.Identifier: - this.validateParam(options, param, param.name); - break; - case syntax_1.Syntax.RestElement: - this.checkPatternParam(options, param.argument); - break; - case syntax_1.Syntax.AssignmentPattern: - this.checkPatternParam(options, param.left); - break; - case syntax_1.Syntax.ArrayPattern: - for (var i = 0; i < param.elements.length; i++) { - if (param.elements[i] !== null) { - this.checkPatternParam(options, param.elements[i]); - } - } - break; - case syntax_1.Syntax.ObjectPattern: - for (var i = 0; i < param.properties.length; i++) { - this.checkPatternParam(options, param.properties[i].value); - } - break; - default: - break; - } - options.simple = options.simple && (param instanceof Node.Identifier); - }; - Parser.prototype.reinterpretAsCoverFormalsList = function (expr) { - var params = [expr]; - var options; - var asyncArrow = false; - switch (expr.type) { - case syntax_1.Syntax.Identifier: - break; - case ArrowParameterPlaceHolder: - params = expr.params; - asyncArrow = expr.async; - break; - default: - return null; - } - options = { - simple: true, - paramSet: {} - }; - for (var i = 0; i < params.length; ++i) { - var param = params[i]; - if (param.type === syntax_1.Syntax.AssignmentPattern) { - if (param.right.type === syntax_1.Syntax.YieldExpression) { - if (param.right.argument) { - this.throwUnexpectedToken(this.lookahead); - } - param.right.type = syntax_1.Syntax.Identifier; - param.right.name = 'yield'; - delete param.right.argument; - delete param.right.delegate; - } - } - else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') { - this.throwUnexpectedToken(this.lookahead); - } - this.checkPatternParam(options, param); - params[i] = param; - } - if (this.context.strict || !this.context.allowYield) { - for (var i = 0; i < params.length; ++i) { - var param = params[i]; - if (param.type === syntax_1.Syntax.YieldExpression) { - this.throwUnexpectedToken(this.lookahead); - } - } - } - if (options.message === messages_1.Messages.StrictParamDupe) { - var token = this.context.strict ? options.stricted : options.firstRestricted; - this.throwUnexpectedToken(token, options.message); - } - return { - simple: options.simple, - params: params, - stricted: options.stricted, - firstRestricted: options.firstRestricted, - message: options.message - }; - }; - Parser.prototype.parseAssignmentExpression = function () { - var expr; - if (!this.context.allowYield && this.matchKeyword('yield')) { - expr = this.parseYieldExpression(); - } - else { - var startToken = this.lookahead; - var token = startToken; - expr = this.parseConditionalExpression(); - if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') { - if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) { - var arg = this.parsePrimaryExpression(); - this.reinterpretExpressionAsPattern(arg); - expr = { - type: ArrowParameterPlaceHolder, - params: [arg], - async: true - }; - } - } - if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) { - // https://tc39.github.io/ecma262/#sec-arrow-function-definitions - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - var isAsync = expr.async; - var list = this.reinterpretAsCoverFormalsList(expr); - if (list) { - if (this.hasLineTerminator) { - this.tolerateUnexpectedToken(this.lookahead); - } - this.context.firstCoverInitializedNameError = null; - var previousStrict = this.context.strict; - var previousAllowStrictDirective = this.context.allowStrictDirective; - this.context.allowStrictDirective = list.simple; - var previousAllowYield = this.context.allowYield; - var previousAwait = this.context.await; - this.context.allowYield = true; - this.context.await = isAsync; - var node = this.startNode(startToken); - this.expect('=>'); - var body = void 0; - if (this.match('{')) { - var previousAllowIn = this.context.allowIn; - this.context.allowIn = true; - body = this.parseFunctionSourceElements(); - this.context.allowIn = previousAllowIn; - } - else { - body = this.isolateCoverGrammar(this.parseAssignmentExpression); - } - var expression = body.type !== syntax_1.Syntax.BlockStatement; - if (this.context.strict && list.firstRestricted) { - this.throwUnexpectedToken(list.firstRestricted, list.message); - } - if (this.context.strict && list.stricted) { - this.tolerateUnexpectedToken(list.stricted, list.message); - } - expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) : - this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression)); - this.context.strict = previousStrict; - this.context.allowStrictDirective = previousAllowStrictDirective; - this.context.allowYield = previousAllowYield; - this.context.await = previousAwait; - } - } - else { - if (this.matchAssign()) { - if (!this.context.isAssignmentTarget) { - this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); - } - if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) { - var id = expr; - if (this.scanner.isRestrictedWord(id.name)) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment); - } - if (this.scanner.isStrictModeReservedWord(id.name)) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); - } - } - if (!this.match('=')) { - this.context.isAssignmentTarget = false; - this.context.isBindingElement = false; - } - else { - this.reinterpretExpressionAsPattern(expr); - } - token = this.nextToken(); - var operator = token.value; - var right = this.isolateCoverGrammar(this.parseAssignmentExpression); - expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right)); - this.context.firstCoverInitializedNameError = null; - } - } - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-comma-operator - Parser.prototype.parseExpression = function () { - var startToken = this.lookahead; - var expr = this.isolateCoverGrammar(this.parseAssignmentExpression); - if (this.match(',')) { - var expressions = []; - expressions.push(expr); - while (this.lookahead.type !== 2 /* EOF */) { - if (!this.match(',')) { - break; - } - this.nextToken(); - expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); - } - expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); - } - return expr; - }; - // https://tc39.github.io/ecma262/#sec-block - Parser.prototype.parseStatementListItem = function () { - var statement; - this.context.isAssignmentTarget = true; - this.context.isBindingElement = true; - if (this.lookahead.type === 4 /* Keyword */) { - switch (this.lookahead.value) { - case 'export': - if (!this.context.isModule) { - this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration); - } - statement = this.parseExportDeclaration(); - break; - case 'import': - if (!this.context.isModule) { - this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration); - } - statement = this.parseImportDeclaration(); - break; - case 'const': - statement = this.parseLexicalDeclaration({ inFor: false }); - break; - case 'function': - statement = this.parseFunctionDeclaration(); - break; - case 'class': - statement = this.parseClassDeclaration(); - break; - case 'let': - statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement(); - break; - default: - statement = this.parseStatement(); - break; - } - } - else { - statement = this.parseStatement(); - } - return statement; - }; - Parser.prototype.parseBlock = function () { - var node = this.createNode(); - this.expect('{'); - var block = []; - while (true) { - if (this.match('}')) { - break; - } - block.push(this.parseStatementListItem()); - } - this.expect('}'); - return this.finalize(node, new Node.BlockStatement(block)); - }; - // https://tc39.github.io/ecma262/#sec-let-and-const-declarations - Parser.prototype.parseLexicalBinding = function (kind, options) { - var node = this.createNode(); - var params = []; - var id = this.parsePattern(params, kind); - if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { - if (this.scanner.isRestrictedWord(id.name)) { - this.tolerateError(messages_1.Messages.StrictVarName); - } - } - var init = null; - if (kind === 'const') { - if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) { - if (this.match('=')) { - this.nextToken(); - init = this.isolateCoverGrammar(this.parseAssignmentExpression); - } - else { - this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const'); - } - } - } - else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) { - this.expect('='); - init = this.isolateCoverGrammar(this.parseAssignmentExpression); - } - return this.finalize(node, new Node.VariableDeclarator(id, init)); - }; - Parser.prototype.parseBindingList = function (kind, options) { - var list = [this.parseLexicalBinding(kind, options)]; - while (this.match(',')) { - this.nextToken(); - list.push(this.parseLexicalBinding(kind, options)); - } - return list; - }; - Parser.prototype.isLexicalDeclaration = function () { - var state = this.scanner.saveState(); - this.scanner.scanComments(); - var next = this.scanner.lex(); - this.scanner.restoreState(state); - return (next.type === 3 /* Identifier */) || - (next.type === 7 /* Punctuator */ && next.value === '[') || - (next.type === 7 /* Punctuator */ && next.value === '{') || - (next.type === 4 /* Keyword */ && next.value === 'let') || - (next.type === 4 /* Keyword */ && next.value === 'yield'); - }; - Parser.prototype.parseLexicalDeclaration = function (options) { - var node = this.createNode(); - var kind = this.nextToken().value; - assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const'); - var declarations = this.parseBindingList(kind, options); - this.consumeSemicolon(); - return this.finalize(node, new Node.VariableDeclaration(declarations, kind)); - }; - // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns - Parser.prototype.parseBindingRestElement = function (params, kind) { - var node = this.createNode(); - this.expect('...'); - var arg = this.parsePattern(params, kind); - return this.finalize(node, new Node.RestElement(arg)); - }; - Parser.prototype.parseArrayPattern = function (params, kind) { - var node = this.createNode(); - this.expect('['); - var elements = []; - while (!this.match(']')) { - if (this.match(',')) { - this.nextToken(); - elements.push(null); - } - else { - if (this.match('...')) { - elements.push(this.parseBindingRestElement(params, kind)); - break; - } - else { - elements.push(this.parsePatternWithDefault(params, kind)); - } - if (!this.match(']')) { - this.expect(','); - } - } - } - this.expect(']'); - return this.finalize(node, new Node.ArrayPattern(elements)); - }; - Parser.prototype.parsePropertyPattern = function (params, kind) { - var node = this.createNode(); - var computed = false; - var shorthand = false; - var method = false; - var key; - var value; - if (this.lookahead.type === 3 /* Identifier */) { - var keyToken = this.lookahead; - key = this.parseVariableIdentifier(); - var init = this.finalize(node, new Node.Identifier(keyToken.value)); - if (this.match('=')) { - params.push(keyToken); - shorthand = true; - this.nextToken(); - var expr = this.parseAssignmentExpression(); - value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr)); - } - else if (!this.match(':')) { - params.push(keyToken); - shorthand = true; - value = init; - } - else { - this.expect(':'); - value = this.parsePatternWithDefault(params, kind); - } - } - else { - computed = this.match('['); - key = this.parseObjectPropertyKey(); - this.expect(':'); - value = this.parsePatternWithDefault(params, kind); - } - return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand)); - }; - Parser.prototype.parseObjectPattern = function (params, kind) { - var node = this.createNode(); - var properties = []; - this.expect('{'); - while (!this.match('}')) { - properties.push(this.parsePropertyPattern(params, kind)); - if (!this.match('}')) { - this.expect(','); - } - } - this.expect('}'); - return this.finalize(node, new Node.ObjectPattern(properties)); - }; - Parser.prototype.parsePattern = function (params, kind) { - var pattern; - if (this.match('[')) { - pattern = this.parseArrayPattern(params, kind); - } - else if (this.match('{')) { - pattern = this.parseObjectPattern(params, kind); - } - else { - if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) { - this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding); - } - params.push(this.lookahead); - pattern = this.parseVariableIdentifier(kind); - } - return pattern; - }; - Parser.prototype.parsePatternWithDefault = function (params, kind) { - var startToken = this.lookahead; - var pattern = this.parsePattern(params, kind); - if (this.match('=')) { - this.nextToken(); - var previousAllowYield = this.context.allowYield; - this.context.allowYield = true; - var right = this.isolateCoverGrammar(this.parseAssignmentExpression); - this.context.allowYield = previousAllowYield; - pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right)); - } - return pattern; - }; - // https://tc39.github.io/ecma262/#sec-variable-statement - Parser.prototype.parseVariableIdentifier = function (kind) { - var node = this.createNode(); - var token = this.nextToken(); - if (token.type === 4 /* Keyword */ && token.value === 'yield') { - if (this.context.strict) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); - } - else if (!this.context.allowYield) { - this.throwUnexpectedToken(token); - } - } - else if (token.type !== 3 /* Identifier */) { - if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); - } - else { - if (this.context.strict || token.value !== 'let' || kind !== 'var') { - this.throwUnexpectedToken(token); - } - } - } - else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') { - this.tolerateUnexpectedToken(token); - } - return this.finalize(node, new Node.Identifier(token.value)); - }; - Parser.prototype.parseVariableDeclaration = function (options) { - var node = this.createNode(); - var params = []; - var id = this.parsePattern(params, 'var'); - if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { - if (this.scanner.isRestrictedWord(id.name)) { - this.tolerateError(messages_1.Messages.StrictVarName); - } - } - var init = null; - if (this.match('=')) { - this.nextToken(); - init = this.isolateCoverGrammar(this.parseAssignmentExpression); - } - else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) { - this.expect('='); - } - return this.finalize(node, new Node.VariableDeclarator(id, init)); - }; - Parser.prototype.parseVariableDeclarationList = function (options) { - var opt = { inFor: options.inFor }; - var list = []; - list.push(this.parseVariableDeclaration(opt)); - while (this.match(',')) { - this.nextToken(); - list.push(this.parseVariableDeclaration(opt)); - } - return list; - }; - Parser.prototype.parseVariableStatement = function () { - var node = this.createNode(); - this.expectKeyword('var'); - var declarations = this.parseVariableDeclarationList({ inFor: false }); - this.consumeSemicolon(); - return this.finalize(node, new Node.VariableDeclaration(declarations, 'var')); - }; - // https://tc39.github.io/ecma262/#sec-empty-statement - Parser.prototype.parseEmptyStatement = function () { - var node = this.createNode(); - this.expect(';'); - return this.finalize(node, new Node.EmptyStatement()); - }; - // https://tc39.github.io/ecma262/#sec-expression-statement - Parser.prototype.parseExpressionStatement = function () { - var node = this.createNode(); - var expr = this.parseExpression(); - this.consumeSemicolon(); - return this.finalize(node, new Node.ExpressionStatement(expr)); - }; - // https://tc39.github.io/ecma262/#sec-if-statement - Parser.prototype.parseIfClause = function () { - if (this.context.strict && this.matchKeyword('function')) { - this.tolerateError(messages_1.Messages.StrictFunction); - } - return this.parseStatement(); - }; - Parser.prototype.parseIfStatement = function () { - var node = this.createNode(); - var consequent; - var alternate = null; - this.expectKeyword('if'); - this.expect('('); - var test = this.parseExpression(); - if (!this.match(')') && this.config.tolerant) { - this.tolerateUnexpectedToken(this.nextToken()); - consequent = this.finalize(this.createNode(), new Node.EmptyStatement()); - } - else { - this.expect(')'); - consequent = this.parseIfClause(); - if (this.matchKeyword('else')) { - this.nextToken(); - alternate = this.parseIfClause(); - } - } - return this.finalize(node, new Node.IfStatement(test, consequent, alternate)); - }; - // https://tc39.github.io/ecma262/#sec-do-while-statement - Parser.prototype.parseDoWhileStatement = function () { - var node = this.createNode(); - this.expectKeyword('do'); - var previousInIteration = this.context.inIteration; - this.context.inIteration = true; - var body = this.parseStatement(); - this.context.inIteration = previousInIteration; - this.expectKeyword('while'); - this.expect('('); - var test = this.parseExpression(); - if (!this.match(')') && this.config.tolerant) { - this.tolerateUnexpectedToken(this.nextToken()); - } - else { - this.expect(')'); - if (this.match(';')) { - this.nextToken(); - } - } - return this.finalize(node, new Node.DoWhileStatement(body, test)); - }; - // https://tc39.github.io/ecma262/#sec-while-statement - Parser.prototype.parseWhileStatement = function () { - var node = this.createNode(); - var body; - this.expectKeyword('while'); - this.expect('('); - var test = this.parseExpression(); - if (!this.match(')') && this.config.tolerant) { - this.tolerateUnexpectedToken(this.nextToken()); - body = this.finalize(this.createNode(), new Node.EmptyStatement()); - } - else { - this.expect(')'); - var previousInIteration = this.context.inIteration; - this.context.inIteration = true; - body = this.parseStatement(); - this.context.inIteration = previousInIteration; - } - return this.finalize(node, new Node.WhileStatement(test, body)); - }; - // https://tc39.github.io/ecma262/#sec-for-statement - // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements - Parser.prototype.parseForStatement = function () { - var init = null; - var test = null; - var update = null; - var forIn = true; - var left, right; - var node = this.createNode(); - this.expectKeyword('for'); - this.expect('('); - if (this.match(';')) { - this.nextToken(); - } - else { - if (this.matchKeyword('var')) { - init = this.createNode(); - this.nextToken(); - var previousAllowIn = this.context.allowIn; - this.context.allowIn = false; - var declarations = this.parseVariableDeclarationList({ inFor: true }); - this.context.allowIn = previousAllowIn; - if (declarations.length === 1 && this.matchKeyword('in')) { - var decl = declarations[0]; - if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) { - this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in'); - } - init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); - this.nextToken(); - left = init; - right = this.parseExpression(); - init = null; - } - else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { - init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); - this.nextToken(); - left = init; - right = this.parseAssignmentExpression(); - init = null; - forIn = false; - } - else { - init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); - this.expect(';'); - } - } - else if (this.matchKeyword('const') || this.matchKeyword('let')) { - init = this.createNode(); - var kind = this.nextToken().value; - if (!this.context.strict && this.lookahead.value === 'in') { - init = this.finalize(init, new Node.Identifier(kind)); - this.nextToken(); - left = init; - right = this.parseExpression(); - init = null; - } - else { - var previousAllowIn = this.context.allowIn; - this.context.allowIn = false; - var declarations = this.parseBindingList(kind, { inFor: true }); - this.context.allowIn = previousAllowIn; - if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) { - init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); - this.nextToken(); - left = init; - right = this.parseExpression(); - init = null; - } - else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { - init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); - this.nextToken(); - left = init; - right = this.parseAssignmentExpression(); - init = null; - forIn = false; - } - else { - this.consumeSemicolon(); - init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); - } - } - } - else { - var initStartToken = this.lookahead; - var previousAllowIn = this.context.allowIn; - this.context.allowIn = false; - init = this.inheritCoverGrammar(this.parseAssignmentExpression); - this.context.allowIn = previousAllowIn; - if (this.matchKeyword('in')) { - if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { - this.tolerateError(messages_1.Messages.InvalidLHSInForIn); - } - this.nextToken(); - this.reinterpretExpressionAsPattern(init); - left = init; - right = this.parseExpression(); - init = null; - } - else if (this.matchContextualKeyword('of')) { - if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { - this.tolerateError(messages_1.Messages.InvalidLHSInForLoop); - } - this.nextToken(); - this.reinterpretExpressionAsPattern(init); - left = init; - right = this.parseAssignmentExpression(); - init = null; - forIn = false; - } - else { - if (this.match(',')) { - var initSeq = [init]; - while (this.match(',')) { - this.nextToken(); - initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); - } - init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq)); - } - this.expect(';'); - } - } - } - if (typeof left === 'undefined') { - if (!this.match(';')) { - test = this.parseExpression(); - } - this.expect(';'); - if (!this.match(')')) { - update = this.parseExpression(); - } - } - var body; - if (!this.match(')') && this.config.tolerant) { - this.tolerateUnexpectedToken(this.nextToken()); - body = this.finalize(this.createNode(), new Node.EmptyStatement()); - } - else { - this.expect(')'); - var previousInIteration = this.context.inIteration; - this.context.inIteration = true; - body = this.isolateCoverGrammar(this.parseStatement); - this.context.inIteration = previousInIteration; - } - return (typeof left === 'undefined') ? - this.finalize(node, new Node.ForStatement(init, test, update, body)) : - forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) : - this.finalize(node, new Node.ForOfStatement(left, right, body)); - }; - // https://tc39.github.io/ecma262/#sec-continue-statement - Parser.prototype.parseContinueStatement = function () { - var node = this.createNode(); - this.expectKeyword('continue'); - var label = null; - if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { - var id = this.parseVariableIdentifier(); - label = id; - var key = '$' + id.name; - if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { - this.throwError(messages_1.Messages.UnknownLabel, id.name); - } - } - this.consumeSemicolon(); - if (label === null && !this.context.inIteration) { - this.throwError(messages_1.Messages.IllegalContinue); - } - return this.finalize(node, new Node.ContinueStatement(label)); - }; - // https://tc39.github.io/ecma262/#sec-break-statement - Parser.prototype.parseBreakStatement = function () { - var node = this.createNode(); - this.expectKeyword('break'); - var label = null; - if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { - var id = this.parseVariableIdentifier(); - var key = '$' + id.name; - if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { - this.throwError(messages_1.Messages.UnknownLabel, id.name); - } - label = id; - } - this.consumeSemicolon(); - if (label === null && !this.context.inIteration && !this.context.inSwitch) { - this.throwError(messages_1.Messages.IllegalBreak); - } - return this.finalize(node, new Node.BreakStatement(label)); - }; - // https://tc39.github.io/ecma262/#sec-return-statement - Parser.prototype.parseReturnStatement = function () { - if (!this.context.inFunctionBody) { - this.tolerateError(messages_1.Messages.IllegalReturn); - } - var node = this.createNode(); - this.expectKeyword('return'); - var hasArgument = (!this.match(';') && !this.match('}') && - !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) || - this.lookahead.type === 8 /* StringLiteral */ || - this.lookahead.type === 10 /* Template */; - var argument = hasArgument ? this.parseExpression() : null; - this.consumeSemicolon(); - return this.finalize(node, new Node.ReturnStatement(argument)); - }; - // https://tc39.github.io/ecma262/#sec-with-statement - Parser.prototype.parseWithStatement = function () { - if (this.context.strict) { - this.tolerateError(messages_1.Messages.StrictModeWith); - } - var node = this.createNode(); - var body; - this.expectKeyword('with'); - this.expect('('); - var object = this.parseExpression(); - if (!this.match(')') && this.config.tolerant) { - this.tolerateUnexpectedToken(this.nextToken()); - body = this.finalize(this.createNode(), new Node.EmptyStatement()); - } - else { - this.expect(')'); - body = this.parseStatement(); - } - return this.finalize(node, new Node.WithStatement(object, body)); - }; - // https://tc39.github.io/ecma262/#sec-switch-statement - Parser.prototype.parseSwitchCase = function () { - var node = this.createNode(); - var test; - if (this.matchKeyword('default')) { - this.nextToken(); - test = null; - } - else { - this.expectKeyword('case'); - test = this.parseExpression(); - } - this.expect(':'); - var consequent = []; - while (true) { - if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) { - break; - } - consequent.push(this.parseStatementListItem()); - } - return this.finalize(node, new Node.SwitchCase(test, consequent)); - }; - Parser.prototype.parseSwitchStatement = function () { - var node = this.createNode(); - this.expectKeyword('switch'); - this.expect('('); - var discriminant = this.parseExpression(); - this.expect(')'); - var previousInSwitch = this.context.inSwitch; - this.context.inSwitch = true; - var cases = []; - var defaultFound = false; - this.expect('{'); - while (true) { - if (this.match('}')) { - break; - } - var clause = this.parseSwitchCase(); - if (clause.test === null) { - if (defaultFound) { - this.throwError(messages_1.Messages.MultipleDefaultsInSwitch); - } - defaultFound = true; - } - cases.push(clause); - } - this.expect('}'); - this.context.inSwitch = previousInSwitch; - return this.finalize(node, new Node.SwitchStatement(discriminant, cases)); - }; - // https://tc39.github.io/ecma262/#sec-labelled-statements - Parser.prototype.parseLabelledStatement = function () { - var node = this.createNode(); - var expr = this.parseExpression(); - var statement; - if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) { - this.nextToken(); - var id = expr; - var key = '$' + id.name; - if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { - this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name); - } - this.context.labelSet[key] = true; - var body = void 0; - if (this.matchKeyword('class')) { - this.tolerateUnexpectedToken(this.lookahead); - body = this.parseClassDeclaration(); - } - else if (this.matchKeyword('function')) { - var token = this.lookahead; - var declaration = this.parseFunctionDeclaration(); - if (this.context.strict) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction); - } - else if (declaration.generator) { - this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext); - } - body = declaration; - } - else { - body = this.parseStatement(); - } - delete this.context.labelSet[key]; - statement = new Node.LabeledStatement(id, body); - } - else { - this.consumeSemicolon(); - statement = new Node.ExpressionStatement(expr); - } - return this.finalize(node, statement); - }; - // https://tc39.github.io/ecma262/#sec-throw-statement - Parser.prototype.parseThrowStatement = function () { - var node = this.createNode(); - this.expectKeyword('throw'); - if (this.hasLineTerminator) { - this.throwError(messages_1.Messages.NewlineAfterThrow); - } - var argument = this.parseExpression(); - this.consumeSemicolon(); - return this.finalize(node, new Node.ThrowStatement(argument)); - }; - // https://tc39.github.io/ecma262/#sec-try-statement - Parser.prototype.parseCatchClause = function () { - var node = this.createNode(); - this.expectKeyword('catch'); - this.expect('('); - if (this.match(')')) { - this.throwUnexpectedToken(this.lookahead); - } - var params = []; - var param = this.parsePattern(params); - var paramMap = {}; - for (var i = 0; i < params.length; i++) { - var key = '$' + params[i].value; - if (Object.prototype.hasOwnProperty.call(paramMap, key)) { - this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value); - } - paramMap[key] = true; - } - if (this.context.strict && param.type === syntax_1.Syntax.Identifier) { - if (this.scanner.isRestrictedWord(param.name)) { - this.tolerateError(messages_1.Messages.StrictCatchVariable); - } - } - this.expect(')'); - var body = this.parseBlock(); - return this.finalize(node, new Node.CatchClause(param, body)); - }; - Parser.prototype.parseFinallyClause = function () { - this.expectKeyword('finally'); - return this.parseBlock(); - }; - Parser.prototype.parseTryStatement = function () { - var node = this.createNode(); - this.expectKeyword('try'); - var block = this.parseBlock(); - var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null; - var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null; - if (!handler && !finalizer) { - this.throwError(messages_1.Messages.NoCatchOrFinally); - } - return this.finalize(node, new Node.TryStatement(block, handler, finalizer)); - }; - // https://tc39.github.io/ecma262/#sec-debugger-statement - Parser.prototype.parseDebuggerStatement = function () { - var node = this.createNode(); - this.expectKeyword('debugger'); - this.consumeSemicolon(); - return this.finalize(node, new Node.DebuggerStatement()); - }; - // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations - Parser.prototype.parseStatement = function () { - var statement; - switch (this.lookahead.type) { - case 1 /* BooleanLiteral */: - case 5 /* NullLiteral */: - case 6 /* NumericLiteral */: - case 8 /* StringLiteral */: - case 10 /* Template */: - case 9 /* RegularExpression */: - statement = this.parseExpressionStatement(); - break; - case 7 /* Punctuator */: - var value = this.lookahead.value; - if (value === '{') { - statement = this.parseBlock(); - } - else if (value === '(') { - statement = this.parseExpressionStatement(); - } - else if (value === ';') { - statement = this.parseEmptyStatement(); - } - else { - statement = this.parseExpressionStatement(); - } - break; - case 3 /* Identifier */: - statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement(); - break; - case 4 /* Keyword */: - switch (this.lookahead.value) { - case 'break': - statement = this.parseBreakStatement(); - break; - case 'continue': - statement = this.parseContinueStatement(); - break; - case 'debugger': - statement = this.parseDebuggerStatement(); - break; - case 'do': - statement = this.parseDoWhileStatement(); - break; - case 'for': - statement = this.parseForStatement(); - break; - case 'function': - statement = this.parseFunctionDeclaration(); - break; - case 'if': - statement = this.parseIfStatement(); - break; - case 'return': - statement = this.parseReturnStatement(); - break; - case 'switch': - statement = this.parseSwitchStatement(); - break; - case 'throw': - statement = this.parseThrowStatement(); - break; - case 'try': - statement = this.parseTryStatement(); - break; - case 'var': - statement = this.parseVariableStatement(); - break; - case 'while': - statement = this.parseWhileStatement(); - break; - case 'with': - statement = this.parseWithStatement(); - break; - default: - statement = this.parseExpressionStatement(); - break; - } - break; - default: - statement = this.throwUnexpectedToken(this.lookahead); - } - return statement; - }; - // https://tc39.github.io/ecma262/#sec-function-definitions - Parser.prototype.parseFunctionSourceElements = function () { - var node = this.createNode(); - this.expect('{'); - var body = this.parseDirectivePrologues(); - var previousLabelSet = this.context.labelSet; - var previousInIteration = this.context.inIteration; - var previousInSwitch = this.context.inSwitch; - var previousInFunctionBody = this.context.inFunctionBody; - this.context.labelSet = {}; - this.context.inIteration = false; - this.context.inSwitch = false; - this.context.inFunctionBody = true; - while (this.lookahead.type !== 2 /* EOF */) { - if (this.match('}')) { - break; - } - body.push(this.parseStatementListItem()); - } - this.expect('}'); - this.context.labelSet = previousLabelSet; - this.context.inIteration = previousInIteration; - this.context.inSwitch = previousInSwitch; - this.context.inFunctionBody = previousInFunctionBody; - return this.finalize(node, new Node.BlockStatement(body)); - }; - Parser.prototype.validateParam = function (options, param, name) { - var key = '$' + name; - if (this.context.strict) { - if (this.scanner.isRestrictedWord(name)) { - options.stricted = param; - options.message = messages_1.Messages.StrictParamName; - } - if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { - options.stricted = param; - options.message = messages_1.Messages.StrictParamDupe; - } - } - else if (!options.firstRestricted) { - if (this.scanner.isRestrictedWord(name)) { - options.firstRestricted = param; - options.message = messages_1.Messages.StrictParamName; - } - else if (this.scanner.isStrictModeReservedWord(name)) { - options.firstRestricted = param; - options.message = messages_1.Messages.StrictReservedWord; - } - else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { - options.stricted = param; - options.message = messages_1.Messages.StrictParamDupe; - } - } - /* istanbul ignore next */ - if (typeof Object.defineProperty === 'function') { - Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true }); - } - else { - options.paramSet[key] = true; - } - }; - Parser.prototype.parseRestElement = function (params) { - var node = this.createNode(); - this.expect('...'); - var arg = this.parsePattern(params); - if (this.match('=')) { - this.throwError(messages_1.Messages.DefaultRestParameter); - } - if (!this.match(')')) { - this.throwError(messages_1.Messages.ParameterAfterRestParameter); - } - return this.finalize(node, new Node.RestElement(arg)); - }; - Parser.prototype.parseFormalParameter = function (options) { - var params = []; - var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params); - for (var i = 0; i < params.length; i++) { - this.validateParam(options, params[i], params[i].value); - } - options.simple = options.simple && (param instanceof Node.Identifier); - options.params.push(param); - }; - Parser.prototype.parseFormalParameters = function (firstRestricted) { - var options; - options = { - simple: true, - params: [], - firstRestricted: firstRestricted - }; - this.expect('('); - if (!this.match(')')) { - options.paramSet = {}; - while (this.lookahead.type !== 2 /* EOF */) { - this.parseFormalParameter(options); - if (this.match(')')) { - break; - } - this.expect(','); - if (this.match(')')) { - break; - } - } - } - this.expect(')'); - return { - simple: options.simple, - params: options.params, - stricted: options.stricted, - firstRestricted: options.firstRestricted, - message: options.message - }; - }; - Parser.prototype.matchAsyncFunction = function () { - var match = this.matchContextualKeyword('async'); - if (match) { - var state = this.scanner.saveState(); - this.scanner.scanComments(); - var next = this.scanner.lex(); - this.scanner.restoreState(state); - match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function'); - } - return match; - }; - Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) { - var node = this.createNode(); - var isAsync = this.matchContextualKeyword('async'); - if (isAsync) { - this.nextToken(); - } - this.expectKeyword('function'); - var isGenerator = isAsync ? false : this.match('*'); - if (isGenerator) { - this.nextToken(); - } - var message; - var id = null; - var firstRestricted = null; - if (!identifierIsOptional || !this.match('(')) { - var token = this.lookahead; - id = this.parseVariableIdentifier(); - if (this.context.strict) { - if (this.scanner.isRestrictedWord(token.value)) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); - } - } - else { - if (this.scanner.isRestrictedWord(token.value)) { - firstRestricted = token; - message = messages_1.Messages.StrictFunctionName; - } - else if (this.scanner.isStrictModeReservedWord(token.value)) { - firstRestricted = token; - message = messages_1.Messages.StrictReservedWord; - } - } - } - var previousAllowAwait = this.context.await; - var previousAllowYield = this.context.allowYield; - this.context.await = isAsync; - this.context.allowYield = !isGenerator; - var formalParameters = this.parseFormalParameters(firstRestricted); - var params = formalParameters.params; - var stricted = formalParameters.stricted; - firstRestricted = formalParameters.firstRestricted; - if (formalParameters.message) { - message = formalParameters.message; - } - var previousStrict = this.context.strict; - var previousAllowStrictDirective = this.context.allowStrictDirective; - this.context.allowStrictDirective = formalParameters.simple; - var body = this.parseFunctionSourceElements(); - if (this.context.strict && firstRestricted) { - this.throwUnexpectedToken(firstRestricted, message); - } - if (this.context.strict && stricted) { - this.tolerateUnexpectedToken(stricted, message); - } - this.context.strict = previousStrict; - this.context.allowStrictDirective = previousAllowStrictDirective; - this.context.await = previousAllowAwait; - this.context.allowYield = previousAllowYield; - return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) : - this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator)); - }; - Parser.prototype.parseFunctionExpression = function () { - var node = this.createNode(); - var isAsync = this.matchContextualKeyword('async'); - if (isAsync) { - this.nextToken(); - } - this.expectKeyword('function'); - var isGenerator = isAsync ? false : this.match('*'); - if (isGenerator) { - this.nextToken(); - } - var message; - var id = null; - var firstRestricted; - var previousAllowAwait = this.context.await; - var previousAllowYield = this.context.allowYield; - this.context.await = isAsync; - this.context.allowYield = !isGenerator; - if (!this.match('(')) { - var token = this.lookahead; - id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier(); - if (this.context.strict) { - if (this.scanner.isRestrictedWord(token.value)) { - this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); - } - } - else { - if (this.scanner.isRestrictedWord(token.value)) { - firstRestricted = token; - message = messages_1.Messages.StrictFunctionName; - } - else if (this.scanner.isStrictModeReservedWord(token.value)) { - firstRestricted = token; - message = messages_1.Messages.StrictReservedWord; - } - } - } - var formalParameters = this.parseFormalParameters(firstRestricted); - var params = formalParameters.params; - var stricted = formalParameters.stricted; - firstRestricted = formalParameters.firstRestricted; - if (formalParameters.message) { - message = formalParameters.message; - } - var previousStrict = this.context.strict; - var previousAllowStrictDirective = this.context.allowStrictDirective; - this.context.allowStrictDirective = formalParameters.simple; - var body = this.parseFunctionSourceElements(); - if (this.context.strict && firstRestricted) { - this.throwUnexpectedToken(firstRestricted, message); - } - if (this.context.strict && stricted) { - this.tolerateUnexpectedToken(stricted, message); - } - this.context.strict = previousStrict; - this.context.allowStrictDirective = previousAllowStrictDirective; - this.context.await = previousAllowAwait; - this.context.allowYield = previousAllowYield; - return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) : - this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator)); - }; - // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive - Parser.prototype.parseDirective = function () { - var token = this.lookahead; - var node = this.createNode(); - var expr = this.parseExpression(); - var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null; - this.consumeSemicolon(); - return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr)); - }; - Parser.prototype.parseDirectivePrologues = function () { - var firstRestricted = null; - var body = []; - while (true) { - var token = this.lookahead; - if (token.type !== 8 /* StringLiteral */) { - break; - } - var statement = this.parseDirective(); - body.push(statement); - var directive = statement.directive; - if (typeof directive !== 'string') { - break; - } - if (directive === 'use strict') { - this.context.strict = true; - if (firstRestricted) { - this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral); - } - if (!this.context.allowStrictDirective) { - this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective); - } - } - else { - if (!firstRestricted && token.octal) { - firstRestricted = token; - } - } - } - return body; - }; - // https://tc39.github.io/ecma262/#sec-method-definitions - Parser.prototype.qualifiedPropertyName = function (token) { - switch (token.type) { - case 3 /* Identifier */: - case 8 /* StringLiteral */: - case 1 /* BooleanLiteral */: - case 5 /* NullLiteral */: - case 6 /* NumericLiteral */: - case 4 /* Keyword */: - return true; - case 7 /* Punctuator */: - return token.value === '['; - default: - break; - } - return false; - }; - Parser.prototype.parseGetterMethod = function () { - var node = this.createNode(); - var isGenerator = false; - var previousAllowYield = this.context.allowYield; - this.context.allowYield = !isGenerator; - var formalParameters = this.parseFormalParameters(); - if (formalParameters.params.length > 0) { - this.tolerateError(messages_1.Messages.BadGetterArity); - } - var method = this.parsePropertyMethod(formalParameters); - this.context.allowYield = previousAllowYield; - return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); - }; - Parser.prototype.parseSetterMethod = function () { - var node = this.createNode(); - var isGenerator = false; - var previousAllowYield = this.context.allowYield; - this.context.allowYield = !isGenerator; - var formalParameters = this.parseFormalParameters(); - if (formalParameters.params.length !== 1) { - this.tolerateError(messages_1.Messages.BadSetterArity); - } - else if (formalParameters.params[0] instanceof Node.RestElement) { - this.tolerateError(messages_1.Messages.BadSetterRestParameter); - } - var method = this.parsePropertyMethod(formalParameters); - this.context.allowYield = previousAllowYield; - return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); - }; - Parser.prototype.parseGeneratorMethod = function () { - var node = this.createNode(); - var isGenerator = true; - var previousAllowYield = this.context.allowYield; - this.context.allowYield = true; - var params = this.parseFormalParameters(); - this.context.allowYield = false; - var method = this.parsePropertyMethod(params); - this.context.allowYield = previousAllowYield; - return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); - }; - // https://tc39.github.io/ecma262/#sec-generator-function-definitions - Parser.prototype.isStartOfExpression = function () { - var start = true; - var value = this.lookahead.value; - switch (this.lookahead.type) { - case 7 /* Punctuator */: - start = (value === '[') || (value === '(') || (value === '{') || - (value === '+') || (value === '-') || - (value === '!') || (value === '~') || - (value === '++') || (value === '--') || - (value === '/') || (value === '/='); // regular expression literal - break; - case 4 /* Keyword */: - start = (value === 'class') || (value === 'delete') || - (value === 'function') || (value === 'let') || (value === 'new') || - (value === 'super') || (value === 'this') || (value === 'typeof') || - (value === 'void') || (value === 'yield'); - break; - default: - break; - } - return start; - }; - Parser.prototype.parseYieldExpression = function () { - var node = this.createNode(); - this.expectKeyword('yield'); - var argument = null; - var delegate = false; - if (!this.hasLineTerminator) { - var previousAllowYield = this.context.allowYield; - this.context.allowYield = false; - delegate = this.match('*'); - if (delegate) { - this.nextToken(); - argument = this.parseAssignmentExpression(); - } - else if (this.isStartOfExpression()) { - argument = this.parseAssignmentExpression(); - } - this.context.allowYield = previousAllowYield; - } - return this.finalize(node, new Node.YieldExpression(argument, delegate)); - }; - // https://tc39.github.io/ecma262/#sec-class-definitions - Parser.prototype.parseClassElement = function (hasConstructor) { - var token = this.lookahead; - var node = this.createNode(); - var kind = ''; - var key = null; - var value = null; - var computed = false; - var method = false; - var isStatic = false; - var isAsync = false; - if (this.match('*')) { - this.nextToken(); - } - else { - computed = this.match('['); - key = this.parseObjectPropertyKey(); - var id = key; - if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) { - token = this.lookahead; - isStatic = true; - computed = this.match('['); - if (this.match('*')) { - this.nextToken(); - } - else { - key = this.parseObjectPropertyKey(); - } - } - if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) { - var punctuator = this.lookahead.value; - if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') { - isAsync = true; - token = this.lookahead; - key = this.parseObjectPropertyKey(); - if (token.type === 3 /* Identifier */ && token.value === 'constructor') { - this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync); - } - } - } - } - var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); - if (token.type === 3 /* Identifier */) { - if (token.value === 'get' && lookaheadPropertyKey) { - kind = 'get'; - computed = this.match('['); - key = this.parseObjectPropertyKey(); - this.context.allowYield = false; - value = this.parseGetterMethod(); - } - else if (token.value === 'set' && lookaheadPropertyKey) { - kind = 'set'; - computed = this.match('['); - key = this.parseObjectPropertyKey(); - value = this.parseSetterMethod(); - } - } - else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { - kind = 'init'; - computed = this.match('['); - key = this.parseObjectPropertyKey(); - value = this.parseGeneratorMethod(); - method = true; - } - if (!kind && key && this.match('(')) { - kind = 'init'; - value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); - method = true; - } - if (!kind) { - this.throwUnexpectedToken(this.lookahead); - } - if (kind === 'init') { - kind = 'method'; - } - if (!computed) { - if (isStatic && this.isPropertyKey(key, 'prototype')) { - this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype); - } - if (!isStatic && this.isPropertyKey(key, 'constructor')) { - if (kind !== 'method' || !method || (value && value.generator)) { - this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod); - } - if (hasConstructor.value) { - this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor); - } - else { - hasConstructor.value = true; - } - kind = 'constructor'; - } - } - return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic)); - }; - Parser.prototype.parseClassElementList = function () { - var body = []; - var hasConstructor = { value: false }; - this.expect('{'); - while (!this.match('}')) { - if (this.match(';')) { - this.nextToken(); - } - else { - body.push(this.parseClassElement(hasConstructor)); - } - } - this.expect('}'); - return body; - }; - Parser.prototype.parseClassBody = function () { - var node = this.createNode(); - var elementList = this.parseClassElementList(); - return this.finalize(node, new Node.ClassBody(elementList)); - }; - Parser.prototype.parseClassDeclaration = function (identifierIsOptional) { - var node = this.createNode(); - var previousStrict = this.context.strict; - this.context.strict = true; - this.expectKeyword('class'); - var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier(); - var superClass = null; - if (this.matchKeyword('extends')) { - this.nextToken(); - superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); - } - var classBody = this.parseClassBody(); - this.context.strict = previousStrict; - return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody)); - }; - Parser.prototype.parseClassExpression = function () { - var node = this.createNode(); - var previousStrict = this.context.strict; - this.context.strict = true; - this.expectKeyword('class'); - var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null; - var superClass = null; - if (this.matchKeyword('extends')) { - this.nextToken(); - superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); - } - var classBody = this.parseClassBody(); - this.context.strict = previousStrict; - return this.finalize(node, new Node.ClassExpression(id, superClass, classBody)); - }; - // https://tc39.github.io/ecma262/#sec-scripts - // https://tc39.github.io/ecma262/#sec-modules - Parser.prototype.parseModule = function () { - this.context.strict = true; - this.context.isModule = true; - this.scanner.isModule = true; - var node = this.createNode(); - var body = this.parseDirectivePrologues(); - while (this.lookahead.type !== 2 /* EOF */) { - body.push(this.parseStatementListItem()); - } - return this.finalize(node, new Node.Module(body)); - }; - Parser.prototype.parseScript = function () { - var node = this.createNode(); - var body = this.parseDirectivePrologues(); - while (this.lookahead.type !== 2 /* EOF */) { - body.push(this.parseStatementListItem()); - } - return this.finalize(node, new Node.Script(body)); - }; - // https://tc39.github.io/ecma262/#sec-imports - Parser.prototype.parseModuleSpecifier = function () { - var node = this.createNode(); - if (this.lookahead.type !== 8 /* StringLiteral */) { - this.throwError(messages_1.Messages.InvalidModuleSpecifier); - } - var token = this.nextToken(); - var raw = this.getTokenRaw(token); - return this.finalize(node, new Node.Literal(token.value, raw)); - }; - // import {} ...; - Parser.prototype.parseImportSpecifier = function () { - var node = this.createNode(); - var imported; - var local; - if (this.lookahead.type === 3 /* Identifier */) { - imported = this.parseVariableIdentifier(); - local = imported; - if (this.matchContextualKeyword('as')) { - this.nextToken(); - local = this.parseVariableIdentifier(); - } - } - else { - imported = this.parseIdentifierName(); - local = imported; - if (this.matchContextualKeyword('as')) { - this.nextToken(); - local = this.parseVariableIdentifier(); - } - else { - this.throwUnexpectedToken(this.nextToken()); - } - } - return this.finalize(node, new Node.ImportSpecifier(local, imported)); - }; - // {foo, bar as bas} - Parser.prototype.parseNamedImports = function () { - this.expect('{'); - var specifiers = []; - while (!this.match('}')) { - specifiers.push(this.parseImportSpecifier()); - if (!this.match('}')) { - this.expect(','); - } - } - this.expect('}'); - return specifiers; - }; - // import ...; - Parser.prototype.parseImportDefaultSpecifier = function () { - var node = this.createNode(); - var local = this.parseIdentifierName(); - return this.finalize(node, new Node.ImportDefaultSpecifier(local)); - }; - // import <* as foo> ...; - Parser.prototype.parseImportNamespaceSpecifier = function () { - var node = this.createNode(); - this.expect('*'); - if (!this.matchContextualKeyword('as')) { - this.throwError(messages_1.Messages.NoAsAfterImportNamespace); - } - this.nextToken(); - var local = this.parseIdentifierName(); - return this.finalize(node, new Node.ImportNamespaceSpecifier(local)); - }; - Parser.prototype.parseImportDeclaration = function () { - if (this.context.inFunctionBody) { - this.throwError(messages_1.Messages.IllegalImportDeclaration); - } - var node = this.createNode(); - this.expectKeyword('import'); - var src; - var specifiers = []; - if (this.lookahead.type === 8 /* StringLiteral */) { - // import 'foo'; - src = this.parseModuleSpecifier(); - } - else { - if (this.match('{')) { - // import {bar} - specifiers = specifiers.concat(this.parseNamedImports()); - } - else if (this.match('*')) { - // import * as foo - specifiers.push(this.parseImportNamespaceSpecifier()); - } - else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) { - // import foo - specifiers.push(this.parseImportDefaultSpecifier()); - if (this.match(',')) { - this.nextToken(); - if (this.match('*')) { - // import foo, * as foo - specifiers.push(this.parseImportNamespaceSpecifier()); - } - else if (this.match('{')) { - // import foo, {bar} - specifiers = specifiers.concat(this.parseNamedImports()); - } - else { - this.throwUnexpectedToken(this.lookahead); - } - } - } - else { - this.throwUnexpectedToken(this.nextToken()); - } - if (!this.matchContextualKeyword('from')) { - var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; - this.throwError(message, this.lookahead.value); - } - this.nextToken(); - src = this.parseModuleSpecifier(); - } - this.consumeSemicolon(); - return this.finalize(node, new Node.ImportDeclaration(specifiers, src)); - }; - // https://tc39.github.io/ecma262/#sec-exports - Parser.prototype.parseExportSpecifier = function () { - var node = this.createNode(); - var local = this.parseIdentifierName(); - var exported = local; - if (this.matchContextualKeyword('as')) { - this.nextToken(); - exported = this.parseIdentifierName(); - } - return this.finalize(node, new Node.ExportSpecifier(local, exported)); - }; - Parser.prototype.parseExportDeclaration = function () { - if (this.context.inFunctionBody) { - this.throwError(messages_1.Messages.IllegalExportDeclaration); - } - var node = this.createNode(); - this.expectKeyword('export'); - var exportDeclaration; - if (this.matchKeyword('default')) { - // export default ... - this.nextToken(); - if (this.matchKeyword('function')) { - // export default function foo () {} - // export default function () {} - var declaration = this.parseFunctionDeclaration(true); - exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); - } - else if (this.matchKeyword('class')) { - // export default class foo {} - var declaration = this.parseClassDeclaration(true); - exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); - } - else if (this.matchContextualKeyword('async')) { - // export default async function f () {} - // export default async function () {} - // export default async x => x - var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression(); - exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); - } - else { - if (this.matchContextualKeyword('from')) { - this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value); - } - // export default {}; - // export default []; - // export default (1 + 2); - var declaration = this.match('{') ? this.parseObjectInitializer() : - this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression(); - this.consumeSemicolon(); - exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); - } - } - else if (this.match('*')) { - // export * from 'foo'; - this.nextToken(); - if (!this.matchContextualKeyword('from')) { - var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; - this.throwError(message, this.lookahead.value); - } - this.nextToken(); - var src = this.parseModuleSpecifier(); - this.consumeSemicolon(); - exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src)); - } - else if (this.lookahead.type === 4 /* Keyword */) { - // export var f = 1; - var declaration = void 0; - switch (this.lookahead.value) { - case 'let': - case 'const': - declaration = this.parseLexicalDeclaration({ inFor: false }); - break; - case 'var': - case 'class': - case 'function': - declaration = this.parseStatementListItem(); - break; - default: - this.throwUnexpectedToken(this.lookahead); - } - exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); - } - else if (this.matchAsyncFunction()) { - var declaration = this.parseFunctionDeclaration(); - exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); - } - else { - var specifiers = []; - var source = null; - var isExportFromIdentifier = false; - this.expect('{'); - while (!this.match('}')) { - isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default'); - specifiers.push(this.parseExportSpecifier()); - if (!this.match('}')) { - this.expect(','); - } - } - this.expect('}'); - if (this.matchContextualKeyword('from')) { - // export {default} from 'foo'; - // export {foo} from 'foo'; - this.nextToken(); - source = this.parseModuleSpecifier(); - this.consumeSemicolon(); - } - else if (isExportFromIdentifier) { - // export {default}; // missing fromClause - var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; - this.throwError(message, this.lookahead.value); - } - else { - // export {foo}; - this.consumeSemicolon(); - } - exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source)); - } - return exportDeclaration; - }; - return Parser; - }()); - exports.Parser = Parser; - - -/***/ }, -/* 9 */ -/***/ function(module, exports) { - - "use strict"; - // Ensure the condition is true, otherwise throw an error. - // This is only to have a better contract semantic, i.e. another safety net - // to catch a logic error. The condition shall be fulfilled in normal case. - // Do NOT use this to enforce a certain condition on any user input. - Object.defineProperty(exports, "__esModule", { value: true }); - function assert(condition, message) { - /* istanbul ignore if */ - if (!condition) { - throw new Error('ASSERT: ' + message); - } - } - exports.assert = assert; - - -/***/ }, -/* 10 */ -/***/ function(module, exports) { - - "use strict"; - /* tslint:disable:max-classes-per-file */ - Object.defineProperty(exports, "__esModule", { value: true }); - var ErrorHandler = (function () { - function ErrorHandler() { - this.errors = []; - this.tolerant = false; - } - ErrorHandler.prototype.recordError = function (error) { - this.errors.push(error); - }; - ErrorHandler.prototype.tolerate = function (error) { - if (this.tolerant) { - this.recordError(error); - } - else { - throw error; - } - }; - ErrorHandler.prototype.constructError = function (msg, column) { - var error = new Error(msg); - try { - throw error; - } - catch (base) { - /* istanbul ignore else */ - if (Object.create && Object.defineProperty) { - error = Object.create(base); - Object.defineProperty(error, 'column', { value: column }); - } - } - /* istanbul ignore next */ - return error; - }; - ErrorHandler.prototype.createError = function (index, line, col, description) { - var msg = 'Line ' + line + ': ' + description; - var error = this.constructError(msg, col); - error.index = index; - error.lineNumber = line; - error.description = description; - return error; - }; - ErrorHandler.prototype.throwError = function (index, line, col, description) { - throw this.createError(index, line, col, description); - }; - ErrorHandler.prototype.tolerateError = function (index, line, col, description) { - var error = this.createError(index, line, col, description); - if (this.tolerant) { - this.recordError(error); - } - else { - throw error; - } - }; - return ErrorHandler; - }()); - exports.ErrorHandler = ErrorHandler; - - -/***/ }, -/* 11 */ -/***/ function(module, exports) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - // Error messages should be identical to V8. - exports.Messages = { - BadGetterArity: 'Getter must not have any formal parameters', - BadSetterArity: 'Setter must have exactly one formal parameter', - BadSetterRestParameter: 'Setter function argument must not be a rest parameter', - ConstructorIsAsync: 'Class constructor may not be an async method', - ConstructorSpecialMethod: 'Class constructor may not be an accessor', - DeclarationMissingInitializer: 'Missing initializer in %0 declaration', - DefaultRestParameter: 'Unexpected token =', - DuplicateBinding: 'Duplicate binding %0', - DuplicateConstructor: 'A class may only have one constructor', - DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals', - ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer', - GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts', - IllegalBreak: 'Illegal break statement', - IllegalContinue: 'Illegal continue statement', - IllegalExportDeclaration: 'Unexpected token', - IllegalImportDeclaration: 'Unexpected token', - IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list', - IllegalReturn: 'Illegal return statement', - InvalidEscapedReservedWord: 'Keyword must not contain escaped characters', - InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence', - InvalidLHSInAssignment: 'Invalid left-hand side in assignment', - InvalidLHSInForIn: 'Invalid left-hand side in for-in', - InvalidLHSInForLoop: 'Invalid left-hand side in for-loop', - InvalidModuleSpecifier: 'Unexpected token', - InvalidRegExp: 'Invalid regular expression', - LetInLexicalBinding: 'let is disallowed as a lexically bound name', - MissingFromClause: 'Unexpected token', - MultipleDefaultsInSwitch: 'More than one default clause in switch statement', - NewlineAfterThrow: 'Illegal newline after throw', - NoAsAfterImportNamespace: 'Unexpected token', - NoCatchOrFinally: 'Missing catch or finally after try', - ParameterAfterRestParameter: 'Rest parameter must be last formal parameter', - Redeclaration: '%0 \'%1\' has already been declared', - StaticPrototype: 'Classes may not have static property named prototype', - StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', - StrictDelete: 'Delete of an unqualified identifier in strict mode.', - StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block', - StrictFunctionName: 'Function name may not be eval or arguments in strict mode', - StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', - StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', - StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', - StrictModeWith: 'Strict mode code may not include a with statement', - StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', - StrictParamDupe: 'Strict mode function may not have duplicate parameter names', - StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', - StrictReservedWord: 'Use of future reserved word in strict mode', - StrictVarName: 'Variable name may not be eval or arguments in strict mode', - TemplateOctalLiteral: 'Octal literals are not allowed in template strings.', - UnexpectedEOS: 'Unexpected end of input', - UnexpectedIdentifier: 'Unexpected identifier', - UnexpectedNumber: 'Unexpected number', - UnexpectedReserved: 'Unexpected reserved word', - UnexpectedString: 'Unexpected string', - UnexpectedTemplate: 'Unexpected quasi %0', - UnexpectedToken: 'Unexpected token %0', - UnexpectedTokenIllegal: 'Unexpected token ILLEGAL', - UnknownLabel: 'Undefined label \'%0\'', - UnterminatedRegExp: 'Invalid regular expression: missing /' - }; - - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var assert_1 = __webpack_require__(9); - var character_1 = __webpack_require__(4); - var messages_1 = __webpack_require__(11); - function hexValue(ch) { - return '0123456789abcdef'.indexOf(ch.toLowerCase()); - } - function octalValue(ch) { - return '01234567'.indexOf(ch); - } - var Scanner = (function () { - function Scanner(code, handler) { - this.source = code; - this.errorHandler = handler; - this.trackComment = false; - this.isModule = false; - this.length = code.length; - this.index = 0; - this.lineNumber = (code.length > 0) ? 1 : 0; - this.lineStart = 0; - this.curlyStack = []; - } - Scanner.prototype.saveState = function () { - return { - index: this.index, - lineNumber: this.lineNumber, - lineStart: this.lineStart - }; - }; - Scanner.prototype.restoreState = function (state) { - this.index = state.index; - this.lineNumber = state.lineNumber; - this.lineStart = state.lineStart; - }; - Scanner.prototype.eof = function () { - return this.index >= this.length; - }; - Scanner.prototype.throwUnexpectedToken = function (message) { - if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } - return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); - }; - Scanner.prototype.tolerateUnexpectedToken = function (message) { - if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } - this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); - }; - // https://tc39.github.io/ecma262/#sec-comments - Scanner.prototype.skipSingleLineComment = function (offset) { - var comments = []; - var start, loc; - if (this.trackComment) { - comments = []; - start = this.index - offset; - loc = { - start: { - line: this.lineNumber, - column: this.index - this.lineStart - offset - }, - end: {} - }; - } - while (!this.eof()) { - var ch = this.source.charCodeAt(this.index); - ++this.index; - if (character_1.Character.isLineTerminator(ch)) { - if (this.trackComment) { - loc.end = { - line: this.lineNumber, - column: this.index - this.lineStart - 1 - }; - var entry = { - multiLine: false, - slice: [start + offset, this.index - 1], - range: [start, this.index - 1], - loc: loc - }; - comments.push(entry); - } - if (ch === 13 && this.source.charCodeAt(this.index) === 10) { - ++this.index; - } - ++this.lineNumber; - this.lineStart = this.index; - return comments; - } - } - if (this.trackComment) { - loc.end = { - line: this.lineNumber, - column: this.index - this.lineStart - }; - var entry = { - multiLine: false, - slice: [start + offset, this.index], - range: [start, this.index], - loc: loc - }; - comments.push(entry); - } - return comments; - }; - Scanner.prototype.skipMultiLineComment = function () { - var comments = []; - var start, loc; - if (this.trackComment) { - comments = []; - start = this.index - 2; - loc = { - start: { - line: this.lineNumber, - column: this.index - this.lineStart - 2 - }, - end: {} - }; - } - while (!this.eof()) { - var ch = this.source.charCodeAt(this.index); - if (character_1.Character.isLineTerminator(ch)) { - if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) { - ++this.index; - } - ++this.lineNumber; - ++this.index; - this.lineStart = this.index; - } - else if (ch === 0x2A) { - // Block comment ends with '*/'. - if (this.source.charCodeAt(this.index + 1) === 0x2F) { - this.index += 2; - if (this.trackComment) { - loc.end = { - line: this.lineNumber, - column: this.index - this.lineStart - }; - var entry = { - multiLine: true, - slice: [start + 2, this.index - 2], - range: [start, this.index], - loc: loc - }; - comments.push(entry); - } - return comments; - } - ++this.index; - } - else { - ++this.index; - } - } - // Ran off the end of the file - the whole thing is a comment - if (this.trackComment) { - loc.end = { - line: this.lineNumber, - column: this.index - this.lineStart - }; - var entry = { - multiLine: true, - slice: [start + 2, this.index], - range: [start, this.index], - loc: loc - }; - comments.push(entry); - } - this.tolerateUnexpectedToken(); - return comments; - }; - Scanner.prototype.scanComments = function () { - var comments; - if (this.trackComment) { - comments = []; - } - var start = (this.index === 0); - while (!this.eof()) { - var ch = this.source.charCodeAt(this.index); - if (character_1.Character.isWhiteSpace(ch)) { - ++this.index; - } - else if (character_1.Character.isLineTerminator(ch)) { - ++this.index; - if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) { - ++this.index; - } - ++this.lineNumber; - this.lineStart = this.index; - start = true; - } - else if (ch === 0x2F) { - ch = this.source.charCodeAt(this.index + 1); - if (ch === 0x2F) { - this.index += 2; - var comment = this.skipSingleLineComment(2); - if (this.trackComment) { - comments = comments.concat(comment); - } - start = true; - } - else if (ch === 0x2A) { - this.index += 2; - var comment = this.skipMultiLineComment(); - if (this.trackComment) { - comments = comments.concat(comment); - } - } - else { - break; - } - } - else if (start && ch === 0x2D) { - // U+003E is '>' - if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) { - // '-->' is a single-line comment - this.index += 3; - var comment = this.skipSingleLineComment(3); - if (this.trackComment) { - comments = comments.concat(comment); - } - } - else { - break; - } - } - else if (ch === 0x3C && !this.isModule) { - if (this.source.slice(this.index + 1, this.index + 4) === '!--') { - this.index += 4; // `' is a single-line comment + this.index += 3; + var comment = this.skipSingleLineComment(3); + if (this.trackComment) { + comments = comments.concat(comment); + } + } + else { + break; + } + } + else if (ch === 0x3C && !this.isModule) { + if (this.source.slice(this.index + 1, this.index + 4) === '!--') { + this.index += 4; // `WmsI-x{B|BsBVT`OJq#b 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%0Dr|JO`nFbWk=g&| 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 Date: Tue, 6 Aug 2024 14:57:21 +0100 Subject: [PATCH 10/16] Just to trigger GitHub action --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c22484e..c804f52 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Jackdaw Javascript source-to-source compiler based on the LARA framework. - + # Resources A ZIP file with the compiled JAR for Jackdaw can be downloaded from [here](http://specs.fe.up.pt/tools/jackdaw.zip) ([previous releases](https://drive.google.com/drive/folders/1-y97JkfvLIPslDL7sjbjf1h4mRa9Eqzo?usp=sharing)). From 8aedbf853a2df4025cad255b43dfa91c3da2c3f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Wed, 7 Aug 2024 11:56:35 +0100 Subject: [PATCH 11/16] Changes lara-js workflow to Gradle instead of Eclipse build --- .github/workflows/ant-lara-js.yml | 60 +++++++++++++++---------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ant-lara-js.yml b/.github/workflows/ant-lara-js.yml index d36e81d..81d5871 100644 --- a/.github/workflows/ant-lara-js.yml +++ b/.github/workflows/ant-lara-js.yml @@ -21,49 +21,45 @@ jobs: runs-on: ubuntu-latest - #defaults: - # run: - # working-directory: ./.. - steps: - uses: actions/checkout@v4 # Because of scheduled runs, by default run on default branch with: ref: ts-conversion + path: workspace/jsweaver - - name: Cache ivy dependencies - id: cache-nivy - uses: actions/cache@v3 - env: - cache-name: cache-ivy-dependencies - with: - # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS - path: ~/.ivy2 - key: ${{ runner.os }}-build-${{ env.cache-name }} - - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - - name: Generate build.xml - run: | - wget -q -N http://specs.fe.up.pt/tools/eclipse-build.jar - java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=feature/lara-js ./ - wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar - - name: Build with Ant - run: | - ant -noinput -buildfile build.xml + - name: Check out specs-java-libs repo + uses: actions/checkout@v4 + with: + repository: specs-feup/specs-java-libs + path: workspace/specs-java-libs + + - name: Check out lara-framework repo + uses: actions/checkout@v4 + with: + repository: specs-feup/lara-framework + ref: feature/lara-js + path: workspace/lara-framework + + # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies. + # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md + - name: Setup Gradle + uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 + + # Setting up gradle multi-project would be helpful + - name: Build and Test Jackdaw + working-directory: workspace/jsweaver/jsweaver + run: gradle build test - - name: List directory - run: | - echo "Current folder" - ls - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3.6.1 - if: always() # always run even if the previous step fails + - name: Publish Test Report + uses: mikepenz/action-junit-report@v4 + if: always() with: - report_paths: '**/reports-eclipse-build/TEST-*.xml' + report_paths: 'workspace/jsweaver/**/build/test-results/test/TEST-*.xml' summary: true - #exclude_sources: '' From c3097e96443a309166655eb47a7454b746308cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Wed, 7 Aug 2024 11:59:17 +0100 Subject: [PATCH 12/16] Removes files committed to bin folder --- jsweaver/bin/jackdaw/lara/code/Logger.lara | 48 ------------------- jsweaver/bin/jackdaw/tests/File.lara | 10 ---- .../bin/jackdaw/tests/IfStatementTest.lara | 9 ---- jsweaver/bin/jackdaw/tests/Insert.lara | 8 ---- .../bin/jackdaw/tests/results/File.lara.txt | 1 - .../tests/results/IfStatementTest.lara.txt | 1 - .../bin/jackdaw/tests/results/Insert.lara.txt | 1 - jsweaver/bin/jackdaw/tests/src/file.js | 0 jsweaver/bin/jackdaw/tests/src/insert.js | 4 -- .../bin/jackdaw/tests/src/test-ifStatement.js | 4 -- 10 files changed, 86 deletions(-) delete mode 100644 jsweaver/bin/jackdaw/lara/code/Logger.lara delete mode 100644 jsweaver/bin/jackdaw/tests/File.lara delete mode 100644 jsweaver/bin/jackdaw/tests/IfStatementTest.lara delete mode 100644 jsweaver/bin/jackdaw/tests/Insert.lara delete mode 100644 jsweaver/bin/jackdaw/tests/results/File.lara.txt delete mode 100644 jsweaver/bin/jackdaw/tests/results/IfStatementTest.lara.txt delete mode 100644 jsweaver/bin/jackdaw/tests/results/Insert.lara.txt delete mode 100644 jsweaver/bin/jackdaw/tests/src/file.js delete mode 100644 jsweaver/bin/jackdaw/tests/src/insert.js delete mode 100644 jsweaver/bin/jackdaw/tests/src/test-ifStatement.js diff --git a/jsweaver/bin/jackdaw/lara/code/Logger.lara b/jsweaver/bin/jackdaw/lara/code/Logger.lara deleted file mode 100644 index acc51c6..0000000 --- a/jsweaver/bin/jackdaw/lara/code/Logger.lara +++ /dev/null @@ -1,48 +0,0 @@ -import lara.code.LoggerBase; - -/** - * Appends a variable. - */ -Logger.prototype.appendVar = function(variable) { - return this._append_private(variable, this.Type.LITERAL); -} - -/** - * Appends a variable. - */ -Logger.prototype.variable = function(variable) { - return this.appendVar(variable); -} - -/** - * Adds code that prints the message built up to that point with the append() functions. - * - */ -Logger.prototype.log = function($jp, insertBefore) { - if(this.filename !== undefined) { - println("Logging to files is not supported yet"); - return; - } - - var message = this.currentElements.map(function(element) { - if(element.type === this.Type.NORMAL) { - return '"' + element.content + '"'; - } - - return element.content; - }, this).join(" + "); - - var logCode = %{console.log([[message]]);}%; - //var logCode = _console_print(message); - - println("LOG CODE: " + logCode); - if(insertBefore) { - $jp.insert before logCode; - } else { - $jp.insert after logCode; - } -} - -codedef _console_print(message) %{ -console.log([[message]]); -}% end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/File.lara b/jsweaver/bin/jackdaw/tests/File.lara deleted file mode 100644 index 54dc3a0..0000000 --- a/jsweaver/bin/jackdaw/tests/File.lara +++ /dev/null @@ -1,10 +0,0 @@ -import lara.Io; - -aspectdef FileTest - - select file end - apply - println("filepath:"+ Io.getPath($file.path).getName()); - end - -end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/IfStatementTest.lara b/jsweaver/bin/jackdaw/tests/IfStatementTest.lara deleted file mode 100644 index 4710ce1..0000000 --- a/jsweaver/bin/jackdaw/tests/IfStatementTest.lara +++ /dev/null @@ -1,9 +0,0 @@ -aspectdef Test - select file.ifStatement end - apply - if($ifStatement.test.instanceOf("literal")){ - println("Test expression: " + $ifStatement.test.raw); - } - - end -end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/Insert.lara b/jsweaver/bin/jackdaw/tests/Insert.lara deleted file mode 100644 index c8ffb2e..0000000 --- a/jsweaver/bin/jackdaw/tests/Insert.lara +++ /dev/null @@ -1,8 +0,0 @@ -aspectdef InsertTest - select file.functionDeclaration end - apply - var functionName = $functionDeclaration.id.name; - $functionDeclaration.insert after "let a = 2"; - println("Inserted code"); - end -end \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/results/File.lara.txt b/jsweaver/bin/jackdaw/tests/results/File.lara.txt deleted file mode 100644 index a7773f9..0000000 --- a/jsweaver/bin/jackdaw/tests/results/File.lara.txt +++ /dev/null @@ -1 +0,0 @@ -filepath:file.js \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/results/IfStatementTest.lara.txt b/jsweaver/bin/jackdaw/tests/results/IfStatementTest.lara.txt deleted file mode 100644 index 571c2d4..0000000 --- a/jsweaver/bin/jackdaw/tests/results/IfStatementTest.lara.txt +++ /dev/null @@ -1 +0,0 @@ -Test expression: true \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/results/Insert.lara.txt b/jsweaver/bin/jackdaw/tests/results/Insert.lara.txt deleted file mode 100644 index 7fadb1c..0000000 --- a/jsweaver/bin/jackdaw/tests/results/Insert.lara.txt +++ /dev/null @@ -1 +0,0 @@ -Inserted code \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/src/file.js b/jsweaver/bin/jackdaw/tests/src/file.js deleted file mode 100644 index e69de29..0000000 diff --git a/jsweaver/bin/jackdaw/tests/src/insert.js b/jsweaver/bin/jackdaw/tests/src/insert.js deleted file mode 100644 index d0e4044..0000000 --- a/jsweaver/bin/jackdaw/tests/src/insert.js +++ /dev/null @@ -1,4 +0,0 @@ - -function testFunction(a,b,c){ - -} \ No newline at end of file diff --git a/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js b/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js deleted file mode 100644 index 59f9014..0000000 --- a/jsweaver/bin/jackdaw/tests/src/test-ifStatement.js +++ /dev/null @@ -1,4 +0,0 @@ -if(true) -{ - let a = 1 -} \ No newline at end of file From 478c0de3d892f4889b8a6fed52a196ac9a3cebe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Wed, 7 Aug 2024 11:59:54 +0100 Subject: [PATCH 13/16] Adds bin folder to .gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6bc835c..8e9a585 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -bin/ +**/bin/** ### Gradle **/.gradle/** @@ -8,4 +8,4 @@ bin/ **/run/** !**/run/*.launch !**/run/*.deploy -**/run/*-local.launch +**/run/*-local.launch \ No newline at end of file From 47f4dc557b57b240e70fb0dadbe38055ea902980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Fri, 9 Aug 2024 22:36:39 +0100 Subject: [PATCH 14/16] Removes workflows not related to this branch --- .github/workflows/ant-lara-2.0-legacy.yml | 62 -------------------- .github/workflows/ant-main.yml | 67 ---------------------- .github/workflows/ant-staging.yml | 70 ----------------------- 3 files changed, 199 deletions(-) delete mode 100644 .github/workflows/ant-lara-2.0-legacy.yml delete mode 100644 .github/workflows/ant-main.yml delete mode 100644 .github/workflows/ant-staging.yml diff --git a/.github/workflows/ant-lara-2.0-legacy.yml b/.github/workflows/ant-lara-2.0-legacy.yml deleted file mode 100644 index c2fb6bc..0000000 --- a/.github/workflows/ant-lara-2.0-legacy.yml +++ /dev/null @@ -1,62 +0,0 @@ -# This workflow will build a Java project with Ant -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant - -name: Java CI - Lara 2.0 Legacy - -on: - push: - branches: [ lara-2.0-legacy ] - pull_request: - branches: [ lara-2.0-legacy ] - - # Daily at midnight - schedule: - - cron: '0 0 * * *' - -permissions: - checks: write - -jobs: - build: - - runs-on: ubuntu-latest - - - steps: - - uses: actions/checkout@v3 - - - name: Cache ivy dependencies - id: cache-nivy - uses: actions/cache@v3 - env: - cache-name: cache-ivy-dependencies - with: - # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS - path: ~/.ivy2 - key: ${{ runner.os }}-build-${{ env.cache-name }} - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - name: Generate build.xml - run: | - wget -N http://specs.fe.up.pt/tools/eclipse-build.jar - java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=lara-2.0-legacy ./ - wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar - - name: Build with Ant - run: | - ant -noinput -buildfile build.xml - #- name: Copy test results - # run: | - # Tried relative paths (not supported by junit action) and symlinks (are not followed by glob) - # Resorted to copying the tests to a folder in the repo folder - # cp -a reports-eclipse-build/. jsweaver/junit-reports/ - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3.0.1 - if: always() # always run even if the previous step fails - with: - report_paths: '**/reports-eclipse-build/TEST-*.xml' - summary: true - #exclude_sources: '' diff --git a/.github/workflows/ant-main.yml b/.github/workflows/ant-main.yml deleted file mode 100644 index 4deed3c..0000000 --- a/.github/workflows/ant-main.yml +++ /dev/null @@ -1,67 +0,0 @@ -# This workflow will build a Java project with Ant -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant - -name: Java CI - Main - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - - # Daily at midnight - schedule: - - cron: '0 0 * * *' - -permissions: - checks: write - -jobs: - build: - - runs-on: ubuntu-latest - - - steps: - - uses: actions/checkout@v4 - # Because of scheduled runs, by default run on default branch - with: - ref: master - - - name: Cache ivy dependencies - id: cache-nivy - uses: actions/cache@v3 - env: - cache-name: cache-ivy-dependencies - with: - # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS - path: ~/.ivy2 - key: ${{ runner.os }}-build-${{ env.cache-name }} - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - - name: Generate build.xml - run: | - wget -q -N http://specs.fe.up.pt/tools/eclipse-build.jar - java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework ./ - wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar - - name: Build with Ant - run: | - ant -noinput -buildfile build.xml - - - name: List directory - run: | - echo "Current folder" - ls - - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3.6.1 - if: always() # always run even if the previous step fails - with: - report_paths: '**/reports-eclipse-build/TEST-*.xml' - summary: true - #exclude_sources: '' diff --git a/.github/workflows/ant-staging.yml b/.github/workflows/ant-staging.yml deleted file mode 100644 index 5f10f96..0000000 --- a/.github/workflows/ant-staging.yml +++ /dev/null @@ -1,70 +0,0 @@ -# This workflow will build a Java project with Ant -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant - -name: Java CI - Staging - -on: - push: - branches: [ staging ] - pull_request: - branches: [ staging ] - - # Daily at midnight - schedule: - - cron: '0 0 * * *' - -permissions: - checks: write - -jobs: - build: - - runs-on: ubuntu-latest - - #defaults: - # run: - # working-directory: ./.. - - steps: - - uses: actions/checkout@v4 - # Because of scheduled runs, by default run on default branch - with: - ref: staging - - - name: Cache ivy dependencies - id: cache-nivy - uses: actions/cache@v3 - env: - cache-name: cache-ivy-dependencies - with: - # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS - path: ~/.ivy2 - key: ${{ runner.os }}-build-${{ env.cache-name }} - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - - name: Generate build.xml - run: | - wget -q -N http://specs.fe.up.pt/tools/eclipse-build.jar - java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=staging ./ - wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar - - name: Build with Ant - run: | - ant -noinput -buildfile build.xml - - - name: List directory - run: | - echo "Current folder" - ls - - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3.6.1 - if: always() # always run even if the previous step fails - with: - report_paths: '**/reports-eclipse-build/TEST-*.xml' - summary: true - #exclude_sources: '' From bd82f6fae728360440e7025bbad6d84122e7b1db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Fri, 9 Aug 2024 22:40:44 +0100 Subject: [PATCH 15/16] Re-adds workflows, because of PR - This branch should have only had its own workflow, but now that they have been in the branch, they should stay until the PR; --- .github/workflows/ant-lara-2.0-legacy.yml | 62 ++++++++++++++++++++ .github/workflows/ant-main.yml | 67 ++++++++++++++++++++++ .github/workflows/ant-staging.yml | 70 +++++++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 .github/workflows/ant-lara-2.0-legacy.yml create mode 100644 .github/workflows/ant-main.yml create mode 100644 .github/workflows/ant-staging.yml diff --git a/.github/workflows/ant-lara-2.0-legacy.yml b/.github/workflows/ant-lara-2.0-legacy.yml new file mode 100644 index 0000000..c2fb6bc --- /dev/null +++ b/.github/workflows/ant-lara-2.0-legacy.yml @@ -0,0 +1,62 @@ +# This workflow will build a Java project with Ant +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant + +name: Java CI - Lara 2.0 Legacy + +on: + push: + branches: [ lara-2.0-legacy ] + pull_request: + branches: [ lara-2.0-legacy ] + + # Daily at midnight + schedule: + - cron: '0 0 * * *' + +permissions: + checks: write + +jobs: + build: + + runs-on: ubuntu-latest + + + steps: + - uses: actions/checkout@v3 + + - name: Cache ivy dependencies + id: cache-nivy + uses: actions/cache@v3 + env: + cache-name: cache-ivy-dependencies + with: + # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS + path: ~/.ivy2 + key: ${{ runner.os }}-build-${{ env.cache-name }} + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Generate build.xml + run: | + wget -N http://specs.fe.up.pt/tools/eclipse-build.jar + java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=lara-2.0-legacy ./ + wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar + - name: Build with Ant + run: | + ant -noinput -buildfile build.xml + #- name: Copy test results + # run: | + # Tried relative paths (not supported by junit action) and symlinks (are not followed by glob) + # Resorted to copying the tests to a folder in the repo folder + # cp -a reports-eclipse-build/. jsweaver/junit-reports/ + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3.0.1 + if: always() # always run even if the previous step fails + with: + report_paths: '**/reports-eclipse-build/TEST-*.xml' + summary: true + #exclude_sources: '' diff --git a/.github/workflows/ant-main.yml b/.github/workflows/ant-main.yml new file mode 100644 index 0000000..4deed3c --- /dev/null +++ b/.github/workflows/ant-main.yml @@ -0,0 +1,67 @@ +# This workflow will build a Java project with Ant +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant + +name: Java CI - Main + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + + # Daily at midnight + schedule: + - cron: '0 0 * * *' + +permissions: + checks: write + +jobs: + build: + + runs-on: ubuntu-latest + + + steps: + - uses: actions/checkout@v4 + # Because of scheduled runs, by default run on default branch + with: + ref: master + + - name: Cache ivy dependencies + id: cache-nivy + uses: actions/cache@v3 + env: + cache-name: cache-ivy-dependencies + with: + # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS + path: ~/.ivy2 + key: ${{ runner.os }}-build-${{ env.cache-name }} + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Generate build.xml + run: | + wget -q -N http://specs.fe.up.pt/tools/eclipse-build.jar + java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework ./ + wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar + - name: Build with Ant + run: | + ant -noinput -buildfile build.xml + + - name: List directory + run: | + echo "Current folder" + ls + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3.6.1 + if: always() # always run even if the previous step fails + with: + report_paths: '**/reports-eclipse-build/TEST-*.xml' + summary: true + #exclude_sources: '' diff --git a/.github/workflows/ant-staging.yml b/.github/workflows/ant-staging.yml new file mode 100644 index 0000000..5f10f96 --- /dev/null +++ b/.github/workflows/ant-staging.yml @@ -0,0 +1,70 @@ +# This workflow will build a Java project with Ant +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-ant + +name: Java CI - Staging + +on: + push: + branches: [ staging ] + pull_request: + branches: [ staging ] + + # Daily at midnight + schedule: + - cron: '0 0 * * *' + +permissions: + checks: write + +jobs: + build: + + runs-on: ubuntu-latest + + #defaults: + # run: + # working-directory: ./.. + + steps: + - uses: actions/checkout@v4 + # Because of scheduled runs, by default run on default branch + with: + ref: staging + + - name: Cache ivy dependencies + id: cache-nivy + uses: actions/cache@v3 + env: + cache-name: cache-ivy-dependencies + with: + # ivy dependencies cache files are stored in `~/.ivy2` on Linux/macOS + path: ~/.ivy2 + key: ${{ runner.os }}-build-${{ env.cache-name }} + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Generate build.xml + run: | + wget -q -N http://specs.fe.up.pt/tools/eclipse-build.jar + java -jar eclipse-build.jar https://github.com/specs-feup/specs-java-libs https://github.com/specs-feup/lara-framework?commit=staging ./ + wget -N -O /usr/share/ant/lib/ivy-2.5.0.jar specs.fe.up.pt/libs/ivy-2.5.0.jar + - name: Build with Ant + run: | + ant -noinput -buildfile build.xml + + - name: List directory + run: | + echo "Current folder" + ls + + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3.6.1 + if: always() # always run even if the previous step fails + with: + report_paths: '**/reports-eclipse-build/TEST-*.xml' + summary: true + #exclude_sources: '' From 39808936cf131915059b6af2f1703a1237f1c3a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Bispo?= Date: Sat, 10 Aug 2024 15:44:30 +0100 Subject: [PATCH 16/16] Trigger workflow run --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c804f52..ddd22e1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Jackdaw Javascript source-to-source compiler based on the LARA framework. + # Resources