@@ -67,16 +67,14 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
67
67
exportNameToImportName . forEach ( ( name , propertyName ) => {
68
68
elements . push ( createImportSpecifier ( name === propertyName ? undefined : createIdentifier ( propertyName ) , createIdentifier ( name ) ) ) ;
69
69
} ) ;
70
- const makeImportDeclaration = ( defaultImportName : Identifier | undefined ) =>
71
- createImportDeclaration ( /*decorators*/ undefined , /*modifiers*/ undefined ,
72
- createImportClause ( defaultImportName , elements . length ? createNamedImports ( elements ) : undefined ) ,
73
- toConvert . parent . parent . moduleSpecifier ) ;
74
70
71
+ const importDecl = toConvert . parent . parent ;
75
72
if ( usedAsNamespaceOrDefault && ! allowSyntheticDefaultImports ) {
76
- changes . insertNodeAfter ( sourceFile , toConvert . parent . parent , makeImportDeclaration ( /*defaultImportName*/ undefined ) ) ;
73
+ // Need to leave the namespace import alone
74
+ changes . insertNodeAfter ( sourceFile , importDecl , updateImport ( importDecl , /*defaultImportName*/ undefined , elements ) ) ;
77
75
}
78
76
else {
79
- changes . replaceNode ( sourceFile , toConvert . parent . parent , makeImportDeclaration ( usedAsNamespaceOrDefault ? createIdentifier ( toConvert . name . text ) : undefined ) ) ;
77
+ changes . replaceNode ( sourceFile , importDecl , updateImport ( importDecl , usedAsNamespaceOrDefault ? createIdentifier ( toConvert . name . text ) : undefined , elements ) ) ;
80
78
}
81
79
}
82
80
@@ -85,14 +83,36 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
85
83
// We know the user is using at least ScriptTarget.ES6, and moduleSpecifierToValidIdentifier only cares if we're using ES5+, so just set ScriptTarget.ESNext
86
84
const namespaceImportName = generateName ( moduleSpecifier && isStringLiteral ( moduleSpecifier ) ? codefix . moduleSpecifierToValidIdentifier ( moduleSpecifier . text , ScriptTarget . ESNext ) : "module" , usedIdentifiers ) ;
87
85
88
- changes . replaceNode ( sourceFile , toConvert , createNamespaceImport ( createIdentifier ( namespaceImportName ) ) ) ;
86
+ const neededNamedImports : ImportSpecifier [ ] = [ ] ;
89
87
90
88
for ( const element of toConvert . elements ) {
91
89
const propertyName = ( element . propertyName || element . name ) . text ;
92
90
FindAllReferences . Core . eachSymbolReferenceInFile ( element . name , checker , sourceFile , id => {
93
- changes . replaceNode ( sourceFile , id , createPropertyAccess ( createIdentifier ( namespaceImportName ) , propertyName ) ) ;
91
+ const access = createPropertyAccess ( createIdentifier ( namespaceImportName ) , propertyName ) ;
92
+ if ( isShorthandPropertyAssignment ( id . parent ) ) {
93
+ changes . replaceNode ( sourceFile , id . parent , createPropertyAssignment ( id . text , access ) ) ;
94
+ }
95
+ else if ( isExportSpecifier ( id . parent ) && ! id . parent . propertyName ) {
96
+ if ( ! neededNamedImports . some ( n => n . name === element . name ) ) {
97
+ neededNamedImports . push ( createImportSpecifier ( element . propertyName && createIdentifier ( element . propertyName . text ) , createIdentifier ( element . name . text ) ) ) ;
98
+ }
99
+ }
100
+ else {
101
+ changes . replaceNode ( sourceFile , id , access ) ;
102
+ }
94
103
} ) ;
95
104
}
105
+
106
+ changes . replaceNode ( sourceFile , toConvert , createNamespaceImport ( createIdentifier ( namespaceImportName ) ) ) ;
107
+ if ( neededNamedImports . length ) {
108
+ const importDecl = toConvert . parent . parent ;
109
+ changes . insertNodeAfter ( sourceFile , toConvert . parent . parent , updateImport ( importDecl , /*defaultImportName*/ undefined , neededNamedImports ) ) ;
110
+ }
111
+ }
112
+
113
+ function updateImport ( old : ImportDeclaration , defaultImportName : Identifier | undefined , elements : ReadonlyArray < ImportSpecifier > | undefined ) : ImportDeclaration {
114
+ return createImportDeclaration ( /*decorators*/ undefined , /*modifiers*/ undefined ,
115
+ createImportClause ( defaultImportName , elements && elements . length ? createNamedImports ( elements ) : undefined ) , old . moduleSpecifier ) ;
96
116
}
97
117
98
118
function generateName ( name : string , usedIdentifiers : ReadonlyMap < true > ) : string {
0 commit comments