UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

552 lines (551 loc) 20.3 kB
"use strict"; Object.defineProperties(module.exports, { Parser: {get: function() { return Parser; }}, __esModule: {value: true} }); var $__angular2_47_di__, $__angular2_47_src_47_facade_47_lang__, $__angular2_47_src_47_facade_47_collection__, $__lexer__, $__angular2_47_src_47_reflection_47_reflection__, $__ast__; var Injectable = ($__angular2_47_di__ = require("angular2/di"), $__angular2_47_di__ && $__angular2_47_di__.__esModule && $__angular2_47_di__ || {default: $__angular2_47_di__}).Injectable; var $__1 = ($__angular2_47_src_47_facade_47_lang__ = require("angular2/src/facade/lang"), $__angular2_47_src_47_facade_47_lang__ && $__angular2_47_src_47_facade_47_lang__.__esModule && $__angular2_47_src_47_facade_47_lang__ || {default: $__angular2_47_src_47_facade_47_lang__}), int = $__1.int, isBlank = $__1.isBlank, isPresent = $__1.isPresent, BaseException = $__1.BaseException, StringWrapper = $__1.StringWrapper, RegExpWrapper = $__1.RegExpWrapper; var $__2 = ($__angular2_47_src_47_facade_47_collection__ = require("angular2/src/facade/collection"), $__angular2_47_src_47_facade_47_collection__ && $__angular2_47_src_47_facade_47_collection__.__esModule && $__angular2_47_src_47_facade_47_collection__ || {default: $__angular2_47_src_47_facade_47_collection__}), ListWrapper = $__2.ListWrapper, List = $__2.List; var $__3 = ($__lexer__ = require("./lexer"), $__lexer__ && $__lexer__.__esModule && $__lexer__ || {default: $__lexer__}), Lexer = $__3.Lexer, EOF = $__3.EOF, Token = $__3.Token, $PERIOD = $__3.$PERIOD, $COLON = $__3.$COLON, $SEMICOLON = $__3.$SEMICOLON, $LBRACKET = $__3.$LBRACKET, $RBRACKET = $__3.$RBRACKET, $COMMA = $__3.$COMMA, $LBRACE = $__3.$LBRACE, $RBRACE = $__3.$RBRACE, $LPAREN = $__3.$LPAREN, $RPAREN = $__3.$RPAREN; var $__4 = ($__angular2_47_src_47_reflection_47_reflection__ = require("angular2/src/reflection/reflection"), $__angular2_47_src_47_reflection_47_reflection__ && $__angular2_47_src_47_reflection_47_reflection__.__esModule && $__angular2_47_src_47_reflection_47_reflection__ || {default: $__angular2_47_src_47_reflection_47_reflection__}), reflector = $__4.reflector, Reflector = $__4.Reflector; var $__5 = ($__ast__ = require("./ast"), $__ast__ && $__ast__.__esModule && $__ast__ || {default: $__ast__}), AST = $__5.AST, EmptyExpr = $__5.EmptyExpr, ImplicitReceiver = $__5.ImplicitReceiver, AccessMember = $__5.AccessMember, LiteralPrimitive = $__5.LiteralPrimitive, Expression = $__5.Expression, Binary = $__5.Binary, PrefixNot = $__5.PrefixNot, Conditional = $__5.Conditional, Pipe = $__5.Pipe, Assignment = $__5.Assignment, Chain = $__5.Chain, KeyedAccess = $__5.KeyedAccess, LiteralArray = $__5.LiteralArray, LiteralMap = $__5.LiteralMap, Interpolation = $__5.Interpolation, MethodCall = $__5.MethodCall, FunctionCall = $__5.FunctionCall, TemplateBindings = $__5.TemplateBindings, TemplateBinding = $__5.TemplateBinding, ASTWithSource = $__5.ASTWithSource; var _implicitReceiver = new ImplicitReceiver(); var INTERPOLATION_REGEXP = RegExpWrapper.create('\\{\\{(.*?)\\}\\}'); var QUOTE_REGEXP = RegExpWrapper.create("'"); var Parser = function Parser(lexer) { var providedReflector = arguments[1] !== (void 0) ? arguments[1] : null; this._lexer = lexer; this._reflector = isPresent(providedReflector) ? providedReflector : reflector; }; ($traceurRuntime.createClass)(Parser, { parseAction: function(input, location) { var tokens = this._lexer.tokenize(input); var ast = new _ParseAST(input, location, tokens, this._reflector, true).parseChain(); return new ASTWithSource(ast, input, location); }, parseBinding: function(input, location) { var tokens = this._lexer.tokenize(input); var ast = new _ParseAST(input, location, tokens, this._reflector, false).parseChain(); return new ASTWithSource(ast, input, location); }, addPipes: function(bindingAst, pipes) { if (ListWrapper.isEmpty(pipes)) return bindingAst; var res = ListWrapper.reduce(pipes, (function(result, currentPipeName) { return new Pipe(result, currentPipeName, [], false); }), bindingAst.ast); return new ASTWithSource(res, bindingAst.source, bindingAst.location); }, parseTemplateBindings: function(input, location) { var tokens = this._lexer.tokenize(input); return new _ParseAST(input, location, tokens, this._reflector, false).parseTemplateBindings(); }, parseInterpolation: function(input, location) { var parts = StringWrapper.split(input, INTERPOLATION_REGEXP); if (parts.length <= 1) { return null; } var strings = []; var expressions = []; for (var i = 0; i < parts.length; i++) { var part = parts[i]; if (i % 2 === 0) { ListWrapper.push(strings, part); } else { var tokens = this._lexer.tokenize(part); var ast = new _ParseAST(input, location, tokens, this._reflector, false).parseChain(); ListWrapper.push(expressions, ast); } } return new ASTWithSource(new Interpolation(strings, expressions), input, location); }, wrapLiteralPrimitive: function(input, location) { return new ASTWithSource(new LiteralPrimitive(input), input, location); } }, {}); Object.defineProperty(Parser, "annotations", {get: function() { return [new Injectable()]; }}); Object.defineProperty(Parser, "parameters", {get: function() { return [[Lexer], [Reflector]]; }}); Object.defineProperty(Parser.prototype.parseAction, "parameters", {get: function() { return [[$traceurRuntime.type.string], [$traceurRuntime.type.any]]; }}); Object.defineProperty(Parser.prototype.parseBinding, "parameters", {get: function() { return [[$traceurRuntime.type.string], [$traceurRuntime.type.any]]; }}); Object.defineProperty(Parser.prototype.addPipes, "parameters", {get: function() { return [[ASTWithSource], [$traceurRuntime.genericType(List, String)]]; }}); Object.defineProperty(Parser.prototype.parseTemplateBindings, "parameters", {get: function() { return [[$traceurRuntime.type.string], [$traceurRuntime.type.any]]; }}); Object.defineProperty(Parser.prototype.parseInterpolation, "parameters", {get: function() { return [[$traceurRuntime.type.string], [$traceurRuntime.type.any]]; }}); Object.defineProperty(Parser.prototype.wrapLiteralPrimitive, "parameters", {get: function() { return [[$traceurRuntime.type.string], [$traceurRuntime.type.any]]; }}); var _ParseAST = function _ParseAST(input, location, tokens, reflector, parseAction) { this.input = input; this.location = location; this.tokens = tokens; this.index = 0; this.reflector = reflector; this.parseAction = parseAction; }; ($traceurRuntime.createClass)(_ParseAST, { peek: function(offset) { var i = this.index + offset; return i < this.tokens.length ? this.tokens[i] : EOF; }, get next() { return this.peek(0); }, get inputIndex() { return (this.index < this.tokens.length) ? this.next.index : this.input.length; }, advance: function() { this.index++; }, optionalCharacter: function(code) { if (this.next.isCharacter(code)) { this.advance(); return true; } else { return false; } }, optionalKeywordVar: function() { if (this.peekKeywordVar()) { this.advance(); return true; } else { return false; } }, peekKeywordVar: function() { return this.next.isKeywordVar() || this.next.isOperator('#'); }, expectCharacter: function(code) { if (this.optionalCharacter(code)) return ; this.error(("Missing expected " + StringWrapper.fromCharCode(code))); }, optionalOperator: function(op) { if (this.next.isOperator(op)) { this.advance(); return true; } else { return false; } }, expectOperator: function(operator) { if (this.optionalOperator(operator)) return ; this.error(("Missing expected operator " + operator)); }, expectIdentifierOrKeyword: function() { var n = this.next; if (!n.isIdentifier() && !n.isKeyword()) { this.error(("Unexpected token " + n + ", expected identifier or keyword")); } this.advance(); return n.toString(); }, expectIdentifierOrKeywordOrString: function() { var n = this.next; if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) { this.error(("Unexpected token " + n + ", expected identifier, keyword, or string")); } this.advance(); return n.toString(); }, parseChain: function() { var exprs = []; while (this.index < this.tokens.length) { var expr = this.parsePipe(); ListWrapper.push(exprs, expr); if (this.optionalCharacter($SEMICOLON)) { if (!this.parseAction) { this.error("Binding expression cannot contain chained expression"); } while (this.optionalCharacter($SEMICOLON)) {} } else if (this.index < this.tokens.length) { this.error(("Unexpected token '" + this.next + "'")); } } if (exprs.length == 0) return new EmptyExpr(); if (exprs.length == 1) return exprs[0]; return new Chain(exprs); }, parsePipe: function() { var result = this.parseExpression(); if (this.optionalOperator("|")) { return this.parseInlinedPipe(result); } else { return result; } }, parseExpression: function() { var start = this.inputIndex; var result = this.parseConditional(); while (this.next.isOperator('=')) { if (!result.isAssignable) { var end = this.inputIndex; var expression = this.input.substring(start, end); this.error(("Expression " + expression + " is not assignable")); } if (!this.parseAction) { this.error("Binding expression cannot contain assignments"); } this.expectOperator('='); result = new Assignment(result, this.parseConditional()); } return result; }, parseConditional: function() { var start = this.inputIndex; var result = this.parseLogicalOr(); if (this.optionalOperator('?')) { var yes = this.parseExpression(); if (!this.optionalCharacter($COLON)) { var end = this.inputIndex; var expression = this.input.substring(start, end); this.error(("Conditional expression " + expression + " requires all 3 expressions")); } var no = this.parseExpression(); return new Conditional(result, yes, no); } else { return result; } }, parseLogicalOr: function() { var result = this.parseLogicalAnd(); while (this.optionalOperator('||')) { result = new Binary('||', result, this.parseLogicalAnd()); } return result; }, parseLogicalAnd: function() { var result = this.parseEquality(); while (this.optionalOperator('&&')) { result = new Binary('&&', result, this.parseEquality()); } return result; }, parseEquality: function() { var result = this.parseRelational(); while (true) { if (this.optionalOperator('==')) { result = new Binary('==', result, this.parseRelational()); } else if (this.optionalOperator('!=')) { result = new Binary('!=', result, this.parseRelational()); } else { return result; } } }, parseRelational: function() { var result = this.parseAdditive(); while (true) { if (this.optionalOperator('<')) { result = new Binary('<', result, this.parseAdditive()); } else if (this.optionalOperator('>')) { result = new Binary('>', result, this.parseAdditive()); } else if (this.optionalOperator('<=')) { result = new Binary('<=', result, this.parseAdditive()); } else if (this.optionalOperator('>=')) { result = new Binary('>=', result, this.parseAdditive()); } else { return result; } } }, parseAdditive: function() { var result = this.parseMultiplicative(); while (true) { if (this.optionalOperator('+')) { result = new Binary('+', result, this.parseMultiplicative()); } else if (this.optionalOperator('-')) { result = new Binary('-', result, this.parseMultiplicative()); } else { return result; } } }, parseMultiplicative: function() { var result = this.parsePrefix(); while (true) { if (this.optionalOperator('*')) { result = new Binary('*', result, this.parsePrefix()); } else if (this.optionalOperator('%')) { result = new Binary('%', result, this.parsePrefix()); } else if (this.optionalOperator('/')) { result = new Binary('/', result, this.parsePrefix()); } else { return result; } } }, parsePrefix: function() { if (this.optionalOperator('+')) { return this.parsePrefix(); } else if (this.optionalOperator('-')) { return new Binary('-', new LiteralPrimitive(0), this.parsePrefix()); } else if (this.optionalOperator('!')) { return new PrefixNot(this.parsePrefix()); } else { return this.parseCallChain(); } }, parseCallChain: function() { var result = this.parsePrimary(); while (true) { if (this.optionalCharacter($PERIOD)) { result = this.parseAccessMemberOrMethodCall(result); } else if (this.optionalCharacter($LBRACKET)) { var key = this.parseExpression(); this.expectCharacter($RBRACKET); result = new KeyedAccess(result, key); } else if (this.optionalCharacter($LPAREN)) { var args = this.parseCallArguments(); this.expectCharacter($RPAREN); result = new FunctionCall(result, args); } else { return result; } } }, parsePrimary: function() { if (this.optionalCharacter($LPAREN)) { var result = this.parsePipe(); this.expectCharacter($RPAREN); return result; } else if (this.next.isKeywordNull() || this.next.isKeywordUndefined()) { this.advance(); return new LiteralPrimitive(null); } else if (this.next.isKeywordTrue()) { this.advance(); return new LiteralPrimitive(true); } else if (this.next.isKeywordFalse()) { this.advance(); return new LiteralPrimitive(false); } else if (this.optionalCharacter($LBRACKET)) { var elements = this.parseExpressionList($RBRACKET); this.expectCharacter($RBRACKET); return new LiteralArray(elements); } else if (this.next.isCharacter($LBRACE)) { return this.parseLiteralMap(); } else if (this.next.isIdentifier()) { return this.parseAccessMemberOrMethodCall(_implicitReceiver); } else if (this.next.isNumber()) { var value = this.next.toNumber(); this.advance(); return new LiteralPrimitive(value); } else if (this.next.isString()) { var value = this.next.toString(); this.advance(); return new LiteralPrimitive(value); } else if (this.index >= this.tokens.length) { this.error(("Unexpected end of expression: " + this.input)); } else { this.error(("Unexpected token " + this.next)); } }, parseExpressionList: function(terminator) { var result = []; if (!this.next.isCharacter(terminator)) { do { ListWrapper.push(result, this.parseExpression()); } while (this.optionalCharacter($COMMA)); } return result; }, parseLiteralMap: function() { var keys = []; var values = []; this.expectCharacter($LBRACE); if (!this.optionalCharacter($RBRACE)) { do { var key = this.expectIdentifierOrKeywordOrString(); ListWrapper.push(keys, key); this.expectCharacter($COLON); ListWrapper.push(values, this.parseExpression()); } while (this.optionalCharacter($COMMA)); this.expectCharacter($RBRACE); } return new LiteralMap(keys, values); }, parseAccessMemberOrMethodCall: function(receiver) { var id = this.expectIdentifierOrKeyword(); if (this.optionalCharacter($LPAREN)) { var args = this.parseCallArguments(); this.expectCharacter($RPAREN); var fn = this.reflector.method(id); return new MethodCall(receiver, id, fn, args); } else { var getter = this.reflector.getter(id); var setter = this.reflector.setter(id); var am = new AccessMember(receiver, id, getter, setter); if (this.optionalOperator("|")) { return this.parseInlinedPipe(am); } else { return am; } } }, parseInlinedPipe: function(result) { do { if (this.parseAction) { this.error("Cannot have a pipe in an action expression"); } var name = this.expectIdentifierOrKeyword(); var args = ListWrapper.create(); while (this.optionalCharacter($COLON)) { ListWrapper.push(args, this.parseExpression()); } result = new Pipe(result, name, args, true); } while (this.optionalOperator("|")); return result; }, parseCallArguments: function() { if (this.next.isCharacter($RPAREN)) return []; var positionals = []; do { ListWrapper.push(positionals, this.parseExpression()); } while (this.optionalCharacter($COMMA)); return positionals; }, expectTemplateBindingKey: function() { var result = ''; var operatorFound = false; do { result += this.expectIdentifierOrKeywordOrString(); operatorFound = this.optionalOperator('-'); if (operatorFound) { result += '-'; } } while (operatorFound); return result.toString(); }, parseTemplateBindings: function() { var bindings = []; while (this.index < this.tokens.length) { var keyIsVar = this.optionalKeywordVar(); var key = this.expectTemplateBindingKey(); this.optionalCharacter($COLON); var name = null; var expression = null; if (this.next !== EOF) { if (keyIsVar) { if (this.optionalOperator("=")) { name = this.expectTemplateBindingKey(); } else { name = '\$implicit'; } } else if (!this.peekKeywordVar()) { var start = this.inputIndex; var ast = this.parsePipe(); var source = this.input.substring(start, this.inputIndex); expression = new ASTWithSource(ast, source, this.location); } } ListWrapper.push(bindings, new TemplateBinding(key, keyIsVar, name, expression)); if (!this.optionalCharacter($SEMICOLON)) { this.optionalCharacter($COMMA); } ; } return bindings; }, error: function(message) { var index = arguments[1] !== (void 0) ? arguments[1] : null; if (isBlank(index)) index = this.index; var location = (index < this.tokens.length) ? ("at column " + (this.tokens[index].index + 1) + " in") : "at the end of the expression"; throw new BaseException(("Parser Error: " + message + " " + location + " [" + this.input + "] in " + this.location)); } }, {}); Object.defineProperty(_ParseAST, "parameters", {get: function() { return [[$traceurRuntime.type.string], [$traceurRuntime.type.any], [List], [Reflector], [$traceurRuntime.type.boolean]]; }}); Object.defineProperty(_ParseAST.prototype.peek, "parameters", {get: function() { return [[int]]; }}); Object.defineProperty(_ParseAST.prototype.optionalCharacter, "parameters", {get: function() { return [[int]]; }}); Object.defineProperty(_ParseAST.prototype.expectCharacter, "parameters", {get: function() { return [[int]]; }}); Object.defineProperty(_ParseAST.prototype.optionalOperator, "parameters", {get: function() { return [[$traceurRuntime.type.string]]; }}); Object.defineProperty(_ParseAST.prototype.expectOperator, "parameters", {get: function() { return [[$traceurRuntime.type.string]]; }}); Object.defineProperty(_ParseAST.prototype.parseExpressionList, "parameters", {get: function() { return [[int]]; }}); Object.defineProperty(_ParseAST.prototype.error, "parameters", {get: function() { return [[$traceurRuntime.type.string], [int]]; }}); //# sourceMappingURL=parser.js.map //# sourceMappingURL=./parser.map