aboutsummaryrefslogtreecommitdiffstats
path: root/language-web/src/main/js/editor/problemLanguageSupport.ts
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-10-11 01:03:21 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-10-31 19:26:10 +0100
commit299c4d93597b3065e6a1017ebe692cde66fc5e39 (patch)
tree57d634cec30ca37f0af81a37c3011e027589c35c /language-web/src/main/js/editor/problemLanguageSupport.ts
parentfeat(web): add CodeMirror 6 editor (diff)
downloadrefinery-299c4d93597b3065e6a1017ebe692cde66fc5e39.tar.gz
refinery-299c4d93597b3065e6a1017ebe692cde66fc5e39.tar.zst
refinery-299c4d93597b3065e6a1017ebe692cde66fc5e39.zip
feat(web): experiment with Lezer parser
Diffstat (limited to 'language-web/src/main/js/editor/problemLanguageSupport.ts')
-rw-r--r--language-web/src/main/js/editor/problemLanguageSupport.ts82
1 files changed, 82 insertions, 0 deletions
diff --git a/language-web/src/main/js/editor/problemLanguageSupport.ts b/language-web/src/main/js/editor/problemLanguageSupport.ts
new file mode 100644
index 00000000..2bf7c7a4
--- /dev/null
+++ b/language-web/src/main/js/editor/problemLanguageSupport.ts
@@ -0,0 +1,82 @@
1import { styleTags, tags as t } from '@codemirror/highlight';
2import {
3 foldInside,
4 foldNodeProp,
5 indentNodeProp,
6 LanguageSupport,
7 LRLanguage,
8} from '@codemirror/language';
9import { LRParser } from '@lezer/lr';
10
11import { parser } from '../../../../build/generated/sources/lezer/problem';
12import {
13 foldBlockComment,
14 foldConjunction,
15 foldDeclaration,
16} from './folding';
17import {
18 indentBlockComment,
19 indentDeclaration,
20 indentPredicate,
21} from './indentation';
22
23const parserWithMetadata = (parser as LRParser).configure({
24 props: [
25 styleTags({
26 LineComment: t.lineComment,
27 BlockComment: t.blockComment,
28 'problem class enum pred unique scope': t.definitionKeyword,
29 'abstract refers contains opposite error default': t.modifier,
30 'true false unknown error': t.keyword,
31 NotOp: t.keyword,
32 UnknownOp: t.keyword,
33 OrOp: t.keyword,
34 StarArgument: t.keyword,
35 'IntMult StarMult Real': t.number,
36 StarMult: t.number,
37 'RelationName/QualifiedName': t.typeName,
38 'UniqueNodeName/QualifiedName': t.atom,
39 'VariableName/QualifiedName': t.variableName,
40 '{ }': t.brace,
41 '( )': t.paren,
42 '[ ]': t.squareBracket,
43 '. .. , :': t.separator,
44 '<->': t.definitionOperator,
45 }),
46 indentNodeProp.add({
47 ProblemDeclaration: indentDeclaration,
48 UniqueDeclaration: indentDeclaration,
49 ScopeDeclaration: indentDeclaration,
50 PredicateBody: indentPredicate,
51 BlockComment: indentBlockComment,
52 }),
53 foldNodeProp.add({
54 ClassBody: foldInside,
55 EnumBody: foldInside,
56 ParameterList: foldInside,
57 PredicateBody: foldInside,
58 Conjunction: foldConjunction,
59 UniqueDeclaration: foldDeclaration,
60 ScopeDeclaration: foldDeclaration,
61 BlockComment: foldBlockComment,
62 }),
63 ],
64});
65
66const problemLanguage = LRLanguage.define({
67 parser: parserWithMetadata,
68 languageData: {
69 commentTokens: {
70 block: {
71 open: '/*',
72 close: '*/',
73 },
74 line: '%',
75 },
76 indentOnInput: /^\s*(?:\{|\}|\(|\)|;|\.)$/,
77 },
78});
79
80export function problemLanguageSupport(): LanguageSupport {
81 return new LanguageSupport(problemLanguage);
82}