@@ -20,15 +20,16 @@ import { ExtensionHost, HostWebviewPanel, HostStatementRangeProvider } from '.';
2020import { CellExecutor , cellExecutorForLanguage , executableLanguages , isKnitrDocument , pythonWithReticulate } from './executors' ;
2121import { ExecuteQueue } from './execute-queue' ;
2222import { MarkdownEngine } from '../markdown/engine' ;
23- import { virtualDoc , virtualDocUri , adjustedPosition } from "../vdoc/vdoc" ;
23+ import { virtualDoc , virtualDocUri , adjustedPosition , unadjustedRange } from "../vdoc/vdoc" ;
24+ import { EmbeddedLanguage } from '../vdoc/languages' ;
2425
2526declare global {
26- function acquirePositronApi ( ) : hooks . PositronApi ;
27+ function acquirePositronApi ( ) : hooks . PositronApi ;
2728}
2829
29- let api : hooks . PositronApi | null | undefined ;
30+ let api : hooks . PositronApi | null | undefined ;
3031
31- export function hooksApi ( ) : hooks . PositronApi | null {
32+ export function hooksApi ( ) : hooks . PositronApi | null {
3233 if ( api === undefined ) {
3334 try {
3435 api = acquirePositronApi ( ) ;
@@ -43,20 +44,20 @@ export function hasHooks() {
4344 return ! ! hooksApi ( ) ;
4445}
4546
46- export function hooksExtensionHost ( ) : ExtensionHost {
47+ export function hooksExtensionHost ( ) : ExtensionHost {
4748 return {
4849 // supported executable languages (we delegate to the default for langugaes
4950 // w/o runtimes so we support all languages)
5051 executableLanguages,
5152
52- cellExecutorForLanguage : async ( language : string , document : vscode . TextDocument , engine : MarkdownEngine , silent ?: boolean )
53+ cellExecutorForLanguage : async ( language : string , document : vscode . TextDocument , engine : MarkdownEngine , silent ?: boolean )
5354 : Promise < CellExecutor | undefined > => {
54- switch ( language ) {
55+ switch ( language ) {
5556 // use hooks for known runtimes
5657 case "python" :
5758 case "r" :
5859 return {
59- execute : async ( blocks : string [ ] , _editorUri ?: vscode . Uri ) : Promise < void > => {
60+ execute : async ( blocks : string [ ] , _editorUri ?: vscode . Uri ) : Promise < void > => {
6061 const runtime = hooksApi ( ) ?. runtime ;
6162
6263 if ( runtime === undefined ) {
@@ -68,7 +69,7 @@ export function hooksExtensionHost() : ExtensionHost {
6869 language = "r" ;
6970 blocks = blocks . map ( pythonWithReticulate ) ;
7071 }
71-
72+
7273 // Our callback executes each block sequentially
7374 const callback = async ( ) => {
7475 for ( const block of blocks ) {
@@ -78,9 +79,9 @@ export function hooksExtensionHost() : ExtensionHost {
7879
7980 await ExecuteQueue . instance . add ( language , callback ) ;
8081 } ,
81- executeSelection : async ( ) : Promise < void > => {
82- await vscode . commands . executeCommand ( 'workbench.action.positronConsole.executeCode' , { languageId : language } ) ;
83- }
82+ executeSelection : async ( ) : Promise < void > => {
83+ await vscode . commands . executeCommand ( 'workbench.action.positronConsole.executeCode' , { languageId : language } ) ;
84+ }
8485 } ;
8586
8687 // delegate for other languages
@@ -92,16 +93,16 @@ export function hooksExtensionHost() : ExtensionHost {
9293 registerStatementRangeProvider : ( engine : MarkdownEngine ) : vscode . Disposable => {
9394 const hooks = hooksApi ( ) ;
9495 if ( hooks ) {
95- return hooks . languages . registerStatementRangeProvider ( 'quarto' ,
96+ return hooks . languages . registerStatementRangeProvider ( 'quarto' ,
9697 new EmbeddedStatementRangeProvider ( engine ) ) ;
9798 }
98- return new vscode . Disposable ( ( ) => { } ) ;
99+ return new vscode . Disposable ( ( ) => { } ) ;
99100 } ,
100101
101102 createPreviewPanel : (
102- viewType : string ,
103+ viewType : string ,
103104 title : string ,
104- preserveFocus ?: boolean ,
105+ preserveFocus ?: boolean ,
105106 options ?: vscode . WebviewPanelOptions & vscode . WebviewOptions
106107 ) : HostWebviewPanel => {
107108
@@ -117,7 +118,7 @@ export function hooksExtensionHost() : ExtensionHost {
117118 portMapping : options ?. portMapping
118119 }
119120 ) ! ;
120-
121+
121122 // adapt to host interface
122123 return new HookWebviewPanel ( panel ) ;
123124 }
@@ -126,7 +127,7 @@ export function hooksExtensionHost() : ExtensionHost {
126127
127128
128129class HookWebviewPanel implements HostWebviewPanel {
129- constructor ( private readonly panel_ : hooks . PreviewPanel ) { }
130+ constructor ( private readonly panel_ : hooks . PreviewPanel ) { }
130131
131132 get webview ( ) { return this . panel_ . webview ; } ;
132133 get visible ( ) { return this . panel_ . visible ; } ;
@@ -139,43 +140,49 @@ class HookWebviewPanel implements HostWebviewPanel {
139140}
140141
141142class EmbeddedStatementRangeProvider implements HostStatementRangeProvider {
142- private readonly _engine : MarkdownEngine ;
143+ private readonly _engine : MarkdownEngine ;
143144
144- constructor (
145- readonly engine : MarkdownEngine ,
146- ) {
147- this . _engine = engine ;
148- }
145+ constructor (
146+ readonly engine : MarkdownEngine ,
147+ ) {
148+ this . _engine = engine ;
149+ }
149150
150151 async provideStatementRange (
151- document : vscode . TextDocument ,
152- position : vscode . Position ,
153- token : vscode . CancellationToken ) : Promise < hooks . StatementRange | undefined > {
154- const vdoc = await virtualDoc ( document , position , this . _engine ) ;
155- if ( vdoc ) {
156- const vdocUri = await virtualDocUri ( vdoc , document . uri , "statementRange" ) ;
157- try {
158- return getStatementRange ( vdocUri . uri , adjustedPosition ( vdoc . language , position ) ) ;
159- } catch ( error ) {
160- return undefined ;
161- } finally {
162- if ( vdocUri . cleanup ) {
163- await vdocUri . cleanup ( ) ;
164- }
165- }
166- } else {
152+ document : vscode . TextDocument ,
153+ position : vscode . Position ,
154+ token : vscode . CancellationToken ) : Promise < hooks . StatementRange | undefined > {
155+ const vdoc = await virtualDoc ( document , position , this . _engine ) ;
156+ if ( vdoc ) {
157+ const vdocUri = await virtualDocUri ( vdoc , document . uri , "statementRange" ) ;
158+ try {
159+ return getStatementRange (
160+ vdocUri . uri ,
161+ adjustedPosition ( vdoc . language , position ) ,
162+ vdoc . language
163+ ) ;
164+ } catch ( error ) {
167165 return undefined ;
166+ } finally {
167+ if ( vdocUri . cleanup ) {
168+ await vdocUri . cleanup ( ) ;
169+ }
168170 }
169- } ;
171+ } else {
172+ return undefined ;
173+ }
174+ } ;
170175}
171176
172177async function getStatementRange (
173178 uri : vscode . Uri ,
174179 position : vscode . Position ,
180+ language : EmbeddedLanguage
175181) {
176- return await vscode . commands . executeCommand < hooks . StatementRange > (
182+ const result = await vscode . commands . executeCommand < hooks . StatementRange > (
177183 "vscode.executeStatementRangeProvider" ,
178184 uri ,
179185 position
180186 ) ;
187+ return { range : unadjustedRange ( language , result . range ) , code : result . code } ;
181188}
0 commit comments