@@ -5,7 +5,13 @@ import {
55 toSourceRanges ,
66} from '@volar/typescript/lib/node/transform' ;
77import { getServiceScript } from '@volar/typescript/lib/node/utils' ;
8- import { type Language , type VueCodeInformation , type VueCompilerOptions , VueVirtualCode } from '@vue/language-core' ;
8+ import {
9+ type Language ,
10+ tsCodegen ,
11+ type VueCodeInformation ,
12+ type VueCompilerOptions ,
13+ VueVirtualCode ,
14+ } from '@vue/language-core' ;
915import { capitalize , isGloballyAllowed } from '@vue/shared' ;
1016import type * as ts from 'typescript' ;
1117
@@ -31,31 +37,42 @@ export function preprocessLanguageService(
3137 if ( ! language ) {
3238 return result ;
3339 }
34- const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
40+ const [ serviceScript , , sourceScript ] = getServiceScript ( language , fileName ) ;
3541 if ( ! serviceScript || ! ( sourceScript ?. generated ?. root instanceof VueVirtualCode ) ) {
3642 return result ;
3743 }
44+ const codegen = tsCodegen . get ( sourceScript . generated . root . sfc ) ;
45+ const leadingOffset = sourceScript . snapshot . getLength ( ) ;
3846 for (
39- const sourceOffset of toSourceOffsets (
47+ const sourceRange of toSourceRanges (
4048 sourceScript ,
4149 language ,
4250 serviceScript ,
43- position ,
51+ result . textSpan . start ,
52+ result . textSpan . start + result . textSpan . length ,
53+ true ,
4454 ( ) => true ,
4555 )
4656 ) {
47- const generatedOffset2 = toGeneratedOffset (
57+ const generateRange2 = toGeneratedRange (
4858 language ,
4959 serviceScript ,
5060 sourceScript ,
51- sourceOffset [ 1 ] ,
61+ sourceRange [ 1 ] ,
62+ sourceRange [ 2 ] ,
5263 ( data : VueCodeInformation ) => ! ! data . __importCompletion ,
5364 ) ;
54- if ( generatedOffset2 !== undefined ) {
55- const extraInfo = getQuickInfoAtPosition ( fileName , generatedOffset2 , ...rests ) ;
56- if ( extraInfo ) {
57- result . tags ??= [ ] ;
58- result . tags . push ( ...extraInfo . tags ?? [ ] ) ;
65+ if ( generateRange2 !== undefined ) {
66+ const variableName = serviceScript . code . snapshot . getText (
67+ generateRange2 [ 0 ] - leadingOffset ,
68+ generateRange2 [ 1 ] - leadingOffset ,
69+ ) ;
70+ if ( codegen ?. getSetupExposed ( ) . has ( variableName ) ) {
71+ const extraInfo = getQuickInfoAtPosition ( fileName , generateRange2 [ 0 ] , ...rests ) ;
72+ if ( extraInfo ) {
73+ result . tags ??= [ ] ;
74+ result . tags . push ( ...extraInfo . tags ?? [ ] ) ;
75+ }
5976 }
6077 }
6178 }
@@ -67,10 +84,12 @@ export function preprocessLanguageService(
6784 if ( ! language ) {
6885 return result ;
6986 }
70- const [ serviceScript , _targetScript , sourceScript ] = getServiceScript ( language , fileName ) ;
87+ const [ serviceScript , , sourceScript ] = getServiceScript ( language , fileName ) ;
7188 if ( ! serviceScript || ! ( sourceScript ?. generated ?. root instanceof VueVirtualCode ) ) {
7289 return result ;
7390 }
91+ const codegen = tsCodegen . get ( sourceScript . generated . root . sfc ) ;
92+ const leadingOffset = sourceScript . snapshot . getLength ( ) ;
7493 for ( const diagnostic of result ) {
7594 for (
7695 const sourceRange of toSourceRanges (
@@ -92,9 +111,15 @@ export function preprocessLanguageService(
92111 ( data : VueCodeInformation ) => ! data . __importCompletion ,
93112 ) ;
94113 if ( generateRange2 !== undefined ) {
95- diagnostic . start = generateRange2 [ 0 ] ;
96- diagnostic . length = generateRange2 [ 1 ] - generateRange2 [ 0 ] ;
97- break ;
114+ const variableName = serviceScript . code . snapshot . getText (
115+ generateRange2 [ 0 ] - leadingOffset ,
116+ generateRange2 [ 1 ] - leadingOffset ,
117+ ) ;
118+ if ( codegen ?. getSetupExposed ( ) . has ( variableName ) ) {
119+ diagnostic . start = generateRange2 [ 0 ] ;
120+ diagnostic . length = generateRange2 [ 1 ] - generateRange2 [ 0 ] ;
121+ break ;
122+ }
98123 }
99124 }
100125 }
0 commit comments