astexplorer.app
Version:
https://astexplorer.net with ES Modules support and Hot Reloading
1 lines • 991 kB
JavaScript
(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{"./node_modules/node-libs-browser/mock/empty.js":function(module,exports){eval("\n\n//# sourceURL=webpack:///./node_modules/node-libs-browser/mock/empty.js?")},"./node_modules/solidity-parser-diligence/dist/ASTBuilder.js":function(module,exports,__webpack_require__){"use strict";eval("\n\nvar antlr4 = __webpack_require__(\"./node_modules/solidity-parser-diligence/dist/antlr4/index.js\");\n\nfunction toText(ctx) {\n if (ctx !== null) {\n return ctx.getText();\n }\n return null;\n}\n\nfunction mapCommasToNulls(children) {\n if (children.length === 0) {\n return [];\n }\n\n var values = [];\n var comma = true;\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var el = _step.value;\n\n if (comma) {\n if (toText(el) === ',') {\n values.push(null);\n } else {\n values.push(el);\n comma = false;\n }\n } else {\n if (toText(el) !== ',') {\n throw new Error('expected comma');\n }\n comma = true;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n if (comma) {\n values.push(null);\n }\n\n return values;\n}\n\nfunction isBinOp(op) {\n var binOps = ['+', '-', '*', '/', '**', '%', '<<', '>>', '&&', '||', '&', '|', '^', '<', '>', '<=', '>=', '==', '!=', '=', '|=', '^=', '&=', '<<=', '>>=', '+=', '-=', '*=', '/=', '%='];\n return binOps.includes(op);\n}\n\nvar transformAST = {\n SourceUnit: function SourceUnit(ctx) {\n // last element is EOF terminal node\n return {\n children: this.visit(ctx.children.slice(0, -1))\n };\n },\n EnumDefinition: function EnumDefinition(ctx) {\n return {\n name: toText(ctx.identifier()),\n members: this.visit(ctx.enumValue())\n };\n },\n EnumValue: function EnumValue(ctx) {\n return {\n name: toText(ctx.identifier())\n };\n },\n UsingForDeclaration: function UsingForDeclaration(ctx) {\n var typeName = null;\n if (toText(ctx.getChild(3)) !== '*') {\n typeName = this.visit(ctx.getChild(3));\n }\n\n return {\n typeName: typeName,\n libraryName: toText(ctx.identifier())\n };\n },\n PragmaDirective: function PragmaDirective(ctx) {\n return {\n name: toText(ctx.pragmaName()),\n value: toText(ctx.pragmaValue())\n };\n },\n ContractDefinition: function ContractDefinition(ctx) {\n var name = toText(ctx.identifier());\n var kind = toText(ctx.getChild(0));\n\n this._currentContract = name;\n\n return {\n name: name,\n baseContracts: this.visit(ctx.inheritanceSpecifier()),\n subNodes: this.visit(ctx.contractPart()),\n kind: kind\n };\n },\n InheritanceSpecifier: function InheritanceSpecifier(ctx) {\n var exprList = ctx.expressionList();\n var args = exprList != null ? this.visit(exprList.expression()) : [];\n\n return {\n baseName: this.visit(ctx.userDefinedTypeName()),\n arguments: args\n };\n },\n ContractPart: function ContractPart(ctx) {\n return this.visit(ctx.children[0]);\n },\n FunctionDefinition: function FunctionDefinition(ctx) {\n var _this = this;\n\n var isConstructor = false;\n var isFallback = false;\n var isReceiveEther = false;\n var isVirtual = false;\n var name = null;\n var parameters = [];\n var returnParameters = null;\n var visibility = 'default';\n\n var block = null;\n if (ctx.block()) {\n block = this.visit(ctx.block());\n }\n\n var modifiers = ctx.modifierList().modifierInvocation().map(function (mod) {\n return _this.visit(mod);\n });\n\n var stateMutability = null;\n if (ctx.modifierList().stateMutability(0)) {\n stateMutability = toText(ctx.modifierList().stateMutability(0));\n }\n\n // see what type of function we're dealing with\n switch (toText(ctx.functionDescriptor().getChild(0))) {\n case 'constructor':\n parameters = this.visit(ctx.parameterList());\n\n if (ctx.returnParameters() && ctx.returnParameters().parameterList().parameter().length > 0) {\n throw new Error('Constructors cannot have return parameters');\n }\n\n // error out on incorrect function visibility\n if (ctx.modifierList().InternalKeyword(0)) {\n visibility = 'internal';\n } else if (ctx.modifierList().PublicKeyword(0)) {\n visibility = 'public';\n } else {\n throw new Error('Constructors have to be declared either \"public\" or \"internal\"');\n }\n\n isConstructor = true;\n break;\n case 'fallback':\n if (ctx.parameterList().parameter().length > 0) {\n throw new Error('Fallback functions cannot have parameters');\n }\n\n if (ctx.returnParameters() && ctx.returnParameters().parameterList().parameter().length > 0) {\n throw new Error('Fallback functions cannot have return parameters');\n }\n\n // error out on incorrect function visibility\n if (!ctx.modifierList().ExternalKeyword(0)) {\n throw new Error('Fallback functions have to be declared \"external\"');\n }\n visibility = 'external';\n\n isFallback = true;\n break;\n case 'receive':\n if (ctx.parameterList().parameter().length > 0) {\n throw new Error('Receive Ether functions cannot have parameters');\n }\n\n if (ctx.returnParameters() && ctx.returnParameters().parameterList().parameter().length > 0) {\n throw new Error('Receive Ether functions cannot have return parameters');\n }\n\n // error out on incorrect function visibility\n if (!ctx.modifierList().ExternalKeyword(0)) {\n throw new Error('Receive Ether functions have to be declared \"external\"');\n }\n visibility = 'external';\n\n // error out on incorrect function payability\n if (!ctx.modifierList().stateMutability(0) || !ctx.modifierList().stateMutability(0).PayableKeyword(0)) {\n throw new Error('Receive Ether functions have to be declared \"payable\"');\n }\n\n isReceiveEther = true;\n break;\n case 'function':\n name = ctx.functionDescriptor().identifier(0) ? toText(ctx.functionDescriptor().identifier(0)) : '';\n\n parameters = this.visit(ctx.parameterList());\n returnParameters = this.visit(ctx.returnParameters());\n\n // parse function visibility\n if (ctx.modifierList().ExternalKeyword(0)) {\n visibility = 'external';\n } else if (ctx.modifierList().InternalKeyword(0)) {\n visibility = 'internal';\n } else if (ctx.modifierList().PublicKeyword(0)) {\n visibility = 'public';\n } else if (ctx.modifierList().PrivateKeyword(0)) {\n visibility = 'private';\n }\n\n // check if function is virtual\n if (ctx.modifierList().VirtualKeyword(0)) {\n isVirtual = true;\n }\n\n isConstructor = name === this._currentContract;\n isFallback = name === '';\n break;\n }\n\n return {\n name: name,\n parameters: parameters,\n returnParameters: returnParameters,\n body: block,\n visibility: visibility,\n modifiers: modifiers,\n isConstructor: isConstructor,\n isReceiveEther: isReceiveEther,\n isFallback: isFallback,\n isVirtual: isVirtual,\n stateMutability: stateMutability\n };\n },\n ModifierInvocation: function ModifierInvocation(ctx) {\n var exprList = ctx.expressionList();\n\n var args = void 0;\n if (exprList != null) {\n args = this.visit(exprList.expression());\n } else if (ctx.children.length > 1) {\n args = [];\n } else {\n args = null;\n }\n\n return {\n name: toText(ctx.identifier()),\n arguments: args\n };\n },\n TypeNameExpression: function TypeNameExpression(ctx) {\n var typeName = ctx.elementaryTypeName();\n if (typeName === null) {\n typeName = ctx.userDefinedTypeName();\n }\n return {\n typeName: this.visit(typeName)\n };\n },\n TypeName: function TypeName(ctx) {\n if (ctx.children.length > 2) {\n var length = null;\n if (ctx.children.length === 4) {\n length = this.visit(ctx.getChild(2));\n }\n\n return {\n type: 'ArrayTypeName',\n baseTypeName: this.visit(ctx.typeName()),\n length: length\n };\n }\n if (ctx.children.length === 2) {\n return {\n type: 'ElementaryTypeName',\n name: toText(ctx.getChild(0)),\n stateMutability: toText(ctx.getChild(1))\n };\n }\n return this.visit(ctx.getChild(0));\n },\n FunctionTypeName: function FunctionTypeName(ctx) {\n var _this2 = this;\n\n var parameterTypes = ctx.functionTypeParameterList(0).functionTypeParameter().map(function (typeCtx) {\n return _this2.visit(typeCtx);\n });\n\n var returnTypes = [];\n if (ctx.functionTypeParameterList(1)) {\n returnTypes = ctx.functionTypeParameterList(1).functionTypeParameter().map(function (typeCtx) {\n return _this2.visit(typeCtx);\n });\n }\n\n var visibility = 'default';\n if (ctx.InternalKeyword(0)) {\n visibility = 'internal';\n } else if (ctx.ExternalKeyword(0)) {\n visibility = 'external';\n }\n\n var stateMutability = null;\n if (ctx.stateMutability(0)) {\n stateMutability = toText(ctx.stateMutability(0));\n }\n\n return {\n parameterTypes: parameterTypes,\n returnTypes: returnTypes,\n visibility: visibility,\n stateMutability: stateMutability\n };\n },\n ReturnStatement: function ReturnStatement(ctx) {\n var expression = null;\n if (ctx.expression()) {\n expression = this.visit(ctx.expression());\n }\n\n return { expression: expression };\n },\n EmitStatement: function EmitStatement(ctx) {\n return {\n eventCall: this.visit(ctx.functionCall())\n };\n },\n FunctionCall: function FunctionCall(ctx) {\n var _this3 = this;\n\n var args = [];\n var names = [];\n\n var ctxArgs = ctx.functionCallArguments();\n if (ctxArgs.expressionList()) {\n args = ctxArgs.expressionList().expression().map(function (exprCtx) {\n return _this3.visit(exprCtx);\n });\n } else if (ctxArgs.nameValueList()) {\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = ctxArgs.nameValueList().nameValue()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var nameValue = _step2.value;\n\n args.push(this.visit(nameValue.expression()));\n names.push(toText(nameValue.identifier()));\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n }\n\n return {\n expression: this.visit(ctx.expression()),\n arguments: args,\n names: names\n };\n },\n StructDefinition: function StructDefinition(ctx) {\n return {\n name: toText(ctx.identifier()),\n members: this.visit(ctx.variableDeclaration())\n };\n },\n VariableDeclaration: function VariableDeclaration(ctx) {\n var storageLocation = null;\n if (ctx.storageLocation()) {\n storageLocation = toText(ctx.storageLocation());\n }\n\n return {\n typeName: this.visit(ctx.typeName()),\n name: toText(ctx.identifier()),\n storageLocation: storageLocation,\n isStateVar: false,\n isIndexed: false\n };\n },\n EventParameter: function EventParameter(ctx) {\n var storageLocation = null;\n if (ctx.storageLocation(0)) {\n storageLocation = toText(ctx.storageLocation(0));\n }\n\n return {\n type: 'VariableDeclaration',\n typeName: this.visit(ctx.typeName()),\n name: toText(ctx.identifier()),\n storageLocation: storageLocation,\n isStateVar: false,\n isIndexed: !!ctx.IndexedKeyword(0)\n };\n },\n FunctionTypeParameter: function FunctionTypeParameter(ctx) {\n var storageLocation = null;\n if (ctx.storageLocation()) {\n storageLocation = toText(ctx.storageLocation());\n }\n\n return {\n type: 'VariableDeclaration',\n typeName: this.visit(ctx.typeName()),\n name: null,\n storageLocation: storageLocation,\n isStateVar: false,\n isIndexed: false\n };\n },\n WhileStatement: function WhileStatement(ctx) {\n return {\n condition: this.visit(ctx.expression()),\n body: this.visit(ctx.statement())\n };\n },\n DoWhileStatement: function DoWhileStatement(ctx) {\n return {\n condition: this.visit(ctx.expression()),\n body: this.visit(ctx.statement())\n };\n },\n IfStatement: function IfStatement(ctx) {\n var trueBody = this.visit(ctx.statement(0));\n\n var falseBody = null;\n if (ctx.statement().length > 1) {\n falseBody = this.visit(ctx.statement(1));\n }\n\n return {\n condition: this.visit(ctx.expression()),\n trueBody: trueBody,\n falseBody: falseBody\n };\n },\n TryStatement: function TryStatement(ctx) {\n var _this4 = this;\n\n var returnParameters = null;\n if (ctx.returnParameters()) {\n returnParameters = this.visit(ctx.returnParameters());\n }\n\n var catchClauses = ctx.catchClause().map(function (exprCtx) {\n return _this4.visit(exprCtx);\n });\n\n return {\n expression: this.visit(ctx.expression()),\n returnParameters: returnParameters,\n body: this.visit(ctx.block()),\n catchClauses: catchClauses\n };\n },\n CatchClause: function CatchClause(ctx) {\n var parameters = null;\n if (ctx.parameterList()) {\n parameters = this.visit(ctx.parameterList());\n }\n\n if (ctx.identifier() && toText(ctx.identifier()) !== 'Error') {\n throw new Error('Expected \"Error\" identifier in catch clause');\n }\n\n return {\n isReasonStringType: !!(ctx.identifier() && toText(ctx.identifier()) === 'Error'),\n parameters: parameters,\n body: this.visit(ctx.block())\n };\n },\n UserDefinedTypeName: function UserDefinedTypeName(ctx) {\n return {\n namePath: toText(ctx)\n };\n },\n ElementaryTypeName: function ElementaryTypeName(ctx) {\n return {\n name: toText(ctx)\n };\n },\n Block: function Block(ctx) {\n return {\n statements: this.visit(ctx.statement())\n };\n },\n ExpressionStatement: function ExpressionStatement(ctx) {\n return {\n expression: this.visit(ctx.expression())\n };\n },\n NumberLiteral: function NumberLiteral(ctx) {\n var number = toText(ctx.getChild(0));\n var subdenomination = null;\n\n if (ctx.children.length === 2) {\n subdenomination = toText(ctx.getChild(1));\n }\n\n return {\n number: number,\n subdenomination: subdenomination\n };\n },\n Mapping: function Mapping(ctx) {\n return {\n keyType: this.visit(ctx.elementaryTypeName()),\n valueType: this.visit(ctx.typeName())\n };\n },\n ModifierDefinition: function ModifierDefinition(ctx) {\n var parameters = null;\n if (ctx.parameterList()) {\n parameters = this.visit(ctx.parameterList());\n }\n\n return {\n name: toText(ctx.identifier()),\n parameters: parameters,\n body: this.visit(ctx.block())\n };\n },\n Statement: function Statement(ctx) {\n return this.visit(ctx.getChild(0));\n },\n SimpleStatement: function SimpleStatement(ctx) {\n return this.visit(ctx.getChild(0));\n },\n Expression: function Expression(ctx) {\n var _this5 = this;\n\n var op = void 0;\n\n switch (ctx.children.length) {\n case 1:\n // primary expression\n return this.visit(ctx.getChild(0));\n\n case 2:\n op = toText(ctx.getChild(0));\n\n // new expression\n if (op === 'new') {\n return {\n type: 'NewExpression',\n typeName: this.visit(ctx.typeName())\n };\n }\n\n // prefix operators\n if (['+', '-', '++', '--', '!', '~', 'after', 'delete'].includes(op)) {\n return {\n type: 'UnaryOperation',\n operator: op,\n subExpression: this.visit(ctx.getChild(1)),\n isPrefix: true\n };\n }\n\n op = toText(ctx.getChild(1));\n\n // postfix operators\n if (['++', '--'].includes(op)) {\n return {\n type: 'UnaryOperation',\n operator: op,\n subExpression: this.visit(ctx.getChild(0)),\n isPrefix: false\n };\n }\n break;\n\n case 3:\n // treat parenthesis as no-op\n if (toText(ctx.getChild(0)) === '(' && toText(ctx.getChild(2)) === ')') {\n return {\n type: 'TupleExpression',\n components: [this.visit(ctx.getChild(1))],\n isArray: false\n };\n }\n\n // if square parenthesis are present it can only be\n // a typename expression\n if (toText(ctx.getChild(1)) === '[' && toText(ctx.getChild(2)) === ']') {\n return {\n \"type\": \"TypeNameExpression\",\n \"typeName\": {\n \"type\": \"ArrayTypeName\",\n \"baseTypeName\": this.visit(ctx.getChild(0)),\n \"length\": null\n }\n };\n }\n\n op = toText(ctx.getChild(1));\n\n // tuple separator\n if (op === ',') {\n return {\n type: 'TupleExpression',\n components: [this.visit(ctx.getChild(0)), this.visit(ctx.getChild(2))],\n isArray: false\n };\n }\n\n // member access\n if (op === '.') {\n return {\n type: 'MemberAccess',\n expression: this.visit(ctx.getChild(0)),\n memberName: toText(ctx.getChild(2))\n };\n }\n\n if (isBinOp(op)) {\n return {\n type: 'BinaryOperation',\n operator: op,\n left: this.visit(ctx.getChild(0)),\n right: this.visit(ctx.getChild(2))\n };\n }\n break;\n\n case 4:\n // function call\n if (toText(ctx.getChild(1)) === '(' && toText(ctx.getChild(3)) === ')') {\n var args = [];\n var names = [];\n\n var ctxArgs = ctx.functionCallArguments();\n if (ctxArgs.expressionList()) {\n args = ctxArgs.expressionList().expression().map(function (exprCtx) {\n return _this5.visit(exprCtx);\n });\n } else if (ctxArgs.nameValueList()) {\n var _iteratorNormalCompletion3 = true;\n var _didIteratorError3 = false;\n var _iteratorError3 = undefined;\n\n try {\n for (var _iterator3 = ctxArgs.nameValueList().nameValue()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n var nameValue = _step3.value;\n\n args.push(this.visit(nameValue.expression()));\n names.push(toText(nameValue.identifier()));\n }\n } catch (err) {\n _didIteratorError3 = true;\n _iteratorError3 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion3 && _iterator3.return) {\n _iterator3.return();\n }\n } finally {\n if (_didIteratorError3) {\n throw _iteratorError3;\n }\n }\n }\n }\n\n return {\n type: 'FunctionCall',\n expression: this.visit(ctx.getChild(0)),\n arguments: args,\n names: names\n };\n }\n\n // index access\n if (toText(ctx.getChild(1)) === '[' && toText(ctx.getChild(3)) === ']') {\n return {\n type: 'IndexAccess',\n base: this.visit(ctx.getChild(0)),\n index: this.visit(ctx.getChild(2))\n };\n }\n break;\n\n case 5:\n // ternary operator\n if (toText(ctx.getChild(1)) === '?' && toText(ctx.getChild(3)) === ':') {\n return {\n type: 'Conditional',\n condition: this.visit(ctx.getChild(0)),\n trueExpression: this.visit(ctx.getChild(2)),\n falseExpression: this.visit(ctx.getChild(4))\n };\n }\n\n // index range access\n if (toText(ctx.getChild(1)) === '[' && toText(ctx.getChild(2)) === ':' && toText(ctx.getChild(4)) === ']') {\n return {\n type: 'IndexRangeAccess',\n base: this.visit(ctx.getChild(0)),\n indexStart: null,\n indexEnd: this.visit(ctx.getChild(3))\n };\n } else if (toText(ctx.getChild(1)) === '[' && toText(ctx.getChild(3)) === ':' && toText(ctx.getChild(4)) === ']') {\n return {\n type: 'IndexRangeAccess',\n base: this.visit(ctx.getChild(0)),\n indexStart: this.visit(ctx.getChild(2)),\n indexEnd: null\n };\n }\n break;\n\n case 6:\n // index range access\n if (toText(ctx.getChild(1)) === '[' && toText(ctx.getChild(3)) === ':' && toText(ctx.getChild(5)) === ']') {\n return {\n type: 'IndexRangeAccess',\n base: this.visit(ctx.getChild(0)),\n indexStart: this.visit(ctx.getChild(2)),\n indexEnd: this.visit(ctx.getChild(4))\n };\n }\n break;\n }\n\n throw new Error('Unrecognized expression');\n },\n StateVariableDeclaration: function StateVariableDeclaration(ctx) {\n var type = this.visit(ctx.typeName());\n var iden = ctx.identifier();\n var name = toText(iden);\n\n var expression = null;\n if (ctx.expression()) {\n expression = this.visit(ctx.expression());\n }\n\n var visibility = 'default';\n if (ctx.InternalKeyword(0)) {\n visibility = 'internal';\n } else if (ctx.PublicKeyword(0)) {\n visibility = 'public';\n } else if (ctx.PrivateKeyword(0)) {\n visibility = 'private';\n }\n\n var isDeclaredConst = false;\n if (ctx.ConstantKeyword(0)) {\n isDeclaredConst = true;\n }\n\n var decl = this.createNode({\n type: 'VariableDeclaration',\n typeName: type,\n name: name,\n expression: expression,\n visibility: visibility,\n isStateVar: true,\n isDeclaredConst: isDeclaredConst,\n isIndexed: false\n }, iden);\n\n return {\n variables: [decl],\n initialValue: expression\n };\n },\n ForStatement: function ForStatement(ctx) {\n var conditionExpression = this.visit(ctx.expressionStatement());\n if (conditionExpression) {\n conditionExpression = conditionExpression.expression;\n }\n return {\n initExpression: this.visit(ctx.simpleStatement()),\n conditionExpression: conditionExpression,\n loopExpression: {\n type: 'ExpressionStatement',\n expression: this.visit(ctx.expression())\n },\n body: this.visit(ctx.statement())\n };\n },\n PrimaryExpression: function PrimaryExpression(ctx) {\n if (ctx.BooleanLiteral()) {\n return {\n type: 'BooleanLiteral',\n value: toText(ctx.BooleanLiteral()) === 'true'\n };\n }\n\n if (ctx.HexLiteral()) {\n return {\n type: 'HexLiteral',\n value: toText(ctx.HexLiteral())\n };\n }\n\n if (ctx.stringLiteral()) {\n var value = ctx.stringLiteral().StringLiteralFragment().map(function (stringLiteralFragmentCtx) {\n var text = toText(stringLiteralFragmentCtx);\n var singleQuotes = text[0] === \"'\";\n var textWithoutQuotes = text.substring(1, text.length - 1);\n var value = singleQuotes ? textWithoutQuotes.replace(new RegExp(\"\\\\\\\\'\", 'g'), \"'\") : textWithoutQuotes.replace(new RegExp('\\\\\\\\\"', 'g'), '\"');\n\n return value;\n }).join(\"\");\n\n return {\n type: 'StringLiteral',\n value: value\n };\n }\n\n if (ctx.TypeKeyword()) {\n return {\n type: 'Identifier',\n name: 'type'\n };\n }\n\n if (ctx.children.length == 3 && toText(ctx.getChild(1)) === '[' && toText(ctx.getChild(2)) === ']') {\n var node = this.visit(ctx.getChild(0));\n if (node.type === 'Identifier') {\n node = {\n type: 'UserDefinedTypeName',\n namePath: node.name\n };\n } else if (node.type == 'TypeNameExpression') {\n node = node.typeName;\n } else {\n node = {\n type: 'ElementaryTypeName',\n name: toText(ctx.getChild(0))\n };\n }\n\n var typeName = {\n type: 'ArrayTypeName',\n baseTypeName: node,\n length: null\n };\n\n return {\n type: 'TypeNameExpression',\n typeName: typeName\n };\n }\n\n return this.visit(ctx.getChild(0));\n },\n Identifier: function Identifier(ctx) {\n return {\n name: toText(ctx)\n };\n },\n TupleExpression: function TupleExpression(ctx) {\n var _this6 = this;\n\n // remove parentheses\n var children = ctx.children.slice(1, -1);\n var components = mapCommasToNulls(children).map(function (expr) {\n // add a null for each empty value\n if (expr === null) {\n return null;\n }\n return _this6.visit(expr);\n });\n\n return {\n components: components,\n isArray: toText(ctx.getChild(0)) === '['\n };\n },\n IdentifierList: function IdentifierList(ctx) {\n var _this7 = this;\n\n // remove parentheses\n var children = ctx.children.slice(1, -1);\n return mapCommasToNulls(children).map(function (iden) {\n // add a null for each empty value\n if (iden === null) {\n return null;\n }\n\n return _this7.createNode({\n type: 'VariableDeclaration',\n name: toText(iden),\n storageLocation: null,\n typeName: null,\n isStateVar: false,\n isIndexed: false\n }, iden);\n });\n },\n VariableDeclarationList: function VariableDeclarationList(ctx) {\n var _this8 = this;\n\n // remove parentheses\n return mapCommasToNulls(ctx.children).map(function (decl) {\n // add a null for each empty value\n if (decl === null) {\n return null;\n }\n\n var storageLocation = null;\n if (decl.storageLocation()) {\n storageLocation = toText(decl.storageLocation());\n }\n\n return _this8.createNode({\n type: 'VariableDeclaration',\n name: toText(decl.identifier()),\n typeName: _this8.visit(decl.typeName()),\n storageLocation: storageLocation,\n isStateVar: false,\n isIndexed: false\n }, decl);\n });\n },\n VariableDeclarationStatement: function VariableDeclarationStatement(ctx) {\n var variables = void 0;\n if (ctx.variableDeclaration()) {\n variables = [this.visit(ctx.variableDeclaration())];\n } else if (ctx.identifierList()) {\n variables = this.visit(ctx.identifierList());\n } else if (ctx.variableDeclarationList()) {\n variables = this.visit(ctx.variableDeclarationList());\n }\n\n var initialValue = null;\n if (ctx.expression()) {\n initialValue = this.visit(ctx.expression());\n }\n\n return {\n variables: variables,\n initialValue: initialValue\n };\n },\n ImportDirective: function ImportDirective(ctx) {\n var pathString = toText(ctx.StringLiteralFragment());\n var unitAlias = null;\n var symbolAliases = null;\n\n if (ctx.importDeclaration().length > 0) {\n symbolAliases = ctx.importDeclaration().map(function (decl) {\n var symbol = toText(decl.identifier(0));\n var alias = null;\n if (decl.identifier(1)) {\n alias = toText(decl.identifier(1));\n }\n return [symbol, alias];\n });\n } else if (ctx.children.length === 7) {\n unitAlias = toText(ctx.getChild(3));\n } else if (ctx.children.length === 5) {\n unitAlias = toText(ctx.getChild(3));\n }\n\n return {\n path: pathString.substring(1, pathString.length - 1),\n unitAlias: unitAlias,\n symbolAliases: symbolAliases\n };\n },\n EventDefinition: function EventDefinition(ctx) {\n return {\n name: toText(ctx.identifier()),\n parameters: this.visit(ctx.eventParameterList()),\n isAnonymous: !!ctx.AnonymousKeyword()\n };\n },\n EventParameterList: function EventParameterList(ctx) {\n return ctx.eventParameter().map(function (paramCtx) {\n var type = this.visit(paramCtx.typeName());\n var name = null;\n if (paramCtx.identifier()) {\n name = toText(paramCtx.identifier());\n }\n\n return this.createNode({\n type: 'VariableDeclaration',\n typeName: type,\n name: name,\n isStateVar: false,\n isIndexed: !!paramCtx.IndexedKeyword(0)\n }, paramCtx);\n }, this);\n },\n ReturnParameters: function ReturnParameters(ctx) {\n return this.visit(ctx.parameterList());\n },\n ParameterList: function ParameterList(ctx) {\n var _this9 = this;\n\n return ctx.parameter().map(function (paramCtx) {\n return _this9.visit(paramCtx);\n });\n },\n Parameter: function Parameter(ctx) {\n var storageLocation = null;\n if (ctx.storageLocation()) {\n storageLocation = toText(ctx.storageLocation());\n }\n\n var name = null;\n if (ctx.identifier()) {\n name = toText(ctx.identifier());\n }\n\n return {\n type: 'VariableDeclaration',\n typeName: this.visit(ctx.typeName()),\n name: name,\n storageLocation: storageLocation,\n isStateVar: false,\n isIndexed: false\n };\n },\n InlineAssemblyStatement: function InlineAssemblyStatement(ctx) {\n var language = null;\n if (ctx.StringLiteralFragment()) {\n language = toText(ctx.StringLiteralFragment());\n language = language.substring(1, language.length - 1);\n }\n\n return {\n language: language,\n body: this.visit(ctx.assemblyBlock())\n };\n },\n AssemblyBlock: function AssemblyBlock(ctx) {\n var _this10 = this;\n\n var operations = ctx.assemblyItem().map(function (it) {\n return _this10.visit(it);\n });\n\n return { operations: operations };\n },\n AssemblyItem: function AssemblyItem(ctx) {\n var text = void 0;\n\n if (ctx.HexLiteral()) {\n return {\n type: 'HexLiteral',\n value: toText(ctx.HexLiteral())\n };\n }\n\n if (ctx.stringLiteral()) {\n text = toText(ctx.stringLiteral());\n return {\n type: 'StringLiteral',\n value: text.substring(1, text.length - 1)\n };\n }\n\n if (ctx.BreakKeyword()) {\n return {\n type: 'Break'\n };\n }\n\n if (ctx.ContinueKeyword()) {\n return {\n type: 'Continue'\n };\n }\n\n return this.visit(ctx.getChild(0));\n },\n AssemblyExpression: function AssemblyExpression(ctx) {\n return this.visit(ctx.getChild(0));\n },\n AssemblyCall: function AssemblyCall(ctx) {\n var _this11 = this;\n\n var functionName = toText(ctx.getChild(0));\n var args = ctx.assemblyExpression().map(function (arg) {\n return _this11.visit(arg);\n });\n\n return {\n functionName: functionName,\n arguments: args\n };\n },\n AssemblyLiteral: function AssemblyLiteral(ctx) {\n var text = void 0;\n\n if (ctx.stringLiteral()) {\n text = toText(ctx);\n return {\n type: 'StringLiteral',\n value: text.substring(1, text.length - 1)\n };\n }\n\n if (ctx.DecimalNumber()) {\n return {\n type: 'DecimalNumber',\n value: toText(ctx)\n };\n }\n\n if (ctx.HexNumber()) {\n return {\n type: 'HexNumber',\n value: toText(ctx)\n };\n }\n\n if (ctx.HexLiteral()) {\n return {\n type: 'HexLiteral',\n value: toText(ctx)\n };\n }\n },\n AssemblySwitch: function AssemblySwitch(ctx) {\n var _this12 = this;\n\n return {\n expression: this.visit(ctx.assemblyExpression()),\n cases: ctx.assemblyCase().map(function (c) {\n return _this12.visit(c);\n })\n };\n },\n AssemblyCase: function AssemblyCase(ctx) {\n var value = null;\n if (toText(ctx.getChild(0)) === 'case') {\n value = this.visit(ctx.assemblyLiteral());\n }\n\n var node = { block: this.visit(ctx.assemblyBlock()) };\n if (value !== null) {\n node.value = value;\n } else {\n node.default = true;\n }\n\n return node;\n },\n AssemblyLocalDefinition: function AssemblyLocalDefinition(ctx) {\n var names = ctx.assemblyIdentifierOrList();\n if (names.identifier()) {\n names = [this.visit(names.identifier())];\n } else {\n names = this.visit(names.assemblyIdentifierList().identifier());\n }\n\n return {\n names: names,\n expression: this.visit(ctx.assemblyExpression())\n };\n },\n AssemblyFunctionDefinition: function AssemblyFunctionDefinition(ctx) {\n var args = ctx.assemblyIdentifierList();\n args = args ? this.visit(args.identifier()) : [];\n\n var returnArgs = ctx.assemblyFunctionReturns();\n returnArgs = returnArgs ? this.visit(returnArgs.assemblyIdentifierList().identifier()) : [];\n\n return {\n name: toText(ctx.identifier()),\n arguments: args,\n returnArguments: returnArgs,\n body: this.visit(ctx.assemblyBlock())\n };\n },\n AssemblyAssignment: function AssemblyAssignment(ctx) {\n var names = ctx.assemblyIdentifierOrList();\n if (names.identifier()) {\n names = [this.visit(names.identifier())];\n } else {\n names = this.visit(names.assemblyIdentifierList().identifier());\n }\n\n return {\n names: names,\n expression: this.visit(ctx.assemblyExpression())\n };\n },\n LabelDefinition: function LabelDefinition(ctx) {\n return {\n name: toText(ctx.identifier())\n };\n },\n AssemblyStackAssignment: function AssemblyStackAssignment(ctx) {\n return {\n name: toText(ctx.identifier())\n };\n },\n AssemblyFor: function AssemblyFor(ctx) {\n return {\n pre: this.visit(ctx.getChild(1)),\n condition: this.visit(ctx.getChild(2)),\n post: this.visit(ctx.getChild(3)),\n body: this.visit(ctx.getChild(4))\n };\n },\n AssemblyIf: function AssemblyIf(ctx) {\n return {\n condition: this.visit(ctx.assemblyExpression()),\n body: this.visit(ctx.assemblyBlock())\n };\n }\n};\n\nfunction ASTBuilder(options) {\n antlr4.tree.ParseTreeVisitor.call(this);\n this.options = options;\n}\n\nASTBuilder.prototype = Object.create(antlr4.tree.ParseTreeVisitor.prototype);\nASTBuilder.prototype.constructor = ASTBuilder;\n\nASTBuilder.prototype._loc = function (ctx) {\n var sourceLocation = {\n start: {\n line: ctx.start.line,\n column: ctx.start.column\n },\n end: {\n line: ctx.stop.line,\n column: ctx.stop.column\n }\n };\n return { loc: sourceLocation };\n};\n\nASTBuilder.prototype._range = function (ctx) {\n return { range: [ctx.start.start, ctx.stop.stop] };\n};\n\nASTBuilder.prototype.meta = function (ctx) {\n var ret = {};\n if (this.options.loc) {\n Object.assign(ret, this._loc(ctx));\n }\n if (this.options.range) {\n Object.assign(ret, this._range(ctx));\n }\n return ret;\n};\n\nASTBuilder.prototype.createNode = function (obj, ctx) {\n return Object.assign(obj, this.meta(ctx));\n};\n\nASTBuilder.prototype.visit = function (ctx) {\n if (ctx == null) {\n return null;\n }\n\n if (Array.isArray(ctx)) {\n return ctx.map(function (child) {\n return this.visit(child);\n }, this);\n }\n\n var name = ctx.constructor.name;\n if (name.endsWith('Context')) {\n name = name.substring(0, name.length - 'Context'.length);\n }\n\n var node = { type: name };\n\n if (name in transformAST) {\n var visited = transformAST[name].call(this, ctx);\n if (Array.isArray(visited)) {\n return visited;\n }\n Object.assign(node, visited);\n }\n\n return this.createNode(node, ctx);\n};\n\nmodule.exports = ASTBuilder;\n\n//# sourceURL=webpack:///./node_modules/solidity-parser-diligence/dist/ASTBuilder.js?")},"./node_modules/solidity-parser-diligence/dist/ErrorListener.js":function(module,exports,__webpack_require__){"use strict";eval('\n\nvar antlr4 = __webpack_require__("./node_modules/solidity-parser-diligence/dist/antlr4/index.js");\n\nfunction ErrorListener() {\n antlr4.error.ErrorListener.call(this);\n this._errors = [];\n}\n\nErrorListener.prototype = Object.create(antlr4.error.ErrorListener.prototype);\nErrorListener.prototype.constructor = ErrorListener;\n\nErrorListener.prototype.syntaxError = function (recognizer, offendingSymbol, line, column, message) {\n this._errors.push({ message: message, line: line, column: column });\n};\n\nErrorListener.prototype.getErrors = function () {\n return this._errors;\n};\n\nErrorListener.prototype.hasErrors = function () {\n return this._errors.length > 0;\n};\n\nmodule.exports = ErrorListener;\n\n//# sourceURL=webpack:///./node_modules/solidity-parser-diligence/dist/ErrorListener.js?')},"./node_modules/solidity-parser-diligence/dist/antlr4/BufferedTokenStream.js":function(module,exports,__webpack_require__){"use strict";eval('\n\n//\n/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.\n * Use of this file is governed by the BSD 3-clause license that\n * can be found in the LICENSE.txt file in the project root.\n */\n\n// This implementation of {@link TokenStream} loads tokens from a\n// {@link TokenSource} on-demand, and places the tokens in a buffer to provide\n// access to any previous token by index.\n//\n// <p>\n// This token stream ignores the value of {@link Token//getChannel}. If your\n// parser requires the token stream filter tokens to only those on a particular\n// channel, such as {@link Token//DEFAULT_CHANNEL} or\n// {@link Token//HIDDEN_CHANNEL}, use a filtering token stream such a\n// {@link CommonTokenStream}.</p>\n\nvar Token = __webpack_require__("./node_modules/solidity-parser-diligence/dist/antlr4/Token.js").Token;\nvar Lexer = __webpack_require__("./node_modules/solidity-parser-diligence/dist/antlr4/Lexer.js").Lexer;\nvar Interval = __webpack_require__("./node_modules/solidity-parser-diligence/dist/antlr4/IntervalSet.js").Interval;\n\n// this is just to keep meaningful parameter types to Parser\nfunction TokenStream() {\n\treturn this;\n}\n\nfunction BufferedTokenStream(tokenSource) {\n\n\tTokenStream.call(this);\n\t// The {@link TokenSource} from which tokens for this stream are fetched.\n\tthis.tokenSource = tokenSource;\n\n\t// A collection of all tokens fetched from the token source. The list is\n\t// considered a complete view of the input once {@link //fetchedEOF} is set\n\t// to {@code true}.\n\tthis.tokens = [];\n\n\t// The index into {@link //tokens} of the current token (next token to\n\t// {@link //consume}). {@link //tokens}{@code [}{@link //p}{@code ]} should\n\t// be\n\t// {@link //LT LT(1)}.\n\t//\n\t// <p>This field is set to -1 when the stream is first constructed or when\n\t// {@link //setTokenSource} is called, indicating that the first token has\n\t// not yet been fetched from the token source. For additional information,\n\t// see the documentation of {@link IntStream} for a description of\n\t// Initializing Methods.</p>\n\tthis.index = -1;\n\n\t// Indicates whether the {@link Token//EOF} token has been fetched from\n\t// {@link //tokenSource} and added to {@link //tokens}. This field improves\n\t// performance for the following cases:\n\t//\n\t// <ul>\n\t// <li>{@link //consume}: The lookahead check in {@link //consume} to\n\t// prevent\n\t// consuming the EOF symbol is optimized by checking the values of\n\t// {@link //fetchedEOF} and {@link //p} instead of calling {@link\n\t// //LA}.</li>\n\t// <li>{@link //fetch}: The check to prevent adding multiple EOF symbols\n\t// into\n\t// {@link //tokens} is trivial with this field.</li>\n\t// <ul>\n\tthis.fetchedEOF = false;\n\treturn this;\n}\n\nBufferedTokenStream.prototype = Object.create(TokenStream.prototype);\nBufferedTokenStream.prototype.constructor = BufferedTokenStream;\n\nBufferedTokenStream.prototype.mark = function () {\n\treturn 0;\n};\n\nBufferedTokenStream.prototype.release = function (marker) {\n\t// no resources to release\n};\n\nBufferedTokenStream.prototype.reset = function () {\n\tthis.seek(0);\n};\n\nBufferedTokenStream.prototype.seek = function (index) {\n\tthis.lazyInit();\n\tthis.index = this.adjustSeekIndex(index);\n};\n\nBufferedTokenStream.prototype.get = function (index) {\n\tthis.lazyInit();\n\treturn this.tokens[index];\n};\n\nBufferedTokenStream.prototype.consume = function () {\n\tvar skipEofCheck = false;\n\tif (this.index >= 0) {\n\t\tif (this.fetchedEOF) {\n\t\t\t// the last token in tokens is EOF. skip check if p indexes any\n\t\t\t// fetched token except the last.\n\t\t\tskipEofCheck = this.index < this.tokens.length - 1;\n\t\t} else {\n\t\t\t// no EOF token in tokens. skip check if p indexes a fetched token.\n\t\t\tskipEofCheck = this.index < this.tokens.length;\n\t\t}\n\t} else {\n\t\t// not yet initialized\n\t\tskipEofCheck = false;\n\t}\n\tif (!skipEofCheck && this.LA(1) === Token.EOF) {\n\t\tthrow "cannot consume EOF";\n\t}\n\tif (this.sync(this.index + 1)) {\n\t\tthis.index = this.adjustSeekIndex(this.index + 1);\n\t}\n};\n\n// Make sure index {@code i} in tokens has a token.\n//\n// @return {@code true} if a token is located at index {@code i}, otherwise\n// {@code false}.\n// @see //get(int i)\n// /\nBufferedTokenStream.prototype.sync = function (i) {\n\tvar n = i - this.tokens.length + 1; // how many more elements we need?\n\tif (n > 0) {\n\t\tvar fetched = this.fetch(n);\n\t\treturn fetched >= n;\n\t}\n\treturn true;\n};\n\n// Add {@code n} elements to buffer.\n//\n// @return The actual number of elements added to the buffer.\n// /\nBufferedTokenStream.prototype.fetch = function (n) {\n\tif (this.fetchedEOF) {\n\t\treturn 0;\n\t}\n\tfor (var i = 0; i < n; i++) {\n\t\tvar t = this.tokenSource.nextToken();\n\t\tt.tokenIndex = this.tokens.length;\n\t\tthis.tokens.push(t);\n\t\tif (t.type === Token.EOF) {\n\t\t\tthis.fetchedEOF = true;\n\t\t\treturn i + 1;\n\t\t}\n\t}\n\treturn n;\n};\n\n// Get all tokens from start..stop inclusively///\nBufferedTokenStream.prototype.getTokens = function (start, stop, types) {\n\tif (types === undefined) {\n\t\ttypes = null;\n\t}\n\tif (start < 0 || stop < 0) {\n\t\treturn null;\n\t}\n\tthis.lazyInit();\n\tvar subset = [];\n\tif (stop >= this.tokens.length) {\n\t\tstop = this.tokens.length - 1;\n\t}\n\tfor (var i = start; i < stop; i++) {\n\t\tvar t = this.tokens[i];\n\t\tif (t.type === Token.EOF) {\n\t\t\tbreak;\n\t\t}\n\t\tif (types === null || types.contains(t.type)) {\n\t\t\tsubset.push(t);\n\t\t}\n\t}\n\treturn subset;\n};\n\nBufferedTokenStream.prototype.LA = function (i) {\n\treturn this.LT(i).type;\n};\n\nBufferedTokenStream.prototype.LB = function (k) {\n\tif (this.index - k < 0) {\n\t\treturn null;\n\t}\n\treturn this.tokens[this.index - k];\n};\n\nBufferedTokenStream.prototype.LT = function (k) {\n\tthis.lazyInit();\n\tif (k === 0) {\n\t\treturn null;\n\t}\n\tif (k < 0) {\n\t\treturn this.LB(-k);\n\t}\n\tvar i = this.index + k - 1;\n\tthis.sync(i);\n\tif (i >= this.tokens.length) {\n\t\t// return EOF token\n\t\t// EOF must be last token\n\t\treturn this.tokens[this.tokens.length - 1];\n\t}\n\treturn this.tokens[i];\n};\n\n// Allowed derived classes to modify the behavior of operations which change\n// the current stream position by adjusting the target token index of a seek\n// operation. The default implementation simply returns {@code i}. If an\n// exception is thrown in this method, the current stream index should not be\n// changed.\n//\n// <p>For example, {@link CommonTokenStream} overrides this method to ensure\n// that\n// the seek target is always an on-channel token.</p>\n//\n// @param i The target token index.\n// @return The adjusted target token index.\n\nBufferedTokenStream.prototype.adjustSeekIndex = function (i) {\n\treturn i;\n};\n\nBufferedTokenStream.prototype.lazyInit = function () {\n\tif (this.index === -1) {\n\t\tthis.setup();\n\t}\n};\n\nBufferedTokenStream.prototype.setup = function () {\n\tthis.sync(0);\n\tthis.index = this.adjustSeekIndex(0);\n};\n\n// Reset this token stream by setting its token source.///\nBufferedTokenStream.prototype.setTokenSource = function (tokenSource) {\n\tthis.tokenSource = tokenSource;\n\tthis.tokens = [];\n\tthis.index = -1;\n\tthis.fetchedEOF = false;\n};\n\n// Given a starting index, return the index of the next token on channel.\n// Return i if tokens[i] is on channel. Return -1 if there are no tokens\n// on channel between i and EOF.\n// /\nBufferedTokenStream.prototype.nextTokenOnChannel = function (i, channel) {\n\tthis.sync(i);\n\tif (i >= this.tokens.length) {\n\t\treturn -1;\n\t}\n\tvar token = this.tokens[i];\n\twhile (token.channel !== this.channel) {\n\t\tif (token.type === Token.EOF) {\n\t\t\treturn -1;\n\t\t}\n\t\ti += 1;\n\t\tthis.sync(i);\n\t\ttoken = this.tokens[i];\n\t}\n\treturn i;\n};\n\n// Given a starting index, return the index of the previous token on channel.\n// Return i if tokens[i] is on channel. Return -1 if there are no tokens\n// on channel between i and 0.\nBufferedTokenStream.prototype.previousTokenOnChannel = function (i, channel) {\n\twhile (i >= 0 && this.tokens[i].channel !== channel) {\n\t\ti -= 1;\n\t}\n\treturn i;\n};\n\n// Collect all tokens on specified channel to the right of\n// the current token up until we see a token on DEFAULT_TOKEN_CHANNEL or\n// EOF. If channel is -1, find any non default channel token.\nBufferedTokenStream.prototype.getHiddenTokensToRight = function (tokenIndex, channel) {\n\tif (channel === undefined) {\n\t\tchannel = -1;\n\t}\n\tthis.lazyInit();\n\tif (tokenIndex < 0 || tokenIndex >= this.tokens.length) {\n\t\tthrow "" + tokenIndex + " not in 0.." + this.tokens.length - 1;\n\t}\n\tvar nextOnChannel = this.nextTokenOnChannel(tokenIndex + 1, Lexer.DEFAULT_TOKEN_CHANNEL);\n\tvar from_ = tokenIndex + 1;\n\t// if none onchannel to right, nextOnChannel=-1 so set to = last token\n\tvar to = nextOnChannel === -1 ? this.tokens.length - 1 : nextOnChannel;\n\treturn this.filterForChannel(from_, to, channel);\n};\n\n// Collect all tokens on specified channel to the left of\n// the current token up until we see a token on DEFAULT_TOKEN_CHANNEL.\n// If channel is -1, find any non default channel token.\nBufferedTokenStream.prototype.getHiddenTokensToLeft = function (tokenIndex, channel) {\n\tif (channel === undefined) {\n\t\tchannel = -1;\n\t}\n\tthis.lazyInit();\n\tif (tokenIndex < 0 || tokenIndex >= this.tokens.length) {\n\t\tthrow "" + tokenIndex + " not in 0.." + this.tokens.length - 1;\n\t}\n\tvar prevOnChannel = this.previousTokenOnChannel(tokenIndex - 1, Lexer.DEFAULT_TOKEN_CHANNEL);\n\tif (prevOnChannel === tokenIndex - 1) {\n\t\treturn null;\n\t}\n\t// if none on channel to left, prevOnChannel=-1 then from=0\n\tvar from_ = prevOnChannel + 1;\n\tvar to = tokenIndex - 1;\n\treturn this.filterForChannel(from_, to, channel);\n};\n\nBufferedTokenStream.prototype.filterForChannel = function (left, right, channel) {\n\tvar hidden = [];\n\tfor (var i = left; i < right + 1; i++) {\n\t\tvar t = this.tokens[i];\n\t\tif (channel === -1) {\n\t\t\tif (t.channel !== Lexer.DEFAULT_TOKEN_CHANNEL) {\n\t\t\t\thidden.push(t);\n\t\t\t}\n\t\t} else if (t.channel === channel) {\n\t\t\thidden.push(t);\n\t\t}\n\t}\n\tif (hidden.length === 0) {\n\t\treturn null;\n\t}\n\treturn hidden;\n};\n\nBufferedTokenStream.prototype.getSourceName = function () {\n\treturn this.tokenSource.getSourceName();\n};\n\n// Get the text of all tokens in this buffer.///\nBufferedTokenStream.prototype.getText = function (interval) {\n\tthis.lazyInit();\n\tthis.fill();\n\tif (interval === undefined || interval === null) {\n\t\tinterval = new Interval(0, this.tokens.length - 1);\n\t}\n\tvar start = interval.start;\n\tif (start instanceof Token) {\n\t\tstart = start.tokenIndex;\n\t}\n\tvar stop = interval.stop;\n\tif (stop instanceof Token) {\n\t\tstop = stop.tokenIndex;\n\t}\n\tif (start === null || stop === null || start < 0 || stop < 0) {\n\t\treturn "";\n\t}\n\tif (stop >= this.tokens.length) {\n\t\tstop = this.tokens.length - 1;\n\t}\n\tvar s = "";\n\tfor (var i = start; i < stop + 1; i++) {\n\t\tvar t = this.tokens[i];\n\t\tif (t.type === Token.EOF) {\n\t\t\tbreak;\n\t\t}\n\t\ts = s + t.text;\n\t}\n\treturn s;\n};\n\n// Get all tokens from lexer until EOF///\nBufferedTokenStream.prototype.fill = function () {\n\tthis.lazyInit();\n\twhile (this.fetch(1000) === 1000) {\n\t\tconti