diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java index 00eb52a81cb..077591db766 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.lazy.storage.StorageManager; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.Variance; import java.util.ArrayList; @@ -201,8 +202,11 @@ public class DescriptorDeserializer { FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration).child(name); ClassId objectId = ClassId.fromFqNameAndContainingDeclaration(fqName, (ClassOrNamespaceDescriptor) containingDeclaration); ClassDescriptor objectClass = typeDeserializer.getDescriptorFinder().findClass(objectId); - assert objectClass != null : "Object for property not found: " + name; - + if (objectClass == null) { + // if we are not able to find the class for object property + // then something bad has happened since they should be in the same jar + objectClass = ErrorUtils.createErrorClass(objectId.asSingleFqName().asString()); + } return new PropertyDescriptorForObjectImpl(containingDeclaration, annotations, visibility, name, objectClass); } diff --git a/compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/broken.jar b/compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/broken.jar new file mode 100644 index 00000000000..c2a5635c1cf Binary files /dev/null and b/compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/broken.jar differ diff --git a/compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/brokenJarWithNoClassForObjectProperty.kt b/compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/brokenJarWithNoClassForObjectProperty.kt new file mode 100644 index 00000000000..761254b6c6f --- /dev/null +++ b/compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/brokenJarWithNoClassForObjectProperty.kt @@ -0,0 +1 @@ +package test \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstBinariesCustomTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstBinariesCustomTest.java index 2d3692db6fd..96679cdb63d 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstBinariesCustomTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstBinariesCustomTest.java @@ -43,4 +43,17 @@ public final class CompileKotlinAgainstBinariesCustomTest extends AbstractCompil Assert.assertFalse("Object property should have valid class", ErrorUtils.isError(((VariableDescriptorForObject) descriptor).getObjectClass())); } } + + public void testBrokenJarWithNoClassForObjectProperty() throws Exception { + BindingContext context = analyzeFile(new File( + "compiler/testData/compileKotlinAgainstBinariesCustom/brokenJarWithNoClassForObjectProperty/brokenJarWithNoClassForObjectProperty.kt")); + NamespaceDescriptor namespaceDescriptor = context.get(FQNAME_TO_NAMESPACE_DESCRIPTOR, TEST_PACKAGE_FQNAME); + assert namespaceDescriptor != null; + Collection allDescriptors = namespaceDescriptor.getMemberScope().getAllDescriptors(); + Assert.assertEquals(allDescriptors.size(), 1); + DeclarationDescriptor descriptor = allDescriptors.iterator().next(); + Assert.assertTrue(descriptor.getName().asString().equals("Lol")); + Assert.assertTrue(descriptor instanceof VariableDescriptorForObject); + Assert.assertTrue("Object property should have an error class", ErrorUtils.isError(((VariableDescriptorForObject) descriptor).getObjectClass())); + } }