Skip to content

Commit

Permalink
🦄 refactor: Replace Class with TypeDescription
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Oct 28, 2024
1 parent 54ccc39 commit 4ec0537
Show file tree
Hide file tree
Showing 16 changed files with 278 additions and 174 deletions.
20 changes: 20 additions & 0 deletions scripts/ts/test/test.assignments.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { type float, double, int, long } from "./test.type.aliases.ts";

class Test {
// public sum(n: int): int {
// let sum: int = 0;
// for (let i: int = 0; i < n; i++) {
// sum += i;
// }
// return sum;
// }

public assignAndCast(a: int, b: long): double {
let c: long = a;
let d: long = b;
return c + d;
}
}

// console.log(new Test().sum(10));
console.log(new Test().assignAndCast(1, 2));
10 changes: 5 additions & 5 deletions scripts/ts/test/test.basic.operations.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type int, type long } from "./test.type.aliases.ts";
import { type int, long } from "./test.type.aliases.ts";

class Test {
public add_II_I(a: int, b: int): int {
Expand All @@ -21,11 +21,11 @@ class Test {
return a * b;
}

public shift_left_II_I(a: int, b: int): int {
public shiftLeft_II_I(a: int, b: int): int {
return a << b;
}

public shift_right_II_I(a: int, b: int): int {
public shiftRight_II_I(a: int, b: int): int {
return a >> b;
}

Expand All @@ -39,6 +39,6 @@ console.log(new Test().add_IL_L(1, 2));
console.log(new Test().divide_II_I(3, 2));
console.log(new Test().mod_II_I(3, 2));
console.log(new Test().multiply_II_I(3, 2));
console.log(new Test().shift_left_II_I(3, 2));
console.log(new Test().shift_right_II_I(3, 1));
console.log(new Test().shiftLeft_II_I(3, 2));
console.log(new Test().shiftRight_II_I(3, 1));
console.log(new Test().subtract_II_I(3, 2));
11 changes: 0 additions & 11 deletions scripts/ts/test/test.sum.ts

This file was deleted.

2 changes: 2 additions & 0 deletions scripts/ts/test/test.type.aliases.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export type float = number;
export type double = number;
export type int = number;
export type long = number;
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

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

import com.caoccao.javet.buddy.ts2java.compiler.JavaByteCodeMethodVariableAccess;
import com.caoccao.javet.buddy.ts2java.compiler.JavaClassCast;
import com.caoccao.javet.buddy.ts2java.compiler.JavaFunctionContext;
import com.caoccao.javet.buddy.ts2java.compiler.JavaStackObject;
Expand All @@ -27,7 +26,9 @@
import com.caoccao.javet.utils.SimpleFreeMarkerFormat;
import com.caoccao.javet.utils.SimpleList;
import com.caoccao.javet.utils.SimpleMap;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.StackManipulation;
import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess;

import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -50,35 +51,37 @@ public void manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast)
}
})
.collect(Collectors.toList());
Class<?> upCastClass = JavaClassCast.getUpCastClassForMathOp(
stackObjects.stream().map(JavaStackObject::getType).toArray(Class[]::new));
TypeDescription upCaseType = JavaClassCast.getUpCastTypeForMathOp(
stackObjects.stream().map(JavaStackObject::getType).toArray(TypeDescription[]::new));
stackObjects.forEach(stackObject -> {
functionContext.getStackManipulations().add(JavaByteCodeMethodVariableAccess.load(stackObject));
JavaClassCast.getUpCastStackManipulation(stackObject.getType(), upCastClass)
functionContext.getStackManipulations().add(
MethodVariableAccess.of(stackObject.getType())
.loadFrom(stackObject.getOffset()));
JavaClassCast.getUpCastStackManipulation(stackObject.getType(), upCaseType)
.ifPresent(functionContext.getStackManipulations()::add);
});
StackManipulation stackManipulation;
switch (ast.getOp()) {
case Add:
stackManipulation = JavaClassCast.getAddition(upCastClass);
stackManipulation = JavaClassCast.getAddition(upCaseType);
break;
case Div:
stackManipulation = JavaClassCast.getDivision(upCastClass);
stackManipulation = JavaClassCast.getDivision(upCaseType);
break;
case LShift:
stackManipulation = JavaClassCast.getShiftLeft(upCastClass);
stackManipulation = JavaClassCast.getShiftLeft(upCaseType);
break;
case Mod:
stackManipulation = JavaClassCast.getRemainder(upCastClass);
stackManipulation = JavaClassCast.getRemainder(upCaseType);
break;
case Mul:
stackManipulation = JavaClassCast.getMultiplication(upCastClass);
stackManipulation = JavaClassCast.getMultiplication(upCaseType);
break;
case RShift:
stackManipulation = JavaClassCast.getShiftRight(upCastClass);
stackManipulation = JavaClassCast.getShiftRight(upCaseType);
break;
case Sub:
stackManipulation = JavaClassCast.getSubtraction(upCastClass);
stackManipulation = JavaClassCast.getSubtraction(upCaseType);
break;
default:
throw new Ts2JavaAstException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@
package com.caoccao.javet.buddy.ts2java.ast;

import com.caoccao.javet.swc4j.ast.pat.Swc4jAstBindingIdent;
import net.bytebuddy.description.type.TypeDescription;

public final class Ts2JavaAstBindingIdent {
private Ts2JavaAstBindingIdent() {
}

public static Class<?> getClass(Swc4jAstBindingIdent ast) {
public static TypeDescription getTypeDescription(Swc4jAstBindingIdent ast) {
return ast.getTypeAnn()
.map(Ts2JavaAstTsTypeAnn::getClass)
.orElse((Class) Object.class);
.map(Ts2JavaAstTsTypeAnn::getTypeDescription)
.orElse(TypeDescription.ForLoadedType.of(Object.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.caoccao.javet.swc4j.ast.clazz.Swc4jAstFunction;
import com.caoccao.javet.swc4j.ast.enums.Swc4jAstAccessibility;
import net.bytebuddy.description.modifier.Visibility;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.implementation.bytecode.StackManipulation;
Expand All @@ -30,7 +31,6 @@
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public final class Ts2JavaAstClassFunction implements ITs2JavaAstTranspile<Swc4jAstFunction> {
private final boolean _static;
Expand Down Expand Up @@ -60,18 +60,19 @@ public DynamicType.Builder<?> transpile(
DynamicType.Builder<?> builder,
Swc4jAstFunction ast) {
final Visibility visibility = Ts2JavaAstAccessibility.getVisibility(accessibility);
final Class<?> returnType = ast.getReturnType()
.map(Ts2JavaAstTsTypeAnn::getClass)
.orElse((Class) Object.class);
final TypeDescription returnType = ast.getReturnType()
.map(Ts2JavaAstTsTypeAnn::getTypeDescription)
.orElse(TypeDescription.ForLoadedType.of(Object.class));
final List<JavaStackFrame> stackFrames = new ArrayList<>();
final List<JavaStackObject> stackObjects = IntStream.range(0, ast.getParams().size())
.mapToObj(i -> Ts2JavaAstParam.getStackObject(i + (_static ? 0 : 1), ast.getParams().get(i)))
final List<JavaStackObject> stackObjects = ast.getParams().stream()
.map(Ts2JavaAstParam::getStackObject)
.collect(Collectors.toList());
final JavaStackFrame initialStackFrame = new JavaStackFrame(0, stackObjects);
stackFrames.add(initialStackFrame);
final JavaFunctionContext functionContext = new JavaFunctionContext(stackFrames, returnType);
final JavaFunctionContext functionContext = new JavaFunctionContext(_static, stackFrames, returnType);
functionContext.syncOffset();
ast.getBody().ifPresent(blockStmt -> new Ts2JavaAstBlockStmt().manipulate(functionContext, blockStmt));
final Class<?>[] parameters = functionContext.getParameters();
final TypeDescription[] parameters = functionContext.getParameters();
final StackManipulation[] stackManipulations =
functionContext.getStackManipulations().toArray(new StackManipulation[0]);
builder = builder.defineMethod(name, returnType, visibility)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,20 @@
import com.caoccao.javet.swc4j.ast.pat.Swc4jAstBindingIdent;
import com.caoccao.javet.utils.SimpleFreeMarkerFormat;
import com.caoccao.javet.utils.SimpleMap;
import net.bytebuddy.description.type.TypeDescription;

public final class Ts2JavaAstParam {
private Ts2JavaAstParam() {
}

public static JavaStackObject getStackObject(int index, Swc4jAstParam ast) {
public static JavaStackObject getStackObject(Swc4jAstParam ast) {
ISwc4jAstPat pat = ast.getPat();
switch (pat.getType()) {
case BindingIdent:
String ident = pat.as(Swc4jAstBindingIdent.class).getId().getSym();
Class<?> type = Ts2JavaAstBindingIdent.getClass(pat.as(Swc4jAstBindingIdent.class));
return new JavaStackObject(index, ident, type);
TypeDescription typeDescription =
Ts2JavaAstBindingIdent.getTypeDescription(pat.as(Swc4jAstBindingIdent.class));
return new JavaStackObject(ident, typeDescription);
default:
throw new Ts2JavaAstException(
pat,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
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;

Expand All @@ -41,8 +40,7 @@ public void manipulate(JavaFunctionContext functionContext, Swc4jAstReturnStmt a
SimpleMap.of("argType", arg.getType().name())));
}
});
TypeDescription typeDescription = TypeDescription.ForLoadedType.of(functionContext.getReturnType());
StackManipulation stackManipulation = MethodReturn.of(typeDescription);
StackManipulation stackManipulation = MethodReturn.of(functionContext.getReturnType());
functionContext.getStackManipulations().add(stackManipulation);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,34 @@
import com.caoccao.javet.swc4j.ast.ts.Swc4jAstTsTypeAnn;
import com.caoccao.javet.swc4j.ast.ts.Swc4jAstTsTypeRef;
import com.caoccao.javet.utils.SimpleMap;
import net.bytebuddy.description.type.TypeDescription;

import java.util.Map;

public final class Ts2JavaAstTsTypeAnn {
private static final Map<String, Class<?>> TYPE_MAP = SimpleMap.of(
"boolean", boolean.class,
"byte", byte.class,
"char", char.class,
"double", double.class,
"float", float.class,
"int", int.class,
"long", long.class,
"short", short.class
private static final Map<String, TypeDescription> TYPE_MAP = SimpleMap.of(
"boolean", TypeDescription.ForLoadedType.of(boolean.class),
"byte", TypeDescription.ForLoadedType.of(byte.class),
"char", TypeDescription.ForLoadedType.of(char.class),
"double", TypeDescription.ForLoadedType.of(double.class),
"float", TypeDescription.ForLoadedType.of(float.class),
"int", TypeDescription.ForLoadedType.of(int.class),
"long", TypeDescription.ForLoadedType.of(long.class),
"short", TypeDescription.ForLoadedType.of(short.class)
);

private Ts2JavaAstTsTypeAnn() {
}

public static Class<?> getClass(Swc4jAstTsTypeAnn ast) {
public static TypeDescription getTypeDescription(Swc4jAstTsTypeAnn ast) {
ISwc4jAstTsType tsType = ast.getTypeAnn();
switch (tsType.getType()) {
case TsTypeRef:
Swc4jAstTsTypeRef tsTypeRef = tsType.as(Swc4jAstTsTypeRef.class);
ISwc4jAstTsEntityName tsEntityName = tsTypeRef.getTypeName();
return TYPE_MAP.get(Ts2JavaAstTsEntityName.getName(tsEntityName));
default:
return Object.class;
return TypeDescription.ForLoadedType.of(Object.class);
}
}
}

This file was deleted.

Loading

0 comments on commit 4ec0537

Please sign in to comment.