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
groovyc-out
groovy-wvc-out
dump*

View File

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

View File

@ -467,32 +467,43 @@ public class DefaultComponentTranspiler implements ComponentTranspiler {
/* MAIN */
@Override
public List<Statement> createComponentStatements(ComponentNode componentNode, TranspilerState state) {
public List<Statement> createComponentStatements(
ComponentNode componentNode,
TranspilerState state,
boolean isAttrComponent
) {
if (componentNode instanceof TypedComponentNode typedComponentNode) {
final List<Statement> allStatements = new ArrayList<>();
// Resolve
final List<Statement> resolveStatements = this.getResolveStatements(typedComponentNode, state);
allStatements.addAll(resolveStatements);
// Create
final List<Statement> 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<Statement> 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<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,
new BlockStatement(this.componentTranspiler.createComponentStatements(
componentValueNode.getComponentNode(),
state
state,
true
), state.getCurrentScope())
);
}