diff --git a/compiler/testData/codegen/boxWithJava/innerClass/kt3812.java b/compiler/testData/codegen/boxWithJava/innerClass/kt3812.java new file mode 100644 index 00000000000..b32580da767 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/innerClass/kt3812.java @@ -0,0 +1,8 @@ +public class kt3812 { + public class Inner { + + } + + public class Inner$ { + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/innerClass/kt3812.kt b/compiler/testData/codegen/boxWithJava/innerClass/kt3812.kt new file mode 100644 index 00000000000..53ee54da303 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/innerClass/kt3812.kt @@ -0,0 +1,5 @@ +fun box(): String { + kt3812().Inner() + kt3812().`Inner$`() + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/innerClass/kt4036.java b/compiler/testData/codegen/boxWithJava/innerClass/kt4036.java new file mode 100644 index 00000000000..e37f746cf81 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/innerClass/kt4036.java @@ -0,0 +1,8 @@ +public class kt4036 { + public class Inner1$class { + + } + + public class Inner2$class { + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/innerClass/kt4036.kt b/compiler/testData/codegen/boxWithJava/innerClass/kt4036.kt new file mode 100644 index 00000000000..ad4612e56ba --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/innerClass/kt4036.kt @@ -0,0 +1,5 @@ +fun box(): String { + kt4036().`Inner1$class`() + kt4036().`Inner2$class`() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index 785c0817df3..0448e11e665 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -140,6 +140,16 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava("compiler/testData/codegen/boxWithJava/innerClass/kt3532.kt"); } + @TestMetadata("kt3812.kt") + public void testKt3812() throws Exception { + doTestWithJava("compiler/testData/codegen/boxWithJava/innerClass/kt3812.kt"); + } + + @TestMetadata("kt4036.kt") + public void testKt4036() throws Exception { + doTestWithJava("compiler/testData/codegen/boxWithJava/innerClass/kt4036.kt"); + } + } @TestMetadata("compiler/testData/codegen/boxWithJava/property") diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index 365d95bd03f..62bd08a59ba 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -208,7 +208,7 @@ public final class JavaClassResolver { return alreadyResolved; } - ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(qualifiedName, javaClass.getOuterClass() != null); + ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(qualifiedName, javaClass.getOuterClass()); // class may be resolved during resolution of parent ClassDescriptor cachedDescriptor = classDescriptorCache.get(javaClassToKotlinFqName(qualifiedName)); if (cachedDescriptor != null) { @@ -374,16 +374,17 @@ public final class JavaClassResolver { } @NotNull - private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull FqName childClassFQName, boolean isInnerClass) { - FqName parentFqName = childClassFQName.parent(); - if (isInnerClass) { - ClassDescriptor parentClass = resolveClass(parentFqName, INCLUDE_KOTLIN_SOURCES); - if (parentClass == null) { + private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull FqName childClassFQName, JavaClass parentClass) { + if (parentClass != null) { + FqName parentFqName = parentClass.getFqName(); + ClassDescriptor parentClassDescriptor = resolveClass(parentFqName, INCLUDE_KOTLIN_SOURCES); + if (parentClassDescriptor == null) { throw new IllegalStateException("Could not resolve " + parentFqName + " required to be parent for " + childClassFQName); } - return parentClass; + return parentClassDescriptor; } else { + FqName parentFqName = childClassFQName.parent(); NamespaceDescriptor parentNamespace = namespaceResolver.resolveNamespace(parentFqName, INCLUDE_KOTLIN_SOURCES); if (parentNamespace == null) { throw new IllegalStateException("Could not resolve " + parentFqName + " required to be parent for " + childClassFQName);