@@ -62,6 +62,7 @@ import {
62
62
first ,
63
63
firstDefined ,
64
64
flatMap ,
65
+ forEach ,
65
66
formatting ,
66
67
FunctionLikeDeclaration ,
67
68
getAllSuperTypeNodes ,
@@ -427,15 +428,16 @@ export enum CompletionSource {
427
428
428
429
/** @internal */
429
430
export const enum SymbolOriginInfoKind {
430
- ThisType = 1 << 0 ,
431
- SymbolMember = 1 << 1 ,
432
- Export = 1 << 2 ,
433
- Promise = 1 << 3 ,
434
- Nullable = 1 << 4 ,
435
- ResolvedExport = 1 << 5 ,
436
- TypeOnlyAlias = 1 << 6 ,
437
- ObjectLiteralMethod = 1 << 7 ,
438
- Ignore = 1 << 8 ,
431
+ ThisType = 1 << 0 ,
432
+ SymbolMember = 1 << 1 ,
433
+ Export = 1 << 2 ,
434
+ Promise = 1 << 3 ,
435
+ Nullable = 1 << 4 ,
436
+ ResolvedExport = 1 << 5 ,
437
+ TypeOnlyAlias = 1 << 6 ,
438
+ ObjectLiteralMethod = 1 << 7 ,
439
+ Ignore = 1 << 8 ,
440
+ ComputedPropertyName = 1 << 9 ,
439
441
440
442
SymbolMemberNoExport = SymbolMember ,
441
443
SymbolMemberExport = SymbolMember | Export ,
@@ -475,6 +477,10 @@ interface SymbolOriginInfoObjectLiteralMethod extends SymbolOriginInfo {
475
477
isSnippet ?: true ,
476
478
}
477
479
480
+ interface SymbolOriginInfoComputedPropertyName extends SymbolOriginInfo {
481
+ symbolName : string ;
482
+ }
483
+
478
484
function originIsThisType ( origin : SymbolOriginInfo ) : boolean {
479
485
return ! ! ( origin . kind & SymbolOriginInfoKind . ThisType ) ;
480
486
}
@@ -491,8 +497,8 @@ function originIsResolvedExport(origin: SymbolOriginInfo | undefined): origin is
491
497
return ! ! ( origin && origin . kind === SymbolOriginInfoKind . ResolvedExport ) ;
492
498
}
493
499
494
- function originIncludesSymbolName ( origin : SymbolOriginInfo | undefined ) : origin is SymbolOriginInfoExport | SymbolOriginInfoResolvedExport {
495
- return originIsExport ( origin ) || originIsResolvedExport ( origin ) ;
500
+ function originIncludesSymbolName ( origin : SymbolOriginInfo | undefined ) : origin is SymbolOriginInfoExport | SymbolOriginInfoResolvedExport | SymbolOriginInfoComputedPropertyName {
501
+ return originIsExport ( origin ) || originIsResolvedExport ( origin ) || originIsComputedPropertyName ( origin ) ;
496
502
}
497
503
498
504
function originIsPackageJsonImport ( origin : SymbolOriginInfo | undefined ) : origin is SymbolOriginInfoExport {
@@ -519,6 +525,10 @@ function originIsIgnore(origin: SymbolOriginInfo | undefined): boolean {
519
525
return ! ! ( origin && origin . kind & SymbolOriginInfoKind . Ignore ) ;
520
526
}
521
527
528
+ function originIsComputedPropertyName ( origin : SymbolOriginInfo | undefined ) : origin is SymbolOriginInfoComputedPropertyName {
529
+ return ! ! ( origin && origin . kind & SymbolOriginInfoKind . ComputedPropertyName ) ;
530
+ }
531
+
522
532
/** @internal */
523
533
export interface UniqueNameSet {
524
534
add ( name : string ) : void ;
@@ -1552,10 +1562,9 @@ function getEntryForMemberCompletion(
1552
1562
requiredModifiers |= ModifierFlags . Abstract ;
1553
1563
}
1554
1564
if ( isClassElement ( node )
1555
- && checker . getMemberOverrideModifierStatus ( classLikeDeclaration , node ) === MemberOverrideStatus . NeedsOverride ) {
1565
+ && checker . getMemberOverrideModifierStatus ( classLikeDeclaration , node , symbol ) === MemberOverrideStatus . NeedsOverride ) {
1556
1566
requiredModifiers |= ModifierFlags . Override ;
1557
1567
}
1558
-
1559
1568
if ( ! completionNodes . length ) {
1560
1569
// Keep track of added missing required modifiers and modifiers already present.
1561
1570
// This is needed when we have overloaded signatures,
@@ -2322,7 +2331,8 @@ export function getCompletionEntryDetails(
2322
2331
case "symbol" : {
2323
2332
const { symbol, location, contextToken, origin, previousToken } = symbolCompletion ;
2324
2333
const { codeActions, sourceDisplay } = getCompletionEntryCodeActionsAndSourceDisplay ( name , location , contextToken , origin , symbol , program , host , compilerOptions , sourceFile , position , previousToken , formatContext , preferences , data , source , cancellationToken ) ;
2325
- return createCompletionDetailsForSymbol ( symbol , typeChecker , sourceFile , location , cancellationToken , codeActions , sourceDisplay ) ; // TODO: GH#18217
2334
+ const symbolName = originIsComputedPropertyName ( origin ) ? origin . symbolName : symbol . name ;
2335
+ return createCompletionDetailsForSymbol ( symbol , symbolName , typeChecker , sourceFile , location , cancellationToken , codeActions , sourceDisplay ) ; // TODO: GH#18217
2326
2336
}
2327
2337
case "literal" : {
2328
2338
const { literal } = symbolCompletion ;
@@ -2374,12 +2384,12 @@ function createSimpleDetails(name: string, kind: ScriptElementKind, kind2: Symbo
2374
2384
}
2375
2385
2376
2386
/** @internal */
2377
- export function createCompletionDetailsForSymbol ( symbol : Symbol , checker : TypeChecker , sourceFile : SourceFile , location : Node , cancellationToken : CancellationToken , codeActions ?: CodeAction [ ] , sourceDisplay ?: SymbolDisplayPart [ ] ) : CompletionEntryDetails {
2387
+ export function createCompletionDetailsForSymbol ( symbol : Symbol , name : string , checker : TypeChecker , sourceFile : SourceFile , location : Node , cancellationToken : CancellationToken , codeActions ?: CodeAction [ ] , sourceDisplay ?: SymbolDisplayPart [ ] ) : CompletionEntryDetails {
2378
2388
const { displayParts, documentation, symbolKind, tags } =
2379
2389
checker . runWithCancellationToken ( cancellationToken , checker =>
2380
2390
SymbolDisplay . getSymbolDisplayPartsDocumentationAndSymbolKind ( checker , symbol , sourceFile , location , location , SemanticMeaning . All )
2381
2391
) ;
2382
- return createCompletionDetails ( symbol . name , SymbolDisplay . getSymbolModifiers ( checker , symbol ) , symbolKind , displayParts , documentation , tags , codeActions , sourceDisplay ) ;
2392
+ return createCompletionDetails ( name , SymbolDisplay . getSymbolModifiers ( checker , symbol ) , symbolKind , displayParts , documentation , tags , codeActions , sourceDisplay ) ;
2383
2393
}
2384
2394
2385
2395
/** @internal */
@@ -3963,8 +3973,17 @@ function getCompletionData(
3963
3973
type && typeChecker . getPropertiesOfType ( type ) ;
3964
3974
} ) ;
3965
3975
symbols = concatenate ( symbols , filterClassMembersList ( baseSymbols , decl . members , classElementModifierFlags ) ) ;
3976
+ forEach ( symbols , ( symbol , index ) => {
3977
+ const declaration = symbol ?. valueDeclaration ;
3978
+ if ( declaration && isClassElement ( declaration ) && declaration . name && isComputedPropertyName ( declaration . name ) ) {
3979
+ const origin : SymbolOriginInfoComputedPropertyName = {
3980
+ kind : SymbolOriginInfoKind . ComputedPropertyName ,
3981
+ symbolName : typeChecker . symbolToString ( symbol ) ,
3982
+ } ;
3983
+ symbolToOriginInfoMap [ index ] = origin ;
3984
+ }
3985
+ } ) ;
3966
3986
}
3967
-
3968
3987
return GlobalsSearch . Success ;
3969
3988
}
3970
3989
@@ -4545,7 +4564,7 @@ function getCompletionEntryDisplayNameForSymbol(
4545
4564
}
4546
4565
switch ( kind ) {
4547
4566
case CompletionKind . MemberLike :
4548
- return undefined ;
4567
+ return originIsComputedPropertyName ( origin ) ? { name : origin . symbolName , needsConvertPropertyAccess : false } : undefined ;
4549
4568
case CompletionKind . ObjectPropertyDeclaration :
4550
4569
// TODO: GH#18169
4551
4570
return { name : JSON . stringify ( name ) , needsConvertPropertyAccess : false } ;
0 commit comments