diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExpr.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExpr.java index 0f14d5a..4f01aa0 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExpr.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExpr.java @@ -19,8 +19,6 @@ import com.caoccao.javet.buddy.ts2java.ast.BaseTs2JavaAst; import com.caoccao.javet.buddy.ts2java.ast.interfaces.ITs2JavaAst; import com.caoccao.javet.buddy.ts2java.ast.interfaces.ITs2JavaAstExpr; -import com.caoccao.javet.buddy.ts2java.ast.interfaces.abilities.ITs2JavaBangFlippable; -import com.caoccao.javet.buddy.ts2java.ast.interfaces.abilities.ITs2JavaMinusFlippable; import com.caoccao.javet.buddy.ts2java.ast.memo.Ts2JavaMemoFunction; import com.caoccao.javet.buddy.ts2java.exceptions.Ts2JavaAstException; import com.caoccao.javet.swc4j.ast.enums.Swc4jAstUnaryOp; @@ -33,8 +31,7 @@ public class Ts2JavaAstUnaryExpr extends BaseTs2JavaAst - implements ITs2JavaBangFlippable, ITs2JavaMinusFlippable, - ITs2JavaAstExpr { + implements ITs2JavaAstExpr { protected final ITs2JavaAstExpr arg; protected Swc4jAstUnaryOp op; @@ -51,77 +48,26 @@ public static Ts2JavaAstUnaryExpr create( ITs2JavaAst parent, Swc4jAstUnaryExpr ast, Ts2JavaMemoFunction memo) { - return new Ts2JavaAstUnaryExpr(parent, ast, memo); + switch (ast.getOp()) { + case Bang: + return new Ts2JavaAstUnaryExprBang(parent, ast, memo); + case Minus: + return new Ts2JavaAstUnaryExprMinus(parent, ast, memo); + default: + return new Ts2JavaAstUnaryExpr(parent, ast, memo); + } } @Override public Size apply(MethodVisitor methodVisitor, Implementation.Context context) { visitLineNumber(methodVisitor); - Size size = arg.apply(methodVisitor, context); - switch (op) { - case Bang: - if (!isBangFlippable()) { - final int opcode = getOpcodeNegative(); - methodVisitor.visitInsn(opcode); - } - break; - case Minus: { - if (!isMinusFlippable()) { - final int opcode = getOpcodeNegative(); - methodVisitor.visitInsn(opcode); - } - break; - } - case Plus: - // There is no need to do anything. - break; - default: - throw new Ts2JavaAstException( - ast, - SimpleFreeMarkerFormat.format("Unary expr op ${op} is not supported.", - SimpleMap.of("op", op.name()))); - } - return size; + return arg.apply(methodVisitor, context); } @Override public void compile() { arg.compile(); type = arg.getType(); - switch (op) { - case Bang: - if (arg instanceof ITs2JavaBangFlippable) { - arg.as(ITs2JavaBangFlippable.class).flipBang(); - } - break; - case Minus: - if (arg instanceof ITs2JavaMinusFlippable) { - arg.as(ITs2JavaMinusFlippable.class).flipMinus(); - } - break; - case Plus: - // There is no need to do anything. - break; - default: - throw new Ts2JavaAstException( - ast, - SimpleFreeMarkerFormat.format("Unary expr op ${op} is not supported.", - SimpleMap.of("op", op.name()))); - } - } - - @Override - public void flipBang() { - if (isBangFlippable()) { - arg.as(ITs2JavaBangFlippable.class).flipBang(); - } - } - - @Override - public void flipMinus() { - if (isMinusFlippable()) { - arg.as(ITs2JavaMinusFlippable.class).flipMinus(); - } } public ITs2JavaAstExpr getArg() { @@ -153,22 +99,6 @@ protected int getOpcodeNegative() { } } - @Override - public boolean isBangFlippable() { - if (op == Swc4jAstUnaryOp.Bang && arg instanceof ITs2JavaBangFlippable) { - return arg.as(ITs2JavaBangFlippable.class).isBangFlippable(); - } - return false; - } - - @Override - public boolean isMinusFlippable() { - if (op == Swc4jAstUnaryOp.Minus && arg instanceof ITs2JavaMinusFlippable) { - return arg.as(ITs2JavaMinusFlippable.class).isMinusFlippable(); - } - return false; - } - @Override public void syncLabels() { arg.syncLabels(); diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExprBang.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExprBang.java new file mode 100644 index 0000000..f582a46 --- /dev/null +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExprBang.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.caoccao.javet.buddy.ts2java.ast.expr; + +import com.caoccao.javet.buddy.ts2java.ast.interfaces.ITs2JavaAst; +import com.caoccao.javet.buddy.ts2java.ast.interfaces.abilities.ITs2JavaBangFlippable; +import com.caoccao.javet.buddy.ts2java.ast.memo.Ts2JavaMemoFunction; +import com.caoccao.javet.swc4j.ast.enums.Swc4jAstUnaryOp; +import com.caoccao.javet.swc4j.ast.expr.Swc4jAstUnaryExpr; +import net.bytebuddy.implementation.Implementation; +import net.bytebuddy.jar.asm.MethodVisitor; + +public class Ts2JavaAstUnaryExprBang + extends Ts2JavaAstUnaryExpr + implements ITs2JavaBangFlippable { + protected Ts2JavaAstUnaryExprBang( + ITs2JavaAst parent, + Swc4jAstUnaryExpr ast, + Ts2JavaMemoFunction memo) { + super(parent, ast, memo); + op = Swc4jAstUnaryOp.Bang; + } + + @Override + public Size apply(MethodVisitor methodVisitor, Implementation.Context context) { + Size size = super.apply(methodVisitor, context); + if (!isBangFlippable()) { + final int opcode = getOpcodeNegative(); + methodVisitor.visitInsn(opcode); + } + return size; + } + + @Override + public void compile() { + super.compile(); + flipBang(); + } + + @Override + public void flipBang() { + if (isBangFlippable()) { + arg.as(ITs2JavaBangFlippable.class).flipBang(); + } + } + + @Override + public boolean isBangFlippable() { + if (arg instanceof ITs2JavaBangFlippable) { + return arg.as(ITs2JavaBangFlippable.class).isBangFlippable(); + } + return false; + } +} diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExprMinus.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExprMinus.java new file mode 100644 index 0000000..88378b7 --- /dev/null +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/expr/Ts2JavaAstUnaryExprMinus.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024. caoccao.com Sam Cao + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.caoccao.javet.buddy.ts2java.ast.expr; + +import com.caoccao.javet.buddy.ts2java.ast.interfaces.ITs2JavaAst; +import com.caoccao.javet.buddy.ts2java.ast.interfaces.abilities.ITs2JavaMinusFlippable; +import com.caoccao.javet.buddy.ts2java.ast.memo.Ts2JavaMemoFunction; +import com.caoccao.javet.swc4j.ast.enums.Swc4jAstUnaryOp; +import com.caoccao.javet.swc4j.ast.expr.Swc4jAstUnaryExpr; +import net.bytebuddy.implementation.Implementation; +import net.bytebuddy.jar.asm.MethodVisitor; + +public class Ts2JavaAstUnaryExprMinus + extends Ts2JavaAstUnaryExpr + implements ITs2JavaMinusFlippable { + protected Ts2JavaAstUnaryExprMinus( + ITs2JavaAst parent, + Swc4jAstUnaryExpr ast, + Ts2JavaMemoFunction memo) { + super(parent, ast, memo); + op = Swc4jAstUnaryOp.Minus; + } + + @Override + public Size apply(MethodVisitor methodVisitor, Implementation.Context context) { + Size size = super.apply(methodVisitor, context); + if (!isMinusFlippable()) { + final int opcode = getOpcodeNegative(); + methodVisitor.visitInsn(opcode); + } + return size; + } + + @Override + public void compile() { + super.compile(); + flipMinus(); + } + + @Override + public void flipMinus() { + if (isMinusFlippable()) { + arg.as(ITs2JavaMinusFlippable.class).flipMinus(); + } + } + + @Override + public boolean isMinusFlippable() { + if (arg instanceof ITs2JavaMinusFlippable) { + return arg.as(ITs2JavaMinusFlippable.class).isMinusFlippable(); + } + return false; + } +}