diff --git a/src/harness/fourslashImpl.ts b/src/harness/fourslashImpl.ts index 1f5f83fb8ff..aff225aec80 100644 --- a/src/harness/fourslashImpl.ts +++ b/src/harness/fourslashImpl.ts @@ -3766,7 +3766,8 @@ export class TestState { public verifyNavigateTo(options: readonly FourSlashInterface.VerifyNavigateToOptions[]): void { for (const { pattern, expected, fileName } of options) { - const items = this.languageService.getNavigateToItems(pattern, /*maxResultCount*/ undefined, fileName); + const file = fileName && this.findFile(fileName).fileName; + const items = this.languageService.getNavigateToItems(pattern, /*maxResultCount*/ undefined, file); this.assertObjectsEqual( items, expected.map((e): ts.NavigateToItem => ({ diff --git a/src/services/patternMatcher.ts b/src/services/patternMatcher.ts index 7409dc5f3c6..e3394439757 100644 --- a/src/services/patternMatcher.ts +++ b/src/services/patternMatcher.ts @@ -121,6 +121,15 @@ export function createPatternMatcher(pattern: string): PatternMatcher | undefine const stringToWordSpans = new Map(); const dotSeparatedSegments = pattern.trim().split(".").map(p => createSegment(p.trim())); + + // The pattern is an empty string, and it matches everything. + if (dotSeparatedSegments.length === 1 && dotSeparatedSegments[0].totalTextChunk.text === "") { + return { + getMatchForLastSegmentOfPattern: () => createPatternMatch(PatternMatchKind.substring, /*isCaseSensitive*/ true), + getFullMatch: () => createPatternMatch(PatternMatchKind.substring, /*isCaseSensitive*/ true), + patternContainsDots: false, + }; + } // A segment is considered invalid if we couldn't find any words in it. if (dotSeparatedSegments.some(segment => !segment.subWordTextChunks.length)) return undefined; diff --git a/src/testRunner/unittests/services/patternMatcher.ts b/src/testRunner/unittests/services/patternMatcher.ts index d48dd97220b..8fc1e390157 100644 --- a/src/testRunner/unittests/services/patternMatcher.ts +++ b/src/testRunner/unittests/services/patternMatcher.ts @@ -248,14 +248,6 @@ describe("unittests:: services:: PatternMatcher", () => { assertSegmentMatch("AddMetadataReference", "AMRe", { kind: ts.PatternMatchKind.camelCase, isCaseSensitive: true }); }); - it("BlankPattern", () => { - assertInvalidPattern(""); - }); - - it("WhitespaceOnlyPattern", () => { - assertInvalidPattern(" "); - }); - it("EachWordSeparately1", () => { assertSegmentMatch("AddMetadataReference", "add Meta", { kind: ts.PatternMatchKind.prefix, isCaseSensitive: false }); }); @@ -324,10 +316,6 @@ describe("unittests:: services:: PatternMatcher", () => { assert.deepEqual(ts.createPatternMatcher(pattern)!.getMatchForLastSegmentOfPattern(candidate), expected); } - function assertInvalidPattern(pattern: string) { - assert.equal(ts.createPatternMatcher(pattern), undefined); - } - function assertFullMatch(dottedContainer: string, candidate: string, pattern: string, expected: ts.PatternMatch | undefined): void { assert.deepEqual(ts.createPatternMatcher(pattern)!.getFullMatch(dottedContainer.split("."), candidate), expected); } diff --git a/tests/cases/fourslash/declareFunction.ts b/tests/cases/fourslash/declareFunction.ts index 8b9b18093b7..7c3015508bc 100644 --- a/tests/cases/fourslash/declareFunction.ts +++ b/tests/cases/fourslash/declareFunction.ts @@ -1,5 +1,6 @@ /// +// @filename: index.ts ////declare function -verify.navigateTo({ pattern: "", expected: [] }); +verify.navigateTo({ pattern: "", fileName: "index.ts", expected: [] }); diff --git a/tests/cases/fourslash/incorrectJsDocObjectLiteralType.ts b/tests/cases/fourslash/incorrectJsDocObjectLiteralType.ts index 7932f42e827..dee82fd1f35 100644 --- a/tests/cases/fourslash/incorrectJsDocObjectLiteralType.ts +++ b/tests/cases/fourslash/incorrectJsDocObjectLiteralType.ts @@ -3,7 +3,7 @@ // @Filename: /a.ts //// -verify.navigateTo({ pattern: "", expected: [] }); +verify.navigateTo({ pattern: "", fileName: "/a.ts", expected: [] }); edit.insert("/**\n * @typedef {Object} foo\n * @property {any} [obj]\n */\nexport default function foo() {\n}"); verify.navigateTo({ pattern: "foo", diff --git a/tests/cases/fourslash/navto_emptyPattern.ts b/tests/cases/fourslash/navto_emptyPattern.ts new file mode 100644 index 00000000000..dce4c9ba30f --- /dev/null +++ b/tests/cases/fourslash/navto_emptyPattern.ts @@ -0,0 +1,25 @@ +/// + +// @filename: foo.ts +//// const [|x: number = 1|]; +//// [|function y(x: string): string { return x; }|] + + +const [x, y] = test.ranges(); + +verify.navigateTo({ + pattern: "", + fileName: "foo.ts", + expected: [{ + name: "x", + kind: "const", + range: x, + matchKind: "substring", + }, + { + name: "y", + kind: "function", + range: y, + matchKind: "substring", + }], +}); \ No newline at end of file