From e7ddf901f059c7fbf1baff9c9c82c29039219e7a Mon Sep 17 00:00:00 2001 From: Peter Zeller Date: Sat, 4 Jan 2020 02:19:13 +0100 Subject: [PATCH] wip --- .../parserspec/jass_im.parseq | 11 +-- .../interpreter/EvaluateExpr.java | 22 ----- .../interpreter/ILInterpreter.java | 1 - .../interpreter/LocalState.java | 15 ---- .../optimizer/SideEffectAnalyzer.java | 5 -- .../translation/imtojass/ExprTranslation.java | 3 - .../translation/imtojass/ImAttrType.java | 4 - .../translation/imtojass/TypeEquality.java | 3 - .../imtojass/TypeRewriteMatcher.java | 2 +- .../imtranslation/AssertProperty.java | 5 -- .../imtranslation/ClassTranslator.java | 6 +- .../imtranslation/ClosureTranslator.java | 6 +- .../imtranslation/EliminateGenerics.java | 30 +------ .../imtranslation/ExprTranslation.java | 17 ++-- .../translation/imtranslation/Flatten.java | 4 - .../imtranslation/GenericTypes.java | 3 - .../translation/imtranslation/ImPrinter.java | 14 +-- .../imtranslation/ImTranslator.java | 85 +++++++++++++++---- .../imtranslation/InterfaceTranslator.java | 2 +- .../lua/translation/ExprTranslation.java | 5 -- .../lua/translation/LuaTranslator.java | 6 -- .../wurstscript/types/TypeClassInstance.java | 12 --- .../types/WurstTypeBoundTypeParam.java | 7 +- .../wurstscript/types/WurstTypeTypeParam.java | 2 +- 24 files changed, 91 insertions(+), 179 deletions(-) diff --git a/de.peeeq.wurstscript/parserspec/jass_im.parseq b/de.peeeq.wurstscript/parserspec/jass_im.parseq index 006a6cf62..48519554c 100644 --- a/de.peeeq.wurstscript/parserspec/jass_im.parseq +++ b/de.peeeq.wurstscript/parserspec/jass_im.parseq @@ -9,13 +9,11 @@ ImProg( ImFunctions functions, ImMethods methods, ImClasses classes, - ImTypeClassFuncs typeClassFunctions, java.util.Map> globalInits) ImVars * ImVar ImFunctions * ImFunction ImClasses * ImClass -ImTypeClassFuncs * ImTypeClassFunc ImVar(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ref ImType type, String name, boolean isBJ) @@ -46,11 +44,6 @@ ImFunction(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImStmts body, java.util.List flags) -ImTypeClassFunc(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, - String name, - ImTypeVars typeVariables, - ImVars parameters, - ref ImType returnType) ImClass(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, @@ -100,8 +93,6 @@ ImExpr = | ImGetStackTrace() | ImCompiletimeExpr(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ImExpr expr, int executionOrderIndex) | ImLExpr - | ImTypeVarDispatch(@ignoreForEquality de.peeeq.wurstscript.ast.Element trace, ref ImTypeClassFunc typeClassFunc, ImExprs arguments - , ref ImTypeVar typeVariable) | ImCast(ImExpr expr, ref ImType toType) // an expression which can be used on the left hand side of an assignment @@ -148,7 +139,7 @@ ImConst = ImTypeArguments * ImTypeArgument -ImTypeArgument(ref ImType type, java.util.Map> typeClassBinding) +ImTypeArgument(ref ImType type) // helper types: diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/EvaluateExpr.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/EvaluateExpr.java index 38ca0ed46..8c61cd50f 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/EvaluateExpr.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/EvaluateExpr.java @@ -398,28 +398,6 @@ public ILconst get() { } - public static ILconst eval(ImTypeVarDispatch e, ProgramState globalState, LocalState localState) { - Either impl = localState.getImplementation(e.getTypeVariable(), e.getTypeClassFunc()); - if (impl == null) { - throw new InterpreterException(globalState, "Could not find implementation for " + e.getTypeVariable() + "." + e.getTypeClassFunc().getName()); - } - ILconst[] eArgs = e.getArguments().stream() - .map(arg -> arg.evaluate(globalState, localState)) - .toArray(ILconst[]::new); - - return impl.fold( - (ImMethod m) -> { - ILconst receiver1 = eArgs[0]; - ILconstObject receiver = globalState.toObject(receiver1); - globalState.assertAllocated(receiver, e.attrTrace()); - ImMethod mostPreciseMethod = findMostPreciseMethod(e.attrTrace(), globalState, receiver, m); - return evaluateFunc(globalState, mostPreciseMethod.getImplementation(), e, Collections.emptyList(), eArgs); - }, - (ImFunction f) -> - evaluateFunc(globalState, f, e, Collections.emptyList(), eArgs) // TODO type var dispatch should also have type arguments? - ); - } - public static ILconst eval(ImCast imCast, ProgramState globalState, LocalState localState) { ILconst res = imCast.getExpr().evaluate(globalState, localState); if (TypesHelper.isIntType(imCast.getToType())) { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/ILInterpreter.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/ILInterpreter.java index 9dbd285ad..64f841238 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/ILInterpreter.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/ILInterpreter.java @@ -79,7 +79,6 @@ public static LocalState runFunc(ProgramState globalState, ImFunction f, @Nullab } LocalState localState = new LocalState(); - localState.setTypeArguments(f.getTypeVariables(), typeArguments); int i = 0; for (ImVar p : f.getParameters()) { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/LocalState.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/LocalState.java index e762fe6b8..64c08c608 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/LocalState.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/interpreter/LocalState.java @@ -14,7 +14,6 @@ public class LocalState extends State { private @Nullable ILconst returnVal = null; - private Table> typeClassImplementations = HashBasedTable.create(); public LocalState(ILconst returnVal) { this.setReturnVal(returnVal); @@ -32,18 +31,4 @@ public LocalState setReturnVal(@Nullable ILconst returnVal) { return this; } - - public Either getImplementation(ImTypeVar typeVariable, ImTypeClassFunc typeClassFunc) { - return typeClassImplementations.get(typeVariable, typeClassFunc); - } - - public void setTypeArguments(ImTypeVars typeVariables, List typeArguments) { - for (int i = 0; i < typeVariables.size() && i < typeArguments.size(); i++) { - ImTypeVar typeVariable = typeVariables.get(i); - ImTypeArgument typeArgument = typeArguments.get(i); - for (Map.Entry> e : typeArgument.getTypeClassBinding().entrySet()) { - typeClassImplementations.put(typeVariable, e.getKey(), e.getValue()); - } - } - } } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/optimizer/SideEffectAnalyzer.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/optimizer/SideEffectAnalyzer.java index b8c341a10..58abbb566 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/optimizer/SideEffectAnalyzer.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/optimizer/SideEffectAnalyzer.java @@ -96,11 +96,6 @@ public Boolean case_ImGetStackTrace(ImGetStackTrace imGetStackTrace) { return true; } - @Override - public Boolean case_ImTypeVarDispatch(ImTypeVarDispatch imTypeVarDispatch) { - return true; - } - @Override public Boolean case_ImOperatorCall(ImOperatorCall e) { return e.getArguments().stream().anyMatch(SideEffectAnalyzer::quickcheckHasSideeffects); diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ExprTranslation.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ExprTranslation.java index 6545d6694..5cdf12555 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ExprTranslation.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ExprTranslation.java @@ -140,9 +140,6 @@ public static JassExpr translate(ImCompiletimeExpr e, ImToJassTranslator transla "Enable '-runcompiletimefunctions' to evaluate compiletime expressions."); } - public static JassExpr translate(ImTypeVarDispatch e, ImToJassTranslator translator) { - throw new CompileError(e, "Typevar dispatch not eliminated."); - } public static JassExpr translate(ImCast imCast, ImToJassTranslator translator) { return imCast.getExpr().translate(translator); diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ImAttrType.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ImAttrType.java index 26695972d..66c542a34 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ImAttrType.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ImAttrType.java @@ -212,10 +212,6 @@ public static ImType getType(ImCompiletimeExpr e) { return e.getExpr().attrTyp(); } - public static ImType getType(ImTypeVarDispatch e) { - return e.getTypeClassFunc().getReturnType(); - } - public static ImType getType(ImCast imCast) { return imCast.getToType(); } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeEquality.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeEquality.java index d5acdfa81..ab5f74280 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeEquality.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeEquality.java @@ -75,9 +75,6 @@ public static boolean isEqualType(ImClassType c, ImType other) { if (!x.getType().equalsType(y.getType())) { return false; } - if (!x.getTypeClassBinding().equals(y.getTypeClassBinding())) { - return false; - } } return true; } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeRewriteMatcher.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeRewriteMatcher.java index 0f9b9b455..ad7481653 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeRewriteMatcher.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/TypeRewriteMatcher.java @@ -53,7 +53,7 @@ public ImType case_ImArrayType(ImArrayType t) { public ImType case_ImClassType(ImClassType t) { ImTypeArguments args = t.getTypeArguments() .stream() - .map(ta -> JassIm.ImTypeArgument(ta.getType().match(this), ta.getTypeClassBinding())) + .map(ta -> JassIm.ImTypeArgument(ta.getType().match(this))) .collect(Collectors.toCollection(JassIm::ImTypeArguments)); return JassIm.ImClassType(t.getClassDef(), args); } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/AssertProperty.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/AssertProperty.java index dc5e6669d..a5b5caf79 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/AssertProperty.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/AssertProperty.java @@ -43,16 +43,11 @@ public void check(Element e) { ImFunction f = (ImFunction) e; currentFunction = f; checkType(e, (f).getReturnType()); - } else if (e instanceof ImTypeClassFunc) { - checkType(e, ((ImTypeClassFunc) e).getReturnType()); } else if (e instanceof ImMethod) { checkType(e, ((ImMethod) e).getMethodClass()); checkRooted(e, ((ImMethod) e).getImplementation()); } else if (e instanceof ImVarargLoop) { checkRooted(e, ((ImVarargLoop) e).getLoopVar()); - } else if (e instanceof ImTypeVarDispatch) { - checkRooted(e, ((ImTypeVarDispatch) e).getTypeClassFunc()); - checkRooted(e, ((ImTypeVarDispatch) e).getTypeVariable()); } else if (e instanceof ImVarAccess) { checkRooted(e, ((ImVarAccess) e).getVar()); } else if (e instanceof ImVarArrayAccess) { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClassTranslator.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClassTranslator.java index d96a3afef..bb2f46d36 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClassTranslator.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClassTranslator.java @@ -124,7 +124,7 @@ private void createDestroyMethod(List subClasses) { private ImClassType imClassType() { ImTypeArguments typeArgs = imClass.getTypeVariables().stream() - .map(tv -> JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv), Collections.emptyMap())) + .map(tv -> JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv))) .collect(Collectors.toCollection(JassIm::ImTypeArguments)); return JassIm.ImClassType(imClass, typeArgs); } @@ -372,7 +372,7 @@ private void createNewFunc(ConstructorDef constr) { } ImTypeArguments typeArgs = ImTypeArguments(); for (ImTypeVar tv : imClass.getTypeVariables()) { - typeArgs.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv), Collections.emptyMap())); + typeArgs.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv))); } f.getBody().add(ImFunctionCall(trace, constrFunc, typeArgs, arguments, false, CallType.NORMAL)); @@ -412,7 +412,7 @@ private void createConstructFunc(ConstructorDef constr) { // call classInitFunc: ImTypeArguments typeArguments = JassIm.ImTypeArguments(); for (ImTypeVar tv : imClass.getTypeVariables()) { - typeArguments.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv), Collections.emptyMap())); + typeArguments.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv))); } f.getBody().add(ImFunctionCall(trace, classInitFunc, typeArguments, JassIm.ImExprs(JassIm.ImVarAccess(thisVar)), false, CallType.NORMAL)); // constructor user code diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClosureTranslator.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClosureTranslator.java index b13becbdb..d55efaa8d 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClosureTranslator.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ClosureTranslator.java @@ -64,7 +64,7 @@ public ImExpr translate() { private ImTypeArguments getClassTypeArguments() { ImTypeArguments res = JassIm.ImTypeArguments(); for (ImTypeVar typeVar : typeVars.keySet()) { - res.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(typeVar), Collections.emptyMap())); + res.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(typeVar))); } return res; } @@ -229,9 +229,7 @@ public ImType case_ImTypeVarRef(ImTypeVarRef t) { result.put(oldTypevar, newTypevar); c.getTypeVariables().add(newTypevar); thisType.getTypeArguments().add( - JassIm.ImTypeArgument( - JassIm.ImTypeVarRef(newTypevar), - Collections.emptyMap())); + JassIm.ImTypeArgument(JassIm.ImTypeVarRef(newTypevar))); } return JassIm.ImTypeVarRef(newTypevar); } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java index c034378ca..581d0d9a9 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/EliminateGenerics.java @@ -145,7 +145,7 @@ private void moveFunctionsOutOfClass(ImClass c) { f.getTypeVariables().addAll(0, newTypeVars); List typeArgs = newTypeVars .stream() - .map(ta -> JassIm.ImTypeArgument(JassIm.ImTypeVarRef(ta), Collections.emptyMap())) + .map(ta -> JassIm.ImTypeArgument(JassIm.ImTypeVarRef(ta))) .collect(Collectors.toList()); rewriteGenerics(f, new GenericTypes(typeArgs), c.getTypeVariables(), newTypeVars); } @@ -322,32 +322,6 @@ public void visit(ImDealloc e) { super.visit(e); } - @Override - public void visit(ImTypeVarDispatch e) { - super.visit(e); - ImTypeVar tv = e.getTypeVariable(); - int index = newTypeVars.indexOf(tv); - if (index < 0) { - throw new CompileError(e.attrTrace(), "Could not find type variable " + tv + " in " + newTypeVars); - } - ImTypeArgument ta = generics.getTypeArguments().get(index); - Either impl = ta.getTypeClassBinding().get(e.getTypeClassFunc()); - if (impl == null) { - throw new CompileError(e.attrTrace(), "Could not find func " + e.getTypeClassFunc().getName() + " in " + ta.getTypeClassBinding().keySet()); - } - ImExpr newExpr; - if (impl.isLeft()) { - ImMethod m = impl.getLeft(); - ImExpr receiver = e.getArguments().remove(0); - e.getArguments().setParent(null); - newExpr = JassIm.ImMethodCall(e.getTrace(), m, JassIm.ImTypeArguments(), receiver, e.getArguments(), false); - } else { - ImFunction f = impl.get(); - e.getArguments().setParent(null); - newExpr = JassIm.ImFunctionCall(e.getTrace(), f, JassIm.ImTypeArguments(), e.getArguments(), false, CallType.NORMAL); - } - e.replaceBy(newExpr); - } }); } @@ -697,7 +671,7 @@ public ImType case_ImClassType(ImClassType t) { private List specializeTypeArgs(ImTypeArguments typeArgs) { return typeArgs .stream() - .map(ta -> JassIm.ImTypeArgument(specializeType(ta.getType()), ta.getTypeClassBinding())) + .map(ta -> JassIm.ImTypeArgument(specializeType(ta.getType()))) .collect(Collectors.toList()); } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ExprTranslation.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ExprTranslation.java index edc80b021..2f380e803 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ExprTranslation.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ExprTranslation.java @@ -451,13 +451,11 @@ private static ImExpr translateFunctionCall(FunctionCall e, ImTranslator t, ImFu dynamicDispatch = true; } // add implicit parameter to front - // TODO why would I add the implicit parameter here, if it is - // not a dynamic dispatch? + // note: might not be dynamic, in case of extension function) leftExpr = (Expr) e.attrImplicitParameter(); if (leftExpr.attrTyp() instanceof WurstTypeTypeParam) { - WurstTypeTypeParam tp = (WurstTypeTypeParam) leftExpr.attrTyp(); - typeParamDispatchOn = tp; + typeParamDispatchOn = (WurstTypeTypeParam) leftExpr.attrTyp(); } } @@ -517,11 +515,12 @@ private static ImExpr translateFunctionCall(FunctionCall e, ImTranslator t, ImFu ImExpr call; if (typeParamDispatchOn != null) { - ImTypeClassFunc typeClassFunc = t.getTypeClassFuncFor((FuncDef) calledFunc); - if (receiver != null) { - imArgs.add(0, receiver); - } - call = JassIm.ImTypeVarDispatch(e, typeClassFunc, imArgs, t.getTypeVar(typeParamDispatchOn.getDef())); + + FuncDef calledFuncDef = (FuncDef) calledFunc; + ImMethod typeClassMethod = t.getTypeClassMethodFor(calledFuncDef); + ImTypeArguments typeArguments = getFunctionCallTypeArguments(t, e.attrFunctionSignature(), e, typeClassMethod.getImplementation().getTypeVariables()); + ImVar typeClassDict = t.getTypeClassDict(typeParamDispatchOn, calledFuncDef); + call = JassIm.ImMethodCall(e, typeClassMethod, typeArguments, JassIm.ImVarAccess(typeClassDict), imArgs, false); } else if (dynamicDispatch) { ImMethod method = t.getMethodFor((FuncDef) calledFunc); ImTypeArguments typeArguments = getFunctionCallTypeArguments(t, e.attrFunctionSignature(), e, method.getImplementation().getTypeVariables()); diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/Flatten.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/Flatten.java index 30aab80aa..39bf0431b 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/Flatten.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/Flatten.java @@ -58,10 +58,6 @@ public class Flatten { - public static Result flatten(ImTypeVarDispatch e, ImTranslator t, ImFunction f) { - MultiResult r = flattenExprs(t, f, e.getArguments()); - return new Result(r.stmts, ImTypeVarDispatch(e.getTrace(), e.getTypeClassFunc(), ImExprs(r.exprs), e.getTypeVariable())); - } public static Result flatten(ImCast imCast, ImTranslator translator, ImFunction f) { Result res = imCast.getExpr().flatten(translator, f); diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/GenericTypes.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/GenericTypes.java index e4c91482a..a5bf928c3 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/GenericTypes.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/GenericTypes.java @@ -38,9 +38,6 @@ public boolean equals(Object o) { if (!t1.getType().equalsType(t2.getType())) { return false; } - if (!t1.getTypeClassBinding().equals(t2.getTypeClassBinding())) { - return false; - } } return true; } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImPrinter.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImPrinter.java index ac4fc33f4..c39301a59 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImPrinter.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImPrinter.java @@ -501,15 +501,6 @@ public static void print(ImVarargLoop e, Appendable sb, int indent) { } - public static void print(ImTypeVarDispatch e, Appendable sb, int indent) { - append(sb, "<"); - append(sb, e.getTypeVariable().getName()); - append(sb, smallHash(e.getTypeVariable())); - append(sb, ">."); - append(sb, e.getTypeClassFunc().getName()); - printArgumentList(sb, indent, e.getArguments()); - } - public static void print(ImTypeVarRef e, Appendable sb, int indent) { append(sb, e.getTypeVariable().getName()); append(sb, smallHash(e.getTypeVariable())); @@ -552,9 +543,6 @@ public static String asString(List s) { .collect(Collectors.joining(", ")) + "]"; } - public static String asString(ImTypeClassFunc s) { - return s.getName() + smallHash(s); - } public static String asString(ImClass s) { return s.getName() + smallHash(s); @@ -565,7 +553,7 @@ public static String asString(ImMethod s) { } public static String asString(ImTypeArgument s) { - return s.getType() + "" + s.getTypeClassBinding(); + return s.getType().toString(); } public static void print(ImCast e, Appendable sb, int indent) { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImTranslator.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImTranslator.java index bbc1b5df7..5db735d65 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImTranslator.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImTranslator.java @@ -42,6 +42,7 @@ import de.peeeq.wurstscript.utils.Pair; import de.peeeq.wurstscript.utils.Utils; import de.peeeq.wurstscript.validation.WurstValidator; +import io.vavr.Tuple2; import org.eclipse.jdt.annotation.Nullable; import org.jetbrains.annotations.NotNull; @@ -53,6 +54,7 @@ import static de.peeeq.wurstscript.jassIm.JassIm.*; import static de.peeeq.wurstscript.translation.imtranslation.FunctionFlagEnum.*; import static de.peeeq.wurstscript.utils.Utils.elementNameWithPath; +import static de.peeeq.wurstscript.utils.Utils.emptyList; public class ImTranslator { @@ -107,7 +109,7 @@ public ImTranslator(WurstModel wurstProg, boolean isUnitTestMode, RunArgs runArg this.wurstProg = wurstProg; this.lasttranslatedThing = wurstProg; this.isUnitTestMode = isUnitTestMode; - imProg = ImProg(wurstProg, ImVars(), ImFunctions(), ImMethods(), JassIm.ImClasses(), JassIm.ImTypeClassFuncs(), new LinkedHashMap<>()); + imProg = ImProg(wurstProg, ImVars(), ImFunctions(), ImMethods(), JassIm.ImClasses(), new LinkedHashMap<>()); this.runArgs = runArgs; } @@ -611,7 +613,7 @@ public ImClassType selfType(StructureDef classDef) { public ImClassType selfType(ImClass imClass) { ImTypeArguments typeArgs = JassIm.ImTypeArguments(); for (ImTypeVar tv : imClass.getTypeVariables()) { - typeArgs.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv), Collections.emptyMap())); + typeArgs.add(JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv))); } return JassIm.ImClassType(imClass, typeArgs); } @@ -1280,6 +1282,72 @@ public boolean isLuaTarget() { return runArgs.isLua(); } + private GetAForB typeClassMethodForFuncDef = new GetAForB() { + @Override + public ImMethod initFor(FuncDef f) { + ImFunction impl = JassIm.ImFunction(f, f.getName(), + ImTypeVars(), JassIm.ImVars(), JassIm.ImVoid(), JassIm.ImVars(), JassIm.ImStmts(), Collections.emptyList()); + InterfaceDef interfaceDef = (InterfaceDef) f.attrNearestStructureDef(); + ImClassType typeClass = ImClassType(typeClassDictClass.getFor(interfaceDef), ImTypeArguments()); + return JassIm.ImMethod( + f, + typeClass, + f.getName(), + impl, + new ArrayList<>(), + true + ); + } + }; + + public ImMethod getTypeClassMethodFor(FuncDef f) { + return typeClassMethodForFuncDef.getFor(f); + } + + private GetAForB typeClassDictClass = new GetAForB() { + @Override + public ImClass initFor(InterfaceDef a) { + return JassIm.ImClass( + a, + "TypeClassDict_" + a.getName(), + ImTypeVars(), + ImVars(), + ImMethods(), + ImFunctions(), + emptyList() + ); + } + }; + + private GetAForB> varsForTypeParam = new GetAForB>() { + @Override + public List initFor(TypeParamDef a) { + WurstTypeTypeParam tp = new WurstTypeTypeParam(a); + return tp.getTypeConstraints() + .map(constraint -> { + ImClass c = typeClassDictClass.getFor(constraint.getDef()); + ImType constraintT = constraint.imTranslateType(ImTranslator.this); + String name = "type_class_dict_" + a.getName() + "_" + constraint.getName(); + return JassIm.ImVar(a, constraintT, name, false); + }) + .collect(Collectors.toList()); + } + }; + + public ImVar getTypeClassDict(WurstTypeTypeParam tp, FuncDef f) { + List vars = varsForTypeParam.getFor(tp.getDef()); + // find the var that has the function + ImMethod m = getTypeClassMethodFor(f); + for (ImVar v : vars) { + ImClassType ct = (ImClassType) v.getType(); + if (ct.getClassDef().getMethods().contains(m)) { + return v; + } + } + + throw new RuntimeException("Did not find function" + f.getName() + " in type parameter " + tp); + } + interface VarsForTupleResult { @@ -1596,19 +1664,6 @@ public ImMethod getMethodFor(FuncDef f) { return m; } - private Map typeClassFuncForFuncDef = Maps.newLinkedHashMap(); - - public ImTypeClassFunc getTypeClassFuncFor(FuncDef f) { - ImTypeClassFunc m = typeClassFuncForFuncDef.get(f); - if (m == null) { - ImTypeVars typeVars = ImTypeVars(); - ImVars params = ImVars(); - ImType returnType = JassIm.ImVoid(); - m = JassIm.ImTypeClassFunc(f, f.getName(), typeVars, params, returnType); - typeClassFuncForFuncDef.put(f, m); - } - return m; - } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/InterfaceTranslator.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/InterfaceTranslator.java index e9dfef0f6..bdd34a330 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/InterfaceTranslator.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/InterfaceTranslator.java @@ -67,7 +67,7 @@ public void addDestroyMethod() { private ImClassType imClassType() { ImTypeArguments typeArgs = imClass.getTypeVariables().stream() - .map(tv -> JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv), Collections.emptyMap())) + .map(tv -> JassIm.ImTypeArgument(JassIm.ImTypeVarRef(tv))) .collect(Collectors.toCollection(JassIm::ImTypeArguments)); return JassIm.ImClassType(imClass, typeArgs); } diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/ExprTranslation.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/ExprTranslation.java index 7ba3a3132..07c64f668 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/ExprTranslation.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/ExprTranslation.java @@ -330,11 +330,6 @@ public static LuaExpr translate(ImCompiletimeExpr imCompiletimeExpr, LuaTranslat throw new Error("not implemented"); } - public static LuaExpr translate(ImTypeVarDispatch e, LuaTranslator tr) { - LuaVariable dict = tr.luaTypeClassDictionaryVar.getFor(e.getTypeVariable()); - LuaExprFieldAccess f = LuaAst.LuaExprFieldAccess(LuaAst.LuaExprVarAccess(dict), tr.typeClassFuncName.getFor(e.getTypeClassFunc())); - return LuaAst.LuaExprFunctionCallE(f, tr.translateExprList(e.getArguments())); - } public static LuaExpr translate(ImCast imCast, LuaTranslator tr) { LuaExpr translated = imCast.getExpr().translateToLua(tr); diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/LuaTranslator.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/LuaTranslator.java index c153e7830..e1b877795 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/LuaTranslator.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/lua/translation/LuaTranslator.java @@ -78,12 +78,6 @@ public LuaVariable initFor(ImTypeVar a) { } }; - GetAForB typeClassFuncName = new GetAForB() { - @Override - public String initFor(ImTypeClassFunc a) { - return uniqueName(a.getName()); - } - }; diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/TypeClassInstance.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/TypeClassInstance.java index a92a6d177..f9681782b 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/TypeClassInstance.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/TypeClassInstance.java @@ -3,7 +3,6 @@ import de.peeeq.wurstscript.ast.FuncDef; import de.peeeq.wurstscript.jassIm.ImFunction; import de.peeeq.wurstscript.jassIm.ImMethod; -import de.peeeq.wurstscript.jassIm.ImTypeClassFunc; import de.peeeq.wurstscript.translation.imtranslation.ImTranslator; import io.vavr.control.Either; @@ -16,7 +15,6 @@ public static TypeClassInstance asSubtype(WurstTypeInterface interfaceType) { return new SubtypeTypeClassInstance(interfaceType); } - public abstract void addTypeClassBinding(ImTranslator tr, Map> typeClassBinding); static class SubtypeTypeClassInstance extends TypeClassInstance { private WurstTypeInterface interfaceType; @@ -25,16 +23,6 @@ public SubtypeTypeClassInstance(WurstTypeInterface interfaceType) { this.interfaceType = interfaceType; } - @Override - public void addTypeClassBinding(ImTranslator tr, Map> typeClassBinding) { - interfaceType.getMemberMethods(interfaceType.getDef()).forEach(fl -> { - if (fl.getDef() instanceof FuncDef) { - FuncDef def = (FuncDef) fl.getDef(); - ImTypeClassFunc tcf = tr.getTypeClassFuncFor(def); - typeClassBinding.put(tcf, Either.left(tr.getMethodFor(def))); - } - }); - } @Override public String toString() { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeBoundTypeParam.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeBoundTypeParam.java index 5233fcd3a..1905b2ca8 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeBoundTypeParam.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeBoundTypeParam.java @@ -210,12 +210,7 @@ public boolean isTemplateTypeParameter() { } public ImTypeArgument imTranslateToTypeArgument(ImTranslator tr) { - ImType t = imTranslateType(tr); - Map> typeClassBinding = new HashMap<>(); - for (TypeClassInstance instance : instances) { - instance.addTypeClassBinding(tr, typeClassBinding); - } - return JassIm.ImTypeArgument(t, typeClassBinding); + return JassIm.ImTypeArgument(imTranslateType(tr)); } public WurstTypeBoundTypeParam withTypeClassInstance(TypeClassInstance instance) { diff --git a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeTypeParam.java b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeTypeParam.java index 428ebae7f..57952ea59 100644 --- a/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeTypeParam.java +++ b/de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/types/WurstTypeTypeParam.java @@ -117,7 +117,7 @@ public Stream getMemberMethods(Element node) { .map(fl -> fl.withReceiverType(this)); } - private Stream getTypeConstraints() { + public Stream getTypeConstraints() { if (def.getTypeParamConstraints() instanceof TypeExprList) { TypeExprList constraints = (TypeExprList) def.getTypeParamConstraints(); return constraints.stream()