Fixed transpilation of attr components.

This commit is contained in:
JesseBrault0709 2024-05-31 10:04:52 +02:00
parent 5ada84dfed
commit 715691d93c
4 changed files with 34 additions and 15 deletions

View File

@ -1,3 +1,4 @@
bin bin
groovyc-out groovyc-out
groovy-wvc-out groovy-wvc-out
dump*

View File

@ -6,5 +6,6 @@ import org.codehaus.groovy.ast.stmt.Statement;
import java.util.List; import java.util.List;
public interface ComponentTranspiler { public interface ComponentTranspiler {
List<Statement> createComponentStatements(ComponentNode componentNode, TranspilerState state, boolean isAttrComponent);
List<Statement> createComponentStatements(ComponentNode componentNode, TranspilerState state); List<Statement> createComponentStatements(ComponentNode componentNode, TranspilerState state);
} }

View File

@ -467,32 +467,43 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
/* MAIN */ /* MAIN */
@Override @Override
public List<Statement> createComponentStatements(ComponentNode componentNode, TranspilerState state) { public List<Statement> createComponentStatements(
ComponentNode componentNode,
TranspilerState state,
boolean isAttrComponent
) {
if (componentNode instanceof TypedComponentNode typedComponentNode) { if (componentNode instanceof TypedComponentNode typedComponentNode) {
final List<Statement> allStatements = new ArrayList<>();
// Resolve // Resolve
final List<Statement> resolveStatements = this.getResolveStatements(typedComponentNode, state); final List<Statement> resolveStatements = this.getResolveStatements(typedComponentNode, state);
allStatements.addAll(resolveStatements);
// Create // Create
final List<Statement> createStatements = this.getTypedCreateStatements(typedComponentNode, state); final List<Statement> createStatements = this.getTypedCreateStatements(typedComponentNode, state);
// Append/Add 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()); final Statement leftShift = this.leftShiftFactory.create(state, state.getCurrentComponent());
allStatements.add(leftShift);
}
// cleanup // cleanup
state.popResolved(); state.popResolved();
state.popComponent(); state.popComponent();
final List<Statement> allStatements = new ArrayList<>();
allStatements.addAll(resolveStatements);
allStatements.addAll(createStatements);
allStatements.add(leftShift);
return allStatements; return allStatements;
} else if (componentNode instanceof FragmentComponentNode fragmentComponentNode) { } else if (componentNode instanceof FragmentComponentNode fragmentComponentNode) {
// Create and add all at once final Expression fragmentCreate = this.getFragmentCreateExpression(fragmentComponentNode, state);
final Statement leftShift = this.leftShiftFactory.create( if (isAttrComponent) {
state, final ReturnStatement returnStatement = new ReturnStatement(fragmentCreate);
this.getFragmentCreateExpression(fragmentComponentNode, state) return List.of(returnStatement);
); } else {
final Statement leftShift = this.leftShiftFactory.create(state, fragmentCreate);
return List.of(leftShift); return List.of(leftShift);
}
} else { } else {
throw new WebViewComponentBugError(new IllegalArgumentException( throw new WebViewComponentBugError(new IllegalArgumentException(
"Cannot handle a ComponentNode not of type TypedComponentNode or FragmentComponentNode." "Cannot handle a ComponentNode not of type TypedComponentNode or FragmentComponentNode."
@ -500,4 +511,9 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
} }
} }
@Override
public List<Statement> createComponentStatements(ComponentNode componentNode, TranspilerState state) {
return this.createComponentStatements(componentNode, state, false);
}
} }

View File

@ -82,7 +82,8 @@ public class DefaultValueNodeTranspiler implements ValueNodeTranspiler {
Parameter.EMPTY_ARRAY, Parameter.EMPTY_ARRAY,
new BlockStatement(this.componentTranspiler.createComponentStatements( new BlockStatement(this.componentTranspiler.createComponentStatements(
componentValueNode.getComponentNode(), componentValueNode.getComponentNode(),
state state,
true
), state.getCurrentScope()) ), state.getCurrentScope())
); );
} }