From 19497262b329d0674ebe1f2bc18c314d272e1c89 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 26 Sep 2014 15:14:18 +0400 Subject: [PATCH] Don't lookup built-in classes by invalid names #KT-5869 Fixed --- .../src/BuiltInsSerializer.kt | 2 +- .../objects/useAnonymousObjectAsIterator.kt | 18 ++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 6 ++++++ .../types/lang/BuiltInsSerializationUtil.java | 21 ++++++++++++------- .../types/lang/BuiltinsPackageFragment.java | 9 ++++---- 5 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/codegen/box/objects/useAnonymousObjectAsIterator.kt diff --git a/compiler/builtins-serializer/src/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/BuiltInsSerializer.kt index f224decf4a9..0d5553885b7 100644 --- a/compiler/builtins-serializer/src/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/BuiltInsSerializer.kt @@ -164,6 +164,6 @@ public class BuiltInsSerializer(val out: PrintStream?) { } fun getFileName(classDescriptor: ClassDescriptor): String { - return BuiltInsSerializationUtil.getClassMetadataPath(DeserializedResolverUtils.getClassId(classDescriptor)) + return BuiltInsSerializationUtil.getClassMetadataPath(DeserializedResolverUtils.getClassId(classDescriptor))!! } } diff --git a/compiler/testData/codegen/box/objects/useAnonymousObjectAsIterator.kt b/compiler/testData/codegen/box/objects/useAnonymousObjectAsIterator.kt new file mode 100644 index 00000000000..b15b9fe722a --- /dev/null +++ b/compiler/testData/codegen/box/objects/useAnonymousObjectAsIterator.kt @@ -0,0 +1,18 @@ +// KT-5869 + +fun Iterator.iterator(): Iterator = this + +fun box(): String { + val iterator = object : Iterator { + var i = 0 + override fun next() = i++ + override fun hasNext() = i < 5 + } + + var result = "" + for (i in iterator) { + result += i + } + + return if (result == "01234") "OK" else "Fail $result" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 4bebb3b225f..46538827d7e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -4971,6 +4971,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("useAnonymousObjectAsIterator.kt") + public void testUseAnonymousObjectAsIterator() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/useAnonymousObjectAsIterator.kt"); + doTest(fileName); + } + } @TestMetadata("compiler/testData/codegen/box/operatorConventions") diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltInsSerializationUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltInsSerializationUtil.java index 8ac4f57b528..3b4953f268d 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltInsSerializationUtil.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltInsSerializationUtil.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.types.lang; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.name.ClassId; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; @@ -37,21 +38,27 @@ public class BuiltInsSerializationUtil { private BuiltInsSerializationUtil() { } - @NotNull - public static String relativeClassNameToFilePath(@NotNull FqNameUnsafe className) { + @Nullable + private static String relativeClassNameToFilePath(@NotNull FqNameUnsafe className) { List segments = className.pathSegments(); List correctedSegments = new ArrayList(segments.size()); for (Name segment : segments) { - correctedSegments.add(isClassObjectName(segment) ? CLASS_OBJECT_NAME : segment.getIdentifier()); + if (isClassObjectName(segment)) { + correctedSegments.add(CLASS_OBJECT_NAME); + } + else if (!segment.isSpecial()) { + correctedSegments.add(segment.getIdentifier()); + } + else return null; } return FqName.fromSegments(correctedSegments).asString(); } - @NotNull + @Nullable public static String getClassMetadataPath(@NotNull ClassId classId) { - return packageFqNameToPath(classId.getPackageFqName()) - + "/" + relativeClassNameToFilePath(classId.getRelativeClassName()) - + "." + CLASS_METADATA_FILE_EXTENSION; + String filePath = relativeClassNameToFilePath(classId.getRelativeClassName()); + if (filePath == null) return null; + return packageFqNameToPath(classId.getPackageFqName()) + "/" + filePath + "." + CLASS_METADATA_FILE_EXTENSION; } @NotNull diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java index ac921ad4743..fc6f647a48c 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java @@ -123,6 +123,7 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl { @Nullable private static InputStream getStreamNullable(@NotNull String path) { + //noinspection ConstantConditions return KotlinBuiltIns.class.getClassLoader().getResourceAsStream(path); } @@ -150,10 +151,10 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl { @Nullable @Override public ClassData findClassData(@NotNull ClassId classId) { - InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId)); - if (stream == null) { - return null; - } + String metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId); + if (metadataPath == null) return null; + InputStream stream = getStreamNullable(metadataPath); + if (stream == null) return null; try { ProtoBuf.Class classProto = ProtoBuf.Class.parseFrom(stream);