Skip to content

Commit

Permalink
🦄 refactor: Redesign ast 38
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Dec 7, 2024
1 parent f0f9b4b commit 4f344aa
Show file tree
Hide file tree
Showing 4 changed files with 426 additions and 408 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,15 @@ protected Ts2JavaAstBinExprLogical(

@Override
public void flipBang() {
bangFlipped = !bangFlipped;
if (isBangFlippable()) {
bangFlipped = !bangFlipped;
if (left instanceof ITs2JavaBangFlippable) {
left.as(ITs2JavaBangFlippable.class).flipBang();
}
if (right instanceof ITs2JavaBangFlippable) {
right.as(ITs2JavaBangFlippable.class).flipBang();
}
}
}

public Label getLabelFalse() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,6 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) {
final Swc4jAstBinaryOp finalOp = bangFlipped ? op.getOppositeOperator() : op;
final boolean isLeftLogical = left instanceof Ts2JavaAstBinExprLogical;
final boolean isRightLogical = right instanceof Ts2JavaAstBinExprLogical;
if (isLeftLogical) {
left.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelTrue)
.setLabelFalse(labelFalse);
}
if (isRightLogical) {
right.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelTrue)
Expand All @@ -59,6 +54,11 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) {
final int opcodeCompareFalse = bangFlipped ? Opcodes.IFNE : Opcodes.IFEQ;
switch (finalOp) {
case LogicalAnd: {
if (isLeftLogical) {
left.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelTrue)
.setLabelFalse(labelFalse);
}
sizes.add(left.apply(methodVisitor, context));
if (!isLeftLogical) {
methodVisitor.visitJumpInsn(opcodeCompareFalse, labelFalse);
Expand All @@ -70,9 +70,16 @@ public Size apply(MethodVisitor methodVisitor, Implementation.Context context) {
break;
}
case LogicalOr: {
if (isLeftLogical) {
left.as(Ts2JavaAstBinExprLogical.class)
.setLabelTrue(labelFalse)
.setLabelFalse(labelTrue);
}
final int opcodeCompareTrue = bangFlipped ? Opcodes.IFEQ : Opcodes.IFNE;
sizes.add(left.apply(methodVisitor, context));
methodVisitor.visitJumpInsn(opcodeCompareTrue, labelTrue);
if (!isLeftLogical) {
methodVisitor.visitJumpInsn(opcodeCompareTrue, labelTrue);
}
sizes.add(right.apply(methodVisitor, context));
if (!isRightLogical) {
methodVisitor.visitJumpInsn(opcodeCompareFalse, labelFalse);
Expand Down Expand Up @@ -110,6 +117,19 @@ public void compile() {
SimpleFreeMarkerFormat.format("Unsupported right type ${type} in logical AND (&&).",
SimpleMap.of("type", right.getType().getName())));
}
if (op == Swc4jAstBinaryOp.LogicalOr && left instanceof Ts2JavaAstBinExprLogical) {
left.as(Ts2JavaAstBinExprLogical.class).flipBang();
}
}

@Override
public void flipBang() {
super.flipBang();
if (isBangFlippable()) {
if (left instanceof Ts2JavaAstBinExprLogical) {
left.as(Ts2JavaAstBinExprLogical.class).flipBang();
}
}
}

@Override
Expand Down
Loading

0 comments on commit 4f344aa

Please sign in to comment.