diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java index 3ca30d02d40..37d4778e8be 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.scopes.*; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -112,17 +113,24 @@ public class JetStandardClasses { STANDARD_CLASSES_NAMESPACE, Collections.emptyList(), "Tuple" + i); + WritableScopeImpl writableScope = new WritableScopeImpl(JetScope.EMPTY, classDescriptor, RedeclarationHandler.THROW_EXCEPTION); for (int j = 0; j < i; j++) { - parameters.add(TypeParameterDescriptor.createWithDefaultBound( + TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createWithDefaultBound( classDescriptor, Collections.emptyList(), - true, Variance.OUT_VARIANCE, "T" + j, j)); + true, Variance.OUT_VARIANCE, "T" + (j + 1), j); + parameters.add(typeParameterDescriptor); + PropertyDescriptor propertyDescriptor = new PropertyDescriptor(classDescriptor, Collections.emptyList(), Modality.FINAL, Visibility.PUBLIC, false, "_" + (j + 1)); + propertyDescriptor.setType(typeParameterDescriptor.getDefaultType(), Collections.emptyList(), classDescriptor.getImplicitReceiver(), ReceiverDescriptor.NO_RECEIVER); + propertyDescriptor.initialize(new PropertyGetterDescriptor(propertyDescriptor, Collections.emptyList(), Modality.FINAL, Visibility.PUBLIC, false, true), null); + writableScope.addPropertyDescriptor(propertyDescriptor); } + writableScope.changeLockLevel(WritableScope.LockLevel.READING); TUPLE[i] = classDescriptor.initialize( true, parameters, Collections.singleton(getAnyType()), - STUB, + writableScope, Collections.emptySet(), // TODO null); // TODO : constructor TUPLE_CONSTRUCTORS.add(TUPLE[i].getTypeConstructor()); @@ -303,7 +311,9 @@ public class JetStandardClasses { if (annotations.isEmpty() && arguments.isEmpty()) { return getUnitType(); } - return new JetTypeImpl(annotations, getTuple(arguments.size()).getTypeConstructor(), false, toProjections(arguments), STUB); + ClassDescriptor tuple = getTuple(arguments.size()); + List typeArguments = toProjections(arguments); + return new JetTypeImpl(annotations, tuple.getTypeConstructor(), false, typeArguments, tuple.getMemberScope(typeArguments)); } public static JetType getTupleType(List arguments) { diff --git a/compiler/testData/codegen/tuples/basic.jet b/compiler/testData/codegen/tuples/basic.jet new file mode 100644 index 00000000000..ab51e54bb89 --- /dev/null +++ b/compiler/testData/codegen/tuples/basic.jet @@ -0,0 +1,6 @@ +fun box() : String { + val a = #(1, "2") + if (a._1 != 1) return "Fail 1: ${a._1}" + if (a._2 != "2") return "Fail 1: ${a._2}" + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/tuples/BasicTuples.jet b/compiler/testData/diagnostics/tests/tuples/BasicTuples.jet new file mode 100644 index 00000000000..adb1e984318 --- /dev/null +++ b/compiler/testData/diagnostics/tests/tuples/BasicTuples.jet @@ -0,0 +1,4 @@ +fun foo(a : #(Int, String)) { + a._1 : Int + a._2 : String +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java new file mode 100644 index 00000000000..3b974d6ecc3 --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/codegen/TupleGenTest.java @@ -0,0 +1,8 @@ +package org.jetbrains.jet.codegen; + +public class TupleGenTest extends CodegenTestCase { + public void testBasic() { + blackBoxFile("/tuples/basic.jet"); +// System.out.println(generateToText()); + } +} diff --git a/stdlib/src/jet/Tuple1.java b/stdlib/src/jet/Tuple1.java index 197726fd3ca..5fafc2afa02 100644 --- a/stdlib/src/jet/Tuple1.java +++ b/stdlib/src/jet/Tuple1.java @@ -12,6 +12,9 @@ public class Tuple1 extends DefaultJetObject { public String toString() { return "(" + _1 + ")"; } + public final T1 get_1() { + return _1; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple10.java b/stdlib/src/jet/Tuple10.java index 5547a9a90c4..e071bd36065 100644 --- a/stdlib/src/jet/Tuple10.java +++ b/stdlib/src/jet/Tuple10.java @@ -1,6 +1,6 @@ package jet; -public class Tuple10 extends DefaultJetObject{ +public class Tuple10 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -30,6 +30,36 @@ public class Tuple10 extends DefaultJet public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } + public final T8 get_8() { + return _8; + } + public final T9 get_9() { + return _9; + } + public final T10 get_10() { + return _10; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple11.java b/stdlib/src/jet/Tuple11.java index 13f0b36f776..396dd0b378e 100644 --- a/stdlib/src/jet/Tuple11.java +++ b/stdlib/src/jet/Tuple11.java @@ -1,6 +1,6 @@ package jet; -public class Tuple11 extends DefaultJetObject{ +public class Tuple11 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -32,6 +32,39 @@ public class Tuple11 extends Defau public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } + public final T8 get_8() { + return _8; + } + public final T9 get_9() { + return _9; + } + public final T10 get_10() { + return _10; + } + public final T11 get_11() { + return _11; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple12.java b/stdlib/src/jet/Tuple12.java index 7d66a5ca466..b90009cc9d5 100644 --- a/stdlib/src/jet/Tuple12.java +++ b/stdlib/src/jet/Tuple12.java @@ -34,6 +34,42 @@ public class Tuple12 extends public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } + public final T8 get_8() { + return _8; + } + public final T9 get_9() { + return _9; + } + public final T10 get_10() { + return _10; + } + public final T11 get_11() { + return _11; + } + public final T12 get_12() { + return _12; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple13.java b/stdlib/src/jet/Tuple13.java index fb341787cfc..0754ca55406 100644 --- a/stdlib/src/jet/Tuple13.java +++ b/stdlib/src/jet/Tuple13.java @@ -1,6 +1,6 @@ package jet; -public class Tuple13 extends DefaultJetObject{ +public class Tuple13 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -36,6 +36,45 @@ public class Tuple13 ext public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } + public final T8 get_8() { + return _8; + } + public final T9 get_9() { + return _9; + } + public final T10 get_10() { + return _10; + } + public final T11 get_11() { + return _11; + } + public final T12 get_12() { + return _12; + } + public final T13 get_13() { + return _13; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple14.java b/stdlib/src/jet/Tuple14.java index e5c33981cc8..5b8d00d169a 100644 --- a/stdlib/src/jet/Tuple14.java +++ b/stdlib/src/jet/Tuple14.java @@ -1,6 +1,6 @@ package jet; -public class Tuple14 extends DefaultJetObject{ +public class Tuple14 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -38,6 +38,48 @@ public class Tuple14 extends DefaultJetObject{ +public class Tuple18 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -46,6 +46,60 @@ public class Tuple18 extends DefaultJetObject { public String toString() { return "(" + _1 + ", " + _2 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple20.java b/stdlib/src/jet/Tuple20.java index 842e62a2d5b..42e94f24582 100644 --- a/stdlib/src/jet/Tuple20.java +++ b/stdlib/src/jet/Tuple20.java @@ -1,6 +1,6 @@ package jet; -public class Tuple20 extends DefaultJetObject{ +public class Tuple20 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -50,6 +50,66 @@ public class Tuple20 extends DefaultJetObject { public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple4.java b/stdlib/src/jet/Tuple4.java index 7efeacbfd62..ae3a00d2468 100644 --- a/stdlib/src/jet/Tuple4.java +++ b/stdlib/src/jet/Tuple4.java @@ -18,6 +18,18 @@ public class Tuple4 extends DefaultJetObject { public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple5.java b/stdlib/src/jet/Tuple5.java index 4b18ad0c04e..651eb2e18d3 100644 --- a/stdlib/src/jet/Tuple5.java +++ b/stdlib/src/jet/Tuple5.java @@ -1,6 +1,6 @@ package jet; -public class Tuple5 extends DefaultJetObject{ +public class Tuple5 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -20,6 +20,21 @@ public class Tuple5 extends DefaultJetObject{ public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple6.java b/stdlib/src/jet/Tuple6.java index d36eaddec96..a5374722887 100644 --- a/stdlib/src/jet/Tuple6.java +++ b/stdlib/src/jet/Tuple6.java @@ -22,6 +22,24 @@ public class Tuple6 extends DefaultJetObject { public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple7.java b/stdlib/src/jet/Tuple7.java index e4b389c3033..129dadc8319 100644 --- a/stdlib/src/jet/Tuple7.java +++ b/stdlib/src/jet/Tuple7.java @@ -1,6 +1,6 @@ package jet; -public class Tuple7 extends DefaultJetObject{ +public class Tuple7 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -24,6 +24,27 @@ public class Tuple7 extends DefaultJetObject{ public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple8.java b/stdlib/src/jet/Tuple8.java index 6b225d64792..90bc50e9b9c 100644 --- a/stdlib/src/jet/Tuple8.java +++ b/stdlib/src/jet/Tuple8.java @@ -1,6 +1,6 @@ package jet; -public class Tuple8 extends DefaultJetObject{ +public class Tuple8 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -26,6 +26,30 @@ public class Tuple8 extends DefaultJetObject{ public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } + public final T8 get_8() { + return _8; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/stdlib/src/jet/Tuple9.java b/stdlib/src/jet/Tuple9.java index 47e6338b641..cfa713e0e08 100644 --- a/stdlib/src/jet/Tuple9.java +++ b/stdlib/src/jet/Tuple9.java @@ -1,6 +1,6 @@ package jet; -public class Tuple9 extends DefaultJetObject{ +public class Tuple9 extends DefaultJetObject { public final T1 _1; public final T2 _2; public final T3 _3; @@ -28,6 +28,33 @@ public class Tuple9 extends DefaultJetObject public String toString() { return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ")"; } + public final T1 get_1() { + return _1; + } + public final T2 get_2() { + return _2; + } + public final T3 get_3() { + return _3; + } + public final T4 get_4() { + return _4; + } + public final T5 get_5() { + return _5; + } + public final T6 get_6() { + return _6; + } + public final T7 get_7() { + return _7; + } + public final T8 get_8() { + return _8; + } + public final T9 get_9() { + return _9; + } @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/tupleGen.py b/tupleGen.py index 92519c80871..0e4c33188a3 100644 --- a/tupleGen.py +++ b/tupleGen.py @@ -3,13 +3,17 @@ def generateTupleClass(i): f.write("package jet;\n\n") f.write("public class Tuple" + str(i) + "<") f.write(", ".join(("T" + str(j)) for j in range(1, i+1))) - f.write("> {\n") + f.write("> extends DefaultJetObject {\n") for j in range(1, i+1): f.write(" public final T{0} _{0};\n".format(j)) f.write("\n public Tuple" + str(i) + "(") + if i > 0: + f.write("TypeInfo typeInfo, ") f.write(", ".join("T{0} t{0}".format(j) for j in range(1, i+1))) f.write(") {\n") + if i > 0: + f.write(" super(typeInfo);\n") for j in range(1, i+1): f.write(" _{0} = t{0};\n".format(j)) f.write(" }\n\n") @@ -18,6 +22,9 @@ def generateTupleClass(i): f.write(' return "(" + ' + ' + ", " + '.join("_{0}".format(j) for j in range(1, i+1)) + ' + ")";\n') f.write(" }\n") + for j in range(1, i+1): + f.write(" public final T{0} get_{0}() {{\n return _{0};\n }}\n".format(j)) + f.write(" @Override\n public boolean equals(Object o) {\n") f.write(" if (this == o) return true;\n") f.write(" if (o == null || getClass() != o.getClass()) return false;\n\n")