* add color plugin Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * snapshot test goober Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest-8-cores) --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
69 lines
1.8 KiB
TypeScript
69 lines
1.8 KiB
TypeScript
// Code mirror language implementation for kcl.
|
|
|
|
import {
|
|
LRLanguage,
|
|
LanguageSupport,
|
|
indentNodeProp,
|
|
continuedIndent,
|
|
delimitedIndent,
|
|
foldNodeProp,
|
|
foldInside,
|
|
} from '@codemirror/language'
|
|
import {
|
|
LanguageServerClient,
|
|
LanguageServerPlugin,
|
|
} from '@kittycad/codemirror-lsp-client'
|
|
import { kclPlugin } from '.'
|
|
import type * as LSP from 'vscode-languageserver-protocol'
|
|
// @ts-ignore: No types available
|
|
import { parser } from './kcl.grammar'
|
|
import { colorPicker } from './colors'
|
|
|
|
export interface LanguageOptions {
|
|
workspaceFolders: LSP.WorkspaceFolder[]
|
|
documentUri: string
|
|
client: LanguageServerClient
|
|
processLspNotification?: (
|
|
plugin: LanguageServerPlugin,
|
|
notification: LSP.NotificationMessage
|
|
) => void
|
|
}
|
|
|
|
export const KclLanguage = LRLanguage.define({
|
|
name: 'kcl',
|
|
parser: parser.configure({
|
|
props: [
|
|
indentNodeProp.add({
|
|
Body: delimitedIndent({ closing: '}' }),
|
|
BlockComment: () => null,
|
|
'Statement Property': continuedIndent({ except: /^{/ }),
|
|
}),
|
|
foldNodeProp.add({
|
|
'Body ArrayExpression ObjectExpression': foldInside,
|
|
BlockComment(tree) {
|
|
return { from: tree.from + 2, to: tree.to - 2 }
|
|
},
|
|
PipeExpression(tree) {
|
|
return { from: tree.firstChild!.to, to: tree.to }
|
|
},
|
|
}),
|
|
],
|
|
}),
|
|
languageData: {
|
|
commentTokens: { line: '//', block: { open: '/*', close: '*/' } },
|
|
},
|
|
})
|
|
|
|
export function kcl(options: LanguageOptions) {
|
|
return new LanguageSupport(KclLanguage, [
|
|
colorPicker,
|
|
kclPlugin({
|
|
documentUri: options.documentUri,
|
|
workspaceFolders: options.workspaceFolders,
|
|
allowHTMLContent: true,
|
|
client: options.client,
|
|
processLspNotification: options.processLspNotification,
|
|
}),
|
|
])
|
|
}
|