@@ -120,6 +120,7 @@ module ts {
120120 return visitNodes ( cbNodes , ( < ObjectLiteralExpression > node ) . properties ) ;
121121 case SyntaxKind . PropertyAccessExpression :
122122 return visitNode ( cbNode , ( < PropertyAccessExpression > node ) . expression ) ||
123+ visitNode ( cbNode , ( < PropertyAccessExpression > node ) . dotToken ) ||
123124 visitNode ( cbNode , ( < PropertyAccessExpression > node ) . name ) ;
124125 case SyntaxKind . ElementAccessExpression :
125126 return visitNode ( cbNode , ( < ElementAccessExpression > node ) . expression ) ||
@@ -156,7 +157,9 @@ module ts {
156157 visitNode ( cbNode , ( < BinaryExpression > node ) . right ) ;
157158 case SyntaxKind . ConditionalExpression :
158159 return visitNode ( cbNode , ( < ConditionalExpression > node ) . condition ) ||
160+ visitNode ( cbNode , ( < ConditionalExpression > node ) . questionToken ) ||
159161 visitNode ( cbNode , ( < ConditionalExpression > node ) . whenTrue ) ||
162+ visitNode ( cbNode , ( < ConditionalExpression > node ) . colonToken ) ||
160163 visitNode ( cbNode , ( < ConditionalExpression > node ) . whenFalse ) ;
161164 case SyntaxKind . SpreadElementExpression :
162165 return visitNode ( cbNode , ( < SpreadElementExpression > node ) . expression ) ;
@@ -1327,13 +1330,16 @@ module ts {
13271330
13281331 function parseOptionalToken ( t : SyntaxKind ) : Node {
13291332 if ( token === t ) {
1330- var node = createNode ( t ) ;
1331- nextToken ( ) ;
1332- return finishNode ( node ) ;
1333+ return parseTokenNode ( ) ;
13331334 }
13341335 return undefined ;
13351336 }
13361337
1338+ function parseExpectedToken ( t : SyntaxKind , reportAtCurrentPosition : boolean , diagnosticMessage : DiagnosticMessage , arg0 ?: any ) : Node {
1339+ return parseOptionalToken ( t ) ||
1340+ createMissingNode ( t , reportAtCurrentPosition , diagnosticMessage , arg0 ) ;
1341+ }
1342+
13371343 function parseTokenNode < T extends Node > ( ) : T {
13381344 var node = < T > createNode ( token ) ;
13391345 nextToken ( ) ;
@@ -2162,8 +2168,7 @@ module ts {
21622168 literal = parseLiteralNode ( ) ;
21632169 }
21642170 else {
2165- literal = < LiteralExpression > createMissingNode (
2166- SyntaxKind . TemplateTail , /*reportAtCurrentPosition:*/ false , Diagnostics . _0_expected , tokenToString ( SyntaxKind . CloseBraceToken ) ) ;
2171+ literal = < LiteralExpression > parseExpectedToken ( SyntaxKind . TemplateTail , /*reportAtCurrentPosition:*/ false , Diagnostics . _0_expected , tokenToString ( SyntaxKind . CloseBraceToken ) ) ;
21672172 }
21682173
21692174 span . literal = literal ;
@@ -3186,16 +3191,19 @@ module ts {
31863191
31873192 function parseConditionalExpressionRest ( leftOperand : Expression ) : Expression {
31883193 // Note: we are passed in an expression which was produced from parseBinaryExpressionOrHigher.
3189- if ( ! parseOptional ( SyntaxKind . QuestionToken ) ) {
3194+ var questionToken = parseOptionalToken ( SyntaxKind . QuestionToken ) ;
3195+ if ( ! questionToken ) {
31903196 return leftOperand ;
31913197 }
31923198
31933199 // Note: we explicitly 'allowIn' in the whenTrue part of the condition expression, and
31943200 // we do not that for the 'whenFalse' part.
31953201 var node = < ConditionalExpression > createNode ( SyntaxKind . ConditionalExpression , leftOperand . pos ) ;
31963202 node . condition = leftOperand ;
3203+ node . questionToken = questionToken ;
31973204 node . whenTrue = allowInAnd ( parseAssignmentExpressionOrHigher ) ;
3198- parseExpected ( SyntaxKind . ColonToken ) ;
3205+ node . colonToken = parseExpectedToken ( SyntaxKind . ColonToken , /*reportAtCurrentPosition:*/ false ,
3206+ Diagnostics . _0_expected , tokenToString ( SyntaxKind . ColonToken ) ) ;
31993207 node . whenFalse = parseAssignmentExpressionOrHigher ( ) ;
32003208 return finishNode ( node ) ;
32013209 }
@@ -3458,7 +3466,7 @@ module ts {
34583466 // If it wasn't then just try to parse out a '.' and report an error.
34593467 var node = < PropertyAccessExpression > createNode ( SyntaxKind . PropertyAccessExpression , expression . pos ) ;
34603468 node . expression = expression ;
3461- parseExpected ( SyntaxKind . DotToken , Diagnostics . super_must_be_followed_by_an_argument_list_or_member_access ) ;
3469+ node . dotToken = parseExpectedToken ( SyntaxKind . DotToken , /*reportAtCurrentPosition:*/ false , Diagnostics . super_must_be_followed_by_an_argument_list_or_member_access ) ;
34623470 node . name = parseRightSideOfDot ( /*allowIdentifierNames:*/ true ) ;
34633471 return finishNode ( node ) ;
34643472 }
@@ -3474,10 +3482,11 @@ module ts {
34743482
34753483 function parseMemberExpressionRest ( expression : LeftHandSideExpression ) : MemberExpression {
34763484 while ( true ) {
3477- var dotOrBracketStart = scanner . getTokenPos ( ) ;
3478- if ( parseOptional ( SyntaxKind . DotToken ) ) {
3485+ var dotToken = parseOptionalToken ( SyntaxKind . DotToken ) ;
3486+ if ( dotToken ) {
34793487 var propertyAccess = < PropertyAccessExpression > createNode ( SyntaxKind . PropertyAccessExpression , expression . pos ) ;
34803488 propertyAccess . expression = expression ;
3489+ propertyAccess . dotToken = dotToken ;
34813490 propertyAccess . name = parseRightSideOfDot ( /*allowIdentifierNames:*/ true ) ;
34823491 expression = finishNode ( propertyAccess ) ;
34833492 continue ;
0 commit comments