aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-10-11 01:13:32 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-10-31 19:26:10 +0100
commit1d7f4031d614ae16b53de5a84312a71346da0c9c (patch)
tree961eedc36eca26af61baa862e5cf4b9d1b04de79
parentfeat(web): experiment with Lezer parser (diff)
downloadrefinery-1d7f4031d614ae16b53de5a84312a71346da0c9c.tar.gz
refinery-1d7f4031d614ae16b53de5a84312a71346da0c9c.tar.zst
refinery-1d7f4031d614ae16b53de5a84312a71346da0c9c.zip
chore(web): remove CodeMirror 5 MWE2 integration
CodeMirror 6 uses a hand-writter Lezer parser instead of the stream parser generated by Xtext for CodeMirror 5.
-rw-r--r--language-mwe2/build.gradle6
-rw-r--r--language-mwe2/src/main/java/tools/refinery/language/mwe2/ProblemWebIntegrationFragment.java61
-rw-r--r--language-web/build.gradle6
-rw-r--r--language-web/src/main/js/editor/problem.grammar23
-rw-r--r--language-web/webpack.config.js2
-rw-r--r--language/build.gradle3
-rw-r--r--language/src/main/java/tools/refinery/language/GenerateProblem.mwe214
-rw-r--r--settings.gradle1
8 files changed, 16 insertions, 100 deletions
diff --git a/language-mwe2/build.gradle b/language-mwe2/build.gradle
deleted file mode 100644
index 4b9017c5..00000000
--- a/language-mwe2/build.gradle
+++ /dev/null
@@ -1,6 +0,0 @@
1apply plugin: 'java-library'
2apply from: "${rootDir}/gradle/java-common.gradle"
3
4dependencies {
5 api "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}"
6}
diff --git a/language-mwe2/src/main/java/tools/refinery/language/mwe2/ProblemWebIntegrationFragment.java b/language-mwe2/src/main/java/tools/refinery/language/mwe2/ProblemWebIntegrationFragment.java
deleted file mode 100644
index cdebe452..00000000
--- a/language-mwe2/src/main/java/tools/refinery/language/mwe2/ProblemWebIntegrationFragment.java
+++ /dev/null
@@ -1,61 +0,0 @@
1package tools.refinery.language.mwe2;
2
3import java.util.Set;
4
5import org.eclipse.xtext.xtext.generator.web.WebIntegrationFragment;
6
7import com.google.common.collect.Multimap;
8
9public class ProblemWebIntegrationFragment extends WebIntegrationFragment {
10 private static final String START_STATE = "start";
11 private static final String PREDICATE_BODY_STATE = "predicateBody";
12 private static final String CM_MODE_META = "meta";
13
14 public ProblemWebIntegrationFragment() {
15 setFramework(Framework.CODEMIRROR.name());
16 // Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric
17 addSuppressPattern("number_decimal");
18 // We use our own custom single-line comments
19 addSuppressPattern("comment_singleLine");
20 // Override bracket indentation behavior
21 addSuppressPattern("bracket_open");
22 addSuppressPattern("parenthesis_open");
23 addSuppressPattern("brace_open");
24 addSuppressPattern("bracket_close");
25 addSuppressPattern("parenthesis_close");
26 addSuppressPattern("brace_close");
27 }
28
29 @Override
30 public void setFramework(String frameworkName) {
31 if (!frameworkName.toUpperCase().equals(Framework.CODEMIRROR.name())) {
32 throw new IllegalStateException("Framework cannot be changed from CodeMirror");
33 }
34 super.setFramework(frameworkName);
35 }
36
37 @Override
38 protected Multimap<String, String> createCodeMirrorPatterns(String langId, Set<String> keywords) {
39 Multimap<String, String> patterns = super.createCodeMirrorPatterns(langId, keywords);
40 // Use the CodeMirror default .cm-number instead of .cm-constant.cm-numeric
41 patterns.put(START_STATE,
42 "{token: \"number\", regex: \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"}");
43 // We use our own custom single-line comments
44 patterns.put(START_STATE, "{token: \"comment\", regex: \"%.*$\"}");
45 patterns.put(START_STATE, "{token: \"comment\", regex: \"\\\\/\\\\/.*$\"}");
46 patterns.put(CM_MODE_META, "lineComment: \"%\"");
47 // Override indentation behavior
48 patterns.put(START_STATE, "{token: \"lparen\", indent: true, regex: \"[[({]\"}");
49 patterns.put(START_STATE, "{token: \"rparen\", dedent: true, regex: \"[\\\\])}]\"}");
50 patterns.putAll(PREDICATE_BODY_STATE, patterns.get(START_STATE));
51 patterns.put(START_STATE, "{indent: true, push: \"" + PREDICATE_BODY_STATE + "\", regex: \"<->\"}");
52 patterns.put(PREDICATE_BODY_STATE,
53 "{dedent: true, dedentIfLineStart: false, pop: true, regex: \"\\\\.\\\\s*$\"}");
54 patterns.put(PREDICATE_BODY_STATE, "{indent: true, dedent: true, regex: \"[;]\"}");
55 // We must repeat the keyword rule here, because Xtext only adds it to "main"
56 // later
57 patterns.put(PREDICATE_BODY_STATE, "{token: \"keyword\", regex: \"\\\\b(?:\" + keywords + \")\\\\b\"}");
58 patterns.put(CM_MODE_META, "electricChars: \"])];\"");
59 return patterns;
60 }
61}
diff --git a/language-web/build.gradle b/language-web/build.gradle
index 1f1457d6..f2b9b43f 100644
--- a/language-web/build.gradle
+++ b/language-web/build.gradle
@@ -51,12 +51,12 @@ def generateLezerGrammar = tasks.register('generateLezerGrammar', RunNpmYarn) {
51 51
52def assembleFrontend = tasks.named('assembleFrontend') 52def assembleFrontend = tasks.named('assembleFrontend')
53assembleFrontend.configure { 53assembleFrontend.configure {
54 dependsOn generateXtextLanguage
55 dependsOn generateLezerGrammar 54 dependsOn generateLezerGrammar
56 inputs.dir 'src/main/css' 55 inputs.dir 'src/main/css'
57 inputs.dir 'src/main/html' 56 inputs.dir 'src/main/html'
58 inputs.dir 'src/main/js' 57 inputs.dir 'src/main/js'
59 inputs.dir "${buildDir}/generated/sources/xtext/js" 58 inputs.file "${buildDir}/generated/sources/lezer/problem.ts"
59 inputs.file "${buildDir}/generated/sources/lezer/problem.terms.ts"
60 inputs.files('package.json', 'yarn.lock', 'webpack.config.js') 60 inputs.files('package.json', 'yarn.lock', 'webpack.config.js')
61 outputs.dir productionResources 61 outputs.dir productionResources
62} 62}
@@ -135,7 +135,7 @@ def jettyRun = tasks.register('jettyRun', JavaExec) {
135 135
136tasks.register('webpackServe', RunNpmYarn) { 136tasks.register('webpackServe', RunNpmYarn) {
137 dependsOn installFrontend 137 dependsOn installFrontend
138 dependsOn generateXtextLanguage 138 dependsOn generateLezerGrammar
139 outputs.dir "${webpackOutputDir}/development" 139 outputs.dir "${webpackOutputDir}/development"
140 script = 'run serve' 140 script = 'run serve'
141 group = 'run' 141 group = 'run'
diff --git a/language-web/src/main/js/editor/problem.grammar b/language-web/src/main/js/editor/problem.grammar
index c64402b0..921cec53 100644
--- a/language-web/src/main/js/editor/problem.grammar
+++ b/language-web/src/main/js/editor/problem.grammar
@@ -3,41 +3,42 @@
3 3
4statement { 4statement {
5 ProblemDeclaration { 5 ProblemDeclaration {
6 kw<"problem"> QualifiedName "." 6 ckw<"problem"> QualifiedName "."
7 } | 7 } |
8 ClassDefinition { 8 ClassDefinition {
9 kw<"abstract">? kw<"class"> RelationName 9 ckw<"abstract">? ckw<"class"> RelationName
10 (ClassBody { "{" ReferenceDeclaration* "}" } | ".") 10 (ClassBody { "{" ReferenceDeclaration* "}" } | ".")
11 } | 11 } |
12 EnumDefinition { 12 EnumDefinition {
13 kw<"enum"> RelationName 13 ckw<"enum"> RelationName
14 (EnumBody { "{" sep<",", UniqueNodeName> "}" } | ".") 14 (EnumBody { "{" sep<",", UniqueNodeName> "}" } | ".")
15 } | 15 } |
16 PredicateDefinition { 16 PredicateDefinition {
17 (kw<"error"> kw<"pred">? | kw<"pred">) RelationName ParameterList<Parameter>? 17 (ckw<"error"> ckw<"pred">? | ckw<"pred">) RelationName ParameterList<Parameter>?
18 PredicateBody { ("<->" sep<OrOp, Conjunction>)? "." } 18 PredicateBody { ("<->" sep<OrOp, Conjunction>)? "." }
19 } | 19 } |
20 Assertion { 20 Assertion {
21 kw<"default">? (NotOp | UnknownOp)? RelationName 21 ckw<"default">? (NotOp | UnknownOp)? RelationName
22 ParameterList<AssertionArgument> (":" LogicValue)? "." 22 ParameterList<AssertionArgument> (":" LogicValue)? "."
23 } | 23 } |
24 UniqueDeclaration { 24 UniqueDeclaration {
25 kw<"unique"> sep<",", UniqueNodeName> "." 25 ckw<"unique"> sep<",", UniqueNodeName> "."
26 } | 26 } |
27 ScopeDeclaration { 27 ScopeDeclaration {
28 kw<"scope"> sep<",", ScopeElement> "." 28 ckw<"scope"> sep<",", ScopeElement> "."
29 } 29 }
30} 30}
31 31
32ReferenceDeclaration { 32ReferenceDeclaration {
33 (kw<"refers"> | kw<"contains">)? 33 ((kw<"refers"> | kw<"contains">) !times RelationName | !plus RelationName)
34 RelationName
35 RelationName 34 RelationName
36 ( "[" Multiplicity? "]" )? 35 ( "[" Multiplicity? "]" )?
37 (kw<"opposite"> RelationName)? 36 (kw<"opposite"> RelationName)?
38 ";"? 37 ";"?
39} 38}
40 39
40@precedence { times @left, plus }
41
41Parameter { RelationName? VariableName } 42Parameter { RelationName? VariableName }
42 43
43Conjunction { sep1<",", Literal> } 44Conjunction { sep1<",", Literal> }
@@ -53,7 +54,7 @@ Argument { VariableName | Real }
53AssertionArgument { NodeName | StarArgument | Real } 54AssertionArgument { NodeName | StarArgument | Real }
54 55
55LogicValue { 56LogicValue {
56 kw<"true"> | kw<"false"> | kw<"unknown"> | kw<"error"> 57 ckw<"true"> | ckw<"false"> | ckw<"unknown"> | ckw<"error">
57} 58}
58 59
59ScopeElement { RelationName ("=" | "+=") Multiplicity } 60ScopeElement { RelationName ("=" | "+=") Multiplicity }
@@ -72,6 +73,8 @@ QualifiedName { identifier ("::" identifier)* }
72 73
73kw<term> { @specialize[@name={term}]<identifier, term> } 74kw<term> { @specialize[@name={term}]<identifier, term> }
74 75
76ckw<term> { @extend[@name={term}]<identifier, term> }
77
75ParameterList<content> { "(" sep<",", content> ")" } 78ParameterList<content> { "(" sep<",", content> ")" }
76 79
77sep<separator, content> { sep1<separator, content>? } 80sep<separator, content> { sep1<separator, content>? }
diff --git a/language-web/webpack.config.js b/language-web/webpack.config.js
index c51d55d6..55b590ca 100644
--- a/language-web/webpack.config.js
+++ b/language-web/webpack.config.js
@@ -25,7 +25,6 @@ const publicHost = process.env['PUBLIC_HOST'] || listenHost;
25const publicPort = portNumberOrElse('PUBLIC_PORT', listenPort); 25const publicPort = portNumberOrElse('PUBLIC_PORT', listenPort);
26 26
27const resolveSources = sources => path.resolve(__dirname, 'src', sources); 27const resolveSources = sources => path.resolve(__dirname, 'src', sources);
28const resolveGenerated = sources => path.resolve(__dirname, 'build/generated/sources', sources);
29const mainJsSources = resolveSources('main/js'); 28const mainJsSources = resolveSources('main/js');
30const babelLoaderFilters = { 29const babelLoaderFilters = {
31 include: [mainJsSources], 30 include: [mainJsSources],
@@ -150,7 +149,6 @@ module.exports = {
150 modules: [ 149 modules: [
151 'node_modules', 150 'node_modules',
152 mainJsSources, 151 mainJsSources,
153 resolveGenerated('xtext/js'),
154 ], 152 ],
155 extensions: ['.js', '.jsx', '.ts', '.tsx'], 153 extensions: ['.js', '.jsx', '.ts', '.tsx'],
156 alias: { 154 alias: {
diff --git a/language/build.gradle b/language/build.gradle
index f2b20ab5..7b9f8d75 100644
--- a/language/build.gradle
+++ b/language/build.gradle
@@ -16,7 +16,6 @@ dependencies {
16 mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}" 16 mwe2 "org.eclipse.xtext:org.eclipse.xtext.common.types:${xtextVersion}"
17 mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}" 17 mwe2 "org.eclipse.xtext:org.eclipse.xtext.xtext.generator:${xtextVersion}"
18 mwe2 "org.eclipse.xtext:xtext-antlr-generator:${xtextAntlrGeneratorVersion}" 18 mwe2 "org.eclipse.xtext:xtext-antlr-generator:${xtextAntlrGeneratorVersion}"
19 mwe2 project(':refinery-language-mwe2')
20} 19}
21 20
22sourceSets { 21sourceSets {
@@ -41,7 +40,6 @@ def generateXtextLanguage = tasks.register('generateXtextLanguage', JavaExec) {
41 outputs.dir 'src/testFixtures/xtext-gen' 40 outputs.dir 'src/testFixtures/xtext-gen'
42 outputs.dir '../language-ide/src/main/xtext-gen' 41 outputs.dir '../language-ide/src/main/xtext-gen'
43 outputs.dir '../language-web/src/main/xtext-gen' 42 outputs.dir '../language-web/src/main/xtext-gen'
44 outputs.dir '../language-web/build/generated/sources/xtext'
45 args += 'src/main/java/tools/refinery/language/GenerateProblem.mwe2' 43 args += 'src/main/java/tools/refinery/language/GenerateProblem.mwe2'
46 args += '-p' 44 args += '-p'
47 args += "rootPath=/${projectDir}/.." 45 args += "rootPath=/${projectDir}/.."
@@ -58,7 +56,6 @@ tasks.named('clean') {
58 delete 'src/testFixtures/xtext-gen' 56 delete 'src/testFixtures/xtext-gen'
59 delete '../language-ide/src/main/xtext-gen' 57 delete '../language-ide/src/main/xtext-gen'
60 delete '../language-web/src/main/xtext-gen' 58 delete '../language-web/src/main/xtext-gen'
61 delete '../language-web/build/generated/sources/xtext'
62} 59}
63 60
64sonarqube.properties { 61sonarqube.properties {
diff --git a/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 b/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2
index 1b177c94..79eb79a7 100644
--- a/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2
+++ b/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2
@@ -3,8 +3,6 @@ module tools.refinery.language.GenerateProblem
3import org.eclipse.xtext.xtext.generator.* 3import org.eclipse.xtext.xtext.generator.*
4import org.eclipse.xtext.xtext.generator.model.project.* 4import org.eclipse.xtext.xtext.generator.model.project.*
5 5
6import tools.refinery.language.mwe2.*
7
8var rootPath = ".." 6var rootPath = ".."
9 7
10Workflow { 8Workflow {
@@ -20,11 +18,6 @@ Workflow {
20 genericIde = { 18 genericIde = {
21 name = "language-ide" 19 name = "language-ide"
22 } 20 }
23 web = {
24 enabled = true
25 name = "language-web"
26 assets = "../language-web/build/generated/sources/xtext"
27 }
28 mavenLayout = true 21 mavenLayout = true
29 } 22 }
30 code = { 23 code = {
@@ -53,13 +46,6 @@ Workflow {
53 skipXbaseTestingPackage = true 46 skipXbaseTestingPackage = true
54 junitVersion = "5" 47 junitVersion = "5"
55 } 48 }
56 webSupport = ProblemWebIntegrationFragment {
57 highlightingPath = "js/mode-problem.js"
58 generateHtmlExample = false
59 generateJettyLauncher = false
60 generateServlet = false
61 generateWebXml = false
62 }
63 } 49 }
64 } 50 }
65} 51}
diff --git a/settings.gradle b/settings.gradle
index 9edf237f..0e237de1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -3,7 +3,6 @@ rootProject.name = 'refinery'
3include 'language' 3include 'language'
4include 'language-ide' 4include 'language-ide'
5include 'language-model' 5include 'language-model'
6include 'language-mwe2'
7include 'language-to-store' 6include 'language-to-store'
8include 'language-web' 7include 'language-web'
9include 'store' 8include 'store'