From b1f49c44f96aa5e3374a0f896ff163f6ec6df5ef Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Sat, 29 Nov 2014 14:11:47 -0800 Subject: [PATCH] Simplify parser. --- src/services/syntax/parser.ts | 74 ++++++++++++---------------- src/services/syntax/syntaxElement.ts | 13 ----- 2 files changed, 32 insertions(+), 55 deletions(-) diff --git a/src/services/syntax/parser.ts b/src/services/syntax/parser.ts index c4b282380d7..fa9e76ee13b 100644 --- a/src/services/syntax/parser.ts +++ b/src/services/syntax/parser.ts @@ -1019,7 +1019,7 @@ module TypeScript.Parser { _currentToken.hasLeadingNewLine()) { var token1 = peekToken(1); - if (!existsNewLineBetweenTokens(_currentToken, token1, source.text) && + if (!token1.hasLeadingNewLine() && SyntaxFacts.isIdentifierNameOrAnyKeyword(token1)) { return createMissingToken(SyntaxKind.IdentifierName, _currentToken); @@ -1555,8 +1555,7 @@ module TypeScript.Parser { // Then we *should* parse it as a property name, as ASI takes effect here. if (isModifier(_currentToken, /*index:*/ 0)) { var token1 = peekToken(1); - if (!existsNewLineBetweenTokens(_currentToken, token1, source.text) && - isPropertyNameToken(token1, inErrorRecovery)) { + if (!token1.hasLeadingNewLine() && isPropertyNameToken(token1, inErrorRecovery)) { return false; } @@ -2904,11 +2903,37 @@ module TypeScript.Parser { return undefined; } - return parseMemberExpressionRest(expression); + return parseMemberExpressionRest(expression); + } + + function parseMemberExpressionRest(expression: ILeftHandSideExpressionSyntax): ILeftHandSideExpressionSyntax { + while (true) { + var _currentToken = currentToken(); + var currentTokenKind = _currentToken.kind; + + switch (currentTokenKind) { + case SyntaxKind.OpenBracketToken: + expression = parseElementAccessExpression(expression, _currentToken); + continue; + + case SyntaxKind.DotToken: + expression = new MemberAccessExpressionSyntax(contextFlags, expression, consumeToken(_currentToken), eatIdentifierNameToken()); + continue; + + case SyntaxKind.NoSubstitutionTemplateToken: + case SyntaxKind.TemplateStartToken: + expression = new TemplateAccessExpressionSyntax(contextFlags, expression, parseTemplateExpression(_currentToken)); + continue; + } + + return expression; + } } function parseCallExpressionRest(expression: ILeftHandSideExpressionSyntax): ILeftHandSideExpressionSyntax { while (true) { + expression = parseMemberExpressionRest(expression); + var _currentToken = currentToken(); var currentTokenKind = _currentToken.kind; @@ -2929,43 +2954,6 @@ module TypeScript.Parser { expression = new InvocationExpressionSyntax(contextFlags, expression, argumentList); continue; - - case SyntaxKind.OpenBracketToken: - expression = parseElementAccessExpression(expression, _currentToken); - continue; - - case SyntaxKind.DotToken: - expression = new MemberAccessExpressionSyntax(contextFlags, expression, consumeToken(_currentToken), eatIdentifierNameToken()); - continue; - - case SyntaxKind.NoSubstitutionTemplateToken: - case SyntaxKind.TemplateStartToken: - expression = new TemplateAccessExpressionSyntax(contextFlags, expression, parseTemplateExpression(_currentToken)); - continue; - } - - return expression; - } - } - - function parseMemberExpressionRest(expression: IMemberExpressionSyntax): IMemberExpressionSyntax { - while (true) { - var _currentToken = currentToken(); - var currentTokenKind = _currentToken.kind; - - switch (currentTokenKind) { - case SyntaxKind.OpenBracketToken: - expression = parseElementAccessExpression(expression, _currentToken); - continue; - - case SyntaxKind.DotToken: - expression = new MemberAccessExpressionSyntax(contextFlags, expression, consumeToken(_currentToken), eatIdentifierNameToken()); - continue; - - case SyntaxKind.NoSubstitutionTemplateToken: - case SyntaxKind.TemplateStartToken: - expression = new TemplateAccessExpressionSyntax(contextFlags, expression, parseTemplateExpression(_currentToken)); - continue; } return expression; @@ -3282,7 +3270,9 @@ module TypeScript.Parser { // this decision. return new ObjectCreationExpressionSyntax(contextFlags, - consumeToken(newKeyword), tryParseMemberExpressionOrHigher(currentToken(), /*force:*/ true), tryParseArgumentList()); + consumeToken(newKeyword), + tryParseMemberExpressionOrHigher(currentToken(), /*force:*/ true), + tryParseArgumentList()); } function parseTemplateExpression(startToken: ISyntaxToken): IPrimaryExpressionSyntax { diff --git a/src/services/syntax/syntaxElement.ts b/src/services/syntax/syntaxElement.ts index 2a86d2ff959..a76cf00721b 100644 --- a/src/services/syntax/syntaxElement.ts +++ b/src/services/syntax/syntaxElement.ts @@ -371,19 +371,6 @@ module TypeScript { return fullStart(element) + fullWidth(element); } - export function existsNewLineBetweenTokens(token1: ISyntaxToken, token2: ISyntaxToken, text: ISimpleText) { - if (token1 === token2) { - return false; - } - - if (!token1 || !token2) { - return true; - } - - var lineMap = text.lineMap(); - return lineMap.getLineNumberFromPosition(fullEnd(token1)) !== lineMap.getLineNumberFromPosition(start(token2, text)); - } - export interface ISyntaxElement { kind: SyntaxKind; parent: ISyntaxElement;