Skip to content

Commit aa4a131

Browse files
committed
feat(vscode): rendered window is now more appropriate
1 parent fa43912 commit aa4a131

3 files changed

Lines changed: 87 additions & 7 deletions

File tree

vscode/extension/src/commands/renderModel.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ import * as vscode from 'vscode'
22
import { LSPClient } from '../lsp/lsp'
33
import { isErr } from '@bus/result'
44
import { RenderModelEntry } from '../lsp/custom'
5+
import { RenderedModelProvider } from '../providers/renderedModelProvider'
56

6-
export function renderModel(lspClient?: LSPClient) {
7+
export function renderModel(
8+
lspClient?: LSPClient,
9+
renderedModelProvider?: RenderedModelProvider,
10+
) {
711
return async () => {
812
// Get the current active editor
913
const activeEditor = vscode.window.activeTextEditor
@@ -62,11 +66,19 @@ export function renderModel(lspClient?: LSPClient) {
6266
selectedModel = result.value.models[0]
6367
}
6468

65-
// Create a new untitled document with the rendered SQL
66-
const document = await vscode.workspace.openTextDocument({
67-
language: 'sql',
68-
content: selectedModel.rendered_query,
69-
})
69+
if (!renderedModelProvider) {
70+
vscode.window.showErrorMessage('Rendered model provider not available')
71+
return
72+
}
73+
74+
// Store the rendered content and get a virtual URI
75+
const uri = renderedModelProvider.storeRenderedModel(
76+
selectedModel.name,
77+
selectedModel.rendered_query,
78+
)
79+
80+
// Open the virtual document
81+
const document = await vscode.workspace.openTextDocument(uri)
7082

7183
// Determine the view column for side-by-side display
7284
let viewColumn: vscode.ViewColumn
@@ -86,5 +98,8 @@ export function renderModel(lspClient?: LSPClient) {
8698
preview: true,
8799
preserveFocus: false,
88100
})
101+
102+
// Explicitly set the language mode to SQL for syntax highlighting
103+
await vscode.languages.setTextDocumentLanguage(document, 'sql')
89104
}
90105
}

vscode/extension/src/extension.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
} from './utilities/errors'
2323
import { selector, completionProvider } from './completion/completion'
2424
import { LineagePanel } from './webviews/lineagePanel'
25+
import { RenderedModelProvider } from './providers/renderedModelProvider'
2526

2627
let lspClient: LSPClient | undefined
2728

@@ -65,10 +66,20 @@ export async function activate(context: vscode.ExtensionContext) {
6566

6667
lspClient = new LSPClient()
6768

69+
// Create and register the rendered model provider
70+
const renderedModelProvider = new RenderedModelProvider()
71+
context.subscriptions.push(
72+
vscode.workspace.registerTextDocumentContentProvider(
73+
RenderedModelProvider.getScheme(),
74+
renderedModelProvider,
75+
),
76+
renderedModelProvider,
77+
)
78+
6879
context.subscriptions.push(
6980
vscode.commands.registerCommand(
7081
'sqlmesh.renderModel',
71-
renderModel(lspClient),
82+
renderModel(lspClient, renderedModelProvider),
7283
),
7384
)
7485

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import * as vscode from 'vscode'
2+
3+
/**
4+
* Content provider for read-only rendered SQL models
5+
*/
6+
export class RenderedModelProvider
7+
implements vscode.TextDocumentContentProvider
8+
{
9+
private static readonly scheme = 'sqlmesh-rendered'
10+
11+
private renderedModels = new Map<string, string>()
12+
13+
// Event emitter for content changes
14+
private _onDidChange = new vscode.EventEmitter<vscode.Uri>()
15+
readonly onDidChange = this._onDidChange.event
16+
17+
/**
18+
* Provide text content for a given URI
19+
*/
20+
provideTextDocumentContent(uri: vscode.Uri): string {
21+
const key = uri.toString()
22+
return this.renderedModels.get(key) || ''
23+
}
24+
25+
/**
26+
* Store rendered model content and create a URI for it
27+
*/
28+
storeRenderedModel(modelName: string, content: string): vscode.Uri {
29+
const fileName = `${modelName} (rendered)`
30+
// Use vscode.Uri.from for proper URI construction
31+
const uri = vscode.Uri.from({
32+
scheme: RenderedModelProvider.scheme,
33+
path: fileName,
34+
})
35+
this.renderedModels.set(uri.toString(), content)
36+
this._onDidChange.fire(uri)
37+
return uri
38+
}
39+
40+
/**
41+
* Get the URI scheme for rendered models
42+
*/
43+
static getScheme(): string {
44+
return this.scheme
45+
}
46+
47+
/**
48+
* Clean up old rendered models to prevent memory leaks
49+
*/
50+
dispose() {
51+
this.renderedModels.clear()
52+
this._onDidChange.dispose()
53+
}
54+
}

0 commit comments

Comments
 (0)