From 35b489d7d1ca6da4c2440e65a7f0215bdc951499 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 15:20:05 -0800 Subject: [PATCH 01/22] Rename our one-based methods to more clearly indicate that that's what base they use. --- src/compiler/emitter.ts | 10 +++++----- src/compiler/scanner.ts | 12 ++++++------ src/compiler/tsc.ts | 4 ++-- src/compiler/utilities.ts | 2 +- src/harness/fourslash.ts | 6 +++--- src/harness/harnessLanguageService.ts | 8 ++++---- src/services/formatting/smartIndenter.ts | 2 +- src/services/services.ts | 8 ++++---- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6a2338268e8..86a8ca584a2 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -134,7 +134,7 @@ module ts { } function getLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { - return getLineAndCharacterOfPosition(currentSourceFile, pos).line; + return getOneBasedLineAndCharacterOfPosition(currentSourceFile, pos).line; } function emitNewLineBeforeLeadingComments(currentSourceFile: SourceFile, writer: EmitTextWriter, node: TextRange, leadingComments: CommentRange[]) { @@ -169,16 +169,16 @@ module ts { function writeCommentRange(currentSourceFile: SourceFile, writer: EmitTextWriter, comment: CommentRange, newLine: string){ if (currentSourceFile.text.charCodeAt(comment.pos + 1) === CharacterCodes.asterisk) { - var firstCommentLineAndCharacter = getLineAndCharacterOfPosition(currentSourceFile, comment.pos); + var firstCommentLineAndCharacter = getOneBasedLineAndCharacterOfPosition(currentSourceFile, comment.pos); var lastLine = getLineStarts(currentSourceFile).length; var firstCommentLineIndent: number; for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) { - var nextLineStart = currentLine === lastLine ? (comment.end + 1) : getPositionFromLineAndCharacter(currentSourceFile, currentLine + 1, /*character*/1); + var nextLineStart = currentLine === lastLine ? (comment.end + 1) : getPositionFromOneBasedLineAndCharacter(currentSourceFile, currentLine + 1, /*character*/1); if (pos !== comment.pos) { // If we are not emitting first line, we need to write the spaces to adjust the alignment if (firstCommentLineIndent === undefined) { - firstCommentLineIndent = calculateIndent(getPositionFromLineAndCharacter(currentSourceFile, firstCommentLineAndCharacter.line, /*character*/1), + firstCommentLineIndent = calculateIndent(getPositionFromOneBasedLineAndCharacter(currentSourceFile, firstCommentLineAndCharacter.line, /*character*/1), comment.pos); } @@ -1733,7 +1733,7 @@ module ts { } function recordSourceMapSpan(pos: number) { - var sourceLinePos = getLineAndCharacterOfPosition(currentSourceFile, pos); + var sourceLinePos = getOneBasedLineAndCharacterOfPosition(currentSourceFile, pos); var emittedLine = writer.getLine(); var emittedColumn = writer.getColumn(); diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index fbbd69bbd69..bf5c4116074 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -278,11 +278,11 @@ module ts { return result; } - export function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { - return computePositionFromLineAndCharacter(getLineStarts(sourceFile), line, character); + export function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { + return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line, character); } - export function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number { + export function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number { Debug.assert(line > 0 && line <= lineStarts.length); return lineStarts[line - 1] + character - 1; } @@ -291,7 +291,7 @@ module ts { return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text)); } - export function computeLineAndCharacterOfPosition(lineStarts: number[], position: number) { + export function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) { var lineNumber = binarySearch(lineStarts, position); if (lineNumber < 0) { // If the actual position was not found, @@ -306,8 +306,8 @@ module ts { }; } - export function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { - return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position); + export function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { + return computeOneBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position); } var hasOwnProperty = Object.prototype.hasOwnProperty; diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 3f7e6362e19..84d8a25e790 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -72,7 +72,7 @@ module ts { function countLines(program: Program): number { var count = 0; forEach(program.getSourceFiles(), file => { - count += getLineAndCharacterOfPosition(file, file.end).line; + count += getOneBasedLineAndCharacterOfPosition(file, file.end).line; }); return count; } @@ -86,7 +86,7 @@ module ts { var output = ""; if (diagnostic.file) { - var loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); + var loc = getOneBasedLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); output += diagnostic.file.fileName + "(" + loc.line + "," + loc.character + "): "; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 5a50e2799dc..6323ffd4313 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -108,7 +108,7 @@ module ts { // This is a useful function for debugging purposes. export function nodePosToString(node: Node): string { var file = getSourceFileOfNode(node); - var loc = getLineAndCharacterOfPosition(file, node.pos); + var loc = getOneBasedLineAndCharacterOfPosition(file, node.pos); return file.fileName + "(" + loc.line + "," + loc.character + ")"; } diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 603a78b5f75..8511d042194 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -395,7 +395,7 @@ module FourSlash { this.currentCaretPosition = pos; var lineStarts = ts.computeLineStarts(this.getFileContent(this.activeFile.fileName)); - var lineCharPos = ts.computeLineAndCharacterOfPosition(lineStarts, pos); + var lineCharPos = ts.computeOneBasedLineAndCharacterOfPosition(lineStarts, pos); this.scenarioActions.push(''); } @@ -2033,7 +2033,7 @@ module FourSlash { } private getCurrentCaretFilePosition() { - var result = this.languageServiceAdapterHost.positionToZeroBasedLineCol(this.activeFile.fileName, this.currentCaretPosition); + var result = this.languageServiceAdapterHost.positionToZeroBasedLineAndCharacter(this.activeFile.fileName, this.currentCaretPosition); if (result.line >= 0) { result.line++; } @@ -2120,7 +2120,7 @@ module FourSlash { } private getLineColStringAtPosition(position: number) { - var pos = this.languageServiceAdapterHost.positionToZeroBasedLineCol(this.activeFile.fileName, position); + var pos = this.languageServiceAdapterHost.positionToZeroBasedLineAndCharacter(this.activeFile.fileName, position); return 'line ' + (pos.line + 1) + ', col ' + pos.character; } diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 2f95f5072d0..f0d788a1c6b 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -175,18 +175,18 @@ module Harness.LanguageService { assert.isTrue(line >= 1); assert.isTrue(col >= 1); - return ts.computePositionFromLineAndCharacter(script.lineMap, line, col); + return ts.computePositionFromOneBasedLineAndCharacter(script.lineMap, line, col); } /** * @param line 0 based index * @param col 0 based index */ - public positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { + public positionToZeroBasedLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { var script: ScriptInfo = this.fileNameToScript[fileName]; assert.isNotNull(script); - var result = ts.computeLineAndCharacterOfPosition(script.lineMap, position); + var result = ts.computeOneBasedLineAndCharacterOfPosition(script.lineMap, position); assert.isTrue(result.line >= 1); assert.isTrue(result.character >= 1); @@ -239,7 +239,7 @@ module Harness.LanguageService { updateScript(fileName: string, content: string): void { return this.nativeHost.updateScript(fileName, content); } editScript(fileName: string, minChar: number, limChar: number, newText: string): void { this.nativeHost.editScript(fileName, minChar, limChar, newText); } lineColToPosition(fileName: string, line: number, col: number): number { return this.nativeHost.lineColToPosition(fileName, line, col); } - positionToZeroBasedLineCol(fileName: string, position: number): ts.LineAndCharacter { return this.nativeHost.positionToZeroBasedLineCol(fileName, position); } + positionToZeroBasedLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { return this.nativeHost.positionToZeroBasedLineAndCharacter(fileName, position); } getCompilationSettings(): string { return JSON.stringify(this.nativeHost.getCompilationSettings()); } getCancellationToken(): ts.CancellationToken { return this.nativeHost.getCancellationToken(); } diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 3aa97fe6ae6..efc279cfca6 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -303,7 +303,7 @@ module ts.formatting { } function findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter: LineAndCharacter, sourceFile: SourceFile, options: EditorOptions): number { - var lineStart = sourceFile.getPositionFromLineAndCharacter(lineAndCharacter.line, 1); + var lineStart = sourceFile.getPositionFromOneBasedLineAndCharacter(lineAndCharacter.line, 1); return findFirstNonWhitespaceColumn(lineStart, lineStart + lineAndCharacter.character, sourceFile, options); } diff --git a/src/services/services.ts b/src/services/services.ts index 6e3cdf0a344..07a0bac2dc6 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -63,7 +63,7 @@ module ts { getNamedDeclarations(): Declaration[]; getLineAndCharacterFromPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromLineAndCharacter(line: number, character: number): number; + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } @@ -751,15 +751,15 @@ module ts { } public getLineAndCharacterFromPosition(position: number): LineAndCharacter { - return getLineAndCharacterOfPosition(this, position); + return getOneBasedLineAndCharacterOfPosition(this, position); } public getLineStarts(): number[] { return getLineStarts(this); } - public getPositionFromLineAndCharacter(line: number, character: number): number { - return getPositionFromLineAndCharacter(this, line, character); + public getPositionFromOneBasedLineAndCharacter(line: number, character: number): number { + return getPositionFromOneBasedLineAndCharacter(this, line, character); } public getNamedDeclarations() { From 78cfbb6e5024ac32c15cb2b082796fcf36854f0b Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 15:20:40 -0800 Subject: [PATCH 02/22] Update baselines. --- .../baselines/reference/APISample_compile.js | 10 +++++----- .../reference/APISample_compile.types | 20 +++++++++---------- tests/baselines/reference/APISample_linter.js | 10 +++++----- .../reference/APISample_linter.types | 20 +++++++++---------- .../reference/APISample_transform.js | 10 +++++----- .../reference/APISample_transform.types | 20 +++++++++---------- .../baselines/reference/APISample_watcher.js | 10 +++++----- .../reference/APISample_watcher.types | 20 +++++++++---------- 8 files changed, 60 insertions(+), 60 deletions(-) diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index b91a706aa45..83951d237a3 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -1384,14 +1384,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1471,7 +1471,7 @@ declare module "typescript" { getNamedDeclarations(): Declaration[]; getLineAndCharacterFromPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromLineAndCharacter(line: number, character: number): number; + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index ae53c666807..18b6f84c702 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -4368,15 +4368,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4386,8 +4386,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4398,8 +4398,8 @@ declare module "typescript" { >character : number }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -4743,8 +4743,8 @@ declare module "typescript" { getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromLineAndCharacter(line: number, character: number): number; ->getPositionFromLineAndCharacter : (line: number, character: number) => number + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 68c13edb7db..0b090bebd7f 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -1415,14 +1415,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1502,7 +1502,7 @@ declare module "typescript" { getNamedDeclarations(): Declaration[]; getLineAndCharacterFromPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromLineAndCharacter(line: number, character: number): number; + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 0c153e7b1dc..5e25227836b 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -4512,15 +4512,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4530,8 +4530,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4542,8 +4542,8 @@ declare module "typescript" { >character : number }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -4887,8 +4887,8 @@ declare module "typescript" { getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromLineAndCharacter(line: number, character: number): number; ->getPositionFromLineAndCharacter : (line: number, character: number) => number + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 0e80f6b55b9..4e933d72b3e 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -1416,14 +1416,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1503,7 +1503,7 @@ declare module "typescript" { getNamedDeclarations(): Declaration[]; getLineAndCharacterFromPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromLineAndCharacter(line: number, character: number): number; + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 0c201b0a5fd..5d39868e610 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -4464,15 +4464,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4482,8 +4482,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4494,8 +4494,8 @@ declare module "typescript" { >character : number }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -4839,8 +4839,8 @@ declare module "typescript" { getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromLineAndCharacter(line: number, character: number): number; ->getPositionFromLineAndCharacter : (line: number, character: number) => number + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 27a2ce5e415..0ab43d3f64f 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -1453,14 +1453,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1540,7 +1540,7 @@ declare module "typescript" { getNamedDeclarations(): Declaration[]; getLineAndCharacterFromPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromLineAndCharacter(line: number, character: number): number; + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 4e137cae59d..824ca033f2b 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -4637,15 +4637,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4655,8 +4655,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4667,8 +4667,8 @@ declare module "typescript" { >character : number }; - function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -5012,8 +5012,8 @@ declare module "typescript" { getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromLineAndCharacter(line: number, character: number): number; ->getPositionFromLineAndCharacter : (line: number, character: number) => number + getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; +>getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number >line : number >character : number From 11a9df2cc95c7859d5a08a14e9c39e6f5938d720 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 15:30:21 -0800 Subject: [PATCH 03/22] Expose zero-based helpers that code will be able to call. --- src/compiler/scanner.ts | 13 ++++++++ src/harness/harness.ts | 2 +- src/harness/typeWriter.ts | 2 +- src/services/breakpoints.ts | 8 ++--- src/services/formatting/formatting.ts | 32 ++++++++++---------- src/services/formatting/formattingContext.ts | 12 ++++---- src/services/formatting/smartIndenter.ts | 12 ++++---- src/services/services.ts | 6 ++-- src/services/utilities.ts | 4 +-- 9 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index bf5c4116074..a7ff60ebd34 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -278,6 +278,10 @@ module ts { return result; } + export function getPositionFromZeroBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { + return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line + 1, character + 1); + } + export function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line, character); } @@ -291,6 +295,11 @@ module ts { return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text)); } + export function computeZeroBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) { + var oneBased = computeOneBasedLineAndCharacterOfPosition(lineStarts, position); + return { line: oneBased.line - 1, character: oneBased.character -1 }; + } + export function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) { var lineNumber = binarySearch(lineStarts, position); if (lineNumber < 0) { @@ -306,6 +315,10 @@ module ts { }; } + export function getZeroBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { + return computeZeroBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position); + } + export function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { return computeOneBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position); } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 86a68af1145..9e4d49c267d 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1184,7 +1184,7 @@ module Harness { } export function getMinimalDiagnostic(err: ts.Diagnostic): HarnessDiagnostic { - var errorLineInfo = err.file ? err.file.getLineAndCharacterFromPosition(err.start) : { line: 0, character: 0 }; + var errorLineInfo = err.file ? err.file.getOneBasedLineAndCharacterFromPosition(err.start) : { line: 0, character: 0 }; return { fileName: err.file && err.file.fileName, start: err.start, diff --git a/src/harness/typeWriter.ts b/src/harness/typeWriter.ts index 1d8b3efef68..8747265d218 100644 --- a/src/harness/typeWriter.ts +++ b/src/harness/typeWriter.ts @@ -85,7 +85,7 @@ class TypeWriterWalker { private log(node: ts.Node, type: ts.Type): void { var actualPos = ts.skipTrivia(this.currentSourceFile.text, node.pos); - var lineAndCharacter = this.currentSourceFile.getLineAndCharacterFromPosition(actualPos); + var lineAndCharacter = this.currentSourceFile.getOneBasedLineAndCharacterFromPosition(actualPos); var sourceText = ts.getTextOfNodeFromSourceText(this.currentSourceFile.text, node); // If we got an unknown type, we temporarily want to fall back to just pretending the name diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index e49d035559b..68932e32fad 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -14,8 +14,8 @@ module ts.BreakpointResolver { } var tokenAtLocation = getTokenAtPosition(sourceFile, position); - var lineOfPosition = sourceFile.getLineAndCharacterFromPosition(position).line; - if (sourceFile.getLineAndCharacterFromPosition(tokenAtLocation.getStart()).line > lineOfPosition) { + var lineOfPosition = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; + if (sourceFile.getOneBasedLineAndCharacterFromPosition(tokenAtLocation.getStart()).line > lineOfPosition) { // Get previous token if the token is returned starts on new line // eg: var x =10; |--- curser is here // var y = 10; @@ -24,7 +24,7 @@ module ts.BreakpointResolver { tokenAtLocation = findPrecedingToken(tokenAtLocation.pos, sourceFile); // Its a blank line - if (!tokenAtLocation || sourceFile.getLineAndCharacterFromPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) { + if (!tokenAtLocation || sourceFile.getOneBasedLineAndCharacterFromPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) { return undefined; } } @@ -42,7 +42,7 @@ module ts.BreakpointResolver { } function spanInNodeIfStartsOnSameLine(node: Node, otherwiseOnNode?: Node): TextSpan { - if (node && lineOfPosition === sourceFile.getLineAndCharacterFromPosition(node.getStart()).line) { + if (node && lineOfPosition === sourceFile.getOneBasedLineAndCharacterFromPosition(node.getStart()).line) { return spanInNode(node); } return spanInNode(otherwiseOnNode); diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 969f7260744..1d3410c189c 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -67,7 +67,7 @@ module ts.formatting { } export function formatOnEnter(position: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] { - var line = sourceFile.getLineAndCharacterFromPosition(position).line; + var line = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; if (line === 1) { return []; } @@ -100,7 +100,7 @@ module ts.formatting { export function formatSelection(start: number, end: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] { // format from the beginning of the line var span = { - pos: getStartLinePositionForPosition(start, sourceFile), + pos: getLineStartPositionForPosition(start, sourceFile), end: end }; return formatSpan(span, sourceFile, options, rulesProvider, FormattingRequestKind.FormatSelection); @@ -112,7 +112,7 @@ module ts.formatting { return []; } var span = { - pos: getStartLinePositionForPosition(parent.getStart(sourceFile), sourceFile), + pos: getLineStartPositionForPosition(parent.getStart(sourceFile), sourceFile), end: parent.end }; return formatSpan(span, sourceFile, options, rulesProvider, requestKind); @@ -283,7 +283,7 @@ module ts.formatting { var previousLine = Constants.Unknown; var childKind = SyntaxKind.Unknown; while (n) { - var line = sourceFile.getLineAndCharacterFromPosition(n.getStart(sourceFile)).line; + var line = sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)).line; if (previousLine !== Constants.Unknown && line !== previousLine) { break; } @@ -327,7 +327,7 @@ module ts.formatting { formattingScanner.advance(); if (formattingScanner.isOnToken()) { - var startLine = sourceFile.getLineAndCharacterFromPosition(enclosingNode.getStart(sourceFile)).line; + var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(enclosingNode.getStart(sourceFile)).line; var delta = getOwnOrInheritedDelta(enclosingNode, options, sourceFile); processNode(enclosingNode, enclosingNode, startLine, initialIndentation, delta); } @@ -357,8 +357,8 @@ module ts.formatting { } } else { - var startLine = sourceFile.getLineAndCharacterFromPosition(startPos).line; - var startLinePosition = getStartLinePositionForPosition(startPos, sourceFile); + var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(startPos).line; + var startLinePosition = getLineStartPositionForPosition(startPos, sourceFile); var column = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options); if (startLine !== parentStartLine || startPos === column) { return column @@ -521,7 +521,7 @@ module ts.formatting { var childStartPos = child.getStart(sourceFile); - var childStart = sourceFile.getLineAndCharacterFromPosition(childStartPos); + var childStart = sourceFile.getOneBasedLineAndCharacterFromPosition(childStartPos); // if child is a list item - try to get its indentation var childIndentationAmount = Constants.Unknown; @@ -594,7 +594,7 @@ module ts.formatting { } else if (tokenInfo.token.kind === listStartToken) { // consume list start token - startLine = sourceFile.getLineAndCharacterFromPosition(tokenInfo.token.pos).line; + startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(tokenInfo.token.pos).line; var indentation = computeIndentation(tokenInfo.token, startLine, Constants.Unknown, parent, parentDynamicIndentation, startLine); @@ -641,7 +641,7 @@ module ts.formatting { var lineAdded: boolean; var isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token); - var tokenStart = sourceFile.getLineAndCharacterFromPosition(currentTokenInfo.token.pos); + var tokenStart = sourceFile.getOneBasedLineAndCharacterFromPosition(currentTokenInfo.token.pos); if (isTokenInRange) { var rangeHasError = rangeContainsError(currentTokenInfo.token); // save prevStartLine since processRange will overwrite this value with current ones @@ -674,7 +674,7 @@ module ts.formatting { continue; } - var triviaStartLine = sourceFile.getLineAndCharacterFromPosition(triviaItem.pos).line; + var triviaStartLine = sourceFile.getOneBasedLineAndCharacterFromPosition(triviaItem.pos).line; switch (triviaItem.kind) { case SyntaxKind.MultiLineCommentTrivia: var commentIndentation = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind); @@ -712,7 +712,7 @@ module ts.formatting { for (var i = 0, len = trivia.length; i < len; ++i) { var triviaItem = trivia[i]; if (isComment(triviaItem.kind) && rangeContainsRange(originalRange, triviaItem)) { - var triviaItemStart = sourceFile.getLineAndCharacterFromPosition(triviaItem.pos); + var triviaItemStart = sourceFile.getOneBasedLineAndCharacterFromPosition(triviaItem.pos); processRange(triviaItem, triviaItemStart, parent, contextNode, dynamicIndentation); } } @@ -729,7 +729,7 @@ module ts.formatting { if (!rangeHasError && !previousRangeHasError) { if (!previousRange) { // trim whitespaces starting from the beginning of the span up to the current line - var originalStart = sourceFile.getLineAndCharacterFromPosition(originalRange.pos); + var originalStart = sourceFile.getOneBasedLineAndCharacterFromPosition(originalRange.pos); trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line); } else { @@ -807,7 +807,7 @@ module ts.formatting { recordReplace(pos, 0, indentationString); } else { - var tokenStart = sourceFile.getLineAndCharacterFromPosition(pos); + var tokenStart = sourceFile.getOneBasedLineAndCharacterFromPosition(pos); if (indentation !== tokenStart.character - 1) { var startLinePosition = getStartPositionOfLine(tokenStart.line, sourceFile); recordReplace(startLinePosition, tokenStart.character - 1, indentationString); @@ -817,8 +817,8 @@ module ts.formatting { function indentMultilineComment(commentRange: TextRange, indentation: number, firstLineIsIndented: boolean) { // split comment in lines - var startLine = sourceFile.getLineAndCharacterFromPosition(commentRange.pos).line; - var endLine = sourceFile.getLineAndCharacterFromPosition(commentRange.end).line; + var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(commentRange.pos).line; + var endLine = sourceFile.getOneBasedLineAndCharacterFromPosition(commentRange.end).line; if (startLine === endLine) { if (!firstLineIsIndented) { diff --git a/src/services/formatting/formattingContext.ts b/src/services/formatting/formattingContext.ts index 2bfb155921e..c6680b4a80e 100644 --- a/src/services/formatting/formattingContext.ts +++ b/src/services/formatting/formattingContext.ts @@ -71,8 +71,8 @@ module ts.formatting { public TokensAreOnSameLine(): boolean { if (this.tokensAreOnSameLine === undefined) { - var startLine = this.sourceFile.getLineAndCharacterFromPosition(this.currentTokenSpan.pos).line; - var endLine = this.sourceFile.getLineAndCharacterFromPosition(this.nextTokenSpan.pos).line; + var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(this.currentTokenSpan.pos).line; + var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(this.nextTokenSpan.pos).line; this.tokensAreOnSameLine = (startLine == endLine); } @@ -96,8 +96,8 @@ module ts.formatting { } private NodeIsOnOneLine(node: Node): boolean { - var startLine = this.sourceFile.getLineAndCharacterFromPosition(node.getStart(this.sourceFile)).line; - var endLine = this.sourceFile.getLineAndCharacterFromPosition(node.getEnd()).line; + var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(node.getStart(this.sourceFile)).line; + var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(node.getEnd()).line; return startLine == endLine; } @@ -105,8 +105,8 @@ module ts.formatting { var openBrace = findChildOfKind(node, SyntaxKind.OpenBraceToken, this.sourceFile); var closeBrace = findChildOfKind(node, SyntaxKind.CloseBraceToken, this.sourceFile); if (openBrace && closeBrace) { - var startLine = this.sourceFile.getLineAndCharacterFromPosition(openBrace.getEnd()).line; - var endLine = this.sourceFile.getLineAndCharacterFromPosition(closeBrace.getStart(this.sourceFile)).line; + var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(openBrace.getEnd()).line; + var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(closeBrace.getStart(this.sourceFile)).line; return startLine === endLine; } return false; diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index efc279cfca6..629c82ef0a8 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -24,7 +24,7 @@ module ts.formatting { return 0; } - var lineAtPosition = sourceFile.getLineAndCharacterFromPosition(position).line; + var lineAtPosition = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; if (precedingToken.kind === SyntaxKind.CommaToken && precedingToken.parent.kind !== SyntaxKind.BinaryExpression) { // previous token is comma that separates items in list - find the previous item and try to derive indentation from it @@ -74,7 +74,7 @@ module ts.formatting { } export function getIndentationForNode(n: Node, ignoreActualIndentationRange: TextRange, sourceFile: SourceFile, options: FormatCodeOptions): number { - var start = sourceFile.getLineAndCharacterFromPosition(n.getStart(sourceFile)); + var start = sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)); return getIndentationForNodeWorker(n, start, ignoreActualIndentationRange, /*indentationDelta*/ 0, sourceFile, options); } @@ -135,10 +135,10 @@ module ts.formatting { function getParentStart(parent: Node, child: Node, sourceFile: SourceFile): LineAndCharacter { var containingList = getContainingList(child, sourceFile); if (containingList) { - return sourceFile.getLineAndCharacterFromPosition(containingList.pos); + return sourceFile.getOneBasedLineAndCharacterFromPosition(containingList.pos); } - return sourceFile.getLineAndCharacterFromPosition(parent.getStart(sourceFile)); + return sourceFile.getOneBasedLineAndCharacterFromPosition(parent.getStart(sourceFile)); } /* @@ -204,7 +204,7 @@ module ts.formatting { } function getStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { - return sourceFile.getLineAndCharacterFromPosition(n.getStart(sourceFile)); + return sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)); } function positionBelongsToNode(candidate: Node, position: number, sourceFile: SourceFile): boolean { @@ -292,7 +292,7 @@ module ts.formatting { continue; } // skip list items that ends on the same line with the current list element - var prevEndLine = sourceFile.getLineAndCharacterFromPosition(list[i].end).line; + var prevEndLine = sourceFile.getOneBasedLineAndCharacterFromPosition(list[i].end).line; if (prevEndLine !== lineAndCharacter.line) { return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options); } diff --git a/src/services/services.ts b/src/services/services.ts index 07a0bac2dc6..04e846e88e9 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -61,7 +61,7 @@ module ts { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; + getOneBasedLineAndCharacterFromPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; @@ -612,7 +612,7 @@ module ts { } if (paramHelpStringMargin === undefined) { - paramHelpStringMargin = sourceFile.getLineAndCharacterFromPosition(firstLineParamHelpStringPos).character - 1; + paramHelpStringMargin = sourceFile.getOneBasedLineAndCharacterFromPosition(firstLineParamHelpStringPos).character - 1; } // Now consume white spaces max @@ -750,7 +750,7 @@ module ts { return updateSourceFile(this, newText, textChangeRange); } - public getLineAndCharacterFromPosition(position: number): LineAndCharacter { + public getOneBasedLineAndCharacterFromPosition(position: number): LineAndCharacter { return getOneBasedLineAndCharacterOfPosition(this, position); } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 10d00398160..1576003747b 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -37,9 +37,9 @@ module ts { return sourceFile.getLineStarts()[line - 1]; } - export function getStartLinePositionForPosition(position: number, sourceFile: SourceFile): number { + export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number { var lineStarts = sourceFile.getLineStarts(); - var line = sourceFile.getLineAndCharacterFromPosition(position).line; + var line = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; return lineStarts[line - 1]; } From afb083ae5a5eeef6ee9b1a9696dca3adb34347e0 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 15:39:49 -0800 Subject: [PATCH 04/22] Make method more clearly indicate that it is one based. --- src/compiler/emitter.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 86a8ca584a2..64328517299 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -133,14 +133,14 @@ module ts { }; } - function getLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { + function getOneBasedLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { return getOneBasedLineAndCharacterOfPosition(currentSourceFile, pos).line; } function emitNewLineBeforeLeadingComments(currentSourceFile: SourceFile, writer: EmitTextWriter, node: TextRange, leadingComments: CommentRange[]) { // If the leading comments start on different line than the start of node, write new line if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos && - getLineOfLocalPosition(currentSourceFile, node.pos) !== getLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { + getOneBasedLineOfLocalPosition(currentSourceFile, node.pos) !== getOneBasedLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { writer.writeLine(); } } @@ -2973,13 +2973,13 @@ module ts { } function isOnSameLine(node1: Node, node2: Node) { - return getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === - getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === + getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function nodeEndIsOnSameLineAsNodeStart(node1: Node, node2: Node) { - return getLineOfLocalPosition(currentSourceFile, node1.end) === - getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getOneBasedLineOfLocalPosition(currentSourceFile, node1.end) === + getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function emitCaseOrDefaultClause(node: CaseOrDefaultClause) { @@ -4470,8 +4470,8 @@ module ts { forEach(leadingComments, comment => { if (lastComment) { - var lastCommentLine = getLineOfLocalPosition(currentSourceFile, lastComment.end); - var commentLine = getLineOfLocalPosition(currentSourceFile, comment.pos); + var lastCommentLine = getOneBasedLineOfLocalPosition(currentSourceFile, lastComment.end); + var commentLine = getOneBasedLineOfLocalPosition(currentSourceFile, comment.pos); if (commentLine >= lastCommentLine + 2) { // There was a blank line between the last comment and this comment. This @@ -4489,8 +4489,8 @@ module ts { // All comments look like they could have been part of the copyright header. Make // sure there is at least one blank line between it and the node. If not, it's not // a copyright header. - var lastCommentLine = getLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); - var astLine = getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); + var lastCommentLine = getOneBasedLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); + var astLine = getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); if (astLine >= lastCommentLine + 2) { // Valid detachedComments emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments); From b3366ec8b4526bdca1f3b5240e77ba74923a8fb6 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 16:18:53 -0800 Subject: [PATCH 05/22] name more line/char functions more clearly. Use zero based indexing in breakpoints. --- src/compiler/emitter.ts | 4 +-- src/compiler/scanner.ts | 10 ++++---- src/harness/harness.ts | 2 +- src/harness/harnessLanguageService.ts | 2 +- src/harness/typeWriter.ts | 2 +- src/services/breakpoints.ts | 10 ++++---- src/services/formatting/formatting.ts | 26 ++++++++++---------- src/services/formatting/formattingContext.ts | 12 ++++----- src/services/formatting/smartIndenter.ts | 14 +++++------ src/services/services.ts | 19 ++++++++------ src/services/utilities.ts | 2 +- 11 files changed, 54 insertions(+), 49 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 64328517299..165466480a2 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -173,12 +173,12 @@ module ts { var lastLine = getLineStarts(currentSourceFile).length; var firstCommentLineIndent: number; for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) { - var nextLineStart = currentLine === lastLine ? (comment.end + 1) : getPositionFromOneBasedLineAndCharacter(currentSourceFile, currentLine + 1, /*character*/1); + var nextLineStart = currentLine === lastLine ? (comment.end + 1) : getPositionOfOneBasedLineAndCharacter(currentSourceFile, currentLine + 1, /*character*/1); if (pos !== comment.pos) { // If we are not emitting first line, we need to write the spaces to adjust the alignment if (firstCommentLineIndent === undefined) { - firstCommentLineIndent = calculateIndent(getPositionFromOneBasedLineAndCharacter(currentSourceFile, firstCommentLineAndCharacter.line, /*character*/1), + firstCommentLineIndent = calculateIndent(getPositionOfOneBasedLineAndCharacter(currentSourceFile, firstCommentLineAndCharacter.line, /*character*/1), comment.pos); } diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index a7ff60ebd34..25e1ef63f6f 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -278,15 +278,15 @@ module ts { return result; } - export function getPositionFromZeroBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { - return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line + 1, character + 1); + export function getPositionOfZeroBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { + return computePositionOfOneBasedLineAndCharacter(getLineStarts(sourceFile), line + 1, character + 1); } - export function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { - return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line, character); + export function getPositionOfOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { + return computePositionOfOneBasedLineAndCharacter(getLineStarts(sourceFile), line, character); } - export function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number { + export function computePositionOfOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number { Debug.assert(line > 0 && line <= lineStarts.length); return lineStarts[line - 1] + character - 1; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 9e4d49c267d..4a87f953ee1 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1184,7 +1184,7 @@ module Harness { } export function getMinimalDiagnostic(err: ts.Diagnostic): HarnessDiagnostic { - var errorLineInfo = err.file ? err.file.getOneBasedLineAndCharacterFromPosition(err.start) : { line: 0, character: 0 }; + var errorLineInfo = err.file ? err.file.getOneBasedLineAndCharacterOfPosition(err.start) : { line: 0, character: 0 }; return { fileName: err.file && err.file.fileName, start: err.start, diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index f0d788a1c6b..07f9916d703 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -175,7 +175,7 @@ module Harness.LanguageService { assert.isTrue(line >= 1); assert.isTrue(col >= 1); - return ts.computePositionFromOneBasedLineAndCharacter(script.lineMap, line, col); + return ts.computePositionOfOneBasedLineAndCharacter(script.lineMap, line, col); } /** diff --git a/src/harness/typeWriter.ts b/src/harness/typeWriter.ts index 8747265d218..44532c6a59e 100644 --- a/src/harness/typeWriter.ts +++ b/src/harness/typeWriter.ts @@ -85,7 +85,7 @@ class TypeWriterWalker { private log(node: ts.Node, type: ts.Type): void { var actualPos = ts.skipTrivia(this.currentSourceFile.text, node.pos); - var lineAndCharacter = this.currentSourceFile.getOneBasedLineAndCharacterFromPosition(actualPos); + var lineAndCharacter = this.currentSourceFile.getOneBasedLineAndCharacterOfPosition(actualPos); var sourceText = ts.getTextOfNodeFromSourceText(this.currentSourceFile.text, node); // If we got an unknown type, we temporarily want to fall back to just pretending the name diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index 68932e32fad..492cc7866e9 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -14,17 +14,17 @@ module ts.BreakpointResolver { } var tokenAtLocation = getTokenAtPosition(sourceFile, position); - var lineOfPosition = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; - if (sourceFile.getOneBasedLineAndCharacterFromPosition(tokenAtLocation.getStart()).line > lineOfPosition) { + var lineOfPosition = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; + if (sourceFile.getZeroBasedLineAndCharacterOfPosition(tokenAtLocation.getStart()).line > lineOfPosition) { // Get previous token if the token is returned starts on new line - // eg: var x =10; |--- curser is here + // eg: var x =10; |--- cursor is here // var y = 10; // token at position will return var keyword on second line as the token but we would like to use // token on same line if trailing trivia (comments or white spaces on same line) part of the last token on that line tokenAtLocation = findPrecedingToken(tokenAtLocation.pos, sourceFile); // Its a blank line - if (!tokenAtLocation || sourceFile.getOneBasedLineAndCharacterFromPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) { + if (!tokenAtLocation || sourceFile.getZeroBasedLineAndCharacterOfPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) { return undefined; } } @@ -42,7 +42,7 @@ module ts.BreakpointResolver { } function spanInNodeIfStartsOnSameLine(node: Node, otherwiseOnNode?: Node): TextSpan { - if (node && lineOfPosition === sourceFile.getOneBasedLineAndCharacterFromPosition(node.getStart()).line) { + if (node && lineOfPosition === sourceFile.getZeroBasedLineAndCharacterOfPosition(node.getStart()).line) { return spanInNode(node); } return spanInNode(otherwiseOnNode); diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 1d3410c189c..322c36bf7ad 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -67,7 +67,7 @@ module ts.formatting { } export function formatOnEnter(position: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] { - var line = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; + var line = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; if (line === 1) { return []; } @@ -283,7 +283,7 @@ module ts.formatting { var previousLine = Constants.Unknown; var childKind = SyntaxKind.Unknown; while (n) { - var line = sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)).line; + var line = sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)).line; if (previousLine !== Constants.Unknown && line !== previousLine) { break; } @@ -327,7 +327,7 @@ module ts.formatting { formattingScanner.advance(); if (formattingScanner.isOnToken()) { - var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(enclosingNode.getStart(sourceFile)).line; + var startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line; var delta = getOwnOrInheritedDelta(enclosingNode, options, sourceFile); processNode(enclosingNode, enclosingNode, startLine, initialIndentation, delta); } @@ -357,7 +357,7 @@ module ts.formatting { } } else { - var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(startPos).line; + var startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(startPos).line; var startLinePosition = getLineStartPositionForPosition(startPos, sourceFile); var column = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options); if (startLine !== parentStartLine || startPos === column) { @@ -521,7 +521,7 @@ module ts.formatting { var childStartPos = child.getStart(sourceFile); - var childStart = sourceFile.getOneBasedLineAndCharacterFromPosition(childStartPos); + var childStart = sourceFile.getOneBasedLineAndCharacterOfPosition(childStartPos); // if child is a list item - try to get its indentation var childIndentationAmount = Constants.Unknown; @@ -594,7 +594,7 @@ module ts.formatting { } else if (tokenInfo.token.kind === listStartToken) { // consume list start token - startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(tokenInfo.token.pos).line; + startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(tokenInfo.token.pos).line; var indentation = computeIndentation(tokenInfo.token, startLine, Constants.Unknown, parent, parentDynamicIndentation, startLine); @@ -641,7 +641,7 @@ module ts.formatting { var lineAdded: boolean; var isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token); - var tokenStart = sourceFile.getOneBasedLineAndCharacterFromPosition(currentTokenInfo.token.pos); + var tokenStart = sourceFile.getOneBasedLineAndCharacterOfPosition(currentTokenInfo.token.pos); if (isTokenInRange) { var rangeHasError = rangeContainsError(currentTokenInfo.token); // save prevStartLine since processRange will overwrite this value with current ones @@ -674,7 +674,7 @@ module ts.formatting { continue; } - var triviaStartLine = sourceFile.getOneBasedLineAndCharacterFromPosition(triviaItem.pos).line; + var triviaStartLine = sourceFile.getOneBasedLineAndCharacterOfPosition(triviaItem.pos).line; switch (triviaItem.kind) { case SyntaxKind.MultiLineCommentTrivia: var commentIndentation = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind); @@ -712,7 +712,7 @@ module ts.formatting { for (var i = 0, len = trivia.length; i < len; ++i) { var triviaItem = trivia[i]; if (isComment(triviaItem.kind) && rangeContainsRange(originalRange, triviaItem)) { - var triviaItemStart = sourceFile.getOneBasedLineAndCharacterFromPosition(triviaItem.pos); + var triviaItemStart = sourceFile.getOneBasedLineAndCharacterOfPosition(triviaItem.pos); processRange(triviaItem, triviaItemStart, parent, contextNode, dynamicIndentation); } } @@ -729,7 +729,7 @@ module ts.formatting { if (!rangeHasError && !previousRangeHasError) { if (!previousRange) { // trim whitespaces starting from the beginning of the span up to the current line - var originalStart = sourceFile.getOneBasedLineAndCharacterFromPosition(originalRange.pos); + var originalStart = sourceFile.getOneBasedLineAndCharacterOfPosition(originalRange.pos); trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line); } else { @@ -807,7 +807,7 @@ module ts.formatting { recordReplace(pos, 0, indentationString); } else { - var tokenStart = sourceFile.getOneBasedLineAndCharacterFromPosition(pos); + var tokenStart = sourceFile.getOneBasedLineAndCharacterOfPosition(pos); if (indentation !== tokenStart.character - 1) { var startLinePosition = getStartPositionOfLine(tokenStart.line, sourceFile); recordReplace(startLinePosition, tokenStart.character - 1, indentationString); @@ -817,8 +817,8 @@ module ts.formatting { function indentMultilineComment(commentRange: TextRange, indentation: number, firstLineIsIndented: boolean) { // split comment in lines - var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(commentRange.pos).line; - var endLine = sourceFile.getOneBasedLineAndCharacterFromPosition(commentRange.end).line; + var startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(commentRange.pos).line; + var endLine = sourceFile.getOneBasedLineAndCharacterOfPosition(commentRange.end).line; if (startLine === endLine) { if (!firstLineIsIndented) { diff --git a/src/services/formatting/formattingContext.ts b/src/services/formatting/formattingContext.ts index c6680b4a80e..0b9372d86e2 100644 --- a/src/services/formatting/formattingContext.ts +++ b/src/services/formatting/formattingContext.ts @@ -71,8 +71,8 @@ module ts.formatting { public TokensAreOnSameLine(): boolean { if (this.tokensAreOnSameLine === undefined) { - var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(this.currentTokenSpan.pos).line; - var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(this.nextTokenSpan.pos).line; + var startLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(this.currentTokenSpan.pos).line; + var endLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(this.nextTokenSpan.pos).line; this.tokensAreOnSameLine = (startLine == endLine); } @@ -96,8 +96,8 @@ module ts.formatting { } private NodeIsOnOneLine(node: Node): boolean { - var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(node.getStart(this.sourceFile)).line; - var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(node.getEnd()).line; + var startLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line; + var endLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(node.getEnd()).line; return startLine == endLine; } @@ -105,8 +105,8 @@ module ts.formatting { var openBrace = findChildOfKind(node, SyntaxKind.OpenBraceToken, this.sourceFile); var closeBrace = findChildOfKind(node, SyntaxKind.CloseBraceToken, this.sourceFile); if (openBrace && closeBrace) { - var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(openBrace.getEnd()).line; - var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(closeBrace.getStart(this.sourceFile)).line; + var startLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(openBrace.getEnd()).line; + var endLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line; return startLine === endLine; } return false; diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 629c82ef0a8..35be18910e3 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -24,7 +24,7 @@ module ts.formatting { return 0; } - var lineAtPosition = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; + var lineAtPosition = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; if (precedingToken.kind === SyntaxKind.CommaToken && precedingToken.parent.kind !== SyntaxKind.BinaryExpression) { // previous token is comma that separates items in list - find the previous item and try to derive indentation from it @@ -74,7 +74,7 @@ module ts.formatting { } export function getIndentationForNode(n: Node, ignoreActualIndentationRange: TextRange, sourceFile: SourceFile, options: FormatCodeOptions): number { - var start = sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)); + var start = sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); return getIndentationForNodeWorker(n, start, ignoreActualIndentationRange, /*indentationDelta*/ 0, sourceFile, options); } @@ -135,10 +135,10 @@ module ts.formatting { function getParentStart(parent: Node, child: Node, sourceFile: SourceFile): LineAndCharacter { var containingList = getContainingList(child, sourceFile); if (containingList) { - return sourceFile.getOneBasedLineAndCharacterFromPosition(containingList.pos); + return sourceFile.getOneBasedLineAndCharacterOfPosition(containingList.pos); } - return sourceFile.getOneBasedLineAndCharacterFromPosition(parent.getStart(sourceFile)); + return sourceFile.getOneBasedLineAndCharacterOfPosition(parent.getStart(sourceFile)); } /* @@ -204,7 +204,7 @@ module ts.formatting { } function getStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { - return sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)); + return sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); } function positionBelongsToNode(candidate: Node, position: number, sourceFile: SourceFile): boolean { @@ -292,7 +292,7 @@ module ts.formatting { continue; } // skip list items that ends on the same line with the current list element - var prevEndLine = sourceFile.getOneBasedLineAndCharacterFromPosition(list[i].end).line; + var prevEndLine = sourceFile.getOneBasedLineAndCharacterOfPosition(list[i].end).line; if (prevEndLine !== lineAndCharacter.line) { return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options); } @@ -303,7 +303,7 @@ module ts.formatting { } function findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter: LineAndCharacter, sourceFile: SourceFile, options: EditorOptions): number { - var lineStart = sourceFile.getPositionFromOneBasedLineAndCharacter(lineAndCharacter.line, 1); + var lineStart = sourceFile.getPositionOfOneBasedLineAndCharacter(lineAndCharacter.line, 1); return findFirstNonWhitespaceColumn(lineStart, lineStart + lineAndCharacter.character, sourceFile, options); } diff --git a/src/services/services.ts b/src/services/services.ts index 04e846e88e9..33fde9e005e 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -61,9 +61,10 @@ module ts { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getOneBasedLineAndCharacterFromPosition(pos: number): LineAndCharacter; + getZeroBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; + getOneBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; + getPositionOfOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } @@ -612,7 +613,7 @@ module ts { } if (paramHelpStringMargin === undefined) { - paramHelpStringMargin = sourceFile.getOneBasedLineAndCharacterFromPosition(firstLineParamHelpStringPos).character - 1; + paramHelpStringMargin = sourceFile.getOneBasedLineAndCharacterOfPosition(firstLineParamHelpStringPos).character - 1; } // Now consume white spaces max @@ -750,16 +751,20 @@ module ts { return updateSourceFile(this, newText, textChangeRange); } - public getOneBasedLineAndCharacterFromPosition(position: number): LineAndCharacter { - return getOneBasedLineAndCharacterOfPosition(this, position); + public getZeroBasedLineAndCharacterOfPosition(position: number): LineAndCharacter { + return ts.getZeroBasedLineAndCharacterOfPosition(this, position); + } + + public getOneBasedLineAndCharacterOfPosition(position: number): LineAndCharacter { + return ts.getOneBasedLineAndCharacterOfPosition(this, position); } public getLineStarts(): number[] { return getLineStarts(this); } - public getPositionFromOneBasedLineAndCharacter(line: number, character: number): number { - return getPositionFromOneBasedLineAndCharacter(this, line, character); + public getPositionOfOneBasedLineAndCharacter(line: number, character: number): number { + return ts.getPositionOfOneBasedLineAndCharacter(this, line, character); } public getNamedDeclarations() { diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 1576003747b..711fc0fde8d 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -39,7 +39,7 @@ module ts { export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number { var lineStarts = sourceFile.getLineStarts(); - var line = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line; + var line = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; return lineStarts[line - 1]; } From ab7d36d526aab732b747e931d4adc812e43b2511 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 16:28:26 -0800 Subject: [PATCH 06/22] Move the emitter over to use zero based indexing. --- src/compiler/emitter.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 165466480a2..c12d4dedaef 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -133,14 +133,14 @@ module ts { }; } - function getOneBasedLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { - return getOneBasedLineAndCharacterOfPosition(currentSourceFile, pos).line; + function getZeroBasedLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { + return getZeroBasedLineAndCharacterOfPosition(currentSourceFile, pos).line; } function emitNewLineBeforeLeadingComments(currentSourceFile: SourceFile, writer: EmitTextWriter, node: TextRange, leadingComments: CommentRange[]) { // If the leading comments start on different line than the start of node, write new line if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos && - getOneBasedLineOfLocalPosition(currentSourceFile, node.pos) !== getOneBasedLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { + getZeroBasedLineOfLocalPosition(currentSourceFile, node.pos) !== getZeroBasedLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { writer.writeLine(); } } @@ -2973,13 +2973,13 @@ module ts { } function isOnSameLine(node1: Node, node2: Node) { - return getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === - getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === + getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function nodeEndIsOnSameLineAsNodeStart(node1: Node, node2: Node) { - return getOneBasedLineOfLocalPosition(currentSourceFile, node1.end) === - getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getZeroBasedLineOfLocalPosition(currentSourceFile, node1.end) === + getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function emitCaseOrDefaultClause(node: CaseOrDefaultClause) { @@ -4470,8 +4470,8 @@ module ts { forEach(leadingComments, comment => { if (lastComment) { - var lastCommentLine = getOneBasedLineOfLocalPosition(currentSourceFile, lastComment.end); - var commentLine = getOneBasedLineOfLocalPosition(currentSourceFile, comment.pos); + var lastCommentLine = getZeroBasedLineOfLocalPosition(currentSourceFile, lastComment.end); + var commentLine = getZeroBasedLineOfLocalPosition(currentSourceFile, comment.pos); if (commentLine >= lastCommentLine + 2) { // There was a blank line between the last comment and this comment. This @@ -4489,9 +4489,9 @@ module ts { // All comments look like they could have been part of the copyright header. Make // sure there is at least one blank line between it and the node. If not, it's not // a copyright header. - var lastCommentLine = getOneBasedLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); - var astLine = getOneBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); - if (astLine >= lastCommentLine + 2) { + var lastCommentLine = getZeroBasedLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); + var nodeLine = getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); + if (nodeLine >= lastCommentLine + 2) { // Valid detachedComments emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments); emitComments(currentSourceFile, writer, detachedComments, /*trailingSeparator*/ true, newLine, writeComment); From 8ef4df8acbb0d4ba85669bc19578793d1f6c0cdb Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 17:34:11 -0800 Subject: [PATCH 07/22] Move the emitter over to using zero based indexing. --- src/compiler/emitter.ts | 11 ++++++----- src/compiler/utilities.ts | 10 ++++++++++ src/services/formatting/formatting.ts | 12 ++++++------ src/services/utilities.ts | 5 ----- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index c12d4dedaef..8c4f435affe 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -169,17 +169,18 @@ module ts { function writeCommentRange(currentSourceFile: SourceFile, writer: EmitTextWriter, comment: CommentRange, newLine: string){ if (currentSourceFile.text.charCodeAt(comment.pos + 1) === CharacterCodes.asterisk) { - var firstCommentLineAndCharacter = getOneBasedLineAndCharacterOfPosition(currentSourceFile, comment.pos); - var lastLine = getLineStarts(currentSourceFile).length; + var firstCommentLineAndCharacter = getZeroBasedLineAndCharacterOfPosition(currentSourceFile, comment.pos); + var lineCount = getLineStarts(currentSourceFile).length; var firstCommentLineIndent: number; for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) { - var nextLineStart = currentLine === lastLine ? (comment.end + 1) : getPositionOfOneBasedLineAndCharacter(currentSourceFile, currentLine + 1, /*character*/1); + var nextLineStart = (currentLine + 1) === lineCount + ? currentSourceFile.text.length + 1 + : getStartPositionOfZeroBasedLine(currentLine + 1, currentSourceFile); if (pos !== comment.pos) { // If we are not emitting first line, we need to write the spaces to adjust the alignment if (firstCommentLineIndent === undefined) { - firstCommentLineIndent = calculateIndent(getPositionOfOneBasedLineAndCharacter(currentSourceFile, firstCommentLineAndCharacter.line, /*character*/1), - comment.pos); + firstCommentLineIndent = calculateIndent(getStartPositionOfZeroBasedLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos); } // These are number of spaces writer is going to write at current indent diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6323ffd4313..095044c4b8f 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -105,6 +105,16 @@ module ts { return node; } + export function getStartPositionOfZeroBasedLine(line: number, sourceFile: SourceFile): number { + Debug.assert(line >= 0); + return getLineStarts(sourceFile)[line]; + } + + export function getStartPositionOfOneBasedLine(line: number, sourceFile: SourceFile): number { + Debug.assert(line >= 1); + return getLineStarts(sourceFile)[line - 1]; + } + // This is a useful function for debugging purposes. export function nodePosToString(node: Node): string { var file = getSourceFileOfNode(node); diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 322c36bf7ad..b9cc0b24060 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -74,7 +74,7 @@ module ts.formatting { // get the span for the previous\current line var span = { // get start position for the previous line - pos: getStartPositionOfLine(line - 1, sourceFile), + pos: getStartPositionOfOneBasedLine(line - 1, sourceFile), // get end position for the current line (end value is exclusive so add 1 to the result) end: getEndLinePosition(line, sourceFile) + 1 } @@ -809,7 +809,7 @@ module ts.formatting { else { var tokenStart = sourceFile.getOneBasedLineAndCharacterOfPosition(pos); if (indentation !== tokenStart.character - 1) { - var startLinePosition = getStartPositionOfLine(tokenStart.line, sourceFile); + var startLinePosition = getStartPositionOfOneBasedLine(tokenStart.line, sourceFile); recordReplace(startLinePosition, tokenStart.character - 1, indentationString); } } @@ -833,13 +833,13 @@ module ts.formatting { for (var line = startLine; line < endLine; ++line) { var endOfLine = getEndLinePosition(line, sourceFile); parts.push({ pos: startPos, end: endOfLine }); - startPos = getStartPositionOfLine(line + 1, sourceFile); + startPos = getStartPositionOfOneBasedLine(line + 1, sourceFile); } parts.push({ pos: startPos, end: commentRange.end }); } - var startLinePos = getStartPositionOfLine(startLine, sourceFile); + var startLinePos = getStartPositionOfOneBasedLine(startLine, sourceFile); var nonWhitespaceColumnInFirstPart = SmartIndenter.findFirstNonWhitespaceColumn(startLinePos, parts[0].pos, sourceFile, options); @@ -857,7 +857,7 @@ module ts.formatting { // shift all parts on the delta size var delta = indentation - nonWhitespaceColumnInFirstPart; for (var i = startIndex, len = parts.length; i < len; ++i, ++startLine) { - var startLinePos = getStartPositionOfLine(startLine, sourceFile); + var startLinePos = getStartPositionOfOneBasedLine(startLine, sourceFile); var nonWhitespaceColumn = i === 0 ? nonWhitespaceColumnInFirstPart @@ -876,7 +876,7 @@ module ts.formatting { function trimTrailingWhitespacesForLines(line1: number, line2: number, range?: TextRangeWithKind) { for (var line = line1; line < line2; ++line) { - var lineStartPosition = getStartPositionOfLine(line, sourceFile); + var lineStartPosition = getStartPositionOfOneBasedLine(line, sourceFile); var lineEndPosition = getEndLinePosition(line, sourceFile); // do not trim whitespaces in comments diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 711fc0fde8d..41bd63560eb 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -32,11 +32,6 @@ module ts { } } - export function getStartPositionOfLine(line: number, sourceFile: SourceFile): number { - Debug.assert(line >= 1); - return sourceFile.getLineStarts()[line - 1]; - } - export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number { var lineStarts = sourceFile.getLineStarts(); var line = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; From 1098e80f4bba6a498cf342deb635492fe6188819 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 17:41:07 -0800 Subject: [PATCH 08/22] Remove one-based helper function. --- src/compiler/emitter.ts | 7 +++++++ src/compiler/scanner.ts | 4 ---- src/compiler/tsc.ts | 6 +++--- src/compiler/utilities.ts | 4 ++-- src/services/services.ts | 5 ++++- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 8c4f435affe..0f2042b0f68 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1733,6 +1733,13 @@ module ts { } } + function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, pos: number) { + var result = getZeroBasedLineAndCharacterOfPosition(sourceFile, pos); + result.line++; + result.character++; + return result; + } + function recordSourceMapSpan(pos: number) { var sourceLinePos = getOneBasedLineAndCharacterOfPosition(currentSourceFile, pos); var emittedLine = writer.getLine(); diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 25e1ef63f6f..c124c55c7da 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -319,10 +319,6 @@ module ts { return computeZeroBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position); } - export function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { - return computeOneBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position); - } - var hasOwnProperty = Object.prototype.hasOwnProperty; export function isWhiteSpace(ch: number): boolean { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 84d8a25e790..64272b196ff 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -72,7 +72,7 @@ module ts { function countLines(program: Program): number { var count = 0; forEach(program.getSourceFiles(), file => { - count += getOneBasedLineAndCharacterOfPosition(file, file.end).line; + count += getLineStarts(file).length; }); return count; } @@ -86,9 +86,9 @@ module ts { var output = ""; if (diagnostic.file) { - var loc = getOneBasedLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); + var loc = getZeroBasedLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); - output += diagnostic.file.fileName + "(" + loc.line + "," + loc.character + "): "; + output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): "; } var category = DiagnosticCategory[diagnostic.category].toLowerCase(); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 095044c4b8f..d543adaa103 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -118,8 +118,8 @@ module ts { // This is a useful function for debugging purposes. export function nodePosToString(node: Node): string { var file = getSourceFileOfNode(node); - var loc = getOneBasedLineAndCharacterOfPosition(file, node.pos); - return file.fileName + "(" + loc.line + "," + loc.character + ")"; + var loc = getZeroBasedLineAndCharacterOfPosition(file, node.pos); + return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")"; } export function getStartPosOfNode(node: Node): number { diff --git a/src/services/services.ts b/src/services/services.ts index 33fde9e005e..05015c60c02 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -756,7 +756,10 @@ module ts { } public getOneBasedLineAndCharacterOfPosition(position: number): LineAndCharacter { - return ts.getOneBasedLineAndCharacterOfPosition(this, position); + var result = ts.getZeroBasedLineAndCharacterOfPosition(this, position); + result.line++; + result.character++; + return result; } public getLineStarts(): number[] { From edbedc7d5d7ca04021fc7f4722e09538497ad9fe Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 17:47:32 -0800 Subject: [PATCH 09/22] Make code more clearly state that it is one based. --- src/compiler/emitter.ts | 14 ++++++-------- src/services/formatting/smartIndenter.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 0f2042b0f68..2e78b9a2a46 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1733,15 +1733,13 @@ module ts { } } - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, pos: number) { - var result = getZeroBasedLineAndCharacterOfPosition(sourceFile, pos); - result.line++; - result.character++; - return result; - } - function recordSourceMapSpan(pos: number) { - var sourceLinePos = getOneBasedLineAndCharacterOfPosition(currentSourceFile, pos); + var sourceLinePos = getZeroBasedLineAndCharacterOfPosition(currentSourceFile, pos); + + // Convert the location to be one-based. + sourceLinePos.line++; + sourceLinePos.character++; + var emittedLine = writer.getLine(); var emittedColumn = writer.getColumn(); diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 35be18910e3..9d81ba50348 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -43,7 +43,7 @@ module ts.formatting { while (current) { if (positionBelongsToNode(current, position, sourceFile) && shouldIndentChildNode(current.kind, previous ? previous.kind : SyntaxKind.Unknown)) { - currentStart = getStartLineAndCharacterForNode(current, sourceFile); + currentStart = getOneBasedStartLineAndCharacterForNode(current, sourceFile); if (nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile)) { indentationDelta = 0; @@ -196,14 +196,14 @@ module ts.formatting { // class A { // $} - var nextTokenStartLine = getStartLineAndCharacterForNode(nextToken, sourceFile).line; + var nextTokenStartLine = getOneBasedStartLineAndCharacterForNode(nextToken, sourceFile).line; return lineAtPosition === nextTokenStartLine; } return false; } - function getStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { + function getOneBasedStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { return sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); } @@ -216,7 +216,7 @@ module ts.formatting { var elseKeyword = findChildOfKind(parent, SyntaxKind.ElseKeyword, sourceFile); Debug.assert(elseKeyword !== undefined); - var elseKeywordStartLine = getStartLineAndCharacterForNode(elseKeyword, sourceFile).line; + var elseKeywordStartLine = getOneBasedStartLineAndCharacterForNode(elseKeyword, sourceFile).line; return elseKeywordStartLine === childStartLine; } @@ -286,7 +286,7 @@ module ts.formatting { // walk toward the start of the list starting from current node and check if the line is the same for all items. // if end line for item [i - 1] differs from the start line for item [i] - find column of the first non-whitespace character on the line of item [i] - var lineAndCharacter = getStartLineAndCharacterForNode(node, sourceFile); + var lineAndCharacter = getOneBasedStartLineAndCharacterForNode(node, sourceFile); for (var i = index - 1; i >= 0; --i) { if (list[i].kind === SyntaxKind.CommaToken) { continue; @@ -297,7 +297,7 @@ module ts.formatting { return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options); } - lineAndCharacter = getStartLineAndCharacterForNode(list[i], sourceFile); + lineAndCharacter = getOneBasedStartLineAndCharacterForNode(list[i], sourceFile); } return -1; } From f4da5d724fb05db03e21c1411299985388ac364f Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 18:00:43 -0800 Subject: [PATCH 10/22] Move the smart indenter over to zero based math. --- src/services/formatting/smartIndenter.ts | 27 ++++++++++++------------ src/services/services.ts | 5 +++++ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 9d81ba50348..1c36df49d47 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -24,7 +24,7 @@ module ts.formatting { return 0; } - var lineAtPosition = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; + var lineAtPosition = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; if (precedingToken.kind === SyntaxKind.CommaToken && precedingToken.parent.kind !== SyntaxKind.BinaryExpression) { // previous token is comma that separates items in list - find the previous item and try to derive indentation from it @@ -43,7 +43,7 @@ module ts.formatting { while (current) { if (positionBelongsToNode(current, position, sourceFile) && shouldIndentChildNode(current.kind, previous ? previous.kind : SyntaxKind.Unknown)) { - currentStart = getOneBasedStartLineAndCharacterForNode(current, sourceFile); + currentStart = getZeroBasedStartLineAndCharacterForNode(current, sourceFile); if (nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile)) { indentationDelta = 0; @@ -74,7 +74,7 @@ module ts.formatting { } export function getIndentationForNode(n: Node, ignoreActualIndentationRange: TextRange, sourceFile: SourceFile, options: FormatCodeOptions): number { - var start = sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); + var start = sourceFile.getZeroBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); return getIndentationForNodeWorker(n, start, ignoreActualIndentationRange, /*indentationDelta*/ 0, sourceFile, options); } @@ -135,10 +135,10 @@ module ts.formatting { function getParentStart(parent: Node, child: Node, sourceFile: SourceFile): LineAndCharacter { var containingList = getContainingList(child, sourceFile); if (containingList) { - return sourceFile.getOneBasedLineAndCharacterOfPosition(containingList.pos); + return sourceFile.getZeroBasedLineAndCharacterOfPosition(containingList.pos); } - return sourceFile.getOneBasedLineAndCharacterOfPosition(parent.getStart(sourceFile)); + return sourceFile.getZeroBasedLineAndCharacterOfPosition(parent.getStart(sourceFile)); } /* @@ -196,15 +196,15 @@ module ts.formatting { // class A { // $} - var nextTokenStartLine = getOneBasedStartLineAndCharacterForNode(nextToken, sourceFile).line; + var nextTokenStartLine = getZeroBasedStartLineAndCharacterForNode(nextToken, sourceFile).line; return lineAtPosition === nextTokenStartLine; } return false; } - function getOneBasedStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { - return sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); + function getZeroBasedStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { + return sourceFile.getZeroBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); } function positionBelongsToNode(candidate: Node, position: number, sourceFile: SourceFile): boolean { @@ -216,7 +216,7 @@ module ts.formatting { var elseKeyword = findChildOfKind(parent, SyntaxKind.ElseKeyword, sourceFile); Debug.assert(elseKeyword !== undefined); - var elseKeywordStartLine = getOneBasedStartLineAndCharacterForNode(elseKeyword, sourceFile).line; + var elseKeywordStartLine = getZeroBasedStartLineAndCharacterForNode(elseKeyword, sourceFile).line; return elseKeywordStartLine === childStartLine; } @@ -279,31 +279,30 @@ module ts.formatting { } } - function deriveActualIndentationFromList(list: Node[], index: number, sourceFile: SourceFile, options: EditorOptions): number { Debug.assert(index >= 0 && index < list.length); var node = list[index]; // walk toward the start of the list starting from current node and check if the line is the same for all items. // if end line for item [i - 1] differs from the start line for item [i] - find column of the first non-whitespace character on the line of item [i] - var lineAndCharacter = getOneBasedStartLineAndCharacterForNode(node, sourceFile); + var lineAndCharacter = getZeroBasedStartLineAndCharacterForNode(node, sourceFile); for (var i = index - 1; i >= 0; --i) { if (list[i].kind === SyntaxKind.CommaToken) { continue; } // skip list items that ends on the same line with the current list element - var prevEndLine = sourceFile.getOneBasedLineAndCharacterOfPosition(list[i].end).line; + var prevEndLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(list[i].end).line; if (prevEndLine !== lineAndCharacter.line) { return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options); } - lineAndCharacter = getOneBasedStartLineAndCharacterForNode(list[i], sourceFile); + lineAndCharacter = getZeroBasedStartLineAndCharacterForNode(list[i], sourceFile); } return -1; } function findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter: LineAndCharacter, sourceFile: SourceFile, options: EditorOptions): number { - var lineStart = sourceFile.getPositionOfOneBasedLineAndCharacter(lineAndCharacter.line, 1); + var lineStart = sourceFile.getPositionOfZeroBasedLineAndCharacter(lineAndCharacter.line, 0); return findFirstNonWhitespaceColumn(lineStart, lineStart + lineAndCharacter.character, sourceFile, options); } diff --git a/src/services/services.ts b/src/services/services.ts index 05015c60c02..bc745598b8f 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -64,6 +64,7 @@ module ts { getZeroBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; getOneBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; + getPositionOfZeroBasedLineAndCharacter(line: number, character: number): number; getPositionOfOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } @@ -770,6 +771,10 @@ module ts { return ts.getPositionOfOneBasedLineAndCharacter(this, line, character); } + public getPositionOfZeroBasedLineAndCharacter(line: number, character: number): number { + return ts.getPositionOfZeroBasedLineAndCharacter(this, line, character); + } + public getNamedDeclarations() { if (!this.namedDeclarations) { var sourceFile = this; From f06dddcf1e22630745b8ec3accfe3b804fb72626 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 18:05:29 -0800 Subject: [PATCH 11/22] Simplify helper function. --- src/services/utilities.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 41bd63560eb..598519736b9 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -34,8 +34,8 @@ module ts { export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number { var lineStarts = sourceFile.getLineStarts(); - var line = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; - return lineStarts[line - 1]; + var line = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; + return lineStarts[line]; } export function rangeContainsRange(r1: TextRange, r2: TextRange): boolean { From 572c550a3328a37a1940519e65069ac269c45586 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 18:11:45 -0800 Subject: [PATCH 12/22] Remove usages of computeOneBasedLineAndCharacterOfPosition --- src/compiler/scanner.ts | 11 +++-------- src/harness/fourslash.ts | 4 ++-- src/harness/harnessLanguageService.ts | 6 +----- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index c124c55c7da..66ee7814414 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -296,22 +296,17 @@ module ts { } export function computeZeroBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) { - var oneBased = computeOneBasedLineAndCharacterOfPosition(lineStarts, position); - return { line: oneBased.line - 1, character: oneBased.character -1 }; - } - - export function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) { var lineNumber = binarySearch(lineStarts, position); if (lineNumber < 0) { // If the actual position was not found, // the binary search returns the negative value of the next line start // e.g. if the line starts at [5, 10, 23, 80] and the position requested was 20 // then the search will return -2 - lineNumber = (~lineNumber) - 1; + lineNumber = ~lineNumber - 1; } return { - line: lineNumber + 1, - character: position - lineStarts[lineNumber] + 1 + line: lineNumber, + character: position - lineStarts[lineNumber] }; } diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 8511d042194..6290eb70235 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -395,8 +395,8 @@ module FourSlash { this.currentCaretPosition = pos; var lineStarts = ts.computeLineStarts(this.getFileContent(this.activeFile.fileName)); - var lineCharPos = ts.computeOneBasedLineAndCharacterOfPosition(lineStarts, pos); - this.scenarioActions.push(''); + var lineCharPos = ts.computeZeroBasedLineAndCharacterOfPosition(lineStarts, pos); + this.scenarioActions.push(''); } public moveCaretRight(count = 1) { diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 07f9916d703..99fd946d398 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -186,11 +186,7 @@ module Harness.LanguageService { var script: ScriptInfo = this.fileNameToScript[fileName]; assert.isNotNull(script); - var result = ts.computeOneBasedLineAndCharacterOfPosition(script.lineMap, position); - - assert.isTrue(result.line >= 1); - assert.isTrue(result.character >= 1); - return { line: result.line - 1, character: result.character - 1 }; + return ts.computeZeroBasedLineAndCharacterOfPosition(script.lineMap, position); } } From 261c8b5bd3a5f4d75a15b4cf8b7e1f691e2768ad Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 18:23:58 -0800 Subject: [PATCH 13/22] Stop using one based math in fourslash. --- src/harness/fourslash.ts | 42 +++++++++++---------------- src/harness/harnessLanguageService.ts | 14 --------- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 6290eb70235..9f9c84bbc1f 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2010,39 +2010,31 @@ module FourSlash { // Get the text of the entire line the caret is currently at private getCurrentLineContent() { - // The current caret position (in line/col terms) - var line = this.getCurrentCaretFilePosition().line; - // The line/col of the start of this line - var pos = this.languageServiceAdapterHost.lineColToPosition(this.activeFile.fileName, line, 1); - // The index of the current file + var text = this.getFileContent(this.activeFile.fileName) - // The text from the start of the line to the end of the file - var text = this.getFileContent(this.activeFile.fileName).substring(pos); + var pos = this.currentCaretPosition; + var startPos = pos, endPos = pos; - // Truncate to the first newline - var newlinePos = text.indexOf('\n'); - if (newlinePos === -1) { - return text; - } - else { - if (text.charAt(newlinePos - 1) === '\r') { - newlinePos--; + while (startPos > 0) { + var ch = text.charCodeAt(startPos - 1); + if (ch === ts.CharacterCodes.carriageReturn || ch === ts.CharacterCodes.lineFeed) { + break; } - return text.substr(0, newlinePos); - } - } - private getCurrentCaretFilePosition() { - var result = this.languageServiceAdapterHost.positionToZeroBasedLineAndCharacter(this.activeFile.fileName, this.currentCaretPosition); - if (result.line >= 0) { - result.line++; + startPos--; } - if (result.character >= 0) { - result.character++; + while (endPos < text.length) { + var ch = text.charCodeAt(endPos); + + if (ch === ts.CharacterCodes.carriageReturn || ch === ts.CharacterCodes.lineFeed) { + break; + } + + endPos++; } - return result; + return text.substring(startPos, endPos); } private assertItemInCompletionList(items: ts.CompletionEntry[], name: string, text?: string, documentation?: string, kind?: string) { diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 99fd946d398..8ef89b80c88 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -165,19 +165,6 @@ module Harness.LanguageService { throw new Error("No script with name '" + fileName + "'"); } - /** - * @param line 1 based index - * @param col 1 based index - */ - public lineColToPosition(fileName: string, line: number, col: number): number { - var script: ScriptInfo = this.fileNameToScript[fileName]; - assert.isNotNull(script); - assert.isTrue(line >= 1); - assert.isTrue(col >= 1); - - return ts.computePositionOfOneBasedLineAndCharacter(script.lineMap, line, col); - } - /** * @param line 0 based index * @param col 0 based index @@ -234,7 +221,6 @@ module Harness.LanguageService { addScript(fileName: string, content: string): void { this.nativeHost.addScript(fileName, content); } updateScript(fileName: string, content: string): void { return this.nativeHost.updateScript(fileName, content); } editScript(fileName: string, minChar: number, limChar: number, newText: string): void { this.nativeHost.editScript(fileName, minChar, limChar, newText); } - lineColToPosition(fileName: string, line: number, col: number): number { return this.nativeHost.lineColToPosition(fileName, line, col); } positionToZeroBasedLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { return this.nativeHost.positionToZeroBasedLineAndCharacter(fileName, position); } getCompilationSettings(): string { return JSON.stringify(this.nativeHost.getCompilationSettings()); } From dd90c22406cf352a2b9c25d9a19d7c62471d2b36 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 18:37:38 -0800 Subject: [PATCH 14/22] Use zero based math in hte services layer. --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index bc745598b8f..0ee0c4f75c3 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -614,7 +614,7 @@ module ts { } if (paramHelpStringMargin === undefined) { - paramHelpStringMargin = sourceFile.getOneBasedLineAndCharacterOfPosition(firstLineParamHelpStringPos).character - 1; + paramHelpStringMargin = sourceFile.getZeroBasedLineAndCharacterOfPosition(firstLineParamHelpStringPos).character; } // Now consume white spaces max From 873e4e3e8ae0beecf3a1cff38202c0beffa79ea3 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 18:57:10 -0800 Subject: [PATCH 15/22] Move formating over to zero based math. --- src/services/formatting/formatting.ts | 44 ++++++++++---------- src/services/formatting/formattingContext.ts | 12 +++--- src/services/utilities.ts | 7 ++-- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index b9cc0b24060..65d35969af5 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -67,14 +67,14 @@ module ts.formatting { } export function formatOnEnter(position: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] { - var line = sourceFile.getOneBasedLineAndCharacterOfPosition(position).line; - if (line === 1) { + var line = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; + if (line === 0) { return []; } // get the span for the previous\current line var span = { // get start position for the previous line - pos: getStartPositionOfOneBasedLine(line - 1, sourceFile), + pos: getStartPositionOfZeroBasedLine(line - 1, sourceFile), // get end position for the current line (end value is exclusive so add 1 to the result) end: getEndLinePosition(line, sourceFile) + 1 } @@ -283,7 +283,7 @@ module ts.formatting { var previousLine = Constants.Unknown; var childKind = SyntaxKind.Unknown; while (n) { - var line = sourceFile.getOneBasedLineAndCharacterOfPosition(n.getStart(sourceFile)).line; + var line = sourceFile.getZeroBasedLineAndCharacterOfPosition(n.getStart(sourceFile)).line; if (previousLine !== Constants.Unknown && line !== previousLine) { break; } @@ -327,7 +327,7 @@ module ts.formatting { formattingScanner.advance(); if (formattingScanner.isOnToken()) { - var startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line; + var startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line; var delta = getOwnOrInheritedDelta(enclosingNode, options, sourceFile); processNode(enclosingNode, enclosingNode, startLine, initialIndentation, delta); } @@ -357,7 +357,7 @@ module ts.formatting { } } else { - var startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(startPos).line; + var startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(startPos).line; var startLinePosition = getLineStartPositionForPosition(startPos, sourceFile); var column = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options); if (startLine !== parentStartLine || startPos === column) { @@ -521,7 +521,7 @@ module ts.formatting { var childStartPos = child.getStart(sourceFile); - var childStart = sourceFile.getOneBasedLineAndCharacterOfPosition(childStartPos); + var childStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(childStartPos); // if child is a list item - try to get its indentation var childIndentationAmount = Constants.Unknown; @@ -594,7 +594,7 @@ module ts.formatting { } else if (tokenInfo.token.kind === listStartToken) { // consume list start token - startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(tokenInfo.token.pos).line; + startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(tokenInfo.token.pos).line; var indentation = computeIndentation(tokenInfo.token, startLine, Constants.Unknown, parent, parentDynamicIndentation, startLine); @@ -641,7 +641,7 @@ module ts.formatting { var lineAdded: boolean; var isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token); - var tokenStart = sourceFile.getOneBasedLineAndCharacterOfPosition(currentTokenInfo.token.pos); + var tokenStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(currentTokenInfo.token.pos); if (isTokenInRange) { var rangeHasError = rangeContainsError(currentTokenInfo.token); // save prevStartLine since processRange will overwrite this value with current ones @@ -674,7 +674,7 @@ module ts.formatting { continue; } - var triviaStartLine = sourceFile.getOneBasedLineAndCharacterOfPosition(triviaItem.pos).line; + var triviaStartLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(triviaItem.pos).line; switch (triviaItem.kind) { case SyntaxKind.MultiLineCommentTrivia: var commentIndentation = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind); @@ -712,7 +712,7 @@ module ts.formatting { for (var i = 0, len = trivia.length; i < len; ++i) { var triviaItem = trivia[i]; if (isComment(triviaItem.kind) && rangeContainsRange(originalRange, triviaItem)) { - var triviaItemStart = sourceFile.getOneBasedLineAndCharacterOfPosition(triviaItem.pos); + var triviaItemStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(triviaItem.pos); processRange(triviaItem, triviaItemStart, parent, contextNode, dynamicIndentation); } } @@ -729,7 +729,7 @@ module ts.formatting { if (!rangeHasError && !previousRangeHasError) { if (!previousRange) { // trim whitespaces starting from the beginning of the span up to the current line - var originalStart = sourceFile.getOneBasedLineAndCharacterOfPosition(originalRange.pos); + var originalStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(originalRange.pos); trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line); } else { @@ -807,18 +807,18 @@ module ts.formatting { recordReplace(pos, 0, indentationString); } else { - var tokenStart = sourceFile.getOneBasedLineAndCharacterOfPosition(pos); - if (indentation !== tokenStart.character - 1) { - var startLinePosition = getStartPositionOfOneBasedLine(tokenStart.line, sourceFile); - recordReplace(startLinePosition, tokenStart.character - 1, indentationString); + var tokenStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(pos); + if (indentation !== tokenStart.character) { + var startLinePosition = getStartPositionOfZeroBasedLine(tokenStart.line, sourceFile); + recordReplace(startLinePosition, tokenStart.character, indentationString); } } } function indentMultilineComment(commentRange: TextRange, indentation: number, firstLineIsIndented: boolean) { // split comment in lines - var startLine = sourceFile.getOneBasedLineAndCharacterOfPosition(commentRange.pos).line; - var endLine = sourceFile.getOneBasedLineAndCharacterOfPosition(commentRange.end).line; + var startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(commentRange.pos).line; + var endLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(commentRange.end).line; if (startLine === endLine) { if (!firstLineIsIndented) { @@ -833,13 +833,13 @@ module ts.formatting { for (var line = startLine; line < endLine; ++line) { var endOfLine = getEndLinePosition(line, sourceFile); parts.push({ pos: startPos, end: endOfLine }); - startPos = getStartPositionOfOneBasedLine(line + 1, sourceFile); + startPos = getStartPositionOfZeroBasedLine(line + 1, sourceFile); } parts.push({ pos: startPos, end: commentRange.end }); } - var startLinePos = getStartPositionOfOneBasedLine(startLine, sourceFile); + var startLinePos = getStartPositionOfZeroBasedLine(startLine, sourceFile); var nonWhitespaceColumnInFirstPart = SmartIndenter.findFirstNonWhitespaceColumn(startLinePos, parts[0].pos, sourceFile, options); @@ -857,7 +857,7 @@ module ts.formatting { // shift all parts on the delta size var delta = indentation - nonWhitespaceColumnInFirstPart; for (var i = startIndex, len = parts.length; i < len; ++i, ++startLine) { - var startLinePos = getStartPositionOfOneBasedLine(startLine, sourceFile); + var startLinePos = getStartPositionOfZeroBasedLine(startLine, sourceFile); var nonWhitespaceColumn = i === 0 ? nonWhitespaceColumnInFirstPart @@ -876,7 +876,7 @@ module ts.formatting { function trimTrailingWhitespacesForLines(line1: number, line2: number, range?: TextRangeWithKind) { for (var line = line1; line < line2; ++line) { - var lineStartPosition = getStartPositionOfOneBasedLine(line, sourceFile); + var lineStartPosition = getStartPositionOfZeroBasedLine(line, sourceFile); var lineEndPosition = getEndLinePosition(line, sourceFile); // do not trim whitespaces in comments diff --git a/src/services/formatting/formattingContext.ts b/src/services/formatting/formattingContext.ts index 0b9372d86e2..5297f9e6658 100644 --- a/src/services/formatting/formattingContext.ts +++ b/src/services/formatting/formattingContext.ts @@ -71,8 +71,8 @@ module ts.formatting { public TokensAreOnSameLine(): boolean { if (this.tokensAreOnSameLine === undefined) { - var startLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(this.currentTokenSpan.pos).line; - var endLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(this.nextTokenSpan.pos).line; + var startLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(this.currentTokenSpan.pos).line; + var endLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(this.nextTokenSpan.pos).line; this.tokensAreOnSameLine = (startLine == endLine); } @@ -96,8 +96,8 @@ module ts.formatting { } private NodeIsOnOneLine(node: Node): boolean { - var startLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line; - var endLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(node.getEnd()).line; + var startLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line; + var endLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(node.getEnd()).line; return startLine == endLine; } @@ -105,8 +105,8 @@ module ts.formatting { var openBrace = findChildOfKind(node, SyntaxKind.OpenBraceToken, this.sourceFile); var closeBrace = findChildOfKind(node, SyntaxKind.CloseBraceToken, this.sourceFile); if (openBrace && closeBrace) { - var startLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(openBrace.getEnd()).line; - var endLine = this.sourceFile.getOneBasedLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line; + var startLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(openBrace.getEnd()).line; + var endLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line; return startLine === endLine; } return false; diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 598519736b9..72fee5260a4 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -6,12 +6,11 @@ module ts { } export function getEndLinePosition(line: number, sourceFile: SourceFile): number { - Debug.assert(line >= 1); + Debug.assert(line >= 0); var lineStarts = sourceFile.getLineStarts(); - // lines returned by SourceFile.getLineAndCharacterForPosition are 1-based - var lineIndex = line - 1; - if (lineIndex === lineStarts.length - 1) { + var lineIndex = line; + if (lineIndex + 1 === lineStarts.length) { // last line - return EOF return sourceFile.text.length - 1; } From e723d4cee07f50a3b9443cb111eaf3b46f668f3e Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 19:01:32 -0800 Subject: [PATCH 16/22] Use the zero based methods in the harness. --- src/harness/harness.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 4a87f953ee1..b2c19f2f51d 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1184,13 +1184,13 @@ module Harness { } export function getMinimalDiagnostic(err: ts.Diagnostic): HarnessDiagnostic { - var errorLineInfo = err.file ? err.file.getOneBasedLineAndCharacterOfPosition(err.start) : { line: 0, character: 0 }; + var errorLineInfo = err.file ? err.file.getZeroBasedLineAndCharacterOfPosition(err.start) : { line: -1, character: -1 }; return { fileName: err.file && err.file.fileName, start: err.start, end: err.start + err.length, - line: errorLineInfo.line, - character: errorLineInfo.character, + line: errorLineInfo.line + 1, + character: errorLineInfo.character + 1, message: ts.flattenDiagnosticMessageText(err.messageText, ts.sys.newLine), category: ts.DiagnosticCategory[err.category].toLowerCase(), code: err.code From 041b6460040dbc3a05686bce3acf58e3699f8a8f Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 19:06:47 -0800 Subject: [PATCH 17/22] Move typewriter over to using zero based math. --- src/harness/typeWriter.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/harness/typeWriter.ts b/src/harness/typeWriter.ts index 44532c6a59e..30ff313ca67 100644 --- a/src/harness/typeWriter.ts +++ b/src/harness/typeWriter.ts @@ -85,15 +85,17 @@ class TypeWriterWalker { private log(node: ts.Node, type: ts.Type): void { var actualPos = ts.skipTrivia(this.currentSourceFile.text, node.pos); - var lineAndCharacter = this.currentSourceFile.getOneBasedLineAndCharacterOfPosition(actualPos); + var lineAndCharacter = this.currentSourceFile.getZeroBasedLineAndCharacterOfPosition(actualPos); var sourceText = ts.getTextOfNodeFromSourceText(this.currentSourceFile.text, node); // If we got an unknown type, we temporarily want to fall back to just pretending the name // (source text) of the node is the type. This is to align with the old typeWriter to make // baseline comparisons easier. In the long term, we will want to just call typeToString this.results.push({ - line: lineAndCharacter.line - 1, - column: lineAndCharacter.character, + line: lineAndCharacter.line, + // todo(cyrusn): Not sure why column is one-based for type-writer. But I'm preserving + // that behavior to prevent having a lot of baselines to fix up. + column: lineAndCharacter.character + 1, syntaxKind: node.kind, sourceText: sourceText, type: this.checker.typeToString(type, node.parent, ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.WriteOwnNameForAnyLike) From 8ba918073062ceab284a495378f6ec1340d3de70 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 19:16:16 -0800 Subject: [PATCH 18/22] Remove the one based APIs. --- src/compiler/scanner.ts | 12 ++++-------- src/compiler/utilities.ts | 5 ----- src/services/services.ts | 13 ------------- 3 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 66ee7814414..186c2a5ee79 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -279,16 +279,12 @@ module ts { } export function getPositionOfZeroBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { - return computePositionOfOneBasedLineAndCharacter(getLineStarts(sourceFile), line + 1, character + 1); + return computePositionOfZeroBasedLineAndCharacter(getLineStarts(sourceFile), line, character); } - export function getPositionOfOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { - return computePositionOfOneBasedLineAndCharacter(getLineStarts(sourceFile), line, character); - } - - export function computePositionOfOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number { - Debug.assert(line > 0 && line <= lineStarts.length); - return lineStarts[line - 1] + character - 1; + export function computePositionOfZeroBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number { + Debug.assert(line >= 0 && line < lineStarts.length); + return lineStarts[line] + character; } export function getLineStarts(sourceFile: SourceFile): number[] { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index d543adaa103..da00bba6a31 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -110,11 +110,6 @@ module ts { return getLineStarts(sourceFile)[line]; } - export function getStartPositionOfOneBasedLine(line: number, sourceFile: SourceFile): number { - Debug.assert(line >= 1); - return getLineStarts(sourceFile)[line - 1]; - } - // This is a useful function for debugging purposes. export function nodePosToString(node: Node): string { var file = getSourceFileOfNode(node); diff --git a/src/services/services.ts b/src/services/services.ts index 0ee0c4f75c3..7f1e52e4962 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -62,10 +62,8 @@ module ts { nameTable: Map; getNamedDeclarations(): Declaration[]; getZeroBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; - getOneBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; getPositionOfZeroBasedLineAndCharacter(line: number, character: number): number; - getPositionOfOneBasedLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } @@ -756,21 +754,10 @@ module ts { return ts.getZeroBasedLineAndCharacterOfPosition(this, position); } - public getOneBasedLineAndCharacterOfPosition(position: number): LineAndCharacter { - var result = ts.getZeroBasedLineAndCharacterOfPosition(this, position); - result.line++; - result.character++; - return result; - } - public getLineStarts(): number[] { return getLineStarts(this); } - public getPositionOfOneBasedLineAndCharacter(line: number, character: number): number { - return ts.getPositionOfOneBasedLineAndCharacter(this, line, character); - } - public getPositionOfZeroBasedLineAndCharacter(line: number, character: number): number { return ts.getPositionOfZeroBasedLineAndCharacter(this, line, character); } From 124a77cc3a28e4851dad1f60dda933d9db982054 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 19:35:45 -0800 Subject: [PATCH 19/22] Remove 'ZeroBased' from all APIs, now that all APIs are zero based. --- src/compiler/emitter.ts | 30 ++++++++-------- src/compiler/scanner.ts | 12 +++---- src/compiler/tsc.ts | 2 +- src/compiler/utilities.ts | 4 +-- src/harness/fourslash.ts | 4 +-- src/harness/harness.ts | 2 +- src/harness/harnessLanguageService.ts | 6 ++-- src/harness/typeWriter.ts | 2 +- src/services/breakpoints.ts | 8 ++--- src/services/formatting/formatting.ts | 38 ++++++++++---------- src/services/formatting/formattingContext.ts | 12 +++---- src/services/formatting/smartIndenter.ts | 26 +++++++------- src/services/services.ts | 14 ++++---- src/services/utilities.ts | 2 +- 14 files changed, 81 insertions(+), 81 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 2e78b9a2a46..6fafe9c65fb 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -133,14 +133,14 @@ module ts { }; } - function getZeroBasedLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { - return getZeroBasedLineAndCharacterOfPosition(currentSourceFile, pos).line; + function getBasedLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { + return getLineAndCharacterOfPosition(currentSourceFile, pos).line; } function emitNewLineBeforeLeadingComments(currentSourceFile: SourceFile, writer: EmitTextWriter, node: TextRange, leadingComments: CommentRange[]) { // If the leading comments start on different line than the start of node, write new line if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos && - getZeroBasedLineOfLocalPosition(currentSourceFile, node.pos) !== getZeroBasedLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { + getBasedLineOfLocalPosition(currentSourceFile, node.pos) !== getBasedLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { writer.writeLine(); } } @@ -169,18 +169,18 @@ module ts { function writeCommentRange(currentSourceFile: SourceFile, writer: EmitTextWriter, comment: CommentRange, newLine: string){ if (currentSourceFile.text.charCodeAt(comment.pos + 1) === CharacterCodes.asterisk) { - var firstCommentLineAndCharacter = getZeroBasedLineAndCharacterOfPosition(currentSourceFile, comment.pos); + var firstCommentLineAndCharacter = getLineAndCharacterOfPosition(currentSourceFile, comment.pos); var lineCount = getLineStarts(currentSourceFile).length; var firstCommentLineIndent: number; for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) { var nextLineStart = (currentLine + 1) === lineCount ? currentSourceFile.text.length + 1 - : getStartPositionOfZeroBasedLine(currentLine + 1, currentSourceFile); + : getStartPositionOfLine(currentLine + 1, currentSourceFile); if (pos !== comment.pos) { // If we are not emitting first line, we need to write the spaces to adjust the alignment if (firstCommentLineIndent === undefined) { - firstCommentLineIndent = calculateIndent(getStartPositionOfZeroBasedLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos); + firstCommentLineIndent = calculateIndent(getStartPositionOfLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos); } // These are number of spaces writer is going to write at current indent @@ -1734,7 +1734,7 @@ module ts { } function recordSourceMapSpan(pos: number) { - var sourceLinePos = getZeroBasedLineAndCharacterOfPosition(currentSourceFile, pos); + var sourceLinePos = getLineAndCharacterOfPosition(currentSourceFile, pos); // Convert the location to be one-based. sourceLinePos.line++; @@ -2979,13 +2979,13 @@ module ts { } function isOnSameLine(node1: Node, node2: Node) { - return getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === - getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === + getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function nodeEndIsOnSameLineAsNodeStart(node1: Node, node2: Node) { - return getZeroBasedLineOfLocalPosition(currentSourceFile, node1.end) === - getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getBasedLineOfLocalPosition(currentSourceFile, node1.end) === + getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function emitCaseOrDefaultClause(node: CaseOrDefaultClause) { @@ -4476,8 +4476,8 @@ module ts { forEach(leadingComments, comment => { if (lastComment) { - var lastCommentLine = getZeroBasedLineOfLocalPosition(currentSourceFile, lastComment.end); - var commentLine = getZeroBasedLineOfLocalPosition(currentSourceFile, comment.pos); + var lastCommentLine = getBasedLineOfLocalPosition(currentSourceFile, lastComment.end); + var commentLine = getBasedLineOfLocalPosition(currentSourceFile, comment.pos); if (commentLine >= lastCommentLine + 2) { // There was a blank line between the last comment and this comment. This @@ -4495,8 +4495,8 @@ module ts { // All comments look like they could have been part of the copyright header. Make // sure there is at least one blank line between it and the node. If not, it's not // a copyright header. - var lastCommentLine = getZeroBasedLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); - var nodeLine = getZeroBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); + var lastCommentLine = getBasedLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); + var nodeLine = getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); if (nodeLine >= lastCommentLine + 2) { // Valid detachedComments emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments); diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 186c2a5ee79..7eddbb962fc 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -278,11 +278,11 @@ module ts { return result; } - export function getPositionOfZeroBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { - return computePositionOfZeroBasedLineAndCharacter(getLineStarts(sourceFile), line, character); + export function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number { + return computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character); } - export function computePositionOfZeroBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number { + export function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number { Debug.assert(line >= 0 && line < lineStarts.length); return lineStarts[line] + character; } @@ -291,7 +291,7 @@ module ts { return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text)); } - export function computeZeroBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) { + export function computeLineAndCharacterOfPosition(lineStarts: number[], position: number) { var lineNumber = binarySearch(lineStarts, position); if (lineNumber < 0) { // If the actual position was not found, @@ -306,8 +306,8 @@ module ts { }; } - export function getZeroBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { - return computeZeroBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position); + export function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter { + return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position); } var hasOwnProperty = Object.prototype.hasOwnProperty; diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 64272b196ff..68e85d3f71d 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -86,7 +86,7 @@ module ts { var output = ""; if (diagnostic.file) { - var loc = getZeroBasedLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); + var loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): "; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index da00bba6a31..6b336544eba 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -105,7 +105,7 @@ module ts { return node; } - export function getStartPositionOfZeroBasedLine(line: number, sourceFile: SourceFile): number { + export function getStartPositionOfLine(line: number, sourceFile: SourceFile): number { Debug.assert(line >= 0); return getLineStarts(sourceFile)[line]; } @@ -113,7 +113,7 @@ module ts { // This is a useful function for debugging purposes. export function nodePosToString(node: Node): string { var file = getSourceFileOfNode(node); - var loc = getZeroBasedLineAndCharacterOfPosition(file, node.pos); + var loc = getLineAndCharacterOfPosition(file, node.pos); return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")"; } diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 9f9c84bbc1f..e40a367074d 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -395,7 +395,7 @@ module FourSlash { this.currentCaretPosition = pos; var lineStarts = ts.computeLineStarts(this.getFileContent(this.activeFile.fileName)); - var lineCharPos = ts.computeZeroBasedLineAndCharacterOfPosition(lineStarts, pos); + var lineCharPos = ts.computeLineAndCharacterOfPosition(lineStarts, pos); this.scenarioActions.push(''); } @@ -2112,7 +2112,7 @@ module FourSlash { } private getLineColStringAtPosition(position: number) { - var pos = this.languageServiceAdapterHost.positionToZeroBasedLineAndCharacter(this.activeFile.fileName, position); + var pos = this.languageServiceAdapterHost.positionToLineAndCharacter(this.activeFile.fileName, position); return 'line ' + (pos.line + 1) + ', col ' + pos.character; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index b2c19f2f51d..8658aea0a63 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1184,7 +1184,7 @@ module Harness { } export function getMinimalDiagnostic(err: ts.Diagnostic): HarnessDiagnostic { - var errorLineInfo = err.file ? err.file.getZeroBasedLineAndCharacterOfPosition(err.start) : { line: -1, character: -1 }; + var errorLineInfo = err.file ? err.file.getLineAndCharacterOfPosition(err.start) : { line: -1, character: -1 }; return { fileName: err.file && err.file.fileName, start: err.start, diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 8ef89b80c88..e8f16825468 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -169,11 +169,11 @@ module Harness.LanguageService { * @param line 0 based index * @param col 0 based index */ - public positionToZeroBasedLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { + public positionToLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { var script: ScriptInfo = this.fileNameToScript[fileName]; assert.isNotNull(script); - return ts.computeZeroBasedLineAndCharacterOfPosition(script.lineMap, position); + return ts.computeLineAndCharacterOfPosition(script.lineMap, position); } } @@ -221,7 +221,7 @@ module Harness.LanguageService { addScript(fileName: string, content: string): void { this.nativeHost.addScript(fileName, content); } updateScript(fileName: string, content: string): void { return this.nativeHost.updateScript(fileName, content); } editScript(fileName: string, minChar: number, limChar: number, newText: string): void { this.nativeHost.editScript(fileName, minChar, limChar, newText); } - positionToZeroBasedLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { return this.nativeHost.positionToZeroBasedLineAndCharacter(fileName, position); } + positionToLineAndCharacter(fileName: string, position: number): ts.LineAndCharacter { return this.nativeHost.positionToLineAndCharacter(fileName, position); } getCompilationSettings(): string { return JSON.stringify(this.nativeHost.getCompilationSettings()); } getCancellationToken(): ts.CancellationToken { return this.nativeHost.getCancellationToken(); } diff --git a/src/harness/typeWriter.ts b/src/harness/typeWriter.ts index 30ff313ca67..54cdc27e3b3 100644 --- a/src/harness/typeWriter.ts +++ b/src/harness/typeWriter.ts @@ -85,7 +85,7 @@ class TypeWriterWalker { private log(node: ts.Node, type: ts.Type): void { var actualPos = ts.skipTrivia(this.currentSourceFile.text, node.pos); - var lineAndCharacter = this.currentSourceFile.getZeroBasedLineAndCharacterOfPosition(actualPos); + var lineAndCharacter = this.currentSourceFile.getLineAndCharacterOfPosition(actualPos); var sourceText = ts.getTextOfNodeFromSourceText(this.currentSourceFile.text, node); // If we got an unknown type, we temporarily want to fall back to just pretending the name diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index 492cc7866e9..1367d1affcd 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -14,8 +14,8 @@ module ts.BreakpointResolver { } var tokenAtLocation = getTokenAtPosition(sourceFile, position); - var lineOfPosition = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; - if (sourceFile.getZeroBasedLineAndCharacterOfPosition(tokenAtLocation.getStart()).line > lineOfPosition) { + var lineOfPosition = sourceFile.getLineAndCharacterOfPosition(position).line; + if (sourceFile.getLineAndCharacterOfPosition(tokenAtLocation.getStart()).line > lineOfPosition) { // Get previous token if the token is returned starts on new line // eg: var x =10; |--- cursor is here // var y = 10; @@ -24,7 +24,7 @@ module ts.BreakpointResolver { tokenAtLocation = findPrecedingToken(tokenAtLocation.pos, sourceFile); // Its a blank line - if (!tokenAtLocation || sourceFile.getZeroBasedLineAndCharacterOfPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) { + if (!tokenAtLocation || sourceFile.getLineAndCharacterOfPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) { return undefined; } } @@ -42,7 +42,7 @@ module ts.BreakpointResolver { } function spanInNodeIfStartsOnSameLine(node: Node, otherwiseOnNode?: Node): TextSpan { - if (node && lineOfPosition === sourceFile.getZeroBasedLineAndCharacterOfPosition(node.getStart()).line) { + if (node && lineOfPosition === sourceFile.getLineAndCharacterOfPosition(node.getStart()).line) { return spanInNode(node); } return spanInNode(otherwiseOnNode); diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index 65d35969af5..180ff0c9e95 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -67,14 +67,14 @@ module ts.formatting { } export function formatOnEnter(position: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] { - var line = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; + var line = sourceFile.getLineAndCharacterOfPosition(position).line; if (line === 0) { return []; } // get the span for the previous\current line var span = { // get start position for the previous line - pos: getStartPositionOfZeroBasedLine(line - 1, sourceFile), + pos: getStartPositionOfLine(line - 1, sourceFile), // get end position for the current line (end value is exclusive so add 1 to the result) end: getEndLinePosition(line, sourceFile) + 1 } @@ -283,7 +283,7 @@ module ts.formatting { var previousLine = Constants.Unknown; var childKind = SyntaxKind.Unknown; while (n) { - var line = sourceFile.getZeroBasedLineAndCharacterOfPosition(n.getStart(sourceFile)).line; + var line = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)).line; if (previousLine !== Constants.Unknown && line !== previousLine) { break; } @@ -327,7 +327,7 @@ module ts.formatting { formattingScanner.advance(); if (formattingScanner.isOnToken()) { - var startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line; + var startLine = sourceFile.getLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line; var delta = getOwnOrInheritedDelta(enclosingNode, options, sourceFile); processNode(enclosingNode, enclosingNode, startLine, initialIndentation, delta); } @@ -357,7 +357,7 @@ module ts.formatting { } } else { - var startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(startPos).line; + var startLine = sourceFile.getLineAndCharacterOfPosition(startPos).line; var startLinePosition = getLineStartPositionForPosition(startPos, sourceFile); var column = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options); if (startLine !== parentStartLine || startPos === column) { @@ -521,7 +521,7 @@ module ts.formatting { var childStartPos = child.getStart(sourceFile); - var childStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(childStartPos); + var childStart = sourceFile.getLineAndCharacterOfPosition(childStartPos); // if child is a list item - try to get its indentation var childIndentationAmount = Constants.Unknown; @@ -594,7 +594,7 @@ module ts.formatting { } else if (tokenInfo.token.kind === listStartToken) { // consume list start token - startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(tokenInfo.token.pos).line; + startLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo.token.pos).line; var indentation = computeIndentation(tokenInfo.token, startLine, Constants.Unknown, parent, parentDynamicIndentation, startLine); @@ -641,7 +641,7 @@ module ts.formatting { var lineAdded: boolean; var isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token); - var tokenStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(currentTokenInfo.token.pos); + var tokenStart = sourceFile.getLineAndCharacterOfPosition(currentTokenInfo.token.pos); if (isTokenInRange) { var rangeHasError = rangeContainsError(currentTokenInfo.token); // save prevStartLine since processRange will overwrite this value with current ones @@ -674,7 +674,7 @@ module ts.formatting { continue; } - var triviaStartLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(triviaItem.pos).line; + var triviaStartLine = sourceFile.getLineAndCharacterOfPosition(triviaItem.pos).line; switch (triviaItem.kind) { case SyntaxKind.MultiLineCommentTrivia: var commentIndentation = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind); @@ -712,7 +712,7 @@ module ts.formatting { for (var i = 0, len = trivia.length; i < len; ++i) { var triviaItem = trivia[i]; if (isComment(triviaItem.kind) && rangeContainsRange(originalRange, triviaItem)) { - var triviaItemStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(triviaItem.pos); + var triviaItemStart = sourceFile.getLineAndCharacterOfPosition(triviaItem.pos); processRange(triviaItem, triviaItemStart, parent, contextNode, dynamicIndentation); } } @@ -729,7 +729,7 @@ module ts.formatting { if (!rangeHasError && !previousRangeHasError) { if (!previousRange) { // trim whitespaces starting from the beginning of the span up to the current line - var originalStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(originalRange.pos); + var originalStart = sourceFile.getLineAndCharacterOfPosition(originalRange.pos); trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line); } else { @@ -807,9 +807,9 @@ module ts.formatting { recordReplace(pos, 0, indentationString); } else { - var tokenStart = sourceFile.getZeroBasedLineAndCharacterOfPosition(pos); + var tokenStart = sourceFile.getLineAndCharacterOfPosition(pos); if (indentation !== tokenStart.character) { - var startLinePosition = getStartPositionOfZeroBasedLine(tokenStart.line, sourceFile); + var startLinePosition = getStartPositionOfLine(tokenStart.line, sourceFile); recordReplace(startLinePosition, tokenStart.character, indentationString); } } @@ -817,8 +817,8 @@ module ts.formatting { function indentMultilineComment(commentRange: TextRange, indentation: number, firstLineIsIndented: boolean) { // split comment in lines - var startLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(commentRange.pos).line; - var endLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(commentRange.end).line; + var startLine = sourceFile.getLineAndCharacterOfPosition(commentRange.pos).line; + var endLine = sourceFile.getLineAndCharacterOfPosition(commentRange.end).line; if (startLine === endLine) { if (!firstLineIsIndented) { @@ -833,13 +833,13 @@ module ts.formatting { for (var line = startLine; line < endLine; ++line) { var endOfLine = getEndLinePosition(line, sourceFile); parts.push({ pos: startPos, end: endOfLine }); - startPos = getStartPositionOfZeroBasedLine(line + 1, sourceFile); + startPos = getStartPositionOfLine(line + 1, sourceFile); } parts.push({ pos: startPos, end: commentRange.end }); } - var startLinePos = getStartPositionOfZeroBasedLine(startLine, sourceFile); + var startLinePos = getStartPositionOfLine(startLine, sourceFile); var nonWhitespaceColumnInFirstPart = SmartIndenter.findFirstNonWhitespaceColumn(startLinePos, parts[0].pos, sourceFile, options); @@ -857,7 +857,7 @@ module ts.formatting { // shift all parts on the delta size var delta = indentation - nonWhitespaceColumnInFirstPart; for (var i = startIndex, len = parts.length; i < len; ++i, ++startLine) { - var startLinePos = getStartPositionOfZeroBasedLine(startLine, sourceFile); + var startLinePos = getStartPositionOfLine(startLine, sourceFile); var nonWhitespaceColumn = i === 0 ? nonWhitespaceColumnInFirstPart @@ -876,7 +876,7 @@ module ts.formatting { function trimTrailingWhitespacesForLines(line1: number, line2: number, range?: TextRangeWithKind) { for (var line = line1; line < line2; ++line) { - var lineStartPosition = getStartPositionOfZeroBasedLine(line, sourceFile); + var lineStartPosition = getStartPositionOfLine(line, sourceFile); var lineEndPosition = getEndLinePosition(line, sourceFile); // do not trim whitespaces in comments diff --git a/src/services/formatting/formattingContext.ts b/src/services/formatting/formattingContext.ts index 5297f9e6658..b7573526f78 100644 --- a/src/services/formatting/formattingContext.ts +++ b/src/services/formatting/formattingContext.ts @@ -71,8 +71,8 @@ module ts.formatting { public TokensAreOnSameLine(): boolean { if (this.tokensAreOnSameLine === undefined) { - var startLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(this.currentTokenSpan.pos).line; - var endLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(this.nextTokenSpan.pos).line; + var startLine = this.sourceFile.getLineAndCharacterOfPosition(this.currentTokenSpan.pos).line; + var endLine = this.sourceFile.getLineAndCharacterOfPosition(this.nextTokenSpan.pos).line; this.tokensAreOnSameLine = (startLine == endLine); } @@ -96,8 +96,8 @@ module ts.formatting { } private NodeIsOnOneLine(node: Node): boolean { - var startLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line; - var endLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(node.getEnd()).line; + var startLine = this.sourceFile.getLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line; + var endLine = this.sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line; return startLine == endLine; } @@ -105,8 +105,8 @@ module ts.formatting { var openBrace = findChildOfKind(node, SyntaxKind.OpenBraceToken, this.sourceFile); var closeBrace = findChildOfKind(node, SyntaxKind.CloseBraceToken, this.sourceFile); if (openBrace && closeBrace) { - var startLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(openBrace.getEnd()).line; - var endLine = this.sourceFile.getZeroBasedLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line; + var startLine = this.sourceFile.getLineAndCharacterOfPosition(openBrace.getEnd()).line; + var endLine = this.sourceFile.getLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line; return startLine === endLine; } return false; diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 1c36df49d47..30d53b00370 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -24,7 +24,7 @@ module ts.formatting { return 0; } - var lineAtPosition = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; + var lineAtPosition = sourceFile.getLineAndCharacterOfPosition(position).line; if (precedingToken.kind === SyntaxKind.CommaToken && precedingToken.parent.kind !== SyntaxKind.BinaryExpression) { // previous token is comma that separates items in list - find the previous item and try to derive indentation from it @@ -43,7 +43,7 @@ module ts.formatting { while (current) { if (positionBelongsToNode(current, position, sourceFile) && shouldIndentChildNode(current.kind, previous ? previous.kind : SyntaxKind.Unknown)) { - currentStart = getZeroBasedStartLineAndCharacterForNode(current, sourceFile); + currentStart = getStartLineAndCharacterForNode(current, sourceFile); if (nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile)) { indentationDelta = 0; @@ -74,7 +74,7 @@ module ts.formatting { } export function getIndentationForNode(n: Node, ignoreActualIndentationRange: TextRange, sourceFile: SourceFile, options: FormatCodeOptions): number { - var start = sourceFile.getZeroBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); + var start = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)); return getIndentationForNodeWorker(n, start, ignoreActualIndentationRange, /*indentationDelta*/ 0, sourceFile, options); } @@ -135,10 +135,10 @@ module ts.formatting { function getParentStart(parent: Node, child: Node, sourceFile: SourceFile): LineAndCharacter { var containingList = getContainingList(child, sourceFile); if (containingList) { - return sourceFile.getZeroBasedLineAndCharacterOfPosition(containingList.pos); + return sourceFile.getLineAndCharacterOfPosition(containingList.pos); } - return sourceFile.getZeroBasedLineAndCharacterOfPosition(parent.getStart(sourceFile)); + return sourceFile.getLineAndCharacterOfPosition(parent.getStart(sourceFile)); } /* @@ -196,15 +196,15 @@ module ts.formatting { // class A { // $} - var nextTokenStartLine = getZeroBasedStartLineAndCharacterForNode(nextToken, sourceFile).line; + var nextTokenStartLine = getStartLineAndCharacterForNode(nextToken, sourceFile).line; return lineAtPosition === nextTokenStartLine; } return false; } - function getZeroBasedStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { - return sourceFile.getZeroBasedLineAndCharacterOfPosition(n.getStart(sourceFile)); + function getStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter { + return sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)); } function positionBelongsToNode(candidate: Node, position: number, sourceFile: SourceFile): boolean { @@ -216,7 +216,7 @@ module ts.formatting { var elseKeyword = findChildOfKind(parent, SyntaxKind.ElseKeyword, sourceFile); Debug.assert(elseKeyword !== undefined); - var elseKeywordStartLine = getZeroBasedStartLineAndCharacterForNode(elseKeyword, sourceFile).line; + var elseKeywordStartLine = getStartLineAndCharacterForNode(elseKeyword, sourceFile).line; return elseKeywordStartLine === childStartLine; } @@ -285,24 +285,24 @@ module ts.formatting { // walk toward the start of the list starting from current node and check if the line is the same for all items. // if end line for item [i - 1] differs from the start line for item [i] - find column of the first non-whitespace character on the line of item [i] - var lineAndCharacter = getZeroBasedStartLineAndCharacterForNode(node, sourceFile); + var lineAndCharacter = getStartLineAndCharacterForNode(node, sourceFile); for (var i = index - 1; i >= 0; --i) { if (list[i].kind === SyntaxKind.CommaToken) { continue; } // skip list items that ends on the same line with the current list element - var prevEndLine = sourceFile.getZeroBasedLineAndCharacterOfPosition(list[i].end).line; + var prevEndLine = sourceFile.getLineAndCharacterOfPosition(list[i].end).line; if (prevEndLine !== lineAndCharacter.line) { return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options); } - lineAndCharacter = getZeroBasedStartLineAndCharacterForNode(list[i], sourceFile); + lineAndCharacter = getStartLineAndCharacterForNode(list[i], sourceFile); } return -1; } function findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter: LineAndCharacter, sourceFile: SourceFile, options: EditorOptions): number { - var lineStart = sourceFile.getPositionOfZeroBasedLineAndCharacter(lineAndCharacter.line, 0); + var lineStart = sourceFile.getPositionOfLineAndCharacter(lineAndCharacter.line, 0); return findFirstNonWhitespaceColumn(lineStart, lineStart + lineAndCharacter.character, sourceFile, options); } diff --git a/src/services/services.ts b/src/services/services.ts index 7f1e52e4962..b286507fe3c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -61,9 +61,9 @@ module ts { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getZeroBasedLineAndCharacterOfPosition(pos: number): LineAndCharacter; + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionOfZeroBasedLineAndCharacter(line: number, character: number): number; + getPositionOfLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } @@ -612,7 +612,7 @@ module ts { } if (paramHelpStringMargin === undefined) { - paramHelpStringMargin = sourceFile.getZeroBasedLineAndCharacterOfPosition(firstLineParamHelpStringPos).character; + paramHelpStringMargin = sourceFile.getLineAndCharacterOfPosition(firstLineParamHelpStringPos).character; } // Now consume white spaces max @@ -750,16 +750,16 @@ module ts { return updateSourceFile(this, newText, textChangeRange); } - public getZeroBasedLineAndCharacterOfPosition(position: number): LineAndCharacter { - return ts.getZeroBasedLineAndCharacterOfPosition(this, position); + public getLineAndCharacterOfPosition(position: number): LineAndCharacter { + return ts.getLineAndCharacterOfPosition(this, position); } public getLineStarts(): number[] { return getLineStarts(this); } - public getPositionOfZeroBasedLineAndCharacter(line: number, character: number): number { - return ts.getPositionOfZeroBasedLineAndCharacter(this, line, character); + public getPositionOfLineAndCharacter(line: number, character: number): number { + return ts.getPositionOfLineAndCharacter(this, line, character); } public getNamedDeclarations() { diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 72fee5260a4..13156523045 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -33,7 +33,7 @@ module ts { export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number { var lineStarts = sourceFile.getLineStarts(); - var line = sourceFile.getZeroBasedLineAndCharacterOfPosition(position).line; + var line = sourceFile.getLineAndCharacterOfPosition(position).line; return lineStarts[line]; } From a83534a72ce059e262db18ecedc7ff69beff7539 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 19:55:32 -0800 Subject: [PATCH 20/22] Fix up API samples. --- .../baselines/reference/APISample_compile.js | 20 ++++---- .../reference/APISample_compile.types | 42 ++++++++-------- tests/baselines/reference/APISample_linter.js | 20 ++++---- .../reference/APISample_linter.types | 38 ++++++++------- .../reference/APISample_transform.js | 16 +++---- .../reference/APISample_transform.types | 48 ++++++++++--------- .../baselines/reference/APISample_watcher.js | 20 ++++---- .../reference/APISample_watcher.types | 42 ++++++++-------- tests/cases/compiler/APISample_compile.ts | 4 +- tests/cases/compiler/APISample_linter.ts | 4 +- tests/cases/compiler/APISample_transform.ts | 2 +- tests/cases/compiler/APISample_watcher.ts | 4 +- 12 files changed, 134 insertions(+), 126 deletions(-) diff --git a/tests/baselines/reference/APISample_compile.js b/tests/baselines/reference/APISample_compile.js index 83951d237a3..e43be49261b 100644 --- a/tests/baselines/reference/APISample_compile.js +++ b/tests/baselines/reference/APISample_compile.js @@ -21,8 +21,8 @@ export function compile(fileNames: string[], options: ts.CompilerOptions): void var allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics); allDiagnostics.forEach(diagnostic => { - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); - console.log(`${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + console.log(`${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); }); var exitCode = emitResult.emitSkipped ? 1 : 0; @@ -1384,14 +1384,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1469,9 +1469,9 @@ declare module "typescript" { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; + getPositionOfLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** @@ -1946,8 +1946,8 @@ function compile(fileNames, options) { var emitResult = program.emit(); var allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics); allDiagnostics.forEach(function (diagnostic) { - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); - console.log(diagnostic.file.fileName + " (" + lineChar.line + "," + lineChar.character + "): " + ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + console.log(diagnostic.file.fileName + " (" + (lineChar.line + 1) + "," + (lineChar.character + 1) + "): " + ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)); }); var exitCode = emitResult.emitSkipped ? 1 : 0; console.log("Process exiting with code '" + exitCode + "'."); diff --git a/tests/baselines/reference/APISample_compile.types b/tests/baselines/reference/APISample_compile.types index 18b6f84c702..a6e0fe6fc45 100644 --- a/tests/baselines/reference/APISample_compile.types +++ b/tests/baselines/reference/APISample_compile.types @@ -56,27 +56,27 @@ export function compile(fileNames: string[], options: ts.CompilerOptions): void >diagnostics : ts.Diagnostic[] allDiagnostics.forEach(diagnostic => { ->allDiagnostics.forEach(diagnostic => { var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); console.log(`${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); }) : void +>allDiagnostics.forEach(diagnostic => { var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); console.log(`${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); }) : void >allDiagnostics.forEach : (callbackfn: (value: ts.Diagnostic, index: number, array: ts.Diagnostic[]) => void, thisArg?: any) => void >allDiagnostics : ts.Diagnostic[] >forEach : (callbackfn: (value: ts.Diagnostic, index: number, array: ts.Diagnostic[]) => void, thisArg?: any) => void ->diagnostic => { var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); console.log(`${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); } : (diagnostic: ts.Diagnostic) => void +>diagnostic => { var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); console.log(`${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); } : (diagnostic: ts.Diagnostic) => void >diagnostic : ts.Diagnostic - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); >lineChar : ts.LineAndCharacter ->diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start) : ts.LineAndCharacter ->diagnostic.file.getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start) : ts.LineAndCharacter +>diagnostic.file.getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >diagnostic.file : ts.SourceFile >diagnostic : ts.Diagnostic >file : ts.SourceFile ->getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >diagnostic.start : number >diagnostic : ts.Diagnostic >start : number - console.log(`${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); ->console.log(`${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`) : any + console.log(`${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); +>console.log(`${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`) : any >console.log : any >console : any >log : any @@ -85,9 +85,11 @@ export function compile(fileNames: string[], options: ts.CompilerOptions): void >diagnostic : ts.Diagnostic >file : ts.SourceFile >fileName : string +>lineChar.line + 1 : number >lineChar.line : number >lineChar : ts.LineAndCharacter >line : number +>lineChar.character + 1 : number >lineChar.character : number >lineChar : ts.LineAndCharacter >character : number @@ -4368,15 +4370,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionOfLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionOfLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4386,8 +4388,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4398,8 +4400,8 @@ declare module "typescript" { >character : number }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -4735,16 +4737,16 @@ declare module "typescript" { >getNamedDeclarations : () => Declaration[] >Declaration : Declaration - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; ->getLineAndCharacterFromPosition : (pos: number) => LineAndCharacter + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (pos: number) => LineAndCharacter >pos : number >LineAndCharacter : LineAndCharacter getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number + getPositionOfLineAndCharacter(line: number, character: number): number; +>getPositionOfLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/baselines/reference/APISample_linter.js b/tests/baselines/reference/APISample_linter.js index 0b090bebd7f..be5b7e2235d 100644 --- a/tests/baselines/reference/APISample_linter.js +++ b/tests/baselines/reference/APISample_linter.js @@ -51,8 +51,8 @@ export function delint(sourceFile: ts.SourceFile) { } function report(node: ts.Node, message: string) { - var lineChar = sourceFile.getLineAndCharacterFromPosition(node.getStart()); - console.log(`${sourceFile.fileName} (${lineChar.line},${lineChar.character}): ${message}`) + var lineChar = sourceFile.getLineAndCharacterOfPosition(node.getStart()); + console.log(`${sourceFile.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${message}`) } } @@ -1415,14 +1415,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1500,9 +1500,9 @@ declare module "typescript" { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; + getPositionOfLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** @@ -2003,8 +2003,8 @@ function delint(sourceFile) { ts.forEachChild(node, delintNode); } function report(node, message) { - var lineChar = sourceFile.getLineAndCharacterFromPosition(node.getStart()); - console.log(sourceFile.fileName + " (" + lineChar.line + "," + lineChar.character + "): " + message); + var lineChar = sourceFile.getLineAndCharacterOfPosition(node.getStart()); + console.log(sourceFile.fileName + " (" + (lineChar.line + 1) + "," + (lineChar.character + 1) + "): " + message); } } exports.delint = delint; diff --git a/tests/baselines/reference/APISample_linter.types b/tests/baselines/reference/APISample_linter.types index 5e25227836b..3e834101f92 100644 --- a/tests/baselines/reference/APISample_linter.types +++ b/tests/baselines/reference/APISample_linter.types @@ -224,28 +224,30 @@ export function delint(sourceFile: ts.SourceFile) { >Node : ts.Node >message : string - var lineChar = sourceFile.getLineAndCharacterFromPosition(node.getStart()); + var lineChar = sourceFile.getLineAndCharacterOfPosition(node.getStart()); >lineChar : ts.LineAndCharacter ->sourceFile.getLineAndCharacterFromPosition(node.getStart()) : ts.LineAndCharacter ->sourceFile.getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>sourceFile.getLineAndCharacterOfPosition(node.getStart()) : ts.LineAndCharacter +>sourceFile.getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >sourceFile : ts.SourceFile ->getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >node.getStart() : number >node.getStart : (sourceFile?: ts.SourceFile) => number >node : ts.Node >getStart : (sourceFile?: ts.SourceFile) => number - console.log(`${sourceFile.fileName} (${lineChar.line},${lineChar.character}): ${message}`) ->console.log(`${sourceFile.fileName} (${lineChar.line},${lineChar.character}): ${message}`) : any + console.log(`${sourceFile.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${message}`) +>console.log(`${sourceFile.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${message}`) : any >console.log : any >console : any >log : any >sourceFile.fileName : string >sourceFile : ts.SourceFile >fileName : string +>lineChar.line + 1 : number >lineChar.line : number >lineChar : ts.LineAndCharacter >line : number +>lineChar.character + 1 : number >lineChar.character : number >lineChar : ts.LineAndCharacter >character : number @@ -4512,15 +4514,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionOfLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionOfLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4530,8 +4532,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4542,8 +4544,8 @@ declare module "typescript" { >character : number }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -4879,16 +4881,16 @@ declare module "typescript" { >getNamedDeclarations : () => Declaration[] >Declaration : Declaration - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; ->getLineAndCharacterFromPosition : (pos: number) => LineAndCharacter + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (pos: number) => LineAndCharacter >pos : number >LineAndCharacter : LineAndCharacter getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number + getPositionOfLineAndCharacter(line: number, character: number): number; +>getPositionOfLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/baselines/reference/APISample_transform.js b/tests/baselines/reference/APISample_transform.js index 4e933d72b3e..2fe2e46e4c6 100644 --- a/tests/baselines/reference/APISample_transform.js +++ b/tests/baselines/reference/APISample_transform.js @@ -54,7 +54,7 @@ function transform(contents: string, compilerOptions: ts.CompilerOptions = {}) { return { outputs: outputs, errors: errors.map(function (e) { - return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) }; @@ -1416,14 +1416,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1501,9 +1501,9 @@ declare module "typescript" { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; + getPositionOfLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** @@ -2005,7 +2005,7 @@ function transform(contents, compilerOptions) { return { outputs: outputs, errors: errors.map(function (e) { - return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); + return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) }; } diff --git a/tests/baselines/reference/APISample_transform.types b/tests/baselines/reference/APISample_transform.types index 5d39868e610..9b0d01d3959 100644 --- a/tests/baselines/reference/APISample_transform.types +++ b/tests/baselines/reference/APISample_transform.types @@ -177,7 +177,7 @@ function transform(contents: string, compilerOptions: ts.CompilerOptions = {}) { >diagnostics : ts.Diagnostic[] return { ->{ outputs: outputs, errors: errors.map(function (e) { return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) } : { outputs: any[]; errors: string[]; } +>{ outputs: outputs, errors: errors.map(function (e) { return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) } : { outputs: any[]; errors: string[]; } outputs: outputs, >outputs : any[] @@ -185,30 +185,32 @@ function transform(contents: string, compilerOptions: ts.CompilerOptions = {}) { errors: errors.map(function (e) { >errors : string[] ->errors.map(function (e) { return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) : string[] +>errors.map(function (e) { return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) : string[] >errors.map : (callbackfn: (value: ts.Diagnostic, index: number, array: ts.Diagnostic[]) => U, thisArg?: any) => U[] >errors : ts.Diagnostic[] >map : (callbackfn: (value: ts.Diagnostic, index: number, array: ts.Diagnostic[]) => U, thisArg?: any) => U[] ->function (e) { return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); } : (e: ts.Diagnostic) => string +>function (e) { return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); } : (e: ts.Diagnostic) => string >e : ts.Diagnostic - return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " ->e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL) : string ->e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " : string ->e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line : string + return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " +>e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL) : string +>e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " : string +>e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) : string >e.file.fileName + "(" : string >e.file.fileName : string >e.file : ts.SourceFile >e : ts.Diagnostic >file : ts.SourceFile >fileName : string ->e.file.getLineAndCharacterFromPosition(e.start).line : number ->e.file.getLineAndCharacterFromPosition(e.start) : ts.LineAndCharacter ->e.file.getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>(e.file.getLineAndCharacterOfPosition(e.start).line + 1) : number +>e.file.getLineAndCharacterOfPosition(e.start).line + 1 : number +>e.file.getLineAndCharacterOfPosition(e.start).line : number +>e.file.getLineAndCharacterOfPosition(e.start) : ts.LineAndCharacter +>e.file.getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >e.file : ts.SourceFile >e : ts.Diagnostic >file : ts.SourceFile ->getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >e.start : number >e : ts.Diagnostic >start : number @@ -4464,15 +4466,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionOfLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionOfLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4482,8 +4484,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4494,8 +4496,8 @@ declare module "typescript" { >character : number }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -4831,16 +4833,16 @@ declare module "typescript" { >getNamedDeclarations : () => Declaration[] >Declaration : Declaration - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; ->getLineAndCharacterFromPosition : (pos: number) => LineAndCharacter + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (pos: number) => LineAndCharacter >pos : number >LineAndCharacter : LineAndCharacter getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number + getPositionOfLineAndCharacter(line: number, character: number): number; +>getPositionOfLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/baselines/reference/APISample_watcher.js b/tests/baselines/reference/APISample_watcher.js index 0ab43d3f64f..2f2a66ea329 100644 --- a/tests/baselines/reference/APISample_watcher.js +++ b/tests/baselines/reference/APISample_watcher.js @@ -87,8 +87,8 @@ function watch(rootFileNames: string[], options: ts.CompilerOptions) { allDiagnostics.forEach(diagnostic => { if (diagnostic.file) { - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); - console.log(` Error ${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + console.log(` Error ${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); } else { console.log(` Error: ${diagnostic.messageText}`); @@ -1453,14 +1453,14 @@ declare module "typescript" { } function tokenToString(t: SyntaxKind): string; function computeLineStarts(text: string): number[]; - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; function getLineStarts(sourceFile: SourceFile): number[]; - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { line: number; character: number; }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; function isWhiteSpace(ch: number): boolean; function isLineBreak(ch: number): boolean; function isOctalDigit(ch: number): boolean; @@ -1538,9 +1538,9 @@ declare module "typescript" { scriptSnapshot: IScriptSnapshot; nameTable: Map; getNamedDeclarations(): Declaration[]; - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; getLineStarts(): number[]; - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; + getPositionOfLineAndCharacter(line: number, character: number): number; update(newText: string, textChangeRange: TextChangeRange): SourceFile; } /** @@ -2065,8 +2065,8 @@ function watch(rootFileNames, options) { var allDiagnostics = services.getCompilerOptionsDiagnostics().concat(services.getSyntacticDiagnostics(fileName)).concat(services.getSemanticDiagnostics(fileName)); allDiagnostics.forEach(function (diagnostic) { if (diagnostic.file) { - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); - console.log(" Error " + diagnostic.file.fileName + " (" + lineChar.line + "," + lineChar.character + "): " + ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + console.log(" Error " + diagnostic.file.fileName + " (" + (lineChar.line + 1) + "," + (lineChar.character + 1) + "): " + ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")); } else { console.log(" Error: " + diagnostic.messageText); diff --git a/tests/baselines/reference/APISample_watcher.types b/tests/baselines/reference/APISample_watcher.types index 824ca033f2b..e42ab4c6bc5 100644 --- a/tests/baselines/reference/APISample_watcher.types +++ b/tests/baselines/reference/APISample_watcher.types @@ -317,11 +317,11 @@ function watch(rootFileNames: string[], options: ts.CompilerOptions) { >fileName : string allDiagnostics.forEach(diagnostic => { ->allDiagnostics.forEach(diagnostic => { if (diagnostic.file) { var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); console.log(` Error ${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); } else { console.log(` Error: ${diagnostic.messageText}`); } }) : void +>allDiagnostics.forEach(diagnostic => { if (diagnostic.file) { var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); console.log(` Error ${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); } else { console.log(` Error: ${diagnostic.messageText}`); } }) : void >allDiagnostics.forEach : (callbackfn: (value: ts.Diagnostic, index: number, array: ts.Diagnostic[]) => void, thisArg?: any) => void >allDiagnostics : ts.Diagnostic[] >forEach : (callbackfn: (value: ts.Diagnostic, index: number, array: ts.Diagnostic[]) => void, thisArg?: any) => void ->diagnostic => { if (diagnostic.file) { var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); console.log(` Error ${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); } else { console.log(` Error: ${diagnostic.messageText}`); } } : (diagnostic: ts.Diagnostic) => void +>diagnostic => { if (diagnostic.file) { var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); console.log(` Error ${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); } else { console.log(` Error: ${diagnostic.messageText}`); } } : (diagnostic: ts.Diagnostic) => void >diagnostic : ts.Diagnostic if (diagnostic.file) { @@ -329,20 +329,20 @@ function watch(rootFileNames: string[], options: ts.CompilerOptions) { >diagnostic : ts.Diagnostic >file : ts.SourceFile - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); >lineChar : ts.LineAndCharacter ->diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start) : ts.LineAndCharacter ->diagnostic.file.getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start) : ts.LineAndCharacter +>diagnostic.file.getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >diagnostic.file : ts.SourceFile >diagnostic : ts.Diagnostic >file : ts.SourceFile ->getLineAndCharacterFromPosition : (pos: number) => ts.LineAndCharacter +>getLineAndCharacterOfPosition : (pos: number) => ts.LineAndCharacter >diagnostic.start : number >diagnostic : ts.Diagnostic >start : number - console.log(` Error ${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); ->console.log(` Error ${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`) : any + console.log(` Error ${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); +>console.log(` Error ${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`) : any >console.log : any >console : any >log : any @@ -351,9 +351,11 @@ function watch(rootFileNames: string[], options: ts.CompilerOptions) { >diagnostic : ts.Diagnostic >file : ts.SourceFile >fileName : string +>lineChar.line + 1 : number >lineChar.line : number >lineChar : ts.LineAndCharacter >line : number +>lineChar.character + 1 : number >lineChar.character : number >lineChar : ts.LineAndCharacter >character : number @@ -4637,15 +4639,15 @@ declare module "typescript" { >computeLineStarts : (text: string) => number[] >text : string - function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number + function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number; +>getPositionOfLineAndCharacter : (sourceFile: SourceFile, line: number, character: number) => number >sourceFile : SourceFile >SourceFile : SourceFile >line : number >character : number - function computePositionFromOneBasedLineAndCharacter(lineStarts: number[], line: number, character: number): number; ->computePositionFromOneBasedLineAndCharacter : (lineStarts: number[], line: number, character: number) => number + function computePositionOfLineAndCharacter(lineStarts: number[], line: number, character: number): number; +>computePositionOfLineAndCharacter : (lineStarts: number[], line: number, character: number) => number >lineStarts : number[] >line : number >character : number @@ -4655,8 +4657,8 @@ declare module "typescript" { >sourceFile : SourceFile >SourceFile : SourceFile - function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number): { ->computeOneBasedLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } + function computeLineAndCharacterOfPosition(lineStarts: number[], position: number): { +>computeLineAndCharacterOfPosition : (lineStarts: number[], position: number) => { line: number; character: number; } >lineStarts : number[] >position : number @@ -4667,8 +4669,8 @@ declare module "typescript" { >character : number }; - function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; ->getOneBasedLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter + function getLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (sourceFile: SourceFile, position: number) => LineAndCharacter >sourceFile : SourceFile >SourceFile : SourceFile >position : number @@ -5004,16 +5006,16 @@ declare module "typescript" { >getNamedDeclarations : () => Declaration[] >Declaration : Declaration - getLineAndCharacterFromPosition(pos: number): LineAndCharacter; ->getLineAndCharacterFromPosition : (pos: number) => LineAndCharacter + getLineAndCharacterOfPosition(pos: number): LineAndCharacter; +>getLineAndCharacterOfPosition : (pos: number) => LineAndCharacter >pos : number >LineAndCharacter : LineAndCharacter getLineStarts(): number[]; >getLineStarts : () => number[] - getPositionFromOneBasedLineAndCharacter(line: number, character: number): number; ->getPositionFromOneBasedLineAndCharacter : (line: number, character: number) => number + getPositionOfLineAndCharacter(line: number, character: number): number; +>getPositionOfLineAndCharacter : (line: number, character: number) => number >line : number >character : number diff --git a/tests/cases/compiler/APISample_compile.ts b/tests/cases/compiler/APISample_compile.ts index 50ec02ab6f3..f1703835380 100644 --- a/tests/cases/compiler/APISample_compile.ts +++ b/tests/cases/compiler/APISample_compile.ts @@ -21,8 +21,8 @@ export function compile(fileNames: string[], options: ts.CompilerOptions): void var allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics); allDiagnostics.forEach(diagnostic => { - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); - console.log(`${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + console.log(`${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL)}`); }); var exitCode = emitResult.emitSkipped ? 1 : 0; diff --git a/tests/cases/compiler/APISample_linter.ts b/tests/cases/compiler/APISample_linter.ts index c95d6273d4e..30c57b6e451 100644 --- a/tests/cases/compiler/APISample_linter.ts +++ b/tests/cases/compiler/APISample_linter.ts @@ -51,8 +51,8 @@ export function delint(sourceFile: ts.SourceFile) { } function report(node: ts.Node, message: string) { - var lineChar = sourceFile.getLineAndCharacterFromPosition(node.getStart()); - console.log(`${sourceFile.fileName} (${lineChar.line},${lineChar.character}): ${message}`) + var lineChar = sourceFile.getLineAndCharacterOfPosition(node.getStart()); + console.log(`${sourceFile.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${message}`) } } diff --git a/tests/cases/compiler/APISample_transform.ts b/tests/cases/compiler/APISample_transform.ts index e9d9a46d286..438b9520010 100644 --- a/tests/cases/compiler/APISample_transform.ts +++ b/tests/cases/compiler/APISample_transform.ts @@ -54,7 +54,7 @@ function transform(contents: string, compilerOptions: ts.CompilerOptions = {}) { return { outputs: outputs, errors: errors.map(function (e) { - return e.file.fileName + "(" + e.file.getLineAndCharacterFromPosition(e.start).line + "): " + return e.file.fileName + "(" + (e.file.getLineAndCharacterOfPosition(e.start).line + 1) + "): " + ts.flattenDiagnosticMessageText(e.messageText, os.EOL); }) }; diff --git a/tests/cases/compiler/APISample_watcher.ts b/tests/cases/compiler/APISample_watcher.ts index 212f83b3935..3b1c83419bf 100644 --- a/tests/cases/compiler/APISample_watcher.ts +++ b/tests/cases/compiler/APISample_watcher.ts @@ -87,8 +87,8 @@ function watch(rootFileNames: string[], options: ts.CompilerOptions) { allDiagnostics.forEach(diagnostic => { if (diagnostic.file) { - var lineChar = diagnostic.file.getLineAndCharacterFromPosition(diagnostic.start); - console.log(` Error ${diagnostic.file.fileName} (${lineChar.line},${lineChar.character}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); + var lineChar = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); + console.log(` Error ${diagnostic.file.fileName} (${lineChar.line + 1},${lineChar.character + 1}): ${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}`); } else { console.log(` Error: ${diagnostic.messageText}`); From cdc1b90e42226428c9d6134799c281a50876ab5d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Mon, 16 Feb 2015 20:10:07 -0800 Subject: [PATCH 21/22] Fix function name. --- src/compiler/emitter.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6fafe9c65fb..b847e0a06bb 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -133,14 +133,14 @@ module ts { }; } - function getBasedLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { + function getLineOfLocalPosition(currentSourceFile: SourceFile, pos: number) { return getLineAndCharacterOfPosition(currentSourceFile, pos).line; } function emitNewLineBeforeLeadingComments(currentSourceFile: SourceFile, writer: EmitTextWriter, node: TextRange, leadingComments: CommentRange[]) { // If the leading comments start on different line than the start of node, write new line if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos && - getBasedLineOfLocalPosition(currentSourceFile, node.pos) !== getBasedLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { + getLineOfLocalPosition(currentSourceFile, node.pos) !== getLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) { writer.writeLine(); } } @@ -2979,13 +2979,13 @@ module ts { } function isOnSameLine(node1: Node, node2: Node) { - return getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === - getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node1.pos)) === + getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function nodeEndIsOnSameLineAsNodeStart(node1: Node, node2: Node) { - return getBasedLineOfLocalPosition(currentSourceFile, node1.end) === - getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); + return getLineOfLocalPosition(currentSourceFile, node1.end) === + getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node2.pos)); } function emitCaseOrDefaultClause(node: CaseOrDefaultClause) { @@ -4476,8 +4476,8 @@ module ts { forEach(leadingComments, comment => { if (lastComment) { - var lastCommentLine = getBasedLineOfLocalPosition(currentSourceFile, lastComment.end); - var commentLine = getBasedLineOfLocalPosition(currentSourceFile, comment.pos); + var lastCommentLine = getLineOfLocalPosition(currentSourceFile, lastComment.end); + var commentLine = getLineOfLocalPosition(currentSourceFile, comment.pos); if (commentLine >= lastCommentLine + 2) { // There was a blank line between the last comment and this comment. This @@ -4495,8 +4495,8 @@ module ts { // All comments look like they could have been part of the copyright header. Make // sure there is at least one blank line between it and the node. If not, it's not // a copyright header. - var lastCommentLine = getBasedLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); - var nodeLine = getBasedLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); + var lastCommentLine = getLineOfLocalPosition(currentSourceFile, detachedComments[detachedComments.length - 1].end); + var nodeLine = getLineOfLocalPosition(currentSourceFile, skipTrivia(currentSourceFile.text, node.pos)); if (nodeLine >= lastCommentLine + 2) { // Valid detachedComments emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments); From 990bbb2dce862eb536bebdad663fdd2c94deda90 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Thu, 19 Feb 2015 15:52:37 -0800 Subject: [PATCH 22/22] CR feedback to use template strings. --- src/compiler/tsc.ts | 4 ++-- src/compiler/utilities.ts | 2 +- src/harness/fourslash.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 68e85d3f71d..a3755650aed 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -88,11 +88,11 @@ module ts { if (diagnostic.file) { var loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); - output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): "; + output += `${ diagnostic.file.fileName }(${ loc.line + 1 },${ loc.character + 1 }): `; } var category = DiagnosticCategory[diagnostic.category].toLowerCase(); - output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) + sys.newLine; + output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; sys.write(output); } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6b336544eba..6a85a5d7a78 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -114,7 +114,7 @@ module ts { export function nodePosToString(node: Node): string { var file = getSourceFileOfNode(node); var loc = getLineAndCharacterOfPosition(file, node.pos); - return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")"; + return `${ file.fileName }(${ loc.line + 1 },${ loc.character + 1 })`; } export function getStartPosOfNode(node: Node): number { diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index e40a367074d..cfc5da02f88 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -396,7 +396,7 @@ module FourSlash { var lineStarts = ts.computeLineStarts(this.getFileContent(this.activeFile.fileName)); var lineCharPos = ts.computeLineAndCharacterOfPosition(lineStarts, pos); - this.scenarioActions.push(''); + this.scenarioActions.push(``); } public moveCaretRight(count = 1) {