diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/ITs2JavaAstAppend.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/ITs2JavaAstAppend.java new file mode 100644 index 0000000..8c389f9 --- /dev/null +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/ITs2JavaAstAppend.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024-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; + +import com.caoccao.javet.swc4j.ast.Swc4jAst; +import net.bytebuddy.implementation.bytecode.ByteCodeAppender; + +import java.util.List; + +public interface ITs2JavaAstAppend { + void append(List appenders, AST ast); +} diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/BaseTs2JavaAst.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/ITs2JavaAstTranspile.java similarity index 82% rename from src/main/java/com/caoccao/javet/buddy/ts2java/ast/BaseTs2JavaAst.java rename to src/main/java/com/caoccao/javet/buddy/ts2java/ast/ITs2JavaAstTranspile.java index 9658e32..53d1e6e 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/BaseTs2JavaAst.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/ITs2JavaAstTranspile.java @@ -19,6 +19,6 @@ import com.caoccao.javet.swc4j.ast.Swc4jAst; import net.bytebuddy.dynamic.DynamicType; -public abstract class BaseTs2JavaAst { - public abstract DynamicType.Builder transpile(DynamicType.Builder builder, AST ast); +public interface ITs2JavaAstTranspile { + DynamicType.Builder transpile(DynamicType.Builder builder, AST ast); } diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java new file mode 100644 index 0000000..125ea79 --- /dev/null +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBinExpr.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2024-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; + +import com.caoccao.javet.swc4j.ast.expr.Swc4jAstBinExpr; +import net.bytebuddy.implementation.Implementation; +import net.bytebuddy.implementation.bytecode.ByteCodeAppender; +import net.bytebuddy.implementation.bytecode.StackManipulation; +import net.bytebuddy.implementation.bytecode.member.MethodReturn; +import net.bytebuddy.jar.asm.MethodVisitor; +import net.bytebuddy.jar.asm.Opcodes; + +import java.util.List; + +public final class Ts2JavaAstBinExpr implements ITs2JavaAstAppend { + @Override + public void append(List appenders, Swc4jAstBinExpr ast) { + // TODO + appenders.add((methodVisitor, implementationContext, instrumentedMethod) -> { + StackManipulation.Size size = new StackManipulation.Compound( + new StackManipulation.Simple(( + MethodVisitor simpleMethodVisitor, + Implementation.Context simpleImplementationContext) -> { + simpleMethodVisitor.visitVarInsn(Opcodes.ILOAD, 1); + simpleMethodVisitor.visitVarInsn(Opcodes.ILOAD, 2); + simpleMethodVisitor.visitInsn(Opcodes.IADD); + return new StackManipulation.Size(2, 0); + }), + MethodReturn.INTEGER + ).apply(methodVisitor, implementationContext); + return new ByteCodeAppender.Size( + size.getMaximalSize(), + instrumentedMethod.getStackSize()); + } + ); + } +} diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBlockStmt.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBlockStmt.java new file mode 100644 index 0000000..6fd88bd --- /dev/null +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstBlockStmt.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024-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; + +import com.caoccao.javet.buddy.ts2java.Ts2JavaException; +import com.caoccao.javet.swc4j.ast.stmt.Swc4jAstBlockStmt; +import com.caoccao.javet.swc4j.ast.stmt.Swc4jAstReturnStmt; +import net.bytebuddy.implementation.bytecode.ByteCodeAppender; + +import java.util.List; + +public final class Ts2JavaAstBlockStmt implements ITs2JavaAstAppend { + @Override + public void append(List appenders, Swc4jAstBlockStmt ast) { + ast.getStmts().forEach(stmt -> { + switch (stmt.getType()) { + case ReturnStmt: + new Ts2JavaAstReturnStmt().append(appenders, stmt.as(Swc4jAstReturnStmt.class)); + break; + default: + throw new Ts2JavaException(stmt.getType().name() + " is not supported"); + } + }); + } +} diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClass.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClass.java index 5340b4e..7d73721 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClass.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClass.java @@ -21,7 +21,7 @@ import com.caoccao.javet.swc4j.ast.interfaces.ISwc4jAstClassMember; import net.bytebuddy.dynamic.DynamicType; -public final class Ts2JavaAstClass extends BaseTs2JavaAst { +public final class Ts2JavaAstClass implements ITs2JavaAstTranspile { @Override public DynamicType.Builder transpile( DynamicType.Builder builder, diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassDecl.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassDecl.java index 59467fe..1fe2194 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassDecl.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassDecl.java @@ -20,7 +20,7 @@ import com.caoccao.javet.utils.StringUtils; import net.bytebuddy.dynamic.DynamicType; -public final class Ts2JavaAstClassDecl extends BaseTs2JavaAst { +public final class Ts2JavaAstClassDecl implements ITs2JavaAstTranspile { private final String packageName; public Ts2JavaAstClassDecl(String packageName) { diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java index b0c91e9..b06ed5f 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassFunction.java @@ -22,7 +22,8 @@ import com.caoccao.javet.swc4j.ast.enums.Swc4jAstAccessibility; import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.implementation.Implementation; +import net.bytebuddy.implementation.bytecode.ByteCodeAppender; import java.util.ArrayList; import java.util.List; @@ -30,7 +31,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; -public final class Ts2JavaAstClassFunction extends BaseTs2JavaAst { +public final class Ts2JavaAstClassFunction implements ITs2JavaAstTranspile { private final Swc4jAstAccessibility accessibility; private final String name; @@ -64,10 +65,11 @@ public DynamicType.Builder transpile( final Class[] parameters = stackFrame.getObjects().stream() .map(JavaStackObject::getType) .toArray(Class[]::new); + final List appenders = new ArrayList<>(); + ast.getBody().ifPresent(blockStmt -> new Ts2JavaAstBlockStmt().append(appenders, blockStmt)); builder = builder.defineMethod(name, returnType, visibility) .withParameters(parameters) - // TODO - .intercept(MethodDelegation.to(this)); + .intercept(new Implementation.Simple(appenders.toArray(new ByteCodeAppender[0]))); return builder; } } diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassMethod.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassMethod.java index 773b71d..4c0b9f6 100644 --- a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassMethod.java +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstClassMethod.java @@ -23,7 +23,7 @@ import com.caoccao.javet.swc4j.ast.expr.Swc4jAstIdentName; import net.bytebuddy.dynamic.DynamicType; -public final class Ts2JavaAstClassMethod extends BaseTs2JavaAst { +public final class Ts2JavaAstClassMethod implements ITs2JavaAstTranspile { @Override public DynamicType.Builder transpile( DynamicType.Builder builder, diff --git a/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstReturnStmt.java b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstReturnStmt.java new file mode 100644 index 0000000..c65ebec --- /dev/null +++ b/src/main/java/com/caoccao/javet/buddy/ts2java/ast/Ts2JavaAstReturnStmt.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024-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; + +import com.caoccao.javet.buddy.ts2java.Ts2JavaException; +import com.caoccao.javet.swc4j.ast.expr.Swc4jAstBinExpr; +import com.caoccao.javet.swc4j.ast.stmt.Swc4jAstReturnStmt; +import net.bytebuddy.implementation.bytecode.ByteCodeAppender; + +import java.util.List; + +public final class Ts2JavaAstReturnStmt implements ITs2JavaAstAppend { + @Override + public void append(List appenders, Swc4jAstReturnStmt ast) { + ast.getArg().ifPresent(arg -> { + switch (arg.getType()) { + case BinExpr: + new Ts2JavaAstBinExpr().append(appenders, arg.as(Swc4jAstBinExpr.class)); + break; + default: + throw new Ts2JavaException(arg.getType().name() + " is not supported"); + } + }); + } +}