From e8d59b18f319ca07b11b528ec66cd2d9e3752edf Mon Sep 17 00:00:00 2001 From: Zzzen Date: Tue, 1 Jun 2021 23:10:00 +0800 Subject: [PATCH 1/6] go-to-type-definition, and find-all-refs should work for import.meta --- src/services/findAllReferences.ts | 18 ++++++ src/services/goToDefinition.ts | 4 ++ src/services/services.ts | 5 ++ .../findAllRefsImportMeta.baseline.jsonc | 59 +++++++++++++++++++ .../reference/quickInfoImportMeta.baseline | 37 ++++++++++++ .../quickInfoImportMetaProp.baseline | 1 + .../cases/fourslash/findAllRefsImportMeta.ts | 25 ++++++++ .../fourslash/goToDefinitionImportMeta.ts | 13 ++++ .../fourslash/goToTypeDefinitionImportMeta.ts | 13 ++++ tests/cases/fourslash/quickInfoImportMeta.ts | 19 ++++++ 10 files changed, 194 insertions(+) create mode 100644 tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc create mode 100644 tests/baselines/reference/quickInfoImportMeta.baseline create mode 100644 tests/baselines/reference/quickInfoImportMetaProp.baseline create mode 100644 tests/cases/fourslash/findAllRefsImportMeta.ts create mode 100644 tests/cases/fourslash/goToDefinitionImportMeta.ts create mode 100644 tests/cases/fourslash/goToTypeDefinitionImportMeta.ts create mode 100644 tests/cases/fourslash/quickInfoImportMeta.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index cbcb270917b52..3a5368f4fe3c5 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -884,6 +884,10 @@ namespace ts.FindAllReferences { node.kind === SyntaxKind.ReadonlyKeyword ? isReadonlyTypeOperator : undefined); } + if (isImportMeta(node.parent) && node.parent.name === node) { + return getAllReferencesForImportMeta(sourceFiles, cancellationToken); + } + // Labels if (isJumpStatementTarget(node)) { const labelDefinition = getTargetLabel(node.parent, node.text); @@ -1425,6 +1429,20 @@ namespace ts.FindAllReferences { } } + function getAllReferencesForImportMeta(sourceFiles: readonly SourceFile[], cancellationToken: CancellationToken): SymbolAndEntries[] | undefined { + const references = flatMap(sourceFiles, sourceFile => { + cancellationToken.throwIfCancellationRequested(); + return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "import.meta", sourceFile), node => { + // node is the first token, `import` + const parent = node.parent; + if (isImportMeta(parent)) { + return nodeEntry(parent); + } + }); + }); + return references.length ? [{ definition: { type: DefinitionKind.Keyword, node: references[0].node }, references }] : undefined; + } + function getAllReferencesForKeyword(sourceFiles: readonly SourceFile[], keywordKind: SyntaxKind, cancellationToken: CancellationToken, filter?: (node: Node) => boolean): SymbolAndEntries[] | undefined { const references = flatMap(sourceFiles, sourceFile => { cancellationToken.throwIfCancellationRequested(); diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 1ece63e531790..3cae0e536c45d 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -161,6 +161,10 @@ namespace ts.GoToDefinition { return undefined; } + if (isImportMeta(node.parent) && node.parent.name === node) { + return definitionFromType(typeChecker.getTypeAtLocation(node.parent), typeChecker, node.parent); + } + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) return undefined; diff --git a/src/services/services.ts b/src/services/services.ts index afe43e32a79c2..cdcf22326931c 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1664,6 +1664,9 @@ namespace ts { if (isNamedTupleMember(node.parent) && node.pos === node.parent.pos) { return node.parent; } + if (isImportMeta(node.parent) && node.parent.name === node) { + return node.parent; + } return node; } @@ -1680,6 +1683,8 @@ namespace ts { case SyntaxKind.SuperKeyword: case SyntaxKind.NamedTupleMember: return true; + case SyntaxKind.MetaProperty: + return isImportMeta(node); default: return false; } diff --git a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc new file mode 100644 index 0000000000000..21e137e4ab79f --- /dev/null +++ b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc @@ -0,0 +1,59 @@ +// === /tests/cases/fourslash/foo.ts === +// /// +// /// +// import./*FIND ALL REFS*/[|meta|]; +// import.[|meta|]; + +// === /tests/cases/fourslash/baz.ts === +// /// +// /// +// import.[|meta|]; + +[ + { + "definition": { + "containerKind": "", + "containerName": "", + "fileName": "/tests/cases/fourslash/foo.ts", + "kind": "keyword", + "textSpan": { + "start": 82, + "length": 4 + }, + "displayParts": [ + { + "kind": "keyword" + } + ] + }, + "references": [ + { + "textSpan": { + "start": 82, + "length": 4 + }, + "fileName": "/tests/cases/fourslash/foo.ts", + "isWriteAccess": false, + "isDefinition": false + }, + { + "textSpan": { + "start": 95, + "length": 4 + }, + "fileName": "/tests/cases/fourslash/foo.ts", + "isWriteAccess": false, + "isDefinition": false + }, + { + "textSpan": { + "start": 82, + "length": 4 + }, + "fileName": "/tests/cases/fourslash/baz.ts", + "isWriteAccess": false, + "isDefinition": false + } + ] + } +] \ No newline at end of file diff --git a/tests/baselines/reference/quickInfoImportMeta.baseline b/tests/baselines/reference/quickInfoImportMeta.baseline new file mode 100644 index 0000000000000..0da66d28073dc --- /dev/null +++ b/tests/baselines/reference/quickInfoImportMeta.baseline @@ -0,0 +1,37 @@ +[ + { + "marker": { + "fileName": "/tests/cases/fourslash/foo.ts", + "position": 77, + "name": "1" + } + }, + { + "marker": { + "fileName": "/tests/cases/fourslash/foo.ts", + "position": 84, + "name": "2" + }, + "quickInfo": { + "kind": "", + "kindModifiers": "", + "textSpan": { + "start": 75, + "length": 11 + }, + "displayParts": [ + { + "text": "ImportMeta", + "kind": "interfaceName" + } + ], + "documentation": [ + { + "text": "The type of `import.meta`.\n\nIf you need to declare that a given property exists on `import.meta`,\nthis type may be augmented via interface merging.", + "kind": "text" + } + ], + "tags": [] + } + } +] \ No newline at end of file diff --git a/tests/baselines/reference/quickInfoImportMetaProp.baseline b/tests/baselines/reference/quickInfoImportMetaProp.baseline new file mode 100644 index 0000000000000..0637a088a01e8 --- /dev/null +++ b/tests/baselines/reference/quickInfoImportMetaProp.baseline @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/cases/fourslash/findAllRefsImportMeta.ts b/tests/cases/fourslash/findAllRefsImportMeta.ts new file mode 100644 index 0000000000000..572c1987df9ae --- /dev/null +++ b/tests/cases/fourslash/findAllRefsImportMeta.ts @@ -0,0 +1,25 @@ +// @noLib: true + +/// + +// @module: esnext +// @Filename: foo.ts +/////// +/////// +////import./**/meta; +////import.[|meta|]; + +//@Filename: bar.d.ts +////interface ImportMeta { +////} + +// @Filename: baz.ts +/////// +/////// +////import.meta; + + +verify.baselineFindAllReferences(""); + +goTo.rangeStart(test.ranges()[0]); +verify.renameInfoFailed(); diff --git a/tests/cases/fourslash/goToDefinitionImportMeta.ts b/tests/cases/fourslash/goToDefinitionImportMeta.ts new file mode 100644 index 0000000000000..4594fef1b6766 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionImportMeta.ts @@ -0,0 +1,13 @@ +/// + +// @module: esnext +// @Filename: foo.ts +/////// +/////// +////import.me/*reference*/ta; + +//@Filename: bar.d.ts +////interface ImportMeta { +////} + +verify.goToDefinition("reference", []); diff --git a/tests/cases/fourslash/goToTypeDefinitionImportMeta.ts b/tests/cases/fourslash/goToTypeDefinitionImportMeta.ts new file mode 100644 index 0000000000000..a7d1d72495e34 --- /dev/null +++ b/tests/cases/fourslash/goToTypeDefinitionImportMeta.ts @@ -0,0 +1,13 @@ +/// + +// @module: esnext +// @Filename: foo.ts +/////// +/////// +////import.me/*reference*/ta; + +//@Filename: bar.d.ts +////interface /*definition*/ImportMeta { +////} + +verify.goToType("reference", "definition"); diff --git a/tests/cases/fourslash/quickInfoImportMeta.ts b/tests/cases/fourslash/quickInfoImportMeta.ts new file mode 100644 index 0000000000000..928266b860f34 --- /dev/null +++ b/tests/cases/fourslash/quickInfoImportMeta.ts @@ -0,0 +1,19 @@ +/// + +// @module: esnext +// @Filename: foo.ts +/////// +/////// +////im/*1*/port.me/*2*/ta; + +//@Filename: bar.d.ts +/////** +//// * The type of `import.meta`. +//// * +//// * If you need to declare that a given property exists on `import.meta`, +//// * this type may be augmented via interface merging. +//// */ +//// interface ImportMeta { +////} + +verify.baselineQuickInfo() From 1e99298f4546ad6fe152245db46eeb1814ba467b Mon Sep 17 00:00:00 2001 From: Zzzen Date: Wed, 2 Jun 2021 13:18:39 +0800 Subject: [PATCH 2/6] search `meta` instead of `import.meta` --- src/services/findAllReferences.ts | 3 +-- .../reference/findAllRefsImportMeta.baseline.jsonc | 6 ++++-- tests/cases/fourslash/findAllRefsImportMeta.ts | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 3a5368f4fe3c5..357ddb86bf200 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1432,8 +1432,7 @@ namespace ts.FindAllReferences { function getAllReferencesForImportMeta(sourceFiles: readonly SourceFile[], cancellationToken: CancellationToken): SymbolAndEntries[] | undefined { const references = flatMap(sourceFiles, sourceFile => { cancellationToken.throwIfCancellationRequested(); - return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "import.meta", sourceFile), node => { - // node is the first token, `import` + return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "meta", sourceFile), node => { const parent = node.parent; if (isImportMeta(parent)) { return nodeEntry(parent); diff --git a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc index 21e137e4ab79f..3d52240d3a867 100644 --- a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc +++ b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc @@ -7,7 +7,9 @@ // === /tests/cases/fourslash/baz.ts === // /// // /// -// import.[|meta|]; +// let x = import +// . // hai :) +// [|meta|]; [ { @@ -47,7 +49,7 @@ }, { "textSpan": { - "start": 82, + "start": 109, "length": 4 }, "fileName": "/tests/cases/fourslash/baz.ts", diff --git a/tests/cases/fourslash/findAllRefsImportMeta.ts b/tests/cases/fourslash/findAllRefsImportMeta.ts index 572c1987df9ae..1040f9542e4a9 100644 --- a/tests/cases/fourslash/findAllRefsImportMeta.ts +++ b/tests/cases/fourslash/findAllRefsImportMeta.ts @@ -16,8 +16,9 @@ // @Filename: baz.ts /////// /////// -////import.meta; - +////let x = import +//// . // hai :) +//// meta; verify.baselineFindAllReferences(""); From a7b9dd6ef2fadaa969d47fb4635f5f39912cb35a Mon Sep 17 00:00:00 2001 From: Zzzen Date: Wed, 23 Feb 2022 13:18:20 +0800 Subject: [PATCH 3/6] remove `definition` --- src/services/findAllReferences.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 952266d5ebcce..993b9bbda615b 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1449,7 +1449,7 @@ namespace ts.FindAllReferences { } }); }); - return references.length ? [{ definition: { type: DefinitionKind.Keyword, node: references[0].node }, references }] : undefined; + return references.length ? [{ references }] : undefined; } function getAllReferencesForKeyword(sourceFiles: readonly SourceFile[], keywordKind: SyntaxKind, cancellationToken: CancellationToken, filter?: (node: Node) => boolean): SymbolAndEntries[] | undefined { From 6fa26848c7a05d54b5ce1aca7b51c084e9c85692 Mon Sep 17 00:00:00 2001 From: Zzzen Date: Wed, 23 Feb 2022 14:07:33 +0800 Subject: [PATCH 4/6] fix compilation error --- src/services/findAllReferences.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 993b9bbda615b..649470b2d06e2 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1449,7 +1449,7 @@ namespace ts.FindAllReferences { } }); }); - return references.length ? [{ references }] : undefined; + return references.length ? [{ definition: undefined, references }] : undefined; } function getAllReferencesForKeyword(sourceFiles: readonly SourceFile[], keywordKind: SyntaxKind, cancellationToken: CancellationToken, filter?: (node: Node) => boolean): SymbolAndEntries[] | undefined { From ef094266a4a2a74882e78f80fc83277a2e33b1bf Mon Sep 17 00:00:00 2001 From: Zzzen Date: Thu, 24 Feb 2022 12:50:45 +0800 Subject: [PATCH 5/6] update baseline --- .../findAllRefsImportMeta.baseline.jsonc | 62 +------------------ .../reference/quickInfoImportMeta.baseline | 24 ++++--- .../quickInfoImportMetaProp.baseline | 1 - 3 files changed, 15 insertions(+), 72 deletions(-) delete mode 100644 tests/baselines/reference/quickInfoImportMetaProp.baseline diff --git a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc index 3d52240d3a867..0637a088a01e8 100644 --- a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc +++ b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc @@ -1,61 +1 @@ -// === /tests/cases/fourslash/foo.ts === -// /// -// /// -// import./*FIND ALL REFS*/[|meta|]; -// import.[|meta|]; - -// === /tests/cases/fourslash/baz.ts === -// /// -// /// -// let x = import -// . // hai :) -// [|meta|]; - -[ - { - "definition": { - "containerKind": "", - "containerName": "", - "fileName": "/tests/cases/fourslash/foo.ts", - "kind": "keyword", - "textSpan": { - "start": 82, - "length": 4 - }, - "displayParts": [ - { - "kind": "keyword" - } - ] - }, - "references": [ - { - "textSpan": { - "start": 82, - "length": 4 - }, - "fileName": "/tests/cases/fourslash/foo.ts", - "isWriteAccess": false, - "isDefinition": false - }, - { - "textSpan": { - "start": 95, - "length": 4 - }, - "fileName": "/tests/cases/fourslash/foo.ts", - "isWriteAccess": false, - "isDefinition": false - }, - { - "textSpan": { - "start": 109, - "length": 4 - }, - "fileName": "/tests/cases/fourslash/baz.ts", - "isWriteAccess": false, - "isDefinition": false - } - ] - } -] \ No newline at end of file +[] \ No newline at end of file diff --git a/tests/baselines/reference/quickInfoImportMeta.baseline b/tests/baselines/reference/quickInfoImportMeta.baseline index 0da66d28073dc..e576927262fb2 100644 --- a/tests/baselines/reference/quickInfoImportMeta.baseline +++ b/tests/baselines/reference/quickInfoImportMeta.baseline @@ -4,6 +4,16 @@ "fileName": "/tests/cases/fourslash/foo.ts", "position": 77, "name": "1" + }, + "quickInfo": { + "kind": "", + "kindModifiers": "", + "textSpan": { + "start": 75, + "length": 6 + }, + "displayParts": [], + "documentation": [] } }, { @@ -13,25 +23,19 @@ "name": "2" }, "quickInfo": { - "kind": "", - "kindModifiers": "", + "kind": "interface", + "kindModifiers": "declare", "textSpan": { "start": 75, "length": 11 }, - "displayParts": [ - { - "text": "ImportMeta", - "kind": "interfaceName" - } - ], + "displayParts": [], "documentation": [ { "text": "The type of `import.meta`.\n\nIf you need to declare that a given property exists on `import.meta`,\nthis type may be augmented via interface merging.", "kind": "text" } - ], - "tags": [] + ] } } ] \ No newline at end of file diff --git a/tests/baselines/reference/quickInfoImportMetaProp.baseline b/tests/baselines/reference/quickInfoImportMetaProp.baseline deleted file mode 100644 index 0637a088a01e8..0000000000000 --- a/tests/baselines/reference/quickInfoImportMetaProp.baseline +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file From c0ef5d97ee2a4c17c571e3a3337fc392a1ca6a49 Mon Sep 17 00:00:00 2001 From: Zzzen Date: Fri, 25 Feb 2022 12:44:59 +0800 Subject: [PATCH 6/6] revert definition --- src/services/findAllReferences.ts | 2 +- .../findAllRefsImportMeta.baseline.jsonc | 62 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 649470b2d06e2..952266d5ebcce 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1449,7 +1449,7 @@ namespace ts.FindAllReferences { } }); }); - return references.length ? [{ definition: undefined, references }] : undefined; + return references.length ? [{ definition: { type: DefinitionKind.Keyword, node: references[0].node }, references }] : undefined; } function getAllReferencesForKeyword(sourceFiles: readonly SourceFile[], keywordKind: SyntaxKind, cancellationToken: CancellationToken, filter?: (node: Node) => boolean): SymbolAndEntries[] | undefined { diff --git a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc index 0637a088a01e8..3d52240d3a867 100644 --- a/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc +++ b/tests/baselines/reference/findAllRefsImportMeta.baseline.jsonc @@ -1 +1,61 @@ -[] \ No newline at end of file +// === /tests/cases/fourslash/foo.ts === +// /// +// /// +// import./*FIND ALL REFS*/[|meta|]; +// import.[|meta|]; + +// === /tests/cases/fourslash/baz.ts === +// /// +// /// +// let x = import +// . // hai :) +// [|meta|]; + +[ + { + "definition": { + "containerKind": "", + "containerName": "", + "fileName": "/tests/cases/fourslash/foo.ts", + "kind": "keyword", + "textSpan": { + "start": 82, + "length": 4 + }, + "displayParts": [ + { + "kind": "keyword" + } + ] + }, + "references": [ + { + "textSpan": { + "start": 82, + "length": 4 + }, + "fileName": "/tests/cases/fourslash/foo.ts", + "isWriteAccess": false, + "isDefinition": false + }, + { + "textSpan": { + "start": 95, + "length": 4 + }, + "fileName": "/tests/cases/fourslash/foo.ts", + "isWriteAccess": false, + "isDefinition": false + }, + { + "textSpan": { + "start": 109, + "length": 4 + }, + "fileName": "/tests/cases/fourslash/baz.ts", + "isWriteAccess": false, + "isDefinition": false + } + ] + } +] \ No newline at end of file