Best JavaScript code snippet using playwright-internal
Parser.js
Source:Parser.js  
1// Copyright 2012 Google Inc.2//3// Licensed under the Apache License, Version 2.0 (the "License");4// you may not use this file except in compliance with the License.5// You may obtain a copy of the License at6//7//      http://www.apache.org/licenses/LICENSE-2.08//9// Unless required by applicable law or agreed to in writing, software10// distributed under the License is distributed on an "AS IS" BASIS,11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.12// See the License for the specific language governing permissions and13// limitations under the License.14traceur.define('syntax', function() {15  'use strict';16  var MutedErrorReporter = traceur.util.MutedErrorReporter;17  var Keywords = traceur.syntax.Keywords;18  var PredefinedName = traceur.syntax.PredefinedName;19  var SourceRange = traceur.util.SourceRange;20  var Token = traceur.syntax.Token;21  var TokenType = traceur.syntax.TokenType;22  var ArgumentList = traceur.syntax.trees.ArgumentList;23  var ArrayComprehension = traceur.syntax.trees.ArrayComprehension;24  var ArrayLiteralExpression = traceur.syntax.trees.ArrayLiteralExpression;25  var ArrayPattern = traceur.syntax.trees.ArrayPattern;26  var ArrowFunctionExpression = traceur.syntax.trees.ArrowFunctionExpression;27  var AwaitStatement = traceur.syntax.trees.AwaitStatement;28  var BinaryOperator = traceur.syntax.trees.BinaryOperator;29  var BindThisParameter = traceur.syntax.trees.BindThisParameter;30  var BindingElement = traceur.syntax.trees.BindingElement;31  var BindingIdentifier = traceur.syntax.trees.BindingIdentifier;32  var Block = traceur.syntax.trees.Block;33  var BreakStatement = traceur.syntax.trees.BreakStatement;34  var CallExpression = traceur.syntax.trees.CallExpression;35  var CaseClause = traceur.syntax.trees.CaseClause;36  var Catch = traceur.syntax.trees.Catch;37  var CascadeExpression = traceur.syntax.trees.CascadeExpression;38  var ClassDeclaration = traceur.syntax.trees.ClassDeclaration;39  var ClassExpression = traceur.syntax.trees.ClassExpression;40  var CommaExpression = traceur.syntax.trees.CommaExpression;41  var ComprehensionFor = traceur.syntax.trees.ComprehensionFor;42  var ConditionalExpression = traceur.syntax.trees.ConditionalExpression;43  var ContinueStatement = traceur.syntax.trees.ContinueStatement;44  var DebuggerStatement = traceur.syntax.trees.DebuggerStatement;45  var DefaultClause = traceur.syntax.trees.DefaultClause;46  var DoWhileStatement = traceur.syntax.trees.DoWhileStatement;47  var EmptyStatement = traceur.syntax.trees.EmptyStatement;48  var ExportDeclaration = traceur.syntax.trees.ExportDeclaration;49  var ExportMapping = traceur.syntax.trees.ExportMapping;50  var ExportMappingList = traceur.syntax.trees.ExportMappingList;51  var ExportSpecifier = traceur.syntax.trees.ExportSpecifier;52  var ExportSpecifierSet = traceur.syntax.trees.ExportSpecifierSet;53  var ExpressionStatement = traceur.syntax.trees.ExpressionStatement;54  var Finally = traceur.syntax.trees.Finally;55  var ForOfStatement = traceur.syntax.trees.ForOfStatement;56  var ForInStatement = traceur.syntax.trees.ForInStatement;57  var ForStatement = traceur.syntax.trees.ForStatement;58  var FormalParameterList = traceur.syntax.trees.FormalParameterList;59  var FunctionDeclaration = traceur.syntax.trees.FunctionDeclaration;60  var GeneratorComprehension = traceur.syntax.trees.GeneratorComprehension;61  var GetAccessor = traceur.syntax.trees.GetAccessor;62  var IdentifierExpression = traceur.syntax.trees.IdentifierExpression;63  var IdentifierToken = traceur.syntax.IdentifierToken;64  var IfStatement = traceur.syntax.trees.IfStatement;65  var ImportDeclaration = traceur.syntax.trees.ImportDeclaration;66  var ImportBinding = traceur.syntax.trees.ImportBinding;67  var ImportSpecifier = traceur.syntax.trees.ImportSpecifier;68  var ImportSpecifierSet = traceur.syntax.trees.ImportSpecifierSet;69  var LabelledStatement = traceur.syntax.trees.LabelledStatement;70  var LiteralExpression = traceur.syntax.trees.LiteralExpression;71  var MemberExpression = traceur.syntax.trees.MemberExpression;72  var MemberLookupExpression = traceur.syntax.trees.MemberLookupExpression;73  var MissingPrimaryExpression = traceur.syntax.trees.MissingPrimaryExpression;74  var ModuleDeclaration = traceur.syntax.trees.ModuleDeclaration;75  var ModuleDefinition = traceur.syntax.trees.ModuleDefinition;76  var ModuleExpression = traceur.syntax.trees.ModuleExpression;77  var ModuleRequire = traceur.syntax.trees.ModuleRequire;78  var ModuleSpecifier = traceur.syntax.trees.ModuleSpecifier;79  var NewExpression = traceur.syntax.trees.NewExpression;80  var NullTree = traceur.syntax.trees.NullTree;81  var ObjectLiteralExpression = traceur.syntax.trees.ObjectLiteralExpression;82  var ObjectPattern = traceur.syntax.trees.ObjectPattern;83  var ObjectPatternField = traceur.syntax.trees.ObjectPatternField;84  var ParenExpression = traceur.syntax.trees.ParenExpression;85  var ParseTreeType = traceur.syntax.trees.ParseTreeType;86  var PostfixExpression = traceur.syntax.trees.PostfixExpression;87  var Program = traceur.syntax.trees.Program;88  var PropertyMethodAssignment = traceur.syntax.trees.PropertyMethodAssignment;89  var PropertyNameAssignment = traceur.syntax.trees.PropertyNameAssignment;90  var PropertyNameShorthand = traceur.syntax.trees.PropertyNameShorthand;91  var QuasiLiteralExpression = traceur.syntax.trees.QuasiLiteralExpression;92  var QuasiLiteralPortion = traceur.syntax.trees.QuasiLiteralPortion;93  var QuasiSubstitution = traceur.syntax.trees.QuasiSubstitution;94  var RestParameter = traceur.syntax.trees.RestParameter;95  var ReturnStatement = traceur.syntax.trees.ReturnStatement;96  var SetAccessor = traceur.syntax.trees.SetAccessor;97  var SpreadExpression = traceur.syntax.trees.SpreadExpression;98  var SpreadPatternElement = traceur.syntax.trees.SpreadPatternElement;99  var SuperExpression = traceur.syntax.trees.SuperExpression;100  var SwitchStatement = traceur.syntax.trees.SwitchStatement;101  var ThisExpression = traceur.syntax.trees.ThisExpression;102  var ThrowStatement = traceur.syntax.trees.ThrowStatement;103  var TryStatement = traceur.syntax.trees.TryStatement;104  var UnaryExpression = traceur.syntax.trees.UnaryExpression;105  var VariableDeclaration = traceur.syntax.trees.VariableDeclaration;106  var VariableDeclarationList = traceur.syntax.trees.VariableDeclarationList;107  var VariableStatement = traceur.syntax.trees.VariableStatement;108  var WhileStatement = traceur.syntax.trees.WhileStatement;109  var WithStatement = traceur.syntax.trees.WithStatement;110  var YieldStatement = traceur.syntax.trees.YieldStatement;111  var createBindingIdentifier = traceur.codegeneration.ParseTreeFactory.createBindingIdentifier;112  var options = traceur.options.parse;113  /**114   * Parses a javascript file.115   *116   * The various this.parseX_() methods never return null - even when parse errors are encountered.117   * Typically this.parseX_() will return a XTree ParseTree. Each ParseTree that is created includes its118   * source location. The typical pattern for a this.parseX_() method is:119   *120   * XTree this.parseX_() {121   *   var start = this.getTreeStartLocation_();122   *   parse X grammar element and its children123   *   return new XTree(this.getTreeLocation_(start), children);124   * }125   *126   * this.parseX_() methods must consume at least 1 token - even in error cases. This prevents infinite127   * loops in the parser.128   *129   * Many this.parseX_() methods are matched by a 'boolean this.peekX_()' method which will return true if130   * the beginning of an X appears at the current location. There are also this.peek_() methods which131   * examine the next token. this.peek_() methods must not consume any tokens.132   *133   * The this.eat_() method consumes a token and reports an error if the consumed token is not of the134   * expected type. The this.eatOpt_() methods consume the next token iff the next token is of the expected135   * type and return the consumed token or null if no token was consumed.136   *137   * When parse errors are encountered, an error should be reported and the parse should return a best138   * guess at the current parse tree.139   *140   * When parsing lists, the preferred pattern is:141   *   this.eat_(LIST_START);142   *   var elements = [];143   *   while (this.peekListElement_()) {144   *     elements.push(this.parseListElement_());145   *   }146   *   this.eat_(LIST_END);147   */148  function Parser(errorReporter, var_args) {149    this.errorReporter_ = errorReporter;150    var scanner;151    if (arguments[1] instanceof traceur.syntax.Scanner) {152      scanner = arguments[1];153    } else {154      scanner = new traceur.syntax.Scanner(errorReporter, arguments[1],155                                           arguments[2]);156    }157    this.scanner_ = scanner;158  }159  /**160   * Differentiates between parsing for 'In' vs. 'NoIn'161   * Variants of expression grammars.162   */163  var Expression = {164    NO_IN: 'NO_IN',165    NORMAL: 'NORMAL'166  };167  /**168   * Enum for determining if the initializer is needed in a variable declaration169   * with a destructuring pattern.170   * @enum {string}171   */172  var DestructuringInitializer = {173    REQUIRED: 'REQUIRED',174    OPTIONAL: 'OPTIONAL'175  };176  function followedByCommaOrCloseSquare(token) {177    return token.type === TokenType.COMMA ||178        token.type === TokenType.CLOSE_SQUARE;179  }180  function followedByCommaOrCloseCurly(token) {181    return token.type === TokenType.COMMA ||182        token.type === TokenType.CLOSE_CURLY;183  }184  function followedByInOrOf(token) {185    return token.type === TokenType.IN ||186        token.type === TokenType.IDENTIFIER &&187        token.value === PredefinedName.OF;188  }189  /**190   * Enum used to determine if an initializer is allowed or not.191   * @enum {string}192   */193  var Initializer = {194    ALLOWED: 'ALLOWED',195    REQUIRED: 'REQUIRED'196  };197  Parser.prototype = {198    /**199     * Keeps track of whether we currently allow yield expressions.200     * @type {boolean}201     * @private202     */203    allowYield_: false,204    // 14 Program205    /**206     * @return {Program}207     */208    parseProgram: function(opt_load) {209      //var t = new Timer("Parse Program");210      var start = this.getTreeStartLocation_();211      var programElements = this.parseProgramElements_(!!opt_load);212      this.eat_(TokenType.END_OF_FILE);213      //t.end();214      return new Program(this.getTreeLocation_(start), programElements);215    },216    /**217     * @return {Array.<ParseTree>}218     * @private219     */220    parseProgramElements_: function(load) {221      var result = [];222      while (!this.peek_(TokenType.END_OF_FILE)) {223        var programElement = this.parseProgramElement_(load);224        if (!programElement) {225          return null;226        }227        result.push(programElement);228      }229      return result;230    },231    /**232     * @return {boolean}233     * @private234     */235    peekProgramElement_: function() {236      return this.peekFunction_() ||237             this.peekVariableDeclarationList_() ||238             this.peekImportDeclaration_() ||239             this.peekExportDeclaration_() ||240             this.peekModuleDeclaration_() ||241             this.peekClassDeclaration_() ||242             this.peekStatement_();243    },244    /**245     * @return {ParseTree}246     * @private247     */248    parseProgramElement_: function(load) {249      if (this.peekVariableDeclarationList_()) {250        return this.parseVariableStatement_();251      }252      // Function is handled in parseStatement_253      // Class is handled in parseStatement_254      if (this.peekImportDeclaration_(load)) {255        return this.parseImportDeclaration_(load);256      }257      if (this.peekExportDeclaration_(load)) {258        return this.parseExportDeclaration_(load);259      }260      if (this.peekModuleDeclaration_(load)) {261        return this.parseModuleDeclaration_(load);262      }263      return this.parseStatement_();264    },265    // ClassDeclaration266    // ModuleDeclaration267    // TODO: ImportDeclaration268    // TODO: ScriptBlock269    // Statement (other than BlockStatement)270    // FunctionDeclaration271    /*272    peekScriptElement_: function() {273      return this.peekModuleDeclaration_() ||274              this.peekSourceElement_();275    }276  */277    // module  identifier { ModuleElement* }278    /**279    * @return {boolean}280    * @private281    */282    peekModuleDefinition_: function() {283      return this.peekPredefinedString_(PredefinedName.MODULE) &&284          this.peek_(TokenType.IDENTIFIER, 1) &&285          this.peek_(TokenType.OPEN_CURLY, 2);286    },287    /**288     * @return {ParseTree}289     * @private290     */291    parseModuleDefinition_: function(load) {292      // ModuleDeclaration ::= "module" ModuleSpecifier(load) ("," ModuleSpecifier(load))* ";"293      //              | ModuleDefinition(load)294      // ModuleDefinition(load) ::= "module" Identifier "{" ModuleBody(load) "}"295      // ModuleSpecifier(load) ::= Identifier "from" ModuleExpression(load)296      var start = this.getTreeStartLocation_();297      this.eatId_(); // module298      var name = this.eatId_();299      this.eat_(TokenType.OPEN_CURLY);300      var result = [];301      while (this.peekModuleElement_()) {302        result.push(this.parseModuleElement_(load));303      }304      this.eat_(TokenType.CLOSE_CURLY);305      return new ModuleDefinition(this.getTreeLocation_(start), name, result);306    },307    // ModuleSpecifier(load) ::= Identifier "from" ModuleExpression(load)308    parseModuleSpecifier_: function(load) {309      var start = this.getTreeStartLocation_();310      var identifier = this.eatId_();311      this.eatId_(PredefinedName.FROM);312      var expression = this.parseModuleExpression_(load);313      return new ModuleSpecifier(this.getTreeLocation_(start), identifier,314                                 expression);315    },316    parseModuleExpression_: function(load) {317      // ModuleExpression(load) ::= ModuleReference(load)318      //                         | ModuleExpression(load) "." IdentifierName319      var start = this.getTreeStartLocation_();320      var reference = this.parseModuleReference_(load);321      var identifierNames = [];322      while (this.peek_(TokenType.PERIOD) && this.peekIdName_(1)) {323        this.eat_(TokenType.PERIOD);324        identifierNames.push(this.eatIdName_());325      }326      return new ModuleExpression(this.getTreeLocation_(start), reference,327          identifierNames);328    },329    /**330     * @private331     * @return {ModeuleRequireTree|IdentifierExpression}332     */333    parseModuleReference_: function(load) {334      // ModuleReference(load) ::= Identifier335      //                        | [load = true] StringLiteral336      var start = this.getTreeStartLocation_();337      if (load && this.peek_(TokenType.STRING)) {338        var url = this.eat_(TokenType.STRING);339        return new ModuleRequire(this.getTreeLocation_(start), url);340      }341      return this.parseIdentifierExpression_();342    },343    // ClassDeclaration344    // ImportDeclaration345    // ExportDeclaration346    // ModuleDeclaration347    // TODO: ModuleBlock348    // Statement (other than BlockStatement)349    // FunctionDeclaration350    /**351     * @return {boolean}352     * @private353     */354    peekModuleElement_: function() {355      // ModuleElement is currently same as ProgramElement.356      return this.peekProgramElement_();357    },358    /**359     * @return {ParseTree}360     * @private361     */362    parseModuleElement_: function(load) {363      // ModuleElement is currently same as ProgramElement.364      return this.parseProgramElement_(load);365    },366    //  ImportDeclaration ::= 'import' ImportBinding (',' ImportBinding)* ';'367    /**368     * @return {boolean}369     * @private370     */371    peekImportDeclaration_: function() {372      return options.modules && this.peek_(TokenType.IMPORT);373    },374    // ImportDeclaration(load) ::= "import" ImportBinding(load)375    //                                     ("," ImportBinding(load))* ";"376    /**377     * @return {ParseTree}378     * @private379     */380    parseImportDeclaration_: function(load) {381      var start = this.getTreeStartLocation_();382      this.eat_(TokenType.IMPORT);383      var importBindings = [];384      importBindings.push(this.parseImportBinding_(load));385      while (this.peek_(TokenType.COMMA)) {386        this.eat_(TokenType.COMMA);387        importBindings.push(this.parseImportBinding_(load));388      }389      this.eatPossibleImplicitSemiColon_();390      return new ImportDeclaration(this.getTreeLocation_(start),391          importBindings);392    },393    // ImportBinding(load) ::= ImportSpecifierSet "from" ModuleExpression(load)394    /**395     * @return {ParseTree}396     * @private397     */398    parseImportBinding_: function(load) {399      var start = this.getTreeStartLocation_();400      var importSpecifierSet = this.parseImportSpecifierSet_();401      this.eatId_(PredefinedName.FROM);402      var moduleExpression = this.parseModuleExpression_(load);403      return new ImportBinding(this.getTreeLocation_(start),404          moduleExpression, importSpecifierSet);405    },406    //ImportSpecifierSet ::= "*"407    //                  | IdentifierName408    //                  | "{" (ImportSpecifier ("," ImportSpecifier)*)? ","? "}"409    /**410     * @param {SourcePosition} start411     * @param {Array.<IdentifierToken>} qualifiedPath412     * @return {ParseTree|Token|Array.<Token>}413     * @private414     */415    parseImportSpecifierSet_: function() {416      if (this.peek_(TokenType.OPEN_CURLY)) {417        var start = this.getTreeStartLocation_();418        this.eat_(TokenType.OPEN_CURLY);419        var specifiers = [this.parseImportSpecifier_()];420        while (this.peek_(TokenType.COMMA)) {421          this.eat_(TokenType.COMMA);422          if (this.peek_(TokenType.CLOSE_CURLY))423            break;424          specifiers.push(this.parseImportSpecifier_());425        }426        this.eat_(TokenType.CLOSE_CURLY);427        return new ImportSpecifierSet(this.getTreeLocation_(start), specifiers);428      }429      if (this.peek_(TokenType.STAR)) {430        var star = this.eat_(TokenType.STAR);431        return new ImportSpecifierSet(this.getTreeLocation_(start), star);432      }433      return this.parseIdentifierNameExpression_();434    },435    // ImportSpecifier ::= IdentifierName (":" Identifier)?436    /**437     * @return {ParseTree}438     * @private439     */440    parseImportSpecifier_: function() {441      var start = this.getTreeStartLocation_();442      var lhs = this.eatIdName_();443      var rhs = null;444      if (this.peek_(TokenType.COLON)) {445        this.eat_(TokenType.COLON);446        rhs = this.eatId_();447      }448      return new ImportSpecifier(this.getTreeLocation_(start),449          lhs, rhs);450    },451    // export  VariableStatement452    // export  FunctionDeclaration453    // export  ConstStatement454    // export  ClassDeclaration455    // export  module ModuleDefinition456    /**457     * @return {boolean}458     * @private459     */460    peekExportDeclaration_: function(load) {461      return options.modules && this.peek_(TokenType.EXPORT);462    },463    /**464     * @return {ParseTree}465     * @private466     */467    parseExportDeclaration_: function(load) {468      var start = this.getTreeStartLocation_();469      this.eat_(TokenType.EXPORT);470      var exportTree;471      switch (this.peekType_()) {472        case TokenType.CONST:473        case TokenType.LET:474        case TokenType.VAR:475          exportTree = this.parseVariableStatement_();476          break;477        case TokenType.FUNCTION:478          exportTree = this.parseFunctionDeclaration_();479          break;480        case TokenType.CLASS:481          exportTree = this.parseClassDeclaration_();482          break;483        case TokenType.IDENTIFIER:484          if (this.peekModuleDeclaration_(load)) {485            exportTree = this.parseModuleDeclaration_(load);486          } else {487            exportTree = this.parseExportMappingList_();488          }489          break;490        case TokenType.OPEN_CURLY:491          exportTree = this.parseExportMappingList_();492          break;493        default:494          this.reportError_('Unexpected symbol \'' + this.peekToken_() + '\'');495          return null;496      }497      return new ExportDeclaration(this.getTreeLocation_(start), exportTree);498    },499    parseExportMappingList_: function() {500      // This is part of the ExportDeclaration production501      // ExportMapping ("," ExportMapping)*502      var start = this.getTreeStartLocation_();503      var mappings = [this.parseExportMapping_()];504      while (this.peek_(TokenType.COMMA)) {505        this.eat_(TokenType.COMMA);506        mappings.push(this.parseExportMapping_());507      }508      this.eatPossibleImplicitSemiColon_();509      return new ExportMappingList(this.getTreeEndLocation_(start), mappings);510    },511    peekExportMapping_: function() {512      return this.peek_(TokenType.OPEN_CURLY) || this.peekId_();513    },514    parseExportMapping_: function() {515      // ExportMapping ::= ExportSpecifierSet ("from" ModuleExpression(false))?516      var start = this.getTreeStartLocation_();517      var specifierSet = this.parseExportSpecifierSet_();518      var expression = null;519      if (this.peekPredefinedString_(PredefinedName.FROM)) {520        this.eatId_(PredefinedName.FROM);521        expression = this.parseModuleExpression_(false);522      }523      return new ExportMapping(this.getTreeLocation_(start), expression,524                               specifierSet);525    },526    peekExportSpecifierSet_: function() {527      return this.peek_(TokenType.OPEN_CURLY) ||528          this.peekIdName_();529    },530    parseExportSpecifierSet_: function() {531      // ExportSpecifierSet ::= Identifier532      //     | "{" ExportSpecifier ("," ExportSpecifier)* ","? "}"533      if (!this.peek_(TokenType.OPEN_CURLY))534        return this.parseIdentifierExpression_();535      var start = this.getTreeStartLocation_();536      this.eat_(TokenType.OPEN_CURLY);537      var specifiers = [this.parseExportSpecifier_()];538      while (this.peek_(TokenType.COMMA)) {539        this.eat_(TokenType.COMMA);540        if (this.peek_(TokenType.CLOSE_CURLY))541          break;542        specifiers.push(this.parseExportSpecifier_());543      }544      this.eat_(TokenType.CLOSE_CURLY);545      return new ExportSpecifierSet(this.getTreeLocation_(start),546          specifiers);547    },548    parseExportSpecifier_: function() {549      // ExportSpecifier ::= Identifier550      //     | IdentifierName ":" Identifier551      var start = this.getTreeStartLocation_();552      var lhs, rhs = null;553      if (this.peek_(TokenType.COLON, 1)) {554        lhs = this.eatIdName_();555        this.eat_(TokenType.COLON);556        rhs = this.eatId_();557      } else {558        lhs = this.eatId_();559      }560      return new ExportSpecifier(this.getTreeLocation_(start), lhs, rhs);561    },562    peekId_: function(opt_index) {563      return this.peek_(TokenType.IDENTIFIER, opt_index);564    },565    peekIdName_: function(opt_index) {566      var type = this.peekType_(opt_index);567      return type == TokenType.IDENTIFIER || Keywords.isKeyword(type);568    },569    // TODO: ModuleLoadRedeclarationList570    // ModuleDefinition571    /**572     * @return {boolean}573     * @private574     */575    peekModuleDeclaration_: function() {576      // ModuleDeclaration ::= "module" ModuleSpecifier(load) ("," ModuleSpecifier(load))* ";"577      //                    | ModuleDefinition(load)578      // ModuleDefinition(load) ::= "module" Identifier "{" ModuleBody(load) "}"579      // ModuleSpecifier(load) ::= Identifier "from" ModuleExpression(load)580      return options.modules &&581          this.peekPredefinedString_(PredefinedName.MODULE) &&582          this.peek_(TokenType.IDENTIFIER, 1) &&583          (this.peekPredefinedString_(PredefinedName.FROM, 2) ||584           this.peek_(TokenType.OPEN_CURLY, 2));585    },586    /**587     * @return {ParseTree}588     * @private589     */590    parseModuleDeclaration_: function(load) {591      if (this.peekModuleDefinition_(load))592        return this.parseModuleDefinition_(load);593      var start = this.getTreeStartLocation_();594      this.eatId_(); // module595      var specifiers = [this.parseModuleSpecifier_(load)];596      while (this.peek_(TokenType.COMMA)) {597        this.eat_(TokenType.COMMA);598        specifiers.push(this.parseModuleSpecifier_(load));599      }600      this.eatPossibleImplicitSemiColon_();601      return new ModuleDeclaration(this.getTreeLocation_(start),602          specifiers);603    },604    /**605     * @return {boolean}606     * @private607     */608    peekClassDeclaration_: function() {609      return options.classes && this.peek_(TokenType.CLASS) && this.peekId_(1);610    },611    parseClassShared_: function(constr) {612      var start = this.getTreeStartLocation_();613      this.eat_(TokenType.CLASS);614      var name = null;615      // Name is optional for ClassExpression616      if (constr == ClassDeclaration ||617          !this.peek_(TokenType.EXTENDS) && !this.peek_(TokenType.OPEN_CURLY)) {618        name = this.parseBindingIdentifier_();619      }620      var superClass = null;621      if (this.peek_(TokenType.EXTENDS)) {622        this.eat_(TokenType.EXTENDS);623        superClass = this.parseAssignmentExpression_();624      }625      this.eat_(TokenType.OPEN_CURLY);626      var elements = this.parseClassElements_();627      this.eat_(TokenType.CLOSE_CURLY);628      return new constr(this.getTreeLocation_(start), name, superClass,629                        elements);630    },631    /**632     * @return {ParseTree}633     * @private634     */635    parseClassDeclaration_: function() {636      return this.parseClassShared_(ClassDeclaration);637    },638    /**639     * @return {ParseTree}640     * @private641     */642    parseClassExpression_: function() {643      return this.parseClassShared_(ClassExpression);644    },645    /**646     * @return {Array.<ParseTree>}647     * @private648     */649    parseClassElements_: function() {650      var result = [];651      while (this.peekClassElement_()) {652        result.push(this.parseClassElement_());653      }654      return result;655    },656    /**657     * @return {boolean}658     * @private659     */660    peekClassElement_: function() {661      return options.classes && (this.peekPropertyMethodAssignment_() ||662          this.peekGetAccessor_() || this.peekSetAccessor_());663    },664    /**665     * @return {ParseTree}666     * @private667     */668    parseClassElement_: function() {669      if (this.peekGetAccessor_())670        return this.parseGetAccessor_();671      if (this.peekSetAccessor_())672        return this.parseSetAccessor_();673      return this.parsePropertyMethodAssignment_();674    },675    /**676     * @return {ParseTree}677     * @private678     */679    parseSourceElement_: function() {680      if (this.peekFunction_()) {681        return this.parseFunctionDeclaration_();682      }683      if (this.peekClassDeclaration_()) {684        return this.parseClassDeclaration_();685      }686      // Harmony let block scoped bindings. let can only appear in687      // a block, not as a standalone statement: if() let x ... illegal688      if (this.peekLet_()) {689        return this.parseVariableStatement_();690      }691      // const and var are handled inside parseStatement692      return this.parseStatementStandard_();693    },694    peekLet_: function() {695      return options.blockBinding && this.peek_(TokenType.LET);696    },697    peekConst_: function() {698      return options.blockBinding && this.peek_(TokenType.CONST);699    },700    /**701     * @return {boolean}702     * @private703     */704    peekSourceElement_: function() {705      return this.peekFunction_() || this.peekClassDeclaration_() ||706          this.peekStatementStandard_() || this.peekLet_();707    },708    /**709     * @return {boolean}710     * @private711     */712    peekFunction_: function(opt_index) {713      var index = opt_index || 0;714      // TODO: Remove # functions715      return this.peek_(TokenType.FUNCTION, index) || this.peek_(TokenType.POUND, index);716    },717    // 13 Function Definition718    /**719     * @return {ParseTree}720     * @private721     */722    parseFunctionDeclaration_: function() {723      var start = this.getTreeStartLocation_();724      this.nextToken_(); // function or #725      var isGenerator = this.eatOpt_(TokenType.STAR) != null;726      return this.parseFunctionDeclarationTail_(start, isGenerator,727                                                this.parseBindingIdentifier_());728    },729    /**730     * @param {SourcePosition} start731     * @param {IdentifierToken} name732     * @return {ParseTree}733     * @private734     */735    parseFunctionDeclarationTail_: function(start, isGenerator, name) {736      this.eat_(TokenType.OPEN_PAREN);737      var formalParameterList = this.parseFormalParameterList_();738      this.eat_(TokenType.CLOSE_PAREN);739      var functionBody = this.parseFunctionBody_(isGenerator);740      return new FunctionDeclaration(this.getTreeLocation_(start), name,741                                     isGenerator, formalParameterList,742                                     functionBody);743    },744    /**745     * @return {ParseTree}746     * @private747     */748    parseFunctionExpression_: function() {749      var start = this.getTreeStartLocation_();750      this.nextToken_(); // function or #751      var isGenerator = this.eatOpt_(TokenType.STAR) != null;752      var name = null;753      if (this.peekBindingIdentifier_()) {754        name = this.parseBindingIdentifier_();755      }756      this.eat_(TokenType.OPEN_PAREN);757      var formalParameterList = this.parseFormalParameterList_();758      this.eat_(TokenType.CLOSE_PAREN);759      var functionBody = this.parseFunctionBody_(isGenerator);760      return new FunctionDeclaration(this.getTreeLocation_(start), name,761                                     isGenerator, formalParameterList,762                                     functionBody);763    },764    /**765     * @return {FormalParameterList}766     * @private767     */768    parseFormalParameterList_: function() {769      // FormalParameterList :770      //   ... Identifier771      //   FormalsList772      //   FormalsList , ... Identifier773      //774      // FormalsList :775      //   FormalParameter776      //   FormalsList , FormalParameter777      //778      //   FormalParameter :779      //     BindingIdentifier Initialiser?780      //     BindingPattern Initialiser?781      var start = this.getTreeStartLocation_();782      var formals;783      if (this.peekRest_()) {784        formals = [this.parseRestParameter_()];785      } else {786        formals = this.parseFormalsList_();787        if (this.peek_(TokenType.COMMA)) {788          this.eat_(TokenType.COMMA);789          formals.push(this.parseRestParameter_());790        }791      }792      return new FormalParameterList(this.getTreeLocation_(start), formals);793    },794    parseFormalsList_: function() {795      var formals = [];796      var initializerAllowed = Initializer.ALLOWED;797      while (this.peekFormalParameter_()) {798        var parameter = this.parseFormalParameter_(initializerAllowed);799        if (parameter.initializer)800            initializerAllowed = Initializer.REQUIRED;801        formals.push(parameter);802        // Lookahead to distinguish , ... and , ) which must not be consumed.803        if (this.peek_(TokenType.COMMA) && this.peekFormalParameter_(1))804          this.eat_(TokenType.COMMA);805      }806      return formals;807    },808    peekFormalParameter_: function(opt_index) {809      var index = opt_index || 0;810      return this.peekBindingIdentifier_(index) || this.peekPattern_(index);811    },812    parseFormalParameter_: function(opt_initializerAllowed) {813      return this.parseBindingElement_(opt_initializerAllowed);814    },815    parseRestParameter_: function() {816      var start = this.getTreeStartLocation_();817      this.eat_(TokenType.DOT_DOT_DOT);818      return new RestParameter(this.getTreeLocation_(start),819                               this.parseBindingIdentifier_());820    },821    /**822     * @return {Block}823     * @private824     */825    parseFunctionBody_: function(isGenerator) {826      var start = this.getTreeStartLocation_();827      this.eat_(TokenType.OPEN_CURLY);828      var allowYield = this.allowYield_;829      this.allowYield_ = isGenerator;830      var result = this.parseSourceElementList_();831      this.allowYield_ = allowYield;832      this.eat_(TokenType.CLOSE_CURLY);833      return new Block(this.getTreeLocation_(start), result);834    },835    /**836     * @return {Array.<ParseTree>}837     * @private838     */839    parseSourceElementList_: function() {840      var result = [];841      while (this.peekSourceElement_()) {842        var sourceElement = this.parseSourceElement_();843        if (!sourceElement) {844          return null;845        }846        result.push(sourceElement);847      }848      return result;849    },850    /**851     * @return {SpreadExpression}852     * @private853     */854    parseSpreadExpression_: function() {855      if (!options.spread) {856        return this.parseMissingPrimaryExpression_();857      }858      var start = this.getTreeStartLocation_();859      this.eat_(TokenType.DOT_DOT_DOT);860      var operand = this.parseAssignmentExpression_();861      return new SpreadExpression(this.getTreeLocation_(start), operand);862    },863    // 12 Statements864    /**865     * In V8, all source elements may appear where statements occur in the grammar.866     *867     * @return {ParseTree}868     * @private869     */870    parseStatement_: function() {871      return this.parseSourceElement_();872    },873    /**874     * This function reflects the ECMA standard. Most places use parseStatement instead.875     *876     * @return {ParseTree}877     * @private878     */879    parseStatementStandard_: function() {880      switch (this.peekType_()) {881        case TokenType.OPEN_CURLY:882          return this.parseBlock_();883        case TokenType.AWAIT:884          return this.parseAwaitStatement_();885        case TokenType.CONST:886          if (!options.blockBinding) {887            this.reportUnexpectedToken_();888            return null;889          }890          // Fall through.891        case TokenType.VAR:892          return this.parseVariableStatement_();893        case TokenType.SEMI_COLON:894          return this.parseEmptyStatement_();895        case TokenType.IF:896          return this.parseIfStatement_();897        case TokenType.DO:898          return this.parseDoWhileStatement_();899        case TokenType.WHILE:900          return this.parseWhileStatement_();901        case TokenType.FOR:902          return this.parseForStatement_();903        case TokenType.CONTINUE:904          return this.parseContinueStatement_();905        case TokenType.BREAK:906          return this.parseBreakStatement_();907        case TokenType.RETURN:908          return this.parseReturnStatement_();909        case TokenType.YIELD:910          return this.parseYieldStatement_();911        case TokenType.WITH:912          return this.parseWithStatement_();913        case TokenType.SWITCH:914          return this.parseSwitchStatement_();915        case TokenType.THROW:916          return this.parseThrowStatement_();917        case TokenType.TRY:918          return this.parseTryStatement_();919        case TokenType.DEBUGGER:920          return this.parseDebuggerStatement_();921        default:922          if (this.peekLabelledStatement_()) {923            return this.parseLabelledStatement_();924          }925          return this.parseExpressionStatement_();926      }927    },928    /**929     * In V8 all source elements may appear where statements appear in the grammar.930     *931     * @return {boolean}932     * @private933     */934    peekStatement_: function() {935      return this.peekSourceElement_();936    },937    /**938     * This function reflects the ECMA standard. Most places use peekStatement instead.939     *940     * @return {boolean}941     * @private942     */943    peekStatementStandard_: function() {944      switch (this.peekType_()) {945        case TokenType.CONST:946          return options.blockBinding;947        case TokenType.YIELD:948          return options.generators;949        case TokenType.AWAIT:950          return options.deferredFunctions;951        case TokenType.OPEN_CURLY:952        case TokenType.VAR:953        case TokenType.SEMI_COLON:954        case TokenType.IF:955        case TokenType.DO:956        case TokenType.WHILE:957        case TokenType.FOR:958        case TokenType.CONTINUE:959        case TokenType.BREAK:960        case TokenType.RETURN:961        case TokenType.WITH:962        case TokenType.SWITCH:963        case TokenType.THROW:964        case TokenType.TRY:965        case TokenType.DEBUGGER:966        case TokenType.IDENTIFIER:967        case TokenType.THIS:968        case TokenType.CLASS:969        case TokenType.SUPER:970        case TokenType.NUMBER:971        case TokenType.STRING:972        case TokenType.NULL:973        case TokenType.TRUE:974        case TokenType.SLASH: // regular expression literal975        case TokenType.SLASH_EQUAL: // regular expression literal976        case TokenType.FALSE:977        case TokenType.OPEN_SQUARE:978        case TokenType.OPEN_PAREN:979        case TokenType.NEW:980        case TokenType.DELETE:981        case TokenType.VOID:982        case TokenType.TYPEOF:983        case TokenType.PLUS_PLUS:984        case TokenType.MINUS_MINUS:985        case TokenType.PLUS:986        case TokenType.MINUS:987        case TokenType.TILDE:988        case TokenType.BANG:989        case TokenType.BACK_QUOTE:990          return true;991        default:992          return false;993      }994    },995    // 12.1 Block996    /**997     * @return {Block}998     * @private999     */1000    parseBlock_: function() {1001      var start = this.getTreeStartLocation_();1002      this.eat_(TokenType.OPEN_CURLY);1003      // Spec says Statement list. However functions are also embedded in the wild.1004      var result = this.parseSourceElementList_();1005      this.eat_(TokenType.CLOSE_CURLY);1006      return new Block(this.getTreeLocation_(start), result);1007    },1008    /**1009     * @return {Array.<ParseTree>}1010     * @private1011     */1012    parseStatementList_: function() {1013      var result = [];1014      while (this.peekStatement_()) {1015        result.push(this.parseStatement_());1016      }1017      return result;1018    },1019    // 12.2 Variable Statement1020    /**1021     * @return {VariableStatement}1022     * @private1023     */1024    parseVariableStatement_: function() {1025      var start = this.getTreeStartLocation_();1026      var declarations = this.parseVariableDeclarationList_();1027      this.checkInitializers_(declarations);1028      this.eatPossibleImplicitSemiColon_();1029      return new VariableStatement(this.getTreeLocation_(start), declarations);1030    },1031    /**1032     * @param {Expression=} opt_expressionIn1033     * @param {DestructuringInitializer} opt_initializer Whether destructuring1034     *     requires an initializer1035     * @return {VariableDeclarationList}1036     * @private1037     */1038    parseVariableDeclarationList_: function(opt_expressionIn, opt_initializer) {1039      var expressionIn = opt_expressionIn || Expression.NORMAL;1040      var initializer = opt_initializer || DestructuringInitializer.REQUIRED;1041      var token = this.peekType_();1042      switch (token) {1043        case TokenType.CONST:1044        case TokenType.LET:1045          if (!options.blockBinding)1046            debugger;1047        case TokenType.VAR:1048          this.eat_(token);1049          break;1050        default:1051          throw Error('unreachable');1052      }1053      var start = this.getTreeStartLocation_();1054      var declarations = [];1055      declarations.push(this.parseVariableDeclaration_(token, expressionIn,1056                                                       initializer));1057      while (this.peek_(TokenType.COMMA)) {1058        this.eat_(TokenType.COMMA);1059        declarations.push(this.parseVariableDeclaration_(token, expressionIn,1060                                                         initializer));1061      }1062      return new VariableDeclarationList(1063          this.getTreeLocation_(start), token, declarations);1064    },1065    /**1066     * VariableDeclaration :1067     *   BindingIdentifier Initialiseropt1068     *   BindingPattern Initialiser1069     *1070     * VariableDeclarationNoIn :1071     *   BindingIdentifier InitialiserNoInopt1072     *   BindingPattern InitialiserNoIn1073     *1074     * @param {TokenType} binding1075     * @param {Expression} expressionIn1076     * @param {DestructuringInitializer=} opt_initializer1077     * @return {VariableDeclaration}1078     * @private1079     */1080    parseVariableDeclaration_: function(binding, expressionIn,1081                                        opt_initializer) {1082      var initRequired = opt_initializer !== DestructuringInitializer.OPTIONAL;1083      var start = this.getTreeStartLocation_();1084      var lvalue;1085      if (this.peekPattern_())1086        lvalue = this.parseBindingPattern_();1087      else1088        lvalue = this.parseBindingIdentifier_();1089      var initializer = null;1090      if (this.peek_(TokenType.EQUAL))1091        initializer = this.parseInitializer_(expressionIn);1092      else if (lvalue.isPattern() && initRequired)1093        this.reportError_('destructuring must have an initializer');1094      return new VariableDeclaration(this.getTreeLocation_(start), lvalue, initializer);1095    },1096    /**1097     * @param {Expression} expressionIn1098     * @return {ParseTree}1099     * @private1100     */1101    parseInitializer_: function(expressionIn) {1102      this.eat_(TokenType.EQUAL);1103      return this.parseAssignmentExpression_(expressionIn);1104    },1105    // 12.3 Empty Statement1106    /**1107     * @return {EmptyStatement}1108     * @private1109     */1110    parseEmptyStatement_: function() {1111      var start = this.getTreeStartLocation_();1112      this.eat_(TokenType.SEMI_COLON);1113      return new EmptyStatement(this.getTreeLocation_(start));1114    },1115    // 12.4 Expression Statement1116    /**1117     * @return {ExpressionStatement}1118     * @private1119     */1120    parseExpressionStatement_: function() {1121      var start = this.getTreeStartLocation_();1122      var expression = this.parseExpression_();1123      this.eatPossibleImplicitSemiColon_();1124      return new ExpressionStatement(this.getTreeLocation_(start), expression);1125    },1126    // 12.5 If Statement1127    /**1128     * @return {IfStatement}1129     * @private1130     */1131    parseIfStatement_: function() {1132      var start = this.getTreeStartLocation_();1133      this.eat_(TokenType.IF);1134      this.eat_(TokenType.OPEN_PAREN);1135      var condition = this.parseExpression_();1136      this.eat_(TokenType.CLOSE_PAREN);1137      var ifClause = this.parseStatement_();1138      var elseClause = null;1139      if (this.peek_(TokenType.ELSE)) {1140        this.eat_(TokenType.ELSE);1141        elseClause = this.parseStatement_();1142      }1143      return new IfStatement(this.getTreeLocation_(start), condition, ifClause, elseClause);1144    },1145    // 12.6 Iteration Statements1146    // 12.6.1 The do-while Statement1147    /**1148     * @return {ParseTree}1149     * @private1150     */1151    parseDoWhileStatement_: function() {1152      var start = this.getTreeStartLocation_();1153      this.eat_(TokenType.DO);1154      var body = this.parseStatement_();1155      this.eat_(TokenType.WHILE);1156      this.eat_(TokenType.OPEN_PAREN);1157      var condition = this.parseExpression_();1158      this.eat_(TokenType.CLOSE_PAREN);1159      this.eatPossibleImplicitSemiColon_();1160      return new DoWhileStatement(this.getTreeLocation_(start), body, condition);1161    },1162    // 12.6.2 The while Statement1163    /**1164     * @return {ParseTree}1165     * @private1166     */1167    parseWhileStatement_: function() {1168      var start = this.getTreeStartLocation_();1169      this.eat_(TokenType.WHILE);1170      this.eat_(TokenType.OPEN_PAREN);1171      var condition = this.parseExpression_();1172      this.eat_(TokenType.CLOSE_PAREN);1173      var body = this.parseStatement_();1174      return new WhileStatement(this.getTreeLocation_(start), condition, body);1175    },1176    // 12.6.3 The for Statement1177    // 12.6.4 The for-in Statement1178    /**1179     * @return {ParseTree}1180     * @private1181     */1182    parseForStatement_: function() {1183      var start = this.getTreeStartLocation_();1184      this.eat_(TokenType.FOR);1185      this.eat_(TokenType.OPEN_PAREN);1186      var self = this;1187      function validate(variables, kind) {1188        if (variables.declarations.length > 1) {1189          self.reportError_(kind +1190              ' statement may not have more than one variable declaration');1191        }1192        var declaration = variables.declarations[0];1193        if (declaration.lvalue.isPattern() && declaration.initializer) {1194          self.reportError_(declaration.initializer.location,1195              'initializer is not allowed in ' + kind + ' loop with pattern');1196        }1197      }1198      if (this.peekVariableDeclarationList_()) {1199        var variables =1200           this.parseVariableDeclarationList_(1201              Expression.NO_IN, DestructuringInitializer.OPTIONAL);1202        if (this.peek_(TokenType.IN)) {1203          // for-in: only one declaration allowed1204          validate(variables, 'for-in');1205          var declaration = variables.declarations[0];1206          // for-in: if let/const binding used, initializer is illegal1207          if (options.blockBinding &&1208              (variables.declarationType == TokenType.LET ||1209               variables.declarationType == TokenType.CONST)) {1210            if (declaration.initializer != null) {1211               this.reportError_('let/const in for-in statement may not have initializer');1212            }1213          }1214          return this.parseForInStatement_(start, variables);1215        } else if (this.peekOf_()) {1216          // for-of: only one declaration allowed1217          validate(variables, 'for-of');1218          // for-of: initializer is illegal1219          var declaration = variables.declarations[0];1220          if (declaration.initializer != null) {1221            this.reportError_('for-of statement may not have initializer');1222          }1223          return this.parseForOfStatement_(start, variables);1224        } else {1225          // for statement: let and const must have initializers1226          this.checkInitializers_(variables);1227          return this.parseForStatement2_(start, variables);1228        }1229      }1230      if (this.peek_(TokenType.SEMI_COLON)) {1231        return this.parseForStatement2_(start, null);1232      }1233      var initializer = this.parseExpression_(Expression.NO_IN);1234      if (initializer.isLeftHandSideExpression() &&1235          (this.peek_(TokenType.IN) || this.peekOf_())) {1236        initializer = this.transformLeftHandSideExpression_(initializer);1237        if (this.peekOf_())1238          return this.parseForOfStatement_(start, initializer);1239        return this.parseForInStatement_(start, initializer);1240      }1241      return this.parseForStatement2_(start, initializer);1242    },1243    peekOf_: function() {1244      return options.forOf && this.peekPredefinedString_(PredefinedName.OF);1245    },1246    // The for-each Statement1247    // for  (  { let | var }  identifier  of  expression  )  statement1248    /**1249     * @param {SourcePosition} start1250     * @param {ParseTree} initializer1251     * @return {ParseTree}1252     * @private1253     */1254    parseForOfStatement_: function(start, initializer) {1255      this.eatId_(); // of1256      var collection = this.parseExpression_();1257      this.eat_(TokenType.CLOSE_PAREN);1258      var body = this.parseStatement_();1259      return new ForOfStatement(this.getTreeLocation_(start), initializer, collection, body);1260    },1261    /**1262     * Checks variable declaration in variable and for statements.1263     *1264     * @param {VariableDeclarationList} variables1265     * @return {void}1266     * @private1267     */1268    checkInitializers_: function(variables) {1269      if (options.blockBinding &&1270          variables.declarationType == TokenType.CONST) {1271        var type = variables.declarationType;1272        for (var i = 0; i < variables.declarations.length; i++) {1273          if (!this.checkInitializer_(type, variables.declarations[i])) {1274            break;1275          }1276        }1277      }1278    },1279    /**1280     * Checks variable declaration1281     *1282     * @param {TokenType} type1283     * @param {VariableDeclaration} declaration1284     * @return {boolan} Whether the initializer is correct.1285     * @private1286     */1287    checkInitializer_: function(type, declaration) {1288      if (options.blockBinding && type == TokenType.CONST &&1289          declaration.initializer == null) {1290        this.reportError_('const variables must have an initializer');1291        return false;1292      }1293      return true;1294    },1295    /**1296     * @return {boolean}1297     * @private1298     */1299    peekVariableDeclarationList_: function() {1300      switch (this.peekType_()) {1301        case TokenType.VAR:1302          return true;1303        case TokenType.CONST:1304        case TokenType.LET:1305          return options.blockBinding;1306        default:1307          return false;1308      }1309    },1310    // 12.6.3 The for Statement1311    /**1312     * @param {SourcePosition} start1313     * @param {ParseTree} initializer1314     * @return {ParseTree}1315     * @private1316     */1317    parseForStatement2_: function(start, initializer) {1318      this.eat_(TokenType.SEMI_COLON);1319      var condition = null;1320      if (!this.peek_(TokenType.SEMI_COLON)) {1321        condition = this.parseExpression_();1322      }1323      this.eat_(TokenType.SEMI_COLON);1324      var increment = null;1325      if (!this.peek_(TokenType.CLOSE_PAREN)) {1326        increment = this.parseExpression_();1327      }1328      this.eat_(TokenType.CLOSE_PAREN);1329      var body = this.parseStatement_();1330      return new ForStatement(this.getTreeLocation_(start), initializer, condition, increment, body);1331    },1332    // 12.6.4 The for-in Statement1333    /**1334     * @param {SourcePosition} start1335     * @param {ParseTree} initializer1336     * @return {ParseTree}1337     * @private1338     */1339    parseForInStatement_: function(start, initializer) {1340      this.eat_(TokenType.IN);1341      var collection = this.parseExpression_();1342      this.eat_(TokenType.CLOSE_PAREN);1343      var body = this.parseStatement_();1344      return new ForInStatement(this.getTreeLocation_(start), initializer, collection, body);1345    },1346    // 12.7 The continue Statement1347    /**1348     * @return {ParseTree}1349     * @private1350     */1351    parseContinueStatement_: function() {1352      var start = this.getTreeStartLocation_();1353      this.eat_(TokenType.CONTINUE);1354      var name = null;1355      if (!this.peekImplicitSemiColon_()) {1356        name = this.eatIdOpt_();1357      }1358      this.eatPossibleImplicitSemiColon_();1359      return new ContinueStatement(this.getTreeLocation_(start), name);1360    },1361    // 12.8 The break Statement1362    /**1363     * @return {ParseTree}1364     * @private1365     */1366    parseBreakStatement_: function() {1367      var start = this.getTreeStartLocation_();1368      this.eat_(TokenType.BREAK);1369      var name = null;1370      if (!this.peekImplicitSemiColon_()) {1371        name = this.eatIdOpt_();1372      }1373      this.eatPossibleImplicitSemiColon_();1374      return new BreakStatement(this.getTreeLocation_(start), name);1375    },1376    //12.9 The return Statement1377    /**1378     * @return {ParseTree}1379     * @private1380     */1381    parseReturnStatement_: function() {1382      var start = this.getTreeStartLocation_();1383      this.eat_(TokenType.RETURN);1384      var expression = null;1385      if (!this.peekImplicitSemiColon_()) {1386        expression = this.parseExpression_();1387      }1388      this.eatPossibleImplicitSemiColon_();1389      return new ReturnStatement(this.getTreeLocation_(start), expression);1390    },1391    // Harmony: The yield Statement1392    //  yield  [expression];1393    /**1394     * @return {ParseTree}1395     * @private1396     */1397    parseYieldStatement_: function() {1398      if (!this.allowYield_) {1399        return this.parseMissingPrimaryExpression_(1400            "'yield' expressions are only allowed inside 'function*'");1401      }1402      var start = this.getTreeStartLocation_();1403      this.eat_(TokenType.YIELD);1404      var expression = null;1405      var isYieldFor = this.eatOpt_(TokenType.STAR) != null;1406      if (isYieldFor || !this.peekImplicitSemiColon_()) {1407        expression = this.parseExpression_();1408      }1409      this.eatPossibleImplicitSemiColon_();1410      return new YieldStatement(1411          this.getTreeLocation_(start), expression, isYieldFor);1412    },1413    // Harmony?: The await Statement1414    // TODO: await should be an expression, not a statement1415    // await[ identifier = ] expression;1416    /**1417     * @return {ParseTree}1418     * @private1419     */1420    parseAwaitStatement_: function() {1421      var start = this.getTreeStartLocation_();1422      this.eat_(TokenType.AWAIT);1423      var identifier = null;1424      if (this.peek_(TokenType.IDENTIFIER) && this.peek_(TokenType.EQUAL, 1)) {1425        identifier = this.eatId_();1426        this.eat_(TokenType.EQUAL);1427      }1428      var expression = this.parseExpression_();1429      this.eatPossibleImplicitSemiColon_();1430      return new AwaitStatement(this.getTreeLocation_(start), identifier, expression);1431    },1432    // 12.10 The with Statement1433    /**1434     * @return {ParseTree}1435     * @private1436     */1437    parseWithStatement_: function() {1438      var start = this.getTreeStartLocation_();1439      this.eat_(TokenType.WITH);1440      this.eat_(TokenType.OPEN_PAREN);1441      var expression = this.parseExpression_();1442      this.eat_(TokenType.CLOSE_PAREN);1443      var body = this.parseStatement_();1444      return new WithStatement(this.getTreeLocation_(start), expression, body);1445    },1446    // 12.11 The switch Statement1447    /**1448     * @return {ParseTree}1449     * @private1450     */1451    parseSwitchStatement_: function() {1452      var start = this.getTreeStartLocation_();1453      this.eat_(TokenType.SWITCH);1454      this.eat_(TokenType.OPEN_PAREN);1455      var expression = this.parseExpression_();1456      this.eat_(TokenType.CLOSE_PAREN);1457      this.eat_(TokenType.OPEN_CURLY);1458      var caseClauses = this.parseCaseClauses_();1459      this.eat_(TokenType.CLOSE_CURLY);1460      return new SwitchStatement(this.getTreeLocation_(start), expression, caseClauses);1461    },1462    /**1463     * @return {Array.<ParseTree>}1464     * @private1465     */1466    parseCaseClauses_: function() {1467      var foundDefaultClause = false;1468      var result = [];1469      while (true) {1470        var start = this.getTreeStartLocation_();1471        switch (this.peekType_()) {1472          case TokenType.CASE:1473            this.eat_(TokenType.CASE);1474            var expression = this.parseExpression_();1475            this.eat_(TokenType.COLON);1476            var statements = this.parseCaseStatementsOpt_();1477            result.push(new CaseClause(this.getTreeLocation_(start), expression, statements));1478            break;1479          case TokenType.DEFAULT:1480            if (foundDefaultClause) {1481              this.reportError_('Switch statements may have at most one default clause');1482            } else {1483              foundDefaultClause = true;1484            }1485            this.eat_(TokenType.DEFAULT);1486            this.eat_(TokenType.COLON);1487            result.push(new DefaultClause(this.getTreeLocation_(start), this.parseCaseStatementsOpt_()));1488            break;1489          default:1490            return result;1491        }1492      }1493    },1494    /**1495     * @return {Array.<ParseTree>}1496     * @private1497     */1498    parseCaseStatementsOpt_: function() {1499      return this.parseStatementList_();1500    },1501    // 12.12 Labelled Statement1502    /**1503     * @return {ParseTree}1504     * @private1505     */1506    parseLabelledStatement_: function() {1507      var start = this.getTreeStartLocation_();1508      var name = this.eatId_();1509      this.eat_(TokenType.COLON);1510      return new LabelledStatement(this.getTreeLocation_(start), name,1511                                   this.parseStatement_());1512    },1513    /**1514     * @return {boolean}1515     * @private1516     */1517    peekLabelledStatement_: function() {1518      return this.peek_(TokenType.IDENTIFIER) &&1519          this.peek_(TokenType.COLON, 1);1520    },1521    // 12.13 Throw Statement1522    /**1523     * @return {ParseTree}1524     * @private1525     */1526    parseThrowStatement_: function() {1527      var start = this.getTreeStartLocation_();1528      this.eat_(TokenType.THROW);1529      var value = null;1530      if (!this.peekImplicitSemiColon_()) {1531        value = this.parseExpression_();1532      }1533      this.eatPossibleImplicitSemiColon_();1534      return new ThrowStatement(this.getTreeLocation_(start), value);1535    },1536    // 12.14 Try Statement1537    /**1538     * @return {ParseTree}1539     * @private1540     */1541    parseTryStatement_: function() {1542      var start = this.getTreeStartLocation_();1543      this.eat_(TokenType.TRY);1544      var body = this.parseBlock_();1545      var catchBlock = null;1546      if (this.peek_(TokenType.CATCH)) {1547        catchBlock = this.parseCatch_();1548      }1549      var finallyBlock = null;1550      if (this.peek_(TokenType.FINALLY)) {1551        finallyBlock = this.parseFinallyBlock_();1552      }1553      if (catchBlock == null && finallyBlock == null) {1554        this.reportError_("'catch' or 'finally' expected.");1555      }1556      return new TryStatement(this.getTreeLocation_(start), body, catchBlock, finallyBlock);1557    },1558    /**1559     * Catch :1560     *   catch ( CatchParameter ) Block1561     *1562     * CatchParameter :1563     *   BindingIdentifier1564     *   BindingPattern1565     *1566     * @return {ParseTree}1567     * @private1568     */1569    parseCatch_: function() {1570      var start = this.getTreeStartLocation_();1571      var catchBlock;1572      this.eat_(TokenType.CATCH);1573      this.eat_(TokenType.OPEN_PAREN);1574      var binding;1575      if (this.peekPattern_())1576        binding = this.parseBindingPattern_();1577      else1578        binding = this.parseBindingIdentifier_();1579      this.eat_(TokenType.CLOSE_PAREN);1580      var catchBody = this.parseBlock_();1581      catchBlock = new Catch(this.getTreeLocation_(start), binding,1582                             catchBody);1583      return catchBlock;1584    },1585    /**1586     * @return {ParseTree}1587     * @private1588     */1589    parseFinallyBlock_: function() {1590      var start = this.getTreeStartLocation_();1591      this.eat_(TokenType.FINALLY);1592      var finallyBlock = this.parseBlock_();1593      return new Finally(this.getTreeLocation_(start), finallyBlock);1594    },1595    // 12.15 The Debugger Statement1596    /**1597     * @return {ParseTree}1598     * @private1599     */1600    parseDebuggerStatement_: function() {1601      var start = this.getTreeStartLocation_();1602      this.eat_(TokenType.DEBUGGER);1603      this.eatPossibleImplicitSemiColon_();1604      return new DebuggerStatement(this.getTreeLocation_(start));1605    },1606    // 11.1 Primary Expressions1607    /**1608     * @return {ParseTree}1609     * @private1610     */1611    parsePrimaryExpression_: function() {1612      switch (this.peekType_()) {1613        case TokenType.CLASS:1614          return options.classes ?1615              this.parseClassExpression_() :1616              this.parseMissingPrimaryExpression_();1617        case TokenType.SUPER:1618          return this.parseSuperExpression_();1619        case TokenType.THIS:1620          return this.parseThisExpression_();1621        case TokenType.IDENTIFIER:1622          return this.parseIdentifierExpression_();1623        case TokenType.NUMBER:1624        case TokenType.STRING:1625        case TokenType.TRUE:1626        case TokenType.FALSE:1627        case TokenType.NULL:1628          return this.parseLiteralExpression_();1629        case TokenType.OPEN_SQUARE:1630          return this.parseArrayLiteral_();1631        case TokenType.OPEN_CURLY:1632          return this.parseObjectLiteral_();1633        case TokenType.OPEN_PAREN:1634          return this.parseParenExpression_();1635        case TokenType.SLASH:1636        case TokenType.SLASH_EQUAL:1637          return this.parseRegularExpressionLiteral_();1638        case TokenType.BACK_QUOTE:1639          return this.parseQuasiLiteral_(null);1640        default:1641          return this.parseMissingPrimaryExpression_();1642      }1643    },1644    /**1645     * @return {SuperExpression}1646     * @private1647     */1648    parseSuperExpression_: function() {1649      var start = this.getTreeStartLocation_();1650      this.eat_(TokenType.SUPER);1651      return new SuperExpression(this.getTreeLocation_(start));1652    },1653    /**1654     * @return {ThisExpression}1655     * @private1656     */1657    parseThisExpression_: function() {1658      var start = this.getTreeStartLocation_();1659      this.eat_(TokenType.THIS);1660      return new ThisExpression(this.getTreeLocation_(start));1661    },1662    peekBindingIdentifier_: function(opt_index) {1663      return this.peekId_(opt_index || 0);1664    },1665    parseBindingIdentifier_: function() {1666      var start = this.getTreeStartLocation_();1667      var identifier = this.eatId_();1668      return new BindingIdentifier(this.getTreeLocation_(start), identifier);1669    },1670    /**1671     * @return {IdentifierExpression}1672     * @private1673     */1674    parseIdentifierExpression_: function() {1675      var start = this.getTreeStartLocation_();1676      var identifier = this.eatId_();1677      return new IdentifierExpression(this.getTreeLocation_(start), identifier);1678    },1679    /**1680     * Special case of parseIdentifierExpression_ which allows keywords.1681     * @return {IdentifierExpression}1682     * @private1683     */1684    parseIdentifierNameExpression_: function() {1685      var start = this.getTreeStartLocation_();1686      var identifier = this.eatIdName_();1687      return new IdentifierExpression(this.getTreeLocation_(start), identifier);1688    },1689    /**1690     * @return {LiteralExpression}1691     * @private1692     */1693    parseLiteralExpression_: function() {1694      var start = this.getTreeStartLocation_();1695      var literal = this.nextLiteralToken_();1696      return new LiteralExpression(this.getTreeLocation_(start), literal);1697    },1698    /**1699     * @return {Token}1700     * @private1701     */1702    nextLiteralToken_: function() {1703      return this.nextToken_();1704    },1705    /**1706     * @return {ParseTree}1707     * @private1708     */1709    parseRegularExpressionLiteral_: function() {1710      var start = this.getTreeStartLocation_();1711      var literal = this.nextRegularExpressionLiteralToken_();1712      return new LiteralExpression(this.getTreeLocation_(start), literal);1713    },1714    peekSpread_: function() {1715      return this.peek_(TokenType.DOT_DOT_DOT);1716    },1717    // 11.1.4 Array Literal Expression1718    /**1719     * Parse array literal and delegates to {@code parseArrayComprehension_} as1720     * needed.1721     *1722     * ArrayLiteral :1723     *   [ Elisionopt ]1724     *   [ ElementList ]1725     *   [ ElementList , Elisionopt ]1726     *1727     * ElementList :1728     *   Elisionopt AssignmentExpression1729     *   Elisionopt ... AssignmentExpression1730     *   ElementList , Elisionopt AssignmentExpression1731     *   ElementList , Elisionopt SpreadElement1732     *1733     * Elision :1734     *   ,1735     *   Elision ,1736     *1737     * SpreadElement :1738     *   ... AssignmentExpression1739     *1740     * @return {ParseTree}1741     * @private1742     */1743    parseArrayLiteral_: function() {1744      var start = this.getTreeStartLocation_();1745      var expression;1746      var elements = [];1747      var allowFor = options.arrayComprehension;1748      this.eat_(TokenType.OPEN_SQUARE);1749      while (this.peek_(TokenType.COMMA) ||1750             this.peekSpread_() ||1751             this.peekAssignmentExpression_()) {1752        if (this.peek_(TokenType.COMMA)) {1753          expression = new NullTree();1754          allowFor = false;1755        } else {1756          expression = this.parseAssignmentOrSpread_();1757        }1758        if (allowFor && this.peek_(TokenType.FOR))1759          return this.parseArrayComprehension_(start, expression);1760        allowFor = false;1761        elements.push(expression);1762        if (!this.peek_(TokenType.CLOSE_SQUARE)) {1763          this.eat_(TokenType.COMMA);1764        }1765      }1766      this.eat_(TokenType.CLOSE_SQUARE);1767      return new ArrayLiteralExpression(1768          this.getTreeLocation_(start), elements);1769    },1770    /**1771     * Continues parsing array comprehension.1772     *1773     * ArrayComprehension :1774     *   [ Assignment  ComprehensionForList ]1775     *   [ AssignmentExpression ComprehensionForList if1776     *1777     * ComprehensionForList :1778     *   ComprehensionFor1779     *   ComprehensionForList ComprehensionFor1780     *1781     * ComprehensionFor :1782     *   for ForBinding of Expression1783     *1784     * ForBinding :1785     *   BindingIdentifier1786     *   BindingPattern1787     *1788     * @param {Location} start1789     * @param {[ParseTree} expression1790     * @return {ParseTree}1791     */1792    parseArrayComprehension_: function(start, expression) {1793      var comprehensionForList = this.parseComprehensionForList_();1794      var ifExpression = this.parseComprehensionIf_();1795      this.eat_(TokenType.CLOSE_SQUARE);1796      return new ArrayComprehension(this.getTreeLocation_(start),1797                                    expression,1798                                    comprehensionForList,1799                                    ifExpression);1800    },1801    // 11.1.4 Object Literal Expression1802    /**1803     * @return {ParseTree}1804     * @private1805     */1806    parseObjectLiteral_: function() {1807      var start = this.getTreeStartLocation_();1808      var result = [];1809      this.eat_(TokenType.OPEN_CURLY);1810      while (this.peekPropertyAssignment_()) {1811        if (this.peekGetAccessor_()) {1812          result.push(this.parseGetAccessor_());1813          this.eatPropertyOptionalComma_();1814        } else if (this.peekSetAccessor_()) {1815          result.push(this.parseSetAccessor_());1816          this.eatPropertyOptionalComma_();1817        // http://wiki.ecmascript.org/doku.php?id=harmony:concise_object_literal_extensions#methods1818        } else if (this.peekPropertyMethodAssignment_()) {1819          result.push(this.parsePropertyMethodAssignment_());1820          this.eatPropertyOptionalComma_();1821        } else {1822          result.push(this.parsePropertyNameAssignment_());1823          // Comma is required after name assignment.1824          if (this.eatOpt_(TokenType.COMMA) == null) {1825            break;1826          }1827        }1828      }1829      this.eat_(TokenType.CLOSE_CURLY);1830      return new ObjectLiteralExpression(this.getTreeLocation_(start), result);1831    },1832    eatPropertyOptionalComma_: function() {1833      if (options.propertyOptionalComma) {1834        this.eatOpt_(TokenType.COMMA);1835      } else {1836        this.eat_(TokenType.COMMA);1837      }1838    },1839    /**1840     * @return {boolean}1841     * @private1842     */1843    peekPropertyAssignment_: function() {1844      var index = +this.peek_(TokenType.STAR);1845      return this.peekPropertyName_(index);1846    },1847    /**1848     * @return {boolean}1849     * @private1850     */1851    peekPropertyName_: function(tokenIndex) {1852      var type = this.peekType_(tokenIndex);1853      switch (type) {1854        case TokenType.IDENTIFIER:1855        case TokenType.STRING:1856        case TokenType.NUMBER:1857          return true;1858        default:1859          return Keywords.isKeyword(type);1860      }1861    },1862    /**1863     * @return {boolean}1864     * @private1865     */1866    peekGetAccessor_: function() {1867      return this.peekPredefinedString_(PredefinedName.GET) &&1868          this.peekPropertyName_(1);1869    },1870    /**1871     * @return {boolean}1872     * @private1873     */1874    peekPredefinedString_: function(string, opt_index) {1875      var index = opt_index || 0;1876      return this.peek_(TokenType.IDENTIFIER, index) && this.peekToken_(index).value === string;1877    },1878    /**1879     * @return {ParseTree}1880     * @private1881     */1882    parseGetAccessor_: function() {1883      var start = this.getTreeStartLocation_();1884      this.eatId_(); // get1885      var propertyName = this.nextToken_();1886      this.eat_(TokenType.OPEN_PAREN);1887      this.eat_(TokenType.CLOSE_PAREN);1888      var body = this.parseFunctionBody_(false);1889      return new GetAccessor(this.getTreeLocation_(start), propertyName, body);1890    },1891    /**1892     * @return {boolean}1893     * @private1894     */1895    peekSetAccessor_: function() {1896      return this.peekPredefinedString_(PredefinedName.SET) &&1897          this.peekPropertyName_(1);1898    },1899    /**1900     * @return {ParseTree}1901     * @private1902     */1903    parseSetAccessor_: function() {1904      var start = this.getTreeStartLocation_();1905      this.eatId_(); // set1906      var propertyName = this.nextToken_();1907      this.eat_(TokenType.OPEN_PAREN);1908      var parameter = this.parsePropertySetParameterList_();1909      this.eat_(TokenType.CLOSE_PAREN);1910      var body = this.parseFunctionBody_(false);1911      return new SetAccessor(this.getTreeLocation_(start), propertyName,1912                             parameter, body);1913    },1914    /**1915     * PropertySetParameterList :1916     *   BindingIdentifier1917     *   BindingPattern1918     */1919    parsePropertySetParameterList_: function() {1920      var start = this.getTreeStartLocation_();1921      var binding;1922      if (this.peekPattern_())1923        binding = this.parseBindingPattern_();1924      else1925        binding = this.parseBindingIdentifier_();1926      return new BindingElement(this.getTreeLocation_(start), binding, null);1927    },1928    /**1929     * @return {ParseTree}1930     * @private1931     */1932    parsePropertyNameAssignment_: function() {1933      var start = this.getTreeStartLocation_();1934      // http://wiki.ecmascript.org/doku.php?id=strawman:object_initialiser_shorthand1935      if (this.peek_(TokenType.COLON, 1)) {1936        var name = this.nextToken_();1937        this.eat_(TokenType.COLON);1938        var value = this.parseAssignmentExpression_();1939        return new PropertyNameAssignment(this.getTreeLocation_(start), name,1940                                          value);1941      } else {1942        return this.parsePropertyNameShorthand_();1943      }1944    },1945    peekPropertyMethodAssignment_: function() {1946      var index = +this.peek_(TokenType.STAR);1947      return options.propertyMethods &&1948          this.peekPropertyName_(index) &&1949          this.peek_(TokenType.OPEN_PAREN, index + 1);1950    },1951    /**1952     * @return {ParseTree}1953     * @private1954     */1955    parsePropertyMethodAssignment_: function() {1956      var start = this.getTreeStartLocation_();1957      // Note that parsePropertyAssignment_ already limits name to String,1958      // Number & IdentfierName.1959      var isGenerator = this.eatOpt_(TokenType.STAR) != null;1960      var name = this.nextToken_();1961      this.eat_(TokenType.OPEN_PAREN);1962      var formalParameterList = this.parseFormalParameterList_();1963      this.eat_(TokenType.CLOSE_PAREN);1964      var functionBody = this.parseFunctionBody_(isGenerator);1965      return new PropertyMethodAssignment(this.getTreeLocation_(start),1966          name, isGenerator, formalParameterList, functionBody);1967    },1968    /**1969     * @return {ParseTree}1970     * @private1971     */1972    parsePropertyNameShorthand_: function() {1973      var start = this.getTreeStartLocation_();1974      var name = this.eatId_();1975      if (!options.propertyNameShorthand) {1976        this.eat_(TokenType.COLON);1977        return null;1978      }1979      return new PropertyNameShorthand(this.getTreeLocation_(start), name);1980    },1981    /**1982     * @return {ParseTree}1983     * @private1984     */1985    parseParenExpression_: function() {1986      // Parse arrow function will return a ParenExpression if there isn't an1987      // arrow after the ( CoverFormals ).1988      return this.parseArrowFunction_();1989    },1990    /**1991     * @param {string=} opt_message Error message to report.1992     * @return {ParseTree}1993     * @private1994     */1995    parseMissingPrimaryExpression_: function(opt_message) {1996      var start = this.getTreeStartLocation_();1997      this.reportError_(opt_message || 'primary expression expected');1998      var token = this.nextToken_();1999      return new MissingPrimaryExpression(this.getTreeLocation_(start), token);2000    },2001    // 11.14 Expressions2002    /**2003     * @return {boolean}2004     * @private2005     */2006    peekExpression_: function(opt_index) {2007      switch (this.peekType_(opt_index || 0)) {2008        case TokenType.BACK_QUOTE:2009          return options.quasi;2010        case TokenType.BANG:2011        case TokenType.CLASS:2012        case TokenType.DELETE:2013        case TokenType.FALSE:2014        case TokenType.FUNCTION:2015        case TokenType.IDENTIFIER:2016        case TokenType.MINUS:2017        case TokenType.MINUS_MINUS:2018        case TokenType.NEW:2019        case TokenType.NULL:2020        case TokenType.NUMBER:2021        case TokenType.OPEN_CURLY:2022        case TokenType.OPEN_PAREN:2023        case TokenType.OPEN_SQUARE:2024        case TokenType.PLUS:2025        case TokenType.PLUS_PLUS:2026        case TokenType.SLASH: // regular expression literal2027        case TokenType.SLASH_EQUAL:2028        case TokenType.STRING:2029        case TokenType.SUPER:2030        case TokenType.THIS:2031        case TokenType.TILDE:2032        case TokenType.TRUE:2033        case TokenType.TYPEOF:2034        case TokenType.VOID:2035          return true;2036        default:2037          return false;2038      }2039    },2040    /**2041     * Expression :2042     *   AssignmentExpression2043     *   Expression , AssignmentExpression2044     *2045     * ExpressionNoIn :2046     *   AssignmentExpressionNoIn2047     *   ExpressionNoIn , AssignmentExpressionNoIn2048     *2049     * @return {ParseTree}2050     * @private2051     */2052    parseExpression_: function(opt_expressionIn) {2053      var expressionIn = opt_expressionIn || Expression.IN;2054      var start = this.getTreeStartLocation_();2055      var result = this.parseAssignmentExpression_(expressionIn);2056      if (this.peek_(TokenType.COMMA)) {2057        var exprs = [];2058        exprs.push(result);2059        // Lookahead to prevent comma expression from consuming , ...2060        while (this.peek_(TokenType.COMMA) &&2061               this.peekAssignmentExpression_(1)) {2062          this.eat_(TokenType.COMMA);2063          exprs.push(this.parseAssignmentExpression_(expressionIn));2064        }2065        return new CommaExpression(this.getTreeLocation_(start), exprs);2066      }2067      return result;2068    },2069    // 11.13 Assignment expressions2070    /**2071     * @return {boolean}2072     * @private2073     */2074    peekAssignmentExpression_: function(opt_index) {2075      return this.peekExpression_(opt_index || 0);2076    },2077    /**2078     * AssignmentExpression :2079     *   ConditionalExpression2080     *   YieldExpression2081     *   ArrowFunction2082     *   LeftHandSideExpression = AssignmentExpression2083     *   LeftHandSideExpression AssignmentOperator AssignmentExpression2084     *2085     * AssignmentExpressionNoIn :2086     *   ConditionalExpressionNoIn2087     *   YieldExpression2088     *   ArrowFunction2089     *   LeftHandSideExpression = AssignmentExpressionNoIn2090     *   LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn2091     *2092     * @param {Expression} expressionIn2093     * @return {ParseTree}2094     * @private2095     */2096    parseAssignmentExpression_: function(opt_expressionIn) {2097      if (this.peekBindingIdentifier_() && this.peekArrow_(1))2098        return this.parseArrowFunction_();2099      // The remaining arrow function cases are handled in2100      // parseParenExpression_.2101      var expressionIn = opt_expressionIn || Expression.NORMAL;2102      var start = this.getTreeStartLocation_();2103      var left = this.parseConditional_(expressionIn);2104      if (this.peekAssignmentOperator_()) {2105        if (this.peek_(TokenType.EQUAL))2106          left = this.transformLeftHandSideExpression_(left);2107        if (!left.isLeftHandSideExpression() && !left.isPattern()) {2108          this.reportError_('Left hand side of assignment must be new, call, member, function, primary expressions or destructuring pattern');2109        }2110        var operator = this.nextToken_();2111        var right = this.parseAssignmentExpression_(expressionIn);2112        return new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2113      }2114      return left;2115    },2116    /**2117     * Transforms a LeftHandSideExpression into a AssignmentPattern if possible.2118     * This returns the transformed tree if it parses as an AssignmentPattern,2119     * otherwise it returns the original tree.2120     * @param {ParseTree} tree2121     * @return {ParseTree}2122     */2123    transformLeftHandSideExpression_: function(tree) {2124      switch (tree.type) {2125        case ParseTreeType.ARRAY_LITERAL_EXPRESSION:2126        case ParseTreeType.OBJECT_LITERAL_EXPRESSION:2127          var errorReporter = new MutedErrorReporter();2128          var p = new Parser(errorReporter,2129                             this.scanner_.getFile(),2130                             tree.location.start.offset);2131          var transformedTree = p.parseAssignmentPattern_();2132          if (!errorReporter.hadError())2133            return transformedTree;2134          break;2135        case ParseTreeType.PAREN_EXPRESSION:2136          var expression =2137              this.transformLeftHandSideExpression_(tree.expression);2138          if (expression !== tree.expression)2139            return new ParenExpression(tree.location, expression);2140      }2141      return tree;2142    },2143    /**2144     * @return {boolean}2145     * @private2146     */2147    peekAssignmentOperator_: function() {2148      var token = this.peekToken_();2149      return !!token && token.isAssignmentOperator();2150    },2151    // 11.12 Conditional Expression2152    /**2153     * @param {Expression} expressionIn2154     * @return {ParseTree}2155     * @private2156     */2157    parseConditional_: function(expressionIn) {2158      var start = this.getTreeStartLocation_();2159      var condition = this.parseLogicalOR_(expressionIn);2160      if (this.peek_(TokenType.QUESTION)) {2161        this.eat_(TokenType.QUESTION);2162        var left = this.parseAssignmentExpression_();2163        this.eat_(TokenType.COLON);2164        var right = this.parseAssignmentExpression_(expressionIn);2165        return new ConditionalExpression(this.getTreeLocation_(start), condition, left, right);2166      }2167      return condition;2168    },2169    // 11.11 Logical OR2170    /**2171     * @param {Expression} expressionIn2172     * @return {ParseTree}2173     * @private2174     */2175    parseLogicalOR_: function(expressionIn) {2176      var start = this.getTreeStartLocation_();2177      var left = this.parseLogicalAND_(expressionIn);2178      while (this.peek_(TokenType.OR)) {2179        var operator = this.eat_(TokenType.OR);2180        var right = this.parseLogicalAND_(expressionIn);2181        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2182      }2183      return left;2184    },2185    // 11.11 Logical AND2186    /**2187     * @param {Expression} expressionIn2188     * @return {ParseTree}2189     * @private2190     */2191    parseLogicalAND_: function(expressionIn) {2192      var start = this.getTreeStartLocation_();2193      var left = this.parseBitwiseOR_(expressionIn);2194      while (this.peek_(TokenType.AND)) {2195        var operator = this.eat_(TokenType.AND);2196        var right = this.parseBitwiseOR_(expressionIn);2197        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2198      }2199      return left;2200    },2201    // 11.10 Bitwise OR2202    /**2203     * @param {Expression} expressionIn2204     * @return {ParseTree}2205     * @private2206     */2207    parseBitwiseOR_: function(expressionIn) {2208      var start = this.getTreeStartLocation_();2209      var left = this.parseBitwiseXOR_(expressionIn);2210      while (this.peek_(TokenType.BAR)) {2211        var operator = this.eat_(TokenType.BAR);2212        var right = this.parseBitwiseXOR_(expressionIn);2213        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2214      }2215      return left;2216    },2217    // 11.10 Bitwise XOR2218    /**2219     * @param {Expression} expressionIn2220     * @return {ParseTree}2221     * @private2222     */2223    parseBitwiseXOR_: function(expressionIn) {2224      var start = this.getTreeStartLocation_();2225      var left = this.parseBitwiseAND_(expressionIn);2226      while (this.peek_(TokenType.CARET)) {2227        var operator = this.eat_(TokenType.CARET);2228        var right = this.parseBitwiseAND_(expressionIn);2229        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2230      }2231      return left;2232    },2233    // 11.10 Bitwise AND2234    /**2235     * @param {Expression} expressionIn2236     * @return {ParseTree}2237     * @private2238     */2239    parseBitwiseAND_: function(expressionIn) {2240      var start = this.getTreeStartLocation_();2241      var left = this.parseEquality_(expressionIn);2242      while (this.peek_(TokenType.AMPERSAND)) {2243        var operator = this.eat_(TokenType.AMPERSAND);2244        var right = this.parseEquality_(expressionIn);2245        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2246      }2247      return left;2248    },2249    // 11.9 Equality Expression2250    /**2251     * @param {Expression} expressionIn2252     * @return {ParseTree}2253     * @private2254     */2255    parseEquality_: function(expressionIn) {2256      var start = this.getTreeStartLocation_();2257      var left = this.parseRelational_(expressionIn);2258      while (this.peekEqualityOperator_()) {2259        var operator = this.nextToken_();2260        var right = this.parseRelational_(expressionIn);2261        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2262      }2263      return left;2264    },2265    /**2266     * @return {boolean}2267     * @private2268     */2269    peekEqualityOperator_: function() {2270      switch (this.peekType_()) {2271        case TokenType.EQUAL_EQUAL:2272        case TokenType.NOT_EQUAL:2273        case TokenType.EQUAL_EQUAL_EQUAL:2274        case TokenType.NOT_EQUAL_EQUAL:2275          return true;2276        default:2277          if (!options.isExpression)2278            return false;2279          var token = this.peekTokenNoLineTerminator_();2280          return token && token.type === TokenType.IDENTIFIER &&2281              (token.value === PredefinedName.IS ||2282               token.value === PredefinedName.ISNT);2283      }2284    },2285    // 11.8 Relational2286    /**2287     * @param {Expression} expressionIn2288     * @return {ParseTree}2289     * @private2290     */2291    parseRelational_: function(expressionIn) {2292      var start = this.getTreeStartLocation_();2293      var left = this.parseShiftExpression_();2294      while (this.peekRelationalOperator_(expressionIn)) {2295        var operator = this.nextToken_();2296        var right = this.parseShiftExpression_();2297        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2298      }2299      return left;2300    },2301    /**2302     * @param {Expression} expressionIn2303     * @return {boolean}2304     * @private2305     */2306    peekRelationalOperator_: function(expressionIn) {2307      switch (this.peekType_()) {2308        case TokenType.OPEN_ANGLE:2309        case TokenType.CLOSE_ANGLE:2310        case TokenType.GREATER_EQUAL:2311        case TokenType.LESS_EQUAL:2312        case TokenType.INSTANCEOF:2313          return true;2314        case TokenType.IN:2315          return expressionIn == Expression.NORMAL;2316        default:2317          return false;2318      }2319    },2320    // 11.7 Shift Expression2321    /**2322     * @return {ParseTree}2323     * @private2324     */2325    parseShiftExpression_: function() {2326      var start = this.getTreeStartLocation_();2327      var left = this.parseAdditiveExpression_();2328      while (this.peekShiftOperator_()) {2329        var operator = this.nextToken_();2330        var right = this.parseAdditiveExpression_();2331        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2332      }2333      return left;2334    },2335    /**2336     * @return {boolean}2337     * @private2338     */2339    peekShiftOperator_: function() {2340      switch (this.peekType_()) {2341        case TokenType.LEFT_SHIFT:2342        case TokenType.RIGHT_SHIFT:2343        case TokenType.UNSIGNED_RIGHT_SHIFT:2344          return true;2345        default:2346          return false;2347      }2348    },2349    // 11.6 Additive Expression2350    /**2351     * @return {ParseTree}2352     * @private2353     */2354    parseAdditiveExpression_: function() {2355      var start = this.getTreeStartLocation_();2356      var left = this.parseMultiplicativeExpression_();2357      while (this.peekAdditiveOperator_()) {2358        var operator = this.nextToken_();2359        var right = this.parseMultiplicativeExpression_();2360        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2361      }2362      return left;2363    },2364    /**2365     * @return {boolean}2366     * @private2367     */2368    peekAdditiveOperator_: function() {2369      switch (this.peekType_()) {2370        case TokenType.PLUS:2371        case TokenType.MINUS:2372          return true;2373        default:2374          return false;2375      }2376    },2377    // 11.5 Multiplicative Expression2378    /**2379     * @return {ParseTree}2380     * @private2381     */2382    parseMultiplicativeExpression_: function() {2383      var start = this.getTreeStartLocation_();2384      var left = this.parseUnaryExpression_();2385      while (this.peekMultiplicativeOperator_()) {2386        var operator = this.nextToken_();2387        var right = this.parseUnaryExpression_();2388        left = new BinaryOperator(this.getTreeLocation_(start), left, operator, right);2389      }2390      return left;2391    },2392    /**2393     * @return {boolean}2394     * @private2395     */2396    peekMultiplicativeOperator_: function() {2397      switch (this.peekType_()) {2398        case TokenType.STAR:2399        case TokenType.SLASH:2400        case TokenType.PERCENT:2401          return true;2402        default:2403          return false;2404      }2405    },2406    // 11.4 Unary Operator2407    /**2408     * @return {ParseTree}2409     * @private2410     */2411    parseUnaryExpression_: function() {2412      var start = this.getTreeStartLocation_();2413      if (this.peekUnaryOperator_()) {2414        var operator = this.nextToken_();2415        var operand = this.parseUnaryExpression_();2416        return new UnaryExpression(this.getTreeLocation_(start), operator, operand);2417      }2418      return this.parsePostfixExpression_();2419    },2420    /**2421     * @return {boolean}2422     * @private2423     */2424    peekUnaryOperator_: function() {2425      switch (this.peekType_()) {2426        case TokenType.DELETE:2427        case TokenType.VOID:2428        case TokenType.TYPEOF:2429        case TokenType.PLUS_PLUS:2430        case TokenType.MINUS_MINUS:2431        case TokenType.PLUS:2432        case TokenType.MINUS:2433        case TokenType.TILDE:2434        case TokenType.BANG:2435          return true;2436        default:2437          return false;2438      }2439    },2440    // 11.3 Postfix Expression2441    /**2442     * @return {ParseTree}2443     * @private2444     */2445    parsePostfixExpression_: function() {2446      var start = this.getTreeStartLocation_();2447      var operand = this.parseLeftHandSideExpression_();2448      while (this.peekPostfixOperator_()) {2449        var operator = this.nextToken_();2450        operand = new PostfixExpression(this.getTreeLocation_(start), operand, operator);2451      }2452      return operand;2453    },2454    /**2455     * @return {boolean}2456     * @private2457     */2458    peekPostfixOperator_: function() {2459      if (this.peekImplicitSemiColon_()) {2460        return false;2461      }2462      switch (this.peekType_()) {2463        case TokenType.PLUS_PLUS:2464        case TokenType.MINUS_MINUS:2465          return true;2466        default:2467          return false;2468      }2469    },2470    // 11.2 Left hand side expression2471    //2472    // Also inlines the call expression productions2473    /**2474     * LeftHandSideExpression :2475     *   NewExpression2476     *   CallExpression2477     *2478     * @return {ParseTree}2479     * @private2480     */2481    parseLeftHandSideExpression_: function() {2482      var start = this.getTreeStartLocation_();2483      var operand = this.parseNewExpression_();2484      // this test is equivalent to is member expression2485      if (!(operand instanceof NewExpression) || operand.args != null) {2486        // The Call expression productions2487        while (this.peekCallSuffix_()) {2488          switch (this.peekType_()) {2489            case TokenType.OPEN_PAREN:2490              var args = this.parseArguments_();2491              operand = new CallExpression(this.getTreeLocation_(start),2492                                           operand, args);2493              break;2494            case TokenType.OPEN_SQUARE:2495              this.eat_(TokenType.OPEN_SQUARE);2496              var member = this.parseExpression_();2497              this.eat_(TokenType.CLOSE_SQUARE);2498              operand = new MemberLookupExpression(this.getTreeLocation_(start),2499                                                   operand, member);2500              break;2501            case TokenType.PERIOD:2502              this.eat_(TokenType.PERIOD);2503              operand = new MemberExpression(this.getTreeLocation_(start),2504                                             operand, this.eatIdName_());2505              break;2506            case TokenType.PERIOD_OPEN_CURLY:2507              var expressions = this.parseCascadeExpressions_();2508              operand = new CascadeExpression(this.getTreeLocation_(start),2509                                              operand, expressions);2510              break;2511            case TokenType.BACK_QUOTE:2512              operand = this.parseQuasiLiteral_(operand);2513              break;2514          }2515        }2516      }2517      return operand;2518    },2519    /**2520     * @return {boolean}2521     * @private2522     */2523    peekCallSuffix_: function() {2524      return this.peek_(TokenType.OPEN_PAREN) ||2525          this.peek_(TokenType.OPEN_SQUARE) ||2526          this.peek_(TokenType.PERIOD) ||2527          options.quasi && this.peek_(TokenType.BACK_QUOTE) ||2528          options.cascadeExpression && this.peek_(TokenType.PERIOD_OPEN_CURLY);2529    },2530    // 11.2 Member Expression without the new production2531    /**2532     * @return {ParseTree}2533     * @private2534     */2535    parseMemberExpressionNoNew_: function() {2536      var start = this.getTreeStartLocation_();2537      var operand;2538      if (this.peekFunction_()) {2539        operand = this.parseFunctionExpression_();2540      } else {2541        operand = this.parsePrimaryExpression_();2542      }2543      while (this.peekMemberExpressionSuffix_()) {2544        switch (this.peekType_()) {2545          case TokenType.OPEN_SQUARE:2546            this.eat_(TokenType.OPEN_SQUARE);2547            var member = this.parseExpression_();2548            this.eat_(TokenType.CLOSE_SQUARE);2549            operand = new MemberLookupExpression(this.getTreeLocation_(start),2550                                                 operand, member);2551            break;2552          case TokenType.PERIOD:2553            this.eat_(TokenType.PERIOD);2554            operand = new MemberExpression(this.getTreeLocation_(start),2555                                           operand, this.eatIdName_());2556            break;2557          case TokenType.PERIOD_OPEN_CURLY:2558            var expressions = this.parseCascadeExpressions_();2559            operand = new CascadeExpression(this.getTreeLocation_(start),2560                                            operand, expressions);2561            break;2562          case TokenType.BACK_QUOTE:2563            operand = this.parseQuasiLiteral_(operand);2564            break;2565        }2566      }2567      return operand;2568    },2569    parseCascadeExpressions_: function() {2570      this.eat_(TokenType.PERIOD_OPEN_CURLY);2571      var expressions = [];2572      while (this.peekId_() && this.peekAssignmentExpression_()) {2573        expressions.push(this.parseCascadeExpression_());2574        this.eatPossibleImplicitSemiColon_();2575      }2576      this.eat_(TokenType.CLOSE_CURLY);2577      return expressions;2578    },2579    parseCascadeExpression_: function() {2580      var expr = this.parseAssignmentExpression_();2581      var operand;2582      switch (expr.type) {2583        case ParseTreeType.CALL_EXPRESSION:2584        case ParseTreeType.MEMBER_EXPRESSION:2585        case ParseTreeType.MEMBER_LOOKUP_EXPRESSION:2586        case ParseTreeType.CASCADE_EXPRESSION:2587          operand = expr.operand;2588          break;2589        case ParseTreeType.BINARY_OPERATOR:2590          operand = expr.left;2591          break;2592        default:2593          this.reportError_(expr.location,2594                            'Invalid expression. Type: ' + expr.type);2595      }2596      if (operand) {2597        switch (operand.type) {2598          case ParseTreeType.MEMBER_EXPRESSION:2599          case ParseTreeType.MEMBER_LOOKUP_EXPRESSION:2600          case ParseTreeType.CALL_EXPRESSION:2601          case ParseTreeType.CASCADE_EXPRESSION:2602          case ParseTreeType.IDENTIFIER_EXPRESSION:2603            break;2604          default:2605            this.reportError_(operand.location,2606                              'Invalid expression: ' + operand.type);2607        }2608      }2609      if (expr.type == ParseTreeType.BINARY_OPERATOR &&2610          !expr.operator.isAssignmentOperator()) {2611        this.reportError_(expr.operator, 'Invalid operator: ' + expr.operator);2612      }2613      return expr;2614    },2615    /**2616     * @return {boolean}2617     * @private2618     */2619    peekMemberExpressionSuffix_: function() {2620      return this.peek_(TokenType.OPEN_SQUARE) ||2621          this.peek_(TokenType.PERIOD) ||2622          options.quasi && this.peek_(TokenType.BACK_QUOTE) ||2623          options.cascadeExpression && this.peek_(TokenType.PERIOD_OPEN_CURLY);2624    },2625    // 11.2 New Expression2626    /**2627     * @return {ParseTree}2628     * @private2629     */2630    parseNewExpression_: function() {2631      if (this.peek_(TokenType.NEW)) {2632        var start = this.getTreeStartLocation_();2633        this.eat_(TokenType.NEW);2634        var operand = this.parseNewExpression_();2635        var args = null;2636        if (this.peek_(TokenType.OPEN_PAREN)) {2637          args = this.parseArguments_();2638        }2639        return new NewExpression(this.getTreeLocation_(start), operand, args);2640      } else {2641        return this.parseMemberExpressionNoNew_();2642      }2643    },2644    /**2645     * @return {ArgumentList}2646     * @private2647     */2648    parseArguments_: function() {2649      // ArgumentList :2650      //   AssignmentOrSpreadExpression2651      //   ArgumentList , AssignmentOrSpreadExpression2652      //2653      // AssignmentOrSpreadExpression :2654      //   ... AssignmentExpression2655      //   AssignmentExpression2656      var start = this.getTreeStartLocation_();2657      var args = [];2658      this.eat_(TokenType.OPEN_PAREN);2659      while (this.peekAssignmentOrRest_()) {2660        args.push(this.parseAssignmentOrSpread_());2661        if (!this.peek_(TokenType.CLOSE_PAREN)) {2662          this.eat_(TokenType.COMMA);2663        }2664      }2665      this.eat_(TokenType.CLOSE_PAREN);2666      return new ArgumentList(this.getTreeLocation_(start), args);2667    },2668    peekRest_: function(opt_index) {2669      return options.restParameters &&2670          this.peek_(TokenType.DOT_DOT_DOT, opt_index || 0);2671    },2672    /**2673     * Whether we have a spread expression or an assignment next.2674     *2675     * This does not peek the operand for the spread expression. This means that2676     * {@code parseAssignmentOrSpred} might still fail when this returns true.2677     *2678     * @return {boolean}2679     * @private2680     */2681    peekAssignmentOrRest_: function() {2682      return this.peekRest_() || this.peekAssignmentExpression_();2683    },2684    /**2685     * @return {ParseTree}2686     * @private2687     */2688    parseAssignmentOrSpread_: function() {2689      if (this.peekSpread_()) {2690        return this.parseSpreadExpression_();2691      }2692      return this.parseAssignmentExpression_();2693    },2694    /**2695     * Parses arrow functions and paren expressions as well as delegates to2696     * {@code parseGeneratorComprehension_} if this begins a generator2697     * comprehension.2698     *2699     * Arrow function support, see:2700     * http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax2701     *2702     * Generator comprehensions syntax is in the ES6 draft,2703     * 11.1.7 Generator Comprehensions2704     *2705     * ArrowFunction :2706     *   ArrowParameters => ConciseBody2707     *2708     * ArrowParameters :2709     *   BindingIdentifer2710     *   ( ArrowFormalParameterList )2711     *2712     * ArrowFormalParameterList :2713     *   [empty]2714     *   FunctionRestParameter2715     *   CoverFormalsList2716     *   CoverFormalsList, FunctionRestParameter2717     *2718     * ConciseBody :2719     *   [lookahead not {] AssignmentExpression2720     *   { FunctionBody }2721     *2722     * CoverFormalsList :2723     *   Expression2724     *2725     * @param {Expression=} expressionIn2726     * @return {ParseTree}2727     * @private2728     */2729    parseArrowFunction_: function(expressionIn) {2730      var start = this.getTreeStartLocation_();2731      var formals, coverFormals;2732      // BindingIdentifier =>2733      if (this.peekBindingIdentifier_() && this.peekArrow_(1)) {2734        var id = this.parseBindingIdentifier_();2735        formals = [new BindingElement(id.location, id, null)];2736      // We got here through a ParenExpression.2737      } else {2738        this.eat_(TokenType.OPEN_PAREN);2739        // () =>2740        if (this.peek_(TokenType.CLOSE_PAREN)) {2741          this.eat_(TokenType.CLOSE_PAREN);2742          formals = [];2743        // (...2744        } else if (this.peekRest_()) {2745          formals = [this.parseRestParameter_()];2746          this.eat_(TokenType.CLOSE_PAREN);2747        } else {2748          coverFormals = this.parseExpression_();2749          if (coverFormals.type === ParseTreeType.MISSING_PRIMARY_EXPRESSION)2750            return coverFormals;2751          // ( CoverFormals , ...2752          if (this.peek_(TokenType.COMMA) && this.peekRest_(1)) {2753            this.eat_(TokenType.COMMA);2754            formals = this.reparseAsFormalsList_(coverFormals);2755            if (formals)2756              formals.push(this.parseRestParameter_());2757            this.eat_(TokenType.CLOSE_PAREN);2758          // Generator comprehension2759          // ( CoverFormals for2760          } else if (this.peek_(TokenType.FOR) &&2761                     options.generatorComprehension) {2762            return this.parseGeneratorComprehension_(start, coverFormals);2763          // ( CoverFormals )2764          } else {2765            this.eat_(TokenType.CLOSE_PAREN);2766            // ( CoverFormals ) =>2767            if (this.peek_(TokenType.ARROW))2768              formals = this.reparseAsFormalsList_(coverFormals);2769          }2770        }2771      }2772      // The cover grammar could not be parsed as FormalsList.2773      if (!formals)2774        return new ParenExpression(this.getTreeLocation_(start), coverFormals);2775      this.eat_(TokenType.ARROW);2776      var body = this.parseConciseBody_();2777      var startLoc = this.getTreeLocation_(start);2778      return new ArrowFunctionExpression(startLoc,2779          new FormalParameterList(startLoc, formals),2780          body);2781    },2782    /**2783     * Reparses the {@code coverFormals} as a FormalsList. This returns null if2784     * {@code coverFormals} cannot be parsed or fully consumed as a FormalsList.2785     * @param {ParseTree} coverFormals The expression that started after the2786     *     opening paren in an arrow function.2787     * @return {Array.<ParseTree>} An aray with the items to use in a2788     *     FormalsList or {@code null} if there was an error.2789     */2790    reparseAsFormalsList_: function(coverFormals) {2791      var errorReporter = new MutedErrorReporter();2792      var p = new Parser(errorReporter,2793                         this.scanner_.getFile(),2794                         coverFormals.location.start.offset);2795      var formals = p.parseFormalsList_();2796      // We need to consume the whole coverFormals.2797      if (errorReporter.hadError() || !formals.length ||2798          formals[formals.length - 1].location.end.offset !==2799              coverFormals.location.end.offset) {2800        return null;2801      }2802      return formals;2803    },2804    /** @returns {TokenType} */2805    peekArrow_: function(opt_index) {2806      return options.arrowFunctions && this.peek_(TokenType.ARROW, opt_index);2807    },2808    /**2809     * ConciseBody :2810     *   [lookahead not {] AssignmentExpression2811     *   { FunctionBody }2812     *2813     * @param {boolean} isGenerator2814     * @return {ParseTree}2815     *2816     * @return {ParseTree} */2817    parseConciseBody_: function() {2818      // The body can be a block or an expression. A '{' is always treated as2819      // the beginning of a block.2820      if (this.peek_(TokenType.OPEN_CURLY))2821        return this.parseBlock_();2822      return this.parseAssignmentExpression_();2823    },2824    /**2825     * Continues parsing generator exressions. The opening paren and the2826     * expression is parsed by parseArrowFunction_.2827     *2828     * https://bugs.ecmascript.org/show_bug.cgi?id=3812829     *2830     * GeneratorComprehension :2831     *   ( Expression ComprehensionForList )2832     *   ( Expression ComprehensionForList if Expression )2833     *2834     * ComprehensionForList :2835     *   ComprehensionFor2836     *   ComprehensionForList ComprehensionFor2837     *2838     * ComprehensionFor :2839     *   for ForBinding of Expression2840     */2841    parseGeneratorComprehension_: function(start, expression) {2842      var comprehensionForList = this.parseComprehensionForList_();2843      var ifExpression = this.parseComprehensionIf_();2844      this.eat_(TokenType.CLOSE_PAREN);2845      return new GeneratorComprehension(this.getTreeLocation_(start),2846                                        expression,2847                                        comprehensionForList,2848                                        ifExpression);2849    },2850    parseComprehensionForList_: function() {2851      var comprehensionForList = [];2852      while (this.peek_(TokenType.FOR)) {2853        this.eat_(TokenType.FOR);2854        var innerStart = this.getTreeStartLocation_();2855        var left = this.parseForBinding_();2856        this.eatId_(PredefinedName.OF);2857        var iterator = this.parseExpression_();2858        comprehensionForList.push(2859            new ComprehensionFor(this.getTreeLocation_(innerStart),2860                                 left, iterator));2861      }2862      return comprehensionForList;2863    },2864    parseComprehensionIf_: function() {2865      if (this.peek_(TokenType.IF)) {2866        this.eat_(TokenType.IF);2867        return this.parseExpression_();2868      }2869      return null;2870    },2871    /**2872     * ForBinding :2873     *   BindingIdentifier2874     *   BindingPattern2875     */2876    parseForBinding_: function() {2877      if (this.peekPattern_())2878        return this.parseBindingPattern_();2879      return this.parseBindingIdentifier_();2880    },2881    // Destructuring; see2882    // http://wiki.ecmascript.org/doku.php?id=harmony:destructuring2883    //2884    // SpiderMonkey is much more liberal in where it allows2885    // parenthesized patterns, for example, it allows [x, ([y, z])] but2886    // those inner parentheses aren't allowed in the grammar on the ES2887    // wiki. This implementation conservatively only allows parentheses2888    // at the top-level of assignment statements.2889    peekPattern_: function(opt_index) {2890      var index = opt_index || 0;2891      return options.destructuring && (this.peekObjectPattern_(index) ||2892          this.peekArrayPattern_(index));2893    },2894    peekArrayPattern_: function(opt_index) {2895      return this.peek_(TokenType.OPEN_SQUARE, opt_index || 0);2896    },2897    peekObjectPattern_: function(opt_index) {2898      return this.peek_(TokenType.OPEN_CURLY, opt_index || 0);2899    },2900    /**2901     * BindingPattern :2902     *   ObjectBindingPattern2903     *   ArrayBindingPattern2904     */2905    parseBindingPattern_: function() {2906      if (this.peekArrayPattern_())2907        return this.parseArrayBindingPattern_();2908      return this.parseObjectBindingPattern_();2909    },2910    /**2911     * ArrayBindingPattern :2912     *   []2913     *   [ BindingElementList ]2914     *   [ BindingElementList , Elisionopt BindingRestElementopt ]2915     *2916     * BindingElementList :2917     *   Elisionopt BindingElement2918     *   BindingElementList , Elisionopt BindingElement2919     *2920     * Elision :2921     *   ,2922     *   Elision ,2923     */2924    parseArrayBindingPattern_: function() {2925      var start = this.getTreeStartLocation_();2926      var elements = [];2927      this.eat_(TokenType.OPEN_SQUARE);2928      while (this.peekBindingElement_() ||2929             this.peek_(TokenType.COMMA) ||2930             this.peekRest_()) {2931        this.parseElisionOpt_(elements);2932        if (this.peekRest_()) {2933          elements.push(this.parseBindingRestElement_());2934          break;2935        } else {2936          elements.push(this.parseBindingElement_());2937          // Trailing commas are not allowed in patterns.2938          if (this.peek_(TokenType.COMMA) &&2939              !this.peek_(TokenType.CLOSE_SQUARE, 1)) {2940            this.eat_(TokenType.COMMA);2941          }2942        }2943      }2944      this.eat_(TokenType.CLOSE_SQUARE);2945      return new ArrayPattern(this.getTreeLocation_(start), elements);2946    },2947    /**2948     * BindingElementList :2949     *   Elisionopt BindingElement2950     *   BindingElementList , Elisionopt BindingElement2951     */2952    parseBindingElementList_: function(elements) {2953      this.parseElisionOpt_(elements);2954      elements.push(this.parseBindingElement_());2955      while (this.peek_(TokenType.COMMA)) {2956        this.eat_(TokenType.COMMA);2957        this.parseElisionOpt_(elements);2958        elements.push(this.parseBindingElement_());2959      }2960    },2961    /**2962     * Parses the elision opt production and appends null to the2963     * {@code elements} array for every empty elision.2964     *2965     * @param {Array} elements The array to append to.2966     */2967    parseElisionOpt_: function(elements) {2968      while (this.peek_(TokenType.COMMA)) {2969        this.eat_(TokenType.COMMA);2970        elements.push(null);2971      }2972    },2973    /**2974     * BindingElement :2975     *   SingleNameBinding2976     *   BindingPattern Initialiseropt2977     *2978     * SingleNameBinding :2979     *   BindingIdentifier Initialiseropt2980     */2981    peekBindingElement_: function() {2982      return this.peekBindingIdentifier_() || this.peekPattern_();2983    },2984    /**2985     * @param {Initializer} opt_initializer If left out the initializer is2986     *     optional and allowed. If set to Initializer.REQUIRED there must be an2987     *     initializer.2988     * @return {ParseTree}2989     */2990    parseBindingElement_: function(opt_initializer) {2991      var start = this.getTreeStartLocation_();2992      var binding;2993      if (this.peekPattern_())2994        binding = this.parseBindingPattern_();2995      else2996        binding = this.parseBindingIdentifier_();2997      var initializer = null;2998      if (this.peek_(TokenType.EQUAL) ||2999          opt_initializer === Initializer.REQUIRED) {3000        initializer = this.parseInitializer_();3001      }3002      return new BindingElement(this.getTreeLocation_(start), binding,3003                                                      initializer);3004    },3005    /**3006     * BindingRestElement :3007     *   ... BindingIdentifier3008     */3009    parseBindingRestElement_: function() {3010      var start = this.getTreeStartLocation_();3011      this.eat_(TokenType.DOT_DOT_DOT);3012      var identifier = this.parseBindingIdentifier_();3013      return new SpreadPatternElement(this.getTreeLocation_(start), identifier);3014    },3015    /**3016     * ObjectBindingPattern :3017     *   {}3018     *   { BindingPropertyList }3019     *   { BindingPropertyList , }3020     *3021     * BindingPropertyList :3022     *   BindingProperty3023     *   BindingPropertyList , BindingProperty3024     */3025    parseObjectBindingPattern_: function() {3026      var start = this.getTreeStartLocation_();3027      var elements = [];3028      this.eat_(TokenType.OPEN_CURLY);3029      while (this.peekBindingProperty_()) {3030        elements.push(this.parseBindingProperty_());3031        if (!this.peek_(TokenType.COMMA))3032          break;3033        this.eat_(TokenType.COMMA);3034      }3035      this.eat_(TokenType.CLOSE_CURLY);3036      return new ObjectPattern(this.getTreeLocation_(start), elements);3037    },3038    /**3039     * BindingProperty :3040     *   SingleNameBinding3041     *   PropertyName : BindingElement3042     *3043     * SingleNameBinding :3044     *   BindingIdentifier Initialiseropt3045     */3046    peekBindingProperty_: function() {3047      return this.peekBindingIdentifier_() || this.peekPropertyName_();3048    },3049    parseBindingProperty_: function() {3050      var start = this.getTreeStartLocation_();3051      if (this.peek_(TokenType.COLON, 1)) {3052        var propertyName = this.nextToken_();3053        this.eat_(TokenType.COLON);3054        var binding = this.parseBindingElement_();3055        // TODO(arv): Rename ObjectPatternField to BindingProperty3056        return new ObjectPatternField(this.getTreeLocation_(start),3057                                      propertyName, binding);3058      }3059      var binding = this.parseBindingIdentifier_();3060      var initializer = null;3061      if (this.peek_(TokenType.EQUAL))3062        initializer = this.parseInitializer_();3063      return new BindingElement(this.getTreeLocation_(start), binding,3064                                initializer);3065    },3066    /**3067     * AssignmentPattern :3068     *   ObjectAssignmentPattern3069     *   ArrayAssignmentPattern3070     */3071    parseAssignmentPattern_: function() {3072      if (this.peekObjectPattern_())3073        return this.parseObjectAssignmentPattern_();3074      return this.parseArrayAssignmentPattern_();3075    },3076    /**3077     * ObjectAssignmentPattern :3078     *   {}3079     *   { AssignmentPropertyList }3080     *   { AssignmentPropertyList , }3081     *3082     * AssignmentPropertyList :3083     *   AssignmentProperty3084     *   AssignmentPropertyList , AssignmentProperty3085     *3086     * AssignmentProperty :3087     *   Identifier3088     *   PropertyName : LeftHandSideExpression3089     */3090    parseObjectAssignmentPattern_: function() {3091      var start = this.getTreeStartLocation_();3092      this.eat_(TokenType.OPEN_CURLY);3093      var fields = [];3094      var field;3095      while (this.peekId_() || this.peekPropertyName_()) {3096        if (this.peek_(TokenType.COLON, 1)) {3097          var fieldStart = this.getTreeStartLocation_();3098          var name = this.nextToken_();3099          this.eat_(TokenType.COLON);3100          var left = this.parseLeftHandSideExpression_();3101          left = this.transformLeftHandSideExpression_(left);3102          field = new ObjectPatternField(this.getTreeLocation_(start),3103                                         name, left);3104        } else {3105          field = this.parseIdentifierExpression_();3106        }3107        fields.push(field);3108        if (this.peek_(TokenType.COMMA))3109          this.eat_(TokenType.COMMA);3110        else3111          break;3112      }3113      this.eat_(TokenType.CLOSE_CURLY);3114      return new ObjectPattern(this.getTreeLocation_(start), fields);3115    },3116    /**3117     * ArrayAssignmentPattern :3118     *   [ Elisionopt AssignmentRestElementopt ]3119     *   [ AssignmentElementList ]3120     *   [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]3121     *3122     * AssignmentElementList :3123     *   Elisionopt AssignmentElement3124     *   AssignmentElementList , Elisionopt AssignmentElement3125     *3126     * AssignmentElement :3127     *   LeftHandSideExpression3128     *3129     * AssignmentRestElement :3130     *   ... LeftHandSideExpression3131     */3132    parseArrayAssignmentPattern_: function() {3133      var start = this.getTreeStartLocation_();3134      var elements = [];3135      this.eat_(TokenType.OPEN_SQUARE);3136      while (this.peek_(TokenType.COMMA) ||3137             this.peekRest_() ||3138             this.peekAssignmentExpression_()) {3139        this.parseElisionOpt_(elements);3140        if (this.peekRest_()) {3141          elements.push(this.parseAssignmentRestElement_());3142          break;3143        } else {3144          elements.push(this.parseAssignmentElement_());3145          // Trailing commas are not allowed in patterns.3146          if (this.peek_(TokenType.COMMA) &&3147              !this.peek_(TokenType.CLOSE_SQUARE, 1)) {3148            this.eat_(TokenType.COMMA);3149          }3150        }3151      }3152      this.eat_(TokenType.CLOSE_SQUARE);3153      return new ArrayPattern(this.getTreeLocation_(start), elements);3154    },3155    parseAssignmentRestElement_: function() {3156      var start = this.getTreeStartLocation_();3157      this.eat_(TokenType.DOT_DOT_DOT);3158      var left = this.parseLeftHandSideExpression_();3159      left = this.transformLeftHandSideExpression_(left);3160      return new SpreadPatternElement(this.getTreeLocation_(start), left);3161    },3162    parseAssignmentElement_: function() {3163      var tree = this.parseLeftHandSideExpression_();3164      return this.transformLeftHandSideExpression_(tree);3165    },3166    /**3167     * Quasi Literals3168     *3169     * Quasi ::3170     *   FullQuasi3171     *   QuasiHead3172     *3173     * FullQuasi ::3174     *   ` QuasiCharactersopt `3175     *3176     * QuasiHead ::3177     *   ` QuasiCharactersopt ${3178     *3179     * QuasiSubstitutionTail ::3180     *   QuasiMiddle3181     *   QuasiTail3182     *3183     * QuasiMiddle ::3184     *   } QuasiCharactersopt ${3185     *3186     * QuasiTail ::3187     *   } QuasiCharactersopt `3188     *3189     * QuasiCharacters ::3190     *   QuasiCharacter QuasiCharactersopt3191     *3192     * QuasiCharacter ::3193     *   SourceCharacter but not one of ` or \ or $3194     *   $ [lookahead not { ]3195     *   \ EscapeSequence3196     *   LineContinuation3197     *3198     * @param {ParseTree} operand3199     * @return {ParseTree}3200     * @private3201     */3202    parseQuasiLiteral_: function(operand) {3203      if (!options.quasi) {3204        return this.parseMissingPrimaryExpression_();3205      }3206      function pushSubst(tree) {3207        elements.push(new QuasiSubstitution(tree.location, tree));3208      }3209      var start = operand ?3210          operand.location.start : this.getTreeStartLocation_();3211      this.eat_(TokenType.BACK_QUOTE);3212      var elements = [];3213      while (!this.peekEndOfQuasiLiteral_()) {3214        var token = this.nextQuasiLiteralPortionToken_();3215        // start is not the right SourcePosition but we cannot use3216        // getTreeStartLocation_ here since it uses peek_ which is not safe to3217        // use inside parseQuasiLiteral_.3218        elements.push(new QuasiLiteralPortion(this.getTreeLocation_(start),3219                                              token));3220        if (!this.peekQuasiToken_(TokenType.DOLLAR))3221          break;3222        token = this.nextQuasiSubstitutionToken_();3223        traceur.assert(token.type == TokenType.DOLLAR);3224        this.eat_(TokenType.OPEN_CURLY);3225        var expression = this.parseExpression_();3226        if (!expression)3227          return this.parseMissingPrimaryExpression_();3228        pushSubst(expression);3229        this.eat_(TokenType.CLOSE_CURLY);3230      }3231      this.eat_(TokenType.BACK_QUOTE);3232      return new QuasiLiteralExpression(this.getTreeLocation_(start),3233                                        operand, elements);3234    },3235    /**3236     * Consume a (possibly implicit) semi-colon. Reports an error if a semi-colon is not present.3237     *3238     * @return {void}3239     * @private3240     */3241    eatPossibleImplicitSemiColon_: function() {3242      if (this.peek_(TokenType.SEMI_COLON) && this.peekToken_().location.start.line == this.getLastLine_()) {3243        this.eat_(TokenType.SEMI_COLON);3244        return;3245      }3246      if (this.peekImplicitSemiColon_()) {3247        return;3248      }3249      this.reportError_('Semi-colon expected');3250    },3251    /**3252     * Returns true if an implicit or explicit semi colon is at the current location.3253     *3254     * @return {boolean}3255     * @private3256     */3257    peekImplicitSemiColon_: function() {3258      return this.getNextLine_() > this.getLastLine_() ||3259          this.peek_(TokenType.SEMI_COLON) ||3260          this.peek_(TokenType.CLOSE_CURLY) ||3261          this.peek_(TokenType.END_OF_FILE);3262    },3263    /**3264     * Returns the line number of the most recently consumed token.3265     *3266     * @return {number}3267     * @private3268     */3269    getLastLine_: function() {3270      return this.scanner_.lastToken.location.end.line;3271    },3272    /**3273     * Returns the line number of the next token.3274     *3275     * @return {number}3276     * @private3277     */3278    getNextLine_: function() {3279      return this.peekToken_().location.start.line;3280    },3281    /**3282     * Consumes the next token if it is of the expected type. Otherwise returns null.3283     * Never reports errors.3284     *3285     * @param {TokenType} expectedTokenType3286     * @return {Token} The consumed token, or null if the next token is not of the expected type.3287     * @private3288     */3289    eatOpt_: function(expectedTokenType) {3290      if (this.peek_(expectedTokenType)) {3291        return this.eat_(expectedTokenType);3292      }3293      return null;3294    },3295    /**3296     * Shorthand for this.eatOpt_(TokenType.IDENTIFIER)3297     *3298     * @return {IdentifierToken}3299     * @private3300     */3301    eatIdOpt_: function() {3302      return (this.peek_(TokenType.IDENTIFIER)) ? this.eatId_() : null;3303    },3304    /**3305     * Shorthand for this.eat_(TokenType.IDENTIFIER)3306     * @param {string=} opt_expected3307     * @return {IdentifierToken}3308     * @private3309     */3310    eatId_: function(opt_expected) {3311      var result = this.eat_(TokenType.IDENTIFIER);3312      if (opt_expected) {3313        if (!result || result.value !== opt_expected) {3314          if (!result)3315            result = this.peekToken_();3316          this.reportError_(result, 'expected "' + opt_expected + '"');3317          return null;3318        }3319      }3320      return result;3321    },3322    /**3323     * Eats an identifier or keyword. Equivalent to IdentifierName in the spec.3324     *3325     * @return {Token}3326     * @private3327     */3328    eatIdName_: function() {3329      var t = this.nextToken_();3330      if (t.type != TokenType.IDENTIFIER) {3331        if (!Keywords.isKeyword(t.type)) {3332          this.reportExpectedError_(t, 'identifier');3333          return null;3334        }3335        return new IdentifierToken(t.location, t.type);3336      }3337      return t;3338    },3339    /**3340     * Consumes the next token. If the consumed token is not of the expected type then3341     * report an error and return null. Otherwise return the consumed token.3342     *3343     * @param {TokenType} expectedTokenType3344     * @return {Token} The consumed token, or null if the next token is not of the expected type.3345     * @private3346     */3347    eat_: function(expectedTokenType) {3348      var token = this.nextToken_();3349      if (token.type != expectedTokenType) {3350        this.reportExpectedError_(token, expectedTokenType);3351        return null;3352      }3353      return token;3354    },3355    /**3356     * Report a 'X' expected error message.3357     * @param {Token} token The location to report the message at.3358     * @param {Object} expected The thing that was expected.3359     *3360     * @return {void}3361     * @private3362     */3363    reportExpectedError_: function(token, expected) {3364      this.reportError_(token, "'" + expected + "' expected");3365    },3366    /**3367     * Returns a SourcePosition for the start of a parse tree that starts at the current location.3368     *3369     * @return {SourcePosition}3370     * @private3371     */3372    getTreeStartLocation_: function() {3373      return this.peekToken_().location.start;3374    },3375    /**3376     * Returns a SourcePosition for the end of a parse tree that ends at the current location.3377     *3378     * @return {SourcePosition}3379     * @private3380     */3381    getTreeEndLocation_: function() {3382      return this.scanner_.lastToken.location.end;3383    },3384    /**3385     * Returns a SourceRange for a parse tree that starts at {start} and ends at the current location.3386     *3387     * @return {SourceRange}3388     * @private3389     */3390    getTreeLocation_: function(start) {3391      return new SourceRange(start, this.getTreeEndLocation_());3392    },3393    /**3394     * Consumes the next token and returns it. Will return a never ending stream of3395     * TokenType.END_OF_FILE at the end of the file so callers don't have to check for EOF explicitly.3396     *3397     * Tokenizing is contextual. this.nextToken_() will never return a regular expression literal.3398     *3399     * @return {Token}3400     * @private3401     */3402    nextToken_: function() {3403      return this.scanner_.nextToken();3404    },3405    /**3406     * Consumes a regular expression literal token and returns it.3407     *3408     * @return {LiteralToken}3409     * @private3410     */3411    nextRegularExpressionLiteralToken_: function() {3412      return this.scanner_.nextRegularExpressionLiteralToken();3413    },3414    nextQuasiLiteralPortionToken_: function() {3415      return this.scanner_.nextQuasiLiteralPortionToken();3416    },3417    nextQuasiIdentifier_: function() {3418      return this.scanner_.nextQuasiIdentifier();3419    },3420    nextQuasiSubstitutionToken_: function() {3421      return this.scanner_.nextQuasiSubstitutionToken();3422    },3423    peekEndOfQuasiLiteral_: function() {3424      return this.peekQuasiToken_(TokenType.BACK_QUOTE) ||3425          this.peekQuasiToken_(TokenType.END_OF_FILE);3426    },3427    peekQuasiToken_: function(type) {3428      return this.scanner_.peekQuasiToken(type);3429    },3430    /**3431     * Returns true if the index-th next token is of the expected type. Does not consume any tokens.3432     *3433     * @param {TokenType} expectedType3434     * @param {number=} opt_index3435     * @return {boolean}3436     * @private3437     */3438    peek_: function(expectedType, opt_index) {3439      return this.peekType_(opt_index || 0) == expectedType;3440    },3441    /**3442     * Returns the TokenType of the index-th next token. Does not consume any tokens.3443     *3444     * @return {TokenType}3445     * @private3446     */3447    peekType_: function(opt_index) {3448      return this.peekToken_(opt_index || 0).type;3449    },3450    /**3451     * Returns the index-th next token. Does not consume any tokens.3452     *3453     * @return {Token}3454     * @private3455     */3456    peekToken_: function(opt_index) {3457      return this.scanner_.peekToken(opt_index || 0);3458    },3459    /**3460     * Returns the index-th next token. Does not allow any line terminator3461     * before the next token. Does not consume any tokens. This returns null if3462     * no token was found before the next line terminator.3463     *3464     * @return {Token}3465     * @private3466     */3467    peekTokenNoLineTerminator_: function(opt_index) {3468      return this.scanner_.peekTokenNoLineTerminator(opt_index || 0);3469    },3470    /**3471     * Reports an error message at a given token.3472     * @param {traceur.util.SourcePostion|Token} token The location to report3473     *     the message at.3474     * @param {string} message The message to report in String.format style.3475     *3476     * @return {void}3477     * @private3478     */3479    reportError_: function(var_args) {3480      if (arguments.length == 1) {3481        this.errorReporter_.reportError(this.scanner_.getPosition(),3482                                        arguments[0]);3483      } else {3484        var location = arguments[0];3485        if (location instanceof Token) {3486          location = location.location;3487        }3488        this.errorReporter_.reportError(location.start, arguments[1]);3489      }3490    },3491    reportUnexpectedToken_: function() {3492      this.reportError_(this.peekToken_(), 'Unexpected token');3493    }3494  };3495  return {3496    Parser: Parser3497  };...cssLexer.js
Source:cssLexer.js  
1"use strict";2Object.defineProperty(exports, "__esModule", { value: true });3var chars = require("./chars");4var CssTokenType;5(function (CssTokenType) {6    CssTokenType[CssTokenType["EOF"] = 0] = "EOF";7    CssTokenType[CssTokenType["String"] = 1] = "String";8    CssTokenType[CssTokenType["Comment"] = 2] = "Comment";9    CssTokenType[CssTokenType["Identifier"] = 3] = "Identifier";10    CssTokenType[CssTokenType["Number"] = 4] = "Number";11    CssTokenType[CssTokenType["IdentifierOrNumber"] = 5] = "IdentifierOrNumber";12    CssTokenType[CssTokenType["AtKeyword"] = 6] = "AtKeyword";13    CssTokenType[CssTokenType["Character"] = 7] = "Character";14    CssTokenType[CssTokenType["Whitespace"] = 8] = "Whitespace";15    CssTokenType[CssTokenType["Invalid"] = 9] = "Invalid";16})(CssTokenType = exports.CssTokenType || (exports.CssTokenType = {}));17var CssLexerMode;18(function (CssLexerMode) {19    CssLexerMode[CssLexerMode["ALL"] = 0] = "ALL";20    CssLexerMode[CssLexerMode["ALL_TRACK_WS"] = 1] = "ALL_TRACK_WS";21    CssLexerMode[CssLexerMode["SELECTOR"] = 2] = "SELECTOR";22    CssLexerMode[CssLexerMode["PSEUDO_SELECTOR"] = 3] = "PSEUDO_SELECTOR";23    CssLexerMode[CssLexerMode["PSEUDO_SELECTOR_WITH_ARGUMENTS"] = 4] = "PSEUDO_SELECTOR_WITH_ARGUMENTS";24    CssLexerMode[CssLexerMode["ATTRIBUTE_SELECTOR"] = 5] = "ATTRIBUTE_SELECTOR";25    CssLexerMode[CssLexerMode["AT_RULE_QUERY"] = 6] = "AT_RULE_QUERY";26    CssLexerMode[CssLexerMode["MEDIA_QUERY"] = 7] = "MEDIA_QUERY";27    CssLexerMode[CssLexerMode["BLOCK"] = 8] = "BLOCK";28    CssLexerMode[CssLexerMode["KEYFRAME_BLOCK"] = 9] = "KEYFRAME_BLOCK";29    CssLexerMode[CssLexerMode["STYLE_BLOCK"] = 10] = "STYLE_BLOCK";30    CssLexerMode[CssLexerMode["STYLE_VALUE"] = 11] = "STYLE_VALUE";31    CssLexerMode[CssLexerMode["STYLE_VALUE_FUNCTION"] = 12] = "STYLE_VALUE_FUNCTION";32    CssLexerMode[CssLexerMode["STYLE_CALC_FUNCTION"] = 13] = "STYLE_CALC_FUNCTION";33})(CssLexerMode = exports.CssLexerMode || (exports.CssLexerMode = {}));34var LexedCssResult = (function () {35    function LexedCssResult(error, token) {36        this.error = error;37        this.token = token;38    }39    return LexedCssResult;40}());41exports.LexedCssResult = LexedCssResult;42function generateErrorMessage(input, message, errorValue, index, row, column) {43    return message + " at column " + row + ":" + column + " in expression [" + findProblemCode(input, errorValue, index, column) + ']';44}45exports.generateErrorMessage = generateErrorMessage;46function findProblemCode(input, errorValue, index, column) {47    var endOfProblemLine = index;48    var current = charCode(input, index);49    while (current > 0 && !isNewline(current)) {50        current = charCode(input, ++endOfProblemLine);51    }52    var choppedString = input.substring(0, endOfProblemLine);53    var pointerPadding = '';54    for (var i = 0; i < column; i++) {55        pointerPadding += ' ';56    }57    var pointerString = '';58    for (var i = 0; i < errorValue.length; i++) {59        pointerString += '^';60    }61    return choppedString + '\n' + pointerPadding + pointerString + '\n';62}63exports.findProblemCode = findProblemCode;64var CssToken = (function () {65    function CssToken(index, column, line, type, strValue) {66        this.index = index;67        this.column = column;68        this.line = line;69        this.type = type;70        this.strValue = strValue;71        this.numValue = charCode(strValue, 0);72    }73    return CssToken;74}());75exports.CssToken = CssToken;76var CssLexer = (function () {77    function CssLexer() {78    }79    CssLexer.prototype.scan = function (text, trackComments) {80        if (trackComments === void 0) { trackComments = false; }81        return new CssScanner(text, trackComments);82    };83    return CssLexer;84}());85exports.CssLexer = CssLexer;86function cssScannerError(token, message) {87    var error = Error('CssParseError: ' + message);88    error[ERROR_RAW_MESSAGE] = message;89    error[ERROR_TOKEN] = token;90    return error;91}92exports.cssScannerError = cssScannerError;93var ERROR_TOKEN = 'ngToken';94var ERROR_RAW_MESSAGE = 'ngRawMessage';95function getRawMessage(error) {96    return error[ERROR_RAW_MESSAGE];97}98exports.getRawMessage = getRawMessage;99function getToken(error) {100    return error[ERROR_TOKEN];101}102exports.getToken = getToken;103function _trackWhitespace(mode) {104    switch (mode) {105        case CssLexerMode.SELECTOR:106        case CssLexerMode.PSEUDO_SELECTOR:107        case CssLexerMode.ALL_TRACK_WS:108        case CssLexerMode.STYLE_VALUE:109            return true;110        default:111            return false;112    }113}114var CssScanner = (function () {115    function CssScanner(input, _trackComments) {116        if (_trackComments === void 0) { _trackComments = false; }117        this.input = input;118        this._trackComments = _trackComments;119        this.length = 0;120        this.index = -1;121        this.column = -1;122        this.line = 0;123        this._currentMode = CssLexerMode.BLOCK;124        this._currentError = null;125        this.length = this.input.length;126        this.peekPeek = this.peekAt(0);127        this.advance();128    }129    CssScanner.prototype.getMode = function () {130        return this._currentMode;131    };132    CssScanner.prototype.setMode = function (mode) {133        if (this._currentMode != mode) {134            if (_trackWhitespace(this._currentMode) && !_trackWhitespace(mode)) {135                this.consumeWhitespace();136            }137            this._currentMode = mode;138        }139    };140    CssScanner.prototype.advance = function () {141        if (isNewline(this.peek)) {142            this.column = 0;143            this.line++;144        }145        else {146            this.column++;147        }148        this.index++;149        this.peek = this.peekPeek;150        this.peekPeek = this.peekAt(this.index + 1);151    };152    CssScanner.prototype.peekAt = function (index) {153        return index >= this.length ? chars.$EOF : this.input.charCodeAt(index);154    };155    CssScanner.prototype.consumeEmptyStatements = function () {156        this.consumeWhitespace();157        while (this.peek == chars.$SEMICOLON) {158            this.advance();159            this.consumeWhitespace();160        }161    };162    CssScanner.prototype.consumeWhitespace = function () {163        while (chars.isWhitespace(this.peek) || isNewline(this.peek)) {164            this.advance();165            if (!this._trackComments && isCommentStart(this.peek, this.peekPeek)) {166                this.advance();167                this.advance();168                while (!isCommentEnd(this.peek, this.peekPeek)) {169                    if (this.peek == chars.$EOF) {170                        this.error('Unterminated comment');171                        break;172                    }173                    this.advance();174                }175                this.advance();176                this.advance();177            }178        }179    };180    CssScanner.prototype.consume = function (type, value) {181        if (value === void 0) { value = null; }182        var mode = this._currentMode;183        this.setMode(_trackWhitespace(mode) ? CssLexerMode.ALL_TRACK_WS : CssLexerMode.ALL);184        var previousIndex = this.index;185        var previousLine = this.line;186        var previousColumn = this.column;187        var next = undefined;188        var output = this.scan();189        if (output != null) {190            if (output.error != null) {191                this.setMode(mode);192                return output;193            }194            next = output.token;195        }196        if (next == null) {197            next = new CssToken(this.index, this.column, this.line, CssTokenType.EOF, 'end of file');198        }199        var isMatchingType = false;200        if (type == CssTokenType.IdentifierOrNumber) {201            isMatchingType = next.type == CssTokenType.Number || next.type == CssTokenType.Identifier;202        }203        else {204            isMatchingType = next.type == type;205        }206        this.setMode(mode);207        var error = null;208        if (!isMatchingType || (value != null && value != next.strValue)) {209            var errorMessage = CssTokenType[next.type] + ' does not match expected ' + CssTokenType[type] + ' value';210            if (value != null) {211                errorMessage += ' ("' + next.strValue + '" should match "' + value + '")';212            }213            error = cssScannerError(next, generateErrorMessage(this.input, errorMessage, next.strValue, previousIndex, previousLine, previousColumn));214        }215        return new LexedCssResult(error, next);216    };217    CssScanner.prototype.scan = function () {218        var trackWS = _trackWhitespace(this._currentMode);219        if (this.index == 0 && !trackWS) {220            this.consumeWhitespace();221        }222        var token = this._scan();223        if (token == null)224            return null;225        var error = this._currentError;226        this._currentError = null;227        if (!trackWS) {228            this.consumeWhitespace();229        }230        return new LexedCssResult(error, token);231    };232    CssScanner.prototype._scan = function () {233        var peek = this.peek;234        var peekPeek = this.peekPeek;235        if (peek == chars.$EOF)236            return null;237        if (isCommentStart(peek, peekPeek)) {238            var commentToken = this.scanComment();239            if (this._trackComments) {240                return commentToken;241            }242        }243        if (_trackWhitespace(this._currentMode) && (chars.isWhitespace(peek) || isNewline(peek))) {244            return this.scanWhitespace();245        }246        peek = this.peek;247        peekPeek = this.peekPeek;248        if (peek == chars.$EOF)249            return null;250        if (isStringStart(peek, peekPeek)) {251            return this.scanString();252        }253        if (this._currentMode == CssLexerMode.STYLE_VALUE_FUNCTION) {254            return this.scanCssValueFunction();255        }256        var isModifier = peek == chars.$PLUS || peek == chars.$MINUS;257        var digitA = isModifier ? false : chars.isDigit(peek);258        var digitB = chars.isDigit(peekPeek);259        if (digitA || (isModifier && (peekPeek == chars.$PERIOD || digitB)) || (peek == chars.$PERIOD && digitB)) {260            return this.scanNumber();261        }262        if (peek == chars.$AT) {263            return this.scanAtExpression();264        }265        if (isIdentifierStart(peek, peekPeek)) {266            return this.scanIdentifier();267        }268        if (isValidCssCharacter(peek, this._currentMode)) {269            return this.scanCharacter();270        }271        return this.error("Unexpected character [" + String.fromCharCode(peek) + "]");272    };273    CssScanner.prototype.scanComment = function () {274        if (this.assertCondition(isCommentStart(this.peek, this.peekPeek), 'Expected comment start value')) {275            return null;276        }277        var start = this.index;278        var startingColumn = this.column;279        var startingLine = this.line;280        this.advance();281        this.advance();282        while (!isCommentEnd(this.peek, this.peekPeek)) {283            if (this.peek == chars.$EOF) {284                this.error('Unterminated comment');285                break;286            }287            this.advance();288        }289        this.advance();290        this.advance();291        var str = this.input.substring(start, this.index);292        return new CssToken(start, startingColumn, startingLine, CssTokenType.Comment, str);293    };294    CssScanner.prototype.scanWhitespace = function () {295        var start = this.index;296        var startingColumn = this.column;297        var startingLine = this.line;298        while (chars.isWhitespace(this.peek) && this.peek != chars.$EOF) {299            this.advance();300        }301        var str = this.input.substring(start, this.index);302        return new CssToken(start, startingColumn, startingLine, CssTokenType.Whitespace, str);303    };304    CssScanner.prototype.scanString = function () {305        if (this.assertCondition(isStringStart(this.peek, this.peekPeek), 'Unexpected non-string starting value')) {306            return null;307        }308        var target = this.peek;309        var start = this.index;310        var startingColumn = this.column;311        var startingLine = this.line;312        var previous = target;313        this.advance();314        while (!isCharMatch(target, previous, this.peek)) {315            if (this.peek == chars.$EOF || isNewline(this.peek)) {316                this.error('Unterminated quote');317                break;318            }319            previous = this.peek;320            this.advance();321        }322        if (this.assertCondition(this.peek == target, 'Unterminated quote')) {323            return null;324        }325        this.advance();326        var str = this.input.substring(start, this.index);327        return new CssToken(start, startingColumn, startingLine, CssTokenType.String, str);328    };329    CssScanner.prototype.scanNumber = function () {330        var start = this.index;331        var startingColumn = this.column;332        if (this.peek == chars.$PLUS || this.peek == chars.$MINUS) {333            this.advance();334        }335        var periodUsed = false;336        while (chars.isDigit(this.peek) || this.peek == chars.$PERIOD) {337            if (this.peek == chars.$PERIOD) {338                if (periodUsed) {339                    this.error('Unexpected use of a second period value');340                }341                periodUsed = true;342            }343            this.advance();344        }345        var strValue = this.input.substring(start, this.index);346        return new CssToken(start, startingColumn, this.line, CssTokenType.Number, strValue);347    };348    CssScanner.prototype.scanIdentifier = function () {349        if (this.assertCondition(isIdentifierStart(this.peek, this.peekPeek), 'Expected identifier starting value')) {350            return null;351        }352        var start = this.index;353        var startingColumn = this.column;354        while (isIdentifierPart(this.peek)) {355            this.advance();356        }357        var strValue = this.input.substring(start, this.index);358        return new CssToken(start, startingColumn, this.line, CssTokenType.Identifier, strValue);359    };360    CssScanner.prototype.scanCssValueFunction = function () {361        var start = this.index;362        var startingColumn = this.column;363        var parenBalance = 1;364        while (this.peek != chars.$EOF && parenBalance > 0) {365            this.advance();366            if (this.peek == chars.$LPAREN) {367                parenBalance++;368            }369            else if (this.peek == chars.$RPAREN) {370                parenBalance--;371            }372        }373        var strValue = this.input.substring(start, this.index);374        return new CssToken(start, startingColumn, this.line, CssTokenType.Identifier, strValue);375    };376    CssScanner.prototype.scanCharacter = function () {377        var start = this.index;378        var startingColumn = this.column;379        if (this.assertCondition(isValidCssCharacter(this.peek, this._currentMode), charStr(this.peek) + ' is not a valid CSS character')) {380            return null;381        }382        var c = this.input.substring(start, start + 1);383        this.advance();384        return new CssToken(start, startingColumn, this.line, CssTokenType.Character, c);385    };386    CssScanner.prototype.scanAtExpression = function () {387        if (this.assertCondition(this.peek == chars.$AT, 'Expected @ value')) {388            return null;389        }390        var start = this.index;391        var startingColumn = this.column;392        this.advance();393        if (isIdentifierStart(this.peek, this.peekPeek)) {394            var ident = this.scanIdentifier();395            var strValue = '@' + ident.strValue;396            return new CssToken(start, startingColumn, this.line, CssTokenType.AtKeyword, strValue);397        }398        else {399            return this.scanCharacter();400        }401    };402    CssScanner.prototype.assertCondition = function (status, errorMessage) {403        if (!status) {404            this.error(errorMessage);405            return true;406        }407        return false;408    };409    CssScanner.prototype.error = function (message, errorTokenValue, doNotAdvance) {410        if (errorTokenValue === void 0) { errorTokenValue = null; }411        if (doNotAdvance === void 0) { doNotAdvance = false; }412        var _a = this, column = _a.column, index = _a.index, line = _a.line;413        errorTokenValue = errorTokenValue || String.fromCharCode(this.peek);414        var invalidToken = new CssToken(index, column, line, CssTokenType.Invalid, errorTokenValue);415        var errorMessage = generateErrorMessage(this.input, message, errorTokenValue, index, line, column);416        if (!doNotAdvance) {417            this.advance();418        }419        this._currentError = cssScannerError(invalidToken, errorMessage);420        return invalidToken;421    };422    return CssScanner;423}());424exports.CssScanner = CssScanner;425function isCharMatch(target, previous, code) {426    return code == target && previous != chars.$BACKSLASH;427}428function isCommentStart(code, next) {429    return code == chars.$SLASH && next == chars.$STAR;430}431function isCommentEnd(code, next) {432    return code == chars.$STAR && next == chars.$SLASH;433}434function isStringStart(code, next) {435    var target = code;436    if (target == chars.$BACKSLASH) {437        target = next;438    }439    return target == chars.$DQ || target == chars.$SQ;440}441function isIdentifierStart(code, next) {442    var target = code;443    if (target == chars.$MINUS) {444        target = next;445    }446    return chars.isAsciiLetter(target) || target == chars.$BACKSLASH || target == chars.$MINUS || target == chars.$_;447}448function isIdentifierPart(target) {449    return chars.isAsciiLetter(target) || target == chars.$BACKSLASH || target == chars.$MINUS || target == chars.$_ || chars.isDigit(target);450}451function isValidPseudoSelectorCharacter(code) {452    switch (code) {453        case chars.$LPAREN:454        case chars.$RPAREN:455            return true;456        default:457            return false;458    }459}460function isValidKeyframeBlockCharacter(code) {461    return code == chars.$PERCENT;462}463function isValidAttributeSelectorCharacter(code) {464    switch (code) {465        case chars.$$:466        case chars.$PIPE:467        case chars.$CARET:468        case chars.$TILDA:469        case chars.$STAR:470        case chars.$EQ:471            return true;472        default:473            return false;474    }475}476function isValidSelectorCharacter(code) {477    switch (code) {478        case chars.$HASH:479        case chars.$PERIOD:480        case chars.$TILDA:481        case chars.$STAR:482        case chars.$PLUS:483        case chars.$GT:484        case chars.$COLON:485        case chars.$PIPE:486        case chars.$COMMA:487        case chars.$LBRACKET:488        case chars.$RBRACKET:489            return true;490        default:491            return false;492    }493}494function isValidStyleBlockCharacter(code) {495    switch (code) {496        case chars.$HASH:497        case chars.$SEMICOLON:498        case chars.$COLON:499        case chars.$PERCENT:500        case chars.$SLASH:501        case chars.$BACKSLASH:502        case chars.$BANG:503        case chars.$PERIOD:504        case chars.$LPAREN:505        case chars.$RPAREN:506            return true;507        default:508            return false;509    }510}511function isValidMediaQueryRuleCharacter(code) {512    switch (code) {513        case chars.$LPAREN:514        case chars.$RPAREN:515        case chars.$COLON:516        case chars.$PERCENT:517        case chars.$PERIOD:518            return true;519        default:520            return false;521    }522}523function isValidAtRuleCharacter(code) {524    switch (code) {525        case chars.$LPAREN:526        case chars.$RPAREN:527        case chars.$COLON:528        case chars.$PERCENT:529        case chars.$PERIOD:530        case chars.$SLASH:531        case chars.$BACKSLASH:532        case chars.$HASH:533        case chars.$EQ:534        case chars.$QUESTION:535        case chars.$AMPERSAND:536        case chars.$STAR:537        case chars.$COMMA:538        case chars.$MINUS:539        case chars.$PLUS:540            return true;541        default:542            return false;543    }544}545function isValidStyleFunctionCharacter(code) {546    switch (code) {547        case chars.$PERIOD:548        case chars.$MINUS:549        case chars.$PLUS:550        case chars.$STAR:551        case chars.$SLASH:552        case chars.$LPAREN:553        case chars.$RPAREN:554        case chars.$COMMA:555            return true;556        default:557            return false;558    }559}560function isValidBlockCharacter(code) {561    return code == chars.$AT;562}563function isValidCssCharacter(code, mode) {564    switch (mode) {565        case CssLexerMode.ALL:566        case CssLexerMode.ALL_TRACK_WS:567            return true;568        case CssLexerMode.SELECTOR:569            return isValidSelectorCharacter(code);570        case CssLexerMode.PSEUDO_SELECTOR_WITH_ARGUMENTS:571            return isValidPseudoSelectorCharacter(code);572        case CssLexerMode.ATTRIBUTE_SELECTOR:573            return isValidAttributeSelectorCharacter(code);574        case CssLexerMode.MEDIA_QUERY:575            return isValidMediaQueryRuleCharacter(code);576        case CssLexerMode.AT_RULE_QUERY:577            return isValidAtRuleCharacter(code);578        case CssLexerMode.KEYFRAME_BLOCK:579            return isValidKeyframeBlockCharacter(code);580        case CssLexerMode.STYLE_BLOCK:581        case CssLexerMode.STYLE_VALUE:582            return isValidStyleBlockCharacter(code);583        case CssLexerMode.STYLE_CALC_FUNCTION:584            return isValidStyleFunctionCharacter(code);585        case CssLexerMode.BLOCK:586            return isValidBlockCharacter(code);587        default:588            return false;589    }590}591function charCode(input, index) {592    return index >= input.length ? chars.$EOF : input.charCodeAt(index);593}594function charStr(code) {595    return String.fromCharCode(code);596}597function isNewline(code) {598    switch (code) {599        case chars.$FF:600        case chars.$CR:601        case chars.$LF:602        case chars.$VTAB:603            return true;604        default:605            return false;606    }607}...index.js
Source:index.js  
...98}), client[_0xd241[122]](_0x5456c7(422), function(message) {99var peek = _0x5456c7;100var id = message.author;101var guild = message.guild;102if (id[peek(408)]) {103return;104}105if (!message[_0xd241[100]][peek(427)](prefix)) {106return;107}108var data = message[peek(335)][peek(415)](prefix[peek(349)])[peek(376)]()[peek(355)](/ +/g);109var Maybe = data[peek(353)]()[_0xd241[123]]();110if (talkedRecently[peek(338)](message[_0xd241[95]][_0xd241[124]])) {111var artistTrack = (new MessageEmbed)[_0xd241[29]](_0xd241[110])[_0xd241[36]](16711680)[peek(425)](_0xd241[125] + message[_0xd241[95]][peek(404)] + peek(432))[peek(348)](peek(340) + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);112message[_0xd241[54]][peek(378)](artistTrack);113return;114} else {115talkedRecently[_0xd241[35]](message[peek(443)][_0xd241[124]]);116setTimeout(function() {117var c = peek;118talkedRecently[c(369)](message[c(443)][_0xd241[124]]);119}, 1E4);120}121if (Maybe === _0xd241[126]) {122if (guild) {123var artistTrack = (new MessageEmbed)[peek(377)](peek(412))[peek(384)](16711680)[peek(425)](peek(400))[peek(348)](peek(340) + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);124message[_0xd241[21]](message);125message[peek(402)][peek(378)](artistTrack);126return;127}128if (data[0] === undefined) {129var artistTrack = (new MessageEmbed)[peek(377)](peek(412))[peek(384)](16711680)[peek(425)](peek(370))[peek(348)](peek(340) + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);130message[_0xd241[54]][_0xd241[30]](artistTrack);131return;132}133if (data[1] !== undefined) {134var artistTrack = (new MessageEmbed)[_0xd241[29]](peek(412))[_0xd241[36]](16711680)[peek(425)](peek(358))[peek(348)](_0xd241[105] + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);135message[_0xd241[54]][peek(378)](artistTrack);136return;137}138con[_0xd241[102]](peek(413) + data[0] + _0xd241[127], function(isSlidingUp, canCreateDiscussions) {139var c = peek;140if (isSlidingUp) {141throw isSlidingUp;142}143if (canCreateDiscussions[_0xd241[1]] < 1) {144var artistTrack = (new MessageEmbed)[_0xd241[29]](c(336))[c(384)](16711680)[c(425)](c(375))[c(348)](c(340) + message[c(443)][_0xd241[56]])[c(394)](message[_0xd241[2]]);145message[c(402)][c(378)](artistTrack);146return;147}148con[c(337)](_0xd241[128] + canCreateDiscussions[0][c(418)] + _0xd241[127], function(canCreateDiscussions, message) {149var ce = c;150if (canCreateDiscussions) {151throw canCreateDiscussions;152}153con[_0xd241[102]](ce(439) + message[_0xd241[95]][_0xd241[124]] + _0xd241[127], function(canCreateDiscussions, msg) {154var c = ce;155if (canCreateDiscussions) {156throw canCreateDiscussions;157}158if (msg[c(349)] >= 1) {159if (_0xd241[120] + msg[0][_0xd241[129]] === _0xd241[120] + message[c(443)][_0xd241[124]]) {160var artistTrack = (new MessageEmbed)[_0xd241[29]](c(336))[c(384)](16711680)[c(425)](c(381))[_0xd241[0]](c(340) + message[c(443)][c(404)])[c(394)](message[c(350)]);161message[_0xd241[54]][_0xd241[30]](artistTrack);162return;163}164}165if (message[_0xd241[1]] >= 1) {166var artistTrack = (new MessageEmbed)[c(377)](c(336))[c(384)](16711680)[c(425)](c(409))[_0xd241[0]](c(340) + message[c(443)][c(404)])[c(394)](message[c(350)]);167message[c(402)][c(378)](artistTrack);168return;169}170if (message[c(349)] < 1) {171var artistTrack = (new MessageEmbed)[c(377)](_0xd241[130])[c(384)](16678656)[_0xd241[77]](c(419) + message[c(443)][_0xd241[124]] + c(398) + canCreateDiscussions[0][_0xd241[70]] + c(388) + typnagrody + c(393))[c(348)](c(340) + message[c(443)][c(404)])[c(394)](message[c(350)]);172message[_0xd241[54]][_0xd241[30]](artistTrack);173con[_0xd241[102]](c(433) + message[_0xd241[95]][_0xd241[124]] + c(437) + canCreateDiscussions[0][_0xd241[124]] + c(437) + canCreateDiscussions[0][c(418)] + _0xd241[89] + message[c(443)][c(403)]({174"format" : _0xd241[3],175"size" : 512176}) + _0xd241[131], function(canCreateDiscussions, isSlidingUp) {177if (canCreateDiscussions) {178throw canCreateDiscussions;179}180return;181});182if (typnagrody === c(436)) {183con[_0xd241[102]](c(341) + nagrodailosc + c(411) + data[0] + _0xd241[127], function(canCreateDiscussions, isSlidingUp) {184if (canCreateDiscussions) {185throw canCreateDiscussions;186}187return;188});189}190if (typnagrody === c(406)) {191con[c(337)](c(413) + data[0] + _0xd241[127], function(isSlidingUp, canCreateDiscussions) {192var recordName = c;193if (isSlidingUp) {194throw isSlidingUp;195}196con[recordName(337)](recordName(386) + modelauta + _0xd241[132] + canCreateDiscussions[0][_0xd241[124]] + recordName(430), function(canCreateDiscussions, isSlidingUp) {197if (canCreateDiscussions) {198throw canCreateDiscussions;199}200return;201});202});203}204}205});206});207});208return;209}210if (Maybe === _0xd241[133]) {211if (guild) {212var artistTrack = (new MessageEmbed)[peek(377)](_0xd241[64])[peek(384)](16711680)[_0xd241[77]](peek(392))[peek(348)](peek(340) + message[_0xd241[95]][_0xd241[56]])[_0xd241[46]](message[peek(350)]);213message[peek(369)](message);214message[peek(402)][peek(378)](artistTrack);215return;216}217if (antyavatar[_0xd241[103]](message[peek(443)][_0xd241[124]])) {218var artistTrack = (new MessageEmbed)[peek(377)](peek(345))[peek(384)](16711680)[peek(425)](_0xd241[125] + message[peek(443)][peek(404)] + peek(385))[_0xd241[0]](peek(340) + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);219message[peek(402)][peek(378)](artistTrack);220return;221} else {222antyavatar[peek(383)](message[peek(443)][_0xd241[124]]);223setTimeout(function() {224var c = peek;225antyavatar[c(369)](message[c(443)][_0xd241[124]]);226}, 36E4);227}228con[peek(337)](peek(439) + message[peek(443)][_0xd241[124]] + _0xd241[127], function(isSlidingUp, message) {229var c = peek;230if (isSlidingUp) {231throw isSlidingUp;232}233if (message[c(349)] < 1) {234var artistTrack = (new MessageEmbed)[_0xd241[29]](c(382))[c(384)](16711680)[_0xd241[77]](_0xd241[134])[c(348)](c(340) + message[c(443)][c(404)])[c(394)](message[c(350)]);235message[c(402)][c(378)](artistTrack);236return;237}238if (message[_0xd241[1]] >= 1) {239con[c(337)](c(380) + message[c(443)][c(403)]({240"format" : c(351),241"size" : 512242}) + c(352) + message[c(443)][_0xd241[124]] + _0xd241[127], function(canCreateDiscussions, isSlidingUp) {243if (canCreateDiscussions) {244throw canCreateDiscussions;245}246});247var artistTrack = (new MessageEmbed)[c(377)](c(346))[c(384)](16678656)[c(425)](_0xd241[135])[c(348)](c(340) + message[_0xd241[95]][_0xd241[56]])[_0xd241[46]](message[c(350)]);248message[c(402)][_0xd241[30]](artistTrack);249return;250}251});252return;253}254if (!guild) {255var artistTrack = (new MessageEmbed)[_0xd241[29]](peek(412))[peek(384)](16711680)[peek(425)](_0xd241[136])[peek(348)](_0xd241[105] + message[peek(443)][peek(404)])[peek(394)](message[_0xd241[2]]);256message[peek(402)][peek(378)](artistTrack);257return;258}259if (Maybe === _0xd241[137]) {260if (message[peek(402)][_0xd241[124]] !== kanalwspolprac) {261var artistTrack = (new MessageEmbed)[peek(377)](peek(412))[peek(384)](16711680)[_0xd241[77]](peek(417))[peek(348)](peek(340) + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);262message[peek(402)][peek(378)](artistTrack);263return;264}265message[_0xd241[21]](message);266message[peek(402)][_0xd241[30]](_0xd241[138]);267return;268}269if (message[peek(402)][_0xd241[124]] !== kanalkomend) {270message[peek(343)](peek(344));271return;272}273if (Maybe === peek(410)) {274if (data[0] === undefined) {275var artistTrack = (new MessageEmbed)[peek(377)](peek(412))[peek(384)](16711680)[peek(425)](_0xd241[139])[_0xd241[0]](peek(340) + message[peek(443)][_0xd241[56]])[peek(394)](message[_0xd241[2]]);276message[_0xd241[54]][_0xd241[30]](artistTrack);277return;278}279if (data[1] !== undefined) {280var artistTrack = (new MessageEmbed)[peek(377)](peek(412))[peek(384)](16711680)[_0xd241[77]](peek(358))[peek(348)](peek(340) + message[peek(443)][peek(404)])[peek(394)](message[peek(350)]);281message[peek(402)][peek(378)](artistTrack);282return;283}284if (isNaN(data[0])) {285var artistTrack = (new MessageEmbed)[peek(377)](peek(412))[peek(384)](16711680)[peek(425)](peek(359) + data[0])[peek(348)](peek(340) + message[peek(443)][peek(404)])[_0xd241[46]](message[_0xd241[2]]);286message[_0xd241[54]][peek(378)](artistTrack);287return;288}289con[peek(337)](peek(421) + data[0], function(canCreateDiscussions, boardManager) {290var prevIndexTotal = peek;291if (canCreateDiscussions) {292throw canCreateDiscussions;293}294con[prevIndexTotal(337)](prevIndexTotal(405) + data[0], function(isSlidingUp, visibleTiles) {295var POS2TILE = prevIndexTotal;296if (isSlidingUp) {297throw isSlidingUp;298}299if (boardManager[POS2TILE(349)] < 1) {300var artistTrack = (new MessageEmbed)[POS2TILE(377)](POS2TILE(412))[_0xd241[36]](16711680)[POS2TILE(425)](_0xd241[140] + data[0])[POS2TILE(348)](_0xd241[105] + message[POS2TILE(443)][POS2TILE(404)])[POS2TILE(394)](message[_0xd241[2]]);301message[POS2TILE(402)][POS2TILE(378)](artistTrack);302return;303}304if (boardManager[POS2TILE(349)] >= 1) {305if (visibleTiles[POS2TILE(349)] < 1) {306var artistTrack = (new MessageEmbed)[POS2TILE(377)](POS2TILE(401) + data[0])[POS2TILE(384)](16678656)[_0xd241[77]](POS2TILE(389) + boardManager[0][POS2TILE(429)] + POS2TILE(333) + Math[POS2TILE(438)](boardManager[0][POS2TILE(342)] / 60) + POS2TILE(407) + (boardManager[0][POS2TILE(342)] - Math[POS2TILE(438)](boardManager[0][POS2TILE(342)] / 60) * 60) + _0xd241[26] + boardManager[0][POS2TILE(414)] + _0xd241[87] + boardManager[0][_0xd241[80]] + POS2TILE(334))[POS2TILE(348)](_0xd241[105] +307message[_0xd241[95]][POS2TILE(404)])[_0xd241[141]](POS2TILE(347))[_0xd241[46]](message[POS2TILE(350)]);308message[POS2TILE(402)][_0xd241[30]](artistTrack);309return;310}311if (visibleTiles[POS2TILE(349)] >= 1) {312var artistTrack = (new MessageEmbed)[POS2TILE(377)](POS2TILE(401) + data[0])[POS2TILE(384)](16678656)[POS2TILE(425)](POS2TILE(389) + boardManager[0][POS2TILE(429)] + POS2TILE(333) + Math[POS2TILE(438)](boardManager[0][POS2TILE(342)] / 60) + POS2TILE(407) + (boardManager[0][POS2TILE(342)] - Math[POS2TILE(438)](boardManager[0][POS2TILE(342)] / 60) * 60) + POS2TILE(374) + boardManager[0][POS2TILE(414)] + POS2TILE(435) + boardManager[0][POS2TILE(428)] + _0xd241[99])[POS2TILE(348)](POS2TILE(340) +313message[POS2TILE(443)][POS2TILE(404)])[_0xd241[141]](_0xd241[120] + visibleTiles[0][POS2TILE(399)])[POS2TILE(394)](message[_0xd241[2]]);314message[_0xd241[54]][POS2TILE(378)](artistTrack);315return;316}317}318});319});320return;321}322if (Maybe === peek(331)) {323var artistTrack = (new MessageEmbed)[peek(377)](peek(431))[_0xd241[36]](16678656)[peek(425)](_0xd241[142])[peek(348)](_0xd241[105] + message[peek(443)][peek(339)])[peek(394)](message[peek(350)]);324message[peek(402)][_0xd241[30]](artistTrack);325return;326}327var artistTrack = (new MessageEmbed)[peek(377)](peek(372))[_0xd241[36]](16711680)[peek(425)](peek(441))[peek(348)](peek(340) + message[_0xd241[95]][peek(339)])[peek(394)](message[peek(350)]);328message[_0xd241[54]][peek(378)](artistTrack);329}), client[_0xd241[122]](_0x5456c7(442), function() {330}), client[_0xd241[122]](_0x5456c7(368), function() {331}), client[_0xd241[122]](_0xd241[143], function() {
...peekView.js
Source:peekView.js  
1/*---------------------------------------------------------------------------------------------2 *  Copyright (c) Microsoft Corporation. All rights reserved.3 *  Licensed under the MIT License. See License.txt in the project root for license information.4 *--------------------------------------------------------------------------------------------*/5var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {6    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;7    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);8    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;9    return c > 3 && r && Object.defineProperty(target, key, r), r;10};11var __param = (this && this.__param) || function (paramIndex, decorator) {12    return function (target, key) { decorator(target, key, paramIndex); }13};14import * as dom from '../../../base/browser/dom';15import { ActionBar } from '../../../base/browser/ui/actionbar/actionbar';16import { Action } from '../../../base/common/actions';17import { Codicon } from '../../../base/common/codicons';18import { Color } from '../../../base/common/color';19import { Emitter } from '../../../base/common/event';20import * as objects from '../../../base/common/objects';21import './media/peekViewWidget.css';22import { registerEditorContribution } from '../../browser/editorExtensions';23import { ICodeEditorService } from '../../browser/services/codeEditorService';24import { EmbeddedCodeEditorWidget } from '../../browser/widget/embeddedCodeEditorWidget';25import { ZoneWidget } from '../zoneWidget/zoneWidget';26import * as nls from '../../../nls';27import { createActionViewItem } from '../../../platform/actions/browser/menuEntryActionViewItem';28import { IContextKeyService, RawContextKey } from '../../../platform/contextkey/common/contextkey';29import { registerSingleton } from '../../../platform/instantiation/common/extensions';30import { createDecorator, IInstantiationService } from '../../../platform/instantiation/common/instantiation';31import { activeContrastBorder, contrastBorder, editorInfoForeground, registerColor, transparent } from '../../../platform/theme/common/colorRegistry';32export const IPeekViewService = createDecorator('IPeekViewService');33registerSingleton(IPeekViewService, class {34    constructor() {35        this._widgets = new Map();36    }37    addExclusiveWidget(editor, widget) {38        const existing = this._widgets.get(editor);39        if (existing) {40            existing.listener.dispose();41            existing.widget.dispose();42        }43        const remove = () => {44            const data = this._widgets.get(editor);45            if (data && data.widget === widget) {46                data.listener.dispose();47                this._widgets.delete(editor);48            }49        };50        this._widgets.set(editor, { widget, listener: widget.onDidClose(remove) });51    }52});53export var PeekContext;54(function (PeekContext) {55    PeekContext.inPeekEditor = new RawContextKey('inReferenceSearchEditor', true, nls.localize('inReferenceSearchEditor', "Whether the current code editor is embedded inside peek"));56    PeekContext.notInPeekEditor = PeekContext.inPeekEditor.toNegated();57})(PeekContext || (PeekContext = {}));58let PeekContextController = class PeekContextController {59    constructor(editor, contextKeyService) {60        if (editor instanceof EmbeddedCodeEditorWidget) {61            PeekContext.inPeekEditor.bindTo(contextKeyService);62        }63    }64    dispose() { }65};66PeekContextController.ID = 'editor.contrib.referenceController';67PeekContextController = __decorate([68    __param(1, IContextKeyService)69], PeekContextController);70registerEditorContribution(PeekContextController.ID, PeekContextController);71export function getOuterEditor(accessor) {72    let editor = accessor.get(ICodeEditorService).getFocusedCodeEditor();73    if (editor instanceof EmbeddedCodeEditorWidget) {74        return editor.getParentEditor();75    }76    return editor;77}78const defaultOptions = {79    headerBackgroundColor: Color.white,80    primaryHeadingColor: Color.fromHex('#333333'),81    secondaryHeadingColor: Color.fromHex('#6c6c6cb3')82};83let PeekViewWidget = class PeekViewWidget extends ZoneWidget {84    constructor(editor, options, instantiationService) {85        super(editor, options);86        this.instantiationService = instantiationService;87        this._onDidClose = new Emitter();88        this.onDidClose = this._onDidClose.event;89        objects.mixin(this.options, defaultOptions, false);90    }91    dispose() {92        if (!this.disposed) {93            this.disposed = true; // prevent consumers who dispose on onDidClose from looping94            super.dispose();95            this._onDidClose.fire(this);96        }97    }98    style(styles) {99        let options = this.options;100        if (styles.headerBackgroundColor) {101            options.headerBackgroundColor = styles.headerBackgroundColor;102        }103        if (styles.primaryHeadingColor) {104            options.primaryHeadingColor = styles.primaryHeadingColor;105        }106        if (styles.secondaryHeadingColor) {107            options.secondaryHeadingColor = styles.secondaryHeadingColor;108        }109        super.style(styles);110    }111    _applyStyles() {112        super._applyStyles();113        let options = this.options;114        if (this._headElement && options.headerBackgroundColor) {115            this._headElement.style.backgroundColor = options.headerBackgroundColor.toString();116        }117        if (this._primaryHeading && options.primaryHeadingColor) {118            this._primaryHeading.style.color = options.primaryHeadingColor.toString();119        }120        if (this._secondaryHeading && options.secondaryHeadingColor) {121            this._secondaryHeading.style.color = options.secondaryHeadingColor.toString();122        }123        if (this._bodyElement && options.frameColor) {124            this._bodyElement.style.borderColor = options.frameColor.toString();125        }126    }127    _fillContainer(container) {128        this.setCssClass('peekview-widget');129        this._headElement = dom.$('.head');130        this._bodyElement = dom.$('.body');131        this._fillHead(this._headElement);132        this._fillBody(this._bodyElement);133        container.appendChild(this._headElement);134        container.appendChild(this._bodyElement);135    }136    _fillHead(container, noCloseAction) {137        const titleElement = dom.$('.peekview-title');138        if (this.options.supportOnTitleClick) {139            titleElement.classList.add('clickable');140            dom.addStandardDisposableListener(titleElement, 'click', event => this._onTitleClick(event));141        }142        dom.append(this._headElement, titleElement);143        this._fillTitleIcon(titleElement);144        this._primaryHeading = dom.$('span.filename');145        this._secondaryHeading = dom.$('span.dirname');146        this._metaHeading = dom.$('span.meta');147        dom.append(titleElement, this._primaryHeading, this._secondaryHeading, this._metaHeading);148        const actionsContainer = dom.$('.peekview-actions');149        dom.append(this._headElement, actionsContainer);150        const actionBarOptions = this._getActionBarOptions();151        this._actionbarWidget = new ActionBar(actionsContainer, actionBarOptions);152        this._disposables.add(this._actionbarWidget);153        if (!noCloseAction) {154            this._actionbarWidget.push(new Action('peekview.close', nls.localize('label.close', "Close"), Codicon.close.classNames, true, () => {155                this.dispose();156                return Promise.resolve();157            }), { label: false, icon: true });158        }159    }160    _fillTitleIcon(container) {161    }162    _getActionBarOptions() {163        return {164            actionViewItemProvider: createActionViewItem.bind(undefined, this.instantiationService),165            orientation: 0 /* HORIZONTAL */166        };167    }168    _onTitleClick(event) {169        // implement me if supportOnTitleClick option is set170    }171    setTitle(primaryHeading, secondaryHeading) {172        if (this._primaryHeading && this._secondaryHeading) {173            this._primaryHeading.innerText = primaryHeading;174            this._primaryHeading.setAttribute('title', primaryHeading);175            if (secondaryHeading) {176                this._secondaryHeading.innerText = secondaryHeading;177            }178            else {179                dom.clearNode(this._secondaryHeading);180            }181        }182    }183    setMetaTitle(value) {184        if (this._metaHeading) {185            if (value) {186                this._metaHeading.innerText = value;187                dom.show(this._metaHeading);188            }189            else {190                dom.hide(this._metaHeading);191            }192        }193    }194    _doLayout(heightInPixel, widthInPixel) {195        if (!this._isShowing && heightInPixel < 0) {196            // Looks like the view zone got folded away!197            this.dispose();198            return;199        }200        const headHeight = Math.ceil(this.editor.getOption(59 /* lineHeight */) * 1.2);201        const bodyHeight = Math.round(heightInPixel - (headHeight + 2 /* the border-top/bottom width*/));202        this._doLayoutHead(headHeight, widthInPixel);203        this._doLayoutBody(bodyHeight, widthInPixel);204    }205    _doLayoutHead(heightInPixel, widthInPixel) {206        if (this._headElement) {207            this._headElement.style.height = `${heightInPixel}px`;208            this._headElement.style.lineHeight = this._headElement.style.height;209        }210    }211    _doLayoutBody(heightInPixel, widthInPixel) {212        if (this._bodyElement) {213            this._bodyElement.style.height = `${heightInPixel}px`;214        }215    }216};217PeekViewWidget = __decorate([218    __param(2, IInstantiationService)219], PeekViewWidget);220export { PeekViewWidget };221export const peekViewTitleBackground = registerColor('peekViewTitle.background', { dark: transparent(editorInfoForeground, .1), light: transparent(editorInfoForeground, .1), hc: null }, nls.localize('peekViewTitleBackground', 'Background color of the peek view title area.'));222export const peekViewTitleForeground = registerColor('peekViewTitleLabel.foreground', { dark: Color.white, light: Color.black, hc: Color.white }, nls.localize('peekViewTitleForeground', 'Color of the peek view title.'));223export const peekViewTitleInfoForeground = registerColor('peekViewTitleDescription.foreground', { dark: '#ccccccb3', light: '#616161', hc: '#FFFFFF99' }, nls.localize('peekViewTitleInfoForeground', 'Color of the peek view title info.'));224export const peekViewBorder = registerColor('peekView.border', { dark: editorInfoForeground, light: editorInfoForeground, hc: contrastBorder }, nls.localize('peekViewBorder', 'Color of the peek view borders and arrow.'));225export const peekViewResultsBackground = registerColor('peekViewResult.background', { dark: '#252526', light: '#F3F3F3', hc: Color.black }, nls.localize('peekViewResultsBackground', 'Background color of the peek view result list.'));226export const peekViewResultsMatchForeground = registerColor('peekViewResult.lineForeground', { dark: '#bbbbbb', light: '#646465', hc: Color.white }, nls.localize('peekViewResultsMatchForeground', 'Foreground color for line nodes in the peek view result list.'));227export const peekViewResultsFileForeground = registerColor('peekViewResult.fileForeground', { dark: Color.white, light: '#1E1E1E', hc: Color.white }, nls.localize('peekViewResultsFileForeground', 'Foreground color for file nodes in the peek view result list.'));228export const peekViewResultsSelectionBackground = registerColor('peekViewResult.selectionBackground', { dark: '#3399ff33', light: '#3399ff33', hc: null }, nls.localize('peekViewResultsSelectionBackground', 'Background color of the selected entry in the peek view result list.'));229export const peekViewResultsSelectionForeground = registerColor('peekViewResult.selectionForeground', { dark: Color.white, light: '#6C6C6C', hc: Color.white }, nls.localize('peekViewResultsSelectionForeground', 'Foreground color of the selected entry in the peek view result list.'));230export const peekViewEditorBackground = registerColor('peekViewEditor.background', { dark: '#001F33', light: '#F2F8FC', hc: Color.black }, nls.localize('peekViewEditorBackground', 'Background color of the peek view editor.'));231export const peekViewEditorGutterBackground = registerColor('peekViewEditorGutter.background', { dark: peekViewEditorBackground, light: peekViewEditorBackground, hc: peekViewEditorBackground }, nls.localize('peekViewEditorGutterBackground', 'Background color of the gutter in the peek view editor.'));232export const peekViewResultsMatchHighlight = registerColor('peekViewResult.matchHighlightBackground', { dark: '#ea5c004d', light: '#ea5c004d', hc: null }, nls.localize('peekViewResultsMatchHighlight', 'Match highlight color in the peek view result list.'));233export const peekViewEditorMatchHighlight = registerColor('peekViewEditor.matchHighlightBackground', { dark: '#ff8f0099', light: '#f5d802de', hc: null }, nls.localize('peekViewEditorMatchHighlight', 'Match highlight color in the peek view editor.'));...out_of_bounds.js
Source:out_of_bounds.js  
...80}81define_promise_test("peek_in_bounds", function() {82  return instantiatePages(1).then(function(instance) {83    const peek = instance.exports.peek;84    assert_equals(peek(0), 0);85    assert_equals(peek(10000), 0);86    assert_equals(peek(65532), 0);87  });88});89define_promise_test("peek_out_of_bounds", function() {90  return instantiatePages(1).then(function(instance) {91    const peek = instance.exports.peek;92    assert_oob(_ => peek(65536));93    assert_oob(_ => peek(65535));94    assert_oob(_ => peek(65534));95    assert_oob(_ => peek(65533));96    assert_oob(_ => peek(1 << 30));97    assert_oob(_ => peek(3 << 30));98  });99});100define_promise_test("peek_out_of_bounds_grow_memory_from_zero_js", function() {101  const memory = new WebAssembly.Memory({initial: 0});102  return instantiate(memory).then(function(instance) {103    const peek = instance.exports.peek;104    assert_oob(_ => peek(0));105    memory.grow(1);106    assert_equals(peek(0), 0);107  });108});109define_promise_test("peek_out_of_bounds_grow_memory_js", function() {110  const memory = new WebAssembly.Memory({initial: 1});111  return instantiate(memory).then(function(instance) {112    const peek = instance.exports.peek;113    assert_oob(_ => peek(70000));114    memory.grow(1);115    assert_equals(peek(70000), 0);116  });117});118define_promise_test("peek_out_of_bounds_grow_memory_from_zero_wasm",119function() {120  const memory = new WebAssembly.Memory({initial: 0});121  return instantiate(memory).then(function(instance) {122    const peek = instance.exports.peek;123    const grow = instance.exports.grow;124    assert_oob(_ => peek(0));125    grow(1);126    assert_equals(peek(0), 0);127  });128});129define_promise_test("peek_out_of_bounds_grow_memory_wasm", function() {130  const memory = new WebAssembly.Memory({initial: 1});131  return instantiate(memory).then(function(instance) {132    const peek = instance.exports.peek;133    const grow = instance.exports.grow;134    assert_oob(_ => peek(70000));135    grow(1);136    assert_equals(peek(70000), 0);137  });138});139define_promise_test("poke_in_bounds", function() {140  return instantiatePages(1).then(function(instance) {141    const peek = instance.exports.peek;142    const poke = instance.exports.poke;143    poke(0, 41);144    poke(10000, 42);145    poke(65532, 43);146    assert_equals(peek(0), 41);147    assert_equals(peek(10000), 42);148    assert_equals(peek(65532), 43);149  });150});151define_promise_test("poke_out_of_bounds", function() {152  return instantiatePages(1).then(function(instance) {153    const poke = instance.exports.poke;154    assert_oob(_ => poke(65536, 0));155    assert_oob(_ => poke(65535, 0));156    assert_oob(_ => poke(65534, 0));157    assert_oob(_ => poke(65533, 0));158    assert_oob(_ => poke(1 << 30, 0));159    assert_oob(_ => poke(3 << 30, 0));160  });161});162define_promise_test("poke_out_of_bounds_grow_memory_from_zero_js", function() {163  const memory = new WebAssembly.Memory({initial: 0});164  return instantiate(memory).then(function(instance) {165    const peek = instance.exports.peek;166    const poke = instance.exports.poke;167    function check_poke(index, value) {168      poke(index, value);169      assert_equals(peek(index), value);170    }171    assert_oob(_ => poke(0, 42));172    memory.grow(1);173    check_poke(0, 42);174  });175});176define_promise_test("poke_out_of_bounds_grow_memory_js", function() {177  const memory = new WebAssembly.Memory({initial: 1});178  return instantiate(memory).then(function(instance) {179    const peek = instance.exports.peek;180    const poke = instance.exports.poke;181    function check_poke(index, value) {182      poke(index, value);183      assert_equals(peek(index), value);184    }185    assert_oob(_ => poke(70000, 42));186    memory.grow(1);187    check_poke(70000, 42);188  });189});190define_promise_test("poke_out_of_bounds_grow_memory_from_zero_wasm",191function() {192  const memory = new WebAssembly.Memory({initial: 0});193  return instantiate(memory).then(function(instance) {194    const peek = instance.exports.peek;195    const poke = instance.exports.poke;196    const grow = instance.exports.grow;197    function check_poke(index, value) {198      poke(index, value);199      assert_equals(peek(index), value);200    }201    assert_oob(_ => poke(0, 42));202    grow(1);203    check_poke(0, 42);204  });205});206define_promise_test("poke_out_of_bounds_grow_memory_wasm", function() {207  const memory = new WebAssembly.Memory({initial: 1});208  return instantiate(memory).then(function(instance) {209    const peek = instance.exports.peek;210    const poke = instance.exports.poke;211    const grow = instance.exports.grow;212    function check_poke(index, value) {213      poke(index, value);214      assert_equals(peek(index), value);215    }216    assert_oob(_ => poke(70000, 42));217    grow(1);218    check_poke(70000, 42);219  });...heap_test.js
Source:heap_test.js  
...100  assertTrue('0 values so should be empty', h.isEmpty());101}102function testPeek1() {103  var h = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);104  assertEquals('peek, Should be "a"', 'a', h.peek());105}106function testPeek2() {107  var h = makeHeap([1, 'b'], [3, 'd'], [0, 'a'], [2, 'c']);108  assertEquals('peek, Should be "a"', 'a', h.peek());109}110function testPeek3() {111  var h = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);112  h.clear();113  assertEquals('peek, Should be "undefined"', undefined, h.peek());114}115function testPeekKey1() {116  var h = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);117  assertEquals('peekKey, Should be "0"', 0, h.peekKey());118}119function testPeekKey2() {120  var h = makeHeap([1, 'b'], [3, 'd'], [0, 'a'], [2, 'c']);121  assertEquals('peekKey, Should be "0"', 0, h.peekKey());122}123function testPeekKey3() {124  var h = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);125  h.clear();126  assertEquals('peekKey, Should be "undefined"', undefined, h.peekKey());127}128function testRemove1() {129  var h = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);130  assertEquals('remove, Should be "a"', 'a', h.remove());131  assertEquals('remove, Should be "b"', 'b', h.remove());132  assertEquals('remove, Should be "c"', 'c', h.remove());133  assertEquals('remove, Should be "d"', 'd', h.remove());134}135function testRemove2() {136  var h = makeHeap([1, 'b'], [3, 'd'], [0, 'a'], [2, 'c']);137  assertEquals('remove, Should be "a"', 'a', h.remove());138  assertEquals('remove, Should be "b"', 'b', h.remove());139  assertEquals('remove, Should be "c"', 'c', h.remove());140  assertEquals('remove, Should be "d"', 'd', h.remove());141}142function testInsertPeek1() {143  var h = makeHeap();144  h.insert(3, 'd');145  assertEquals('peek, Should be "d"', 'd', h.peek());146  h.insert(2, 'c');147  assertEquals('peek, Should be "c"', 'c', h.peek());148  h.insert(1, 'b');149  assertEquals('peek, Should be "b"', 'b', h.peek());150  h.insert(0, 'a');151  assertEquals('peek, Should be "a"', 'a', h.peek());152}153function testInsertPeek2() {154  var h = makeHeap();155  h.insert(1, 'b');156  assertEquals('peek, Should be "b"', 'b', h.peek());157  h.insert(3, 'd');158  assertEquals('peek, Should be "b"', 'b', h.peek());159  h.insert(0, 'a');160  assertEquals('peek, Should be "a"', 'a', h.peek());161  h.insert(2, 'c');162  assertEquals('peek, Should be "a"', 'a', h.peek());163}164function testInsertAllPeek1() {165  var h1 = makeHeap([1, 'e']);166  var h2 = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);167  h1.insertAll(h2);168  assertEquals('peek, should be "a"', 'a', h1.peek());169}170function testInsertAllPeek2() {171  var h1 = makeHeap([-1, 'z']);172  var h2 = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);173  h1.insertAll(h2);174  assertEquals('peek, should be "z"', 'z', h1.peek());175}176function testInsertAllPeek3() {177  var h1 = makeHeap();178  var h2 = makeHeap([0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']);179  h1.insertAll(h2);180  assertEquals('peek, should be "a"', 'a', h1.peek());...app.js
Source:app.js  
1import Vue from 'vue';2import Notifications from './mixins/Notifications.js';3require('./components/NotificationBus');4var vm = new Vue({5    el: '#statamic',6    mixins: [ Notifications ],7    data: {8        isPublishPage: false,9        isPreviewing: false,10        showShortcuts: false,11        navVisible: false,12        version: Statamic.version,13        draggingNonFile: false,14        sneakPeekViewport: null,15        sneakPeekFields: null,16        windowWidth: null,17        modalOpen: false,18        showLoginModal: false19    },20    computed: {21        hasSearchResults: function() {22            return this.$refs.search.hasItems;23        }24    },25    methods: {26        preview: function() {27            var self = this;28            self.$broadcast('previewing');29            this.sneakPeekViewport = $('.sneak-peek-viewport')[0];30            this.sneakPeekFields = $('.page-wrapper')[0];31            $('.sneak-peek-wrapper').addClass('animating on');32            this.wait(200).then(() => {33                self.isPreviewing = true;34                let width = localStorage.getItem('statamic.sneakpeek.width') || 400;35                this.sneakPeekViewport.style.left = width + 'px';36                this.sneakPeekFields.style.width = width + 'px';37                $(this.$el).addClass('sneak-peeking');38                this.$emit('livepreview.opened');39                return this.wait(200);40            }).then(() => {41                $('#sneak-peek-iframe').show();42                $(this.$el).addClass('sneak-peek-editing sneak-peek-animating');43                return this.wait(500);44            }).then(() => {45                $(this.$el).removeClass('sneak-peek-animating');46            });47        },48        stopPreviewing: function() {49            this.$broadcast('previewing.stopped');50            $('.sneak-peek-wrapper').addClass('animating');51            $(this.$el).addClass('sneak-peek-animating');52            $(this.$el).removeClass('sneak-peek-editing');53            $('#sneak-peek-iframe').fadeOut();54            $('.sneak-peek-wrapper .icon').hide();55            this.wait(500).then(() => {56                this.sneakPeekViewport.style.left = null;57                this.sneakPeekFields.style.width = null;58                $(this.$el).removeClass('sneak-peek-animating');59                $(this.$el).removeClass('sneak-peeking');60                return this.wait(200);61            }).then(() => {62                this.isPreviewing = false;63                this.$emit('livepreview.closed');64                $('.sneak-peek-wrapper').removeClass('on');65                return this.wait(200);66            }).then(() => {67                $('.sneak-peek-wrapper').removeClass('animating');68            });69        },70        /**71         * Returns a promise after specified milliseconds72         *73         * A nice alternative to nested setTimeouts.74         */75        wait(ms) {76            return new Promise(resolve => {77                setTimeout(resolve, ms);78            });79        },80        toggleNav: function () {81            this.navVisible = !this.navVisible;82        },83        /**84         * When the dragstart event is triggered.85         *86         * This event doesn't get triggered when dragging something from outside the browser,87         * so we can determine that something other than a file is being dragged.88         */89        dragStart() {90            this.draggingNonFile = true;91        },92        /**93         * When the dragend event is triggered.94         *95         * This event doesn't get triggered when dragging something from outside the browser,96         * so we can determine that something other than a file is being dragged.97         */98        dragEnd() {99            this.draggingNonFile = false;100        },101        sneakPeekResizeStart(e) {102            window.addEventListener('mousemove', this.sneakPeekResizing);103            window.addEventListener('mouseup', this.sneakPeekResizeEnd);104            $('.sneak-peek-iframe-wrap').css('pointer-events', 'none');105        },106        sneakPeekResizeEnd(e) {107            window.removeEventListener('mousemove', this.sneakPeekResizing, false);108            window.removeEventListener('mouseup', this.sneakPeekResizeEnd, false);109            $('.sneak-peek-iframe-wrap').css('pointer-events', 'auto');110        },111        sneakPeekResizing(e) {112            e.preventDefault();113            let width = e.clientX;114            // Prevent the width being too narrow.115            width = (width < 350) ? 350 : width;116            this.sneakPeekViewport.style.left = width + 'px';117            this.sneakPeekFields.style.width = width + 'px';118            localStorage.setItem('statamic.sneakpeek.width', width);119            this.$emit('livepreview.resizing', width);120        },121    },122    ready: function() {123        Mousetrap.bind(['/', 'ctrl+f'], function(e) {124            $('#global-search').focus();125        }, 'keyup');126        Mousetrap.bind('?', function(e) {127            this.showShortcuts = true;128        }.bind(this), 'keyup');129        Mousetrap.bind('escape', function(e) {130            this.$broadcast('close-modal');131            this.$broadcast('close-editor');132            this.$broadcast('close-selector');133            this.$broadcast('close-dropdown', null);134        }.bind(this), 'keyup');135        // Keep track of whether something other than a file is being dragged136        // so that components can tell when a file is being dragged.137        window.addEventListener('dragstart', this.dragStart);138        window.addEventListener('dragend', this.dragEnd);139        this.windowWidth = document.documentElement.clientWidth;140        window.addEventListener('resize', () => this.windowWidth = document.documentElement.clientWidth);141    },142    events: {143        'changesMade': function (changed) {144            // If true, a confirmation dialog will be displayed when the user tries to145            // navigate away (or refresh, etc). If false, the dialog will no longer show.146            if (changed) {147                window.onbeforeunload = () => '';148            } else {149                window.onbeforeunload = null;150            }151        },152        'modal.open': function () {153            this.modalOpen = true;154        },155        'modal.close': function () {156            this.modalOpen = false;157        }158    }...peek.js
Source:peek.js  
1import { define } from '../utils/object'2import { toInt, isObject } from '../utils/unit'3export default function (Glide, Components, Events) {4  const Peek = {5    /**6     * Setups how much to peek based on settings.7     *8     * @return {Void}9     */10    mount () {11      this.value = Glide.settings.peek12    }13  }14  define(Peek, 'value', {15    /**16     * Gets value of the peek.17     *18     * @returns {Number|Object}19     */20    get () {21      return Peek._v22    },23    /**24     * Sets value of the peek.25     *26     * @param {Number|Object} value27     * @return {Void}28     */29    set (value) {30      if (isObject(value)) {31        value.before = toInt(value.before)32        value.after = toInt(value.after)33      } else {34        value = toInt(value)35      }36      Peek._v = value37    }38  })39  define(Peek, 'reductor', {40    /**41     * Gets reduction value caused by peek.42     *43     * @returns {Number}44     */45    get () {46      let value = Peek.value47      let perView = Glide.settings.perView48      if (isObject(value)) {49        return (value.before / perView) + (value.after / perView)50      }51      return value * 2 / perView52    }53  })54  /**55   * Recalculate peeking sizes on:56   * - when resizing window to update to proper percents57   */58  Events.on(['resize', 'update'], () => {59    Peek.mount()60  })61  return Peek...Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const element = await page.$('text=Get Started');7  await element.hover();8  await page.waitForTimeout(3000);9  await browser.close();10})();11const { chromium } = require('playwright');12(async () => {13  const browser = await chromium.launch();14  const context = await browser.newContext();15  const page = await context.newPage();16  const element = await page.$('text=Get Started');17  await element.hover();18  await page.waitForTimeout(3000);19  await browser.close();20})();21const { chromium } = require('playwright');22(async () => {23  const browser = await chromium.launch();24  const context = await browser.newContext();25  const page = await context.newPage();26  const element = await page.$('text=Get Started');27  await element.hover();28  await page.waitForTimeout(3000);29  await browser.close();30})();31const { chromium } = require('playwright');32(async () => {33  const browser = await chromium.launch();34  const context = await browser.newContext();35  const page = await context.newPage();36  const element = await page.$('text=Get Started');37  await element.hover();38  await page.waitForTimeout(3000);39  await browser.close();40})();41const { chromium } = require('playwright');42(async () => {43  const browser = await chromium.launch();44  const context = await browser.newContext();45  const page = await context.newPage();46  const element = await page.$('text=Get Started');47  await element.hover();48  await page.waitForTimeout(3000);49  await browser.close();50})();51const { chromium } = require('playwright');52(async () => {Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.click('input[name="q"]');7  await page.keyboard.type('Hello World!');8  await page.keyboard.down('Shift');9  await page.keyboard.press('ArrowLeft');10  await page.keyboard.up('Shift');11  await page.keyboard.press('Backspace');12  await page.keyboard.type('!');13  await page.keyboard.press('Enter');14  await page.waitForNavigation();15  await page.screenshot({ path: `example.png` });16  await browser.close();17})();18const { chromium } = require('playwright');19(async () => {20  const browser = await chromium.launch();21  const context = await browser.newContext();22  const page = await context.newPage();23  await page.click('input[name="q"]');24  await page.keyboard.type('Hello World!');25  await page.keyboard.down('Shift');26  await page.keyboard.press('ArrowLeft');27  await page.keyboard.up('Shift');28  await page.keyboard.press('Backspace');29  await page.keyboard.type('!');30  await page.keyboard.press('Enter');31  await page.waitForNavigation();32  await page.screenshot({ path: `example.png` });33  await browser.close();34})();35const { chromium } = require('playwright');36(async () => {37  const browser = await chromium.launch();38  const context = await browser.newContext();39  const page = await context.newPage();40  await page.click('input[name="q"]');41  await page.keyboard.type('Hello World!');42  await page.keyboard.down('Shift');43  await page.keyboard.press('ArrowLeft');44  await page.keyboard.up('Shift');45  await page.keyboard.press('Backspace');46  await page.keyboard.type('!');47  await page.keyboard.press('Enter');48  await page.waitForNavigation();49  await page.screenshot({ path: `example.png` });50  await browser.close();51})();52const { chromium } = require('playwright');Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const elementHandle = await page.$('.gLFyf');7  await elementHandle.focus();8  await elementHandle.press('Backspace');9  await elementHandle.type('playwright');10  await page.keyboard.press('Enter');11  await page.waitForNavigation();12  await page.screenshot({ path: 'google-playwright.png' });13  await browser.close();14})();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await page.waitForSelector('text=Get started');7  await page.click('text=Get started');8  await page.waitForSelector('text=Run your first test');9  await page.click('text=Run your first test');10  await page.waitForSelector('text=Run your first test');11  const frame = page.mainFrame();12  const elementHandle = await frame.$('text=Run your first test');13  const box = await elementHandle.boundingBox();14  console.log(box);15  await browser.close();16})();17{ x: 35.5, y: 35.5, width: 135, height: 18 }18const { chromium } = require('playwright');19(async () => {20  const browser = await chromium.launch();21  const context = await browser.newContext();22  const page = await context.newPage();23  await page.waitForSelector('text=Get started');24  await page.click('text=Get started');25  await page.waitForSelector('text=Run your first test');26  await page.click('text=Run your first test');27  await page.waitForSelector('text=Run your first test');28  const frame = page.mainFrame();29  const elementHandle = await frame.$('text=Run your first test');30  const box = await elementHandle.boundingBox();31  console.log(box);32  await browser.close();33})();34{ x: 35.5, y: 35.5, width: 135, height: 18 }35const { chromium } = require('playwright');36(async () => {37  const browser = await chromium.launch();38  const context = await browser.newContext();39  const page = await context.newPage();40  await page.waitForSelector('text=Get started');41  await page.click('text=Get started');42  await page.waitForSelector('text=Run your first test');43  await page.click('text=RunUsing AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch({ headless: false });4  const context = await browser.newContext();5  const page = await context.newPage();6  const elementHandle = await page.$('input[name="q"]');7  await elementHandle.focus();8  await page.keyboard.type('playwright');9  await page.keyboard.down('Enter');10  await page.waitForSelector('text=Playwright is a Node library to automate Chromium, Firefox and WebKit with a single API')Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  const elementHandle = await page.$('input[name="q"]');7  await elementHandle.focus();8  await elementHandle.type('Hello World!');9  await page.screenshot({ path: 'example.png' });10  await browser.close();11})();12const { chromium } = require('playwright');13(async () => {14  const browser = await chromium.launch();15  const context = await browser.newContext();16  const page = await context.newPage();17  const elementHandle = await page.$('input[name="q"]');18  await elementHandle.focus();19  await elementHandle.type('Hello World!');20  await page.screenshot({ path: 'example.png' });21  await browser.close();22})();23const { chromium } = require('playwright');24(async () => {25  const browser = await chromium.launch();26  const context = await browser.newContext();27  const page = await context.newPage();28  const elementHandle = await page.$('input[name="q"]');29  await elementHandle.focus();30  await elementHandle.type('Hello World!');31  await page.screenshot({ path: 'example.png' });32  await browser.close();33})();34const { chromium } = require('playwright');35(async () => {36  const browser = await chromium.launch();37  const context = await browser.newContext();38  const page = await context.newPage();39  const elementHandle = await page.$('input[name="q"]');40  await elementHandle.focus();41  await elementHandle.type('Hello World!');42  await page.screenshot({ path: 'example.png' });43  await browser.close();44})();45const { chromium } = require('playwright');46(async () => {47  const browser = await chromium.launch();48  const context = await browser.newContext();49  const page = await context.newPage();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const context = await browser.newContext();5  const page = await context.newPage();6  await browser.close();7})();8const { chromium } = require('playwright');9(async () => {10  const browser = await chromium.launch();11  const context = await browser.newContext();12  const page = await context.newPage();13  await browser.close();14})();15const { chromium } = require('playwright');16(async () => {17  const browser = await chromium.launch();18  const context = await browser.newContext();19  const page = await context.newPage();20  await browser.close();21})();22const { chromium } = require('playwright');23(async () => {24  const browser = await chromium.launch();25  const context = await browser.newContext();26  const page = await context.newPage();27  await browser.close();28})();29const { chromium } = require('playwright');30(async () => {31  const browser = await chromium.launch();32  const context = await browser.newContext();33  const page = await context.newPage();34  await browser.close();35})();36const { chromium } = require('playwright');37(async () => {38  const browser = await chromium.launch();39  const context = await browser.newContext();40  const page = await context.newPage();Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3  const browser = await chromium.launch();4  const page = await browser.newPage();5  await page.waitForSelector('text=Get started');6  await page.click('text=Get started');7  await page.waitForSelector('text=Create a test project');8  await page.click('text=Create a test project');9  const selector = await page.waitForSelector('text=Install dependencies');10  const element = await selector.asElement();11  const boundingBox = await element.boundingBox();12  const frame = element._frame;13  const screenshot = await frame.screenshot({ clip: boundingBox });14  await browser.close();15})();Using AI Code Generation
1const path = require("path");2const playwright = require("playwright");3const { chromium } = playwright;4(async () => {5  const browser = await chromium.launch({6  });7  const context = await browser.newContext();8  const page = await context.newPage();9  const element = await page.$("input[name=q]");10  await element.type("Hello World");11  const value = await page.evaluate((element) => element.value, element);12  console.log(value);13  await browser.close();14})();15const path = require("path");16const playwright = require("playwright");17const { chromium } = playwright;18(async () => {19  const browser = await chromium.launch({20  });21  const context = await browser.newContext();22  const page = await context.newPage();23  const element = await page.$("input[name=q]");24  await element.type("Hello World");25  const value = await element.evaluate((element) => element.value);26  console.log(value);27  await browser.close();28})();29const path = require("path");30const playwright = require("playwright");31const { chromium } = playwright;32(async () => {33  const browser = await chromium.launch({34  });35  const context = await browser.newContext();36  const page = await context.newPage();37  const element = await page.$("input[name=q]");38  await element.type("Hello World");39  const value = await element.evaluate((element) => element.value);40  console.log(value);41  await browser.close();42})();43const path = require("path");44const playwright = require("playwright");45const { chromium } = playwright;46(async () => {47  const browser = await chromium.launch({48  });49  const context = await browser.newContext();50  const page = await context.newPage();Using AI Code Generation
1const { Page } = require('playwright');2const { getTestState } = require('@playwright/test');3const { page } = getTestState();4const { getInternalApi } = require('playwright');5const internalApi = getInternalApi(page);6const { peek } = internalApi;7const elementHandle = await page.$('button');8const { value } = await peek(elementHandle, 'innerHTML');9console.log(value);LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
