Skip to content

Commit

Permalink
✨ feat: Add return type case
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Oct 28, 2024
1 parent 73a668e commit a5d241c
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 8 deletions.
5 changes: 5 additions & 0 deletions scripts/ts/test/test.basic.operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ class Test {
return a + b;
}

public add_II_L(a: int, b: int): long {
return a + b;
}

public add_IL_L(a: int, b: long): long {
return a + b;
}
Expand Down Expand Up @@ -39,6 +43,7 @@ class Test {
}

console.log(new Test().add_II_I(1, 2));
console.log(new Test().add_II_L(1, 2));
console.log(new Test().add_IL_L(1, 2));
console.log(new Test().add_LI_L(1, 2));
console.log(new Test().divide_II_I(3, 2));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@

import com.caoccao.javet.buddy.ts2java.compiler.JavaFunctionContext;
import com.caoccao.javet.swc4j.ast.interfaces.ISwc4jAst;
import net.bytebuddy.description.type.TypeDescription;

import java.util.Optional;

public interface ITs2JavaAstStackManipulation<AST extends ISwc4jAst> {
void manipulate(JavaFunctionContext functionContext, AST ast);
Optional<TypeDescription> manipulate(JavaFunctionContext functionContext, AST ast);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,12 @@
import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public final class Ts2JavaAstBinExpr implements ITs2JavaAstStackManipulation<Swc4jAstBinExpr> {
@Override
public void manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast) {
public Optional<TypeDescription> manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast) {
List<ISwc4jAstExpr> expressions = SimpleList.of(ast.getLeft(), ast.getRight());
List<JavaStackObject> stackObjects = expressions.stream()
.map(expression -> {
Expand Down Expand Up @@ -90,5 +91,6 @@ public void manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast)
SimpleMap.of("op", ast.getOp().name())));
}
functionContext.getStackManipulations().add(stackManipulation);
return Optional.of(upCaseType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@
import com.caoccao.javet.swc4j.ast.stmt.Swc4jAstReturnStmt;
import com.caoccao.javet.utils.SimpleFreeMarkerFormat;
import com.caoccao.javet.utils.SimpleMap;
import net.bytebuddy.description.type.TypeDescription;

import java.util.Optional;

public final class Ts2JavaAstBlockStmt implements ITs2JavaAstStackManipulation<Swc4jAstBlockStmt> {
@Override
public void manipulate(JavaFunctionContext functionContext, Swc4jAstBlockStmt ast) {
public Optional<TypeDescription> manipulate(JavaFunctionContext functionContext, Swc4jAstBlockStmt ast) {
ast.getStmts().forEach(stmt -> {
switch (stmt.getType()) {
case ReturnStmt:
Expand All @@ -38,5 +41,6 @@ public void manipulate(JavaFunctionContext functionContext, Swc4jAstBlockStmt as
SimpleMap.of("type", stmt.getType().name())));
}
});
return Optional.empty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,45 @@

package com.caoccao.javet.buddy.ts2java.ast;

import com.caoccao.javet.buddy.ts2java.compiler.JavaClassCast;
import com.caoccao.javet.buddy.ts2java.compiler.JavaFunctionContext;
import com.caoccao.javet.buddy.ts2java.exceptions.Ts2JavaAstException;
import com.caoccao.javet.swc4j.ast.expr.Swc4jAstBinExpr;
import com.caoccao.javet.swc4j.ast.interfaces.ISwc4jAstExpr;
import com.caoccao.javet.swc4j.ast.stmt.Swc4jAstReturnStmt;
import com.caoccao.javet.utils.SimpleFreeMarkerFormat;
import com.caoccao.javet.utils.SimpleMap;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.StackManipulation;
import net.bytebuddy.implementation.bytecode.member.MethodReturn;

import java.util.Optional;

public final class Ts2JavaAstReturnStmt implements ITs2JavaAstStackManipulation<Swc4jAstReturnStmt> {
@Override
public void manipulate(JavaFunctionContext functionContext, Swc4jAstReturnStmt ast) {
ast.getArg().ifPresent(arg -> {
public Optional<TypeDescription> manipulate(JavaFunctionContext functionContext, Swc4jAstReturnStmt ast) {
Optional<TypeDescription> fromType = Optional.empty();
if (ast.getArg().isPresent()) {
ISwc4jAstExpr arg = ast.getArg().get();
switch (arg.getType()) {
case BinExpr:
new Ts2JavaAstBinExpr().manipulate(functionContext, arg.as(Swc4jAstBinExpr.class));
fromType = new Ts2JavaAstBinExpr().manipulate(functionContext, arg.as(Swc4jAstBinExpr.class));
break;
default:
throw new Ts2JavaAstException(
arg,
SimpleFreeMarkerFormat.format("ReturnStmt arg type ${argType} is not supported",
SimpleMap.of("argType", arg.getType().name())));
}
});
StackManipulation stackManipulation = MethodReturn.of(functionContext.getReturnType());
}
if (!fromType.isPresent()) {
throw new Ts2JavaAstException(ast, "ReturnStmt type is unknown");
}
TypeDescription returnType = functionContext.getReturnType();
JavaClassCast.getUpCastStackManipulation(fromType.get(), returnType)
.ifPresent(functionContext.getStackManipulations()::add);
StackManipulation stackManipulation = MethodReturn.of(returnType);
functionContext.getStackManipulations().add(stackManipulation);
return Optional.of(returnType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,19 @@ public void testAdd_II_I() throws Exception {
assertEquals(1 + 2, method.invoke(object, 1, 2));
}

@Test
public void testAdd_II_L() throws Exception {
assertEquals(3, add(1, 2));
Method method = clazz.getMethod("add_II_L", int.class, int.class);
assertNotNull(method);
assertEquals(long.class, method.getReturnType());
assertEquals(2, method.getParameterCount());
assertEquals(int.class, method.getParameters()[0].getType());
assertEquals(int.class, method.getParameters()[1].getType());
Object object = clazz.getConstructor().newInstance();
assertEquals(1L + 2L, method.invoke(object, 1, 2));
}

@Test
public void testAdd_IL_L() throws Exception {
assertEquals(3, add(1, 2L));
Expand Down

0 comments on commit a5d241c

Please sign in to comment.