Skip to content

Commit

Permalink
🦄 refactor: Add unary expr bang, unary expr minus
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Dec 17, 2024
1 parent ad3a282 commit efd1192
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -33,8 +31,7 @@

public class Ts2JavaAstUnaryExpr
extends BaseTs2JavaAst<Swc4jAstUnaryExpr, Ts2JavaMemoFunction>
implements ITs2JavaBangFlippable, ITs2JavaMinusFlippable,
ITs2JavaAstExpr<Swc4jAstUnaryExpr, Ts2JavaMemoFunction> {
implements ITs2JavaAstExpr<Swc4jAstUnaryExpr, Ts2JavaMemoFunction> {
protected final ITs2JavaAstExpr<?, ?> arg;
protected Swc4jAstUnaryOp op;

Expand All @@ -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() {
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}

0 comments on commit efd1192

Please sign in to comment.