diff --git a/web-view-components-compiler/.gitignore b/web-view-components-compiler/.gitignore index 6369cca..6e99eaf 100644 --- a/web-view-components-compiler/.gitignore +++ b/web-view-components-compiler/.gitignore @@ -1,3 +1,4 @@ bin groovyc-out groovy-wvc-out +dump* diff --git a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/ComponentTranspiler.java b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/ComponentTranspiler.java index accc774..d9f4a1b 100644 --- a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/ComponentTranspiler.java +++ b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/ComponentTranspiler.java @@ -6,5 +6,6 @@ import org.codehaus.groovy.ast.stmt.Statement; import java.util.List; public interface ComponentTranspiler { + List createComponentStatements(ComponentNode componentNode, TranspilerState state, boolean isAttrComponent); List createComponentStatements(ComponentNode componentNode, TranspilerState state); } diff --git a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultComponentTranspiler.java b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultComponentTranspiler.java index cd27904..12c1aef 100644 --- a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultComponentTranspiler.java +++ b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultComponentTranspiler.java @@ -467,32 +467,43 @@ public class DefaultComponentTranspiler implements ComponentTranspiler { /* MAIN */ @Override - public List createComponentStatements(ComponentNode componentNode, TranspilerState state) { + public List createComponentStatements( + ComponentNode componentNode, + TranspilerState state, + boolean isAttrComponent + ) { if (componentNode instanceof TypedComponentNode typedComponentNode) { + final List allStatements = new ArrayList<>(); + // Resolve final List resolveStatements = this.getResolveStatements(typedComponentNode, state); + allStatements.addAll(resolveStatements); // Create final List createStatements = this.getTypedCreateStatements(typedComponentNode, state); - // Append/Add - final Statement leftShift = this.leftShiftFactory.create(state, state.getCurrentComponent()); + allStatements.addAll(createStatements); + // return OR leftShift + if (isAttrComponent) { + final ReturnStatement returnStatement = new ReturnStatement(state.getCurrentComponent()); + allStatements.add(returnStatement); + } else { + final Statement leftShift = this.leftShiftFactory.create(state, state.getCurrentComponent()); + allStatements.add(leftShift); + } // cleanup state.popResolved(); state.popComponent(); - final List allStatements = new ArrayList<>(); - allStatements.addAll(resolveStatements); - allStatements.addAll(createStatements); - allStatements.add(leftShift); - return allStatements; } else if (componentNode instanceof FragmentComponentNode fragmentComponentNode) { - // Create and add all at once - final Statement leftShift = this.leftShiftFactory.create( - state, - this.getFragmentCreateExpression(fragmentComponentNode, state) - ); - return List.of(leftShift); + final Expression fragmentCreate = this.getFragmentCreateExpression(fragmentComponentNode, state); + if (isAttrComponent) { + final ReturnStatement returnStatement = new ReturnStatement(fragmentCreate); + return List.of(returnStatement); + } else { + final Statement leftShift = this.leftShiftFactory.create(state, fragmentCreate); + return List.of(leftShift); + } } else { throw new WebViewComponentBugError(new IllegalArgumentException( "Cannot handle a ComponentNode not of type TypedComponentNode or FragmentComponentNode." @@ -500,4 +511,9 @@ public class DefaultComponentTranspiler implements ComponentTranspiler { } } + @Override + public List createComponentStatements(ComponentNode componentNode, TranspilerState state) { + return this.createComponentStatements(componentNode, state, false); + } + } diff --git a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultValueNodeTranspiler.java b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultValueNodeTranspiler.java index c7eaeb8..899d6d9 100644 --- a/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultValueNodeTranspiler.java +++ b/web-view-components-compiler/src/main/java/groowt/view/component/web/transpile/DefaultValueNodeTranspiler.java @@ -82,7 +82,8 @@ public class DefaultValueNodeTranspiler implements ValueNodeTranspiler { Parameter.EMPTY_ARRAY, new BlockStatement(this.componentTranspiler.createComponentStatements( componentValueNode.getComponentNode(), - state + state, + true ), state.getCurrentScope()) ); }