Don't lookup built-in classes by invalid names
#KT-5869 Fixed
This commit is contained in:
@@ -164,6 +164,6 @@ public class BuiltInsSerializer(val out: PrintStream?) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getFileName(classDescriptor: ClassDescriptor): String {
|
fun getFileName(classDescriptor: ClassDescriptor): String {
|
||||||
return BuiltInsSerializationUtil.getClassMetadataPath(DeserializedResolverUtils.getClassId(classDescriptor))
|
return BuiltInsSerializationUtil.getClassMetadataPath(DeserializedResolverUtils.getClassId(classDescriptor))!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// KT-5869
|
||||||
|
|
||||||
|
fun <T> Iterator<T>.iterator(): Iterator<T> = this
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val iterator = object : Iterator<Int> {
|
||||||
|
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"
|
||||||
|
}
|
||||||
@@ -4971,6 +4971,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
||||||
|
|||||||
+14
-7
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.jet.lang.types.lang;
|
package org.jetbrains.jet.lang.types.lang;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.ClassId;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||||
@@ -37,21 +38,27 @@ public class BuiltInsSerializationUtil {
|
|||||||
private BuiltInsSerializationUtil() {
|
private BuiltInsSerializationUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
public static String relativeClassNameToFilePath(@NotNull FqNameUnsafe className) {
|
private static String relativeClassNameToFilePath(@NotNull FqNameUnsafe className) {
|
||||||
List<Name> segments = className.pathSegments();
|
List<Name> segments = className.pathSegments();
|
||||||
List<String> correctedSegments = new ArrayList<String>(segments.size());
|
List<String> correctedSegments = new ArrayList<String>(segments.size());
|
||||||
for (Name segment : segments) {
|
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();
|
return FqName.fromSegments(correctedSegments).asString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
public static String getClassMetadataPath(@NotNull ClassId classId) {
|
public static String getClassMetadataPath(@NotNull ClassId classId) {
|
||||||
return packageFqNameToPath(classId.getPackageFqName())
|
String filePath = relativeClassNameToFilePath(classId.getRelativeClassName());
|
||||||
+ "/" + relativeClassNameToFilePath(classId.getRelativeClassName())
|
if (filePath == null) return null;
|
||||||
+ "." + CLASS_METADATA_FILE_EXTENSION;
|
return packageFqNameToPath(classId.getPackageFqName()) + "/" + filePath + "." + CLASS_METADATA_FILE_EXTENSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static InputStream getStreamNullable(@NotNull String path) {
|
private static InputStream getStreamNullable(@NotNull String path) {
|
||||||
|
//noinspection ConstantConditions
|
||||||
return KotlinBuiltIns.class.getClassLoader().getResourceAsStream(path);
|
return KotlinBuiltIns.class.getClassLoader().getResourceAsStream(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,10 +151,10 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
|
|||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public ClassData findClassData(@NotNull ClassId classId) {
|
public ClassData findClassData(@NotNull ClassId classId) {
|
||||||
InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId));
|
String metadataPath = BuiltInsSerializationUtil.getClassMetadataPath(classId);
|
||||||
if (stream == null) {
|
if (metadataPath == null) return null;
|
||||||
return null;
|
InputStream stream = getStreamNullable(metadataPath);
|
||||||
}
|
if (stream == null) return null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ProtoBuf.Class classProto = ProtoBuf.Class.parseFrom(stream);
|
ProtoBuf.Class classProto = ProtoBuf.Class.parseFrom(stream);
|
||||||
|
|||||||
Reference in New Issue
Block a user