Skip to content

Commit e87b2e3

Browse files
Merge pull request #36063 from uniqueiniquity/addWeakCompletionProperty
Add completion property to identify completions from unchecked files
2 parents 0e9416c + d59c6f3 commit e87b2e3

File tree

9 files changed

+54
-4
lines changed

9 files changed

+54
-4
lines changed

src/harness/fourslashImpl.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -843,8 +843,8 @@ namespace FourSlash {
843843
}
844844

845845
private verifyCompletionEntry(actual: ts.CompletionEntry, expected: FourSlashInterface.ExpectedCompletionEntry) {
846-
const { insertText, replacementSpan, hasAction, isRecommended, kind, kindModifiers, text, documentation, tags, source, sourceDisplay, sortText } = typeof expected === "string"
847-
? { insertText: undefined, replacementSpan: undefined, hasAction: undefined, isRecommended: undefined, kind: undefined, kindModifiers: undefined, text: undefined, documentation: undefined, tags: undefined, source: undefined, sourceDisplay: undefined, sortText: undefined }
846+
const { insertText, replacementSpan, hasAction, isRecommended, isFromUncheckedFile, kind, kindModifiers, text, documentation, tags, source, sourceDisplay, sortText } = typeof expected === "string"
847+
? { insertText: undefined, replacementSpan: undefined, hasAction: undefined, isRecommended: undefined, isFromUncheckedFile: undefined, kind: undefined, kindModifiers: undefined, text: undefined, documentation: undefined, tags: undefined, source: undefined, sourceDisplay: undefined, sortText: undefined }
848848
: expected;
849849

850850
if (actual.insertText !== insertText) {
@@ -867,8 +867,14 @@ namespace FourSlash {
867867
}
868868
}
869869

870+
if (isFromUncheckedFile !== undefined) {
871+
if (actual.isFromUncheckedFile !== isFromUncheckedFile) {
872+
this.raiseError(`Expected 'isFromUncheckedFile' value '${actual.isFromUncheckedFile}' to equal '${isFromUncheckedFile}'`);
873+
}
874+
}
875+
870876
assert.equal(actual.hasAction, hasAction, `Expected 'hasAction' value '${actual.hasAction}' to equal '${hasAction}'`);
871-
assert.equal(actual.isRecommended, isRecommended, `Expected 'isRecommended' value '${actual.source}' to equal '${isRecommended}'`);
877+
assert.equal(actual.isRecommended, isRecommended, `Expected 'isRecommended' value '${actual.isRecommended}' to equal '${isRecommended}'`);
872878
assert.equal(actual.source, source, `Expected 'source' value '${actual.source}' to equal '${source}'`);
873879
assert.equal(actual.sortText, sortText || ts.Completions.SortText.LocationPriority, this.messageAtLastKnownMarker(`Actual entry: ${JSON.stringify(actual)}`));
874880

src/harness/fourslashInterfaceImpl.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,7 @@ namespace FourSlashInterface {
14801480
readonly replacementSpan?: FourSlash.Range;
14811481
readonly hasAction?: boolean; // If not specified, will assert that this is false.
14821482
readonly isRecommended?: boolean; // If not specified, will assert that this is false.
1483+
readonly isFromUncheckedFile?: boolean; // If not specified, won't assert about this
14831484
readonly kind?: string; // If not specified, won't assert about this
14841485
readonly kindModifiers?: string; // Must be paired with 'kind'
14851486
readonly text?: string;

src/server/protocol.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,6 +2121,11 @@ namespace ts.server.protocol {
21212121
* Then either that enum/class or a namespace containing it will be the recommended symbol.
21222122
*/
21232123
isRecommended?: true;
2124+
/**
2125+
* If true, this completion was generated from traversing the name table of an unchecked JS file,
2126+
* and therefore may not be accurate.
2127+
*/
2128+
isFromUncheckedFile?: true;
21242129
}
21252130

21262131
/**

src/services/completions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ namespace ts.Completions {
310310
name: realName,
311311
kind: ScriptElementKind.warning,
312312
kindModifiers: "",
313-
sortText: SortText.JavascriptIdentifiers
313+
sortText: SortText.JavascriptIdentifiers,
314+
isFromUncheckedFile: true
314315
});
315316
}
316317
});

src/services/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,6 +988,7 @@ namespace ts {
988988
hasAction?: true;
989989
source?: string;
990990
isRecommended?: true;
991+
isFromUncheckedFile?: true;
991992
}
992993

993994
export interface CompletionEntryDetails {

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5666,6 +5666,7 @@ declare namespace ts {
56665666
hasAction?: true;
56675667
source?: string;
56685668
isRecommended?: true;
5669+
isFromUncheckedFile?: true;
56695670
}
56705671
interface CompletionEntryDetails {
56715672
name: string;
@@ -7673,6 +7674,11 @@ declare namespace ts.server.protocol {
76737674
* Then either that enum/class or a namespace containing it will be the recommended symbol.
76747675
*/
76757676
isRecommended?: true;
7677+
/**
7678+
* If true, this completion was generated from traversing the name table of an unchecked JS file,
7679+
* and therefore may not be accurate.
7680+
*/
7681+
isFromUncheckedFile?: true;
76767682
}
76777683
/**
76787684
* Additional completion entry details, available on demand

tests/baselines/reference/api/typescript.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5666,6 +5666,7 @@ declare namespace ts {
56665666
hasAction?: true;
56675667
source?: string;
56685668
isRecommended?: true;
5669+
isFromUncheckedFile?: true;
56695670
}
56705671
interface CompletionEntryDetails {
56715672
name: string;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @allowJs: true
4+
// @checkJs: false
5+
// @Filename: index.js
6+
////function hello() {
7+
////
8+
////}
9+
////
10+
////const goodbye = 5;
11+
////
12+
////console./*0*/
13+
14+
verify.completions({
15+
marker: "0",
16+
includes: [
17+
{
18+
name: "hello",
19+
sortText: completion.SortText.JavascriptIdentifiers,
20+
isFromUncheckedFile: true
21+
},
22+
{
23+
name: "goodbye",
24+
sortText: completion.SortText.JavascriptIdentifiers,
25+
isFromUncheckedFile: true
26+
}
27+
]
28+
});

tests/cases/fourslash/fourslash.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ declare namespace FourSlashInterface {
611611
readonly replacementSpan?: Range;
612612
readonly hasAction?: boolean;
613613
readonly isRecommended?: boolean;
614+
readonly isFromUncheckedFile?: boolean;
614615
readonly kind?: string;
615616
readonly kindModifiers?: string;
616617
readonly sortText?: completion.SortText;

0 commit comments

Comments
 (0)