@@ -12,8 +12,10 @@ import {
1212 SignatureHelpContext ,
1313 workspace ,
1414 window ,
15+ Range ,
1516 ColorThemeKind ,
1617 ConfigurationTarget ,
18+ MarkdownString ,
1719} from "vscode" ;
1820import {
1921 LanguageClient ,
@@ -31,6 +33,7 @@ import {
3133 TextDocument ,
3234} from "vscode" ;
3335import {
36+ MarkedString ,
3437 Middleware ,
3538 ProvideCompletionItemsSignature ,
3639 ProvideHoverSignature ,
@@ -41,6 +44,7 @@ import { virtualDoc, virtualDocUri } from "../vdoc/vdoc";
4144import { activateVirtualDocEmbeddedContent } from "../vdoc/vdoc-content" ;
4245import { deactivateVirtualDocTempFiles } from "../vdoc/vdoc-tempfile" ;
4346import { imageHover } from "../providers/hover-image" ;
47+ import { EmbeddedLanguage } from "../vdoc/languages" ;
4448
4549let client : LanguageClient ;
4650
@@ -145,14 +149,30 @@ function embeddedCodeCompletionProvider(engine: MarkdownEngine) {
145149 // get uri for completions
146150 const vdocUri = await virtualDocUri ( vdoc , document . uri ) ;
147151
148- // execute completions
149152 try {
150- return await commands . executeCommand < CompletionList > (
153+ const completions = await commands . executeCommand < CompletionList > (
151154 "vscode.executeCompletionItemProvider" ,
152155 vdocUri ,
153- position ,
156+ adjustedPosition ( language , position ) ,
154157 context . triggerCharacter
155158 ) ;
159+ return completions . items . map ( ( completion ) => {
160+ if ( language . inject && completion . range ) {
161+ if ( completion . range instanceof Range ) {
162+ completion . range = unadjustedRange ( language , completion . range ) ;
163+ } else {
164+ completion . range . inserting = unadjustedRange (
165+ language ,
166+ completion . range . inserting
167+ ) ;
168+ completion . range . replacing = unadjustedRange (
169+ language ,
170+ completion . range . replacing
171+ ) ;
172+ }
173+ }
174+ return completion ;
175+ } ) ;
156176 } catch ( error ) {
157177 return undefined ;
158178 }
@@ -182,15 +202,24 @@ function embeddedHoverProvider(engine: MarkdownEngine) {
182202
183203 // execute hover
184204 try {
185- const hover = await commands . executeCommand < Hover [ ] > (
205+ const hovers = await commands . executeCommand < Hover [ ] > (
186206 "vscode.executeHoverProvider" ,
187207 vdocUri ,
188- position
208+ adjustedPosition ( vdoc . language , position )
189209 ) ;
190- if ( hover && hover . length > 0 ) {
191- // reutrn the last hover (arbitrary, but it seems like the
192- // LSP results are returned second)
193- return hover [ hover . length - 1 ] ;
210+ if ( hovers && hovers . length > 0 ) {
211+ // consolidate content
212+ const contents = new Array < MarkdownString | MarkedString > ( ) ;
213+ hovers . forEach ( ( hover ) => {
214+ hover . contents . forEach ( ( hoverContent ) => {
215+ contents . push ( hoverContent ) ;
216+ } ) ;
217+ } ) ;
218+ // adjust range if required
219+ const range = hovers [ 0 ] . range
220+ ? unadjustedRange ( vdoc . language , hovers [ 0 ] . range )
221+ : undefined ;
222+ return new Hover ( contents , range ) ;
194223 }
195224 } catch ( error ) {
196225 console . log ( error ) ;
@@ -217,7 +246,7 @@ function embeddedSignatureHelpProvider(engine: MarkdownEngine) {
217246 return await commands . executeCommand < SignatureHelp > (
218247 "vscode.executeSignatureHelpProvider" ,
219248 vdocUri ,
220- position ,
249+ adjustedPosition ( vdoc . language , position ) ,
221250 context . triggerCharacter
222251 ) ;
223252 } catch ( error ) {
@@ -229,6 +258,20 @@ function embeddedSignatureHelpProvider(engine: MarkdownEngine) {
229258 } ;
230259}
231260
261+ // adjust position for inject
262+ const adjustedPosition = ( language : EmbeddedLanguage , pos : Position ) => {
263+ return new Position ( pos . line + ( language . inject ?. length || 0 ) , pos . character ) ;
264+ } ;
265+ const unadjustedPosition = ( language : EmbeddedLanguage , pos : Position ) => {
266+ return new Position ( pos . line - ( language . inject ?. length || 0 ) , pos . character ) ;
267+ } ;
268+ const unadjustedRange = ( language : EmbeddedLanguage , range : Range ) => {
269+ return new Range (
270+ unadjustedPosition ( language , range . start ) ,
271+ unadjustedPosition ( language , range . end )
272+ ) ;
273+ } ;
274+
232275function isWithinYamlComment ( doc : TextDocument , pos : Position ) {
233276 const line = doc . lineAt ( pos . line ) . text ;
234277 return ! ! line . match ( / ^ \s * # \s * \| / ) ;
0 commit comments