Skip to content

Commit 11a9df2

Browse files
Expose zero-based helpers that code will be able to call.
1 parent 78cfbb6 commit 11a9df2

9 files changed

Lines changed: 52 additions & 39 deletions

File tree

src/compiler/scanner.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,10 @@ module ts {
278278
return result;
279279
}
280280

281+
export function getPositionFromZeroBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number {
282+
return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line + 1, character + 1);
283+
}
284+
281285
export function getPositionFromOneBasedLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number {
282286
return computePositionFromOneBasedLineAndCharacter(getLineStarts(sourceFile), line, character);
283287
}
@@ -291,6 +295,11 @@ module ts {
291295
return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text));
292296
}
293297

298+
export function computeZeroBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) {
299+
var oneBased = computeOneBasedLineAndCharacterOfPosition(lineStarts, position);
300+
return { line: oneBased.line - 1, character: oneBased.character -1 };
301+
}
302+
294303
export function computeOneBasedLineAndCharacterOfPosition(lineStarts: number[], position: number) {
295304
var lineNumber = binarySearch(lineStarts, position);
296305
if (lineNumber < 0) {
@@ -306,6 +315,10 @@ module ts {
306315
};
307316
}
308317

318+
export function getZeroBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter {
319+
return computeZeroBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
320+
}
321+
309322
export function getOneBasedLineAndCharacterOfPosition(sourceFile: SourceFile, position: number): LineAndCharacter {
310323
return computeOneBasedLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
311324
}

src/harness/harness.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ module Harness {
11841184
}
11851185

11861186
export function getMinimalDiagnostic(err: ts.Diagnostic): HarnessDiagnostic {
1187-
var errorLineInfo = err.file ? err.file.getLineAndCharacterFromPosition(err.start) : { line: 0, character: 0 };
1187+
var errorLineInfo = err.file ? err.file.getOneBasedLineAndCharacterFromPosition(err.start) : { line: 0, character: 0 };
11881188
return {
11891189
fileName: err.file && err.file.fileName,
11901190
start: err.start,

src/harness/typeWriter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class TypeWriterWalker {
8585

8686
private log(node: ts.Node, type: ts.Type): void {
8787
var actualPos = ts.skipTrivia(this.currentSourceFile.text, node.pos);
88-
var lineAndCharacter = this.currentSourceFile.getLineAndCharacterFromPosition(actualPos);
88+
var lineAndCharacter = this.currentSourceFile.getOneBasedLineAndCharacterFromPosition(actualPos);
8989
var sourceText = ts.getTextOfNodeFromSourceText(this.currentSourceFile.text, node);
9090

9191
// If we got an unknown type, we temporarily want to fall back to just pretending the name

src/services/breakpoints.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ module ts.BreakpointResolver {
1414
}
1515

1616
var tokenAtLocation = getTokenAtPosition(sourceFile, position);
17-
var lineOfPosition = sourceFile.getLineAndCharacterFromPosition(position).line;
18-
if (sourceFile.getLineAndCharacterFromPosition(tokenAtLocation.getStart()).line > lineOfPosition) {
17+
var lineOfPosition = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line;
18+
if (sourceFile.getOneBasedLineAndCharacterFromPosition(tokenAtLocation.getStart()).line > lineOfPosition) {
1919
// Get previous token if the token is returned starts on new line
2020
// eg: var x =10; |--- curser is here
2121
// var y = 10;
@@ -24,7 +24,7 @@ module ts.BreakpointResolver {
2424
tokenAtLocation = findPrecedingToken(tokenAtLocation.pos, sourceFile);
2525

2626
// Its a blank line
27-
if (!tokenAtLocation || sourceFile.getLineAndCharacterFromPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) {
27+
if (!tokenAtLocation || sourceFile.getOneBasedLineAndCharacterFromPosition(tokenAtLocation.getEnd()).line !== lineOfPosition) {
2828
return undefined;
2929
}
3030
}
@@ -42,7 +42,7 @@ module ts.BreakpointResolver {
4242
}
4343

4444
function spanInNodeIfStartsOnSameLine(node: Node, otherwiseOnNode?: Node): TextSpan {
45-
if (node && lineOfPosition === sourceFile.getLineAndCharacterFromPosition(node.getStart()).line) {
45+
if (node && lineOfPosition === sourceFile.getOneBasedLineAndCharacterFromPosition(node.getStart()).line) {
4646
return spanInNode(node);
4747
}
4848
return spanInNode(otherwiseOnNode);

src/services/formatting/formatting.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ module ts.formatting {
6767
}
6868

6969
export function formatOnEnter(position: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] {
70-
var line = sourceFile.getLineAndCharacterFromPosition(position).line;
70+
var line = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line;
7171
if (line === 1) {
7272
return [];
7373
}
@@ -100,7 +100,7 @@ module ts.formatting {
100100
export function formatSelection(start: number, end: number, sourceFile: SourceFile, rulesProvider: RulesProvider, options: FormatCodeOptions): TextChange[] {
101101
// format from the beginning of the line
102102
var span = {
103-
pos: getStartLinePositionForPosition(start, sourceFile),
103+
pos: getLineStartPositionForPosition(start, sourceFile),
104104
end: end
105105
};
106106
return formatSpan(span, sourceFile, options, rulesProvider, FormattingRequestKind.FormatSelection);
@@ -112,7 +112,7 @@ module ts.formatting {
112112
return [];
113113
}
114114
var span = {
115-
pos: getStartLinePositionForPosition(parent.getStart(sourceFile), sourceFile),
115+
pos: getLineStartPositionForPosition(parent.getStart(sourceFile), sourceFile),
116116
end: parent.end
117117
};
118118
return formatSpan(span, sourceFile, options, rulesProvider, requestKind);
@@ -283,7 +283,7 @@ module ts.formatting {
283283
var previousLine = Constants.Unknown;
284284
var childKind = SyntaxKind.Unknown;
285285
while (n) {
286-
var line = sourceFile.getLineAndCharacterFromPosition(n.getStart(sourceFile)).line;
286+
var line = sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile)).line;
287287
if (previousLine !== Constants.Unknown && line !== previousLine) {
288288
break;
289289
}
@@ -327,7 +327,7 @@ module ts.formatting {
327327
formattingScanner.advance();
328328

329329
if (formattingScanner.isOnToken()) {
330-
var startLine = sourceFile.getLineAndCharacterFromPosition(enclosingNode.getStart(sourceFile)).line;
330+
var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(enclosingNode.getStart(sourceFile)).line;
331331
var delta = getOwnOrInheritedDelta(enclosingNode, options, sourceFile);
332332
processNode(enclosingNode, enclosingNode, startLine, initialIndentation, delta);
333333
}
@@ -357,8 +357,8 @@ module ts.formatting {
357357
}
358358
}
359359
else {
360-
var startLine = sourceFile.getLineAndCharacterFromPosition(startPos).line;
361-
var startLinePosition = getStartLinePositionForPosition(startPos, sourceFile);
360+
var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(startPos).line;
361+
var startLinePosition = getLineStartPositionForPosition(startPos, sourceFile);
362362
var column = SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options);
363363
if (startLine !== parentStartLine || startPos === column) {
364364
return column
@@ -521,7 +521,7 @@ module ts.formatting {
521521

522522
var childStartPos = child.getStart(sourceFile);
523523

524-
var childStart = sourceFile.getLineAndCharacterFromPosition(childStartPos);
524+
var childStart = sourceFile.getOneBasedLineAndCharacterFromPosition(childStartPos);
525525

526526
// if child is a list item - try to get its indentation
527527
var childIndentationAmount = Constants.Unknown;
@@ -594,7 +594,7 @@ module ts.formatting {
594594
}
595595
else if (tokenInfo.token.kind === listStartToken) {
596596
// consume list start token
597-
startLine = sourceFile.getLineAndCharacterFromPosition(tokenInfo.token.pos).line;
597+
startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(tokenInfo.token.pos).line;
598598
var indentation =
599599
computeIndentation(tokenInfo.token, startLine, Constants.Unknown, parent, parentDynamicIndentation, startLine);
600600

@@ -641,7 +641,7 @@ module ts.formatting {
641641
var lineAdded: boolean;
642642
var isTokenInRange = rangeContainsRange(originalRange, currentTokenInfo.token);
643643

644-
var tokenStart = sourceFile.getLineAndCharacterFromPosition(currentTokenInfo.token.pos);
644+
var tokenStart = sourceFile.getOneBasedLineAndCharacterFromPosition(currentTokenInfo.token.pos);
645645
if (isTokenInRange) {
646646
var rangeHasError = rangeContainsError(currentTokenInfo.token);
647647
// save prevStartLine since processRange will overwrite this value with current ones
@@ -674,7 +674,7 @@ module ts.formatting {
674674
continue;
675675
}
676676

677-
var triviaStartLine = sourceFile.getLineAndCharacterFromPosition(triviaItem.pos).line;
677+
var triviaStartLine = sourceFile.getOneBasedLineAndCharacterFromPosition(triviaItem.pos).line;
678678
switch (triviaItem.kind) {
679679
case SyntaxKind.MultiLineCommentTrivia:
680680
var commentIndentation = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind);
@@ -712,7 +712,7 @@ module ts.formatting {
712712
for (var i = 0, len = trivia.length; i < len; ++i) {
713713
var triviaItem = trivia[i];
714714
if (isComment(triviaItem.kind) && rangeContainsRange(originalRange, triviaItem)) {
715-
var triviaItemStart = sourceFile.getLineAndCharacterFromPosition(triviaItem.pos);
715+
var triviaItemStart = sourceFile.getOneBasedLineAndCharacterFromPosition(triviaItem.pos);
716716
processRange(triviaItem, triviaItemStart, parent, contextNode, dynamicIndentation);
717717
}
718718
}
@@ -729,7 +729,7 @@ module ts.formatting {
729729
if (!rangeHasError && !previousRangeHasError) {
730730
if (!previousRange) {
731731
// trim whitespaces starting from the beginning of the span up to the current line
732-
var originalStart = sourceFile.getLineAndCharacterFromPosition(originalRange.pos);
732+
var originalStart = sourceFile.getOneBasedLineAndCharacterFromPosition(originalRange.pos);
733733
trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line);
734734
}
735735
else {
@@ -807,7 +807,7 @@ module ts.formatting {
807807
recordReplace(pos, 0, indentationString);
808808
}
809809
else {
810-
var tokenStart = sourceFile.getLineAndCharacterFromPosition(pos);
810+
var tokenStart = sourceFile.getOneBasedLineAndCharacterFromPosition(pos);
811811
if (indentation !== tokenStart.character - 1) {
812812
var startLinePosition = getStartPositionOfLine(tokenStart.line, sourceFile);
813813
recordReplace(startLinePosition, tokenStart.character - 1, indentationString);
@@ -817,8 +817,8 @@ module ts.formatting {
817817

818818
function indentMultilineComment(commentRange: TextRange, indentation: number, firstLineIsIndented: boolean) {
819819
// split comment in lines
820-
var startLine = sourceFile.getLineAndCharacterFromPosition(commentRange.pos).line;
821-
var endLine = sourceFile.getLineAndCharacterFromPosition(commentRange.end).line;
820+
var startLine = sourceFile.getOneBasedLineAndCharacterFromPosition(commentRange.pos).line;
821+
var endLine = sourceFile.getOneBasedLineAndCharacterFromPosition(commentRange.end).line;
822822

823823
if (startLine === endLine) {
824824
if (!firstLineIsIndented) {

src/services/formatting/formattingContext.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ module ts.formatting {
7171

7272
public TokensAreOnSameLine(): boolean {
7373
if (this.tokensAreOnSameLine === undefined) {
74-
var startLine = this.sourceFile.getLineAndCharacterFromPosition(this.currentTokenSpan.pos).line;
75-
var endLine = this.sourceFile.getLineAndCharacterFromPosition(this.nextTokenSpan.pos).line;
74+
var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(this.currentTokenSpan.pos).line;
75+
var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(this.nextTokenSpan.pos).line;
7676
this.tokensAreOnSameLine = (startLine == endLine);
7777
}
7878

@@ -96,17 +96,17 @@ module ts.formatting {
9696
}
9797

9898
private NodeIsOnOneLine(node: Node): boolean {
99-
var startLine = this.sourceFile.getLineAndCharacterFromPosition(node.getStart(this.sourceFile)).line;
100-
var endLine = this.sourceFile.getLineAndCharacterFromPosition(node.getEnd()).line;
99+
var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(node.getStart(this.sourceFile)).line;
100+
var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(node.getEnd()).line;
101101
return startLine == endLine;
102102
}
103103

104104
private BlockIsOnOneLine(node: Node): boolean {
105105
var openBrace = findChildOfKind(node, SyntaxKind.OpenBraceToken, this.sourceFile);
106106
var closeBrace = findChildOfKind(node, SyntaxKind.CloseBraceToken, this.sourceFile);
107107
if (openBrace && closeBrace) {
108-
var startLine = this.sourceFile.getLineAndCharacterFromPosition(openBrace.getEnd()).line;
109-
var endLine = this.sourceFile.getLineAndCharacterFromPosition(closeBrace.getStart(this.sourceFile)).line;
108+
var startLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(openBrace.getEnd()).line;
109+
var endLine = this.sourceFile.getOneBasedLineAndCharacterFromPosition(closeBrace.getStart(this.sourceFile)).line;
110110
return startLine === endLine;
111111
}
112112
return false;

src/services/formatting/smartIndenter.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module ts.formatting {
2424
return 0;
2525
}
2626

27-
var lineAtPosition = sourceFile.getLineAndCharacterFromPosition(position).line;
27+
var lineAtPosition = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line;
2828

2929
if (precedingToken.kind === SyntaxKind.CommaToken && precedingToken.parent.kind !== SyntaxKind.BinaryExpression) {
3030
// 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 {
7474
}
7575

7676
export function getIndentationForNode(n: Node, ignoreActualIndentationRange: TextRange, sourceFile: SourceFile, options: FormatCodeOptions): number {
77-
var start = sourceFile.getLineAndCharacterFromPosition(n.getStart(sourceFile));
77+
var start = sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile));
7878
return getIndentationForNodeWorker(n, start, ignoreActualIndentationRange, /*indentationDelta*/ 0, sourceFile, options);
7979
}
8080

@@ -135,10 +135,10 @@ module ts.formatting {
135135
function getParentStart(parent: Node, child: Node, sourceFile: SourceFile): LineAndCharacter {
136136
var containingList = getContainingList(child, sourceFile);
137137
if (containingList) {
138-
return sourceFile.getLineAndCharacterFromPosition(containingList.pos);
138+
return sourceFile.getOneBasedLineAndCharacterFromPosition(containingList.pos);
139139
}
140140

141-
return sourceFile.getLineAndCharacterFromPosition(parent.getStart(sourceFile));
141+
return sourceFile.getOneBasedLineAndCharacterFromPosition(parent.getStart(sourceFile));
142142
}
143143

144144
/*
@@ -204,7 +204,7 @@ module ts.formatting {
204204
}
205205

206206
function getStartLineAndCharacterForNode(n: Node, sourceFile: SourceFile): LineAndCharacter {
207-
return sourceFile.getLineAndCharacterFromPosition(n.getStart(sourceFile));
207+
return sourceFile.getOneBasedLineAndCharacterFromPosition(n.getStart(sourceFile));
208208
}
209209

210210
function positionBelongsToNode(candidate: Node, position: number, sourceFile: SourceFile): boolean {
@@ -292,7 +292,7 @@ module ts.formatting {
292292
continue;
293293
}
294294
// skip list items that ends on the same line with the current list element
295-
var prevEndLine = sourceFile.getLineAndCharacterFromPosition(list[i].end).line;
295+
var prevEndLine = sourceFile.getOneBasedLineAndCharacterFromPosition(list[i].end).line;
296296
if (prevEndLine !== lineAndCharacter.line) {
297297
return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options);
298298
}

src/services/services.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module ts {
6161
scriptSnapshot: IScriptSnapshot;
6262
nameTable: Map<string>;
6363
getNamedDeclarations(): Declaration[];
64-
getLineAndCharacterFromPosition(pos: number): LineAndCharacter;
64+
getOneBasedLineAndCharacterFromPosition(pos: number): LineAndCharacter;
6565
getLineStarts(): number[];
6666
getPositionFromOneBasedLineAndCharacter(line: number, character: number): number;
6767
update(newText: string, textChangeRange: TextChangeRange): SourceFile;
@@ -612,7 +612,7 @@ module ts {
612612
}
613613

614614
if (paramHelpStringMargin === undefined) {
615-
paramHelpStringMargin = sourceFile.getLineAndCharacterFromPosition(firstLineParamHelpStringPos).character - 1;
615+
paramHelpStringMargin = sourceFile.getOneBasedLineAndCharacterFromPosition(firstLineParamHelpStringPos).character - 1;
616616
}
617617

618618
// Now consume white spaces max
@@ -750,7 +750,7 @@ module ts {
750750
return updateSourceFile(this, newText, textChangeRange);
751751
}
752752

753-
public getLineAndCharacterFromPosition(position: number): LineAndCharacter {
753+
public getOneBasedLineAndCharacterFromPosition(position: number): LineAndCharacter {
754754
return getOneBasedLineAndCharacterOfPosition(this, position);
755755
}
756756

src/services/utilities.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ module ts {
3737
return sourceFile.getLineStarts()[line - 1];
3838
}
3939

40-
export function getStartLinePositionForPosition(position: number, sourceFile: SourceFile): number {
40+
export function getLineStartPositionForPosition(position: number, sourceFile: SourceFile): number {
4141
var lineStarts = sourceFile.getLineStarts();
42-
var line = sourceFile.getLineAndCharacterFromPosition(position).line;
42+
var line = sourceFile.getOneBasedLineAndCharacterFromPosition(position).line;
4343
return lineStarts[line - 1];
4444
}
4545

0 commit comments

Comments
 (0)