Remove JavaToKotlinClassMap dependency on built-ins instance
This commit is contained in:
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.builtins.CompanionObjectMapping;
|
|||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi;
|
import org.jetbrains.kotlin.load.java.JvmAbi;
|
||||||
import org.jetbrains.kotlin.platform.JvmBuiltIns;
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
|
|
||||||
@@ -29,7 +28,7 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.isNonCompanionObject;
|
|||||||
|
|
||||||
public class FieldInfo {
|
public class FieldInfo {
|
||||||
|
|
||||||
private static final CompanionObjectMapping COMPANION_OBJECT_MAPPING = new CompanionObjectMapping(JvmBuiltIns.getInstance());
|
private static final CompanionObjectMapping COMPANION_OBJECT_MAPPING = new CompanionObjectMapping();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static FieldInfo createForSingleton(@NotNull ClassDescriptor classDescriptor, @NotNull KotlinTypeMapper typeMapper) {
|
public static FieldInfo createForSingleton(@NotNull ClassDescriptor classDescriptor, @NotNull KotlinTypeMapper typeMapper) {
|
||||||
|
|||||||
+5
-1
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
|
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.swing.Icon
|
import javax.swing.Icon
|
||||||
@@ -456,7 +457,10 @@ open class KtLightClassForExplicitDeclaration(
|
|||||||
if (qualifiedName == DescriptorUtils.getFqName(classDescriptor).asString()) return true
|
if (qualifiedName == DescriptorUtils.getFqName(classDescriptor).asString()) return true
|
||||||
|
|
||||||
val fqName = FqNameUnsafe(qualifiedName)
|
val fqName = FqNameUnsafe(qualifiedName)
|
||||||
val mappedDescriptor = if (fqName.isSafe()) JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(fqName.toSafe()) else null
|
val mappedDescriptor =
|
||||||
|
if (fqName.isSafe)
|
||||||
|
JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(fqName.toSafe(), classDescriptor.builtIns)
|
||||||
|
else null
|
||||||
val mappedQName = if (mappedDescriptor == null) null else DescriptorUtils.getFqName(mappedDescriptor).asString()
|
val mappedQName = if (mappedDescriptor == null) null else DescriptorUtils.getFqName(mappedDescriptor).asString()
|
||||||
if (qualifiedName == mappedQName) return true
|
if (qualifiedName == mappedQName) return true
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ class LazyJavaAnnotationDescriptor(
|
|||||||
|
|
||||||
private val type = c.storageManager.createLazyValue {
|
private val type = c.storageManager.createLazyValue {
|
||||||
val fqName = fqName() ?: return@createLazyValue ErrorUtils.createErrorType("No fqName: $javaAnnotation")
|
val fqName = fqName() ?: return@createLazyValue ErrorUtils.createErrorType("No fqName: $javaAnnotation")
|
||||||
val annotationClass = JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(fqName)
|
val annotationClass = JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(fqName, c.module.builtIns)
|
||||||
?: javaAnnotation.resolve()?.let { javaClass -> c.components.moduleClassResolver.resolveClass(javaClass) }
|
?: javaAnnotation.resolve()?.let { javaClass -> c.components.moduleClassResolver.resolveClass(javaClass) }
|
||||||
?: createTypeForMissingDependencies(fqName)
|
?: createTypeForMissingDependencies(fqName)
|
||||||
annotationClass.defaultType
|
annotationClass.defaultType
|
||||||
|
|||||||
+3
-2
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
|||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.Flexibility.SpecificityRelation
|
import org.jetbrains.kotlin.types.Flexibility.SpecificityRelation
|
||||||
import org.jetbrains.kotlin.types.Variance.*
|
import org.jetbrains.kotlin.types.Variance.*
|
||||||
|
import org.jetbrains.kotlin.types.typeUtil.builtIns
|
||||||
import org.jetbrains.kotlin.types.typeUtil.createProjection
|
import org.jetbrains.kotlin.types.typeUtil.createProjection
|
||||||
import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations
|
import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations
|
||||||
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
|
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
|
||||||
@@ -143,13 +144,13 @@ class LazyJavaTypeResolver(
|
|||||||
|
|
||||||
// This case has to be checked before isMarkedReadOnly/isMarkedMutable, because those two are slow
|
// This case has to be checked before isMarkedReadOnly/isMarkedMutable, because those two are slow
|
||||||
// not mapped, we don't care about being marked mutable/read-only
|
// not mapped, we don't care about being marked mutable/read-only
|
||||||
javaToKotlin.mapPlatformClass(fqName).isEmpty() -> attr.howThisTypeIsUsed
|
javaToKotlin.mapPlatformClass(fqName, c.module.builtIns).isEmpty() -> attr.howThisTypeIsUsed
|
||||||
|
|
||||||
// Read (possibly external) annotations
|
// Read (possibly external) annotations
|
||||||
else -> attr.howThisTypeIsUsedAccordingToAnnotations
|
else -> attr.howThisTypeIsUsedAccordingToAnnotations
|
||||||
}
|
}
|
||||||
|
|
||||||
val kotlinDescriptor = javaToKotlin.mapJavaToKotlin(fqName) ?: return null
|
val kotlinDescriptor = javaToKotlin.mapJavaToKotlin(fqName, c.module.builtIns) ?: return null
|
||||||
|
|
||||||
if (javaToKotlin.isReadOnly(kotlinDescriptor)) {
|
if (javaToKotlin.isReadOnly(kotlinDescriptor)) {
|
||||||
if (howThisTypeIsUsedEffectively == MEMBER_SIGNATURE_COVARIANT
|
if (howThisTypeIsUsedEffectively == MEMBER_SIGNATURE_COVARIANT
|
||||||
|
|||||||
+78
-71
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.builtins.CompanionObjectMapping;
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor;
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.kotlin.name.ClassId;
|
import org.jetbrains.kotlin.name.*;
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe;
|
|
||||||
import org.jetbrains.kotlin.name.Name;
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType;
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType;
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
import org.jetbrains.kotlin.types.KotlinType;
|
||||||
@@ -34,59 +31,61 @@ import org.jetbrains.kotlin.types.TypeUtils;
|
|||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.FQ_NAMES;
|
||||||
|
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getBuiltIns;
|
||||||
|
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getFqNameUnsafe;
|
||||||
|
|
||||||
public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
||||||
public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap();
|
public static final JavaToKotlinClassMap INSTANCE = new JavaToKotlinClassMap();
|
||||||
|
|
||||||
private final Map<FqName, ClassDescriptor> javaToKotlin = new HashMap<FqName, ClassDescriptor>();
|
private final Map<FqNameUnsafe, FqName> javaToKotlin = new HashMap<FqNameUnsafe, FqName>();
|
||||||
private final Map<FqNameUnsafe, ClassId> kotlinToJava = new HashMap<FqNameUnsafe, ClassId>();
|
private final Map<FqNameUnsafe, ClassId> kotlinToJava = new HashMap<FqNameUnsafe, ClassId>();
|
||||||
|
|
||||||
private final Map<ClassDescriptor, ClassDescriptor> mutableToReadOnly = new HashMap<ClassDescriptor, ClassDescriptor>();
|
private final Map<FqNameUnsafe, FqName> mutableToReadOnly = new HashMap<FqNameUnsafe, FqName>();
|
||||||
private final Map<ClassDescriptor, ClassDescriptor> readOnlyToMutable = new HashMap<ClassDescriptor, ClassDescriptor>();
|
private final Map<FqNameUnsafe, FqName> readOnlyToMutable = new HashMap<FqNameUnsafe, FqName>();
|
||||||
private final CompanionObjectMapping companionObjectMapping;
|
private final CompanionObjectMapping companionObjectMapping;
|
||||||
|
|
||||||
private JavaToKotlinClassMap() {
|
private JavaToKotlinClassMap() {
|
||||||
KotlinBuiltIns builtIns = JvmBuiltIns.getInstance();
|
add(Object.class, FQ_NAMES.any);
|
||||||
|
add(String.class, FQ_NAMES.string);
|
||||||
|
add(CharSequence.class, FQ_NAMES.charSequence);
|
||||||
|
add(Throwable.class, FQ_NAMES.throwable);
|
||||||
|
add(Cloneable.class, FQ_NAMES.cloneable);
|
||||||
|
add(Number.class, FQ_NAMES.number);
|
||||||
|
add(Comparable.class, FQ_NAMES.comparable);
|
||||||
|
add(Enum.class, FQ_NAMES._enum);
|
||||||
|
add(Annotation.class, FQ_NAMES.annotation);
|
||||||
|
|
||||||
add(Object.class, builtIns.getAny());
|
add(Iterable.class, FQ_NAMES.iterable, FQ_NAMES.mutableIterable);
|
||||||
add(String.class, builtIns.getString());
|
add(Iterator.class, FQ_NAMES.iterator, FQ_NAMES.mutableIterator);
|
||||||
add(CharSequence.class, builtIns.getCharSequence());
|
add(Collection.class, FQ_NAMES.collection, FQ_NAMES.mutableCollection);
|
||||||
add(Throwable.class, builtIns.getThrowable());
|
add(List.class, FQ_NAMES.list, FQ_NAMES.mutableList);
|
||||||
add(Cloneable.class, builtIns.getCloneable());
|
add(Set.class, FQ_NAMES.set, FQ_NAMES.mutableSet);
|
||||||
add(Number.class, builtIns.getNumber());
|
add(Map.class, FQ_NAMES.map, FQ_NAMES.mutableMap);
|
||||||
add(Comparable.class, builtIns.getComparable());
|
add(Map.Entry.class, FQ_NAMES.mapEntry, FQ_NAMES.mutableMapEntry);
|
||||||
add(Enum.class, builtIns.getEnum());
|
add(ListIterator.class, FQ_NAMES.listIterator, FQ_NAMES.mutableListIterator);
|
||||||
add(Annotation.class, builtIns.getAnnotation());
|
|
||||||
|
|
||||||
add(Iterable.class, builtIns.getIterable(), builtIns.getMutableIterable());
|
|
||||||
add(Iterator.class, builtIns.getIterator(), builtIns.getMutableIterator());
|
|
||||||
add(Collection.class, builtIns.getCollection(), builtIns.getMutableCollection());
|
|
||||||
add(List.class, builtIns.getList(), builtIns.getMutableList());
|
|
||||||
add(Set.class, builtIns.getSet(), builtIns.getMutableSet());
|
|
||||||
add(Map.class, builtIns.getMap(), builtIns.getMutableMap());
|
|
||||||
add(Map.Entry.class, builtIns.getMapEntry(), builtIns.getMutableMapEntry());
|
|
||||||
add(ListIterator.class, builtIns.getListIterator(), builtIns.getMutableListIterator());
|
|
||||||
|
|
||||||
for (JvmPrimitiveType jvmType : JvmPrimitiveType.values()) {
|
for (JvmPrimitiveType jvmType : JvmPrimitiveType.values()) {
|
||||||
add(ClassId.topLevel(jvmType.getWrapperFqName()), builtIns.getPrimitiveClassDescriptor(jvmType.getPrimitiveType()));
|
add(ClassId.topLevel(jvmType.getWrapperFqName()), KotlinBuiltIns.getPrimitiveFqName(jvmType.getPrimitiveType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
companionObjectMapping = new CompanionObjectMapping(builtIns);
|
companionObjectMapping = new CompanionObjectMapping();
|
||||||
for (ClassDescriptor descriptor : companionObjectMapping.allClassesWithIntrinsicCompanions()) {
|
for (FqName fqName : companionObjectMapping.allClassesWithIntrinsicCompanions()) {
|
||||||
ClassDescriptor companion = descriptor.getCompanionObjectDescriptor();
|
add(ClassId.topLevel(
|
||||||
assert companion != null : "No companion object found for " + descriptor;
|
new FqName("kotlin.jvm.internal." + fqName.shortName().asString() + "CompanionObject")),
|
||||||
add(ClassId.topLevel(new FqName("kotlin.jvm.internal." + descriptor.getName().asString() + "CompanionObject")), companion);
|
fqName.child(SpecialNames.DEFAULT_NAME_FOR_COMPANION_OBJECT));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: support also functions with >= 23 parameters
|
// TODO: support also functions with >= 23 parameters
|
||||||
for (int i = 0; i < 23; i++) {
|
for (int i = 0; i < 23; i++) {
|
||||||
add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), builtIns.getFunction(i));
|
add(ClassId.topLevel(new FqName("kotlin.jvm.functions.Function" + i)), KotlinBuiltIns.getFunctionFqName(i));
|
||||||
|
|
||||||
FunctionClassDescriptor.Kind kFunction = FunctionClassDescriptor.Kind.KFunction;
|
FunctionClassDescriptor.Kind kFunction = FunctionClassDescriptor.Kind.KFunction;
|
||||||
String kFun = kFunction.getPackageFqName() + "." + kFunction.getClassNamePrefix();
|
String kFun = kFunction.getPackageFqName() + "." + kFunction.getClassNamePrefix();
|
||||||
addKotlinToJava(new FqNameUnsafe(kFun + i), ClassId.topLevel(new FqName(kFun)));
|
addKotlinToJava(new FqName(kFun + i), ClassId.topLevel(new FqName(kFun)));
|
||||||
}
|
}
|
||||||
|
|
||||||
addKotlinToJava(builtIns.getNothing(), classId(Void.class));
|
addKotlinToJava(FQ_NAMES.nothing.toSafe(), classId(Void.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -100,8 +99,9 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
|||||||
* kotlin.jvm.functions.Function3 -> kotlin.Function3
|
* kotlin.jvm.functions.Function3 -> kotlin.Function3
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public ClassDescriptor mapJavaToKotlin(@NotNull FqName fqName) {
|
public ClassDescriptor mapJavaToKotlin(@NotNull FqName fqName, @NotNull KotlinBuiltIns builtIns) {
|
||||||
return javaToKotlin.get(fqName);
|
FqName kotlinFqName = javaToKotlin.get(fqName.toUnsafe());
|
||||||
|
return kotlinFqName != null ? builtIns.getBuiltInClassByFqName(kotlinFqName) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,37 +125,37 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
|||||||
|
|
||||||
private void add(
|
private void add(
|
||||||
@NotNull Class<?> javaClass,
|
@NotNull Class<?> javaClass,
|
||||||
@NotNull ClassDescriptor kotlinDescriptor,
|
@NotNull FqName kotlinReadOnlyFqName,
|
||||||
@NotNull ClassDescriptor kotlinMutableDescriptor
|
@NotNull FqName kotlinMutableFqName
|
||||||
) {
|
) {
|
||||||
ClassId javaClassId = classId(javaClass);
|
ClassId javaClassId = classId(javaClass);
|
||||||
|
|
||||||
add(javaClassId, kotlinDescriptor);
|
add(javaClassId, kotlinReadOnlyFqName);
|
||||||
addKotlinToJava(kotlinMutableDescriptor, javaClassId);
|
addKotlinToJava(kotlinMutableFqName, javaClassId);
|
||||||
|
|
||||||
mutableToReadOnly.put(kotlinMutableDescriptor, kotlinDescriptor);
|
mutableToReadOnly.put(kotlinMutableFqName.toUnsafe(), kotlinReadOnlyFqName);
|
||||||
readOnlyToMutable.put(kotlinDescriptor, kotlinMutableDescriptor);
|
readOnlyToMutable.put(kotlinReadOnlyFqName.toUnsafe(), kotlinMutableFqName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) {
|
private void add(@NotNull ClassId javaClassId, @NotNull FqName kotlinFqName) {
|
||||||
addJavaToKotlin(javaClassId, kotlinDescriptor);
|
addJavaToKotlin(javaClassId, kotlinFqName);
|
||||||
addKotlinToJava(kotlinDescriptor, javaClassId);
|
addKotlinToJava(kotlinFqName, javaClassId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void add(@NotNull Class<?> javaClass, @NotNull ClassDescriptor kotlinDescriptor) {
|
private void add(@NotNull Class<?> javaClass, @NotNull FqNameUnsafe kotlinFqName) {
|
||||||
add(classId(javaClass), kotlinDescriptor);
|
add(javaClass, kotlinFqName.toSafe());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addJavaToKotlin(@NotNull ClassId javaClassId, @NotNull ClassDescriptor kotlinDescriptor) {
|
private void add(@NotNull Class<?> javaClass, @NotNull FqName kotlinFqName) {
|
||||||
javaToKotlin.put(javaClassId.asSingleFqName(), kotlinDescriptor);
|
add(classId(javaClass), kotlinFqName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addKotlinToJava(@NotNull ClassDescriptor kotlinDescriptor, @NotNull ClassId javaClassId) {
|
private void addJavaToKotlin(@NotNull ClassId javaClassId, @NotNull FqName kotlinFqName) {
|
||||||
addKotlinToJava(DescriptorUtils.getFqName(kotlinDescriptor), javaClassId);
|
javaToKotlin.put(javaClassId.asSingleFqName().toUnsafe(), kotlinFqName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addKotlinToJava(@NotNull FqNameUnsafe kotlinFqName, @NotNull ClassId javaClassId) {
|
private void addKotlinToJava(@NotNull FqName kotlinFqNameUnsafe, @NotNull ClassId javaClassId) {
|
||||||
kotlinToJava.put(kotlinFqName, javaClassId);
|
kotlinToJava.put(kotlinFqNameUnsafe.toUnsafe(), javaClassId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -168,25 +168,27 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Collection<ClassDescriptor> mapPlatformClass(@NotNull FqName fqName) {
|
public Collection<ClassDescriptor> mapPlatformClass(@NotNull FqName fqName, @NotNull KotlinBuiltIns builtIns) {
|
||||||
ClassDescriptor kotlinAnalog = mapJavaToKotlin(fqName);
|
ClassDescriptor kotlinAnalog = mapJavaToKotlin(fqName, builtIns);
|
||||||
if (kotlinAnalog == null) return Collections.emptySet();
|
if (kotlinAnalog == null) return Collections.emptySet();
|
||||||
|
|
||||||
ClassDescriptor kotlinMutableAnalog = readOnlyToMutable.get(kotlinAnalog);
|
FqName kotlinMutableAnalogFqName = readOnlyToMutable.get(getFqNameUnsafe(kotlinAnalog));
|
||||||
if (kotlinMutableAnalog == null) return Collections.singleton(kotlinAnalog);
|
if (kotlinMutableAnalogFqName == null) return Collections.singleton(kotlinAnalog);
|
||||||
|
|
||||||
return Arrays.asList(kotlinAnalog, kotlinMutableAnalog);
|
return Arrays.asList(kotlinAnalog, builtIns.getBuiltInClassByFqName(kotlinMutableAnalogFqName));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public Collection<ClassDescriptor> mapPlatformClass(@NotNull ClassDescriptor classDescriptor) {
|
public Collection<ClassDescriptor> mapPlatformClass(@NotNull ClassDescriptor classDescriptor) {
|
||||||
FqNameUnsafe className = DescriptorUtils.getFqName(classDescriptor);
|
FqNameUnsafe className = DescriptorUtils.getFqName(classDescriptor);
|
||||||
return className.isSafe() ? mapPlatformClass(className.toSafe()) : Collections.<ClassDescriptor>emptySet();
|
return className.isSafe()
|
||||||
|
? mapPlatformClass(className.toSafe(), getBuiltIns(classDescriptor))
|
||||||
|
: Collections.<ClassDescriptor>emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMutable(@NotNull ClassDescriptor mutable) {
|
public boolean isMutable(@NotNull ClassDescriptor mutable) {
|
||||||
return mutableToReadOnly.containsKey(mutable);
|
return mutableToReadOnly.containsKey(DescriptorUtils.getFqName(mutable));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isMutable(@NotNull KotlinType type) {
|
public boolean isMutable(@NotNull KotlinType type) {
|
||||||
@@ -195,7 +197,7 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReadOnly(@NotNull ClassDescriptor readOnly) {
|
public boolean isReadOnly(@NotNull ClassDescriptor readOnly) {
|
||||||
return readOnlyToMutable.containsKey(readOnly);
|
return readOnlyToMutable.containsKey(DescriptorUtils.getFqName(readOnly));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isReadOnly(@NotNull KotlinType type) {
|
public boolean isReadOnly(@NotNull KotlinType type) {
|
||||||
@@ -205,19 +207,24 @@ public class JavaToKotlinClassMap implements PlatformToKotlinClassMap {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public ClassDescriptor convertMutableToReadOnly(@NotNull ClassDescriptor mutable) {
|
public ClassDescriptor convertMutableToReadOnly(@NotNull ClassDescriptor mutable) {
|
||||||
ClassDescriptor readOnly = mutableToReadOnly.get(mutable);
|
return convertToOppositeMutability(mutable, mutableToReadOnly, "mutable");
|
||||||
if (readOnly == null) {
|
}
|
||||||
throw new IllegalArgumentException("Given class " + mutable + " is not a mutable collection");
|
|
||||||
|
@NotNull
|
||||||
|
private static ClassDescriptor convertToOppositeMutability(
|
||||||
|
@NotNull ClassDescriptor descriptor,
|
||||||
|
@NotNull Map<FqNameUnsafe, FqName> map,
|
||||||
|
@NotNull String mutabilityKindName
|
||||||
|
) {
|
||||||
|
FqName oppositeClassFqName = map.get(DescriptorUtils.getFqName(descriptor));
|
||||||
|
if (oppositeClassFqName == null) {
|
||||||
|
throw new IllegalArgumentException("Given class " + descriptor + " is not a " + mutabilityKindName + " collection");
|
||||||
}
|
}
|
||||||
return readOnly;
|
return getBuiltIns(descriptor).getBuiltInClassByFqName(oppositeClassFqName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public ClassDescriptor convertReadOnlyToMutable(@NotNull ClassDescriptor readOnly) {
|
public ClassDescriptor convertReadOnlyToMutable(@NotNull ClassDescriptor readOnly) {
|
||||||
ClassDescriptor mutable = readOnlyToMutable.get(readOnly);
|
return convertToOppositeMutability(readOnly, readOnlyToMutable, "read-only");
|
||||||
if (mutable == null) {
|
|
||||||
throw new IllegalArgumentException("Given class " + readOnly + " is not a read-only collection");
|
|
||||||
}
|
|
||||||
return mutable;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,25 +17,29 @@
|
|||||||
package org.jetbrains.kotlin.builtins
|
package org.jetbrains.kotlin.builtins
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class CompanionObjectMapping(private val builtIns: KotlinBuiltIns) {
|
class CompanionObjectMapping {
|
||||||
private val classes = linkedSetOf<ClassDescriptor>()
|
private val classesFqNames = linkedSetOf<FqName>()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
for (type in PrimitiveType.NUMBER_TYPES) {
|
for (type in PrimitiveType.NUMBER_TYPES) {
|
||||||
classes.add(builtIns.getPrimitiveClassDescriptor(type))
|
classesFqNames.add(KotlinBuiltIns.getPrimitiveFqName(type))
|
||||||
}
|
}
|
||||||
classes.add(builtIns.string)
|
classesFqNames.add(KotlinBuiltIns.FQ_NAMES.string.toSafe())
|
||||||
classes.add(builtIns.enum)
|
classesFqNames.add(KotlinBuiltIns.FQ_NAMES._enum.toSafe())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun allClassesWithIntrinsicCompanions(): Set<ClassDescriptor> =
|
fun allClassesWithIntrinsicCompanions(): Set<FqName> =
|
||||||
Collections.unmodifiableSet(classes)
|
Collections.unmodifiableSet(classesFqNames)
|
||||||
|
|
||||||
fun hasMappingToObject(classDescriptor: ClassDescriptor): Boolean {
|
fun hasMappingToObject(classDescriptor: ClassDescriptor): Boolean {
|
||||||
return DescriptorUtils.isCompanionObject(classDescriptor) &&
|
if (!DescriptorUtils.isCompanionObject(classDescriptor)) return false
|
||||||
classDescriptor.containingDeclaration in classes
|
val fqName = DescriptorUtils.getFqName(classDescriptor.containingDeclaration)
|
||||||
|
if (!fqName.isSafe) return false
|
||||||
|
|
||||||
|
return fqName.toSafe() in classesFqNames
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -165,10 +165,12 @@ public abstract class KotlinBuiltIns {
|
|||||||
|
|
||||||
|
|
||||||
public final FqName throwable = fqName("Throwable");
|
public final FqName throwable = fqName("Throwable");
|
||||||
|
public final FqName comparable = fqName("Comparable");
|
||||||
|
|
||||||
public final FqName deprecated = fqName("Deprecated");
|
public final FqName deprecated = fqName("Deprecated");
|
||||||
public final FqName deprecationLevel = fqName("DeprecationLevel");
|
public final FqName deprecationLevel = fqName("DeprecationLevel");
|
||||||
public final FqName extensionFunctionType = fqName("ExtensionFunctionType");
|
public final FqName extensionFunctionType = fqName("ExtensionFunctionType");
|
||||||
|
public final FqName annotation = fqName("Annotation");
|
||||||
public final FqName target = annotationName("Target");
|
public final FqName target = annotationName("Target");
|
||||||
public final FqName annotationTarget = annotationName("AnnotationTarget");
|
public final FqName annotationTarget = annotationName("AnnotationTarget");
|
||||||
public final FqName annotationRetention = annotationName("AnnotationRetention");
|
public final FqName annotationRetention = annotationName("AnnotationRetention");
|
||||||
@@ -292,12 +294,28 @@ public abstract class KotlinBuiltIns {
|
|||||||
FqName parent = fqName.parent();
|
FqName parent = fqName.parent();
|
||||||
BuiltInsPackageFragment packageFragment = packageNameToPackageFragment.get(parent);
|
BuiltInsPackageFragment packageFragment = packageNameToPackageFragment.get(parent);
|
||||||
if (packageFragment != null) {
|
if (packageFragment != null) {
|
||||||
return getBuiltInClassByNameNullable(fqName.shortName(), packageFragment);
|
ClassDescriptor descriptor = getBuiltInClassByNameNullable(fqName.shortName(), packageFragment);
|
||||||
|
if (descriptor != null) {
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassDescriptor possiblyOuterClass = getBuiltInClassByFqNameNullable(parent);
|
||||||
|
if (possiblyOuterClass != null) {
|
||||||
|
return (ClassDescriptor) possiblyOuterClass.getUnsubstitutedInnerClassesScope().getContributedClassifier(
|
||||||
|
fqName.shortName(), NoLookupLocation.FROM_BUILTINS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public ClassDescriptor getBuiltInClassByFqName(@NotNull FqName fqName) {
|
||||||
|
ClassDescriptor descriptor = getBuiltInClassByFqNameNullable(fqName);
|
||||||
|
assert descriptor != null : "Can't find built-in class " + fqName;
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private static ClassDescriptor getBuiltInClassByNameNullable(@NotNull Name simpleName, @NotNull PackageFragmentDescriptor packageFragment) {
|
private static ClassDescriptor getBuiltInClassByNameNullable(@NotNull Name simpleName, @NotNull PackageFragmentDescriptor packageFragment) {
|
||||||
ClassifierDescriptor classifier = packageFragment.getMemberScope().getContributedClassifier(
|
ClassifierDescriptor classifier = packageFragment.getMemberScope().getContributedClassifier(
|
||||||
@@ -408,6 +426,11 @@ public abstract class KotlinBuiltIns {
|
|||||||
return "Function" + parameterCount;
|
return "Function" + parameterCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static FqName getFunctionFqName(int parameterCount) {
|
||||||
|
return BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier(getFunctionName(parameterCount)));
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public ClassDescriptor getFunction(int parameterCount) {
|
public ClassDescriptor getFunction(int parameterCount) {
|
||||||
return getBuiltInClassByName(getFunctionName(parameterCount));
|
return getBuiltInClassByName(getFunctionName(parameterCount));
|
||||||
@@ -915,6 +938,10 @@ public abstract class KotlinBuiltIns {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FqName getPrimitiveFqName(@NotNull PrimitiveType primitiveType) {
|
||||||
|
return BUILT_INS_PACKAGE_FQ_NAME.child(primitiveType.getTypeName());
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isSuppressAnnotation(@NotNull AnnotationDescriptor annotationDescriptor) {
|
public static boolean isSuppressAnnotation(@NotNull AnnotationDescriptor annotationDescriptor) {
|
||||||
return isConstructedFromGivenClass(annotationDescriptor.getType(), FQ_NAMES.suppress);
|
return isConstructedFromGivenClass(annotationDescriptor.getType(), FQ_NAMES.suppress);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package kotlin.reflect.jvm.internal
|
package kotlin.reflect.jvm.internal
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
import org.jetbrains.kotlin.builtins.PrimitiveType
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
@@ -260,7 +261,7 @@ internal object RuntimeTypeMapper {
|
|||||||
|
|
||||||
val classId = klass.classId
|
val classId = klass.classId
|
||||||
if (!classId.isLocal) {
|
if (!classId.isLocal) {
|
||||||
JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(classId.asSingleFqName())?.let { return it.classId }
|
JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(classId.asSingleFqName(), DefaultBuiltIns.Instance)?.let { return it.classId }
|
||||||
}
|
}
|
||||||
|
|
||||||
return classId
|
return classId
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.core
|
package org.jetbrains.kotlin.idea.core
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
import org.jetbrains.kotlin.idea.util.ImportInsertHelper
|
||||||
import org.jetbrains.kotlin.load.java.components.JavaAnnotationMapper
|
import org.jetbrains.kotlin.load.java.components.JavaAnnotationMapper
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -66,7 +67,7 @@ class ImportableFqNameClassifier(private val file: KtFile) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
JavaToKotlinClassMap.INSTANCE.mapPlatformClass(fqName).isNotEmpty()
|
JavaToKotlinClassMap.INSTANCE.mapPlatformClass(fqName, DefaultBuiltIns.Instance).isNotEmpty()
|
||||||
|| JavaAnnotationMapper.javaToKotlinNameMap[fqName] != null -> Classification.notToBeUsedInKotlin
|
|| JavaAnnotationMapper.javaToKotlinNameMap[fqName] != null -> Classification.notToBeUsedInKotlin
|
||||||
|
|
||||||
fqName.parent() == file.packageFqName -> Classification.fromCurrentPackage
|
fqName.parent() == file.packageFqName -> Classification.fromCurrentPackage
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.intellij.lang.java.JavaLanguage
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.name.FqNameUnsafe
|
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||||
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
@@ -242,7 +243,9 @@ data class DataForConversion private constructor(
|
|||||||
else {
|
else {
|
||||||
val fqName = FqNameUnsafe(qualifiedName)
|
val fqName = FqNameUnsafe(qualifiedName)
|
||||||
// skip explicit imports of platform classes mapped into Kotlin classes
|
// skip explicit imports of platform classes mapped into Kotlin classes
|
||||||
if (fqName.isSafe && JavaToKotlinClassMap.INSTANCE.mapPlatformClass(fqName.toSafe()).isNotEmpty()) continue
|
if (fqName.isSafe
|
||||||
|
&& JavaToKotlinClassMap.INSTANCE.mapPlatformClass(
|
||||||
|
fqName.toSafe(), DefaultBuiltIns.Instance).isNotEmpty()) continue
|
||||||
append("import $qualifiedName\n")
|
append("import $qualifiedName\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import org.jetbrains.eval4j.jdi.JDIEval
|
|||||||
import org.jetbrains.eval4j.jdi.asJdiValue
|
import org.jetbrains.eval4j.jdi.asJdiValue
|
||||||
import org.jetbrains.eval4j.jdi.asValue
|
import org.jetbrains.eval4j.jdi.asValue
|
||||||
import org.jetbrains.eval4j.jdi.makeInitialFrame
|
import org.jetbrains.eval4j.jdi.makeInitialFrame
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
||||||
@@ -546,7 +547,7 @@ fun Type.getClassDescriptor(scope: GlobalSearchScope): ClassDescriptor? {
|
|||||||
|
|
||||||
val jvmName = JvmClassName.byInternalName(internalName).fqNameForClassNameWithoutDollars
|
val jvmName = JvmClassName.byInternalName(internalName).fqNameForClassNameWithoutDollars
|
||||||
|
|
||||||
val platformClasses = JavaToKotlinClassMap.INSTANCE.mapPlatformClass(jvmName)
|
val platformClasses = JavaToKotlinClassMap.INSTANCE.mapPlatformClass(jvmName, DefaultBuiltIns.Instance)
|
||||||
if (platformClasses.isNotEmpty()) return platformClasses.first()
|
if (platformClasses.isNotEmpty()) return platformClasses.first()
|
||||||
|
|
||||||
return runReadAction {
|
return runReadAction {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiImportStatementBase
|
|||||||
import com.intellij.psi.PsiJavaCodeReferenceElement
|
import com.intellij.psi.PsiJavaCodeReferenceElement
|
||||||
import org.jetbrains.kotlin.asJava.KtLightClass
|
import org.jetbrains.kotlin.asJava.KtLightClass
|
||||||
import org.jetbrains.kotlin.asJava.KtLightClassForFacade
|
import org.jetbrains.kotlin.asJava.KtLightClassForFacade
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.j2k.*
|
import org.jetbrains.kotlin.j2k.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
|
||||||
@@ -68,7 +69,7 @@ private fun Converter.filterImport(name: String, ref: PsiJavaCodeReferenceElemen
|
|||||||
if (annotationConverter.isImportNotRequired(name)) return null
|
if (annotationConverter.isImportNotRequired(name)) return null
|
||||||
|
|
||||||
// If imported class has a kotlin analog, drop the import
|
// If imported class has a kotlin analog, drop the import
|
||||||
if (!JavaToKotlinClassMap.INSTANCE.mapPlatformClass(FqName(name)).isEmpty()) return null
|
if (!JavaToKotlinClassMap.INSTANCE.mapPlatformClass(FqName(name), DefaultBuiltIns.Instance).isEmpty()) return null
|
||||||
|
|
||||||
val target = ref.resolve()
|
val target = ref.resolve()
|
||||||
if (target is KtLightClassForFacade) {
|
if (target is KtLightClassForFacade) {
|
||||||
|
|||||||
+1
-1
@@ -38,7 +38,7 @@ class DefaultClassObjectIntrinsic(val fqName: FqName, val moduleName: String): O
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ObjectIntrinsics {
|
class ObjectIntrinsics {
|
||||||
private val companionObjectMapping = CompanionObjectMapping(JsPlatform.builtIns)
|
private val companionObjectMapping = CompanionObjectMapping()
|
||||||
|
|
||||||
fun getIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic {
|
fun getIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic {
|
||||||
if (!companionObjectMapping.hasMappingToObject(classDescriptor)) return NO_OBJECT_INTRINSIC
|
if (!companionObjectMapping.hasMappingToObject(classDescriptor)) return NO_OBJECT_INTRINSIC
|
||||||
|
|||||||
Reference in New Issue
Block a user