11import * as vue from '@vue/language-core' ;
2- import { decorateLanguageService , decorateLanguageServiceHost , getExternalFiles } from '@vue/typescript' ;
2+ import { decorateLanguageService , decorateLanguageServiceHost , searchExternalFiles } from '@vue/typescript' ;
33import type * as ts from 'typescript/lib/tsserverlibrary' ;
44
55const externalFiles = new WeakMap < ts . server . Project , string [ ] > ( ) ;
@@ -32,9 +32,18 @@ const init: ts.server.PluginModuleFactory = (modules) => {
3232 }
3333 }
3434 } ,
35- getExternalFiles ( project ) {
36- if ( ! externalFiles . has ( project ) ) {
37- externalFiles . set ( project , getExternalFiles ( ts , project , [ '.vue' ] ) ) ;
35+ getExternalFiles ( project , updateLevel = - 1 ) {
36+ if (
37+ // @ts -expect-error wait for TS 5.3
38+ updateLevel >= 1 satisfies ts . ProgramUpdateLevel . RootNamesAndUpdate
39+ || ! externalFiles . has ( project )
40+ ) {
41+ const oldFiles = externalFiles . get ( project ) ;
42+ const newFiles = searchExternalFiles ( ts , project , [ '.vue' ] ) ;
43+ externalFiles . set ( project , newFiles ) ;
44+ if ( oldFiles ) {
45+ refreshDiagnosticsIfNeeded ( project , oldFiles , newFiles ) ;
46+ }
3847 }
3948 return externalFiles . get ( project ) ! ;
4049 } ,
@@ -43,3 +52,19 @@ const init: ts.server.PluginModuleFactory = (modules) => {
4352} ;
4453
4554export = init ;
55+
56+ function refreshDiagnosticsIfNeeded ( project : ts . server . Project , oldExternalFiles : string [ ] , newExternalFiles : string [ ] ) {
57+ let dirty = oldExternalFiles . length !== newExternalFiles . length ;
58+ if ( ! dirty ) {
59+ const set = new Set ( oldExternalFiles ) ;
60+ for ( const file of newExternalFiles ) {
61+ if ( ! set . has ( file ) ) {
62+ dirty = true ;
63+ break ;
64+ }
65+ }
66+ }
67+ if ( dirty ) {
68+ project . refreshDiagnostics ( ) ;
69+ }
70+ }
0 commit comments