remove suss linter ext we dont use (#3150)
remove suss linter ext we dont use Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
@ -925,10 +925,10 @@ test.describe('Editor tests', () => {
|
|||||||
|
|
||||||
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
|
await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
|
||||||
await expect(
|
await expect(
|
||||||
page.locator('.cm-lintRange.cm-lintRange-error').first()
|
page.locator('.cm-lint-marker.cm-lint-marker-error')
|
||||||
).toBeVisible()
|
).toBeVisible()
|
||||||
|
|
||||||
await page.locator('.cm-lintRange.cm-lintRange-error').hover()
|
await page.locator('.cm-lint-marker.cm-lint-marker-error').hover()
|
||||||
await expect(page.locator('.cm-diagnosticText').first()).toBeVisible()
|
await expect(page.locator('.cm-diagnosticText').first()).toBeVisible()
|
||||||
await expect(
|
await expect(
|
||||||
page.getByText('Cannot redefine `topAng`').first()
|
page.getByText('Cannot redefine `topAng`').first()
|
||||||
@ -1045,7 +1045,7 @@ test.describe('Editor tests', () => {
|
|||||||
await page.hover('.cm-lint-marker-error')
|
await page.hover('.cm-lint-marker-error')
|
||||||
const searchText =
|
const searchText =
|
||||||
'sketch profile must lie entirely on one side of the revolution axis'
|
'sketch profile must lie entirely on one side of the revolution axis'
|
||||||
await expect(page.getByText(searchText).first()).toBeVisible()
|
await expect(page.getByText(searchText)).toBeVisible()
|
||||||
})
|
})
|
||||||
test.describe('Autocomplete works', () => {
|
test.describe('Autocomplete works', () => {
|
||||||
test('with enter/click to accept the completion', async ({ page }) => {
|
test('with enter/click to accept the completion', async ({ page }) => {
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
import { Extension } from '@codemirror/state'
|
|
||||||
import { linter, forEachDiagnostic, Diagnostic } from '@codemirror/lint'
|
|
||||||
|
|
||||||
export default function lspLintExt(): Extension {
|
|
||||||
return linter((view) => {
|
|
||||||
let diagnostics: Diagnostic[] = []
|
|
||||||
forEachDiagnostic(view.state, (d: Diagnostic, from: number, to: number) => {
|
|
||||||
diagnostics.push(d)
|
|
||||||
})
|
|
||||||
return diagnostics
|
|
||||||
})
|
|
||||||
}
|
|
@ -36,7 +36,6 @@ import lspAutocompleteExt from './autocomplete'
|
|||||||
import lspHoverExt from './hover'
|
import lspHoverExt from './hover'
|
||||||
import lspFormatExt from './format'
|
import lspFormatExt from './format'
|
||||||
import lspIndentExt from './indent'
|
import lspIndentExt from './indent'
|
||||||
import lspLintExt from './lint'
|
|
||||||
import lspSemanticTokensExt from './semantic-tokens'
|
import lspSemanticTokensExt from './semantic-tokens'
|
||||||
|
|
||||||
const useLast = (values: readonly any[]) => values.reduce((_, v) => v, '')
|
const useLast = (values: readonly any[]) => values.reduce((_, v) => v, '')
|
||||||
@ -216,20 +215,6 @@ export class LanguageServerPlugin implements PluginValue {
|
|||||||
|
|
||||||
if (!this.client.ready) return
|
if (!this.client.ready) return
|
||||||
|
|
||||||
// TODO(paultag): This is the *wrong* place for this to live.
|
|
||||||
//
|
|
||||||
// We need to clear diagnostics before updating the code, because
|
|
||||||
// if the code shrinks, the errors/diagnostics can go out of range
|
|
||||||
// of the source code, which cause an exception, breaking all the
|
|
||||||
// things.
|
|
||||||
//
|
|
||||||
// We need some sort of clear diagnostics boolean on the editor
|
|
||||||
// and we can drop this.
|
|
||||||
this.view.dispatch({
|
|
||||||
effects: [setDiagnosticsEffect.of([])],
|
|
||||||
annotations: [],
|
|
||||||
})
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Update the state (not the editor) with the new code.
|
// Update the state (not the editor) with the new code.
|
||||||
this.client.textDocumentDidChange({
|
this.client.textDocumentDidChange({
|
||||||
@ -587,7 +572,6 @@ export class LanguageServerPluginSpec
|
|||||||
lspFormatExt(plugin),
|
lspFormatExt(plugin),
|
||||||
lspHoverExt(plugin),
|
lspHoverExt(plugin),
|
||||||
lspIndentExt(),
|
lspIndentExt(),
|
||||||
lspLintExt(),
|
|
||||||
lspSemanticTokensExt(),
|
lspSemanticTokensExt(),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,6 @@ import { err, trap } from 'lib/trap'
|
|||||||
import { useCommandsContext } from 'hooks/useCommandsContext'
|
import { useCommandsContext } from 'hooks/useCommandsContext'
|
||||||
import { modelingMachineEvent } from 'editor/manager'
|
import { modelingMachineEvent } from 'editor/manager'
|
||||||
import { hasValidFilletSelection } from 'lang/modifyAst/addFillet'
|
import { hasValidFilletSelection } from 'lang/modifyAst/addFillet'
|
||||||
import { uuidv4 } from 'lib/utils'
|
|
||||||
|
|
||||||
type MachineContext<T extends AnyStateMachine> = {
|
type MachineContext<T extends AnyStateMachine> = {
|
||||||
state: StateFrom<T>
|
state: StateFrom<T>
|
||||||
|
@ -6,11 +6,7 @@ import { Selections, processCodeMirrorRanges, Selection } from 'lib/selections'
|
|||||||
import { undo, redo } from '@codemirror/commands'
|
import { undo, redo } from '@codemirror/commands'
|
||||||
import { CommandBarMachineEvent } from 'machines/commandBarMachine'
|
import { CommandBarMachineEvent } from 'machines/commandBarMachine'
|
||||||
import { addLineHighlight, addLineHighlightEvent } from './highlightextension'
|
import { addLineHighlight, addLineHighlightEvent } from './highlightextension'
|
||||||
import {
|
import { Diagnostic, setDiagnosticsEffect } from '@codemirror/lint'
|
||||||
forEachDiagnostic,
|
|
||||||
Diagnostic,
|
|
||||||
setDiagnosticsEffect,
|
|
||||||
} from '@codemirror/lint'
|
|
||||||
|
|
||||||
const updateOutsideEditorAnnotation = Annotation.define<boolean>()
|
const updateOutsideEditorAnnotation = Annotation.define<boolean>()
|
||||||
export const updateOutsideEditorEvent = updateOutsideEditorAnnotation.of(true)
|
export const updateOutsideEditorEvent = updateOutsideEditorAnnotation.of(true)
|
||||||
@ -114,12 +110,20 @@ export default class EditorManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clearDiagnostics(): void {
|
|
||||||
this.setDiagnostics([])
|
|
||||||
}
|
|
||||||
|
|
||||||
setDiagnostics(diagnostics: Diagnostic[]): void {
|
setDiagnostics(diagnostics: Diagnostic[]): void {
|
||||||
if (!this._editorView) return
|
if (!this._editorView) return
|
||||||
|
// Clear out any existing diagnostics that are the same.
|
||||||
|
for (const diagnostic of diagnostics) {
|
||||||
|
for (const otherDiagnostic of diagnostics) {
|
||||||
|
if (diagnosticIsEqual(diagnostic, otherDiagnostic)) {
|
||||||
|
diagnostics = diagnostics.filter(
|
||||||
|
(d) => !diagnosticIsEqual(d, diagnostic)
|
||||||
|
)
|
||||||
|
diagnostics.push(diagnostic)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this._editorView.dispatch({
|
this._editorView.dispatch({
|
||||||
effects: [setDiagnosticsEffect.of(diagnostics)],
|
effects: [setDiagnosticsEffect.of(diagnostics)],
|
||||||
@ -131,26 +135,6 @@ export default class EditorManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
addDiagnostics(diagnostics: Diagnostic[]): void {
|
|
||||||
if (!this._editorView) return
|
|
||||||
|
|
||||||
forEachDiagnostic(this._editorView.state, function (diag) {
|
|
||||||
diagnostics.push(diag)
|
|
||||||
})
|
|
||||||
|
|
||||||
const uniqueDiagnostics = new Set<Diagnostic>()
|
|
||||||
diagnostics.forEach((diagnostic) => {
|
|
||||||
for (const knownDiagnostic of uniqueDiagnostics.values()) {
|
|
||||||
if (diagnosticIsEqual(diagnostic, knownDiagnostic)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uniqueDiagnostics.add(diagnostic)
|
|
||||||
})
|
|
||||||
|
|
||||||
this.setDiagnostics([...uniqueDiagnostics])
|
|
||||||
}
|
|
||||||
|
|
||||||
undo() {
|
undo() {
|
||||||
if (this._editorView) {
|
if (this._editorView) {
|
||||||
undo(this._editorView)
|
undo(this._editorView)
|
||||||
|
@ -17,6 +17,7 @@ import {
|
|||||||
} from 'lang/wasm'
|
} from 'lang/wasm'
|
||||||
import { getNodeFromPath } from './queryAst'
|
import { getNodeFromPath } from './queryAst'
|
||||||
import { codeManager, editorManager, sceneInfra } from 'lib/singletons'
|
import { codeManager, editorManager, sceneInfra } from 'lib/singletons'
|
||||||
|
import { Diagnostic } from '@codemirror/lint'
|
||||||
|
|
||||||
export class KclManager {
|
export class KclManager {
|
||||||
private _ast: Program = {
|
private _ast: Program = {
|
||||||
@ -32,6 +33,7 @@ export class KclManager {
|
|||||||
}
|
}
|
||||||
private _programMemory: ProgramMemory = ProgramMemory.empty()
|
private _programMemory: ProgramMemory = ProgramMemory.empty()
|
||||||
private _logs: string[] = []
|
private _logs: string[] = []
|
||||||
|
private _lints: Diagnostic[] = []
|
||||||
private _kclErrors: KCLError[] = []
|
private _kclErrors: KCLError[] = []
|
||||||
private _isExecuting = false
|
private _isExecuting = false
|
||||||
private _wasmInitFailed = true
|
private _wasmInitFailed = true
|
||||||
@ -72,16 +74,36 @@ export class KclManager {
|
|||||||
this._logsCallBack(logs)
|
this._logsCallBack(logs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get lints() {
|
||||||
|
return this._lints
|
||||||
|
}
|
||||||
|
|
||||||
|
set lints(lints) {
|
||||||
|
if (lints === this._lints) return
|
||||||
|
this._lints = lints
|
||||||
|
// Run the lints through the diagnostics.
|
||||||
|
this.kclErrors = this._kclErrors
|
||||||
|
}
|
||||||
|
|
||||||
get kclErrors() {
|
get kclErrors() {
|
||||||
return this._kclErrors
|
return this._kclErrors
|
||||||
}
|
}
|
||||||
set kclErrors(kclErrors) {
|
set kclErrors(kclErrors) {
|
||||||
|
if (kclErrors === this._kclErrors && this.lints.length === 0) return
|
||||||
this._kclErrors = kclErrors
|
this._kclErrors = kclErrors
|
||||||
let diagnostics = kclErrorsToDiagnostics(kclErrors)
|
let diagnostics = kclErrorsToDiagnostics(kclErrors)
|
||||||
editorManager.addDiagnostics(diagnostics)
|
if (this.lints.length > 0) {
|
||||||
|
diagnostics = diagnostics.concat(this.lints)
|
||||||
|
}
|
||||||
|
editorManager.setDiagnostics(diagnostics)
|
||||||
this._kclErrorsCallBack(kclErrors)
|
this._kclErrorsCallBack(kclErrors)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addKclErrors(kclErrors: KCLError[]) {
|
||||||
|
if (kclErrors.length === 0) return
|
||||||
|
this.kclErrors = this.kclErrors.concat(kclErrors)
|
||||||
|
}
|
||||||
|
|
||||||
get isExecuting() {
|
get isExecuting() {
|
||||||
return this._isExecuting
|
return this._isExecuting
|
||||||
}
|
}
|
||||||
@ -148,12 +170,12 @@ export class KclManager {
|
|||||||
|
|
||||||
safeParse(code: string): Program | null {
|
safeParse(code: string): Program | null {
|
||||||
const ast = parse(code)
|
const ast = parse(code)
|
||||||
|
this.lints = []
|
||||||
this.kclErrors = []
|
this.kclErrors = []
|
||||||
if (!err(ast)) return ast
|
if (!err(ast)) return ast
|
||||||
const kclerror: KCLError = ast as KCLError
|
const kclerror: KCLError = ast as KCLError
|
||||||
|
|
||||||
console.error('error parsing code', kclerror)
|
this.addKclErrors([kclerror])
|
||||||
this.kclErrors = [kclerror]
|
|
||||||
// TODO: re-eval if session should end?
|
// TODO: re-eval if session should end?
|
||||||
if (kclerror.msg === 'file is empty')
|
if (kclerror.msg === 'file is empty')
|
||||||
this.engineCommandManager?.endSession()
|
this.engineCommandManager?.endSession()
|
||||||
@ -196,7 +218,7 @@ export class KclManager {
|
|||||||
engineCommandManager: this.engineCommandManager,
|
engineCommandManager: this.engineCommandManager,
|
||||||
})
|
})
|
||||||
|
|
||||||
editorManager.addDiagnostics(await lintAst({ ast: ast }))
|
this.lints = await lintAst({ ast: ast })
|
||||||
|
|
||||||
sceneInfra.modelingSend({ type: 'code edit during sketch' })
|
sceneInfra.modelingSend({ type: 'code edit during sketch' })
|
||||||
defaultSelectionFilter(programMemory, this.engineCommandManager)
|
defaultSelectionFilter(programMemory, this.engineCommandManager)
|
||||||
@ -228,7 +250,7 @@ export class KclManager {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.logs = logs
|
this.logs = logs
|
||||||
this.kclErrors = errors
|
this.addKclErrors(errors)
|
||||||
this.programMemory = programMemory
|
this.programMemory = programMemory
|
||||||
this.ast = { ...ast }
|
this.ast = { ...ast }
|
||||||
this._executeCallback()
|
this._executeCallback()
|
||||||
@ -272,8 +294,6 @@ export class KclManager {
|
|||||||
useFakeExecutor: true,
|
useFakeExecutor: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
editorManager.addDiagnostics(await lintAst({ ast: ast }))
|
|
||||||
|
|
||||||
this._logs = logs
|
this._logs = logs
|
||||||
this._kclErrors = errors
|
this._kclErrors = errors
|
||||||
this._programMemory = programMemory
|
this._programMemory = programMemory
|
||||||
@ -305,7 +325,6 @@ export class KclManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
async executeCode(zoomToFit?: boolean): Promise<void> {
|
async executeCode(zoomToFit?: boolean): Promise<void> {
|
||||||
console.log('[kcl/KclSingleton] executeCode')
|
|
||||||
const ast = this.safeParse(codeManager.code)
|
const ast = this.safeParse(codeManager.code)
|
||||||
if (!ast) {
|
if (!ast) {
|
||||||
this.clearAst()
|
this.clearAst()
|
||||||
|
@ -211,7 +211,7 @@ describe('testing addTagForSketchOnFace', () => {
|
|||||||
`
|
`
|
||||||
const code = genCode(originalLine)
|
const code = genCode(originalLine)
|
||||||
const ast = parse(code)
|
const ast = parse(code)
|
||||||
const programMemory = await enginelessExecutor(ast)
|
await enginelessExecutor(ast)
|
||||||
const sourceStart = code.indexOf(originalLine)
|
const sourceStart = code.indexOf(originalLine)
|
||||||
const sourceRange: [number, number] = [
|
const sourceRange: [number, number] = [
|
||||||
sourceStart,
|
sourceStart,
|
||||||
|
Reference in New Issue
Block a user