Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
ecff8a1
Add diagnostics for cells
vezwork Apr 29, 2026
85858e0
move document listeners to diagnostics manager
seeM May 5, 2026
42aa8d9
clear diagnostics when vdocs are closed
seeM May 5, 2026
a55aff0
cleanup vdoc after receiving its diagnostics
seeM May 5, 2026
bfb558d
use existing tempfile vdocs
seeM May 5, 2026
98ddce5
remove unused filter
seeM May 5, 2026
834579b
use a local tempfile when the vscode-R extension is handling diagnostics
seeM May 5, 2026
03c5a1e
also watch tests in dev build
seeM May 7, 2026
27dd6c2
forgot to remove this
seeM May 7, 2026
3d646ab
add some logs
seeM May 7, 2026
dd7bf0e
fix files not deleting because of an unknown language
seeM May 7, 2026
c8c579d
wip: diagnostics tests
seeM May 7, 2026
58d2986
add disposablestore.clear and format
seeM May 11, 2026
7df25e6
refining tests + cleaning up the implementation
seeM May 11, 2026
d938330
don't inject for diagnostic vdocs; rename to `diagnostics.ts`
seeM May 12, 2026
559eceb
extract `allLanguages` helper function
seeM May 12, 2026
14cfe83
cleaning up
seeM May 13, 2026
9076469
extract createVirtualDocFile from virtualDocUriFromTempFile
seeM May 13, 2026
d17727c
rewrite diagnostics manager with flat per-language sessions
seeM May 13, 2026
ba951e5
simplify: add warmup parameter to virtualDocUriFromTempFile instead o…
seeM May 13, 2026
5bf746b
add JSDoc to diagnostics interfaces, class, and constant
seeM May 13, 2026
c54c637
add timeout test for non-responsive language servers
seeM May 13, 2026
86807bc
fix async handling
seeM May 13, 2026
a9dafe1
delete all vdocs before tests
seeM May 13, 2026
a07361d
test that vdocs are cleaned up after no response timeout
seeM May 13, 2026
710a4f4
cleaner test output via QUIET env var
seeM May 13, 2026
1ac2e13
don't log when vdocs are already deleted
seeM May 13, 2026
444f481
typo
seeM May 13, 2026
9889ee4
add test coverage for vdoc cleanup, error-fix clearing, and line offsets
seeM May 13, 2026
78d548f
test that multiple cells of the same language each produce diagnostics
seeM May 13, 2026
e318eb0
activate sessions concurrently
seeM May 15, 2026
4d3ea32
parse tokens once per document open instead of once per language
seeM May 15, 2026
86146a0
fix type
seeM May 15, 2026
e5403e8
this code path was no longer used
seeM May 15, 2026
f594708
fix type
seeM May 15, 2026
5a21209
revert formatting
seeM May 15, 2026
1f1b510
simplify test log verbosity setting for claude
seeM May 15, 2026
2063059
clarify
seeM May 15, 2026
e7cf485
move diagnostic local tempfiles to `.quarto` dir
seeM May 15, 2026
5e66725
hook up quarto.cells.diagnostics.enabled setting
seeM May 15, 2026
a90ef90
rename
seeM May 15, 2026
6a8f08a
renames
seeM May 15, 2026
4d0c2de
flatten test helpers: replace withEmbeddedDiagnostics callback with n…
seeM May 15, 2026
4442497
cleaning up tests
seeM May 15, 2026
21cfd50
fix stale diagnostics when last cell is removed
seeM May 15, 2026
b6b4cde
fix jsdoc
seeM May 15, 2026
c71e767
add test fixture for julia-only diagnostics tests
seeM May 15, 2026
684a7a8
simplify active vdoc cleanup
seeM May 15, 2026
3e2017b
await vdoc cleanup on extension deactivation
seeM May 15, 2026
d66e27e
move event utils
seeM May 15, 2026
80eede6
remove unused function
seeM May 15, 2026
195acb6
refactor sessions to nested Map<docUri, Map<langId, session>>
seeM May 15, 2026
573a6e3
test vsdoc locations
seeM May 15, 2026
9d97b72
move toDelete into helpers
seeM May 15, 2026
c17832c
more directly check for leaked vdocs
seeM May 15, 2026
23e549f
simplify test
seeM May 15, 2026
728a4d8
fix diagnostics not clearing after timeout
seeM May 15, 2026
aa5e085
dispose during deactivate
seeM May 15, 2026
84d77a9
concurrently dispose vdocs
seeM May 15, 2026
6ef15ba
dont need this
seeM May 15, 2026
050d999
build new test folders too
seeM May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions apps/vscode/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ import * as glob from "glob";
const args = process.argv;
const dev = args[2] === "dev";
const test = args[2] === "test";
const testFiles = glob.sync("src/test/*.ts");
const testFiles = glob.sync("src/test/{*.ts,fixtures/*.ts,utils/*.ts}");

const testBuildOptions = {
entryPoints: testFiles,
outdir: 'test-out',
external: ['vscode', 'mocha', 'glob'],
sourcemap: true,
dev,
};

const defaultBuildOptions = {
Expand All @@ -36,4 +37,11 @@ const defaultBuildOptions = {
dev
};

runBuild(test ? testBuildOptions : defaultBuildOptions);
if (test) {
runBuild(testBuildOptions);
} else if (dev) {
runBuild(defaultBuildOptions);
runBuild(testBuildOptions);
} else {
runBuild(defaultBuildOptions);
}
16 changes: 15 additions & 1 deletion apps/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1003,6 +1003,20 @@
"default": true,
"markdownDescription": "Show parameter help when editing function calls."
},
"quarto.cells.diagnostics.enabled": {
"order": 25,
"scope": "window",
"type": "boolean",
"default": true,
"markdownDescription": "Enable diagnostics (linting) for code blocks from language servers."
},
"quarto.cells.diagnostics.debounceDelay": {
"order": 26,
"scope": "window",
"type": "number",
"default": 500,
"markdownDescription": "Delay in milliseconds before updating diagnostics after document changes."
},
"quarto.cells.background.enabled": {
"type": "boolean",
"description": "Enable coloring the background of executable code cells.",
Expand Down Expand Up @@ -1049,7 +1063,7 @@
"markdownDescription": "Millisecond delay between background color updates."
},
"quarto.cells.useReticulate": {
"order": 25,
"order": 27,
"scope": "window",
"type": "boolean",
"default": true,
Expand Down
24 changes: 1 addition & 23 deletions apps/vscode/src/lsp/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import {
Definition,
LogOutputChannel,
Uri,
Diagnostic,
window,
ColorThemeKind
} from "vscode";
Expand All @@ -49,7 +48,6 @@ import {
ProvideHoverSignature,
ProvideSignatureHelpSignature,
State,
HandleDiagnosticsSignature
} from "vscode-languageclient";
import { MarkdownEngine } from "../markdown/engine";
import {
Expand All @@ -58,7 +56,6 @@ import {
virtualDoc,
withVirtualDocUri,
} from "../vdoc/vdoc";
import { isVirtualDoc } from "../vdoc/vdoc-tempfile";
import { activateVirtualDocEmbeddedContent } from "../vdoc/vdoc-content";
import { vdocCompletions } from "../vdoc/vdoc-completion";

Expand All @@ -79,7 +76,7 @@ export async function activateLsp(
context: ExtensionContext,
quartoContext: QuartoContext,
engine: MarkdownEngine,
outputChannel: LogOutputChannel
outputChannel: LogOutputChannel,
) {

// The server is implemented in node
Expand All @@ -105,7 +102,6 @@ export async function activateLsp(
const config = workspace.getConfiguration("quarto");
activateVirtualDocEmbeddedContent();
const middleware: Middleware = {
handleDiagnostics: createDiagnosticFilter(),
provideCompletionItem: embeddedCodeCompletionProvider(engine),
provideDefinition: embeddedGoToDefinitionProvider(engine),
provideDocumentFormattingEdits: embeddedDocumentFormattingProvider(engine),
Expand Down Expand Up @@ -363,21 +359,3 @@ function isWithinYamlComment(doc: TextDocument, pos: Position) {
const line = doc.lineAt(pos.line).text;
return !!line.match(/^\s*#\s*\| /);
}

/**
* Creates a diagnostic handler middleware that filters out diagnostics from virtual documents
*
* @returns A handler function for the middleware
*/
export function createDiagnosticFilter() {
return (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => {
// If this is not a virtual document, pass through all diagnostics
if (!isVirtualDoc(uri)) {
next(uri, diagnostics);
return;
}

// For virtual documents, filter out all diagnostics
next(uri, []);
};
}
8 changes: 8 additions & 0 deletions apps/vscode/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { tryAcquirePositronApi } from "@posit-dev/positron";
import { MarkdownEngine } from "./markdown/engine";
import { kQuartoDocSelector } from "./core/doc";
import { activateLsp, deactivate as deactivateLsp } from "./lsp/client";
import { activateEmbeddedDiagnostics, type EmbeddedDiagnosticsService } from "./providers/diagnostics";
import { cellCommands } from "./providers/cell/commands";
import { quartoCellExecuteCodeLensProvider } from "./providers/cell/codelens";
import { activateQuartoAssistPanel } from "./providers/assist/panel";
Expand Down Expand Up @@ -50,6 +51,8 @@ import { activateContextKeySetter } from "./providers/context-keys";
import { CommandManager } from "./core/command";
import { createQuartoExtensionApi, QuartoExtensionApi } from "./api";

let embeddedDiagnostics: EmbeddedDiagnosticsService | undefined;

/**
* Entry point for the entire extension! This initializes the LSP, quartoContext, extension host, and more...
*/
Expand Down Expand Up @@ -117,6 +120,10 @@ export async function activate(context: vscode.ExtensionContext): Promise<Quarto
// deno config
activateDenoConfig(context, engine);

// embedded diagnostics
embeddedDiagnostics = activateEmbeddedDiagnostics(engine, outputChannel);
context.subscriptions.push(embeddedDiagnostics);

// lsp
const lspClient = await activateLsp(context, quartoContext, engine, outputChannel);

Expand Down Expand Up @@ -279,5 +286,6 @@ function registerQuartoPathConfigListener(context: vscode.ExtensionContext, outp
}

export async function deactivate() {
await embeddedDiagnostics?.deactivate();
return deactivateLsp();
}
Loading
Loading