提交 1b257707 编写于 作者: A Andrey Breslav

Merge remote branch 'origin/master'

......@@ -6,6 +6,7 @@
<module fileurl="file://$PROJECT_DIR$/examples/examples.iml" filepath="$PROJECT_DIR$/examples/examples.iml" />
<module fileurl="file://$PROJECT_DIR$/grammar/grammar.iml" filepath="$PROJECT_DIR$/grammar/grammar.iml" />
<module fileurl="file://$PROJECT_DIR$/idea/idea.iml" filepath="$PROJECT_DIR$/idea/idea.iml" />
<module fileurl="file://$PROJECT_DIR$/stdlib/stdlib.iml" filepath="$PROJECT_DIR$/stdlib/stdlib.iml" />
</modules>
</component>
</project>
......
......@@ -10,6 +10,7 @@
<orderEntry type="jdk" jdkName="IDEA 10.x" jdkType="IDEA JDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="asm" level="project" />
<orderEntry type="module" module-name="stdlib" />
</component>
</module>
......@@ -5,10 +5,7 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.ClassDescriptor;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.PropertyDescriptor;
import org.jetbrains.jet.lang.types.*;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
......@@ -27,11 +24,15 @@ public class ClassCodegen {
private final Project project;
private final BindingContext bindingContext;
private final Codegens factory;
private final JetTypeMapper typeMapper;
public ClassCodegen(Project project, Codegens factory, BindingContext bindingContext) {
this.project = project;
this.factory = factory;
this.bindingContext = bindingContext;
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
typeMapper = new JetTypeMapper(standardLibrary, bindingContext);
}
public void generate(JetClass aClass) {
......@@ -68,7 +69,7 @@ public class ClassCodegen {
ClassVisitor v = kind == OwnerKind.IMPLEMENTATION ? factory.forClassImplementation(descriptor) : factory.forClassDelegatingImplementation(descriptor);
v.visit(Opcodes.V1_6,
Opcodes.ACC_PUBLIC,
JetTypeMapper.jvmNameForImplementation(descriptor),
JetTypeMapper.jvmName(descriptor, kind),
null,
superClass,
new String[] {JetTypeMapper.jvmNameForInterface(descriptor)}
......@@ -158,31 +159,133 @@ public class ClassCodegen {
}
private void generatePrimaryConstructor(JetClass aClass, ClassVisitor v, OwnerKind kind) {
ConstructorDescriptor constructorDescriptor = bindingContext.getConstructorDescriptor(aClass);
if (constructorDescriptor == null) return;
ClassDescriptor classDescriptor = bindingContext.getClassDescriptor(aClass);
Method method = typeMapper.mapConstructorSignature(constructorDescriptor, kind);
int flags = Opcodes.ACC_PUBLIC; // TODO
Method method = new Method("<init>", Type.VOID_TYPE, new Type[0]);
final MethodVisitor mv = v.visitMethod(flags, "<init>", method.getDescriptor(), null, null);
mv.visitCode();
Type[] argTypes = method.getArgumentTypes();
List<ValueParameterDescriptor> paramDescrs = constructorDescriptor.getUnsubstitutedValueParameters();
FrameMap frameMap = new FrameMap();
frameMap.enterTemp(); // this
final InstructionAdapter iv = new InstructionAdapter(mv);
String superClass = getSuperClass(aClass, kind);
iv.load(0, Type.getType("L" + superClass + ";"));
iv.invokespecial(superClass, "<init>", method.getDescriptor());
ExpressionCodegen codegen = new ExpressionCodegen(mv, bindingContext, frameMap, typeMapper, Type.VOID_TYPE, classDescriptor, kind);
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
final JetTypeMapper typeMapper = new JetTypeMapper(standardLibrary, bindingContext);
ExpressionCodegen codegen = new ExpressionCodegen(mv, bindingContext, frameMap,
typeMapper, Type.VOID_TYPE);
generateInitializers(aClass, kind, codegen, iv, typeMapper);
String classname = JetTypeMapper.jvmName(classDescriptor, kind);
final Type classType = Type.getType("L" + classname + ";");
if (kind == OwnerKind.DELEGATING_IMPLEMENTATION) {
String interfaceDesc = JetTypeMapper.jetInterfaceType(classDescriptor).getDescriptor();
v.visitField(Opcodes.ACC_PRIVATE, "$this", interfaceDesc, /*TODO*/null, null);
iv.load(1, argTypes[0]);
iv.putfield(classname, "$this", interfaceDesc);
frameMap.enterTemp();
}
for (int i = 0; i < paramDescrs.size(); i++) {
ValueParameterDescriptor parameter = paramDescrs.get(i);
frameMap.enter(parameter, argTypes[i].getSize());
}
List<JetDelegationSpecifier> specifiers = aClass.getDelegationSpecifiers();
if (specifiers.isEmpty() || !(specifiers.get(0) instanceof JetDelegatorToSuperCall)) {
String superClass = getSuperClass(aClass, kind);
iv.load(0, Type.getType("L" + superClass + ";"));
iv.invokespecial(superClass, "<init>", /* TODO super constructor descriptor */"()V");
}
int n = 0;
for (JetDelegationSpecifier specifier : specifiers) {
boolean delegateOnStack = specifier instanceof JetDelegatorToSuperCall && n > 0 ||
specifier instanceof JetDelegatorByExpressionSpecifier ;
if (delegateOnStack) {
iv.load(0, classType);
}
if (specifier instanceof JetDelegatorToSuperCall) {
JetDelegatorToSuperCall superCall = (JetDelegatorToSuperCall) specifier;
ConstructorDescriptor constructorDescriptor1 = bindingContext.resolveSuperConstructor(superCall, this);
ClassDescriptor classDecl = constructorDescriptor1.getContainingDeclaration();
boolean isDelegating = kind == OwnerKind.DELEGATING_IMPLEMENTATION;
Type type = isDelegating ? JetTypeMapper.jetDelegatingImplementationType(classDecl) : JetTypeMapper.jetImplementationType(classDecl);
if (n > 0) {
if (kind == OwnerKind.DELEGATING_IMPLEMENTATION) {
codegen.thisToStack();
}
}
if (n == 0) {
iv.load(0, type);
}
else {
iv.anew(type);
iv.dup();
}
Method method1 = typeMapper.mapConstructorSignature(constructorDescriptor1, kind);
final Type[] argTypes1 = method1.getArgumentTypes();
List<JetArgument> args = superCall.getValueArguments();
for (int i = 0, argsSize = args.size(); i < argsSize; i++) {
JetArgument arg = args.get(i);
codegen.gen(arg.getArgumentExpression(), argTypes1[i]);
}
iv.invokespecial(type.getClassName(), "<init>", method1.getDescriptor());
}
else if (specifier instanceof JetDelegatorByExpressionSpecifier) {
codegen.genToJVMStack(((JetDelegatorByExpressionSpecifier) specifier).getDelegateExpression());
}
if (delegateOnStack) {
JetType superType = bindingContext.resolveTypeReference(specifier.getTypeReference());
ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor();
String delegateField = "$delegate_" + n;
Type fieldType = JetTypeMapper.jetInterfaceType(superClassDescriptor);
String fieldDesc = fieldType.getDescriptor();
v.visitField(Opcodes.ACC_PRIVATE, delegateField, fieldDesc, /*TODO*/null, null);
iv.putfield(classname, delegateField, fieldDesc);
JetClass superClass = (JetClass) bindingContext.getDeclarationPsiElement(superClassDescriptor);
generateDelegates(aClass, superClass, v,
new OwnerKind.DelegateKind(StackValue.field(fieldType, classname, delegateField, false),
JetTypeMapper.jvmNameForInterface(superClassDescriptor)));
}
n++;
}
generateInitializers(aClass, kind, codegen, iv);
int curParam = 0;
List<JetParameter> constructorParameters = aClass.getPrimaryConstructorParameters();
for (JetParameter parameter : constructorParameters) {
if (parameter.getValOrVarNode() != null) {
VariableDescriptor descriptor = paramDescrs.get(curParam);
Type type = typeMapper.mapType(descriptor.getOutType());
iv.load(0, classType);
iv.load(frameMap.getIndex(descriptor), type);
iv.putfield(classname, descriptor.getName(), type.getDescriptor());
}
curParam++;
}
iv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
private void generateInitializers(JetClass aClass, OwnerKind kind, ExpressionCodegen codegen, InstructionAdapter iv, JetTypeMapper typeMapper) {
private void generateInitializers(JetClass aClass, OwnerKind kind, ExpressionCodegen codegen, InstructionAdapter iv) {
for (JetDeclaration declaration : aClass.getDeclarations()) {
if (declaration instanceof JetProperty) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) bindingContext.getVariableDescriptor((JetProperty) declaration);
......@@ -201,7 +304,7 @@ public class ClassCodegen {
private void generateClassBody(JetClass aClass, ClassVisitor v, OwnerKind kind) {
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
final FunctionCodegen functionCodegen = new FunctionCodegen(v, standardLibrary, bindingContext);
final FunctionCodegen functionCodegen = new FunctionCodegen(aClass, v, standardLibrary, bindingContext);
final PropertyCodegen propertyCodegen = new PropertyCodegen(v, standardLibrary, bindingContext, functionCodegen);
for (JetDeclaration declaration : aClass.getDeclarations()) {
......@@ -212,5 +315,56 @@ public class ClassCodegen {
functionCodegen.gen((JetFunction) declaration, kind);
}
}
for (JetParameter p : aClass.getPrimaryConstructorParameters()) {
if (p.getValOrVarNode() != null) {
VariableDescriptor descriptor = bindingContext.getParameterDescriptor(p);
if (descriptor instanceof PropertyDescriptor) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
propertyCodegen.generateDefaultGetter(propertyDescriptor, Opcodes.ACC_PUBLIC, kind);
if (propertyDescriptor.isVar()) {
propertyCodegen.generateDefaultSetter(propertyDescriptor, Opcodes.ACC_PUBLIC, kind);
}
if (!(kind instanceof OwnerKind.DelegateKind) && kind != OwnerKind.INTERFACE && bindingContext.hasBackingField(propertyDescriptor)) {
v.visitField(Opcodes.ACC_PRIVATE, p.getName(), typeMapper.mapType(propertyDescriptor.getOutType()).getDescriptor(), null, null);
}
}
}
}
}
private void generateDelegates(JetClass inClass, JetClass toClass, ClassVisitor v, OwnerKind kind) {
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
final FunctionCodegen functionCodegen = new FunctionCodegen(toClass, v, standardLibrary, bindingContext);
final PropertyCodegen propertyCodegen = new PropertyCodegen(v, standardLibrary, bindingContext, functionCodegen);
/* TODO
for (JetDeclaration declaration : toClass.getDeclarations()) {
if (declaration instanceof JetProperty) {
propertyCodegen.gen((JetProperty) declaration, kind);
}
else if (declaration instanceof JetFunction) {
functionCodegen.gen((JetFunction) declaration, kind);
}
}
*/
for (JetParameter p : toClass.getPrimaryConstructorParameters()) {
if (p.getValOrVarNode() != null) {
VariableDescriptor descriptor = bindingContext.getParameterDescriptor(p);
if (descriptor instanceof PropertyDescriptor) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
propertyCodegen.generateDefaultGetter(propertyDescriptor, Opcodes.ACC_PUBLIC, kind);
if (propertyDescriptor.isVar()) {
propertyCodegen.generateDefaultSetter(propertyDescriptor, Opcodes.ACC_PUBLIC, kind);
}
if (!(kind instanceof OwnerKind.DelegateKind) && kind != OwnerKind.INTERFACE && bindingContext.hasBackingField(propertyDescriptor)) {
v.visitField(Opcodes.ACC_PRIVATE, p.getName(), typeMapper.mapType(propertyDescriptor.getOutType()).getDescriptor(), null, null);
}
}
}
}
}
}
package org.jetbrains.jet.codegen;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.ProjectScope;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import jet.IntRange;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
......@@ -15,6 +19,7 @@ import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter;
import org.objectweb.asm.commons.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
......@@ -26,6 +31,18 @@ public class ExpressionCodegen extends JetVisitor {
private static final String CLASS_STRING = "java/lang/String";
private static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder";
private static final String CLASS_COMPARABLE = "java/lang/Comparable";
private static final String CLASS_ITERABLE = "java/lang/Iterable";
private static final String CLASS_ITERATOR = "java/util/Iterator";
private static final String CLASS_INT_RANGE = "jet/IntRange";
private static final String ITERABLE_ITERATOR_DESCRIPTOR = "()Ljava/util/Iterator;";
private static final String ITERATOR_HASNEXT_DESCRIPTOR = "()Z";
private static final String ITERATOR_NEXT_DESCRIPTOR = "()Ljava/lang/Object;";
private static final String INT_RANGE_CONSTRUCTOR_DESCRIPTOR = "(II)V";
private static final Type ITERATOR_TYPE = Type.getType(Iterator.class);
private static final Type INT_RANGE_TYPE = Type.getType(IntRange.class);
private final Stack<Label> myContinueTargets = new Stack<Label>();
private final Stack<Label> myBreakTargets = new Stack<Label>();
......@@ -35,13 +52,22 @@ public class ExpressionCodegen extends JetVisitor {
private final FrameMap myMap;
private final JetTypeMapper typeMapper;
private final Type returnType;
private final ClassDescriptor contextType;
private final OwnerKind contextKind;
private final BindingContext bindingContext;
public ExpressionCodegen(MethodVisitor v, BindingContext bindingContext, FrameMap myMap, JetTypeMapper typeMapper,
Type returnType) {
public ExpressionCodegen(MethodVisitor v,
BindingContext bindingContext,
FrameMap myMap,
JetTypeMapper typeMapper,
Type returnType,
ClassDescriptor contextType,
OwnerKind contextKind) {
this.myMap = myMap;
this.typeMapper = typeMapper;
this.returnType = returnType;
this.contextType = contextType;
this.contextKind = contextKind;
this.v = new InstructionAdapter(v);
this.bindingContext = bindingContext;
}
......@@ -51,7 +77,7 @@ public class ExpressionCodegen extends JetVisitor {
expr.accept(this);
}
private void gen(JetElement expr, Type type) {
public void gen(JetElement expr, Type type) {
int oldStackDepth = myStack.size();
gen(expr);
if (myStack.size() == oldStackDepth+1) {
......@@ -174,12 +200,23 @@ public class ExpressionCodegen extends JetVisitor {
@Override
public void visitForExpression(JetForExpression expression) {
final JetExpression loopRange = expression.getLoopRange();
Type loopRangeType = expressionType(loopRange);
final JetType expressionType = bindingContext.getExpressionType(loopRange);
Type loopRangeType = typeMapper.mapType(expressionType);
if (loopRangeType.getSort() == Type.ARRAY) {
generateForInArray(expression, loopRangeType);
}
else {
throw new UnsupportedOperationException("for/in loop currently only supported for arrays");
final DeclarationDescriptor descriptor = expressionType.getConstructor().getDeclarationDescriptor();
final PsiElement declaration = bindingContext.getDeclarationPsiElement(descriptor);
if (declaration instanceof PsiClass) {
final Project project = declaration.getProject();
final PsiClass iterable = JavaPsiFacade.getInstance(project).findClass("java.lang.Iterable", ProjectScope.getAllScope(project));
if (((PsiClass) declaration).isInheritor(iterable, true)) {
generateForInIterable(expression, loopRangeType);
return;
}
}
throw new UnsupportedOperationException("for/in loop currently only supported for arrays and Iterable instances");
}
}
......@@ -230,6 +267,48 @@ public class ExpressionCodegen extends JetVisitor {
myContinueTargets.pop();
}
private void generateForInIterable(JetForExpression expression, Type loopRangeType) {
final JetParameter loopParameter = expression.getLoopParameter();
final VariableDescriptor parameterDescriptor = bindingContext.getParameterDescriptor(loopParameter);
JetType paramType = parameterDescriptor.getOutType();
Type asmParamType = typeMapper.mapType(paramType);
int iteratorVar = myMap.enterTemp();
gen(expression.getLoopRange(), loopRangeType);
v.invokeinterface(CLASS_ITERABLE, "iterator", ITERABLE_ITERATOR_DESCRIPTOR);
v.store(iteratorVar, ITERATOR_TYPE);
Label begin = new Label();
Label end = new Label();
myContinueTargets.push(begin);
myBreakTargets.push(end);
v.mark(begin);
v.load(iteratorVar, ITERATOR_TYPE);
v.invokeinterface(CLASS_ITERATOR, "hasNext", ITERATOR_HASNEXT_DESCRIPTOR);
v.ifeq(end);
myMap.enter(parameterDescriptor, asmParamType.getSize());
v.load(iteratorVar, ITERATOR_TYPE);
v.invokeinterface(CLASS_ITERATOR, "next", ITERATOR_NEXT_DESCRIPTOR);
// TODO checkcast should be generated via StackValue
if (asmParamType.getSort() == Type.OBJECT && !"java.lang.Object".equals(asmParamType.getClassName())) {
v.checkcast(asmParamType);
}
v.store(myMap.getIndex(parameterDescriptor), asmParamType);
gen(expression.getBody(), Type.VOID_TYPE);
v.goTo(begin);
v.mark(end);
int paramIndex = myMap.leave(parameterDescriptor);
v.visitLocalVariable(loopParameter.getName(), asmParamType.getDescriptor(), null, begin, end, paramIndex);
myMap.leaveTemp();
myBreakTargets.pop();
myContinueTargets.pop();
}
@Override
public void visitBreakExpression(JetBreakExpression expression) {
JetSimpleNameExpression labelElement = expression.getTargetLabel();
......@@ -370,6 +449,23 @@ public class ExpressionCodegen extends JetVisitor {
}
else if (descriptor instanceof PropertyDescriptor) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
//TODO: hack, will not need if resolve goes to right descriptor itself
if (declaration instanceof JetParameter) {
if (PsiTreeUtil.getParentOfType(expression, JetDelegationSpecifier.class) != null) {
JetClass aClass = PsiTreeUtil.getParentOfType(expression, JetClass.class);
ConstructorDescriptor constructorDescriptor = bindingContext.getConstructorDescriptor(aClass);
List<ValueParameterDescriptor> parameters = constructorDescriptor.getUnsubstitutedValueParameters();
for (ValueParameterDescriptor parameter : parameters) {
if (parameter.getName().equals(descriptor.getName())) {
final JetType outType = ((VariableDescriptor) descriptor).getOutType();
myStack.push(StackValue.local(myMap.getIndex(parameter), typeMapper.mapType(outType)));
return;
}
}
}
}
boolean isStatic = descriptor.getContainingDeclaration() instanceof NamespaceDescriptor;
final boolean directToField = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER;
final StackValue iValue = intermediateValueForProperty(propertyDescriptor, directToField);
......@@ -388,6 +484,7 @@ public class ExpressionCodegen extends JetVisitor {
boolean isStatic = propertyDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor;
String owner = JetTypeMapper.getOwner(propertyDescriptor);
final JetType outType = propertyDescriptor.getOutType();
boolean isInsideClass = propertyDescriptor.getContainingDeclaration() == contextType;
Method getter;
Method setter;
if (directToField) {
......@@ -395,8 +492,8 @@ public class ExpressionCodegen extends JetVisitor {
setter = null;
}
else {
getter = propertyDescriptor.getGetter() == null ? null : typeMapper.mapGetterSignature(propertyDescriptor);
setter = propertyDescriptor.getSetter() == null ? null : typeMapper.mapSetterSignature(propertyDescriptor);
getter = isInsideClass && propertyDescriptor.getGetter() == null ? null : typeMapper.mapGetterSignature(propertyDescriptor);
setter = isInsideClass && propertyDescriptor.getSetter() == null ? null : typeMapper.mapSetterSignature(propertyDescriptor);
}
return StackValue.property(propertyDescriptor.getName(), owner, typeMapper.mapType(outType), isStatic, getter, setter);
}
......@@ -633,6 +730,9 @@ public class ExpressionCodegen extends JetVisitor {
else if (opToken == JetTokens.ELVIS) {
generateElvis(expression);
}
else if (opToken == JetTokens.RANGE) {
generateRange(expression);
}
else {
DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference());
if (op instanceof FunctionDescriptor) {
......@@ -743,6 +843,21 @@ public class ExpressionCodegen extends JetVisitor {
myStack.push(StackValue.onStack(exprType));
}
private void generateRange(JetBinaryExpression expression) {
final Type leftType = expressionType(expression.getLeft());
if (isIntPrimitive(leftType)) {
v.anew(INT_RANGE_TYPE);
v.dup();
gen(expression.getLeft(), Type.INT_TYPE);
gen(expression.getRight(), Type.INT_TYPE);
v.invokespecial(CLASS_INT_RANGE, "<init>", INT_RANGE_CONSTRUCTOR_DESCRIPTOR);
myStack.push(StackValue.onStack(INT_RANGE_TYPE));
}
else {
throw new UnsupportedOperationException("ranges are only supported for int objects");
}
}
private static boolean isNumberPrimitive(DeclarationDescriptor descriptor) {
if (!(descriptor instanceof ClassDescriptor)) {
return false;
......@@ -819,25 +934,44 @@ public class ExpressionCodegen extends JetVisitor {
private void generateAugmentedAssignment(JetBinaryExpression expression) {
DeclarationDescriptor op = bindingContext.resolveReferenceExpression(expression.getOperationReference());
final JetExpression lhs = expression.getLeft();
Type asmType = expressionType(lhs);
StackValue value = generateIntermediateValue(lhs);
value.dupReceiver(v);
value.put(asmType, v);
genToJVMStack(expression.getRight());
v.visitInsn(asmType.getOpcode(opcodeForMethod(op.getName())));
value.store(v);
Type lhsType = expressionType(lhs);
if (isNumberPrimitive(lhsType)) {
StackValue value = generateIntermediateValue(lhs); // receiver
value.dupReceiver(v, 0); // receiver receiver
value.put(lhsType, v); // receiver lhs
genToJVMStack(expression.getRight()); // receiver lhs rhs
v.visitInsn(lhsType.getOpcode(opcodeForMethod(op.getName()))); // receiver result
value.store(v);
}
else if ("java.lang.String".equals(lhsType.getClassName()) && op.getName().equals("plus")) {
generateStringBuilderConstructor(); // StringBuilder
StackValue value = generateIntermediateValue(lhs); // StringBuilder receiver
value.dupReceiver(v, 1); // receiver StringBuilder receiver
value.put(lhsType, v); // receiver StringBuilder value
invokeAppendMethod(lhsType); // receiver StringBuilder
invokeAppend(expression.getRight()); // receiver StringBuilder
v.invokevirtual(CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
value.store(v);
}
else {
throw new UnsupportedOperationException("Augmented assignment for non-primitive types not yet implemented");
}
}
private void generateConcatenation(JetBinaryExpression expression) {
generateStringBuilderConstructor();
invokeAppend(expression.getLeft());
invokeAppend(expression.getRight());
v.invokevirtual(CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
myStack.push(StackValue.onStack(Type.getObjectType(CLASS_STRING)));
}
private void generateStringBuilderConstructor() {
Type type = Type.getObjectType(CLASS_STRING_BUILDER);
v.anew(type);
v.dup();
Method method = new Method("<init>", Type.VOID_TYPE, new Type[0]);
v.invokespecial(CLASS_STRING_BUILDER, method.getName(), method.getDescriptor());
invokeAppend(expression.getLeft());
invokeAppend(expression.getRight());
v.invokevirtual(CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
myStack.push(StackValue.onStack(Type.getObjectType(CLASS_STRING)));
}
private void invokeAppend(final JetExpression expr) {
......@@ -851,6 +985,10 @@ public class ExpressionCodegen extends JetVisitor {
}
Type exprType = expressionType(expr);
gen(expr, exprType);
invokeAppendMethod(exprType);
}
private void invokeAppendMethod(Type exprType) {
Method appendDescriptor = new Method("append", Type.getObjectType(CLASS_STRING_BUILDER),
new Type[] { exprType.getSort() == Type.OBJECT ? JetTypeMapper.TYPE_OBJECT : exprType});
v.invokevirtual(CLASS_STRING_BUILDER, "append", appendDescriptor.getDescriptor());
......@@ -925,7 +1063,7 @@ public class ExpressionCodegen extends JetVisitor {
}
}
StackValue value = generateIntermediateValue(operand);
value.dupReceiver(v);
value.dupReceiver(v, 0);
value.put(asmType, v);
if (asmType == Type.LONG_TYPE) {
v.aconst(Long.valueOf(increment));
......@@ -989,7 +1127,7 @@ public class ExpressionCodegen extends JetVisitor {
v.anew(type);
v.dup();
Method method = typeMapper.mapConstructorSignature((ConstructorDescriptor) constructorDescriptor);
Method method = typeMapper.mapConstructorSignature((ConstructorDescriptor) constructorDescriptor, OwnerKind.IMPLEMENTATION);
pushMethodArguments(expression, method);
v.invokespecial(JetTypeMapper.jvmNameForImplementation(classDecl), "<init>", method.getDescriptor());
myStack.push(StackValue.onStack(type));
......@@ -1031,6 +1169,27 @@ public class ExpressionCodegen extends JetVisitor {
v.athrow();
}
@Override
public void visitThisExpression(JetThisExpression expression) {
thisToStack();
}
public void thisToStack() {
if (contextKind == OwnerKind.NAMESPACE) {
throw new UnsupportedOperationException("Cannot generate this expression in top level context");
}
if (contextKind == OwnerKind.IMPLEMENTATION) {
v.load(0, JetTypeMapper.jetImplementationType(contextType));
}
else if (contextKind == OwnerKind.DELEGATING_IMPLEMENTATION) {
v.getfield(JetTypeMapper.jvmName(contextType, contextKind), "$this", JetTypeMapper.jetInterfaceType(contextType).getDescriptor());
}
else {
throw new UnsupportedOperationException("Unknown kind: " + contextKind);
}
}
private static class CompilationException extends RuntimeException {
}
}
......@@ -15,34 +15,18 @@ import java.util.List;
* @author max
*/
public class FunctionCodegen {
private final JetDeclaration owner;
private final ClassVisitor v;
private final BindingContext bindingContext;
private final JetStandardLibrary standardLibrary;
private final JetTypeMapper typeMapper;
public FunctionCodegen(ClassVisitor v, JetStandardLibrary standardLibrary, BindingContext bindingContext) {
public FunctionCodegen(JetDeclaration owner, ClassVisitor v, JetStandardLibrary standardLibrary, BindingContext bindingContext) {
this.owner = owner;
this.v = v;
this.bindingContext = bindingContext;
this.standardLibrary = standardLibrary;
typeMapper = new JetTypeMapper(standardLibrary, bindingContext);
}
public void genInNamespace(JetFunction f) {
gen(f, OwnerKind.NAMESPACE);
}
public void genInInterface(JetFunction f) {
gen(f, OwnerKind.INTERFACE);
}
public void genInImplementation(JetFunction f) {
}
public void genInDelegatingImplementation(JetFunction f) {
}
public void gen(JetFunction f, OwnerKind kind) {
Method method = typeMapper.mapSignature(f);
List<ValueParameterDescriptor> paramDescrs = bindingContext.getFunctionDescriptor(f).getUnsubstitutedValueParameters();
......@@ -59,6 +43,8 @@ public class FunctionCodegen {
boolean isAbstract = kind == OwnerKind.INTERFACE || bodyExpression == null;
if (isAbstract) flags |= Opcodes.ACC_ABSTRACT;
ClassDescriptor ownerClass = owner instanceof JetClass ? bindingContext.getClassDescriptor((JetClass) owner) : null;
final MethodVisitor mv = v.visitMethod(flags, jvmSignature.getName(), jvmSignature.getDescriptor(), null, null);
if (kind != OwnerKind.INTERFACE) {
mv.visitCode();
......@@ -74,7 +60,7 @@ public class FunctionCodegen {
frameMap.enter(parameter, argTypes[i].getSize());
}
ExpressionCodegen codegen = new ExpressionCodegen(mv, bindingContext, frameMap, typeMapper, jvmSignature.getReturnType());
ExpressionCodegen codegen = new ExpressionCodegen(mv, bindingContext, frameMap, typeMapper, jvmSignature.getReturnType(), ownerClass, kind);
bodyExpression.accept(codegen);
generateReturn(mv, bodyExpression, codegen);
mv.visitMaxs(0, 0);
......
......@@ -31,6 +31,22 @@ public class JetTypeMapper {
return psiClass.getQualifiedName().replace(".", "/");
}
static String jvmName(ClassDescriptor jetClass, OwnerKind kind) {
if (kind == OwnerKind.INTERFACE) {
return jvmNameForInterface(jetClass);
}
else if (kind == OwnerKind.IMPLEMENTATION) {
return jvmNameForImplementation(jetClass);
}
else if (kind == OwnerKind.DELEGATING_IMPLEMENTATION) {
return jvmNameForDelegatingImplementation(jetClass);
}
else {
assert false : "Unsuitable kind";
return "java/lang/Object";
}
}
static Type psiClassType(PsiClass psiClass) {
return Type.getType("L" + jvmName(psiClass) + ";");
}
......@@ -43,6 +59,10 @@ public class JetTypeMapper {
return Type.getType("L" + jvmNameForImplementation(classDescriptor) + ";");
}
static Type jetDelegatingImplementationType(ClassDescriptor classDescriptor) {
return Type.getType("L" + jvmNameForDelegatingImplementation(classDescriptor) + ";");
}
static String jvmName(JetNamespace namespace) {
return NamespaceCodegen.getJVMClassName(namespace.getFQName());
}
......@@ -79,7 +99,7 @@ public class JetTypeMapper {
}
public Type mapType(final JetType jetType) {
if (jetType.equals(JetStandardClasses.getUnitType())) {
if (jetType.equals(JetStandardClasses.getUnitType()) || jetType.equals(JetStandardClasses.getNothingType())) {
return Type.VOID_TYPE;
}
if (jetType.equals(standardLibrary.getIntType())) {
......@@ -183,17 +203,27 @@ public class JetTypeMapper {
}
public Method mapSetterSignature(PropertyDescriptor descriptor) {
Type paramType = mapType(descriptor.getInType());
final JetType inType = descriptor.getInType();
if (inType == null) {
return null;
}
Type paramType = mapType(inType);
return new Method(PropertyCodegen.setterName(descriptor.getName()), Type.VOID_TYPE, new Type[] { paramType });
}
public Method mapConstructorSignature(ConstructorDescriptor descriptor) {
public Method mapConstructorSignature(ConstructorDescriptor descriptor, OwnerKind kind) {
boolean delegate = kind == OwnerKind.DELEGATING_IMPLEMENTATION;
List<ValueParameterDescriptor> parameters = descriptor.getUnsubstitutedValueParameters();
Type[] parameterTypes = new Type[parameters.size()];
for (int i = 0; i < parameters.size(); i++) {
parameterTypes[i] = mapType(parameters.get(i).getOutType());
int count = parameters.size();
int first = delegate ? 1 : 0;
Type[] parameterTypes = new Type[count + first];
if (delegate) {
parameterTypes[0] = jetInterfaceType(descriptor.getContainingDeclaration());
}
for (int i = 0; i < count; i++) {
parameterTypes[i + first] = mapType(parameters.get(i).getOutType());
}
Type returnType = mapType(descriptor.getUnsubstitutedReturnType());
return new Method("<init>", Type.VOID_TYPE, parameterTypes);
}
......
......@@ -41,7 +41,7 @@ public class NamespaceCodegen {
BindingContext bindingContext = AnalyzingUtils.analyzeNamespace(namespace, ErrorHandler.THROW_EXCEPTION);
final JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
final FunctionCodegen functionCodegen = new FunctionCodegen(v, standardLibrary, bindingContext);
final FunctionCodegen functionCodegen = new FunctionCodegen(namespace, v, standardLibrary, bindingContext);
final PropertyCodegen propertyCodegen = new PropertyCodegen(v, standardLibrary, bindingContext, functionCodegen);
final ClassCodegen classCodegen = codegens.forClass(bindingContext);
......@@ -51,10 +51,10 @@ public class NamespaceCodegen {
for (JetDeclaration declaration : namespace.getDeclarations()) {
if (declaration instanceof JetProperty) {
propertyCodegen.genInNamespace((JetProperty) declaration);
propertyCodegen.gen((JetProperty) declaration, OwnerKind.NAMESPACE);
}
else if (declaration instanceof JetFunction) {
functionCodegen.genInNamespace((JetFunction) declaration);
functionCodegen.gen((JetFunction) declaration, OwnerKind.NAMESPACE);
}
else if (declaration instanceof JetClass) {
classCodegen.generate((JetClass) declaration);
......@@ -70,8 +70,7 @@ public class NamespaceCodegen {
FrameMap frameMap = new FrameMap();
JetTypeMapper typeMapper = new JetTypeMapper(JetStandardLibrary.getJetStandardLibrary(namespace.getProject()), bindingContext);
ExpressionCodegen codegen = new ExpressionCodegen(mv, bindingContext, frameMap,
typeMapper, Type.VOID_TYPE);
ExpressionCodegen codegen = new ExpressionCodegen(mv, bindingContext, frameMap, typeMapper, Type.VOID_TYPE, null, OwnerKind.NAMESPACE);
for (JetDeclaration declaration : namespace.getDeclarations()) {
if (declaration instanceof JetProperty) {
......
package org.jetbrains.jet.codegen;
import org.objectweb.asm.Type;
/**
* @author max
*/
public enum OwnerKind {
NAMESPACE,
INTERFACE,
IMPLEMENTATION,
DELEGATING_IMPLEMENTATION
public class OwnerKind {
public static final OwnerKind NAMESPACE = new OwnerKind();
public static final OwnerKind INTERFACE = new OwnerKind();
public static final OwnerKind IMPLEMENTATION = new OwnerKind();
public static final OwnerKind DELEGATING_IMPLEMENTATION = new OwnerKind();
public static class DelegateKind extends OwnerKind {
private final StackValue delegate;
private final String ownerClass;
public DelegateKind(StackValue delegate, String ownerClass) {
this.delegate = delegate;
this.ownerClass = ownerClass;
}
public StackValue getDelegate() {
return delegate;
}
public String getOwnerClass() {
return ownerClass;
}
}
}
......@@ -29,22 +29,6 @@ public class PropertyCodegen {
this.mapper = new JetTypeMapper(standardLibrary, context);
}
public void genInNamespace(JetProperty p) {
gen(p, OwnerKind.NAMESPACE);
}
public void genInInterface(JetProperty p) {
}
public void genInImplementation(JetProperty p) {
gen(p, OwnerKind.IMPLEMENTATION);
}
public void genInDelegatingImplementation(JetProperty p) {
gen(p, OwnerKind.DELEGATING_IMPLEMENTATION);
}
public void gen(JetProperty p, OwnerKind kind) {
final VariableDescriptor descriptor = context.getVariableDescriptor(p);
if (!(descriptor instanceof PropertyDescriptor)) {
......@@ -85,9 +69,13 @@ public class PropertyCodegen {
value = ((JetConstantExpression) initializer).getValue();
}
}
int modifiers = Opcodes.ACC_PRIVATE;
final int modifiers;
if (kind == OwnerKind.NAMESPACE) {
modifiers |= Opcodes.ACC_STATIC;
int access = isExternallyAccessible(p) ? Opcodes.ACC_PUBLIC : Opcodes.ACC_PRIVATE;
modifiers = access | Opcodes.ACC_STATIC;
}
else {
modifiers = Opcodes.ACC_PRIVATE;
}
v.visitField(modifiers, p.getName(), mapper.mapType(propertyDescriptor.getOutType()).getDescriptor(), null, value);
}
......@@ -134,49 +122,78 @@ public class PropertyCodegen {
private void generateDefaultGetter(JetProperty p, JetDeclaration declaration, OwnerKind kind) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) context.getVariableDescriptor(p);
int flags = JetTypeMapper.getAccessModifiers(declaration, Opcodes.ACC_PUBLIC);
generateDefaultGetter(propertyDescriptor, flags, kind);
}
public void generateDefaultGetter(PropertyDescriptor propertyDescriptor, int flags, OwnerKind kind) {
if (kind == OwnerKind.NAMESPACE) {
flags |= Opcodes.ACC_STATIC;
}
else if (kind == OwnerKind.INTERFACE) {
flags |= Opcodes.ACC_ABSTRACT;
}
final String signature = mapper.mapGetterSignature(propertyDescriptor).getDescriptor();
MethodVisitor mv = v.visitMethod(flags, getterName(p.getName()), signature, null, null);
mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv);
if (kind != OwnerKind.NAMESPACE) {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
String getterName = getterName(propertyDescriptor.getName());
MethodVisitor mv = v.visitMethod(flags, getterName, signature, null, null);
if (kind != OwnerKind.INTERFACE) {
mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv);
if (kind != OwnerKind.NAMESPACE) {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
}
final Type type = mapper.mapType(propertyDescriptor.getOutType());
if (kind instanceof OwnerKind.DelegateKind) {
OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind;
dk.getDelegate().put(JetTypeMapper.TYPE_OBJECT, iv);
iv.invokeinterface(dk.getOwnerClass(), getterName, signature);
}
else {
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.GETSTATIC : Opcodes.GETFIELD,
JetTypeMapper.getOwner(propertyDescriptor), propertyDescriptor.getName(),
type.getDescriptor());
}
iv.areturn(type);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
final Type type = mapper.mapType(propertyDescriptor.getOutType());
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.GETSTATIC : Opcodes.GETFIELD,
JetTypeMapper.getOwner(propertyDescriptor), propertyDescriptor.getName(),
type.getDescriptor());
iv.areturn(type);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
private void generateDefaultSetter(JetProperty p, JetDeclaration declaration, OwnerKind kind) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) context.getVariableDescriptor(p);
int flags = JetTypeMapper.getAccessModifiers(declaration, Opcodes.ACC_PUBLIC);
generateDefaultSetter(propertyDescriptor, flags, kind);
}
public void generateDefaultSetter(PropertyDescriptor propertyDescriptor, int flags, OwnerKind kind) {
if (kind == OwnerKind.NAMESPACE) {
flags |= Opcodes.ACC_STATIC;
}
final String signature = mapper.mapSetterSignature(propertyDescriptor).getDescriptor();
MethodVisitor mv = v.visitMethod(flags, setterName(p.getName()), signature, null, null);
mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv);
final Type type = mapper.mapType(propertyDescriptor.getOutType());
if (kind != OwnerKind.NAMESPACE) {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(1, type);
else if (kind == OwnerKind.INTERFACE) {
flags |= Opcodes.ACC_ABSTRACT;
}
else {
iv.load(0, type);
final String signature = mapper.mapSetterSignature(propertyDescriptor).getDescriptor();
MethodVisitor mv = v.visitMethod(flags, setterName(propertyDescriptor.getName()), signature, null, null);
if (kind != OwnerKind.INTERFACE) {
mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv);
final Type type = mapper.mapType(propertyDescriptor.getOutType());
if (kind != OwnerKind.NAMESPACE) {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(1, type);
}
else {
iv.load(0, type);
}
//TODO: kind inst Delegate
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD,
JetTypeMapper.getOwner(propertyDescriptor), propertyDescriptor.getName(),
type.getDescriptor());
iv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD,
JetTypeMapper.getOwner(propertyDescriptor), propertyDescriptor.getName(),
type.getDescriptor());
iv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
public static String getterName(String propertyName) {
......
......@@ -24,7 +24,7 @@ public abstract class StackValue {
throw new UnsupportedOperationException("cannot store to value " + this);
}
public void dupReceiver(InstructionAdapter v) {
public void dupReceiver(InstructionAdapter v, int below) {
}
public void condJump(Label label, boolean jumpIfFalse, InstructionAdapter v) {
......@@ -341,8 +341,13 @@ public abstract class StackValue {
}
@Override
public void dupReceiver(InstructionAdapter v) {
v.dup2(); // array and index
public void dupReceiver(InstructionAdapter v, int below) {
if (below == 1) {
v.dup2X1();
}
else {
v.dup2(); // array and index
}
}
}
......@@ -364,8 +369,15 @@ public abstract class StackValue {
}
@Override
public void dupReceiver(InstructionAdapter v) {
if (!isStatic) v.dup();
public void dupReceiver(InstructionAdapter v, int below) {
if (!isStatic) {
if (below == 1) {
v.dupX1();
}
else {
v.dup();
}
}
}
@Override
......
package org.jetbrains.jet.lang.resolve;
import com.intellij.psi.PsiElement;
import org.jetbrains.jet.codegen.ClassCodegen;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.types.*;
......@@ -29,4 +30,6 @@ public interface BindingContext {
boolean isBlock(JetFunctionLiteralExpression expression);
boolean isStatement(JetExpression expression);
boolean hasBackingField(PropertyDescriptor propertyDescriptor);
ConstructorDescriptor resolveSuperConstructor(JetDelegatorToSuperCall superCall, ClassCodegen classCodegen);
}
......@@ -4,6 +4,7 @@ import com.google.common.collect.Maps;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.ClassCodegen;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.types.*;
......@@ -208,4 +209,15 @@ public class BindingTraceContext implements BindingContext, BindingTrace {
}
return backingFieldRequired.contains(propertyDescriptor);
}
public ConstructorDescriptor resolveSuperConstructor(JetDelegatorToSuperCall superCall, ClassCodegen classCodegen) {
JetTypeReference typeReference = superCall.getTypeReference();
if (typeReference == null) return null;
JetTypeElement typeElement = typeReference.getTypeElement();
if (!(typeElement instanceof JetUserType)) return null;
DeclarationDescriptor descriptor = resolveReferenceExpression(((JetUserType) typeElement).getReferenceExpression());
return descriptor instanceof ConstructorDescriptor ? (ConstructorDescriptor) descriptor : null;
}
}
......@@ -96,11 +96,21 @@ public class FunctionDescriptorUtil {
if (substitutor.isEmpty()) {
return functionDescriptor;
}
FunctionDescriptorImpl substitutedDescriptor = new FunctionDescriptorImpl(
functionDescriptor,
// TODO : safeSubstitute
functionDescriptor.getAttributes(),
functionDescriptor.getName());
FunctionDescriptorImpl substitutedDescriptor;
if (functionDescriptor instanceof ConstructorDescriptor) {
ConstructorDescriptor original = (ConstructorDescriptor) functionDescriptor;
substitutedDescriptor = new ConstructorDescriptorImpl(
original, functionDescriptor.getAttributes(), original.isPrimary()
);
}
else {
substitutedDescriptor = new FunctionDescriptorImpl(
functionDescriptor,
// TODO : safeSubstitute
functionDescriptor.getAttributes(),
functionDescriptor.getName());
}
List<ValueParameterDescriptor> substitutedValueParameters = getSubstitutedValueParameters(substitutedDescriptor, functionDescriptor, substitutor);
if (substitutedValueParameters == null) {
......
var collector: String = ""
set(it) { $collector += it }
fun append(s: String): String {
collector = s;
return collector;
}
import java.util.*
fun concat(l: List): String {
fun concat(l: List<String>): String? {
val sb = new StringBuilder()
for(s in l) {
sb.append(s)
}
s.toString()
sb.toString()
}
class X(val x : Int) {}
class Y(val y : Int) {}
class Point(x : Int, y : Int) : X(x) , Y(y) {}
class Abstract {}
class P1(x : Int, yy : Y) : Abstract, X(x), Y by yy {}
class P2(x : Int, yy : Y) : X(x), Abstract, Y by yy {}
class P3(x : Int, yy : Y) : X(x), Y by yy, Abstract {}
class P4(x : Int, yy : Y) : Y by yy, Abstract, X(x) {}
fun box() : String {
if (new X(239).x != 239) return "FAIL #1"
if (new Y(239).y != 239) return "FAIL #2"
val p = new Point(240, -1)
if (p.x + p.y != 239) return "FAIL #3"
val y = new Y(-1)
/*
val p1 = new P1(240, y)
if (p1.x + p1.y != 239) return "FAIL #4"
val p2 = new P2(240, y)
if (p2.x + p2.y != 239) return "FAIL #5"
val p3 = new P3(240, y)
if (p3.x + p3.y != 239) return "FAIL #6"
val p4 = new P4(240, y)
if (p4.x + p4.y != 239) return "FAIL #7"
*/
"OK"
}
\ No newline at end of file
class SimpleClass() {
fun foo() = 610
}
fun test() {
val c = new SimpleClass()
return c.foo()
}
class SimpleClass {
this() {}
fun foo() = 610
}
fun test() {
val c = new SimpleClass()
return c.foo()
}
fun foo(s: String): String? {
try {
Integer.parseInt(s);
return "no message";
}
catch(e: NumberFormatException) {
return e.getMessage();
}
}
......@@ -24,10 +24,28 @@ public class ClassGenTest extends CodegenTestCase {
checkInterface(aClass, List.class);
}
private void checkInterface(Class aClass, Class ifs) {
public void testArrayInheritance() throws Exception {
loadFile("inheritance.jet");
System.out.println(generateToText());
assertEquals("OK", blackBox());
}
private static void checkInterface(Class aClass, Class ifs) {
for (Class anInterface : aClass.getInterfaces()) {
if (anInterface == ifs) return;
}
fail(aClass.getName() + " must have " + ifs.getName() + " in its interfaces");
}
public void testNewInstanceExplicitConstructor() throws Exception {
loadFile("newInstanceDefaultConstructor.jet");
System.out.println(generateToText());
final Codegens codegens = generateClassesInFile();
loadImplementationClass(codegens, "SimpleClass");
Class ns = loadRootNamespaceClass(codegens);
final Method method = findMethodByName(ns, "test");
final Integer returnValue = (Integer) method.invoke(null);
assertEquals(610, returnValue.intValue());
}
}
......@@ -40,6 +40,18 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase {
myFixture.configureByFile(JetParsingTest.getTestDataDir() + "/codegen/" + name);
}
protected String blackBox() throws Exception {
Codegens codegens = generateClassesInFile();
CodegensClassLoader loader = new CodegensClassLoader(codegens);
JetFile jetFile = (JetFile) myFixture.getFile();
final JetNamespace namespace = jetFile.getRootNamespace();
String fqName = NamespaceCodegen.getJVMClassName(namespace.getFQName()).replace("/", ".");
Class<?> namespaceClass = loader.loadClass(fqName);
Method method = namespaceClass.getMethod("box");
return (String) method.invoke(null);
}
protected String generateToText() {
Codegens state = new Codegens(getProject(), true);
JetFile jetFile = (JetFile) myFixture.getFile();
......@@ -60,10 +72,14 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase {
}
protected Class generateNamespaceClass() {
Codegens state = generateClassesInFile();
return loadRootNamespaceClass(state);
}
protected Class loadRootNamespaceClass(Codegens state) {
JetFile jetFile = (JetFile) myFixture.getFile();
final JetNamespace namespace = jetFile.getRootNamespace();
String fqName = NamespaceCodegen.getJVMClassName(namespace.getFQName()).replace("/", ".");
Codegens state = generateClassesInFile();
return loadClass(fqName, state);
}
......@@ -140,6 +156,25 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase {
}
}
private static class CodegensClassLoader extends ClassLoader {
private final Codegens state;
public CodegensClassLoader(Codegens state) {
super(CodegenTestCase.class.getClassLoader());
this.state = state;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String file = name.replace('.', '/') + ".class";
if (state.files().contains(file)) {
byte[] bytes = state.asBytes(file);
return defineClass(name, bytes, 0, bytes.length);
}
return super.findClass(name);
}
}
@NotNull
@Override
protected LightProjectDescriptor getProjectDescriptor() {
......
......@@ -71,11 +71,12 @@ public class ControlStructuresTest extends CodegenTestCase {
assertEquals(10, main.invoke(null, "false"));
}
public void _testFor() throws Exception {
public void testFor() throws Exception {
loadFile("for.jet");
System.out.println(generateToText());
final Method main = generateFunction();
List<String> args = Arrays.asList("IntelliJ", " ", "IDEA");
assertEquals("IntelliJ IDEA", main.invoke(args));
assertEquals("IntelliJ IDEA", main.invoke(null, args));
}
public void testForInArray() throws Exception {
......@@ -99,4 +100,11 @@ public class ControlStructuresTest extends CodegenTestCase {
}
assertTrue(caught);
}
public void testTryCatch() throws Exception {
loadFile("tryCatch.jet");
final Method main = generateFunction();
assertEquals("no message", main.invoke(null, "0"));
assertEquals("xxx", main.invoke(null, "a"));
}
}
package org.jetbrains.jet.codegen;
import jet.IntRange;
import org.jetbrains.jet.parsing.JetParsingTest;
import java.awt.*;
......@@ -259,6 +260,13 @@ public class NamespaceGenTest extends CodegenTestCase {
assertEquals("jet Lang", main.invoke(null, "jet", " ", "Lang"));
}
public void testStringPlusEq() throws Exception {
loadText("fun foo(s: String) { val result = s; result += s; return result; } ");
System.out.println(generateToText());
final Method main = generateFunction();
assertEquals("JarJar", main.invoke(null, "Jar"));
}
public void testStringCompare() throws Exception {
loadText("fun foo(s1: String, s2: String) = s1 < s2");
System.out.println(generateToText());
......@@ -351,4 +359,13 @@ public class NamespaceGenTest extends CodegenTestCase {
main.invoke(null, new Object[] { data });
assertEquals(10, data[0]);
}
public void testIntRange() throws Exception {
loadText("fun foo() = 1..10");
final Method main = generateFunction();
IntRange result = (IntRange) main.invoke(null);
assertTrue(result.contains(1));
assertTrue(result.contains(10));
assertFalse(result.contains(11));
}
}
......@@ -81,6 +81,15 @@ public class PropertyGenTest extends CodegenTestCase {
assertEquals(value, "IntelliJ IDEA");
}
public void testFieldSetterPlusEq() throws Exception {
loadFile("fieldSetterPlusEq.jet");
System.out.println(generateToText());
final Method method = generateFunction("append");
method.invoke(null, "IntelliJ ");
String value = (String) method.invoke(null, "IDEA");
assertEquals(value, "IntelliJ IDEA");
}
public void testAccessorsWithoutBody() throws Exception {
loadText("class AccessorsWithoutBody() { public var foo: Int = 349\n get\n private set\n fun setter() { foo = 610; } } ");
final Class aClass = loadImplementationClass(generateClassesInFile(), "AccessorsWithoutBody");
......
package jet;
public class IntRange implements Range<Integer> {
private final int startValue;
private final int endValue;
public IntRange(int startValue, int endValue) {
this.startValue = startValue;
this.endValue = endValue;
}
@Override
public boolean contains(Integer item) {
if (item == null) return false;
if (startValue <= endValue) {
return item >= startValue && item <= endValue;
}
return item <= startValue && item >= endValue;
}
}
package jet;
public interface Range<T extends Comparable<T>> {
boolean contains(T item);
}
package jet;
public class Tuple1<T1> {
public final T1 _1;
public Tuple1(T1 t1) {
_1 = t1;
}
@Override
public String toString() {
return "(" + _1 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple1 t = (Tuple1) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public Tuple10(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple10 t = (Tuple10) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public Tuple11(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple11 t = (Tuple11) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public Tuple12(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple12 t = (Tuple12) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public Tuple13(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple13 t = (Tuple13) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public Tuple14(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple14 t = (Tuple14) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public Tuple15(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple15 t = (Tuple15) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public Tuple16(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple16 t = (Tuple16) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public final T17 _17;
public Tuple17(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16, T17 t17) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
_17 = t17;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ", " + _17 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple17 t = (Tuple17) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
if (_17 != null ? !_17.equals(t._17) : t._17 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
result = 31 * result + (_17 != null ? _17.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public final T17 _17;
public final T18 _18;
public Tuple18(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16, T17 t17, T18 t18) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
_17 = t17;
_18 = t18;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ", " + _17 + ", " + _18 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple18 t = (Tuple18) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
if (_17 != null ? !_17.equals(t._17) : t._17 != null) return false;
if (_18 != null ? !_18.equals(t._18) : t._18 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
result = 31 * result + (_17 != null ? _17.hashCode() : 0);
result = 31 * result + (_18 != null ? _18.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public final T17 _17;
public final T18 _18;
public final T19 _19;
public Tuple19(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16, T17 t17, T18 t18, T19 t19) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
_17 = t17;
_18 = t18;
_19 = t19;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ", " + _17 + ", " + _18 + ", " + _19 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple19 t = (Tuple19) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
if (_17 != null ? !_17.equals(t._17) : t._17 != null) return false;
if (_18 != null ? !_18.equals(t._18) : t._18 != null) return false;
if (_19 != null ? !_19.equals(t._19) : t._19 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
result = 31 * result + (_17 != null ? _17.hashCode() : 0);
result = 31 * result + (_18 != null ? _18.hashCode() : 0);
result = 31 * result + (_19 != null ? _19.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple2<T1, T2> {
public final T1 _1;
public final T2 _2;
public Tuple2(T1 t1, T2 t2) {
_1 = t1;
_2 = t2;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple2 t = (Tuple2) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public final T17 _17;
public final T18 _18;
public final T19 _19;
public final T20 _20;
public Tuple20(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16, T17 t17, T18 t18, T19 t19, T20 t20) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
_17 = t17;
_18 = t18;
_19 = t19;
_20 = t20;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ", " + _17 + ", " + _18 + ", " + _19 + ", " + _20 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple20 t = (Tuple20) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
if (_17 != null ? !_17.equals(t._17) : t._17 != null) return false;
if (_18 != null ? !_18.equals(t._18) : t._18 != null) return false;
if (_19 != null ? !_19.equals(t._19) : t._19 != null) return false;
if (_20 != null ? !_20.equals(t._20) : t._20 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
result = 31 * result + (_17 != null ? _17.hashCode() : 0);
result = 31 * result + (_18 != null ? _18.hashCode() : 0);
result = 31 * result + (_19 != null ? _19.hashCode() : 0);
result = 31 * result + (_20 != null ? _20.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public final T17 _17;
public final T18 _18;
public final T19 _19;
public final T20 _20;
public final T21 _21;
public Tuple21(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16, T17 t17, T18 t18, T19 t19, T20 t20, T21 t21) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
_17 = t17;
_18 = t18;
_19 = t19;
_20 = t20;
_21 = t21;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ", " + _17 + ", " + _18 + ", " + _19 + ", " + _20 + ", " + _21 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple21 t = (Tuple21) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
if (_17 != null ? !_17.equals(t._17) : t._17 != null) return false;
if (_18 != null ? !_18.equals(t._18) : t._18 != null) return false;
if (_19 != null ? !_19.equals(t._19) : t._19 != null) return false;
if (_20 != null ? !_20.equals(t._20) : t._20 != null) return false;
if (_21 != null ? !_21.equals(t._21) : t._21 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
result = 31 * result + (_17 != null ? _17.hashCode() : 0);
result = 31 * result + (_18 != null ? _18.hashCode() : 0);
result = 31 * result + (_19 != null ? _19.hashCode() : 0);
result = 31 * result + (_20 != null ? _20.hashCode() : 0);
result = 31 * result + (_21 != null ? _21.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public final T10 _10;
public final T11 _11;
public final T12 _12;
public final T13 _13;
public final T14 _14;
public final T15 _15;
public final T16 _16;
public final T17 _17;
public final T18 _18;
public final T19 _19;
public final T20 _20;
public final T21 _21;
public final T22 _22;
public Tuple22(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12, T13 t13, T14 t14, T15 t15, T16 t16, T17 t17, T18 t18, T19 t19, T20 t20, T21 t21, T22 t22) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
_10 = t10;
_11 = t11;
_12 = t12;
_13 = t13;
_14 = t14;
_15 = t15;
_16 = t16;
_17 = t17;
_18 = t18;
_19 = t19;
_20 = t20;
_21 = t21;
_22 = t22;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ", " + _10 + ", " + _11 + ", " + _12 + ", " + _13 + ", " + _14 + ", " + _15 + ", " + _16 + ", " + _17 + ", " + _18 + ", " + _19 + ", " + _20 + ", " + _21 + ", " + _22 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple22 t = (Tuple22) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
if (_10 != null ? !_10.equals(t._10) : t._10 != null) return false;
if (_11 != null ? !_11.equals(t._11) : t._11 != null) return false;
if (_12 != null ? !_12.equals(t._12) : t._12 != null) return false;
if (_13 != null ? !_13.equals(t._13) : t._13 != null) return false;
if (_14 != null ? !_14.equals(t._14) : t._14 != null) return false;
if (_15 != null ? !_15.equals(t._15) : t._15 != null) return false;
if (_16 != null ? !_16.equals(t._16) : t._16 != null) return false;
if (_17 != null ? !_17.equals(t._17) : t._17 != null) return false;
if (_18 != null ? !_18.equals(t._18) : t._18 != null) return false;
if (_19 != null ? !_19.equals(t._19) : t._19 != null) return false;
if (_20 != null ? !_20.equals(t._20) : t._20 != null) return false;
if (_21 != null ? !_21.equals(t._21) : t._21 != null) return false;
if (_22 != null ? !_22.equals(t._22) : t._22 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
result = 31 * result + (_10 != null ? _10.hashCode() : 0);
result = 31 * result + (_11 != null ? _11.hashCode() : 0);
result = 31 * result + (_12 != null ? _12.hashCode() : 0);
result = 31 * result + (_13 != null ? _13.hashCode() : 0);
result = 31 * result + (_14 != null ? _14.hashCode() : 0);
result = 31 * result + (_15 != null ? _15.hashCode() : 0);
result = 31 * result + (_16 != null ? _16.hashCode() : 0);
result = 31 * result + (_17 != null ? _17.hashCode() : 0);
result = 31 * result + (_18 != null ? _18.hashCode() : 0);
result = 31 * result + (_19 != null ? _19.hashCode() : 0);
result = 31 * result + (_20 != null ? _20.hashCode() : 0);
result = 31 * result + (_21 != null ? _21.hashCode() : 0);
result = 31 * result + (_22 != null ? _22.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple3<T1, T2, T3> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public Tuple3(T1 t1, T2 t2, T3 t3) {
_1 = t1;
_2 = t2;
_3 = t3;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple3 t = (Tuple3) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple4<T1, T2, T3, T4> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public Tuple4(T1 t1, T2 t2, T3 t3, T4 t4) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple4 t = (Tuple4) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple5<T1, T2, T3, T4, T5> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public Tuple5(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple5 t = (Tuple5) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple6<T1, T2, T3, T4, T5, T6> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public Tuple6(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple6 t = (Tuple6) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple7<T1, T2, T3, T4, T5, T6, T7> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public Tuple7(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple7 t = (Tuple7) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public Tuple8(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple8 t = (Tuple8) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
return result;
}
}
\ No newline at end of file
package jet;
public class Tuple9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {
public final T1 _1;
public final T2 _2;
public final T3 _3;
public final T4 _4;
public final T5 _5;
public final T6 _6;
public final T7 _7;
public final T8 _8;
public final T9 _9;
public Tuple9(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9) {
_1 = t1;
_2 = t2;
_3 = t3;
_4 = t4;
_5 = t5;
_6 = t6;
_7 = t7;
_8 = t8;
_9 = t9;
}
@Override
public String toString() {
return "(" + _1 + ", " + _2 + ", " + _3 + ", " + _4 + ", " + _5 + ", " + _6 + ", " + _7 + ", " + _8 + ", " + _9 + ")";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple9 t = (Tuple9) o;
if (_1 != null ? !_1.equals(t._1) : t._1 != null) return false;
if (_2 != null ? !_2.equals(t._2) : t._2 != null) return false;
if (_3 != null ? !_3.equals(t._3) : t._3 != null) return false;
if (_4 != null ? !_4.equals(t._4) : t._4 != null) return false;
if (_5 != null ? !_5.equals(t._5) : t._5 != null) return false;
if (_6 != null ? !_6.equals(t._6) : t._6 != null) return false;
if (_7 != null ? !_7.equals(t._7) : t._7 != null) return false;
if (_8 != null ? !_8.equals(t._8) : t._8 != null) return false;
if (_9 != null ? !_9.equals(t._9) : t._9 != null) return false;
return true;
}
@Override
public int hashCode() {
int result = _1 != null ? _1.hashCode() : 0;
result = 31 * result + (_2 != null ? _2.hashCode() : 0);
result = 31 * result + (_3 != null ? _3.hashCode() : 0);
result = 31 * result + (_4 != null ? _4.hashCode() : 0);
result = 31 * result + (_5 != null ? _5.hashCode() : 0);
result = 31 * result + (_6 != null ? _6.hashCode() : 0);
result = 31 * result + (_7 != null ? _7.hashCode() : 0);
result = 31 * result + (_8 != null ? _8.hashCode() : 0);
result = 31 * result + (_9 != null ? _9.hashCode() : 0);
return result;
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
def generateTupleClass(i):
f = open("stdlib/src/jet/Tuple" + str(i) + ".java", "w")
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")
for j in range(1, i+1):
f.write(" public final T{0} _{0};\n".format(j))
f.write("\n public Tuple" + str(i) + "(")
f.write(", ".join("T{0} t{0}".format(j) for j in range(1, i+1)))
f.write(") {\n")
for j in range(1, i+1):
f.write(" _{0} = t{0};\n".format(j))
f.write(" }\n\n")
f.write(" @Override\n public String toString() {\n")
f.write(' return "(" + ' + ' + ", " + '.join("_{0}".format(j) for j in range(1, i+1)) + ' + ")";\n')
f.write(" }\n")
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")
f.write(" Tuple{0} t = (Tuple{0}) o;\n".format(i))
for j in range(1, i+1):
f.write(" if (_{0} != null ? !_{0}.equals(t._{0}) : t._{0} != null) return false;\n".format(j))
f.write(" return true;\n")
f.write(" }\n")
f.write(" @Override\n public int hashCode() {\n")
f.write(" int result = _1 != null ? _1.hashCode() : 0;\n")
for j in range(2, i+1):
f.write(" result = 31 * result + (_{0} != null ? _{0}.hashCode() : 0);\n".format(j))
f.write(" return result;\n")
f.write(" }\n")
f.write("}")
f.close()
for i in range(1, 23):
generateTupleClass(i)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册