Merge remote-tracking branch 'origin/master'

This commit is contained in:
svtk
2011-12-27 17:00:54 +04:00
180 changed files with 768 additions and 1564 deletions
@@ -253,7 +253,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
iv.load(0, Type.getObjectType(funClass)); iv.load(0, Type.getObjectType(funClass));
// expressionCodegen.generateTypeInfo(new ProjectionErasingJetType(returnType)); // expressionCodegen.generateTypeInfo(new ProjectionErasingJetType(returnType));
iv.aconst(null); // @todo iv.aconst(null); // @todo
iv.invokespecial(funClass, "<init>", "(Ljet/typeinfo/TypeInfo;)V"); iv.invokespecial(funClass, "<init>", "(Ljet/TypeInfo;)V");
i = 1; i = 1;
int k = 0; int k = 0;
@@ -991,7 +991,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
else if (descriptor instanceof TypeParameterDescriptor) { else if (descriptor instanceof TypeParameterDescriptor) {
TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) descriptor; TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) descriptor;
loadTypeParameterTypeInfo(typeParameterDescriptor, null); loadTypeParameterTypeInfo(typeParameterDescriptor, null);
v.invokevirtual("jet/typeinfo/TypeInfo", "getClassObject", "()Ljava/lang/Object;"); v.invokevirtual("jet/TypeInfo", "getClassObject", "()Ljava/lang/Object;");
v.checkcast(asmType(typeParameterDescriptor.getClassObjectType())); v.checkcast(asmType(typeParameterDescriptor.getClassObjectType()));
return StackValue.onStack(TYPE_OBJECT); return StackValue.onStack(TYPE_OBJECT);
@@ -2118,7 +2118,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
if(elementType != null) { if(elementType != null) {
generateTypeInfo(elementType, null); generateTypeInfo(elementType, null);
gen(args.get(0).getArgumentExpression(), Type.INT_TYPE); gen(args.get(0).getArgumentExpression(), Type.INT_TYPE);
v.invokevirtual("jet/typeinfo/TypeInfo", "newArray", "(I)[Ljava/lang/Object;"); v.invokevirtual("jet/TypeInfo", "newArray", "(I)[Ljava/lang/Object;");
} }
else { else {
gen(args.get(0).getArgumentExpression(), Type.INT_TYPE); gen(args.get(0).getArgumentExpression(), Type.INT_TYPE);
@@ -2543,14 +2543,14 @@ If finally block is present, its last expression is the value of try expression.
if (leaveExpressionOnStack) { if (leaveExpressionOnStack) {
v.dupX1(); v.dupX1();
} }
v.invokevirtual("jet/typeinfo/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z"); v.invokevirtual("jet/TypeInfo", "isInstance", "(Ljava/lang/Object;)Z");
} }
} }
public void generateTypeInfo(JetType jetType, Map<TypeParameterDescriptor, JetType> typeArguments) { public void generateTypeInfo(JetType jetType, Map<TypeParameterDescriptor, JetType> typeArguments) {
String knownTypeInfo = typeMapper.isKnownTypeInfo(jetType); String knownTypeInfo = typeMapper.isKnownTypeInfo(jetType);
if(knownTypeInfo != null) { if(knownTypeInfo != null) {
v.getstatic("jet/typeinfo/TypeInfo", knownTypeInfo, "Ljet/typeinfo/TypeInfo;"); v.getstatic("jet/TypeInfo", knownTypeInfo, "Ljet/TypeInfo;");
return; return;
} }
@@ -2562,14 +2562,14 @@ If finally block is present, its last expression is the value of try expression.
if(!CodegenUtil.hasTypeInfoField(jetType) && !(bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, jetType.getConstructor().getDeclarationDescriptor()) instanceof PsiClass)) { if(!CodegenUtil.hasTypeInfoField(jetType) && !(bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, jetType.getConstructor().getDeclarationDescriptor()) instanceof PsiClass)) {
// TODO: we need some better checks here // TODO: we need some better checks here
v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;"); v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$staticTypeInfo", "Ljet/TypeInfo;");
return; return;
} }
boolean hasUnsubstituted = TypeUtils.hasUnsubstitutedTypeParameters(jetType); boolean hasUnsubstituted = TypeUtils.hasUnsubstitutedTypeParameters(jetType);
if(!hasUnsubstituted) { if(!hasUnsubstituted) {
int typeInfoConstantIndex = context.getTypeInfoConstantIndex(jetType); int typeInfoConstantIndex = context.getTypeInfoConstantIndex(jetType);
v.invokestatic(context.getNamespaceClassName(), "$getCachedTypeInfo$" + typeInfoConstantIndex, "()Ljet/typeinfo/TypeInfo;"); v.invokestatic(context.getNamespaceClassName(), "$getCachedTypeInfo$" + typeInfoConstantIndex, "()Ljet/TypeInfo;");
return; return;
} }
@@ -2590,10 +2590,10 @@ If finally block is present, its last expression is the value of try expression.
genTypeInfoToProjection(v, argument.getProjectionKind()); genTypeInfoToProjection(v, argument.getProjectionKind());
v.astore(TYPE_OBJECT); v.astore(TYPE_OBJECT);
} }
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z[Ljet/typeinfo/TypeInfoProjection;)Ljet/typeinfo/TypeInfo;"); v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z[Ljet/typeinfo/TypeInfoProjection;)Ljet/TypeInfo;");
} }
else { else {
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/typeinfo/TypeInfo;"); v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/TypeInfo;");
} }
} }
@@ -2601,9 +2601,9 @@ If finally block is present, its last expression is the value of try expression.
if(variance == Variance.INVARIANT) if(variance == Variance.INVARIANT)
v.checkcast(TYPE_TYPEINFOPROJECTION); v.checkcast(TYPE_TYPEINFOPROJECTION);
else if(variance == Variance.IN_VARIANCE) else if(variance == Variance.IN_VARIANCE)
v.invokestatic("jet/typeinfo/TypeInfo", "inProjection", "(Ljet/typeinfo/TypeInfo;)Ljet/typeinfo/TypeInfoProjection;"); v.invokestatic("jet/TypeInfo", "inProjection", "(Ljet/TypeInfo;)Ljet/typeinfo/TypeInfoProjection;");
else if(variance == Variance.OUT_VARIANCE) else if(variance == Variance.OUT_VARIANCE)
v.invokestatic("jet/typeinfo/TypeInfo", "outProjection", "(Ljet/typeinfo/TypeInfo;)Ljet/typeinfo/TypeInfoProjection;"); v.invokestatic("jet/TypeInfo", "outProjection", "(Ljet/TypeInfo;)Ljet/typeinfo/TypeInfoProjection;");
else else
throw new UnsupportedOperationException(variance.toString()); throw new UnsupportedOperationException(variance.toString());
} }
@@ -2635,19 +2635,19 @@ If finally block is present, its last expression is the value of try expression.
if (CodegenUtil.hasTypeInfoField(defaultType)) { if (CodegenUtil.hasTypeInfoField(defaultType)) {
if(!(context instanceof CodegenContext.ConstructorContext)) { if(!(context instanceof CodegenContext.ConstructorContext)) {
v.load(0, TYPE_OBJECT); v.load(0, TYPE_OBJECT);
v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/TypeInfo;");
} }
else { else {
v.load(((ConstructorFrameMap)myFrameMap).getTypeInfoIndex(), TYPE_OBJECT); v.load(((ConstructorFrameMap)myFrameMap).getTypeInfoIndex(), TYPE_OBJECT);
} }
} }
else { else {
v.getstatic(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); v.getstatic(ownerType.getInternalName(), "$typeInfo", "Ljet/TypeInfo;");
} }
} }
else { else {
v.load(0, TYPE_OBJECT); v.load(0, TYPE_OBJECT);
v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getTypeInfo", "()Ljet/typeinfo/TypeInfo;"); v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getTypeInfo", "()Ljet/TypeInfo;");
} }
} }
else { else {
@@ -2656,11 +2656,11 @@ If finally block is present, its last expression is the value of try expression.
descriptor = CodegenUtil.getOuterClassDescriptor(descriptor); descriptor = CodegenUtil.getOuterClassDescriptor(descriptor);
v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getOuterObject", "()Ljet/JetObject;"); v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getOuterObject", "()Ljet/JetObject;");
} }
v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getTypeInfo", "()Ljet/typeinfo/TypeInfo;"); v.invokeinterface(TYPE_JET_OBJECT.getInternalName(), "getTypeInfo", "()Ljet/TypeInfo;");
} }
v.aconst(ownerType); v.aconst(ownerType);
v.iconst(typeParameterDescriptor.getIndex()); v.iconst(typeParameterDescriptor.getIndex());
v.invokevirtual("jet/typeinfo/TypeInfo", "getArgumentType", "(Ljava/lang/Class;I)Ljet/typeinfo/TypeInfo;"); v.invokevirtual("jet/TypeInfo", "getArgumentType", "(Ljava/lang/Class;I)Ljet/TypeInfo;");
return; return;
} }
throw new UnsupportedOperationException("don't know what this type parameter resolves to"); throw new UnsupportedOperationException("don't know what this type parameter resolves to");
@@ -2780,7 +2780,7 @@ If finally block is present, its last expression is the value of try expression.
final String className = "jet/Tuple" + entries.size(); final String className = "jet/Tuple" + entries.size();
Type tupleType = Type.getObjectType(className); Type tupleType = Type.getObjectType(className);
StringBuilder signature = new StringBuilder("(Ljet/typeinfo/TypeInfo;"); StringBuilder signature = new StringBuilder("(Ljet/TypeInfo;");
for (int i = 0; i != entries.size(); ++i) { for (int i = 0; i != entries.size(); ++i) {
signature.append("Ljava/lang/Object;"); signature.append("Ljava/lang/Object;");
} }
@@ -500,7 +500,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) { if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) {
iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(frameMap.getTypeInfoIndex(), JetTypeMapper.TYPE_OBJECT); iv.load(frameMap.getTypeInfoIndex(), JetTypeMapper.TYPE_OBJECT);
iv.invokevirtual(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$setTypeInfo", "(Ljet/typeinfo/TypeInfo;)V"); iv.invokevirtual(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "$setTypeInfo", "(Ljet/TypeInfo;)V");
} }
if(closure != null) { if(closure != null) {
@@ -836,27 +836,27 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
JetType defaultType = descriptor.getDefaultType(); JetType defaultType = descriptor.getDefaultType();
if(CodegenUtil.requireTypeInfoConstructorArg(defaultType)) { if(CodegenUtil.requireTypeInfoConstructorArg(defaultType)) {
if(!CodegenUtil.hasDerivedTypeInfoField(defaultType)) { if(!CodegenUtil.hasDerivedTypeInfoField(defaultType)) {
v.newField(myClass, Opcodes.ACC_PROTECTED, "$typeInfo", "Ljet/typeinfo/TypeInfo;", null, null); v.newField(myClass, Opcodes.ACC_PROTECTED, "$typeInfo", "Ljet/TypeInfo;", null, null);
MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/typeinfo/TypeInfo;", null, null); MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/TypeInfo;", null, null);
if (v.generateCode()) { if (v.generateCode()) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.getfield(owner, "$typeInfo", "Ljet/typeinfo/TypeInfo;"); iv.getfield(owner, "$typeInfo", "Ljet/TypeInfo;");
iv.areturn(JetTypeMapper.TYPE_TYPEINFO); iv.areturn(JetTypeMapper.TYPE_TYPEINFO);
FunctionCodegen.endVisit(iv, "getTypeInfo", myClass); FunctionCodegen.endVisit(iv, "getTypeInfo", myClass);
} }
mv = v.newMethod(myClass, Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL, "$setTypeInfo", "(Ljet/typeinfo/TypeInfo;)V", null, null); mv = v.newMethod(myClass, Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL, "$setTypeInfo", "(Ljet/TypeInfo;)V", null, null);
if (v.generateCode()) { if (v.generateCode()) {
mv.visitCode(); mv.visitCode();
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
iv.load(0, JetTypeMapper.TYPE_OBJECT); iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(1, JetTypeMapper.TYPE_OBJECT); iv.load(1, JetTypeMapper.TYPE_OBJECT);
iv.putfield(owner, "$typeInfo", "Ljet/typeinfo/TypeInfo;"); iv.putfield(owner, "$typeInfo", "Ljet/TypeInfo;");
mv.visitInsn(Opcodes.RETURN); mv.visitInsn(Opcodes.RETURN);
FunctionCodegen.endVisit(iv, "$setTypeInfo", myClass); FunctionCodegen.endVisit(iv, "$setTypeInfo", myClass);
} }
@@ -869,26 +869,26 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
private void genGetStaticGetTypeInfoMethod() { private void genGetStaticGetTypeInfoMethod() {
final MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/typeinfo/TypeInfo;", null, null); final MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/TypeInfo;", null, null);
if (v.generateCode()) { if (v.generateCode()) {
mv.visitCode(); mv.visitCode();
InstructionAdapter v = new InstructionAdapter(mv); InstructionAdapter v = new InstructionAdapter(mv);
String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(); String owner = typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName();
v.getstatic(owner, "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;"); v.getstatic(owner, "$staticTypeInfo", "Ljet/TypeInfo;");
v.areturn(JetTypeMapper.TYPE_TYPEINFO); v.areturn(JetTypeMapper.TYPE_TYPEINFO);
FunctionCodegen.endVisit(v, "getTypeInfo", myClass); FunctionCodegen.endVisit(v, "getTypeInfo", myClass);
} }
} }
private void staticTypeInfoField() { private void staticTypeInfoField() {
v.newField(myClass, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC, "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;", null, null); v.newField(myClass, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC, "$staticTypeInfo", "Ljet/TypeInfo;", null, null);
staticInitializerChunks.add(new CodeChunk() { staticInitializerChunks.add(new CodeChunk() {
@Override @Override
public void generate(InstructionAdapter v) { public void generate(InstructionAdapter v) {
v.aconst(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION)); v.aconst(typeMapper.mapType(descriptor.getDefaultType(), OwnerKind.IMPLEMENTATION));
v.iconst(0); v.iconst(0);
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/typeinfo/TypeInfo;"); v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/TypeInfo;");
v.putstatic(typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName(), "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;"); v.putstatic(typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName(), "$staticTypeInfo", "Ljet/TypeInfo;");
} }
}); });
} }
@@ -3,7 +3,7 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import jet.JetObject; import jet.JetObject;
import jet.typeinfo.TypeInfo; import jet.TypeInfo;
import jet.typeinfo.TypeInfoProjection; import jet.typeinfo.TypeInfoProjection;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -121,11 +121,11 @@ public class NamespaceCodegen {
for(int index = 0; index != context.typeInfoConstantsCount; index++) { for(int index = 0; index != context.typeInfoConstantsCount; index++) {
JetType type = context.reverseTypeInfoConstants.get(index); JetType type = context.reverseTypeInfoConstants.get(index);
String fieldName = "$typeInfoCache$" + index; String fieldName = "$typeInfoCache$" + index;
v.newField(null, ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, fieldName, "Ljet/typeinfo/TypeInfo;", null, null); v.newField(null, ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, fieldName, "Ljet/TypeInfo;", null, null);
MethodVisitor mmv = v.newMethod(null, ACC_PUBLIC | ACC_STATIC | ACC_SYNTHETIC, "$getCachedTypeInfo$" + index, "()Ljet/typeinfo/TypeInfo;", null, null); MethodVisitor mmv = v.newMethod(null, ACC_PUBLIC | ACC_STATIC | ACC_SYNTHETIC, "$getCachedTypeInfo$" + index, "()Ljet/TypeInfo;", null, null);
InstructionAdapter v = new InstructionAdapter(mmv); InstructionAdapter v = new InstructionAdapter(mmv);
v.visitFieldInsn(GETSTATIC, jvmClassName, fieldName, "Ljet/typeinfo/TypeInfo;"); v.visitFieldInsn(GETSTATIC, jvmClassName, fieldName, "Ljet/TypeInfo;");
v.visitInsn(DUP); v.visitInsn(DUP);
Label end = new Label(); Label end = new Label();
v.visitJumpInsn(IFNONNULL, end); v.visitJumpInsn(IFNONNULL, end);
@@ -134,7 +134,7 @@ public class NamespaceCodegen {
generateTypeInfo(context, v, type, state.getTypeMapper(), type); generateTypeInfo(context, v, type, state.getTypeMapper(), type);
v.dup(); v.dup();
v.visitFieldInsn(PUTSTATIC, jvmClassName, fieldName, "Ljet/typeinfo/TypeInfo;"); v.visitFieldInsn(PUTSTATIC, jvmClassName, fieldName, "Ljet/TypeInfo;");
v.visitLabel(end); v.visitLabel(end);
v.visitInsn(ARETURN); v.visitInsn(ARETURN);
FunctionCodegen.endVisit(v, "type info method", namespace); FunctionCodegen.endVisit(v, "type info method", namespace);
@@ -145,21 +145,21 @@ public class NamespaceCodegen {
private static void generateTypeInfo(CodegenContext context, InstructionAdapter v, JetType jetType, JetTypeMapper typeMapper, JetType root) { private static void generateTypeInfo(CodegenContext context, InstructionAdapter v, JetType jetType, JetTypeMapper typeMapper, JetType root) {
String knownTypeInfo = typeMapper.isKnownTypeInfo(jetType); String knownTypeInfo = typeMapper.isKnownTypeInfo(jetType);
if(knownTypeInfo != null) { if(knownTypeInfo != null) {
v.getstatic("jet/typeinfo/TypeInfo", knownTypeInfo, "Ljet/typeinfo/TypeInfo;"); v.getstatic("jet/TypeInfo", knownTypeInfo, "Ljet/TypeInfo;");
return; return;
} }
DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor(); DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor();
if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor) && !JetStandardClasses.getAny().equals(declarationDescriptor)) { if(!jetType.equals(root) && jetType.getArguments().size() == 0 && !(declarationDescriptor instanceof JavaClassDescriptor) && !JetStandardClasses.getAny().equals(declarationDescriptor)) {
// TODO: we need some better checks here // TODO: we need some better checks here
v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$typeInfo", "Ljet/TypeInfo;");
return; return;
} }
boolean hasUnsubstituted = TypeUtils.hasUnsubstitutedTypeParameters(jetType); boolean hasUnsubstituted = TypeUtils.hasUnsubstitutedTypeParameters(jetType);
if(!jetType.equals(root) && !hasUnsubstituted) { if(!jetType.equals(root) && !hasUnsubstituted) {
int typeInfoConstantIndex = context.getTypeInfoConstantIndex(jetType); int typeInfoConstantIndex = context.getTypeInfoConstantIndex(jetType);
v.invokestatic(context.getNamespaceClassName(), "$getCachedTypeInfo$" + typeInfoConstantIndex, "()Ljet/typeinfo/TypeInfo;"); v.invokestatic(context.getNamespaceClassName(), "$getCachedTypeInfo$" + typeInfoConstantIndex, "()Ljet/TypeInfo;");
return; return;
} }
@@ -180,10 +180,10 @@ public class NamespaceCodegen {
ExpressionCodegen.genTypeInfoToProjection(v, argument.getProjectionKind()); ExpressionCodegen.genTypeInfoToProjection(v, argument.getProjectionKind());
v.astore(JetTypeMapper.TYPE_OBJECT); v.astore(JetTypeMapper.TYPE_OBJECT);
} }
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z[Ljet/typeinfo/TypeInfoProjection;)Ljet/typeinfo/TypeInfo;"); v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z[Ljet/typeinfo/TypeInfoProjection;)Ljet/TypeInfo;");
} }
else { else {
v.invokestatic("jet/typeinfo/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/typeinfo/TypeInfo;"); v.invokestatic("jet/TypeInfo", "getTypeInfo", "(Ljava/lang/Class;Z)Ljet/TypeInfo;");
} }
} }
@@ -29,7 +29,7 @@ public class ArrayIterator implements IntrinsicMethod {
JetStandardLibrary standardLibrary = codegen.getState().getStandardLibrary(); JetStandardLibrary standardLibrary = codegen.getState().getStandardLibrary();
if(containingDeclaration.equals(standardLibrary.getArray())) { if(containingDeclaration.equals(standardLibrary.getArray())) {
codegen.generateTypeInfo(funDescriptor.getReturnType().getArguments().get(0).getType(), null); codegen.generateTypeInfo(funDescriptor.getReturnType().getArguments().get(0).getType(), null);
v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;Ljet/typeinfo/TypeInfo;)Ljet/Iterator;"); v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;Ljet/TypeInfo;)Ljet/Iterator;");
return StackValue.onStack(JetTypeMapper.TYPE_ITERATOR); return StackValue.onStack(JetTypeMapper.TYPE_ITERATOR);
} }
else if(containingDeclaration.equals(standardLibrary.getByteArrayClass())) { else if(containingDeclaration.equals(standardLibrary.getByteArrayClass())) {
@@ -17,7 +17,7 @@ public class ValueTypeInfo implements IntrinsicMethod {
@Override @Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) { public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) {
codegen.gen(arguments.get(0), JetTypeMapper.TYPE_JET_OBJECT); codegen.gen(arguments.get(0), JetTypeMapper.TYPE_JET_OBJECT);
v.invokeinterface(JetTypeMapper.TYPE_JET_OBJECT.getInternalName(), "getTypeInfo", "()Ljet/typeinfo/TypeInfo;"); v.invokeinterface(JetTypeMapper.TYPE_JET_OBJECT.getInternalName(), "getTypeInfo", "()Ljet/TypeInfo;");
return StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO); return StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO);
} }
} }
+5 -31
View File
@@ -1,38 +1,12 @@
package jet package jet
package typeinfo { class TypeInfo<out T> {
class TypeInfo<out T> { fun isSubtypeOf(other : TypeInfo<*>) : Boolean
fun isSubtypeOf(other : TypeInfo<*>) : Boolean fun isInstance(obj : Any?) : Boolean
fun isInstance(obj : Any?) : Boolean
}
fun typeinfo<T>() : TypeInfo<T>
fun typeinfo<T>(expression : T) : TypeInfo<T>
} }
package io { fun typeinfo<T>() : TypeInfo<T>
fun print(message : Any?) fun typeinfo<T>(expression : T) : TypeInfo<T>
fun print(message : Int)
fun print(message : Long)
fun print(message : Byte)
fun print(message : Short)
fun print(message : Char)
fun print(message : Boolean)
fun print(message : Float)
fun print(message : Double)
fun println(message : Any?)
fun println(message : Int)
fun println(message : Long)
fun println(message : Byte)
fun println(message : Short)
fun println(message : Char)
fun println(message : Boolean)
fun println(message : Float)
fun println(message : Double)
fun readLine() : String?
}
fun <R> Any.synchronized(block : () -> R) : R fun <R> Any.synchronized(block : () -> R) : R
@@ -77,7 +77,7 @@ public interface Errors {
DiagnosticWithParameterFactory<JetModifierList, JetKeywordToken> REDUNDANT_MODIFIER_IN_GETTER = DiagnosticWithParameterFactory.create(WARNING, "Visibility modifiers are redundant in getter", DiagnosticParameters.MODIFIER); DiagnosticWithParameterFactory<JetModifierList, JetKeywordToken> REDUNDANT_MODIFIER_IN_GETTER = DiagnosticWithParameterFactory.create(WARNING, "Visibility modifiers are redundant in getter", DiagnosticParameters.MODIFIER);
SimplePsiElementOnlyDiagnosticFactory<JetClass> TRAIT_CAN_NOT_BE_FINAL = SimplePsiElementOnlyDiagnosticFactory.create(ERROR, "Trait can not be final"); SimplePsiElementOnlyDiagnosticFactory<JetClass> TRAIT_CAN_NOT_BE_FINAL = SimplePsiElementOnlyDiagnosticFactory.create(ERROR, "Trait can not be final");
SimpleDiagnosticFactory SAFE_CALLS_ARE_NOT_ALLOWED_ON_NAMESPACES = SimpleDiagnosticFactory.create(ERROR, "Safe calls are not allowed on namespaces"); SimpleDiagnosticFactory SAFE_CALLS_ARE_NOT_ALLOWED_ON_NAMESPACES = SimpleDiagnosticFactory.create(ERROR, "Safe calls are not allowed on namespaces");
SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR, "Type checking has run into a recursive problem"); // TODO: message SimpleDiagnosticFactory TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = SimpleDiagnosticFactory.create(ERROR, "Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message
SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "'return' is not allowed here"); SimpleDiagnosticFactory RETURN_NOT_ALLOWED = SimpleDiagnosticFactory.create(ERROR, "'return' is not allowed here");
SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "Projections are not allowed for immediate arguments of a supertype"); SimpleDiagnosticFactory PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "Projections are not allowed for immediate arguments of a supertype");
SimpleDiagnosticFactory LABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING, "There is more than one label with such a name in this scope"); SimpleDiagnosticFactory LABEL_NAME_CLASH = SimpleDiagnosticFactory.create(WARNING, "There is more than one label with such a name in this scope");
@@ -235,10 +235,11 @@ public class JetParsing extends AbstractJetParsing {
IElementType keywordToken = tt(); IElementType keywordToken = tt();
JetNodeType declType = null; JetNodeType declType = null;
if (keywordToken == NAMESPACE_KEYWORD) { // if (keywordToken == NAMESPACE_KEYWORD) {
declType = parseNamespaceBlock(); // declType = parseNamespaceBlock();
} // }
else if (keywordToken == CLASS_KEYWORD || keywordToken == TRAIT_KEYWORD) { // else
if (keywordToken == CLASS_KEYWORD || keywordToken == TRAIT_KEYWORD) {
declType = parseClass(detector.isDetected()); declType = parseClass(detector.isDetected());
} }
else if (keywordToken == FUN_KEYWORD) { else if (keywordToken == FUN_KEYWORD) {
@@ -7,10 +7,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
@@ -120,7 +121,6 @@ public class JetStandardLibrary {
private JetType tuple0Type; private JetType tuple0Type;
private JetType nullableStringType; private JetType nullableStringType;
private NamespaceDescriptor typeInfoNamespace;
private Set<FunctionDescriptor> typeInfoFunction; private Set<FunctionDescriptor> typeInfoFunction;
private JetStandardLibrary(@NotNull Project project) { private JetStandardLibrary(@NotNull Project project) {
@@ -168,9 +168,9 @@ public class JetStandardLibrary {
this.arrayClass = (ClassDescriptor) libraryScope.getClassifier("Array"); this.arrayClass = (ClassDescriptor) libraryScope.getClassifier("Array");
this.iterableClass = (ClassDescriptor) libraryScope.getClassifier("Iterable"); this.iterableClass = (ClassDescriptor) libraryScope.getClassifier("Iterable");
typeInfoNamespace = libraryScope.getNamespace("typeinfo"); // typeInfoNamespace = libraryScope.getNamespace("typeinfo");
this.typeInfoClass = (ClassDescriptor) typeInfoNamespace.getMemberScope().getClassifier("TypeInfo"); this.typeInfoClass = (ClassDescriptor) libraryScope.getClassifier("TypeInfo");
typeInfoFunction = typeInfoNamespace.getMemberScope().getFunctions("typeinfo"); this.typeInfoFunction = libraryScope.getFunctions("typeinfo");
this.byteType = new JetTypeImpl(getByte()); this.byteType = new JetTypeImpl(getByte());
this.charType = new JetTypeImpl(getChar()); this.charType = new JetTypeImpl(getChar());
@@ -297,11 +297,11 @@ public class JetStandardLibrary {
return iterableClass; return iterableClass;
} }
public NamespaceDescriptor getTypeInfoNamespace() { // public NamespaceDescriptor getTypeInfoNamespace() {
initStdClasses(); // initStdClasses();
return typeInfoNamespace; // return typeInfoNamespace;
} // }
//
public ClassDescriptor getTypeInfo() { public ClassDescriptor getTypeInfo() {
initStdClasses(); initStdClasses();
return typeInfoClass; return typeInfoClass;
@@ -1,6 +1,5 @@
package Foo { package Foo
fun bar() = 610 fun bar() = 610
}
fun box(): String { fun box(): String {
return if (Foo.bar() == 610) "OK" else "fail" return if (Foo.bar() == 610) "OK" else "fail"
@@ -1,7 +1,7 @@
class Point() { class Point() {
} }
fun foo() : typeinfo.TypeInfo<Point> { fun foo() : TypeInfo<Point> {
val p = Point(); val p = Point();
return typeinfo.typeinfo<Point>(p); return typeinfo<Point>(p);
} }
@@ -1,7 +1,7 @@
class Simple { class Simple {
{ {
jet.typeinfo.TypeInfo blabla = null; jet.TypeInfo blabla = null;
new Impossible<String>(blabla); new Impossible<String>(blabla);
} }
} }
@@ -1,7 +1,7 @@
class GenericArray { class GenericArray {
public static void ggff() { public static void ggff() {
jet.typeinfo.TypeInfo noise = null; jet.TypeInfo noise = null;
String[] s = namespace.ffgg(noise, new String[0]); String[] s = namespace.ffgg(noise, new String[0]);
} }
} }
@@ -4,7 +4,7 @@ import java.util.ArrayList;
class ListOfT { class ListOfT {
public static void check() { public static void check() {
jet.typeinfo.TypeInfo nobodyCaresAboutTypeinfo = null; jet.TypeInfo nobodyCaresAboutTypeinfo = null;
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
List<String> r = namespace.listOfT(nobodyCaresAboutTypeinfo, list); List<String> r = namespace.listOfT(nobodyCaresAboutTypeinfo, list);
} }
@@ -4,7 +4,7 @@ import java.math.BigDecimal;
class MapOfKString { class MapOfKString {
public static void gfgdgfg() { public static void gfgdgfg() {
jet.typeinfo.TypeInfo useless = null; jet.TypeInfo useless = null;
Map<BigDecimal, String> map = new HashMap<BigDecimal, String>(); Map<BigDecimal, String> map = new HashMap<BigDecimal, String>();
@@ -3,6 +3,6 @@ class Question {
// id2 is to prevent java type parameter type inference // id2 is to prevent java type parameter type inference
static <T> T id2(T p) { return p; } static <T> T id2(T p) { return p; }
{ {
java.util.List<String> s = id2(namespace.id((jet.typeinfo.TypeInfo) null, null)); java.util.List<String> s = id2(namespace.id((jet.TypeInfo) null, null));
} }
} }
@@ -3,6 +3,6 @@ class Question {
// id2 is to prevent java type parameter type inference // id2 is to prevent java type parameter type inference
static <T> T id2(T p) { return p; } static <T> T id2(T p) { return p; }
{ {
String s = id2(namespace.id((jet.typeinfo.TypeInfo) null, null)); String s = id2(namespace.id((jet.TypeInfo) null, null));
} }
} }
@@ -1,3 +1,4 @@
// FILE: a.kt
// +JDK // +JDK
package abstract package abstract
@@ -180,7 +181,8 @@ enum class MyEnum() {
abstract enum class MyAbstractEnum() {} abstract enum class MyAbstractEnum() {}
package MyNamespace { // FILE: b.kt
package MyNamespace
//properties //properties
val <!MUST_BE_INITIALIZED!>a<!>: Int val <!MUST_BE_INITIALIZED!>a<!>: Int
val a1: Int = 1 val a1: Int = 1
@@ -222,8 +224,8 @@ package MyNamespace {
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {} var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {}
}
// FILE: c.kt
//creating an instance //creating an instance
abstract class B1( abstract class B1(
val i: Int, val i: Int,
@@ -1,8 +1,9 @@
package example; // FILE: a.kt
package example.ns
package ns {
val y : Any? = 2 val y : Any? = 2
}
// FILE: b.kt
package example
object Obj { object Obj {
val y : Any? = 2 val y : Any? = 2
@@ -1,4 +1,5 @@
package boundsWithSubstitutors { // FILE: a.kt
package boundsWithSubstitutors
open class A<T> open class A<T>
class B<X : A<X>>() class B<X : A<X>>()
@@ -13,8 +14,7 @@ package boundsWithSubstitutors {
val b0 = X<Any, <!UPPER_BOUND_VIOLATED!>Any?<!>> val b0 = X<Any, <!UPPER_BOUND_VIOLATED!>Any?<!>>
val b1 = X<Any, X<A<C>, <!UPPER_BOUND_VIOLATED!>String<!>>> val b1 = X<Any, X<A<C>, <!UPPER_BOUND_VIOLATED!>String<!>>>
} // FILE: b.kt
open class A {} open class A {}
open class B<T : A>() open class B<T : A>()
@@ -1,9 +1,9 @@
// FILE: a.kt
// +JDK // +JDK
package html
import java.util.* import java.util.*
package html {
abstract class Factory<T> { abstract class Factory<T> {
abstract fun create() : T abstract fun create() : T
} }
@@ -85,9 +85,9 @@ package html {
return html return html
} }
} // FILE: b.kt
package foo { package foo
import html.* import html.*
@@ -120,4 +120,3 @@ fun result(args : Array<String>) =
} }
} }
} }
}
@@ -1,3 +1,4 @@
// FILE: b.kt
// http://youtrack.jetbrains.net/issue/KT-424 // http://youtrack.jetbrains.net/issue/KT-424
class A { class A {
@@ -13,7 +14,8 @@ class A {
} }
} }
package deepSpace { // FILE: b.kt
package deepSpace
<!CONFLICTING_OVERLOADS!>fun c(<!UNUSED_PARAMETER!>s<!>: String)<!> { <!CONFLICTING_OVERLOADS!>fun c(<!UNUSED_PARAMETER!>s<!>: String)<!> {
} }
@@ -27,28 +29,25 @@ package deepSpace {
<!CONFLICTING_OVERLOADS!>fun d(<!UNUSED_PARAMETER!>s<!>: String)<!> { <!CONFLICTING_OVERLOADS!>fun d(<!UNUSED_PARAMETER!>s<!>: String)<!> {
} }
} }
}
// FILE: b.kt
// check no error in overload in different namespaces // check no error in overload in different namespaces
package ns1 { package ns1
fun e() = 1 fun e() = 1
}
package ns2 { // FILE: b.kt
package ns2
fun e() = 1 fun e() = 1
}
package ns3 { // FILE: b.kt
package ns1 { package ns3.ns1
fun e() = 1 fun e() = 1
}
}
// FILE: b.kt
// check same rules apply for ext functions // check same rules apply for ext functions
package extensionFunctions { package extensionFunctions
<!CONFLICTING_OVERLOADS!>fun Int.qwe(<!UNUSED_PARAMETER!>a<!>: Float)<!> = 1 <!CONFLICTING_OVERLOADS!>fun Int.qwe(<!UNUSED_PARAMETER!>a<!>: Float)<!> = 1
<!CONFLICTING_OVERLOADS!>fun Int.qwe(<!UNUSED_PARAMETER!>a<!>: Float)<!> = 2 <!CONFLICTING_OVERLOADS!>fun Int.qwe(<!UNUSED_PARAMETER!>a<!>: Float)<!> = 2
@@ -56,19 +55,19 @@ package extensionFunctions {
fun Int.rty() = 3 fun Int.rty() = 3
fun String.rty() = 4 fun String.rty() = 4
}
// FILE: b.kt
// check no error when regular function and extension function have same name // check no error when regular function and extension function have same name
package extensionAndRegular { package extensionAndRegular
fun who() = 1 fun who() = 1
fun Int.who() = 1 fun Int.who() = 1
}
// FILE: b.kt
// constructor vs. fun overload // constructor vs. fun overload
package constructorVsFun { package constructorVsFun
class <!CONFLICTING_OVERLOADS!>a()<!> { } class <!CONFLICTING_OVERLOADS!>a()<!> { }
<!CONFLICTING_OVERLOADS!>fun a()<!> = 1 <!CONFLICTING_OVERLOADS!>fun a()<!> = 1
@@ -93,5 +92,4 @@ package constructorVsFun {
class object { class object {
class ololo() { } class ololo() { }
} }
} }
}
@@ -1,3 +1,4 @@
// FILE: b.kt
trait A<in T> {} trait A<in T> {}
trait B<T> : A<Int> {} trait B<T> : A<Int> {}
trait C<T> : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>B<T>, A<T><!> {} trait C<T> : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>B<T>, A<T><!> {}
@@ -13,30 +14,30 @@ trait BB1 : BA1<Int> {}
trait BB2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>BA1<Any>, BB1<!> {} trait BB2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>BA1<Any>, BB1<!> {}
package x { // FILE: b.kt
package x
trait AA1<out T> {} trait AA1<out T> {}
trait AB1 : AA1<Int> {} trait AB1 : AA1<Int> {}
trait AB3 : AA1<Comparable<Int>> {} trait AB3 : AA1<Comparable<Int>> {}
trait AB2 : AA1<Number>, AB1, AB3 {} trait AB2 : AA1<Number>, AB1, AB3 {}
}
package x2 { // FILE: b.kt
package x2
trait AA1<out T> {} trait AA1<out T> {}
trait AB1 : AA1<Any> {} trait AB1 : AA1<Any> {}
trait AB3 : AA1<Comparable<Int>> {} trait AB3 : AA1<Comparable<Int>> {}
trait AB2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>AA1<Number>, AB1, AB3<!> {} trait AB2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>AA1<Number>, AB1, AB3<!> {}
}
package x3 { // FILE: b.kt
package x3
trait AA1<in T> {} trait AA1<in T> {}
trait AB1 : AA1<Any> {} trait AB1 : AA1<Any> {}
trait AB3 : AA1<Comparable<Int>> {} trait AB3 : AA1<Comparable<Int>> {}
trait AB2 : AA1<Number>, AB1, AB3 {} trait AB2 : AA1<Number>, AB1, AB3 {}
}
package sx2 { // FILE: b.kt
package sx2
trait AA1<in T> {} trait AA1<in T> {}
trait AB1 : AA1<Int> {} trait AB1 : AA1<Int> {}
trait AB3 : AA1<Comparable<Int>> {} trait AB3 : AA1<Comparable<Int>> {}
trait AB2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>AA1<Number>, AB1, AB3<!> {} trait AB2 : <!INCONSISTENT_TYPE_PARAMETER_VALUES!>AA1<Number>, AB1, AB3<!> {}
}
@@ -1,23 +1,23 @@
// FILE: b.kt
// KT-355 Resolve imports after all symbols are built // KT-355 Resolve imports after all symbols are built
package a { package a
import b.* import b.*
val x : X = X() val x : X = X()
}
package b { // FILE: b.kt
package b
class X() { class X() {
} }
}
package c { // FILE: b.kt
package c
import d.X import d.X
val x : X = X() val x : X = X()
}
package d { // FILE: b.kt
package d
class X() { class X() {
} }
}
@@ -1,8 +1,8 @@
// FILE: b.kt
package root.a
// FILE: b.kt
package root package root
package a {
}
val x = <!EXPRESSION_EXPECTED_NAMESPACE_FOUND!>a<!> val x = <!EXPRESSION_EXPECTED_NAMESPACE_FOUND!>a<!>
val y2 = <!NAMESPACE_IS_NOT_AN_EXPRESSION!>package<!> val y2 = <!NAMESPACE_IS_NOT_AN_EXPRESSION!>package<!>
@@ -1,26 +1,29 @@
// FILE: b.kt
// +JDK // +JDK
package foobar
package a { package foobar.a
import java.* import java.*
val a : util.List<Int>? = null val a : util.List<Int>? = null
val a1 : <!UNRESOLVED_REFERENCE!>List<!><Int>? = null val a1 : <!UNRESOLVED_REFERENCE!>List<!><Int>? = null
} // FILE: b.kt
package foobar
abstract class Foo<T>() { abstract class Foo<T>() {
abstract val x : T<Int> abstract val x : T<Int>
} }
package a { // FILE: b.kt
package foobar.a
import java.util.* import java.util.*
val b : List<Int>? = a val b : List<Int>? = a
val b1 : <!UNRESOLVED_REFERENCE!>util<!>.List<Int>? = a val b1 : <!UNRESOLVED_REFERENCE!>util<!>.List<Int>? = a
}
// FILE: b.kt
package foobar
val x1 = a.a val x1 = a.a
val y1 = a.b val y1 = a.b
@@ -1,4 +1,5 @@
package toplevelObjectDeclarations { // FILE: f.kt
package toplevelObjectDeclarations
open class Foo(y : Int) { open class Foo(y : Int) {
open fun foo() : Int = 1 open fun foo() : Int = 1
} }
@@ -26,9 +27,9 @@ package toplevelObjectDeclarations {
} }
val z = y.foo() val z = y.foo()
}
package nestedObejcts { // FILE: f.kt
package nestedObejcts
object A { object A {
val b = B val b = B
val d = A.B.A val d = A.B.A
@@ -56,9 +57,10 @@ package nestedObejcts {
val c = A.B val c = A.B
val d = A.B.A val d = A.B.A
val e = B.<!UNRESOLVED_REFERENCE!>A<!>.B val e = B.<!UNRESOLVED_REFERENCE!>A<!>.B
}
package localObjects { // FILE: f.kt
package localObjects
object A { object A {
val x : Int = 0 val x : Int = 0
} }
@@ -80,4 +82,3 @@ package localObjects {
} }
val bb = <!UNRESOLVED_REFERENCE!>B<!>.foo() val bb = <!UNRESOLVED_REFERENCE!>B<!>.foo()
}
@@ -1,6 +1,5 @@
package override // FILE: f.kt
package override.normal
package normal {
trait MyTrait { trait MyTrait {
fun foo() fun foo()
val pr : Unit val pr : Unit
@@ -49,9 +48,10 @@ package normal {
override fun bar() {} override fun bar() {}
override val prr : Unit = #() override val prr : Unit = #()
} }
}
package generics { // FILE: f.kt
package override.generics
trait MyTrait<T> { trait MyTrait<T> {
fun foo(t: T) : T fun foo(t: T) : T
} }
@@ -109,5 +109,4 @@ package generics {
fun foo(t: T) = t fun foo(t: T) = t
fun bar(t: T) = t fun bar(t: T) = t
val <R> pr : T = t val <R> pr : T = t
} }
}
@@ -1,3 +1,4 @@
// FILE: f.kt
class Dup { class Dup {
fun Dup() : Unit { fun Dup() : Unit {
this<!AMBIGUOUS_LABEL!>@Dup<!> this<!AMBIGUOUS_LABEL!>@Dup<!>
@@ -21,7 +22,8 @@ fun foo1() : Unit {
this<!UNRESOLVED_REFERENCE!>@a<!> this<!UNRESOLVED_REFERENCE!>@a<!>
} }
package closures { // FILE: f.kt
package closures
class A(val a:Int) { class A(val a:Int) {
class B() { class B() {
@@ -37,5 +39,4 @@ package closures {
return (@a{Double.() -> this@a : Double + this@xx : Char}) return (@a{Double.() -> this@a : Double + this@xx : Char})
} }
} }
} }
}
@@ -1,42 +1,40 @@
package a { // FILE: f.kt
package a
val foo = bar() val foo = bar()
fun bar() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>foo<!> fun bar() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>foo<!>
}
package b { // FILE: f.kt
package b
fun foo() = bar() fun foo() = bar()
fun bar() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>foo()<!> fun bar() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>foo()<!>
}
package c { // FILE: f.kt
package c
fun bazz() = bar() fun bazz() = bar()
fun foo() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>bazz()<!> fun foo() = <!TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM!>bazz()<!>
fun bar() = foo() fun bar() = foo()
}
package ok { // FILE: f.kt
package a { package ok.a
val foo = bar() val foo = bar()
fun bar() : Int = foo fun bar() : Int = foo
}
package b { // FILE: f.kt
package ok.b
fun foo() : Int = bar() fun foo() : Int = bar()
fun bar() = foo() fun bar() = foo()
}
package c { // FILE: f.kt
package ok.c
fun bazz() = bar() fun bazz() = bar()
fun foo() : Int = bazz() fun foo() : Int = bazz()
fun bar() = foo() fun bar() = foo()
}
}
@@ -1,16 +1,15 @@
package redeclarations { // FILE: f.kt
package redeclarations
object <!REDECLARATION, REDECLARATION!>A<!> { object <!REDECLARATION, REDECLARATION!>A<!> {
val x : Int = 0 val x : Int = 0
val A = 1 val A = 1
} }
package <!REDECLARATION!>A<!> { class <!REDECLARATION!>A<!> {}
class A {}
}
class <!REDECLARATION, REDECLARATION!>A<!> {}
val <!REDECLARATION!>A<!> = 1 val <!REDECLARATION!>A<!> = 1
} // FILE: f.kt
package redeclarations.<!REDECLARATION, REDECLARATION!>A<!>
class A {}
@@ -1,3 +1,4 @@
// FILE: f.kt
// +JDK // +JDK
import java.* import java.*
@@ -49,6 +50,6 @@ fun test(<!UNUSED_PARAMETER!>l<!> : java.util.List<Int>) {
} }
package xxx { // FILE: f.kt
import java.lang.Class; package xxx
} import java.lang.Class;
@@ -1,9 +1,11 @@
// FILE: f.kt
class A { class A {
} }
package n { // FILE: f.kt
package n
class B class B
} // FILE: f.kt
abstract class XXX() { abstract class XXX() {
abstract val a : Int abstract val a : Int
abstract val a1 : package.<!UNRESOLVED_REFERENCE!>Int<!> abstract val a1 : package.<!UNRESOLVED_REFERENCE!>Int<!>
@@ -1,5 +1,3 @@
package customGetValGlobal { package customGetValGlobal
val zz = 1 val zz = 1
get() = $zz * 2 get() = $zz * 2
}
@@ -1,4 +1,6 @@
// FILE: b.kt
// +JDK // +JDK
package outer
fun Int?.optint() : Unit {} fun Int?.optint() : Unit {}
val Int?.optval : Unit = #() val Int?.optval : Unit = #()
@@ -39,7 +41,10 @@ val <T> T.<!MUST_BE_INITIALIZED!>foo<!> : T
fun Int.foo() = this fun Int.foo() = this
package null_safety { // FILE: b.kt
package null_safety
import outer.*
fun parse(<!UNUSED_PARAMETER!>cmd<!>: String): Command? { return null } fun parse(<!UNUSED_PARAMETER!>cmd<!>: String): Command? { return null }
class Command() { class Command() {
@@ -69,5 +74,3 @@ package null_safety {
if (command == null) 1 if (command == null) 1
} }
}
@@ -1,21 +1,8 @@
// FILE: this.kt
// KT-362 Don't allow autocasts on vals that are not internal // KT-362 Don't allow autocasts on vals that are not internal
package example; package example;
package test {
public class Public() {
public val public : Int? = 1;
protected val protected : Int? = 1;
internal protected val i_protected : Int? = 1;
val internal : Int? = 1
}
internal class Internal() {
public val public : Int? = 1;
protected val protected : Int? = 1;
internal protected val i_protected : Int? = 1;
val internal : Int? = 1
}
}
fun test() { fun test() {
val p = test.Public() val p = test.Public()
if (p.public is Int) <!AUTOCAST_IMPOSSIBLE!>p.public<!> + 1 if (p.public is Int) <!AUTOCAST_IMPOSSIBLE!>p.public<!> + 1
@@ -27,4 +14,21 @@ fun test() {
if (i.protected is Int) <!AUTOCAST_IMPOSSIBLE!>i.protected<!> + 1 if (i.protected is Int) <!AUTOCAST_IMPOSSIBLE!>i.protected<!> + 1
if (i.i_protected is Int) i.i_protected + 1 if (i.i_protected is Int) i.i_protected + 1
if (i.internal is Int) i.internal + 1 if (i.internal is Int) i.internal + 1
} }
// FILE: other.kt
package test
public class Public() {
public val public : Int? = 1;
protected val protected : Int? = 1;
internal protected val i_protected : Int? = 1;
val internal : Int? = 1
}
internal class Internal() {
public val public : Int? = 1;
protected val protected : Int? = 1;
internal protected val i_protected : Int? = 1;
val internal : Int? = 1
}
@@ -1,14 +1,14 @@
package jet121 { package jet121
fun box() : String {
val answer = apply("OK") { String.() : Int ->
get(0)
length
}
return if (answer == 2) "OK" else "FAIL" fun box() : String {
} val answer = apply("OK") { String.() : Int ->
get(0)
length
}
fun apply(arg:String, f : String.() -> Int) : Int { return if (answer == 2) "OK" else "FAIL"
return arg.f() }
}
fun apply(arg:String, f : String.() -> Int) : Int {
return arg.f()
} }
@@ -1,7 +1,9 @@
// FILE: this.kt
// KT-26 Import namespaces defined in this file // KT-26 Import namespaces defined in this file
package foo
package foo { import bar.* // Must not be an error
import bar.* // Must not be an error
}
package bar {} // FILE: other.kt
package bar
@@ -1,10 +1,12 @@
// FILE: a.kt
// KT-26 Import namespaces defined in this file // KT-26 Import namespaces defined in this file
import html.* // Must not be an error import html.* // Must not be an error
package html { // FILE: b.kt
abstract class Factory<T> { package html
fun create() : T? = null
} abstract class Factory<T> {
fun create() : T? = null
} }
@@ -1,12 +1,12 @@
// KT-716 Type inference failed // KT-716 Type inference failed
// +JDK // +JDK
fun <T> typeinfo.TypeInfo<T>.getJavaClass() : java.lang.Class<T> { fun <T> TypeInfo<T>.getJavaClass() : java.lang.Class<T> {
val t : java.lang.Object = this <!CAST_NEVER_SUCCEEDS!>as<!> java.lang.Object val t : java.lang.Object = this <!CAST_NEVER_SUCCEEDS!>as<!> java.lang.Object
return <!UNCHECKED_CAST!>t.getClass() as java.lang.Class<T><!> // inferred type is Object but Serializable was expected return <!UNCHECKED_CAST!>t.getClass() as java.lang.Class<T><!> // inferred type is Object but Serializable was expected
} }
fun getJavaClass<T>() = typeinfo.typeinfo<T>.getJavaClass() fun getJavaClass<T>() = typeinfo<T>.getJavaClass()
fun main(args : Array<String>) { fun main(args : Array<String>) {
System.out?.println(getJavaClass<String>) System.out?.println(getJavaClass<String>)
@@ -1,4 +1,4 @@
//FILE:a.kt // FILE:a.kt
package a package a
import b.B //class import b.B //class
@@ -23,7 +23,7 @@ fun test(arg: B) {
f.f() f.f()
} }
//FILE:b.kt // FILE:b.kt
package b package b
class B() {} class B() {}
+29 -15
View File
@@ -4,19 +4,33 @@ JetFile: FileStart_ERR.jet
<empty list> <empty list>
PsiErrorElement:Expecting namespace or top level declaration PsiErrorElement:Expecting namespace or top level declaration
PsiElement(DIV)('/') PsiElement(DIV)('/')
NAMESPACE PsiErrorElement:Expecting namespace or top level declaration
NAMESPACE_HEADER PsiElement(namespace)('package')
PsiElement(namespace)('package') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') MODIFIER_LIST
REFERENCE_EXPRESSION ANNOTATION_ENTRY
PsiElement(IDENTIFIER)('foo') CONSTRUCTOR_CALLEE
PsiElement(DOT)('.') TYPE_REFERENCE
PsiElement(IDENTIFIER)('bar') USER_TYPE
PsiErrorElement:A namespace block in '{...}' expected USER_TYPE
<empty list> REFERENCE_EXPRESSION
PsiWhiteSpace('\n') PsiElement(IDENTIFIER)('foo')
IMPORT_DIRECTIVE PsiElement(DOT)('.')
PsiElement(import)('import') REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace('\n')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('import')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
REFERENCE_EXPRESSION ANNOTATION_ENTRY
PsiElement(IDENTIFIER)('foo') CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiErrorElement:Expecting namespace or top level declaration
<empty list>
-29
View File
@@ -1,29 +0,0 @@
package foo.bar.goo
import foo as bar
package foof {
import foo.bar.*;
class Foo {}
package bar {
class Bar {}
package ns {
class X
class Y
}
}
}
class Bar<T> {}
package foo {}
package bar {
import sdf
}
-146
View File
@@ -1,146 +0,0 @@
JetFile: NamespaceBlock.jet
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiElement(IDENTIFIER)('goo')
PsiWhiteSpace('\n\n')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(as)('as')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace('\n\n')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foof')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiElement(MUL)('*')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n\n ')
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Foo')
PsiWhiteSpace(' ')
TYPE_PARAMETER_LIST
<empty list>
CLASS_BODY
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Bar')
PsiWhiteSpace(' ')
TYPE_PARAMETER_LIST
<empty list>
CLASS_BODY
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('ns')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('X')
PsiWhiteSpace('\n\n ')
TYPE_PARAMETER_LIST
<empty list>
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Y')
PsiWhiteSpace('\n ')
TYPE_PARAMETER_LIST
<empty list>
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n\n')
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Bar')
TYPE_PARAMETER_LIST
PsiElement(LT)('<')
TYPE_PARAMETER
PsiElement(IDENTIFIER)('T')
PsiElement(GT)('>')
PsiWhiteSpace(' ')
CLASS_BODY
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
NAMESPACE_BODY
<empty list>
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('sdf')
PsiWhiteSpace('\n\n')
PsiElement(RBRACE)('}')
+37 -31
View File
@@ -2,37 +2,43 @@ JetFile: NamespaceBlockFirst.jet
NAMESPACE NAMESPACE
NAMESPACE_HEADER NAMESPACE_HEADER
<empty list> <empty list>
NAMESPACE PsiErrorElement:Expecting namespace or top level declaration
NAMESPACE_HEADER PsiElement(namespace)('package')
PsiElement(namespace)('package') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') MODIFIER_LIST
PsiElement(IDENTIFIER)('foobar') ANNOTATION_ENTRY
PsiWhiteSpace(' ') CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foobar')
PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
NAMESPACE_BODY PROPERTY
PROPERTY PsiElement(val)('val')
PsiElement(val)('val') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
PROPERTY
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('b')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foobar')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a') PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ') PsiWhiteSpace('\n')
PsiElement(EQ)('=') PsiErrorElement:Expecting namespace or top level declaration
PsiWhiteSpace(' ')
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
PROPERTY
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('b')
PsiWhiteSpace(' ')
PsiElement(EQ)('=')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foobar')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
@@ -1,42 +0,0 @@
package foo.bar.goo
import foo as
import foo.
import foo.bar.
import foo. as bar
package foof {
import foo.bar.* as bar
import foo as ;
import foo. ;
import foo.bar. ;
import foo. as bar ;
import foo.bar.* as bar ;
import foo.bar.* as ;
package foo
class Foo {}
package {
class Bar {}
package ns {
class X
class Y
}
}
}
dsfgd
class Bar<T> {}
package foo
package {}
package bar {
import sdf
}
@@ -1,318 +0,0 @@
JetFile: NamespaceBlock_ERR.jet
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiElement(IDENTIFIER)('goo')
PsiWhiteSpace('\n\n')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(as)('as')
PsiWhiteSpace('\n')
PsiElement(IDENTIFIER)('import')
PsiWhiteSpace(' ')
NAMESPACE
MODIFIER_LIST
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
PsiWhiteSpace('\n')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('import')
PsiWhiteSpace(' ')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
USER_TYPE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiWhiteSpace('\n')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('import')
PsiWhiteSpace(' ')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiErrorElement:Expecting type name
PsiElement(as)('as')
PsiWhiteSpace(' ')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace('\n\n')
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foof')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiElement(MUL)('*')
PsiWhiteSpace(' ')
PsiErrorElement:Cannot rename a all imported items to one identifier
PsiElement(as)('as')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace('\n ')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
PsiElement(as)('as')
PsiErrorElement:Expecting identifier
<empty list>
PsiWhiteSpace(' ')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiErrorElement:Qualified name must be a '.'-separated identifier list
<empty list>
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiErrorElement:Qualified name must be a '.'-separated identifier list
<empty list>
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiErrorElement:Qualified name must be a '.'-separated identifier list
<empty list>
PsiElement(as)('as')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiElement(MUL)('*')
PsiWhiteSpace(' ')
PsiErrorElement:Cannot rename a all imported items to one identifier
PsiElement(as)('as')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ')
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
DOT_QUALIFIED_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
PsiElement(MUL)('*')
PsiWhiteSpace(' ')
PsiErrorElement:Cannot rename a all imported items to one identifier
PsiElement(as)('as')
PsiWhiteSpace(' ')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n\n ')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
PsiErrorElement:A namespace block in '{...}' expected
<empty list>
PsiWhiteSpace('\n\n ')
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Foo')
PsiWhiteSpace(' ')
TYPE_PARAMETER_LIST
<empty list>
CLASS_BODY
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiErrorElement:Expecting namespace name
<empty list>
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Bar')
PsiWhiteSpace(' ')
TYPE_PARAMETER_LIST
<empty list>
CLASS_BODY
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('ns')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('X')
PsiWhiteSpace('\n\n ')
TYPE_PARAMETER_LIST
<empty list>
CLASS
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Y')
PsiWhiteSpace('\n ')
TYPE_PARAMETER_LIST
<empty list>
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
CLASS
MODIFIER_LIST
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('dsfgd')
PsiWhiteSpace('\n\n')
PsiElement(class)('class')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('Bar')
TYPE_PARAMETER_LIST
PsiElement(LT)('<')
TYPE_PARAMETER
PsiElement(IDENTIFIER)('T')
PsiElement(GT)('>')
PsiWhiteSpace(' ')
CLASS_BODY
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
PsiErrorElement:A namespace block in '{...}' expected
<empty list>
PsiWhiteSpace('\n\n')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiErrorElement:Expecting namespace name
<empty list>
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
NAMESPACE_BODY
<empty list>
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
NAMESPACE
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
IMPORT_DIRECTIVE
PsiElement(import)('import')
PsiWhiteSpace(' ')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('sdf')
PsiWhiteSpace('\n\n')
PsiElement(RBRACE)('}')
+1 -9
View File
@@ -1,9 +1 @@
public [a] package name; public [a] package name
[a] package a {
val foo
private package b {
}
}
+1 -44
View File
@@ -16,47 +16,4 @@ JetFile: NamespaceModifiers.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(namespace)('package') PsiElement(namespace)('package')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('name') PsiElement(IDENTIFIER)('name')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n\n')
NAMESPACE
MODIFIER_LIST
ANNOTATION
PsiElement(LBRACKET)('[')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('a')
PsiElement(RBRACKET)(']')
PsiWhiteSpace(' ')
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
NAMESPACE_BODY
PROPERTY
PsiElement(val)('val')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace('\n\n ')
NAMESPACE
MODIFIER_LIST
PsiElement(private)('private')
PsiWhiteSpace(' ')
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('b')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n\n ')
NAMESPACE_BODY
<empty list>
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
+102 -95
View File
@@ -16,112 +16,119 @@ JetFile: RootNamespace.jet
PsiWhiteSpace('\n\n') PsiWhiteSpace('\n\n')
TYPE_PARAMETER_LIST TYPE_PARAMETER_LIST
<empty list> <empty list>
NAMESPACE PsiErrorElement:Expecting namespace or top level declaration
NAMESPACE_HEADER PsiElement(namespace)('package')
PsiElement(namespace)('package') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') MODIFIER_LIST
REFERENCE_EXPRESSION ANNOTATION_ENTRY
PsiElement(IDENTIFIER)('foo') CONSTRUCTOR_CALLEE
PsiElement(DOT)('.') TYPE_REFERENCE
PsiElement(IDENTIFIER)('bar') USER_TYPE
PsiWhiteSpace(' ') USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiWhiteSpace(' ')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(LBRACE)('{') PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
NAMESPACE_BODY FUN
FUN PsiElement(fun)('fun')
PsiElement(fun)('fun') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') PsiElement(IDENTIFIER)('foo')
PsiElement(IDENTIFIER)('foo') VALUE_PARAMETER_LIST
VALUE_PARAMETER_LIST PsiElement(LPAR)('(')
PsiElement(LPAR)('(') PsiElement(RPAR)(')')
PsiElement(RPAR)(')') PsiWhiteSpace(' ')
PsiWhiteSpace(' ') BLOCK
BLOCK PsiElement(LBRACE)('{')
PsiElement(LBRACE)('{') PsiWhiteSpace('\n ')
PsiWhiteSpace('\n ') DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION ROOT_NAMESPACE
DOT_QUALIFIED_EXPRESSION PsiElement(namespace)('package')
ROOT_NAMESPACE
PsiElement(namespace)('package')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.') PsiElement(DOT)('.')
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('X') PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace('\n ') PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('X')
PsiWhiteSpace('\n ')
DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION ROOT_NAMESPACE
DOT_QUALIFIED_EXPRESSION PsiElement(namespace)('package')
ROOT_NAMESPACE
PsiElement(namespace)('package')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.') PsiElement(DOT)('.')
CALL_EXPRESSION REFERENCE_EXPRESSION
REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('foo')
PsiElement(IDENTIFIER)('X') PsiElement(DOT)('.')
VALUE_ARGUMENT_LIST REFERENCE_EXPRESSION
PsiElement(LPAR)('(') PsiElement(IDENTIFIER)('bar')
PsiElement(RPAR)(')') PsiElement(DOT)('.')
PsiWhiteSpace('\n ') CALL_EXPRESSION
WHEN REFERENCE_EXPRESSION
PsiElement(when)('when') PsiElement(IDENTIFIER)('X')
PsiWhiteSpace(' ') VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(') PsiElement(LPAR)('(')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('e')
PsiElement(RPAR)(')') PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
WHEN
PsiElement(when)('when')
PsiWhiteSpace(' ')
PsiElement(LPAR)('(')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('e')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
WHEN_ENTRY
WHEN_CONDITION_IS_PATTERN
PsiElement(is)('is')
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(LBRACE)('{') DECOMPOSER_PATTERN
PsiWhiteSpace('\n ') DOT_QUALIFIED_EXPRESSION
WHEN_ENTRY DOT_QUALIFIED_EXPRESSION
WHEN_CONDITION_IS_PATTERN
PsiElement(is)('is')
PsiWhiteSpace(' ')
DECOMPOSER_PATTERN
DOT_QUALIFIED_EXPRESSION DOT_QUALIFIED_EXPRESSION
DOT_QUALIFIED_EXPRESSION ROOT_NAMESPACE
DOT_QUALIFIED_EXPRESSION PsiElement(namespace)('package')
ROOT_NAMESPACE
PsiElement(namespace)('package')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiElement(DOT)('.')
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
PsiElement(DOT)('.') PsiElement(DOT)('.')
REFERENCE_EXPRESSION REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('X') PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ') PsiElement(DOT)('.')
DECOMPOSER_ARGUMENT_LIST REFERENCE_EXPRESSION
PsiElement(HASH)('#') PsiElement(IDENTIFIER)('bar')
PsiElement(LPAR)('(') PsiElement(DOT)('.')
TUPLE_PATTERN_ENTRY REFERENCE_EXPRESSION
TYPE_PATTERN PsiElement(IDENTIFIER)('X')
TYPE_REFERENCE PsiWhiteSpace(' ')
USER_TYPE DECOMPOSER_ARGUMENT_LIST
REFERENCE_EXPRESSION PsiElement(HASH)('#')
PsiElement(IDENTIFIER)('x') PsiElement(LPAR)('(')
PsiElement(RPAR)(')') TUPLE_PATTERN_ENTRY
PsiWhiteSpace(' ') TYPE_PATTERN
PsiElement(ARROW)('->') TYPE_REFERENCE
PsiWhiteSpace(' ') USER_TYPE
BLOCK REFERENCE_EXPRESSION
PsiElement(LBRACE)('{') PsiElement(IDENTIFIER)('x')
PsiElement(RBRACE)('}') PsiElement(RPAR)(')')
PsiWhiteSpace('\n ') PsiWhiteSpace(' ')
PsiElement(ARROW)('->')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ') PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
PsiWhiteSpace('\n') PsiWhiteSpace('\n ')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n')
PsiErrorElement:Expecting namespace or top level declaration
PsiElement(RBRACE)('}') PsiElement(RBRACE)('}')
@@ -1,6 +1,5 @@
foo bar(1) buzz<T>(1) zoo package aa foo bar(1) buzz<T>(1) zoo package aa
foo bar(1) buzz<T>(1) zoo package a {}
foo bar(1) buzz<T>(1) zoo class A foo bar(1) buzz<T>(1) zoo class A
foo bar(1) buzz<T>(1) zoo object B foo bar(1) buzz<T>(1) zoo object B
foo bar(1) buzz<T>(1) zoo fun a() {} foo bar(1) buzz<T>(1) zoo fun a() {}
@@ -54,66 +54,6 @@ JetFile: ShortAnnotations.jet
PsiWhiteSpace(' ') PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('aa') PsiElement(IDENTIFIER)('aa')
PsiWhiteSpace('\n\n') PsiWhiteSpace('\n\n')
NAMESPACE
MODIFIER_LIST
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('foo')
PsiWhiteSpace(' ')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('bar')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('buzz')
TYPE_ARGUMENT_LIST
PsiElement(LT)('<')
TYPE_PROJECTION
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('T')
PsiElement(GT)('>')
VALUE_ARGUMENT_LIST
PsiElement(LPAR)('(')
VALUE_ARGUMENT
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiElement(RPAR)(')')
PsiWhiteSpace(' ')
ANNOTATION_ENTRY
CONSTRUCTOR_CALLEE
TYPE_REFERENCE
USER_TYPE
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('zoo')
PsiWhiteSpace(' ')
NAMESPACE_HEADER
PsiElement(namespace)('package')
PsiWhiteSpace(' ')
PsiElement(IDENTIFIER)('a')
PsiWhiteSpace(' ')
PsiElement(LBRACE)('{')
NAMESPACE_BODY
<empty list>
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n')
CLASS CLASS
MODIFIER_LIST MODIFIER_LIST
ANNOTATION_ENTRY ANNOTATION_ENTRY
+6 -7
View File
@@ -1,22 +1,21 @@
package root // FILE: f.kt
~a~package a
~a~package a {
import java.* import java.*
~a.a~val a : util.List<Int>? = null ~a.a~val a : util.List<Int>? = null
val y : Any? = `a.b`b val y : Any? = `a.b`b
} // FILE: f.kt
package a
package a {
import java.util.* import java.util.*
~a.b~val b : List<Int>? = null ~a.b~val b : List<Int>? = null
val x = `a.a`a val x = `a.a`a
}
// FILE: f.kt
package root
val x = `a`a.`a.a`a val x = `a`a.`a.a`a
val y = `a`a.`a.b`b val y = `a`a.`a.b`b
+1 -2
View File
@@ -1,4 +1,4 @@
~ns~package nestedObjects { ~ns~package nestedObjects
object ~A~A { object ~A~A {
val b = `A.B`B val b = `A.B`B
val d = `A`A.`A.B`B.`A.B.A`A val d = `A`A.`A.B`B.`A.B.A`A
@@ -25,4 +25,3 @@
val c = `A`A.`A.B`B val c = `A`A.`A.B`B
val d = A.B.`A.B.A`A val d = A.B.`A.B.A`A
val e = B.`!`A.B val e = B.`!`A.B
}
@@ -1,5 +1,6 @@
package org.jetbrains.jet; package org.jetbrains.jet;
import com.google.common.collect.Lists;
import com.intellij.openapi.Disposable; import com.intellij.openapi.Disposable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
@@ -18,6 +19,9 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* @author abreslav * @author abreslav
@@ -168,5 +172,43 @@ public class JetTestUtils {
mkdirs(file); mkdirs(file);
} }
public static final Pattern FILE_PATTERN = Pattern.compile("//\\s*FILE:\\s*(.*)$", Pattern.MULTILINE);
public interface TestFileFactory<F> {
F create(String fileName, String text);
}
public static <F> List<F> createTestFiles(String testFileName, String expectedText, TestFileFactory<F> factory) {
List<F> testFileFiles = Lists.newArrayList();
Matcher matcher = FILE_PATTERN.matcher(expectedText);
if (!matcher.find()) {
// One file
testFileFiles.add(factory.create(testFileName, expectedText));
}
else {
int processedChars = 0;
// Many files
while (true) {
String fileName = matcher.group(1);
int start = matcher.start();
assert start == processedChars : "Characters skipped from " + processedChars + " to " + matcher.start();
boolean nextFileExists = matcher.find();
int end;
if (nextFileExists) {
end = matcher.start();
}
else {
end = expectedText.length();
}
String fileText = expectedText.substring(start, end);
processedChars = end;
testFileFiles.add(factory.create(fileName, fileText));
if (!nextFileExists) break;
}
assert processedChars == expectedText.length() : "Characters skipped from " + processedChars + " to " + (expectedText.length() - 1);
}
return testFileFiles;
}
} }
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetLiteFixture; import org.jetbrains.jet.JetLiteFixture;
import org.jetbrains.jet.JetTestCaseBuilder; import org.jetbrains.jet.JetTestCaseBuilder;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.lang.Configuration; import org.jetbrains.jet.lang.Configuration;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
@@ -20,15 +21,12 @@ import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* @author abreslav * @author abreslav
*/ */
public class JetDiagnosticsTest extends JetLiteFixture { public class JetDiagnosticsTest extends JetLiteFixture {
private String name; private String name;
public static final Pattern FILE_PATTERN = Pattern.compile("//\\s*FILE:\\s*(.*)$", Pattern.MULTILINE);
public JetDiagnosticsTest(@NonNls String dataPath, String name) { public JetDiagnosticsTest(@NonNls String dataPath, String name) {
super(dataPath); super(dataPath);
@@ -88,7 +86,12 @@ public class JetDiagnosticsTest extends JetLiteFixture {
String expectedText = loadFile(testFileName); String expectedText = loadFile(testFileName);
List<TestFile> testFileFiles = createTestFiles(testFileName, expectedText); List<TestFile> testFileFiles = JetTestUtils.createTestFiles(testFileName, expectedText, new JetTestUtils.TestFileFactory<TestFile>() {
@Override
public TestFile create(String fileName, String text) {
return new TestFile(fileName, text);
}
});
boolean importJdk = expectedText.contains("+JDK"); boolean importJdk = expectedText.contains("+JDK");
// Configuration configuration = importJdk ? JavaBridgeConfiguration.createJavaBridgeConfiguration(getProject()) : Configuration.EMPTY; // Configuration configuration = importJdk ? JavaBridgeConfiguration.createJavaBridgeConfiguration(getProject()) : Configuration.EMPTY;
@@ -114,41 +117,6 @@ public class JetDiagnosticsTest extends JetLiteFixture {
assertEquals(expectedText, actualText.toString()); assertEquals(expectedText, actualText.toString());
} }
private List<TestFile> createTestFiles(String testFileName, String expectedText) {
List<TestFile> testFileFiles = Lists.newArrayList();
Matcher matcher = FILE_PATTERN.matcher(expectedText);
if (!matcher.find()) {
// One file
testFileFiles.add(new TestFile(testFileName, expectedText));
}
else {
int processedChars = 0;
// Many files
while (true) {
String fileName = matcher.group(1);
int start = matcher.start();
assertTrue("Characters skipped from " + processedChars + " to " + matcher.start(), start == processedChars);
boolean nextFileExists = matcher.find();
int end;
if (nextFileExists) {
end = matcher.start();
}
else {
end = expectedText.length();
}
String fileText = expectedText.substring(start, end);
processedChars = end;
testFileFiles.add(new TestFile(fileName, fileText));
if (!nextFileExists) break;
}
assertTrue("Characters skipped from " + processedChars + " to " + (expectedText.length() - 1), processedChars == expectedText.length());
}
return testFileFiles;
}
// private void convert(File src, File dest) throws IOException { // private void convert(File src, File dest) throws IOException {
// File[] files = src.listFiles(); // File[] files = src.listFiles();
// for (File file : files) { // for (File file : files) {
@@ -18,7 +18,7 @@ public class ClassGenTest extends CodegenTestCase {
final Class aClass = loadClass("SimpleClass", generateClassesInFile()); final Class aClass = loadClass("SimpleClass", generateClassesInFile());
final Method[] methods = aClass.getDeclaredMethods(); final Method[] methods = aClass.getDeclaredMethods();
// public int SimpleClass.foo() // public int SimpleClass.foo()
// public jet.typeinfo.TypeInfo SimpleClass.getTypeInfo() // public jet.TypeInfo SimpleClass.getTypeInfo()
assertEquals(2, methods.length); assertEquals(2, methods.length);
} }
@@ -3,7 +3,7 @@ package org.jetbrains.jet.codegen;
import jet.IntRange; import jet.IntRange;
import jet.Tuple2; import jet.Tuple2;
import jet.Tuple4; import jet.Tuple4;
import jet.typeinfo.TypeInfo; import jet.TypeInfo;
import java.awt.*; import java.awt.*;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@@ -2,7 +2,7 @@ package org.jetbrains.jet.codegen;
import jet.JetObject; import jet.JetObject;
import jet.TypeCastException; import jet.TypeCastException;
import jet.typeinfo.TypeInfo; import jet.TypeInfo;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@@ -31,7 +31,7 @@ public class TypeInfoTest extends CodegenTestCase {
} }
public void testNoArgTypeinfo() throws Exception { public void testNoArgTypeinfo() throws Exception {
loadText("fun foo() = typeinfo.typeinfo<Int>()"); loadText("fun foo() = typeinfo<Int>()");
Method foo = generateFunction(); Method foo = generateFunction();
TypeInfo typeInfo = (TypeInfo) foo.invoke(null); TypeInfo typeInfo = (TypeInfo) foo.invoke(null);
assertSame(TypeInfo.INT_TYPE_INFO, typeInfo); assertSame(TypeInfo.INT_TYPE_INFO, typeInfo);
@@ -1,8 +1,13 @@
package org.jetbrains.jet.resolve; package org.jetbrains.jet.resolve;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.JetSemanticServices;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
@@ -12,13 +17,14 @@ import org.jetbrains.jet.lang.diagnostics.UnresolvedReferenceDiagnostic;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade;
import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.TypeConstructor;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -31,22 +37,37 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.REFERENCE_TARGET;
/** /**
* @author abreslav * @author abreslav
*/ */
public class ExpectedResolveData { public abstract class ExpectedResolveData {
private final Map<String, Integer> declarationToPosition = new HashMap<String, Integer>(); private static class Position {
private final Map<Integer, String> positionToReference = new HashMap<Integer, String>(); private final PsiElement element;
private final Map<Integer, String> positionToType = new HashMap<Integer, String>();
private final Map<String, DeclarationDescriptor> nameToDescriptor;
private final Map<String, PsiElement> nameToPsiElement;
// private final Map<String, JetType> nameToType;
public ExpectedResolveData(Map<String, DeclarationDescriptor> nameToDescriptor, Map<String, PsiElement> nameToPsiElement/*, Map<String, JetType> nameToType*/) { private Position(JetFile file, int offset) {
this.nameToDescriptor = nameToDescriptor; this.element = file.findElementAt(offset);
this.nameToPsiElement = nameToPsiElement; }
// this.nameToType = nameToType;
public PsiElement getElement() {
return element;
}
} }
public String extractData(String text) { private final Map<String, Position> declarationToPosition = Maps.newHashMap();
private final Map<Position, String> positionToReference = Maps.newHashMap();
private final Map<Position, String> positionToType = Maps.newHashMap();
private final Map<String, DeclarationDescriptor> nameToDescriptor;
private final Map<String, PsiElement> nameToPsiElement;
public ExpectedResolveData(Map<String, DeclarationDescriptor> nameToDescriptor, Map<String, PsiElement> nameToPsiElement) {
this.nameToDescriptor = nameToDescriptor;
this.nameToPsiElement = nameToPsiElement;
}
public final JetFile createFileFromMarkedUpText(String fileName, String text) {
Map<String, Integer> declarationToIntPosition = Maps.newHashMap();
Map<Integer, String> intPositionToReference = Maps.newHashMap();
Map<Integer, String> intPositionToType = Maps.newHashMap();
Pattern pattern = Pattern.compile("(~[^~]+~)|(`[^`]+`)"); Pattern pattern = Pattern.compile("(~[^~]+~)|(`[^`]+`)");
while (true) { while (true) {
Matcher matcher = pattern.matcher(text); Matcher matcher = pattern.matcher(text);
@@ -56,16 +77,16 @@ public class ExpectedResolveData {
String name = group.substring(1, group.length() - 1); String name = group.substring(1, group.length() - 1);
int start = matcher.start(); int start = matcher.start();
if (group.startsWith("~")) { if (group.startsWith("~")) {
if (declarationToPosition.put(name, start) != null) { if (declarationToIntPosition.put(name, start) != null) {
throw new IllegalArgumentException("Redeclaration: " + name); throw new IllegalArgumentException("Redeclaration: " + name);
} }
} }
else if (group.startsWith("`")) { else if (group.startsWith("`")) {
if (name.startsWith(":")) { if (name.startsWith(":")) {
positionToType.put(start - 1, name.substring(1)); intPositionToType.put(start - 1, name.substring(1));
} }
else { else {
positionToReference.put(start, name); intPositionToReference.put(start, name);
} }
} }
else { else {
@@ -75,16 +96,38 @@ public class ExpectedResolveData {
text = text.substring(0, start) + text.substring(matcher.end()); text = text.substring(0, start) + text.substring(matcher.end());
} }
System.out.println(text); JetFile jetFile = createJetFile(fileName, text);
return text;
for (Map.Entry<Integer, String> entry : intPositionToType.entrySet()) {
positionToType.put(new Position(jetFile, entry.getKey()), entry.getValue());
}
for (Map.Entry<String, Integer> entry : declarationToIntPosition.entrySet()) {
declarationToPosition.put(entry.getKey(), new Position(jetFile, entry.getValue()));
}
for (Map.Entry<Integer, String> entry : intPositionToReference.entrySet()) {
positionToReference.put(new Position(jetFile, entry.getKey()), entry.getValue());
}
return jetFile;
} }
public void checkResult(JetFile file) { protected abstract JetFile createJetFile(String fileName, String text);
final Set<PsiElement> unresolvedReferences = new HashSet<PsiElement>();
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(file.getProject()); public final void checkResult(List<JetFile> files) {
if (files.isEmpty()) {
System.err.println("Suspicious: no files");
return;
}
final Set<PsiElement> unresolvedReferences = Sets.newHashSet();
Project project = files.iterator().next().getProject();
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(project);
JetStandardLibrary lib = semanticServices.getStandardLibrary(); JetStandardLibrary lib = semanticServices.getStandardLibrary();
BindingContext bindingContext = JetTestUtils.analyzeNamespace(file.getRootNamespace(), JetControlFlowDataTraceFactory.EMPTY); List<JetDeclaration> declarations = Lists.newArrayList();
for (JetFile file : files) {
declarations.add(file.getRootNamespace());
}
BindingContext bindingContext = AnalyzerFacade.analyzeNamespacesWithJavaIntegration(project, declarations, Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY);
for (Diagnostic diagnostic : bindingContext.getDiagnostics()) { for (Diagnostic diagnostic : bindingContext.getDiagnostics()) {
if (diagnostic instanceof UnresolvedReferenceDiagnostic) { if (diagnostic instanceof UnresolvedReferenceDiagnostic) {
UnresolvedReferenceDiagnostic unresolvedReferenceDiagnostic = (UnresolvedReferenceDiagnostic) diagnostic; UnresolvedReferenceDiagnostic unresolvedReferenceDiagnostic = (UnresolvedReferenceDiagnostic) diagnostic;
@@ -95,20 +138,20 @@ public class ExpectedResolveData {
Map<String, JetDeclaration> nameToDeclaration = new HashMap<String, JetDeclaration>(); Map<String, JetDeclaration> nameToDeclaration = new HashMap<String, JetDeclaration>();
Map<JetDeclaration, String> declarationToName = new HashMap<JetDeclaration, String>(); Map<JetDeclaration, String> declarationToName = new HashMap<JetDeclaration, String>();
for (Map.Entry<String, Integer> entry : declarationToPosition.entrySet()) { for (Map.Entry<String, Position> entry : declarationToPosition.entrySet()) {
String name = entry.getKey(); String name = entry.getKey();
Integer position = entry.getValue(); Position position = entry.getValue();
PsiElement element = file.findElementAt(position); PsiElement element = position.getElement();
JetDeclaration ancestorOfType = getAncestorOfType(JetDeclaration.class, element); JetDeclaration ancestorOfType = getAncestorOfType(JetDeclaration.class, element);
nameToDeclaration.put(name, ancestorOfType); nameToDeclaration.put(name, ancestorOfType);
declarationToName.put(ancestorOfType, name); declarationToName.put(ancestorOfType, name);
} }
for (Map.Entry<Integer, String> entry : positionToReference.entrySet()) { for (Map.Entry<Position, String> entry : positionToReference.entrySet()) {
Integer position = entry.getKey(); Position position = entry.getKey();
String name = entry.getValue(); String name = entry.getValue();
PsiElement element = file.findElementAt(position); PsiElement element = position.getElement();
JetReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, JetReferenceExpression.class); JetReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, JetReferenceExpression.class);
if ("!".equals(name)) { if ("!".equals(name)) {
@@ -216,11 +259,11 @@ public class ExpectedResolveData {
} }
} }
for (Map.Entry<Integer, String> entry : positionToType.entrySet()) { for (Map.Entry<Position, String> entry : positionToType.entrySet()) {
Integer position = entry.getKey(); Position position = entry.getKey();
String typeName = entry.getValue(); String typeName = entry.getValue();
PsiElement element = file.findElementAt(position); PsiElement element = position.getElement();
JetExpression expression = getAncestorOfType(JetExpression.class, element); JetExpression expression = getAncestorOfType(JetExpression.class, element);
JetType expressionType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression); JetType expressionType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression);
@@ -230,15 +273,16 @@ public class ExpectedResolveData {
assertNotNull("Expected class not found: " + typeName, expectedClass); assertNotNull("Expected class not found: " + typeName, expectedClass);
expectedTypeConstructor = expectedClass.getTypeConstructor(); expectedTypeConstructor = expectedClass.getTypeConstructor();
} else { }
Integer declarationPosition = declarationToPosition.get(typeName); else {
Position declarationPosition = declarationToPosition.get(typeName);
assertNotNull("Undeclared: " + typeName, declarationPosition); assertNotNull("Undeclared: " + typeName, declarationPosition);
PsiElement declElement = file.findElementAt(declarationPosition); PsiElement declElement = declarationPosition.getElement();
assertNotNull(declarationPosition); assertNotNull(declarationPosition);
JetDeclaration declaration = getAncestorOfType(JetDeclaration.class, declElement); JetDeclaration declaration = getAncestorOfType(JetDeclaration.class, declElement);
assertNotNull(declaration); assertNotNull(declaration);
if (declaration instanceof JetClass) { if (declaration instanceof JetClass) {
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, (JetClass) declaration); ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, declaration);
expectedTypeConstructor = classDescriptor.getTypeConstructor(); expectedTypeConstructor = classDescriptor.getTypeConstructor();
} }
else if (declaration instanceof JetTypeParameter) { else if (declaration instanceof JetTypeParameter) {
@@ -2,9 +2,10 @@ package org.jetbrains.jet.resolve;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.jet.JetLiteFixture; import org.jetbrains.jet.JetLiteFixture;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import java.io.File; import java.util.List;
/** /**
* @author abreslav * @author abreslav
@@ -22,8 +23,12 @@ public abstract class ExtensibleResolveTestCase extends JetLiteFixture {
protected void doTest(@NonNls String filePath) throws Exception { protected void doTest(@NonNls String filePath) throws Exception {
String text = loadFile(filePath); String text = loadFile(filePath);
text = expectedResolveData.extractData(text); List<JetFile> files = JetTestUtils.createTestFiles("file.kt", text, new JetTestUtils.TestFileFactory<JetFile>() {
JetFile jetFile = createPsiFile(new File(filePath).getName(), text); @Override
expectedResolveData.checkResult(jetFile); public JetFile create(String fileName, String text) {
return expectedResolveData.createFileFromMarkedUpText(fileName, text);
}
});
expectedResolveData.checkResult(files);
} }
} }
@@ -15,6 +15,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults;
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
@@ -54,7 +55,7 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
FunctionDescriptor descriptorForSet = standardFunction(lib.getArray(), Collections.singletonList(new TypeProjection(lib.getIntType())), "set", lib.getIntType(), lib.getIntType()); FunctionDescriptor descriptorForSet = standardFunction(lib.getArray(), Collections.singletonList(new TypeProjection(lib.getIntType())), "set", lib.getIntType(), lib.getIntType());
nameToDescriptor.put("std::Array.set(Int, Int)", descriptorForSet.getOriginal()); nameToDescriptor.put("std::Array.set(Int, Int)", descriptorForSet.getOriginal());
Map<String,PsiElement> nameToDeclaration = new HashMap<String, PsiElement>(); Map<String, PsiElement> nameToDeclaration = new HashMap<String, PsiElement>();
PsiClass java_util_Collections = findClass("java.util.Collections"); PsiClass java_util_Collections = findClass("java.util.Collections");
nameToDeclaration.put("java::java.util.Collections.emptyList()", findMethod(java_util_Collections, "emptyList")); nameToDeclaration.put("java::java.util.Collections.emptyList()", findMethod(java_util_Collections, "emptyList"));
nameToDeclaration.put("java::java.util.Collections", java_util_Collections); nameToDeclaration.put("java::java.util.Collections", java_util_Collections);
@@ -78,7 +79,12 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
nameToDeclaration.put("java::java.lang.Number", java_lang_Number); nameToDeclaration.put("java::java.lang.Number", java_lang_Number);
nameToDeclaration.put("java::java.lang.Number.intValue()", java_lang_Number.findMethodsByName("intValue", true)[0]); nameToDeclaration.put("java::java.lang.Number.intValue()", java_lang_Number.findMethodsByName("intValue", true)[0]);
return new ExpectedResolveData(nameToDescriptor, nameToDeclaration); return new ExpectedResolveData(nameToDescriptor, nameToDeclaration) {
@Override
protected JetFile createJetFile(String fileName, String text) {
return createCheckAndReturnPsiFile(fileName, text);
}
};
} }
@NotNull @NotNull
@@ -154,6 +160,9 @@ public class JetResolveTest extends ExtensibleResolveTestCase {
} }
public static Test suite() { public static Test suite() {
// TestSuite suite = new TestSuite();
// suite.addTest(new JetResolveTest("/resolve/Basic.jet", "basic"));
// return suite;
return JetTestCaseBuilder.suiteForDirectory(getHomeDirectory() + "/compiler/testData/", "/resolve/", true, new JetTestCaseBuilder.NamedTestFactory() { return JetTestCaseBuilder.suiteForDirectory(getHomeDirectory() + "/compiler/testData/", "/resolve/", true, new JetTestCaseBuilder.NamedTestFactory() {
@NotNull @NotNull
@Override @Override
@@ -90,8 +90,8 @@ public class JetTypeCheckerTest extends JetLiteFixture {
} }
public void testTypeInfo() throws Exception { public void testTypeInfo() throws Exception {
assertType("typeinfo.typeinfo<Int>", "typeinfo.TypeInfo<Int>"); assertType("typeinfo<Int>", "TypeInfo<Int>");
assertType("typeinfo.typeinfo<typeinfo.TypeInfo<Int>>", "typeinfo.TypeInfo<typeinfo.TypeInfo<Int>>"); assertType("typeinfo<TypeInfo<Int>>", "TypeInfo<TypeInfo<Int>>");
} }
public void testJumps() throws Exception { public void testJumps() throws Exception {
+7 -7
View File
@@ -16,15 +16,15 @@ script
; ;
preamble preamble
: namespaceHeader? import* : packageHeader? import*
; ;
namespaceHeader packageHeader
: modifiers "namespace" SimpleName{"."} SEMI? : modifiers "package" SimpleName{"."} SEMI?
; ;
import import
: "import" ("namespace" ".")? SimpleName{"."} ("." "*" | "as" SimpleName)? SEMI? : "import" ("package" ".")? SimpleName{"."} ("." "*" | "as" SimpleName)? SEMI?
; ;
/** /**
@@ -32,7 +32,7 @@ bq. See [Imports|Namespaces#Imports]
*/ */
toplevelObject toplevelObject
: namespace : package
: class : class
: object : object
: function : function
@@ -40,8 +40,8 @@ toplevelObject
: typedef : typedef
; ;
namespace package
: "namespace" SimpleName{"."} "{" : "package" SimpleName{"."} "{"
import* import*
toplevelObject* toplevelObject*
"}" "}"
+2 -2
View File
@@ -118,7 +118,7 @@ enum class MyEnum() {
abstract enum class MyAbstractEnum() {} abstract enum class MyAbstractEnum() {}
package MyNamespace { //package MyNamespace {
//properties //properties
val <error>a</error>: Int val <error>a</error>: Int
val a1: Int = 1 val a1: Int = 1
@@ -145,7 +145,7 @@ package MyNamespace {
fun g() {} fun g() {}
<error>abstract</error> fun h() <error>abstract</error> fun h()
<error>abstract</error> fun j() {} <error>abstract</error> fun j() {}
} //}
//creating an instance //creating an instance
abstract class B1( abstract class B1(
-17
View File
@@ -1,20 +1,3 @@
package boundsWithSubstitutors {
open class A<T>
class B<X : A<X>>()
class C : A<C>
val a = B<C>()
val a1 = B<<error>Int</error>>()
class X<A, B : A>()
val b = X<Any, X<A<C>, C>>
val b0 = X<Any, <error>Any?</error>>
val b1 = X<Any, X<A<C>, <error>String</error>>>
}
open class A {} open class A {}
open class B<T : A>() open class B<T : A>()
@@ -0,0 +1,13 @@
open class A<T>
class B<X : A<X>>()
class C : A<C>
val a = B<C>()
val a1 = B<<error>Int</error>>()
class X<A, B : A>()
val b = X<Any, X<A<C>, C>>
val b0 = X<Any, <error>Any?</error>>
val b1 = X<Any, X<A<C>, <error>String</error>>>
+2 -9
View File
@@ -1,6 +1,6 @@
import java.util.* package html
package html { import java.util.*
abstract class Factory<T> { abstract class Factory<T> {
abstract fun create() : T abstract fun create() : T
@@ -83,12 +83,6 @@ package html {
return html return html
} }
}
package foo {
import html.*
fun result(args : Array<String>) = fun result(args : Array<String>) =
html { html {
head { head {
@@ -118,4 +112,3 @@ fun result(args : Array<String>) =
} }
} }
} }
}
+2 -3
View File
@@ -37,7 +37,8 @@ val <T> T.<error>foo</error> : T
fun Int.foo() = this fun Int.foo() = this
package null_safety { // FILE: b.kt
//package null_safety
fun parse(<warning>cmd</warning>: String): Command? { return null } fun parse(<warning>cmd</warning>: String): Command? { return null }
class Command() { class Command() {
@@ -67,5 +68,3 @@ package null_safety {
if (command == null) 1 if (command == null) 1
} }
}
@@ -13,30 +13,30 @@ trait BB1 : BA1<Int> {}
trait BB2 : <error>BA1<Any>, BB1</error> {} trait BB2 : <error>BA1<Any>, BB1</error> {}
package x { //package x {
trait AA1<out T> {} trait xAA1<out T> {}
trait AB1 : AA1<Int> {} trait xAB1 : xAA1<Int> {}
trait AB3 : AA1<Comparable<Int>> {} trait xAB3 : xAA1<Comparable<Int>> {}
trait AB2 : AA1<Number>, AB1, AB3 {} trait xAB2 : xAA1<Number>, xAB1, xAB3 {}
} //}
package x2 { //package x2 {
trait AA1<out T> {} trait x2AA1<out T> {}
trait AB1 : AA1<Any> {} trait x2AB1 : x2AA1<Any> {}
trait AB3 : AA1<Comparable<Int>> {} trait x2AB3 : x2AA1<Comparable<Int>> {}
trait AB2 : <error>AA1<Number>, AB1, AB3</error> {} trait x2AB2 : <error>x2AA1<Number>, x2AB1, x2AB3</error> {}
} //}
package x3 { //package x3 {
trait AA1<in T> {} trait x3AA1<in T> {}
trait AB1 : AA1<Any> {} trait x3AB1 : x3AA1<Any> {}
trait AB3 : AA1<Comparable<Int>> {} trait x3AB3 : x3AA1<Comparable<Int>> {}
trait AB2 : AA1<Number>, AB1, AB3 {} trait x3AB2 : x3AA1<Number>, x3AB1, x3AB3 {}
} //}
package sx2 { //package sx2 {
trait AA1<in T> {} trait sx2AA1<in T> {}
trait AB1 : AA1<Int> {} trait sx2AB1 : sx2AA1<Int> {}
trait AB3 : AA1<Comparable<Int>> {} trait sx2AB3 : sx2AA1<Comparable<Int>> {}
trait AB2 : <error>AA1<Number>, AB1, AB3</error> {} trait sx2AB2 : <error>sx2AA1<Number>, sx2AB1, sx2AB3</error> {}
} //}
+21
View File
@@ -0,0 +1,21 @@
object A {
val x : Int = 0
}
open class Foo {
fun foo() : Int = 1
}
fun test() {
A.x
val b = object : Foo {
}
b.foo()
object B {
fun foo() {}
}
B.foo()
}
val bb = <error>B</error>.foo()
@@ -1,8 +1,4 @@
package root package root
package a { val x = <error>root</error>
}
val x = <error>a</error>
val y2 = <error>package</error> val y2 = <error>package</error>
+2 -23
View File
@@ -1,29 +1,8 @@
package foobar package a
package a {
import java.* import java.*
val a : util.List<Int>? = null
val a1 : <error>List</error><Int>? = null
}
abstract class Foo<T>() {
abstract val x : T<Int>
}
package a {
import java.util.* import java.util.*
val b : List<Int>? = a
val b1 : <error>util</error>.List<Int>? = a
}
val x1 = a.a
val y1 = a.b
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
fun done<O>(result : O) : Iteratee<Any?, O> = StrangeIterateeImpl<Any?, O>(result) fun done<O>(result : O) : Iteratee<Any?, O> = StrangeIterateeImpl<Any?, O>(result)
@@ -44,7 +23,7 @@ class StrangeIterateeImpl<in I, out O>(val obj: O) : Iteratee<I, O> {
abstract class Sum() : Iteratee<Int, Int> { abstract class Sum() : Iteratee<Int, Int> {
override fun process(item : Int) : Iteratee<Int, Int> { override fun process(item : Int) : Iteratee<Int, Int> {
return foobar.done<Int>(item); return a.done<Int>(item);
} }
abstract override val isDone : Boolean abstract override val isDone : Boolean
abstract override val result : Int abstract override val result : Int
+28
View File
@@ -0,0 +1,28 @@
package nestedObjects
object A {
val b = B
val d = A.B.A
object B {
val a = A
val e = B.A
object A {
val a = A
val b = B
val x = nestedObjects.A.B.A
val y = this<error>@A</error>
}
}
}
object B {
val b = B
val c = A.B
}
val a = A
val b = B
val c = A.B
val d = A.B.A
val e = B.<error>A</error>.B
+2 -57
View File
@@ -1,4 +1,4 @@
package toplevelObjectDeclarations { package toplevelObjectDeclarations
open class Foo(y : Int) { open class Foo(y : Int) {
open fun foo() : Int = 1 open fun foo() : Int = 1
} }
@@ -25,59 +25,4 @@ package toplevelObjectDeclarations {
override fun foo() : Int = 1 override fun foo() : Int = 1
} }
val z = y.foo() val z = y.foo()
}
package nestedObejcts {
object A {
val b = B
val d = A.B.A
object B {
val a = A
val e = B.A
object A {
val a = A
val b = B
val x = nestedObejcts.A.B.A
val y = this<error>@A</error>
}
}
}
object B {
val b = B
val c = A.B
}
val a = A
val b = B
val c = A.B
val d = A.B.A
val e = B.<error>A</error>.B
}
package localObjects {
object A {
val x : Int = 0
}
open class Foo {
fun foo() : Int = 1
}
fun test() {
A.x
val b = object : Foo {
}
b.foo()
object B {
fun foo() {}
}
B.foo()
}
val bb = <error>B</error>.foo()
}
-40
View File
@@ -1,6 +1,5 @@
package override package override
package normal {
trait MyTrait { trait MyTrait {
fun foo() fun foo()
} }
@@ -35,42 +34,3 @@ package normal {
fun <error>foo</error>() {} fun <error>foo</error>() {}
override fun bar() {} override fun bar() {}
} }
}
package generics {
trait MyTrait<T> {
fun foo(t: T) : T
}
abstract class MyAbstractClass<T> {
abstract fun bar(t: T) : T
}
open class MyGenericClass<T> : MyTrait<T>, MyAbstractClass<T> {
override fun foo(t: T) = t
override fun bar(t: T) = t
}
class MyChildClass : MyGenericClass<Int> {}
class MyChildClass1<T> : MyGenericClass<T> {}
class MyChildClass2<T> : MyGenericClass<T> {
fun <error>foo</error>(t: T) = t
override fun bar(t: T) = t
}
open class MyClass : MyTrait<Int>, MyAbstractClass<String> {
override fun foo(i: Int) = i
override fun bar(s: String) = s
}
class <error>MyIllegalGenericClass1</error><T> : MyTrait<T>, MyAbstractClass<T> {}
class <error>MyIllegalGenericClass2</error><T, R> : MyTrait<T>, MyAbstractClass<R> {
<error>override</error> fun foo(r: R) = r
}
class <error>MyIllegalClass1</error> : MyTrait<Int>, MyAbstractClass<String> {}
class <error>MyIllegalClass2</error><T> : MyTrait<Int>, MyAbstractClass<Int> {
fun foo(t: T) = t
fun bar(t: T) = t
}
}
@@ -0,0 +1,35 @@
trait MyTrait<T> {
fun foo(t: T) : T
}
abstract class MyAbstractClass<T> {
abstract fun bar(t: T) : T
}
open class MyGenericClass<T> : MyTrait<T>, MyAbstractClass<T> {
override fun foo(t: T) = t
override fun bar(t: T) = t
}
class MyChildClass : MyGenericClass<Int> {}
class MyChildClass1<T> : MyGenericClass<T> {}
class MyChildClass2<T> : MyGenericClass<T> {
fun <error>foo</error>(t: T) = t
override fun bar(t: T) = t
}
open class MyClass : MyTrait<Int>, MyAbstractClass<String> {
override fun foo(i: Int) = i
override fun bar(s: String) = s
}
class <error>MyIllegalGenericClass1</error><T> : MyTrait<T>, MyAbstractClass<T> {}
class <error>MyIllegalGenericClass2</error><T, R> : MyTrait<T>, MyAbstractClass<R> {
<error>override</error> fun foo(r: R) = r
}
class <error>MyIllegalClass1</error> : MyTrait<Int>, MyAbstractClass<String> {}
class <error>MyIllegalClass2</error><T> : MyTrait<Int>, MyAbstractClass<Int> {
fun foo(t: T) = t
fun bar(t: T) = t
}
-18
View File
@@ -21,21 +21,3 @@ fun foo1() : Unit {
this<error>@a</error> this<error>@a</error>
} }
package closures {
class A(val a:Int) {
class B() {
val x = this@B : B
val y = this@A : A
val z = this : B
val Int.xx = this : Int
fun Char.xx() : Any {
this : Char
val <warning>a</warning> = {Double.() -> this : Double + this@xx : Char}
val <warning>b</warning> = @a{Double.() -> this@a : Double + this@xx : Char}
val <warning>c</warning> = @a{() -> <error>this@a</error> + this@xx : Char}
return (@a{Double.() -> this@a : Double + this@xx : Char})
}
}
}
}
@@ -0,0 +1,16 @@
class A(val a:Int) {
class B() {
val x = this@B : B
val y = this@A : A
val z = this : B
val Int.xx = this : Int
fun Char.xx() : Any {
this : Char
val <warning>a</warning> = {Double.() -> this : Double + this@xx : Char}
val <warning>b</warning> = @a{Double.() -> this@a : Double + this@xx : Char}
val <warning>c</warning> = @a{() -> <error>this@a</error> + this@xx : Char}
return (@a{Double.() -> this@a : Double + this@xx : Char})
}
}
}
@@ -1,42 +1,42 @@
package a { //package a {
val foo = bar() val afoo = abar()
fun bar() = <error descr="[TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM] Type checking has run into a recursive problem">foo</error> fun abar() = <error descr="[TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM] Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly">afoo</error>
} //}
package b { //package b {
fun foo() = bar() fun bfoo() = bbar()
fun bar() = <error descr="[TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM] Type checking has run into a recursive problem">foo()</error> fun bbar() = <error descr="[TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM] Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly">bfoo()</error>
} //}
package c { //package c {
fun bazz() = bar() fun cbazz() = cbar()
fun foo() = <error descr="[TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM] Type checking has run into a recursive problem">bazz()</error> fun cfoo() = <error descr="[TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM] Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly">cbazz()</error>
fun bar() = foo() fun cbar() = cfoo()
} //}
package ok { //package ok {
//
// package a {
val okafoo = okabar()
package a { fun okabar() : Int = okafoo
val foo = bar() // }
//
// package b {
fun okbfoo() : Int = okbbar()
fun bar() : Int = foo fun okbbar() = okbfoo()
} // }
//
// package c {
fun okcbazz() = okcbar()
package b { fun okcfoo() : Int = okcbazz()
fun foo() : Int = bar()
fun bar() = foo() fun okcbar() = okcfoo()
} // }
//}
package c {
fun bazz() = bar()
fun foo() : Int = bazz()
fun bar() = foo()
}
}
+2 -6
View File
@@ -1,16 +1,12 @@
package redeclarations { //package redeclarations {
object <error>A</error> { object <error>A</error> {
val x : Int = 0 val x : Int = 0
val A = 1 val A = 1
} }
package <error>A</error> {
class A {}
}
class <error>A</error> {} class <error>A</error> {}
val <error>A</error> = 1 val <error>A</error> = 1
} //}
-4
View File
@@ -43,10 +43,6 @@ fun test(<warning>l</warning> : java.util.List<Int>) {
c : java.lang.Comparable<Int>? c : java.lang.Comparable<Int>?
// Collections.sort<Integer>(ArrayList<Integer>()) // Collections.sort<Integer>(ArrayList<Integer>())
xxx.<error>Class</error>()
} }
package xxx {
import java.lang.Class;
}
+2 -3
View File
@@ -1,4 +1,4 @@
package jet121 { package jet121
fun box() : String { fun box() : String {
val answer = apply("OK") { String.() : Int -> val answer = apply("OK") { String.() : Int ->
get(0) get(0)
@@ -10,5 +10,4 @@ package jet121 {
fun apply(arg:String, f : String.() -> Int) : Int { fun apply(arg:String, f : String.() -> Int) : Int {
return arg.f() return arg.f()
} }
}
@@ -1,12 +0,0 @@
// "Import Class" "true"
package a
import a.b.M
fun test() {
val v = M
}
package b {
class M() { }
}
@@ -1,10 +0,0 @@
// "Import Class" "true"
package a
fun test() {
val v = <caret>M
}
package b {
class M() { }
}
@@ -1,15 +0,0 @@
// "Remove initializer from property" "true"
package a
import java.util.Collections
package b {
import java.util.List
class M {
trait A {
abstract val l : <caret>List<Int>?
}
}
}
@@ -1,13 +0,0 @@
// "Remove initializer from property" "true"
package a
import java.util.Collections
package b {
class M {
trait A {
abstract val l = <caret>Collections.emptyList<Int>()
}
}
}
-2
View File
@@ -1,7 +1,5 @@
package jet; package jet;
import jet.typeinfo.TypeInfo;
/** /**
* @author alex.tkachman * @author alex.tkachman
*/ */
-2
View File
@@ -1,7 +1,5 @@
package jet; package jet;
import jet.typeinfo.TypeInfo;
/** /**
* @author alex.tkachman * @author alex.tkachman
*/ */
-2
View File
@@ -1,7 +1,5 @@
package jet; package jet;
import jet.typeinfo.TypeInfo;
/** /**
* @author alex.tkachman * @author alex.tkachman
*/ */
-2
View File
@@ -1,7 +1,5 @@
package jet; package jet;
import jet.typeinfo.TypeInfo;
/** /**
* @author alex.tkachman * @author alex.tkachman
*/ */
-2
View File
@@ -1,7 +1,5 @@
package jet; package jet;
import jet.typeinfo.TypeInfo;
/** /**
* @author alex.tkachman * @author alex.tkachman
*/ */
-2
View File
@@ -3,8 +3,6 @@
*/ */
package jet; package jet;
import jet.typeinfo.TypeInfo;
public abstract class ExtensionFunction0<E, R> extends DefaultJetObject { public abstract class ExtensionFunction0<E, R> extends DefaultJetObject {
protected ExtensionFunction0(TypeInfo<?> typeInfo) { protected ExtensionFunction0(TypeInfo<?> typeInfo) {
super(typeInfo); super(typeInfo);
-1
View File
@@ -3,7 +3,6 @@
*/ */
package jet; package jet;
import jet.typeinfo.TypeInfo;
public abstract class ExtensionFunction1<E, D1, R> extends DefaultJetObject { public abstract class ExtensionFunction1<E, D1, R> extends DefaultJetObject {
protected ExtensionFunction1(TypeInfo<?> typeInfo) { protected ExtensionFunction1(TypeInfo<?> typeInfo) {
super(typeInfo); super(typeInfo);
-1
View File
@@ -3,7 +3,6 @@
*/ */
package jet; package jet;
import jet.typeinfo.TypeInfo;
public abstract class ExtensionFunction10<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, R> extends DefaultJetObject { public abstract class ExtensionFunction10<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, R> extends DefaultJetObject {
protected ExtensionFunction10(TypeInfo<?> typeInfo) { protected ExtensionFunction10(TypeInfo<?> typeInfo) {
super(typeInfo); super(typeInfo);
-1
View File
@@ -3,7 +3,6 @@
*/ */
package jet; package jet;
import jet.typeinfo.TypeInfo;
public abstract class ExtensionFunction11<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, R> extends DefaultJetObject { public abstract class ExtensionFunction11<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, R> extends DefaultJetObject {
protected ExtensionFunction11(TypeInfo<?> typeInfo) { protected ExtensionFunction11(TypeInfo<?> typeInfo) {
super(typeInfo); super(typeInfo);
-1
View File
@@ -3,7 +3,6 @@
*/ */
package jet; package jet;
import jet.typeinfo.TypeInfo;
public abstract class ExtensionFunction12<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, R> extends DefaultJetObject { public abstract class ExtensionFunction12<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, R> extends DefaultJetObject {
protected ExtensionFunction12(TypeInfo<?> typeInfo) { protected ExtensionFunction12(TypeInfo<?> typeInfo) {
super(typeInfo); super(typeInfo);
-1
View File
@@ -3,7 +3,6 @@
*/ */
package jet; package jet;
import jet.typeinfo.TypeInfo;
public abstract class ExtensionFunction13<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, R> extends DefaultJetObject { public abstract class ExtensionFunction13<E, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, R> extends DefaultJetObject {
protected ExtensionFunction13(TypeInfo<?> typeInfo) { protected ExtensionFunction13(TypeInfo<?> typeInfo) {
super(typeInfo); super(typeInfo);

Some files were not shown because too many files have changed in this diff Show More