From bd913e07d39cbf7a9d4cb9fef2848e74f61b61af Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Mon, 27 May 2024 09:58:16 +0200 Subject: [PATCH] Updated Echo for new closure semantics. --- .../sketching/groovy/sketching/WithField.wvc | 7 +++++ .../transpile/DefaultGroovyTranspiler.java | 31 +++---------------- .../groowt/view/component/web/lib/Echo.groovy | 28 ++++++++++++++--- .../web/BaseWebViewComponentTests.groovy | 13 -------- .../web/SimpleWebViewComponentTests.groovy | 18 +---------- 5 files changed, 36 insertions(+), 61 deletions(-) create mode 100644 web-view-components-compiler/sketching/groovy/sketching/WithField.wvc diff --git a/web-view-components-compiler/sketching/groovy/sketching/WithField.wvc b/web-view-components-compiler/sketching/groovy/sketching/WithField.wvc new file mode 100644 index 0000000..80d2058 --- /dev/null +++ b/web-view-components-compiler/sketching/groovy/sketching/WithField.wvc @@ -0,0 +1,7 @@ +--- +import groovy.transform.Field + +@Field +String greeting = 'Hello, World!' +--- +$greeting diff --git a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultGroovyTranspiler.java b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultGroovyTranspiler.java index 83a7ddd..895a5e6 100644 --- a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultGroovyTranspiler.java +++ b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultGroovyTranspiler.java @@ -123,32 +123,11 @@ public class DefaultGroovyTranspiler implements GroovyTranspiler { final BlockStatement preambleBlock = convertResult.blockStatement(); if (preambleBlock != null) { - // Fields - final List preambleStatements = preambleBlock.getStatements(); - final List declarationsWithField = preambleStatements.stream() - .filter(statement -> statement instanceof ExpressionStatement) - .map(ExpressionStatement.class::cast) - .map(ExpressionStatement::getExpression) - .filter(expression -> expression instanceof DeclarationExpression) - .map(DeclarationExpression.class::cast) - .filter(declarationExpression -> - !declarationExpression.getAnnotations(FIELD_ANNOTATION).isEmpty() - ) - .toList(); - if (declarationsWithField.size() != preambleStatements.size()) { - // TODO: figure out why we have extraneous statements sometimes when it seems otherwise not - logger.warn( - "{} contains script statements which are not supported. " + - "Currently, only classes, methods, and field declarations " + - "(marked with @groovy.transform.Field) " + - "are supported. The rest will be ignored.", - templateClassName - ); - } - declarationsWithField.forEach(declaration -> { - declaration.setDeclaringClass(mainClassNode); - positionVisitor.visitDeclarationExpression(declaration); - }); + logger.warn( + "{} contains script statements which are not supported. Currently, only classes and" + + " methods are supported. The rest will be ignored.", + templateClassName + ); } // move methods from script class diff --git a/web-view-components/src/main/groovy/groowt/view/component/web/lib/Echo.groovy b/web-view-components/src/main/groovy/groowt/view/component/web/lib/Echo.groovy index 52a5ebf..dc06808 100644 --- a/web-view-components/src/main/groovy/groowt/view/component/web/lib/Echo.groovy +++ b/web-view-components/src/main/groovy/groowt/view/component/web/lib/Echo.groovy @@ -1,6 +1,7 @@ package groowt.view.component.web.lib import groowt.view.View +import groowt.view.component.runtime.ComponentWriter import groowt.view.component.runtime.DefaultComponentWriter class Echo extends DelegatingWebViewComponent { @@ -17,7 +18,16 @@ class Echo extends DelegatingWebViewComponent { return super.getProperty(propertyName) } catch (MissingPropertyException missingPropertyException) { if (this.attr.containsKey(propertyName)) { - return this.attr[propertyName] + def value = this.attr[propertyName] + if (value instanceof Closure) { + if (value.maximumNumberOfParameters == 0) { + return value + } else { + return value() + } + } else { + return value + } } else { throw missingPropertyException } @@ -26,12 +36,20 @@ class Echo extends DelegatingWebViewComponent { @Override protected View getDelegate() { - return { - def componentWriter = new DefaultComponentWriter(it) + return { Writer w -> + def componentWriter = new DefaultComponentWriter(w) componentWriter.setComponentContext(this.context) - componentWriter.setRenderContext(this.context.renderContext) // hacky + componentWriter.setRenderContext(this.context.renderContext) this.children.each { - componentWriter << it + if (it instanceof Closure) { + if (it.maximumNumberOfParameters == 1 && ComponentWriter.isAssignableFrom(it.parameterTypes[0])) { + it(componentWriter) + } else { + componentWriter << it() + } + } else { + componentWriter << it + } } } } diff --git a/web-view-components/src/test/groovy/groowt/view/component/web/BaseWebViewComponentTests.groovy b/web-view-components/src/test/groovy/groowt/view/component/web/BaseWebViewComponentTests.groovy index 2416a59..4fb841f 100644 --- a/web-view-components/src/test/groovy/groowt/view/component/web/BaseWebViewComponentTests.groovy +++ b/web-view-components/src/test/groovy/groowt/view/component/web/BaseWebViewComponentTests.groovy @@ -24,19 +24,6 @@ class BaseWebViewComponentTests extends AbstractWebViewComponentTests { } - @Test - void withPreambleImport() { - this.doTest(''' - --- - import groovy.transform.Field - - @Field - String greeting = 'Hello, World!' - --- - $greeting - '''.stripIndent().trim(), "Hello, World!") - } - @Test void nestedGreeter() { def context = this.context() { diff --git a/web-view-components/src/test/groovy/groowt/view/component/web/SimpleWebViewComponentTests.groovy b/web-view-components/src/test/groovy/groowt/view/component/web/SimpleWebViewComponentTests.groovy index e41da03..aec6d2d 100644 --- a/web-view-components/src/test/groovy/groowt/view/component/web/SimpleWebViewComponentTests.groovy +++ b/web-view-components/src/test/groovy/groowt/view/component/web/SimpleWebViewComponentTests.groovy @@ -18,22 +18,6 @@ class SimpleWebViewComponentTests extends AbstractWebViewComponentTests { ) } - @Test - void closureWithPropertyExpressionEvaluatesToValue() { - this.doTest( - ''' - --- - import groovy.transform.Field - - @Field - Map greetings = [hello: 'Hello!'] - --- - $greeting - '''.stripIndent().trim(), - 'Hello!' - ) - } - @Test void closureWithMethodCallIsClosure() { this.doTest( @@ -43,7 +27,7 @@ class SimpleWebViewComponentTests extends AbstractWebViewComponentTests { input.capitalize() } --- - ${ -> subHelper.call() } + helper('lowercase') }>${ -> subHelper.call() } '''.stripIndent().trim(), 'Lowercase' ) }