@@ -8,7 +8,7 @@ interface TextSnippet {
88 prefix : string
99 description : string
1010 body : string
11- imports : Record < string , string >
11+ imports : string [ ]
1212}
1313
1414export function activate ( context : vscode . ExtensionContext ) : void {
@@ -50,22 +50,34 @@ export function activate(context: vscode.ExtensionContext): void {
5050 ) : vscode . ProviderResult <
5151 vscode . CompletionItem [ ] | vscode . CompletionList
5252 > {
53- let insertPosition : vscode . Position = new vscode . Position ( 0 , 0 )
5453 let existingImports : Set < string > | null
54+ let insertPosition : vscode . Position = new vscode . Position ( 0 , 0 )
55+ let coreInsertPosition : vscode . Position | null = null
56+ let iconsInsertPosition : vscode . Position | null = null
5557 try {
56- ; ( { insertPosition, existingImports } = getExistingImports (
57- document
58- ) )
58+ ; ( {
59+ existingImports,
60+ insertPosition,
61+ coreInsertPosition,
62+ iconsInsertPosition,
63+ } = getExistingImports ( document ) )
5964 } catch ( error ) {
6065 existingImports = null
6166 }
67+ const config = vscode . workspace . getConfiguration (
68+ 'material-ui-snippets'
69+ )
70+ let importPaths = config . get ( 'importPaths' ) || 'auto'
71+ if ( importPaths === 'auto' ) {
72+ importPaths =
73+ coreInsertPosition || iconsInsertPosition
74+ ? 'top level'
75+ : 'second level'
76+ }
6277 const result = [ ]
6378 for ( const snippet of getSnippets ( {
6479 language : language as any , // eslint-disable-line @typescript-eslint/no-explicit-any
65- formControlMode :
66- vscode . workspace
67- . getConfiguration ( 'material-ui-snippets' )
68- . get ( 'formControlMode' ) || 'controlled' ,
80+ formControlMode : config . get ( 'formControlMode' ) || 'controlled' ,
6981 } ) ) {
7082 const { prefix, description, body, imports } = snippet
7183 const snippetCompletion = new vscode . CompletionItem ( prefix )
@@ -75,15 +87,79 @@ export function activate(context: vscode.ExtensionContext): void {
7587 )
7688 const finalExistingImports = existingImports
7789 if ( finalExistingImports ) {
78- snippetCompletion . additionalTextEdits = [
79- vscode . TextEdit . insert (
80- insertPosition ,
81- [ ...Object . entries ( imports ) ]
82- . filter ( ( [ source ] ) => ! finalExistingImports . has ( source ) )
83- . map ( entry => entry [ 1 ] )
84- . join ( '\n' ) + '\n'
85- ) ,
86- ]
90+ const additionalTextEdits : vscode . TextEdit [ ] = [ ]
91+ if ( importPaths === 'second level' ) {
92+ additionalTextEdits . push (
93+ vscode . TextEdit . insert (
94+ insertPosition ,
95+ imports
96+ . filter ( comp => ! finalExistingImports . has ( comp ) )
97+ . map ( comp =>
98+ comp . endsWith ( 'Icon' )
99+ ? `import ${ comp } from '@material-ui/icons/${ comp . substring (
100+ 0 ,
101+ comp . length - 4
102+ ) } '`
103+ : `import ${ comp } from '@material-ui/core/${ comp } '`
104+ )
105+ . join ( '\n' ) + '\n'
106+ )
107+ )
108+ } else {
109+ const coreImports = imports . filter (
110+ comp =>
111+ ! comp . endsWith ( 'Icon' ) && ! finalExistingImports . has ( comp )
112+ )
113+ const iconsImports = imports
114+ . filter (
115+ comp =>
116+ comp . endsWith ( 'Icon' ) && ! finalExistingImports . has ( comp )
117+ )
118+ . map (
119+ comp => `${ comp . substring ( 0 , comp . length - 4 ) } as ${ comp } `
120+ )
121+
122+ if ( coreImports . length ) {
123+ if ( coreInsertPosition ) {
124+ additionalTextEdits . push (
125+ vscode . TextEdit . insert (
126+ coreInsertPosition ,
127+ ', ' + coreImports . join ( ', ' )
128+ )
129+ )
130+ } else {
131+ additionalTextEdits . push (
132+ vscode . TextEdit . insert (
133+ insertPosition ,
134+ `import { ${ coreImports . join (
135+ ', '
136+ ) } } from '@material-ui/core'\n`
137+ )
138+ )
139+ }
140+ }
141+ if ( iconsImports . length ) {
142+ if ( iconsInsertPosition ) {
143+ additionalTextEdits . push (
144+ vscode . TextEdit . insert (
145+ iconsInsertPosition ,
146+ ', ' + iconsImports . join ( ', ' )
147+ )
148+ )
149+ } else {
150+ additionalTextEdits . push (
151+ vscode . TextEdit . insert (
152+ insertPosition ,
153+ `import { ${ iconsImports . join (
154+ ', '
155+ ) } } from '@material-ui/icons'\n`
156+ )
157+ )
158+ }
159+ }
160+ }
161+ if ( additionalTextEdits . length )
162+ snippetCompletion . additionalTextEdits = additionalTextEdits
87163 }
88164 result . push ( snippetCompletion )
89165 }
0 commit comments