From ae45693ed6eb52a4dff76e43f55e143592ebfea8 Mon Sep 17 00:00:00 2001 From: Angelos Bimpoudis Date: Mon, 5 Jun 2023 15:51:18 +0200 Subject: [PATCH] WIP: deconstructor translation --- .../sun/tools/javac/comp/TransPatterns.java | 62 ++++++++++++------- .../tools/javac/patterns/Points.java | 7 +-- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java index ec9250a3c5aa6..967b3e87f1ec3 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java @@ -34,7 +34,11 @@ import static com.sun.tools.javac.code.Flags.STATIC; import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Kinds.Kind; + +import static com.sun.tools.javac.code.Kinds.Kind.MTH; import static com.sun.tools.javac.code.Kinds.Kind.VAR; +import static com.sun.tools.javac.code.TypeTag.*; + import com.sun.tools.javac.code.Preview; import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.BindingSymbol; @@ -68,29 +72,12 @@ import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Names; -import java.util.Collections; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.LinkedHashMap; -import java.util.Set; import com.sun.tools.javac.code.Symbol.MethodSymbol; import com.sun.tools.javac.code.Symbol.RecordComponent; import com.sun.tools.javac.code.Type; -import static com.sun.tools.javac.code.TypeTag.ARRAY; -import static com.sun.tools.javac.code.TypeTag.BOOLEAN; -import static com.sun.tools.javac.code.TypeTag.BOT; -import static com.sun.tools.javac.code.TypeTag.BYTE; -import static com.sun.tools.javac.code.TypeTag.CHAR; -import static com.sun.tools.javac.code.TypeTag.CLASS; -import static com.sun.tools.javac.code.TypeTag.DOUBLE; -import static com.sun.tools.javac.code.TypeTag.FLOAT; -import static com.sun.tools.javac.code.TypeTag.INT; -import static com.sun.tools.javac.code.TypeTag.LONG; -import static com.sun.tools.javac.code.TypeTag.SHORT; -import static com.sun.tools.javac.code.TypeTag.VOID; import com.sun.tools.javac.jvm.PoolConstant.LoadableConstant; import com.sun.tools.javac.jvm.Target; import com.sun.tools.javac.tree.JCTree; @@ -1155,9 +1142,42 @@ public void visitMethodDef(JCMethodDecl tree) { currentMethodSym = tree.sym; variableIndex = 0; deconstructorCalls = null; -// if (tree.sym.isDeconstructor()) { -// tree.params = List.nil(); -// } + if (tree.sym.isDeconstructor()) { + List stats = tree.body.stats; + boolean genCarrier = false; + for (int i = 0; i < stats.size(); i++) { + var statement = stats.get(i); + if (statement instanceof JCExpressionStatement eStat && + eStat.expr instanceof JCAssign assignment && + assignment.lhs.hasTag(Tag.IDENT) && + ((JCIdent) assignment.lhs).sym.owner.isDeconstructor()) { + genCarrier = true; + } + } + + if (genCarrier) { + // MethodType returnType = MethodType.methodType(Object.class, Collection.class); + // Object carrier = Carriers.factory(returnType).invoke(is); + // return carrier; + Type lhsType = tree.params.get(0).type; + + MethodSymbol methodTypeCallSym = rs.resolveInternalMethod(tree.pos(), env, syms.methodTypeType, names.fromString("methodType"), List.of(syms.classType, types.makeArrayType(types.erasure(syms.classType))), List.nil()); + List params = List.of(classOfType(syms.objectType, tree.pos()), classOfType(types.erasure(lhsType), tree.pos())); + JCMethodInvocation methodTypeCall = make.App(make.QualIdent(methodTypeCallSym), params).setType(syms.methodTypeType); + methodTypeCall.varargsElement = types.erasure(types.elemtype(methodTypeCallSym.type.getParameterTypes().last())); + + MethodSymbol factoryMethodSym = rs.resolveInternalMethod(tree.pos(), env, syms.carriersType, names.fromString("factory"), List.of(syms.methodTypeType), List.nil()); + List factoryMethodParams = List.of(methodTypeCall); + JCMethodInvocation factoryMethodCall = make.App(make.QualIdent(factoryMethodSym), factoryMethodParams).setType(syms.methodHandleType); + + MethodSymbol invokeMethodSym = rs.resolveInternalMethod(tree.pos(), env, syms.methodHandleType, names.fromString("invoke"), List.of(types.makeArrayType(types.erasure(syms.objectsType))), List.nil()); + List invokeMethodParam = List.of(make.Ident(tree.params.get(0))); + JCMethodInvocation invokeMethodCall = make.App(make.Select(factoryMethodCall, invokeMethodSym), invokeMethodParam).setType(syms.objectType); + invokeMethodCall.varargsElement = types.erasure(types.elemtype(invokeMethodSym.type.getParameterTypes().last())); + + tree.body.stats = tree.body.stats.append(make.Return(invokeMethodCall)); + } + } super.visitMethodDef(tree); preparePatternMatchingCatchIfNeeded(tree.body); } finally { diff --git a/test/langtools/tools/javac/patterns/Points.java b/test/langtools/tools/javac/patterns/Points.java index 3888ec2c6265b..e69ed2c390e67 100644 --- a/test/langtools/tools/javac/patterns/Points.java +++ b/test/langtools/tools/javac/patterns/Points.java @@ -26,11 +26,8 @@ public static List test(Object o) { return List.of(-1); } - public __matcher Points(@Foo Collection is) throws Throwable { - // is = this.is; - - MethodType returnType = MethodType.methodType(Object.class, Collection.class); - return Carriers.factory(returnType).invoke(this.is); + public __matcher Points(@Foo Collection is) { + is = this.is; } @Target(ElementType.PARAMETER)