From 1361c70f681fac743f4ad978096d111768ba3494 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 26 Jun 2012 19:47:53 +0200 Subject: [PATCH] FunctionN and ExtensionFunctionN are now abstract classes, not traits + Indexing of their type parameters is fixed (should match actual positions in the parameter list) The reason to make them classes: * This is how they are actually implemented in the JVM back-end (for performance) This can be reconsidered later, but seems to be a reasonable solution --- .../TuplesAndFunctionsGenerator.java | 4 +- .../src/jet.src/ExtensionFunctions.jet | 92 +++++++++---------- compiler/frontend/src/jet.src/Functions.jet | 92 +++++++++---------- .../descriptors/FunctionDescriptorImpl.java | 5 +- .../lang/types/lang/JetStandardClasses.java | 31 +++++-- 5 files changed, 118 insertions(+), 106 deletions(-) diff --git a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java index c650b0092c5..cd3b55a913e 100644 --- a/compiler/frontend/generator/TuplesAndFunctionsGenerator.java +++ b/compiler/frontend/generator/TuplesAndFunctionsGenerator.java @@ -52,7 +52,7 @@ public class TuplesAndFunctionsGenerator { private static void generateFunctions(PrintStream out, int count, boolean extension) { generated(out); for (int i = 0; i < count; i++) { - out.print("public trait " + (extension ? "ExtensionFunction" : "Function") + i); + out.print("public abstract class " + (extension ? "ExtensionFunction" : "Function") + i); out.print("<"); if (extension) { out.print("in T"); @@ -65,7 +65,7 @@ public class TuplesAndFunctionsGenerator { out.print(", "); } out.print("out R> {\n"); - out.print(" public fun " + (extension ? "T." : "") + + out.print(" public abstract fun " + (extension ? "T." : "") + "invoke("); for (int j = 1; j <= i; j++) { out.print("p" + j + ": " + "P" + j); diff --git a/compiler/frontend/src/jet.src/ExtensionFunctions.jet b/compiler/frontend/src/jet.src/ExtensionFunctions.jet index a3d2954fb45..caadfe24762 100644 --- a/compiler/frontend/src/jet.src/ExtensionFunctions.jet +++ b/compiler/frontend/src/jet.src/ExtensionFunctions.jet @@ -3,72 +3,72 @@ package jet -public trait ExtensionFunction0 { - public fun T.invoke() : R +public abstract class ExtensionFunction0 { + public abstract fun T.invoke() : R } -public trait ExtensionFunction1 { - public fun T.invoke(p1: P1) : R +public abstract class ExtensionFunction1 { + public abstract fun T.invoke(p1: P1) : R } -public trait ExtensionFunction2 { - public fun T.invoke(p1: P1, p2: P2) : R +public abstract class ExtensionFunction2 { + public abstract fun T.invoke(p1: P1, p2: P2) : R } -public trait ExtensionFunction3 { - public fun T.invoke(p1: P1, p2: P2, p3: P3) : R +public abstract class ExtensionFunction3 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3) : R } -public trait ExtensionFunction4 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R +public abstract class ExtensionFunction4 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R } -public trait ExtensionFunction5 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R +public abstract class ExtensionFunction5 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R } -public trait ExtensionFunction6 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R +public abstract class ExtensionFunction6 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R } -public trait ExtensionFunction7 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R +public abstract class ExtensionFunction7 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R } -public trait ExtensionFunction8 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R +public abstract class ExtensionFunction8 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R } -public trait ExtensionFunction9 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R +public abstract class ExtensionFunction9 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R } -public trait ExtensionFunction10 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R +public abstract class ExtensionFunction10 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R } -public trait ExtensionFunction11 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R +public abstract class ExtensionFunction11 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R } -public trait ExtensionFunction12 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R +public abstract class ExtensionFunction12 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R } -public trait ExtensionFunction13 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R +public abstract class ExtensionFunction13 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R } -public trait ExtensionFunction14 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R +public abstract class ExtensionFunction14 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R } -public trait ExtensionFunction15 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R +public abstract class ExtensionFunction15 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R } -public trait ExtensionFunction16 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R +public abstract class ExtensionFunction16 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R } -public trait ExtensionFunction17 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R +public abstract class ExtensionFunction17 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R } -public trait ExtensionFunction18 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R +public abstract class ExtensionFunction18 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R } -public trait ExtensionFunction19 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R +public abstract class ExtensionFunction19 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R } -public trait ExtensionFunction20 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R +public abstract class ExtensionFunction20 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R } -public trait ExtensionFunction21 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R +public abstract class ExtensionFunction21 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R } -public trait ExtensionFunction22 { - public fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R +public abstract class ExtensionFunction22 { + public abstract fun T.invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R } diff --git a/compiler/frontend/src/jet.src/Functions.jet b/compiler/frontend/src/jet.src/Functions.jet index f0e0d901d03..b272697bceb 100644 --- a/compiler/frontend/src/jet.src/Functions.jet +++ b/compiler/frontend/src/jet.src/Functions.jet @@ -3,72 +3,72 @@ package jet -public trait Function0 { - public fun invoke() : R +public abstract class Function0 { + public abstract fun invoke() : R } -public trait Function1 { - public fun invoke(p1: P1) : R +public abstract class Function1 { + public abstract fun invoke(p1: P1) : R } -public trait Function2 { - public fun invoke(p1: P1, p2: P2) : R +public abstract class Function2 { + public abstract fun invoke(p1: P1, p2: P2) : R } -public trait Function3 { - public fun invoke(p1: P1, p2: P2, p3: P3) : R +public abstract class Function3 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3) : R } -public trait Function4 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R +public abstract class Function4 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4) : R } -public trait Function5 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R +public abstract class Function5 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5) : R } -public trait Function6 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R +public abstract class Function6 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6) : R } -public trait Function7 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R +public abstract class Function7 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7) : R } -public trait Function8 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R +public abstract class Function8 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8) : R } -public trait Function9 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R +public abstract class Function9 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9) : R } -public trait Function10 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R +public abstract class Function10 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10) : R } -public trait Function11 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R +public abstract class Function11 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11) : R } -public trait Function12 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R +public abstract class Function12 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12) : R } -public trait Function13 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R +public abstract class Function13 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13) : R } -public trait Function14 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R +public abstract class Function14 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14) : R } -public trait Function15 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R +public abstract class Function15 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15) : R } -public trait Function16 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R +public abstract class Function16 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16) : R } -public trait Function17 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R +public abstract class Function17 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17) : R } -public trait Function18 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R +public abstract class Function18 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18) : R } -public trait Function19 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R +public abstract class Function19 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19) : R } -public trait Function20 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R +public abstract class Function20 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20) : R } -public trait Function21 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R +public abstract class Function21 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21) : R } -public trait Function22 { - public fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R +public abstract class Function22 { + public abstract fun invoke(p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8, p9: P9, p10: P10, p11: P11, p12: P12, p13: P13, p14: P14, p15: P15, p16: P16, p17: P17, p18: P18, p19: P19, p20: P20, p21: P21, p22: P22) : R } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java index a342dce8bcb..9feb7d33985 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -91,8 +91,9 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo this.expectedThisObject = expectedThisObject; for (int i = 0; i < typeParameters.size(); ++i) { - if (typeParameters.get(i).getIndex() != i) { - throw new IllegalStateException(); + TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i); + if (typeParameterDescriptor.getIndex() != i) { + throw new IllegalStateException(typeParameterDescriptor + " index is " + typeParameterDescriptor.getIndex() + " but position is " + i); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java index 8d057b08481..d34a3bb326b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/JetStandardClasses.java @@ -208,37 +208,48 @@ public class JetStandardClasses { ClassDescriptorImpl function = new ClassDescriptorImpl( STANDARD_CLASSES_NAMESPACE, Collections.emptyList(), - Modality.OPEN, + Modality.ABSTRACT, Name.identifier("Function" + i)); SimpleFunctionDescriptorImpl invoke = new SimpleFunctionDescriptorImpl(function, Collections.emptyList(), Name.identifier("invoke"), CallableMemberDescriptor.Kind.DECLARATION); WritableScope scopeForInvoke = createScopeForInvokeFunction(function, invoke); - List typeParameters = createTypeParameters(i, function); + List typeParameters = createTypeParameters(0, i, function); + ConstructorDescriptorImpl constructorDescriptorForFunction = new ConstructorDescriptorImpl(function, Collections.emptyList(), true); FUNCTION[i] = function.initialize( false, typeParameters, - Collections.singleton(getAnyType()), scopeForInvoke, Collections.emptySet(), null); + Collections.singleton(getAnyType()), scopeForInvoke, Collections.singleton(constructorDescriptorForFunction), null); FUNCTION_TYPE_CONSTRUCTORS.add(FUNCTION[i].getTypeConstructor()); FunctionDescriptorUtil.initializeFromFunctionType(invoke, function.getDefaultType(), new ClassReceiver(FUNCTION[i]), Modality.ABSTRACT, Visibilities.PUBLIC); + constructorDescriptorForFunction.initialize(function.getTypeConstructor().getParameters(), + Collections.emptyList(), Visibilities.PUBLIC); + constructorDescriptorForFunction.setReturnType(function.getDefaultType()); + ClassDescriptorImpl receiverFunction = new ClassDescriptorImpl( STANDARD_CLASSES_NAMESPACE, Collections.emptyList(), - Modality.OPEN, + Modality.ABSTRACT, Name.identifier("ExtensionFunction" + i)); SimpleFunctionDescriptorImpl invokeWithReceiver = new SimpleFunctionDescriptorImpl(receiverFunction, Collections.emptyList(), Name.identifier("invoke"), CallableMemberDescriptor.Kind.DECLARATION); WritableScope scopeForInvokeWithReceiver = createScopeForInvokeFunction(receiverFunction, invokeWithReceiver); - List parameters = createTypeParameters(i, receiverFunction); + List parameters = createTypeParameters(1, i, receiverFunction); parameters.add(0, TypeParameterDescriptorImpl.createWithDefaultBound( receiverFunction, Collections.emptyList(), false, Variance.IN_VARIANCE, Name.identifier("T"), 0)); + + ConstructorDescriptorImpl constructorDescriptorForReceiverFunction = new ConstructorDescriptorImpl(function, Collections.emptyList(), true); RECEIVER_FUNCTION[i] = receiverFunction.initialize( false, parameters, - Collections.singleton(getAnyType()), scopeForInvokeWithReceiver, Collections.emptySet(), null); + Collections.singleton(getAnyType()), scopeForInvokeWithReceiver, Collections.singleton(constructorDescriptorForReceiverFunction), null); RECEIVER_FUNCTION_TYPE_CONSTRUCTORS.add(RECEIVER_FUNCTION[i].getTypeConstructor()); FunctionDescriptorUtil.initializeFromFunctionType(invokeWithReceiver, receiverFunction.getDefaultType(), new ClassReceiver(RECEIVER_FUNCTION[i]), Modality.ABSTRACT, Visibilities.PUBLIC); + + constructorDescriptorForReceiverFunction.initialize(receiverFunction.getTypeConstructor().getParameters(), + Collections.emptyList(), Visibilities.PUBLIC); + constructorDescriptorForReceiverFunction.setReturnType(receiverFunction.getDefaultType()); } } @@ -249,18 +260,18 @@ public class JetStandardClasses { return scopeForInvoke; } - private static List createTypeParameters(int parameterCount, ClassDescriptorImpl function) { + private static List createTypeParameters(int baseIndex, int parameterCount, ClassDescriptorImpl function) { List parameters = new ArrayList(); - for (int j = 1; j <= parameterCount; j++) { + for (int j = 0; j < parameterCount; j++) { parameters.add(TypeParameterDescriptorImpl.createWithDefaultBound( function, Collections.emptyList(), - false, Variance.IN_VARIANCE, Name.identifier("P" + j), j)); + false, Variance.IN_VARIANCE, Name.identifier("P" + (j + 1)), baseIndex + j)); } parameters.add(TypeParameterDescriptorImpl.createWithDefaultBound( function, Collections.emptyList(), - false, Variance.OUT_VARIANCE, Name.identifier("R"), parameterCount + 1)); + false, Variance.OUT_VARIANCE, Name.identifier("R"), baseIndex + parameterCount)); return parameters; }