fix diagnostics

pull/9385/head
Rich Harris 3 years ago
parent 9b3c38b116
commit 27d556c398

@ -1,62 +1,49 @@
<script> <script>
import { get_repl_context } from '$lib/context.js'; import { get_repl_context } from '$lib/context.js';
import { get_full_filename } from '$lib/utils.js';
import CodeMirror from '../CodeMirror.svelte'; import CodeMirror from '../CodeMirror.svelte';
/** @type {boolean} */ /** @type {boolean} */
export let autocomplete; export let autocomplete;
/** @type {any} */ // TODO
export let error;
/** @type {any[]} */ // TODO
export let warnings;
export function focus() { export function focus() {
$module_editor?.focus(); $module_editor?.focus();
} }
const { bundle, handle_change, module_editor, selected, bundling } = get_repl_context(); const { handle_change, module_editor } = get_repl_context();
</script>
async function diagnostics() {
/** @type {import('@codemirror/lint').Diagnostic[]} */
const diagnostics = [];
if (!$selected || !$bundle) return diagnostics;
await $bundling;
const filename = get_full_filename($selected);
if ( <div class="editor-wrapper">
$bundle.error && <div class="editor notranslate" translate="no">
$bundle.error.filename === filename && <CodeMirror
$bundle.error.start && bind:this={$module_editor}
$bundle.error.end {autocomplete}
) { diagnostics={() => {
diagnostics.push({ if (error) {
from: $bundle.error.start.character, return [{
to: $bundle.error.end.character,
severity: 'error', severity: 'error',
message: $bundle.error.message from: error.position[0],
}); to: error.position[1],
message: error.message
}];
} }
for (const warning of $bundle.warnings) { if (warnings) {
if (warning.filename === filename) { return warnings.map((warning) => ({
diagnostics.push({ severity: 'warning',
from: warning.start.character, from: warning.start.character,
to: warning.end.character, to: warning.end.character,
severity: 'warning', message: warning.message,
message: warning.message }));
});
}
} }
return diagnostics; return [];
} }}
</script>
<div class="editor-wrapper">
<div class="editor notranslate" translate="no">
<CodeMirror
bind:this={$module_editor}
{autocomplete}
diagnostics={$selected && $bundle ? diagnostics : () => []}
on:change={handle_change} on:change={handle_change}
/> />
</div> </div>

@ -247,15 +247,21 @@
/** @type {import('./workers/workers').CompileMessageData | null} */ /** @type {import('./workers/workers').CompileMessageData | null} */
let compiled = null; let compiled = null;
$: if (compiler && $selected) { /**
* @param {import('./types').File | null} $selected
* @param {import('svelte/compiler').CompileOptions} $compile_options
*/
async function recompile($selected, $compile_options) {
if (!compiler || !$selected) return;
if ($selected.type === 'svelte' || $selected.type === 'js') { if ($selected.type === 'svelte' || $selected.type === 'js') {
compiler.compile($selected, $compile_options, false).then((data) => { compiled = await compiler.compile($selected, $compile_options, false);
compiled = data; $runes_mode = compiled.metadata?.runes ?? false;
$runes_mode = data.metadata?.runes ?? false;
});
} }
} }
$: recompile($selected, $compile_options);
$: mobile = width < 540; $: mobile = width < 540;
$: $toggleable = mobile && orientation === 'columns'; $: $toggleable = mobile && orientation === 'columns';
@ -319,7 +325,7 @@
> >
<section slot="a"> <section slot="a">
<ComponentSelector show_modified={showModified} on:add on:remove /> <ComponentSelector show_modified={showModified} on:add on:remove />
<ModuleEditor {autocomplete} /> <ModuleEditor {autocomplete} error={compiled?.result.error} warnings={compiled?.result.warnings ?? []} />
</section> </section>
<section slot="b" style="height: 100%;"> <section slot="b" style="height: 100%;">

@ -69,9 +69,10 @@ function compile({ id, source, options, return_ast }) {
result: { result: {
js: js.code, js: js.code,
css: css?.code || `/* Add a <sty` + `le> tag to see compiled CSS */`, css: css?.code || `/* Add a <sty` + `le> tag to see compiled CSS */`,
warnings error: null,
}, warnings,
metadata metadata
}
}; };
} else if (options.filename.endsWith('.svelte.js')) { } else if (options.filename.endsWith('.svelte.js')) {
const compiled = svelte.compileModule(source, { const compiled = svelte.compileModule(source, {
@ -85,9 +86,10 @@ function compile({ id, source, options, return_ast }) {
result: { result: {
js: compiled.js.code, js: compiled.js.code,
css, css,
warnings: compiled.warnings error: null,
}, warnings: compiled.warnings,
metadata: compiled.metadata metadata: compiled.metadata
}
}; };
} }
} }
@ -96,7 +98,10 @@ function compile({ id, source, options, return_ast }) {
id, id,
result: { result: {
js: `// Select a component, or a '.svelte.js' module that uses runes, to see compiled output`, js: `// Select a component, or a '.svelte.js' module that uses runes, to see compiled output`,
css css,
error: null,
warnings: [],
metadata: null
} }
}; };
} catch (err) { } catch (err) {
@ -107,7 +112,13 @@ function compile({ id, source, options, return_ast }) {
id, id,
result: { result: {
js: message, js: message,
css: message css: message,
error: {
message: err.message,
position: err.position
},
warnings: [],
metadata: null
} }
}; };
} }

Loading…
Cancel
Save