diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 4849cb8c89e..c7818f2e1bb 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -34,12 +34,16 @@ module ts { return file.filename + "(" + loc.line + "," + loc.character + ")"; } - export function getStartPosOfNode(node: Node): number { return node.pos; } export function getTokenPosOfNode(node: Node, sourceFile?: SourceFile): number { + // With nodes that have no width (i.e. 'Missing' nodes), we actually *don't* + // want to skip trivia because this will launch us forward to the next token. + if (node.pos === node.end) { + return node.pos; + } return skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos); } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 88e3601b610..8745421c269 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -220,19 +220,13 @@ module ts { } function nodeHasTokens(n: Node): boolean { - if (n.kind === SyntaxKind.ExpressionStatement) { - return nodeHasTokens((n).expression); - } - - if (n.kind === SyntaxKind.EndOfFileToken || - n.kind === SyntaxKind.OmittedExpression || - n.kind === SyntaxKind.Missing || - n.kind === SyntaxKind.Unknown) { + if (n.kind === SyntaxKind.Unknown) { return false; } - // SyntaxList is already realized so getChildCount should be fast and non-expensive - return n.kind !== SyntaxKind.SyntaxList || n.getChildCount() !== 0; + // If we have a token or node that has a non-zero width, it must have tokens. + // Note, that getWidth() does not take trivia into account. + return n.getWidth() !== 0; } export function getTypeArgumentOrTypeParameterList(node: Node): NodeArray {