@@ -23,168 +23,183 @@ export function preprocessLanguageService(
2323 } = languageService ;
2424
2525 languageService . getQuickInfoAtPosition = ( fileName , position , maximumLength ) => {
26- let result = getQuickInfoAtPosition ( fileName , position , maximumLength ) ;
26+ const result = getQuickInfoAtPosition ( fileName , position , maximumLength ) ;
27+ if ( ! result ) {
28+ return result ;
29+ }
2730 const language = getLanguage ( ) ;
28- if ( result && language ) {
29- const [ serviceScript , targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
30- if ( serviceScript && sourceScript ?. generated ?. root instanceof VueVirtualCode ) {
31- for (
32- const sourceOffset of toSourceOffsets (
33- sourceScript ,
34- language ,
35- serviceScript ,
36- position ,
37- ( ) => true ,
38- )
39- ) {
40- const generatedOffset2 = toGeneratedOffset (
41- language ,
42- serviceScript ,
43- sourceScript ,
44- sourceOffset [ 1 ] ,
45- ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
46- ) ;
47- if ( generatedOffset2 !== undefined ) {
48- const extraInfo = getQuickInfoAtPosition ( targetScript . id , generatedOffset2 , maximumLength ) ;
49- if ( extraInfo ) {
50- result . tags ??= [ ] ;
51- result . tags . push ( ...extraInfo . tags ?? [ ] ) ;
52- }
53- }
31+ if ( ! language ) {
32+ return result ;
33+ }
34+ const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
35+ if ( ! serviceScript || ! ( sourceScript ?. generated ?. root instanceof VueVirtualCode ) ) {
36+ return result ;
37+ }
38+ for (
39+ const sourceOffset of toSourceOffsets (
40+ sourceScript ,
41+ language ,
42+ serviceScript ,
43+ position ,
44+ ( ) => true ,
45+ )
46+ ) {
47+ const generatedOffset2 = toGeneratedOffset (
48+ language ,
49+ serviceScript ,
50+ sourceScript ,
51+ sourceOffset [ 1 ] ,
52+ ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
53+ ) ;
54+ if ( generatedOffset2 !== undefined ) {
55+ const extraInfo = getQuickInfoAtPosition ( fileName , generatedOffset2 , maximumLength ) ;
56+ if ( extraInfo ) {
57+ result . tags ??= [ ] ;
58+ result . tags . push ( ...extraInfo . tags ?? [ ] ) ;
5459 }
5560 }
5661 }
5762 return result ;
5863 } ;
5964 languageService . getSuggestionDiagnostics = fileName => {
60- const diagnostics = getSuggestionDiagnostics ( fileName ) ;
65+ const result = getSuggestionDiagnostics ( fileName ) ;
6166 const language = getLanguage ( ) ;
62- if ( language ) {
63- const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
64- if ( serviceScript && sourceScript ?. generated ?. root instanceof VueVirtualCode ) {
65- for ( const diagnostic of diagnostics ) {
66- for (
67- const sourceRange of toSourceRanges (
68- sourceScript ,
69- language ,
70- serviceScript ,
71- diagnostic . start ,
72- diagnostic . start + diagnostic . length ,
73- true ,
74- ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
75- )
76- ) {
77- const generateRange2 = toGeneratedRange (
78- language ,
79- serviceScript ,
80- sourceScript ,
81- sourceRange [ 1 ] ,
82- sourceRange [ 2 ] ,
83- ( data : VueCodeInformation ) => ! data . __importCompletion ,
84- ) ;
85- if ( generateRange2 !== undefined ) {
86- diagnostic . start = generateRange2 [ 0 ] ;
87- diagnostic . length = generateRange2 [ 1 ] - generateRange2 [ 0 ] ;
88- break ;
89- }
90- }
67+ if ( ! language ) {
68+ return result ;
69+ }
70+ const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
71+ if ( ! serviceScript || ! ( sourceScript ?. generated ?. root instanceof VueVirtualCode ) ) {
72+ return result ;
73+ }
74+ for ( const diagnostic of result ) {
75+ for (
76+ const sourceRange of toSourceRanges (
77+ sourceScript ,
78+ language ,
79+ serviceScript ,
80+ diagnostic . start ,
81+ diagnostic . start + diagnostic . length ,
82+ true ,
83+ ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
84+ )
85+ ) {
86+ const generateRange2 = toGeneratedRange (
87+ language ,
88+ serviceScript ,
89+ sourceScript ,
90+ sourceRange [ 1 ] ,
91+ sourceRange [ 2 ] ,
92+ ( data : VueCodeInformation ) => ! data . __importCompletion ,
93+ ) ;
94+ if ( generateRange2 !== undefined ) {
95+ diagnostic . start = generateRange2 [ 0 ] ;
96+ diagnostic . length = generateRange2 [ 1 ] - generateRange2 [ 0 ] ;
97+ break ;
9198 }
9299 }
93100 }
94- return diagnostics ;
101+ return result ;
95102 } ;
96103 languageService . getCompletionsAtPosition = ( fileName , position , preferences , formatOptions ) => {
97- let result = getCompletionsAtPosition ( fileName , position , preferences , formatOptions ) ;
104+ const result = getCompletionsAtPosition ( fileName , position , preferences , formatOptions ) ;
105+ if ( ! result ) {
106+ return result ;
107+ }
98108 const language = getLanguage ( ) ;
99- if ( language && result ) {
100- const [ serviceScript , targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
101- if ( serviceScript && sourceScript ?. generated ?. root instanceof VueVirtualCode ) {
102- for (
103- const sourceOffset of toSourceOffsets (
104- sourceScript ,
105- language ,
106- serviceScript ,
107- position ,
108- ( ) => true ,
109- )
110- ) {
111- const generatedOffset2 = toGeneratedOffset (
112- language ,
113- serviceScript ,
114- sourceScript ,
115- sourceOffset [ 1 ] ,
116- ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
117- ) ;
118- if ( generatedOffset2 !== undefined ) {
119- const completion2 = getCompletionsAtPosition ( targetScript . id , generatedOffset2 , preferences , formatOptions ) ;
120- if ( completion2 ) {
121- const nameToIndex = new Map ( result . entries . map ( ( entry , index ) => [ entry . name , index ] ) ) ;
122- for ( const entry of completion2 . entries ) {
123- if ( entry . kind === 'warning' ) {
124- continue ;
125- }
126- if ( nameToIndex . has ( entry . name ) ) {
127- const index = nameToIndex . get ( entry . name ) ! ;
128- const existingEntry = result . entries [ index ] ! ;
129- if ( existingEntry . kind === 'warning' ) {
130- result . entries [ index ] = entry ;
131- }
132- }
133- else {
134- result . entries . push ( entry ) ;
135- }
109+ if ( ! language ) {
110+ return result ;
111+ }
112+ const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
113+ if ( ! serviceScript || ! ( sourceScript ?. generated ?. root instanceof VueVirtualCode ) ) {
114+ return result ;
115+ }
116+ for (
117+ const sourceOffset of toSourceOffsets (
118+ sourceScript ,
119+ language ,
120+ serviceScript ,
121+ position ,
122+ ( ) => true ,
123+ )
124+ ) {
125+ const generatedOffset2 = toGeneratedOffset (
126+ language ,
127+ serviceScript ,
128+ sourceScript ,
129+ sourceOffset [ 1 ] ,
130+ ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
131+ ) ;
132+ if ( generatedOffset2 !== undefined ) {
133+ const completion2 = getCompletionsAtPosition ( fileName , generatedOffset2 , preferences , formatOptions ) ;
134+ if ( completion2 ) {
135+ const nameToIndex = new Map ( result . entries . map ( ( entry , index ) => [ entry . name , index ] ) ) ;
136+ for ( const entry of completion2 . entries ) {
137+ if ( entry . kind === 'warning' ) {
138+ continue ;
139+ }
140+ if ( nameToIndex . has ( entry . name ) ) {
141+ const index = nameToIndex . get ( entry . name ) ! ;
142+ const existingEntry = result . entries [ index ] ! ;
143+ if ( existingEntry . kind === 'warning' ) {
144+ result . entries [ index ] = entry ;
136145 }
137146 }
147+ else {
148+ result . entries . push ( entry ) ;
149+ }
138150 }
139151 }
140152 }
141153 }
142154 return result ;
143155 } ;
144156 languageService . getCodeFixesAtPosition = ( fileName , start , end , errorCodes , formatOptions , preferences ) => {
145- let fixes = getCodeFixesAtPosition ( fileName , start , end , errorCodes , formatOptions , preferences ) ;
157+ let result = getCodeFixesAtPosition ( fileName , start , end , errorCodes , formatOptions , preferences ) ;
158+ // Property 'xxx' does not exist on type 'yyy'.ts(2339)
159+ if ( ! errorCodes . includes ( 2339 ) ) {
160+ return result ;
161+ }
146162 const language = getLanguage ( ) ;
147- if (
148- language
149- && errorCodes . includes ( 2339 ) // Property 'xxx' does not exist on type 'yyy'.ts(2339)
163+ if ( ! language ) {
164+ return result ;
165+ }
166+ const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
167+ if ( ! serviceScript || ! ( sourceScript ?. generated ?. root instanceof VueVirtualCode ) ) {
168+ return result ;
169+ }
170+ for (
171+ const sourceRange of toSourceRanges (
172+ sourceScript ,
173+ language ,
174+ serviceScript ,
175+ start ,
176+ end ,
177+ true ,
178+ ( ) => true ,
179+ )
150180 ) {
151- const [ serviceScript , targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
152- if ( serviceScript && sourceScript ?. generated ?. root instanceof VueVirtualCode ) {
153- for (
154- const sourceRange of toSourceRanges (
155- sourceScript ,
156- language ,
157- serviceScript ,
158- start ,
159- end ,
160- true ,
161- ( ) => true ,
162- )
163- ) {
164- const generateRange2 = toGeneratedRange (
165- language ,
166- serviceScript ,
167- sourceScript ,
168- sourceRange [ 1 ] ,
169- sourceRange [ 2 ] ,
170- ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
171- ) ;
172- if ( generateRange2 !== undefined ) {
173- let importFixes = getCodeFixesAtPosition (
174- targetScript . id ,
175- generateRange2 [ 0 ] ,
176- generateRange2 [ 1 ] ,
177- [ 2304 ] , // Cannot find name 'xxx'.ts(2304)
178- formatOptions ,
179- preferences ,
180- ) ;
181- importFixes = importFixes . filter ( fix => fix . fixName === 'import' ) ;
182- fixes = fixes . concat ( importFixes ) ;
183- }
184- }
181+ const generateRange2 = toGeneratedRange (
182+ language ,
183+ serviceScript ,
184+ sourceScript ,
185+ sourceRange [ 1 ] ,
186+ sourceRange [ 2 ] ,
187+ ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
188+ ) ;
189+ if ( generateRange2 !== undefined ) {
190+ let importFixes = getCodeFixesAtPosition (
191+ fileName ,
192+ generateRange2 [ 0 ] ,
193+ generateRange2 [ 1 ] ,
194+ [ 2304 ] , // Cannot find name 'xxx'.ts(2304)
195+ formatOptions ,
196+ preferences ,
197+ ) ;
198+ importFixes = importFixes . filter ( fix => fix . fixName === 'import' ) ;
199+ result = result . concat ( importFixes ) ;
185200 }
186201 }
187- return fixes ;
202+ return result ;
188203 } ;
189204}
190205
0 commit comments