From cdc96ffdff2eaef5bd5e0008d1f91a6251ff9000 Mon Sep 17 00:00:00 2001
From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com>
Date: Fri, 17 May 2024 13:14:44 +0200
Subject: [PATCH] Groovyc can compile all sketching wvc.
---
web-views/.gitignore | 1 +
web-views/build.gradle | 1 +
web-views/{groovycTest => runGroovyc} | 5 +-
.../{echoElement.wvc => EchoElement.wvc} | 2 +-
.../{helloTarget.wvc => HelloTarget.wvc} | 0
...tType.wvc => MemberClassComponentType.wvc} | 0
...elloTarget.wvc => PreambleHelloTarget.wvc} | 6 +-
.../{simpleGreeter.wvc => SimpleGreeter.wvc} | 2 +
web-views/sketching/TwoGreeters.wvc | 6 ++
web-views/sketching/UseHelper.wvc | 4 ++
web-views/sketching/twoGreeters.wvc | 3 -
...ebViewComponentCompileErrorsException.java | 2 +-
.../WebViewComponentTemplateCompileUnit.java | 6 +-
.../groovyc/DelegatingWvcParserPlugin.java | 65 +++++++++++++++----
.../transpile/DefaultGroovyTranspiler.java | 8 ++-
.../ModuleNodeComponentClassNodeResolver.java | 22 +++++--
16 files changed, 103 insertions(+), 30 deletions(-)
rename web-views/{groovycTest => runGroovyc} (90%)
rename web-views/sketching/{echoElement.wvc => EchoElement.wvc} (56%)
rename web-views/sketching/{helloTarget.wvc => HelloTarget.wvc} (100%)
rename web-views/sketching/{memberClassComponentType.wvc => MemberClassComponentType.wvc} (100%)
rename web-views/sketching/{preambleHelloTarget.wvc => PreambleHelloTarget.wvc} (67%)
rename web-views/sketching/{simpleGreeter.wvc => SimpleGreeter.wvc} (91%)
create mode 100644 web-views/sketching/TwoGreeters.wvc
create mode 100644 web-views/sketching/UseHelper.wvc
delete mode 100644 web-views/sketching/twoGreeters.wvc
diff --git a/web-views/.gitignore b/web-views/.gitignore
index ba077a4..30b167a 100644
--- a/web-views/.gitignore
+++ b/web-views/.gitignore
@@ -1 +1,2 @@
bin
+groovyc-out
diff --git a/web-views/build.gradle b/web-views/build.gradle
index df7c771..57c8772 100644
--- a/web-views/build.gradle
+++ b/web-views/build.gradle
@@ -137,6 +137,7 @@ tasks.register('uberJar', Jar) {
group = 'build'
archiveBaseName = 'web-views-uber'
from sourceSets.main.output
+ from sourceSets.sketching.output
from sourceSets.main.runtimeClasspath.filter(File.&exists).collect {
it.isDirectory() ? it : zipTree(it)
}
diff --git a/web-views/groovycTest b/web-views/runGroovyc
similarity index 90%
rename from web-views/groovycTest
rename to web-views/runGroovyc
index 4066b93..b6d0e7c 100755
--- a/web-views/groovycTest
+++ b/web-views/runGroovyc
@@ -1,17 +1,18 @@
#!/usr/bin/env bash
if [ "$1" == "--debug" ]; then
+ shift
gradle -q uberJar && \
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:8192 \
-cp build/libs/web-views-uber-0.1.0.jar \
org.codehaus.groovy.tools.FileSystemCompiler \
--configscript src/main/resources/groowt/view/web/groovyc/GroovycConfigurationScript.groovy \
-d groovyc-out \
- sketching/helloTarget.wvc
+ "$@"
else
gradle -q uberJar && \
groovyc -cp build/libs/web-views-uber-0.1.0.jar \
--configscript src/main/resources/groowt/view/web/groovyc/GroovycConfigurationScript.groovy \
-d groovyc-out \
- sketching/helloTarget.wvc
+ "$@"
fi
diff --git a/web-views/sketching/echoElement.wvc b/web-views/sketching/EchoElement.wvc
similarity index 56%
rename from web-views/sketching/echoElement.wvc
rename to web-views/sketching/EchoElement.wvc
index 0ecc654..16c63b9 100644
--- a/web-views/sketching/echoElement.wvc
+++ b/web-views/sketching/EchoElement.wvc
@@ -1,4 +1,4 @@
---
-import groowt.view.web.lib.Echo
+package sketching
---
$cliGreeting
diff --git a/web-views/sketching/helloTarget.wvc b/web-views/sketching/HelloTarget.wvc
similarity index 100%
rename from web-views/sketching/helloTarget.wvc
rename to web-views/sketching/HelloTarget.wvc
diff --git a/web-views/sketching/memberClassComponentType.wvc b/web-views/sketching/MemberClassComponentType.wvc
similarity index 100%
rename from web-views/sketching/memberClassComponentType.wvc
rename to web-views/sketching/MemberClassComponentType.wvc
diff --git a/web-views/sketching/preambleHelloTarget.wvc b/web-views/sketching/PreambleHelloTarget.wvc
similarity index 67%
rename from web-views/sketching/preambleHelloTarget.wvc
rename to web-views/sketching/PreambleHelloTarget.wvc
index 8a88719..f47f757 100644
--- a/web-views/sketching/preambleHelloTarget.wvc
+++ b/web-views/sketching/PreambleHelloTarget.wvc
@@ -1,9 +1,13 @@
---
+package sketching
+
+import groovy.transform.Field
+
void consume(out) {
out << 'World'
}
-@groovy.transform.Field
+@Field
String greeting = 'Hello'
---
$greeting, ${consume(it)}!
diff --git a/web-views/sketching/simpleGreeter.wvc b/web-views/sketching/SimpleGreeter.wvc
similarity index 91%
rename from web-views/sketching/simpleGreeter.wvc
rename to web-views/sketching/SimpleGreeter.wvc
index bcc823d..6252dd0 100644
--- a/web-views/sketching/simpleGreeter.wvc
+++ b/web-views/sketching/SimpleGreeter.wvc
@@ -1,4 +1,6 @@
---
+package sketching
+
class Greeter extends BaseWebViewComponent {
String target
diff --git a/web-views/sketching/TwoGreeters.wvc b/web-views/sketching/TwoGreeters.wvc
new file mode 100644
index 0000000..24bf413
--- /dev/null
+++ b/web-views/sketching/TwoGreeters.wvc
@@ -0,0 +1,6 @@
+---
+package groowt.view.web.sketching
+---
+<>
+
+>
diff --git a/web-views/sketching/UseHelper.wvc b/web-views/sketching/UseHelper.wvc
new file mode 100644
index 0000000..e1fca9f
--- /dev/null
+++ b/web-views/sketching/UseHelper.wvc
@@ -0,0 +1,4 @@
+---
+package sketching
+---
+${new Helper().help('My God, it works')}
diff --git a/web-views/sketching/twoGreeters.wvc b/web-views/sketching/twoGreeters.wvc
deleted file mode 100644
index 555d949..0000000
--- a/web-views/sketching/twoGreeters.wvc
+++ /dev/null
@@ -1,3 +0,0 @@
-<>
-
->
diff --git a/web-views/src/main/java/groowt/view/web/compiler/MultipleWebViewComponentCompileErrorsException.java b/web-views/src/main/java/groowt/view/web/compiler/MultipleWebViewComponentCompileErrorsException.java
index 16d0487..54e180d 100644
--- a/web-views/src/main/java/groowt/view/web/compiler/MultipleWebViewComponentCompileErrorsException.java
+++ b/web-views/src/main/java/groowt/view/web/compiler/MultipleWebViewComponentCompileErrorsException.java
@@ -16,7 +16,7 @@ public class MultipleWebViewComponentCompileErrorsException extends ComponentTem
ComponentTemplateCompileUnit compileUnit,
List extends Throwable> errors
) {
- super(compileUnit, "There were multiple errors during compilation.");
+ super(compileUnit, "There were multiple errors during compilation/transpilation.");
this.errors.addAll(errors);
}
diff --git a/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java b/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java
index 4d94d49..3aa80a6 100644
--- a/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java
+++ b/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java
@@ -28,7 +28,11 @@ public class WebViewComponentTemplateCompileUnit extends AbstractComponentTempla
String defaultPackageName
) {
super(forClass, source);
- this.defaultPackageName = defaultPackageName;
+ if (!defaultPackageName.isEmpty() && !defaultPackageName.endsWith(".")) {
+ this.defaultPackageName = defaultPackageName + ".";
+ } else {
+ this.defaultPackageName = defaultPackageName;
+ }
}
@Override
diff --git a/web-views/src/main/java/groowt/view/web/groovyc/DelegatingWvcParserPlugin.java b/web-views/src/main/java/groowt/view/web/groovyc/DelegatingWvcParserPlugin.java
index b1f793f..7f95c24 100644
--- a/web-views/src/main/java/groowt/view/web/groovyc/DelegatingWvcParserPlugin.java
+++ b/web-views/src/main/java/groowt/view/web/groovyc/DelegatingWvcParserPlugin.java
@@ -3,6 +3,7 @@ package groowt.view.web.groovyc;
import groowt.view.component.compiler.ComponentTemplateCompileException;
import groowt.view.component.compiler.DefaultComponentTemplateCompilerConfiguration;
import groowt.view.component.compiler.source.ComponentTemplateSource;
+import groowt.view.web.WebViewComponentBugError;
import groowt.view.web.analysis.MismatchedComponentTypeAnalysis;
import groowt.view.web.analysis.MismatchedComponentTypeError;
import groowt.view.web.antlr.*;
@@ -26,13 +27,18 @@ import org.codehaus.groovy.control.ParserPlugin;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.syntax.ParserException;
import org.codehaus.groovy.syntax.Reduction;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
public class DelegatingWvcParserPlugin implements ParserPlugin {
+ private static final Logger logger = LoggerFactory.getLogger(DelegatingWvcParserPlugin.class);
+
private final Antlr4ParserPlugin groovyParserPlugin;
public DelegatingWvcParserPlugin(Antlr4ParserPlugin groovyParserPlugin) {
@@ -98,23 +104,41 @@ public class DelegatingWvcParserPlugin implements ParserPlugin {
}
protected ParserException translateException(ComponentTemplateCompileException e) {
- final var actual = (WebViewComponentTemplateCompileException) e;
- final SourcePosition sourcePosition = actual.getSourcePosition();
- if (sourcePosition != null) {
- return new ParserException(e.getMessage(), e, sourcePosition.line(), sourcePosition.column());
+ if (e instanceof WebViewComponentTemplateCompileException single) {
+ final SourcePosition sourcePosition = single.getSourcePosition();
+ if (sourcePosition != null) {
+ return new ParserException(e.getMessage(), e, sourcePosition.line(), sourcePosition.column());
+ } else {
+ return new ParserException(e.getMessage(), e, 1, 1);
+ }
+ } else if (e instanceof MultipleWebViewComponentCompileErrorsException multiple) {
+ return new ParserException("There were multiple errors during compilation/transpilation.", multiple, 1, 1);
} else {
- return new ParserException(e.getMessage(), e, -1, -1);
+ throw new WebViewComponentBugError(
+ "Cannot determine the type of non-WebViewComponent compile exception: "
+ + e.getClass().getName()
+ );
}
}
+ protected void logException(WebViewComponentTemplateCompileException e) {
+ logger.error(e.getMessage());
+ }
+
+ protected void logException(MultipleWebViewComponentCompileErrorsException e) {
+ logger.error(e.getMessage());
+ }
+
@Override
public ModuleNode buildAST(SourceUnit sourceUnit, ClassLoader classLoader, Reduction cst) throws ParserException {
- final String sourceUnitName = sourceUnit.getName();
- if (sourceUnitName.endsWith(".wvc")) {
+ final String sourceUnitFullName = sourceUnit.getName();
+ final int lastSlashIndex = sourceUnitFullName.lastIndexOf(File.separator);
+ final String sourceUnitFileName = sourceUnitFullName.substring(lastSlashIndex + 1);
+ if (sourceUnitFileName.endsWith(".wvc")) {
final var compileUnit = new WebViewComponentTemplateCompileUnit(
AnonymousWebViewComponent.class,
ComponentTemplateSource.of(sourceUnit.getSource().getURI()),
- "groowt.view.web.groovyc"
+ "" // default package
);
final CompilationUnitParseResult parseResult;
@@ -134,10 +158,12 @@ public class DelegatingWvcParserPlugin implements ParserPlugin {
final var errorExceptions = parseErrors.getAll().stream()
.map(errorNode -> getException(compileUnit, errorNode))
.toList();
- throw this.translateException(new MultipleWebViewComponentCompileErrorsException(
+ final var multiple = new MultipleWebViewComponentCompileErrorsException(
compileUnit,
errorExceptions
- ));
+ );
+ this.logException(multiple);
+ throw this.translateException(multiple);
}
}
@@ -152,10 +178,12 @@ public class DelegatingWvcParserPlugin implements ParserPlugin {
final var errorExceptions = mismatchedComponentTypeErrors.stream()
.map(error -> getException(compileUnit, error))
.toList();
- throw this.translateException(new MultipleWebViewComponentCompileErrorsException(
+ final var multiple = new MultipleWebViewComponentCompileErrorsException(
compileUnit,
errorExceptions
- ));
+ );
+ this.logException(multiple);
+ throw this.translateException(multiple);
}
}
@@ -165,15 +193,26 @@ public class DelegatingWvcParserPlugin implements ParserPlugin {
final var cuNode = (CompilationUnitNode) astBuilder.build(parseResult.getCompilationUnitContext());
final var groovyTranspiler = new DefaultGroovyTranspiler();
+ final String nameWithoutExtension = sourceUnitFileName.substring(0, sourceUnitFileName.length() - 4);
try {
final SourceUnit transpiledSourceUnit = groovyTranspiler.transpile(
new DefaultComponentTemplateCompilerConfiguration(),
compileUnit,
cuNode,
- sourceUnitName.substring(0, sourceUnitName.length() - 4)
+ nameWithoutExtension
);
return transpiledSourceUnit.getAST();
} catch (ComponentTemplateCompileException e) {
+ if (e instanceof WebViewComponentTemplateCompileException single) {
+ this.logException(single);
+ } else if (e instanceof MultipleWebViewComponentCompileErrorsException multiple) {
+ this.logException(multiple);
+ } else {
+ throw new WebViewComponentBugError(
+ "Could not determine type of non-WebViewComponent compile exception: "
+ + e.getClass().getName()
+ );
+ }
throw this.translateException(e);
}
} else {
diff --git a/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java b/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java
index 860f4b9..b23dc85 100644
--- a/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java
+++ b/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java
@@ -87,6 +87,7 @@ public class DefaultGroovyTranspiler implements GroovyTranspiler {
classNode.getMixins()
);
icn.setDeclaringClass(mainClassNode);
+ result.add(icn);
}
}
return result;
@@ -178,7 +179,10 @@ public class DefaultGroovyTranspiler implements GroovyTranspiler {
final var moduleNode = new WebViewComponentModuleNode(sourceUnit);
sourceUnit.setModuleNode(moduleNode);
- moduleNode.setPackageName(compileUnit.getDefaultPackageName());
+ final String defaultPackageName = compileUnit.getDefaultPackageName();
+ if (!defaultPackageName.trim().isEmpty()) {
+ moduleNode.setPackageName(defaultPackageName);
+ }
moduleNode.addStarImport(GROOWT_VIEW_WEB + ".lib");
moduleNode.addImport(COMPONENT_TEMPLATE.getNameWithoutPackage(), COMPONENT_TEMPLATE);
@@ -187,7 +191,7 @@ public class DefaultGroovyTranspiler implements GroovyTranspiler {
moduleNode.addStarImport(GROOWT_VIEW_WEB + ".runtime");
final ClassNode mainClassNode = new ClassNode(
- compileUnit.getDefaultPackageName() + "." + templateClassName,
+ compileUnit.getDefaultPackageName() + templateClassName,
ACC_PUBLIC,
ClassHelper.OBJECT_TYPE
);
diff --git a/web-views/src/main/java/groowt/view/web/transpile/resolve/ModuleNodeComponentClassNodeResolver.java b/web-views/src/main/java/groowt/view/web/transpile/resolve/ModuleNodeComponentClassNodeResolver.java
index b68ada2..2a7fada 100644
--- a/web-views/src/main/java/groowt/view/web/transpile/resolve/ModuleNodeComponentClassNodeResolver.java
+++ b/web-views/src/main/java/groowt/view/web/transpile/resolve/ModuleNodeComponentClassNodeResolver.java
@@ -32,7 +32,7 @@ public class ModuleNodeComponentClassNodeResolver extends CachingComponentClassN
for (final var starImport : starImports) {
final var packageName = starImport.getPackageName();
final String fqn;
- if (packageName.endsWith(".")) {
+ if (!packageName.equals(".") && packageName.endsWith(".")) {
fqn = packageName + nameWithoutPackage;
} else {
fqn = packageName + "." + nameWithoutPackage;
@@ -44,13 +44,23 @@ public class ModuleNodeComponentClassNodeResolver extends CachingComponentClassN
}
// try pre-pending package and asking for fqn
- final var packageName = this.moduleNode.getPackageName();
- final String fqn;
- if (packageName.endsWith(".")) {
- fqn = this.moduleNode.getPackageName() + nameWithoutPackage;
+ final String moduleNodePackageName = this.moduleNode.getPackageName();
+ final String packageName;
+ if (moduleNodePackageName != null) {
+ packageName = moduleNodePackageName;
} else {
- fqn = this.moduleNode.getPackageName() + "." + nameWithoutPackage;
+ packageName = "";
}
+
+ final String fqn;
+ if (packageName.equals(".") || packageName.isEmpty()) {
+ fqn = nameWithoutPackage;
+ } else if (packageName.endsWith(".")) {
+ fqn = packageName + nameWithoutPackage;
+ } else {
+ fqn = packageName + "." + nameWithoutPackage;
+ }
+
final var withPackage = this.getClassForFqn(fqn);
if (withPackage.isRight()) {
return withPackage;