@@ -25,15 +25,15 @@ namespace ts.codefix {
25
25
return [ deleteNode ( token . parent ) ] ;
26
26
27
27
default :
28
- return [ deleteDefault ( ) ] ;
28
+ return deleteDefault ( ) ;
29
29
}
30
30
31
- function deleteDefault ( ) {
31
+ function deleteDefault ( ) : CodeAction [ ] | undefined {
32
32
if ( isDeclarationName ( token ) ) {
33
- return deleteNode ( token . parent ) ;
33
+ return [ deleteNode ( token . parent ) ] ;
34
34
}
35
35
else if ( isLiteralComputedPropertyDeclarationName ( token ) ) {
36
- return deleteNode ( token . parent . parent ) ;
36
+ return [ deleteNode ( token . parent . parent ) ] ;
37
37
}
38
38
else {
39
39
return undefined ;
@@ -87,20 +87,16 @@ namespace ts.codefix {
87
87
case SyntaxKind . ImportSpecifier :
88
88
const namedImports = < NamedImports > parent . parent ;
89
89
if ( namedImports . elements . length === 1 ) {
90
- // Only 1 import and it is unused. So the entire declaration should be removed.
91
- const importSpec = getAncestor ( identifier , SyntaxKind . ImportDeclaration ) ;
92
- return [ deleteNode ( importSpec ) ] ;
90
+ return deleteNamedImportBinding ( namedImports ) ;
93
91
}
94
92
else {
95
93
// delete import specifier
96
94
return [ deleteNodeInList ( parent ) ] ;
97
95
}
98
96
99
- // handle case where "import d, * as ns from './file'"
100
- // or "'import {a, b as ns} from './file'"
101
97
case SyntaxKind . ImportClause : // this covers both 'import |d|' and 'import |d,| *'
102
98
const importClause = < ImportClause > parent ;
103
- if ( ! importClause . namedBindings ) { // |import d from './file'| or |import * as ns from './file'|
99
+ if ( ! importClause . namedBindings ) { // |import d from './file'|
104
100
const importDecl = getAncestor ( importClause , SyntaxKind . ImportDeclaration ) ;
105
101
return [ deleteNode ( importDecl ) ] ;
106
102
}
@@ -118,22 +114,30 @@ namespace ts.codefix {
118
114
}
119
115
120
116
case SyntaxKind . NamespaceImport :
121
- const namespaceImport = < NamespaceImport > parent ;
122
- if ( namespaceImport . name === identifier && ! ( < ImportClause > namespaceImport . parent ) . name ) {
123
- const importDecl = getAncestor ( namespaceImport , SyntaxKind . ImportDeclaration ) ;
124
- return [ deleteNode ( importDecl ) ] ;
125
- }
126
- else {
127
- const previousToken = getTokenAtPosition ( sourceFile , namespaceImport . pos - 1 , /*includeJsDocComment*/ false ) ;
128
- if ( previousToken && previousToken . kind === SyntaxKind . CommaToken ) {
129
- const startPosition = textChanges . getAdjustedStartPosition ( sourceFile , previousToken , { } , textChanges . Position . FullStart ) ;
130
- return [ deleteRange ( { pos : startPosition , end : namespaceImport . end } ) ] ;
131
- }
132
- return [ deleteRange ( namespaceImport ) ] ;
133
- }
117
+ return deleteNamedImportBinding ( < NamespaceImport > parent ) ;
134
118
135
119
default :
136
- return [ deleteDefault ( ) ] ;
120
+ return deleteDefault ( ) ;
121
+ }
122
+ }
123
+
124
+ function deleteNamedImportBinding ( namedBindings : NamedImportBindings ) : CodeAction [ ] | undefined {
125
+ if ( ( < ImportClause > namedBindings . parent ) . name ) {
126
+ // Delete named imports while preserving the default import
127
+ // import d|, * as ns| from './file'
128
+ // import d|, { a }| from './file'
129
+ const previousToken = getTokenAtPosition ( sourceFile , namedBindings . pos - 1 , /*includeJsDocComment*/ false ) ;
130
+ if ( previousToken && previousToken . kind === SyntaxKind . CommaToken ) {
131
+ return [ deleteRange ( { pos : previousToken . getStart ( ) , end : namedBindings . end } ) ] ;
132
+ }
133
+ return undefined ;
134
+ }
135
+ else {
136
+ // Delete the entire import declaration
137
+ // |import * as ns from './file'|
138
+ // |import { a } from './file'|
139
+ const importDecl = getAncestor ( namedBindings , SyntaxKind . ImportDeclaration ) ;
140
+ return [ deleteNode ( importDecl ) ] ;
137
141
}
138
142
}
139
143
0 commit comments