diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index c46e086ab25..d32a0457bac 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -106,7 +106,10 @@ public class JavaClassMembersScope implements JetScope { for (PsiClass innerClass : psiClass.getAllInnerClasses()) { if (name.equals(innerClass.getName())) { if (innerClass.hasModifierProperty(PsiModifier.STATIC) != staticMembers) return null; - return semanticServices.getDescriptorResolver().resolveClass(innerClass); + ClassDescriptor classDescriptor = semanticServices.getDescriptorResolver().resolveClass(innerClass); + if (classDescriptor != null) { + return classDescriptor; + } } } return null; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 44a39908bee..549a4b9e0ed 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -106,9 +106,14 @@ public class JavaDescriptorResolver { this.semanticServices = semanticServices; } - @NotNull + @Nullable public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) { String qualifiedName = psiClass.getQualifiedName(); + + if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) { + // TODO: only if -$$TImpl class is created by Kotlin + return null; + } // First, let's check that this is a real Java class, not a Java's view on a Kotlin class: ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName); @@ -127,6 +132,12 @@ public class JavaDescriptorResolver { @Nullable public ClassDescriptor resolveClass(@NotNull String qualifiedName) { + + if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) { + // TODO: only if -$$TImpl class is created by Kotlin + return null; + } + // First, let's check that this is a real Java class, not a Java's view on a Kotlin class: ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName); if (kotlinClassDescriptor != null) { @@ -753,6 +764,9 @@ public class JavaDescriptorResolver { return functionDescriptor; } DeclarationDescriptor classDescriptor = method.hasModifierProperty(PsiModifier.STATIC) ? resolveNamespace(method.getContainingClass()) : resolveClass(method.getContainingClass()); + if (classDescriptor == null) { + return null; + } PsiParameter[] parameters = method.getParameterList().getParameters(); FunctionDescriptorImpl functionDescriptorImpl = new FunctionDescriptorImpl( owner, diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java index 098b8ec6bdf..45613dcb978 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java @@ -94,7 +94,10 @@ public class JavaPackageScope extends JetScopeImpl { } if (psiClass.hasModifierProperty(PsiModifier.PUBLIC)) { - allDescriptors.add(descriptorResolver.resolveClass(psiClass)); + ClassDescriptor classDescriptor = descriptorResolver.resolveClass(psiClass); + if (classDescriptor != null) { + allDescriptors.add(classDescriptor); + } } } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java index 4aed6ee493d..fde7a02232c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java @@ -94,6 +94,9 @@ public class JavaTypeTransformer { } ClassDescriptor descriptor = resolver.resolveClass(psiClass); + if (descriptor == null) { + return ErrorUtils.createErrorType("Unresolve java class: " + classType.getPresentableText()); + } List arguments = Lists.newArrayList(); if (classType.isRaw()) { diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index e8fbc7679c6..9714d54f0c3 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.jet.lang.types.JetType; @@ -123,6 +124,8 @@ public class ReadClassDataTest extends UsefulTestCase { if (ad instanceof ClassifierDescriptor) { ClassifierDescriptor bd = nsb.getMemberScope().getClassifier(ad.getName()); compareClassifiers((ClassifierDescriptor) ad, bd); + + Assert.assertNull(nsb.getMemberScope().getClassifier(ad.getName() + JvmAbi.TRAIT_IMPL_SUFFIX)); } else if (ad instanceof FunctionDescriptor) { Set functions = nsb.getMemberScope().getFunctions(ad.getName()); Assert.assertTrue(functions.size() >= 1);