diff options
author | Kristóf Marussy <kristof@marussy.com> | 2021-10-11 01:13:32 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2021-10-31 19:26:10 +0100 |
commit | 1d7f4031d614ae16b53de5a84312a71346da0c9c (patch) | |
tree | 961eedc36eca26af61baa862e5cf4b9d1b04de79 | |
parent | feat(web): experiment with Lezer parser (diff) | |
download | refinery-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.gradle | 6 | ||||
-rw-r--r-- | language-mwe2/src/main/java/tools/refinery/language/mwe2/ProblemWebIntegrationFragment.java | 61 | ||||
-rw-r--r-- | language-web/build.gradle | 6 | ||||
-rw-r--r-- | language-web/src/main/js/editor/problem.grammar | 23 | ||||
-rw-r--r-- | language-web/webpack.config.js | 2 | ||||
-rw-r--r-- | language/build.gradle | 3 | ||||
-rw-r--r-- | language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 | 14 | ||||
-rw-r--r-- | settings.gradle | 1 |
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 @@ | |||
1 | apply plugin: 'java-library' | ||
2 | apply from: "${rootDir}/gradle/java-common.gradle" | ||
3 | |||
4 | dependencies { | ||
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 @@ | |||
1 | package tools.refinery.language.mwe2; | ||
2 | |||
3 | import java.util.Set; | ||
4 | |||
5 | import org.eclipse.xtext.xtext.generator.web.WebIntegrationFragment; | ||
6 | |||
7 | import com.google.common.collect.Multimap; | ||
8 | |||
9 | public 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 | ||
52 | def assembleFrontend = tasks.named('assembleFrontend') | 52 | def assembleFrontend = tasks.named('assembleFrontend') |
53 | assembleFrontend.configure { | 53 | assembleFrontend.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 | ||
136 | tasks.register('webpackServe', RunNpmYarn) { | 136 | tasks.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 | ||
4 | statement { | 4 | statement { |
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 | ||
32 | ReferenceDeclaration { | 32 | ReferenceDeclaration { |
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 | |||
41 | Parameter { RelationName? VariableName } | 42 | Parameter { RelationName? VariableName } |
42 | 43 | ||
43 | Conjunction { sep1<",", Literal> } | 44 | Conjunction { sep1<",", Literal> } |
@@ -53,7 +54,7 @@ Argument { VariableName | Real } | |||
53 | AssertionArgument { NodeName | StarArgument | Real } | 54 | AssertionArgument { NodeName | StarArgument | Real } |
54 | 55 | ||
55 | LogicValue { | 56 | LogicValue { |
56 | kw<"true"> | kw<"false"> | kw<"unknown"> | kw<"error"> | 57 | ckw<"true"> | ckw<"false"> | ckw<"unknown"> | ckw<"error"> |
57 | } | 58 | } |
58 | 59 | ||
59 | ScopeElement { RelationName ("=" | "+=") Multiplicity } | 60 | ScopeElement { RelationName ("=" | "+=") Multiplicity } |
@@ -72,6 +73,8 @@ QualifiedName { identifier ("::" identifier)* } | |||
72 | 73 | ||
73 | kw<term> { @specialize[@name={term}]<identifier, term> } | 74 | kw<term> { @specialize[@name={term}]<identifier, term> } |
74 | 75 | ||
76 | ckw<term> { @extend[@name={term}]<identifier, term> } | ||
77 | |||
75 | ParameterList<content> { "(" sep<",", content> ")" } | 78 | ParameterList<content> { "(" sep<",", content> ")" } |
76 | 79 | ||
77 | sep<separator, content> { sep1<separator, content>? } | 80 | sep<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; | |||
25 | const publicPort = portNumberOrElse('PUBLIC_PORT', listenPort); | 25 | const publicPort = portNumberOrElse('PUBLIC_PORT', listenPort); |
26 | 26 | ||
27 | const resolveSources = sources => path.resolve(__dirname, 'src', sources); | 27 | const resolveSources = sources => path.resolve(__dirname, 'src', sources); |
28 | const resolveGenerated = sources => path.resolve(__dirname, 'build/generated/sources', sources); | ||
29 | const mainJsSources = resolveSources('main/js'); | 28 | const mainJsSources = resolveSources('main/js'); |
30 | const babelLoaderFilters = { | 29 | const 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 | ||
22 | sourceSets { | 21 | sourceSets { |
@@ -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 | ||
64 | sonarqube.properties { | 61 | sonarqube.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 | |||
3 | import org.eclipse.xtext.xtext.generator.* | 3 | import org.eclipse.xtext.xtext.generator.* |
4 | import org.eclipse.xtext.xtext.generator.model.project.* | 4 | import org.eclipse.xtext.xtext.generator.model.project.* |
5 | 5 | ||
6 | import tools.refinery.language.mwe2.* | ||
7 | |||
8 | var rootPath = ".." | 6 | var rootPath = ".." |
9 | 7 | ||
10 | Workflow { | 8 | Workflow { |
@@ -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' | |||
3 | include 'language' | 3 | include 'language' |
4 | include 'language-ide' | 4 | include 'language-ide' |
5 | include 'language-model' | 5 | include 'language-model' |
6 | include 'language-mwe2' | ||
7 | include 'language-to-store' | 6 | include 'language-to-store' |
8 | include 'language-web' | 7 | include 'language-web' |
9 | include 'store' | 8 | include 'store' |