Map intrinsic companion objects in JavaToKotlinClassMap

Get rid of multiple usages of IntrinsicObjects where JavaToKotlinClassMap was
already used, simplify code, and support loading of *CompanionObject as Kotlin
built-in companions from Java code.

Also fix a small bug where Boolean was considered a class with an intrinsic
companion in IntrinsicObjects, although it was not
This commit is contained in:
Alexander Udalov
2015-04-23 19:33:37 +03:00
parent 987206bf95
commit d2cd7b00bb
12 changed files with 62 additions and 111 deletions
@@ -17,7 +17,7 @@
package org.jetbrains.kotlin.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.builtins.jvm.IntrinsicObjects;
import org.jetbrains.kotlin.builtins.CompanionObjectMapping;
import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor;
@@ -34,7 +34,7 @@ public class FieldInfo {
throw new UnsupportedOperationException("Can't create singleton field for class: " + classDescriptor);
}
if (isNonCompanionObject(classDescriptor) || IntrinsicObjects.INSTANCE$.hasMappingToObject(classDescriptor)) {
if (isNonCompanionObject(classDescriptor) || CompanionObjectMapping.hasMappingToObject(classDescriptor)) {
Type type = typeMapper.mapType(classDescriptor);
return new FieldInfo(type, type, JvmAbi.INSTANCE_FIELD, true);
}
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.builtins.PrimitiveType;
import org.jetbrains.kotlin.builtins.jvm.IntrinsicObjects;
import org.jetbrains.kotlin.codegen.*;
import org.jetbrains.kotlin.codegen.binding.CodegenBinding;
import org.jetbrains.kotlin.codegen.binding.MutableClosure;
@@ -339,16 +338,6 @@ public class JetTypeMapper {
}
if (descriptor instanceof ClassDescriptor) {
FqName companionObjectMappedFqName = IntrinsicObjects.mapType((ClassDescriptor) descriptor);
if (companionObjectMappedFqName != null) {
Type asmType = asmTypeByFqNameWithoutInnerClasses(companionObjectMappedFqName);
if (signatureVisitor != null) {
signatureVisitor.writeAsmType(asmType);
}
return asmType;
}
Type asmType = kind.isForAnnotation() && KotlinBuiltIns.isKClass((ClassDescriptor) descriptor) ?
AsmTypes.JAVA_CLASS_TYPE :
computeAsmType((ClassDescriptor) descriptor.getOriginal());
@@ -0,0 +1,10 @@
package test;
import kotlin.jvm.internal.*;
public interface IntrinsicCompanionObject {
void testInt(IntCompanionObject i);
void testChar(CharCompanionObject c);
void testString(StringCompanionObject s);
void testEnum(EnumCompanionObject e);
}
@@ -0,0 +1,8 @@
package test
public trait IntrinsicCompanionObject {
public abstract fun testChar(/*0*/ p0: kotlin.Char.Companion!): kotlin.Unit
public abstract fun testEnum(/*0*/ p0: kotlin.Enum.Companion!): kotlin.Unit
public abstract fun testInt(/*0*/ p0: kotlin.Int.Companion!): kotlin.Unit
public abstract fun testString(/*0*/ p0: kotlin.String.Companion!): kotlin.Unit
}
@@ -145,6 +145,12 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledJava(fileName);
}
@TestMetadata("IntrinsicCompanionObject.java")
public void testIntrinsicCompanionObject() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/IntrinsicCompanionObject.java");
doTestCompiledJava(fileName);
}
@TestMetadata("MethodReferencesOuterClassTP.java")
public void testMethodReferencesOuterClassTP() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/MethodReferencesOuterClassTP.java");
@@ -3151,6 +3151,12 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD
doTest(fileName);
}
@TestMetadata("IntrinsicCompanionObject.java")
public void testIntrinsicCompanionObject() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/IntrinsicCompanionObject.java");
doTest(fileName);
}
@TestMetadata("MethodReferencesOuterClassTP.java")
public void testMethodReferencesOuterClassTP() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/MethodReferencesOuterClassTP.java");