1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
/*
* SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/>
*
* SPDX-License-Identifier: EPL-2.0
*/
import {
foldInside,
foldNodeProp,
indentNodeProp,
indentUnit,
LanguageSupport,
LRLanguage,
} from '@codemirror/language';
import { styleTags, tags as t } from '@lezer/highlight';
import { foldBlockComment, foldConjunction, foldDeclaration } from './folding';
import {
indentBlockComment,
indentDeclaration,
indentPredicateOrRule,
} from './indentation';
import { parser } from './problem.grammar';
const parserWithMetadata = parser.configure({
props: [
styleTags({
LineComment: t.lineComment,
BlockComment: t.blockComment,
'module problem class enum pred fn scope': t.definitionKeyword,
'import as declare atom multi': t.definitionKeyword,
'extern datatype aggregator': t.definitionKeyword,
'abstract extends refers contains container opposite': t.modifier,
default: t.modifier,
'true false unknown error': t.keyword,
'count in is': t.operatorKeyword,
// 'new delete': t.keyword,
NotOp: t.operator,
UnknownOp: t.operator,
OrOp: t.separator,
StarArgument: t.keyword,
'IntMult Real': t.number,
'StarMult/Star': t.number,
String: t.string,
'RelationName/QualifiedName': t.typeName,
'DatatypeName/QualifiedName': t.keyword,
'AggregatorName/QualifiedName': t.operatorKeyword,
// 'RuleName/QualifiedName': t.typeName,
'AtomNodeName/QualifiedName': t.atom,
'VariableName/QualifiedName': t.variableName,
'ModuleName/QualifiedName': t.typeName,
'{ }': t.brace,
'( )': t.paren,
'[ ]': t.squareBracket,
'. .. , :': t.separator,
'<-> = -> ==>': t.definitionOperator,
}),
indentNodeProp.add({
ProblemDeclaration: indentDeclaration,
AtomDeclaration: indentDeclaration,
NodeDeclaration: indentDeclaration,
ScopeDeclaration: indentDeclaration,
PredicateBody: indentPredicateOrRule,
// FunctionBody: indentPredicateOrRule,
// RuleBody: indentPredicateOrRule,
BlockComment: indentBlockComment,
}),
foldNodeProp.add({
ClassBody: foldInside,
EnumBody: foldInside,
ParameterList: foldInside,
PredicateBody: foldInside,
// FunctionBody: foldInside,
// RuleBody: foldInside,
Conjunction: foldConjunction,
// Consequent: foldWholeNode,
AtomDeclaration: foldDeclaration,
NodeDeclaration: foldDeclaration,
ScopeDeclaration: foldDeclaration,
BlockComment: foldBlockComment,
}),
],
});
const problemLanguage = LRLanguage.define({
parser: parserWithMetadata,
languageData: {
commentTokens: {
block: {
open: '/*',
close: '*/',
},
line: '%',
},
indentOnInput: /^\s*(?:\{|\}|\(|\)|->|;|\.)$/,
},
});
export default function problemLanguageSupport(): LanguageSupport {
return new LanguageSupport(problemLanguage, [indentUnit.of(' ')]);
}
|