aboutsummaryrefslogtreecommitdiffstats
path: root/language-mwe2/src/main/java/org/eclipse/viatra/solver/language/mwe2/ProblemWebIntegrationFragment.java
blob: 18e13245642557707361970d858af23be20d2f7e (plain) (blame)
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
package org.eclipse.viatra.solver.language.mwe2;

import java.util.Set;

import org.eclipse.xtext.xtext.generator.web.WebIntegrationFragment;

import com.google.common.collect.Multimap;

public class ProblemWebIntegrationFragment extends WebIntegrationFragment {
	public ProblemWebIntegrationFragment() {
		setFramework(Framework.CODEMIRROR.name());
		// The exponential operators e and E are not keywords
		setKeywordsFilter("[^eE]|\\w\\w+");
		// We use our custom token style for single-quoted names
		addSuppressPattern("string_singleQuote");
		// Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric
		addSuppressPattern("number_decimal");
		// We use our own custom single-line comments
		addSuppressPattern("comment_singleLine");
		// Override bracket indentation behavior
		addSuppressPattern("bracket_open");
		addSuppressPattern("parenthesis_open");
		addSuppressPattern("brace_open");
		addSuppressPattern("bracket_close");
		addSuppressPattern("parenthesis_close");
		addSuppressPattern("brace_close");
	}

	@Override
	public void setFramework(String frameworkName) {
		if (!frameworkName.toUpperCase().equals(Framework.CODEMIRROR.name())) {
			throw new IllegalStateException("Framework cannot be changed from CodeMirror");
		}
		super.setFramework(frameworkName);
	}

	@Override
	protected Multimap<String, String> createCodeMirrorPatterns(String langId, Set<String> keywords) {
		Multimap<String, String> patterns = super.createCodeMirrorPatterns(langId, keywords);
		// We use our custom token style for single-quoted names
		patterns.put("start", "{token: \"quoted-name\", regex: \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"}");
		// Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric
		patterns.put("start",
				"{token: \"number\", regex: \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"}");
		patterns.put("start", "{token: \"number\", regex: \"[*]\"}");
		// We use our own custom single-line comments
		patterns.put("start", "{token: \"comment\", regex: \"%.*$\"}");
		patterns.put("start", "{token: \"comment\", regex: \"\\\\/\\\\/.*$\"}");
		patterns.put("meta", "lineComment: \"%\"");
		// Override indentation behavior
		patterns.put("start", "{token: \"lparen\", indent: true, regex: \"[[({]\"}");
		patterns.put("start", "{token: \"rparen\", dedent: true, regex: \"[\\\\])}]\"}");
		patterns.putAll("predicateBody", patterns.get("start"));
		patterns.put("start", "{indent: true, push: \"predicateBody\", regex: \":-\"}");
		patterns.put("predicateBody", "{dedent: true, dedentIfLineStart: false, pop: true, regex: \"\\\\.\\\\s*$\"}");
		patterns.put("predicateBody", "{indent: true, dedent: true, regex: \"[;]\"}");
		// We must repeat the keyword rule here, because Xtext only adds it to "main" later.
		patterns.put("predicateBody", "{token: \"keyword\", regex: \"\\\\b(?:\" + keywords + \")\\\\b\"}");
		patterns.put("meta", "electricChars: \"])];\"");
		return patterns;
	}
}