Simplify TextSpan creation (#21306)
* Simplify TextSpan creation * Rename 'start' to 'pos' where possible
This commit is contained in:
parent
37f15ccb41
commit
16f3b93ffd
|
@ -64,7 +64,7 @@ namespace FourSlash {
|
|||
|
||||
export interface Range {
|
||||
fileName: string;
|
||||
start: number;
|
||||
pos: number;
|
||||
end: number;
|
||||
marker?: Marker;
|
||||
}
|
||||
|
@ -710,9 +710,9 @@ namespace FourSlash {
|
|||
if (!range) {
|
||||
this.raiseError(`goToDefinitionsAndBoundSpan failed - found a TextSpan ${JSON.stringify(defs.textSpan)} when it wasn't expected.`);
|
||||
}
|
||||
else if (defs.textSpan.start !== range.start || defs.textSpan.length !== range.end - range.start) {
|
||||
else if (defs.textSpan.start !== range.pos || defs.textSpan.length !== range.end - range.pos) {
|
||||
const expected: ts.TextSpan = {
|
||||
start: range.start, length: range.end - range.start
|
||||
start: range.pos, length: range.end - range.pos
|
||||
};
|
||||
this.raiseError(`goToDefinitionsAndBoundSpan failed - expected to find TextSpan ${JSON.stringify(expected)} but got ${JSON.stringify(defs.textSpan)}`);
|
||||
}
|
||||
|
@ -855,7 +855,7 @@ namespace FourSlash {
|
|||
if (completion.insertText !== insertText) {
|
||||
this.raiseError(`Expected completion insert text at index ${index} to be ${insertText}, got ${completion.insertText}`);
|
||||
}
|
||||
const convertedReplacementSpan = replacementSpan && textSpanFromRange(replacementSpan);
|
||||
const convertedReplacementSpan = replacementSpan && ts.createTextSpanFromRange(replacementSpan);
|
||||
try {
|
||||
assert.deepEqual(completion.replacementSpan, convertedReplacementSpan);
|
||||
}
|
||||
|
@ -1002,8 +1002,8 @@ namespace FourSlash {
|
|||
private verifyRange(desc: string, expected: Range, actual: ts.Node) {
|
||||
const actualStart = actual.getStart();
|
||||
const actualEnd = actual.getEnd();
|
||||
if (actualStart !== expected.start || actualEnd !== expected.end) {
|
||||
this.raiseError(`${desc} should be ${expected.start}-${expected.end}, got ${actualStart}-${actualEnd}`);
|
||||
if (actualStart !== expected.pos || actualEnd !== expected.end) {
|
||||
this.raiseError(`${desc} should be ${expected.pos}-${expected.end}, got ${actualStart}-${actualEnd}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1053,7 +1053,7 @@ namespace FourSlash {
|
|||
if (actualReferences.length > expectedReferences.length) {
|
||||
// Find the unaccounted-for reference.
|
||||
for (const actual of actualReferences) {
|
||||
if (!ts.forEach(expectedReferences, r => r.start === actual.textSpan.start)) {
|
||||
if (!ts.forEach(expectedReferences, r => r.pos === actual.textSpan.start)) {
|
||||
this.raiseError(`A reference ${stringify(actual)} is unaccounted for.`);
|
||||
}
|
||||
}
|
||||
|
@ -1062,13 +1062,13 @@ namespace FourSlash {
|
|||
}
|
||||
|
||||
for (const reference of expectedReferences) {
|
||||
const { fileName, start, end } = reference;
|
||||
const { fileName, pos, end } = reference;
|
||||
if (reference.marker && reference.marker.data) {
|
||||
const { isWriteAccess, isDefinition } = reference.marker.data as { isWriteAccess?: boolean, isDefinition?: boolean };
|
||||
this.verifyReferencesWorker(actualReferences, fileName, start, end, isWriteAccess, isDefinition);
|
||||
this.verifyReferencesWorker(actualReferences, fileName, pos, end, isWriteAccess, isDefinition);
|
||||
}
|
||||
else {
|
||||
this.verifyReferencesWorker(actualReferences, fileName, start, end);
|
||||
this.verifyReferencesWorker(actualReferences, fileName, pos, end);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1092,14 +1092,14 @@ namespace FourSlash {
|
|||
references: ts.ReferenceEntry[];
|
||||
}
|
||||
const fullExpected = ts.map<FourSlashInterface.ReferenceGroup, ReferenceGroupJson>(parts, ({ definition, ranges }) => ({
|
||||
definition: typeof definition === "string" ? definition : { ...definition, range: textSpanFromRange(definition.range) },
|
||||
definition: typeof definition === "string" ? definition : { ...definition, range: ts.createTextSpanFromRange(definition.range) },
|
||||
references: ranges.map<ts.ReferenceEntry>(r => {
|
||||
const { isWriteAccess = false, isDefinition = false, isInString } = (r.marker && r.marker.data || {}) as { isWriteAccess?: boolean, isDefinition?: boolean, isInString?: true };
|
||||
return {
|
||||
isWriteAccess,
|
||||
isDefinition,
|
||||
fileName: r.fileName,
|
||||
textSpan: textSpanFromRange(r),
|
||||
textSpan: ts.createTextSpanFromRange(r),
|
||||
...(isInString ? { isInString: true } : undefined),
|
||||
};
|
||||
}),
|
||||
|
@ -1280,7 +1280,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
assert.equal(actualQuickInfoDocumentation, expectedDocumentation || "", this.assertionMessageAtLastKnownMarker("quick info doc"));
|
||||
}
|
||||
|
||||
public verifyQuickInfoDisplayParts(kind: string, kindModifiers: string, textSpan: { start: number; length: number; },
|
||||
public verifyQuickInfoDisplayParts(kind: string, kindModifiers: string, textSpan: TextSpan,
|
||||
displayParts: ts.SymbolDisplayPart[],
|
||||
documentation: ts.SymbolDisplayPart[],
|
||||
tags: ts.JSDocTagInfo[]
|
||||
|
@ -1346,11 +1346,11 @@ Actual: ${stringify(fullActual)}`);
|
|||
this.raiseError("Rename location count does not match result.\n\nExpected: " + stringify(ranges) + "\n\nActual:" + stringify(references));
|
||||
}
|
||||
|
||||
ranges = ranges.sort((r1, r2) => r1.start - r2.start);
|
||||
ranges = ranges.sort((r1, r2) => r1.pos - r2.pos);
|
||||
references = references.sort((r1, r2) => r1.textSpan.start - r2.textSpan.start);
|
||||
|
||||
ts.zipWith(references, ranges, (reference, range) => {
|
||||
if (reference.textSpan.start !== range.start || ts.textSpanEnd(reference.textSpan) !== range.end) {
|
||||
if (reference.textSpan.start !== range.pos || ts.textSpanEnd(reference.textSpan) !== range.end) {
|
||||
this.raiseError("Rename location results do not match.\n\nExpected: " + stringify(ranges) + "\n\nActual:" + stringify(references));
|
||||
}
|
||||
});
|
||||
|
@ -1473,9 +1473,9 @@ Actual: ${stringify(fullActual)}`);
|
|||
}
|
||||
|
||||
const expectedRange = this.getRanges()[0];
|
||||
if (renameInfo.triggerSpan.start !== expectedRange.start ||
|
||||
if (renameInfo.triggerSpan.start !== expectedRange.pos ||
|
||||
ts.textSpanEnd(renameInfo.triggerSpan) !== expectedRange.end) {
|
||||
this.raiseError("Expected triggerSpan [" + expectedRange.start + "," + expectedRange.end + "). Got [" +
|
||||
this.raiseError("Expected triggerSpan [" + expectedRange.pos + "," + expectedRange.end + "). Got [" +
|
||||
renameInfo.triggerSpan.start + "," + ts.textSpanEnd(renameInfo.triggerSpan) + ") instead.");
|
||||
}
|
||||
}
|
||||
|
@ -1964,7 +1964,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
|
||||
for (const range of this.testData.ranges) {
|
||||
if (range.fileName === fileName) {
|
||||
range.start = updatePosition(range.start);
|
||||
range.pos = updatePosition(range.pos);
|
||||
range.end = updatePosition(range.end);
|
||||
}
|
||||
}
|
||||
|
@ -1999,9 +1999,9 @@ Actual: ${stringify(fullActual)}`);
|
|||
this.goToPosition(len);
|
||||
}
|
||||
|
||||
public goToRangeStart({ fileName, start }: Range) {
|
||||
public goToRangeStart({ fileName, pos }: Range) {
|
||||
this.openFile(fileName);
|
||||
this.goToPosition(start);
|
||||
this.goToPosition(pos);
|
||||
}
|
||||
|
||||
public goToTypeDefinition(definitionIndex: number) {
|
||||
|
@ -2088,9 +2088,9 @@ Actual: ${stringify(fullActual)}`);
|
|||
|
||||
const delayedErrors: string[] = [];
|
||||
for (const range of ranges) {
|
||||
const length = range.end - range.start;
|
||||
const length = range.end - range.pos;
|
||||
const matchingImpl = ts.find(implementations, impl =>
|
||||
range.fileName === impl.fileName && range.start === impl.textSpan.start && length === impl.textSpan.length);
|
||||
range.fileName === impl.fileName && range.pos === impl.textSpan.start && length === impl.textSpan.length);
|
||||
if (matchingImpl) {
|
||||
if (range.marker && range.marker.data) {
|
||||
const expected = <{ displayParts?: ts.SymbolDisplayPart[], parts: string[], kind?: string }>range.marker.data;
|
||||
|
@ -2128,7 +2128,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
if (unsatisfiedRanges.length) {
|
||||
error += "\nUnsatisfied ranges:";
|
||||
for (const range of unsatisfiedRanges) {
|
||||
error += `\n (${range.start}, ${range.end}) in ${range.fileName}: ${this.rangeText(range)}`;
|
||||
error += `\n (${range.pos}, ${range.end}) in ${range.fileName}: ${this.rangeText(range)}`;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2173,8 +2173,8 @@ Actual: ${stringify(fullActual)}`);
|
|||
return result;
|
||||
}
|
||||
|
||||
private rangeText({ fileName, start, end }: Range): string {
|
||||
return this.getFileContent(fileName).slice(start, end);
|
||||
private rangeText({ fileName, pos, end }: Range): string {
|
||||
return this.getFileContent(fileName).slice(pos, end);
|
||||
}
|
||||
|
||||
public verifyCaretAtMarker(markerName = "") {
|
||||
|
@ -2345,7 +2345,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
this.verifyClassifications(expected, actual, this.activeFile.content);
|
||||
}
|
||||
|
||||
public verifyOutliningSpans(spans: TextSpan[]) {
|
||||
public verifyOutliningSpans(spans: FourSlash.Range[]) {
|
||||
const actual = this.languageService.getOutliningSpans(this.activeFile.fileName);
|
||||
|
||||
if (actual.length !== spans.length) {
|
||||
|
@ -2353,13 +2353,13 @@ Actual: ${stringify(fullActual)}`);
|
|||
}
|
||||
|
||||
ts.zipWith(spans, actual, (expectedSpan, actualSpan, i) => {
|
||||
if (expectedSpan.start !== actualSpan.textSpan.start || expectedSpan.end !== ts.textSpanEnd(actualSpan.textSpan)) {
|
||||
this.raiseError(`verifyOutliningSpans failed - span ${(i + 1)} expected: (${expectedSpan.start},${expectedSpan.end}), actual: (${actualSpan.textSpan.start},${ts.textSpanEnd(actualSpan.textSpan)})`);
|
||||
if (expectedSpan.pos !== actualSpan.textSpan.start || expectedSpan.end !== ts.textSpanEnd(actualSpan.textSpan)) {
|
||||
this.raiseError(`verifyOutliningSpans failed - span ${(i + 1)} expected: (${expectedSpan.pos},${expectedSpan.end}), actual: (${actualSpan.textSpan.start},${ts.textSpanEnd(actualSpan.textSpan)})`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public verifyTodoComments(descriptors: string[], spans: TextSpan[]) {
|
||||
public verifyTodoComments(descriptors: string[], spans: Range[]) {
|
||||
const actual = this.languageService.getTodoComments(this.activeFile.fileName,
|
||||
descriptors.map(d => { return { text: d, priority: 0 }; }));
|
||||
|
||||
|
@ -2370,8 +2370,8 @@ Actual: ${stringify(fullActual)}`);
|
|||
ts.zipWith(spans, actual, (expectedSpan, actualComment, i) => {
|
||||
const actualCommentSpan = ts.createTextSpan(actualComment.position, actualComment.message.length);
|
||||
|
||||
if (expectedSpan.start !== actualCommentSpan.start || expectedSpan.end !== ts.textSpanEnd(actualCommentSpan)) {
|
||||
this.raiseError(`verifyOutliningSpans failed - span ${(i + 1)} expected: (${expectedSpan.start},${expectedSpan.end}), actual: (${actualCommentSpan.start},${ts.textSpanEnd(actualCommentSpan)})`);
|
||||
if (expectedSpan.pos !== actualCommentSpan.start || expectedSpan.end !== ts.textSpanEnd(actualCommentSpan)) {
|
||||
this.raiseError(`verifyOutliningSpans failed - span ${(i + 1)} expected: (${expectedSpan.pos},${expectedSpan.end}), actual: (${actualCommentSpan.start},${ts.textSpanEnd(actualCommentSpan)})`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -2830,7 +2830,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
this.goToRangeStart(r);
|
||||
this.verifyOccurrencesAtPositionListCount(ranges.length);
|
||||
for (const range of ranges) {
|
||||
this.verifyOccurrencesAtPositionListContains(range.fileName, range.start, range.end, isWriteAccess);
|
||||
this.verifyOccurrencesAtPositionListContains(range.fileName, range.pos, range.end, isWriteAccess);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2886,8 +2886,8 @@ Actual: ${stringify(fullActual)}`);
|
|||
}
|
||||
|
||||
ts.zipWith(expectedRangesInFile, spansInFile, (expectedRange, span) => {
|
||||
if (span.textSpan.start !== expectedRange.start || ts.textSpanEnd(span.textSpan) !== expectedRange.end) {
|
||||
this.raiseError(`verifyDocumentHighlights failed - span does not match, actual: ${stringify(span.textSpan)}, expected: ${expectedRange.start}--${expectedRange.end}`);
|
||||
if (span.textSpan.start !== expectedRange.pos || ts.textSpanEnd(span.textSpan) !== expectedRange.end) {
|
||||
this.raiseError(`verifyDocumentHighlights failed - span does not match, actual: ${stringify(span.textSpan)}, expected: ${expectedRange.pos}--${expectedRange.end}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -2970,7 +2970,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
throw new Error("Exactly one refactor range is allowed per test.");
|
||||
}
|
||||
|
||||
const applicableRefactors = this.languageService.getApplicableRefactors(this.activeFile.fileName, { pos: ranges[0].start, end: ranges[0].end });
|
||||
const applicableRefactors = this.languageService.getApplicableRefactors(this.activeFile.fileName, { pos: ranges[0].pos, end: ranges[0].end });
|
||||
const isAvailable = applicableRefactors && applicableRefactors.length > 0;
|
||||
if (negative && isAvailable) {
|
||||
this.raiseError(`verifyApplicableRefactorAvailableForRange failed - expected no refactor but found some.`);
|
||||
|
@ -3157,7 +3157,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
assert.equal(item.isRecommended, options && options.isRecommended, "isRecommended");
|
||||
assert.equal(item.insertText, options && options.insertText, "insertText");
|
||||
if (options && options.replacementSpan) { // TODO: GH#21679
|
||||
assert.deepEqual(item.replacementSpan, options && options.replacementSpan && textSpanFromRange(options.replacementSpan), "replacementSpan");
|
||||
assert.deepEqual(item.replacementSpan, options && options.replacementSpan && ts.createTextSpanFromRange(options.replacementSpan), "replacementSpan");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3208,7 +3208,7 @@ Actual: ${stringify(fullActual)}`);
|
|||
private getTextSpanForRangeAtIndex(index: number): ts.TextSpan {
|
||||
const ranges = this.getRanges();
|
||||
if (ranges && ranges.length > index) {
|
||||
return textSpanFromRange(ranges[index]);
|
||||
return ts.createTextSpanFromRange(ranges[index]);
|
||||
}
|
||||
else {
|
||||
this.raiseError("Supplied span index: " + index + " does not exist in range list of size: " + (ranges ? 0 : ranges.length));
|
||||
|
@ -3238,10 +3238,6 @@ Actual: ${stringify(fullActual)}`);
|
|||
}
|
||||
}
|
||||
|
||||
function textSpanFromRange(range: FourSlash.Range): ts.TextSpan {
|
||||
return ts.createTextSpanFromBounds(range.start, range.end);
|
||||
}
|
||||
|
||||
export function runFourSlashTest(basePath: string, testType: FourSlashTestType, fileName: string) {
|
||||
const content = Harness.IO.readFile(fileName);
|
||||
runFourSlashTestContent(basePath, testType, content, fileName);
|
||||
|
@ -3562,7 +3558,7 @@ ${code}
|
|||
|
||||
const range: Range = {
|
||||
fileName,
|
||||
start: rangeStart.position,
|
||||
pos: rangeStart.position,
|
||||
end: (i - 1) - difference,
|
||||
marker: rangeStart.marker
|
||||
};
|
||||
|
@ -3682,7 +3678,7 @@ ${code}
|
|||
}
|
||||
|
||||
// put ranges in the correct order
|
||||
localRanges = localRanges.sort((a, b) => a.start < b.start ? -1 : 1);
|
||||
localRanges = localRanges.sort((a, b) => a.pos < b.pos ? -1 : 1);
|
||||
localRanges.forEach((r) => { ranges.push(r); });
|
||||
|
||||
return {
|
||||
|
@ -3755,7 +3751,7 @@ namespace FourSlashInterface {
|
|||
}
|
||||
|
||||
public spans(): ts.TextSpan[] {
|
||||
return this.ranges().map(r => ts.createTextSpan(r.start, r.end - r.start));
|
||||
return this.ranges().map(r => ts.createTextSpan(r.pos, r.end - r.pos));
|
||||
}
|
||||
|
||||
public rangesByText(): ts.Map<FourSlash.Range[]> {
|
||||
|
@ -4161,7 +4157,7 @@ namespace FourSlashInterface {
|
|||
this.state.verifyCurrentNameOrDottedNameSpanText(text);
|
||||
}
|
||||
|
||||
public outliningSpansInCurrentFile(spans: FourSlash.TextSpan[]) {
|
||||
public outliningSpansInCurrentFile(spans: FourSlash.Range[]) {
|
||||
this.state.verifyOutliningSpans(spans);
|
||||
}
|
||||
|
||||
|
@ -4244,7 +4240,7 @@ namespace FourSlashInterface {
|
|||
}
|
||||
|
||||
public occurrencesAtPositionContains(range: FourSlash.Range, isWriteAccess?: boolean) {
|
||||
this.state.verifyOccurrencesAtPositionListContains(range.fileName, range.start, range.end, isWriteAccess);
|
||||
this.state.verifyOccurrencesAtPositionListContains(range.fileName, range.pos, range.end, isWriteAccess);
|
||||
}
|
||||
|
||||
public occurrencesAtPositionCount(expectedCount: number) {
|
||||
|
@ -4309,7 +4305,7 @@ namespace FourSlashInterface {
|
|||
this.state.verifyRenameLocations(startRanges, options);
|
||||
}
|
||||
|
||||
public verifyQuickInfoDisplayParts(kind: string, kindModifiers: string, textSpan: { start: number; length: number; },
|
||||
public verifyQuickInfoDisplayParts(kind: string, kindModifiers: string, textSpan: FourSlash.TextSpan,
|
||||
displayParts: ts.SymbolDisplayPart[], documentation: ts.SymbolDisplayPart[], tags: ts.JSDocTagInfo[]) {
|
||||
this.state.verifyQuickInfoDisplayParts(kind, kindModifiers, textSpan, displayParts, documentation, tags);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace ts {
|
|||
if (!selectionRange) {
|
||||
throw new Error(`Test ${s} does not specify selection range`);
|
||||
}
|
||||
const result = refactor.extractSymbol.getRangeToExtract(file, createTextSpanFromBounds(selectionRange.start, selectionRange.end));
|
||||
const result = refactor.extractSymbol.getRangeToExtract(file, createTextSpanFromRange(selectionRange));
|
||||
assert(result.targetRange === undefined, "failure expected");
|
||||
const sortedErrors = result.errors.map(e => <string>e.messageText).sort();
|
||||
assert.deepEqual(sortedErrors, expectedErrors.sort(), "unexpected errors");
|
||||
|
@ -23,19 +23,19 @@ namespace ts {
|
|||
if (!selectionRange) {
|
||||
throw new Error(`Test ${s} does not specify selection range`);
|
||||
}
|
||||
const result = refactor.extractSymbol.getRangeToExtract(f, createTextSpanFromBounds(selectionRange.start, selectionRange.end));
|
||||
const result = refactor.extractSymbol.getRangeToExtract(f, createTextSpanFromRange(selectionRange));
|
||||
const expectedRange = t.ranges.get("extracted");
|
||||
if (expectedRange) {
|
||||
let start: number, end: number;
|
||||
let pos: number, end: number;
|
||||
if (ts.isArray(result.targetRange.range)) {
|
||||
start = result.targetRange.range[0].getStart(f);
|
||||
pos = result.targetRange.range[0].getStart(f);
|
||||
end = ts.lastOrUndefined(result.targetRange.range).getEnd();
|
||||
}
|
||||
else {
|
||||
start = result.targetRange.range.getStart(f);
|
||||
pos = result.targetRange.range.getStart(f);
|
||||
end = result.targetRange.range.getEnd();
|
||||
}
|
||||
assert.equal(start, expectedRange.start, "incorrect start of range");
|
||||
assert.equal(pos, expectedRange.pos, "incorrect pos of range");
|
||||
assert.equal(end, expectedRange.end, "incorrect end of range");
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
/// <reference path="tsserverProjectSystem.ts" />
|
||||
|
||||
namespace ts {
|
||||
export interface Range {
|
||||
start: number;
|
||||
interface Range {
|
||||
pos: number;
|
||||
end: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface Test {
|
||||
interface Test {
|
||||
source: string;
|
||||
ranges: Map<Range>;
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ namespace ts {
|
|||
const name = s === e
|
||||
? source.charCodeAt(saved + 1) === CharacterCodes.hash ? "selection" : "extracted"
|
||||
: source.substring(s, e);
|
||||
activeRanges.push({ name, start: text.length, end: undefined });
|
||||
activeRanges.push({ name, pos: text.length, end: undefined });
|
||||
lastPos = pos;
|
||||
continue;
|
||||
}
|
||||
|
@ -123,12 +123,12 @@ namespace ts {
|
|||
cancellationToken: { throwIfCancellationRequested: noop, isCancellationRequested: returnFalse },
|
||||
program,
|
||||
file: sourceFile,
|
||||
startPosition: selectionRange.start,
|
||||
startPosition: selectionRange.pos,
|
||||
endPosition: selectionRange.end,
|
||||
host: notImplementedHost,
|
||||
formatContext: formatting.getFormatContext(testFormatOptions),
|
||||
};
|
||||
const rangeToExtract = refactor.extractSymbol.getRangeToExtract(sourceFile, createTextSpanFromBounds(selectionRange.start, selectionRange.end));
|
||||
const rangeToExtract = refactor.extractSymbol.getRangeToExtract(sourceFile, createTextSpanFromRange(selectionRange));
|
||||
assert.equal(rangeToExtract.errors, undefined, rangeToExtract.errors && "Range error: " + rangeToExtract.errors[0].messageText);
|
||||
const infos = refactor.extractSymbol.getAvailableActions(context);
|
||||
const actions = find(infos, info => info.description === description.message).actions;
|
||||
|
@ -186,12 +186,12 @@ namespace ts {
|
|||
cancellationToken: { throwIfCancellationRequested: noop, isCancellationRequested: returnFalse },
|
||||
program,
|
||||
file: sourceFile,
|
||||
startPosition: selectionRange.start,
|
||||
startPosition: selectionRange.pos,
|
||||
endPosition: selectionRange.end,
|
||||
host: notImplementedHost,
|
||||
formatContext: formatting.getFormatContext(testFormatOptions),
|
||||
};
|
||||
const rangeToExtract = refactor.extractSymbol.getRangeToExtract(sourceFile, createTextSpanFromBounds(selectionRange.start, selectionRange.end));
|
||||
const rangeToExtract = refactor.extractSymbol.getRangeToExtract(sourceFile, createTextSpanFromRange(selectionRange));
|
||||
assert.isUndefined(rangeToExtract.errors, rangeToExtract.errors && "Range error: " + rangeToExtract.errors[0].messageText);
|
||||
const infos = refactor.extractSymbol.getAvailableActions(context);
|
||||
assert.isUndefined(find(infos, info => info.description === description.message));
|
||||
|
|
|
@ -149,10 +149,7 @@ namespace ts.GoToDefinition {
|
|||
// Check if position is on triple slash reference.
|
||||
const comment = findReferenceInPosition(sourceFile.referencedFiles, position) || findReferenceInPosition(sourceFile.typeReferenceDirectives, position);
|
||||
if (comment) {
|
||||
return {
|
||||
definitions,
|
||||
textSpan: createTextSpanFromBounds(comment.pos, comment.end)
|
||||
};
|
||||
return { definitions, textSpan: createTextSpanFromRange(comment) };
|
||||
}
|
||||
|
||||
const node = getTouchingPropertyName(sourceFile, position, /*includeJsDocComment*/ true);
|
||||
|
@ -258,7 +255,7 @@ namespace ts.GoToDefinition {
|
|||
return createDefinitionInfo(decl, symbolKind, symbolName, containerName);
|
||||
}
|
||||
|
||||
export function findReferenceInPosition(refs: ReadonlyArray<FileReference>, pos: number): FileReference {
|
||||
export function findReferenceInPosition(refs: ReadonlyArray<FileReference>, pos: number): FileReference | undefined {
|
||||
for (const ref of refs) {
|
||||
if (ref.pos <= pos && pos <= ref.end) {
|
||||
return ref;
|
||||
|
|
|
@ -632,9 +632,7 @@ namespace ts.NavigationBar {
|
|||
}
|
||||
|
||||
function getNodeSpan(node: Node): TextSpan {
|
||||
return node.kind === SyntaxKind.SourceFile
|
||||
? createTextSpanFromBounds(node.getFullStart(), node.getEnd())
|
||||
: createTextSpanFromNode(node, curSourceFile);
|
||||
return node.kind === SyntaxKind.SourceFile ? createTextSpanFromRange(node) : createTextSpanFromNode(node, curSourceFile);
|
||||
}
|
||||
|
||||
function getModifiers(node: ts.Node): string {
|
||||
|
|
|
@ -629,7 +629,7 @@ namespace ts.textChanges {
|
|||
}
|
||||
|
||||
private computeSpan(change: Change, _sourceFile: SourceFile): TextSpan {
|
||||
return createTextSpanFromBounds(change.range.pos, change.range.end);
|
||||
return createTextSpanFromRange(change.range);
|
||||
}
|
||||
|
||||
private computeNewText(change: Change, sourceFile: SourceFile): string {
|
||||
|
|
|
@ -102,7 +102,7 @@ declare namespace FourSlashInterface {
|
|||
}
|
||||
interface Range {
|
||||
fileName: string;
|
||||
start: number;
|
||||
pos: number;
|
||||
end: number;
|
||||
marker?: Marker;
|
||||
}
|
||||
|
@ -289,7 +289,7 @@ declare namespace FourSlashInterface {
|
|||
baselineGetEmitOutput(): void;
|
||||
baselineQuickInfo(): void;
|
||||
nameOrDottedNameSpanTextIs(text: string): void;
|
||||
outliningSpansInCurrentFile(spans: TextSpan[]): void;
|
||||
outliningSpansInCurrentFile(spans: Range[]): void;
|
||||
todoCommentsInCurrentFile(descriptors: string[]): void;
|
||||
matchingBracePositionInCurrentFile(bracePosition: number, expectedMatchPosition: number): void;
|
||||
noMatchingBracePositionInCurrentFile(bracePosition: number): void;
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
////}
|
||||
////const x: Array[|<() => void>|] = [];
|
||||
|
||||
test.ranges().forEach((range) => {
|
||||
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.start);
|
||||
});
|
||||
for (const range of test.ranges()) {
|
||||
verify.matchingBracePositionInCurrentFile(range.pos, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.pos);
|
||||
}
|
||||
|
|
|
@ -4,6 +4,6 @@
|
|||
|
||||
// If there is an adjacent opening and closing brace,
|
||||
// then only the opening brace should get highlighted.
|
||||
test.ranges().forEach(range => {
|
||||
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
|
||||
});
|
||||
for (const range of test.ranges()) {
|
||||
verify.matchingBracePositionInCurrentFile(range.pos, range.end - 1);
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
//// }
|
||||
////}
|
||||
|
||||
test.ranges().forEach((range) => {
|
||||
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.start);
|
||||
});
|
||||
for (const range of test.ranges()) {
|
||||
verify.matchingBracePositionInCurrentFile(range.pos, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.pos);
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
//// }
|
||||
////}
|
||||
|
||||
test.ranges().forEach((range) => {
|
||||
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.start);
|
||||
});
|
||||
for (const range of test.ranges()) {
|
||||
verify.matchingBracePositionInCurrentFile(range.pos, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.pos);
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
//// }
|
||||
////}
|
||||
|
||||
test.ranges().forEach((range) => {
|
||||
verify.matchingBracePositionInCurrentFile(range.start, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.start);
|
||||
});
|
||||
for (const range of test.ranges()) {
|
||||
verify.matchingBracePositionInCurrentFile(range.pos, range.end - 1);
|
||||
verify.matchingBracePositionInCurrentFile(range.end - 1, range.pos);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue