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 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;