aboutsummaryrefslogtreecommitdiffstats
path: root/language-web/src/main/js/language/problemLanguageSupport.ts
diff options
context:
space:
mode:
Diffstat (limited to 'language-web/src/main/js/language/problemLanguageSupport.ts')
-rw-r--r--language-web/src/main/js/language/problemLanguageSupport.ts83
1 files changed, 83 insertions, 0 deletions
diff --git a/language-web/src/main/js/language/problemLanguageSupport.ts b/language-web/src/main/js/language/problemLanguageSupport.ts
new file mode 100644
index 00000000..c9e61b31
--- /dev/null
+++ b/language-web/src/main/js/language/problemLanguageSupport.ts
@@ -0,0 +1,83 @@
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 extends 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 String: t.string,
38 'RelationName/QualifiedName': t.typeName,
39 'UniqueNodeName/QualifiedName': t.atom,
40 'VariableName/QualifiedName': t.variableName,
41 '{ }': t.brace,
42 '( )': t.paren,
43 '[ ]': t.squareBracket,
44 '. .. , :': t.separator,
45 '<->': t.definitionOperator,
46 }),
47 indentNodeProp.add({
48 ProblemDeclaration: indentDeclaration,
49 UniqueDeclaration: indentDeclaration,
50 ScopeDeclaration: indentDeclaration,
51 PredicateBody: indentPredicate,
52 BlockComment: indentBlockComment,
53 }),
54 foldNodeProp.add({
55 ClassBody: foldInside,
56 EnumBody: foldInside,
57 ParameterList: foldInside,
58 PredicateBody: foldInside,
59 Conjunction: foldConjunction,
60 UniqueDeclaration: foldDeclaration,
61 ScopeDeclaration: foldDeclaration,
62 BlockComment: foldBlockComment,
63 }),
64 ],
65});
66
67const problemLanguage = LRLanguage.define({
68 parser: parserWithMetadata,
69 languageData: {
70 commentTokens: {
71 block: {
72 open: '/*',
73 close: '*/',
74 },
75 line: '%',
76 },
77 indentOnInput: /^\s*(?:\{|\}|\(|\)|;|\.)$/,
78 },
79});
80
81export function problemLanguageSupport(): LanguageSupport {
82 return new LanguageSupport(problemLanguage);
83}