@@ -32,6 +32,10 @@ namespace ts.codefix {
32
32
return Debug . assertDefined ( getContainingClass ( getTokenAtPosition ( sourceFile , pos , /*includeJsDocComment*/ false ) ) ) ;
33
33
}
34
34
35
+ function symbolPointsToNonPrivateMember ( symbol : Symbol ) {
36
+ return ! ( getModifierFlags ( symbol . valueDeclaration ) & ModifierFlags . Private ) ;
37
+ }
38
+
35
39
function addMissingDeclarations (
36
40
checker : TypeChecker ,
37
41
implementedTypeNode : ExpressionWithTypeArguments ,
@@ -40,11 +44,12 @@ namespace ts.codefix {
40
44
changeTracker : textChanges . ChangeTracker ,
41
45
preferences : UserPreferences ,
42
46
) : void {
47
+ const maybeHeritageClauseSymbol = getHeritageClauseSymbolTable ( classDeclaration , checker ) ;
43
48
// Note that this is ultimately derived from a map indexed by symbol names,
44
49
// so duplicates cannot occur.
45
50
const implementedType = checker . getTypeAtLocation ( implementedTypeNode ) as InterfaceType ;
46
51
const implementedTypeSymbols = checker . getPropertiesOfType ( implementedType ) ;
47
- const nonPrivateMembers = implementedTypeSymbols . filter ( symbol => ! ( getModifierFlags ( symbol . valueDeclaration ) & ModifierFlags . Private ) ) ;
52
+ const nonPrivateAndNotExistedInHeritageClauseMembers = implementedTypeSymbols . filter ( and ( symbolPointsToNonPrivateMember , symbol => ! maybeHeritageClauseSymbol . has ( symbol . escapedName ) ) ) ;
48
53
49
54
const classType = checker . getTypeAtLocation ( classDeclaration ) ! ;
50
55
@@ -55,7 +60,7 @@ namespace ts.codefix {
55
60
createMissingIndexSignatureDeclaration ( implementedType , IndexKind . String ) ;
56
61
}
57
62
58
- createMissingMemberNodes ( classDeclaration , nonPrivateMembers , checker , preferences , member => changeTracker . insertNodeAtClassStart ( sourceFile , classDeclaration , member ) ) ;
63
+ createMissingMemberNodes ( classDeclaration , nonPrivateAndNotExistedInHeritageClauseMembers , checker , preferences , member => changeTracker . insertNodeAtClassStart ( sourceFile , classDeclaration , member ) ) ;
59
64
60
65
function createMissingIndexSignatureDeclaration ( type : InterfaceType , kind : IndexKind ) : void {
61
66
const indexInfoOfKind = checker . getIndexInfoOfType ( type , kind ) ;
@@ -64,4 +69,12 @@ namespace ts.codefix {
64
69
}
65
70
}
66
71
}
72
+
73
+ function getHeritageClauseSymbolTable ( classDeclaration : ClassLikeDeclaration , checker : TypeChecker ) : SymbolTable {
74
+ const heritageClauseNode = getClassExtendsHeritageClauseElement ( classDeclaration ) ;
75
+ if ( ! heritageClauseNode ) return createSymbolTable ( ) ;
76
+ const heritageClauseType = checker . getTypeAtLocation ( heritageClauseNode ) as InterfaceType ;
77
+ const heritageClauseTypeSymbols = checker . getPropertiesOfType ( heritageClauseType ) ;
78
+ return createSymbolTable ( heritageClauseTypeSymbols . filter ( symbolPointsToNonPrivateMember ) ) ;
79
+ }
67
80
}
0 commit comments