KotlinToJavaTypesMap, JavaToKotlinTypesMap added

This commit is contained in:
Svetlana Isakova
2012-08-24 17:12:31 +04:00
parent a503d53a1e
commit a386a5eb1e
7 changed files with 269 additions and 174 deletions
@@ -0,0 +1,117 @@
/*
* Copyright 2010-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Maps;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
import java.util.Map;
/**
* @author svtk
*/
public class JavaToKotlinTypesMap {
private static JavaToKotlinTypesMap instance = null;
@NotNull
public static JavaToKotlinTypesMap getInstance() {
if (instance == null) {
instance = new JavaToKotlinTypesMap();
}
return instance;
}
private final Map<FqName, ClassDescriptor> classDescriptorMap = Maps.newHashMap();
private final Map<FqName, ClassDescriptor> classDescriptorMapForCovariantPositions = Maps.newHashMap();
private final Map<String, JetType> primitiveTypesMap = Maps.newHashMap();
private JavaToKotlinTypesMap() {
init();
initPrimitive();
}
@Nullable
public JetType getPrimitiveKotlinAnalog(@NotNull String name) {
return primitiveTypesMap.get(name);
}
@Nullable
public ClassDescriptor getKotlinAnalog(@NotNull FqName fqName, @NotNull JavaTypeTransformer.TypeUsage typeUsage) {
if (typeUsage == JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_COVARIANT) {
ClassDescriptor descriptor = classDescriptorMapForCovariantPositions.get(fqName);
if (descriptor != null) {
return descriptor;
}
}
return classDescriptorMap.get(fqName);
}
private void init() {
JetStandardLibrary standardLibrary = JetStandardLibrary.getInstance();
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
register(jvmPrimitiveType.getWrapper().getFqName(), standardLibrary.getPrimitiveClassDescriptor(primitiveType));
}
register("java.lang.Object", JetStandardClasses.getAny());
register("java.lang.String", standardLibrary.getString());
register("java.lang.CharSequence", standardLibrary.getCharSequence());
register("java.lang.Throwable", standardLibrary.getThrowable());
register("java.lang.Number", standardLibrary.getNumber());
register("java.lang.Comparable", standardLibrary.getComparable());
register("java.lang.Enum", standardLibrary.getEnum());
register("java.lang.Iterable", standardLibrary.getIterable());
register("java.util.Iterator", standardLibrary.getIterator());
registerCovariant("java.lang.Iterable", standardLibrary.getMutableIterable());
registerCovariant("java.util.Iterator", standardLibrary.getMutableIterator());
}
private void register(String className, ClassDescriptor classDescriptor) {
register(new FqName(className), classDescriptor);
}
private void register(FqName fqName, ClassDescriptor classDescriptor) {
classDescriptorMap.put(fqName, classDescriptor);
}
private void registerCovariant(String className, ClassDescriptor classDescriptor) {
registerCovariant(new FqName(className), classDescriptor);
}
private void registerCovariant(FqName fqName, ClassDescriptor classDescriptor) {
classDescriptorMapForCovariantPositions.put(fqName, classDescriptor);
}
private void initPrimitive() {
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
primitiveTypesMap.put(jvmPrimitiveType.getName(), JetStandardLibrary.getInstance().getPrimitiveJetType(primitiveType));
primitiveTypesMap.put("[" + jvmPrimitiveType.getName(), JetStandardLibrary.getInstance().getPrimitiveArrayJetType(primitiveType));
primitiveTypesMap.put(jvmPrimitiveType.getWrapper().getFqName().getFqName(), JetStandardLibrary.getInstance().getNullablePrimitiveJetType(
primitiveType));
}
primitiveTypesMap.put("void", JetStandardClasses.getUnitType());
}
}
@@ -17,11 +17,9 @@
package org.jetbrains.jet.lang.resolve.java;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
@@ -45,7 +43,6 @@ public class JavaTypeTransformer {
private JavaSemanticServices javaSemanticServices;
private JavaDescriptorResolver resolver;
@Inject
public void setJavaSemanticServices(JavaSemanticServices javaSemanticServices) {
this.javaSemanticServices = javaSemanticServices;
@@ -56,13 +53,6 @@ public class JavaTypeTransformer {
this.resolver = resolver;
}
private Map<String, JetType> primitiveTypesMap;
private Map<FqName, ClassDescriptor> classDescriptorMap;
private Map<FqName, ClassDescriptor> classDescriptorMapForCovariantPositions;
@NotNull
private TypeProjection transformToTypeProjection(@NotNull final PsiType javaType,
@NotNull final TypeParameterDescriptor typeParameterDescriptor,
@@ -159,7 +149,8 @@ public class JavaTypeTransformer {
// 'L extends List<T>' in Java is a List<T> in Kotlin, not a List<T?>
boolean nullable = !EnumSet.of(SUPERTYPE_ARGUMENT, SUPERTYPE).contains(howThisTypeIsUsed);
ClassDescriptor classData = getKotlinAnalog(new FqName(psiClass.getQualifiedName()), howThisTypeIsUsed);
ClassDescriptor classData = JavaToKotlinTypesMap.getInstance().getKotlinAnalog(new FqName(psiClass.getQualifiedName()),
howThisTypeIsUsed);
if (classData == null) {
classData = resolver.resolveClass(new FqName(psiClass.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
@@ -206,7 +197,7 @@ public class JavaTypeTransformer {
@Override
public JetType visitPrimitiveType(PsiPrimitiveType primitiveType) {
String canonicalText = primitiveType.getCanonicalText();
JetType type = getPrimitiveTypesMap().get(canonicalText);
JetType type = JavaToKotlinTypesMap.getInstance().getPrimitiveKotlinAnalog(canonicalText);
assert type != null : canonicalText;
return type;
}
@@ -215,7 +206,7 @@ public class JavaTypeTransformer {
public JetType visitArrayType(PsiArrayType arrayType) {
PsiType componentType = arrayType.getComponentType();
if (componentType instanceof PsiPrimitiveType) {
JetType jetType = getPrimitiveTypesMap().get("[" + componentType.getCanonicalText());
JetType jetType = JavaToKotlinTypesMap.getInstance().getPrimitiveKotlinAnalog("[" + componentType.getCanonicalText());
if (jetType != null)
return TypeUtils.makeNullable(jetType);
}
@@ -240,61 +231,6 @@ public class JavaTypeTransformer {
return result;
}
public Map<String, JetType> getPrimitiveTypesMap() {
if (primitiveTypesMap == null) {
primitiveTypesMap = new HashMap<String, JetType>();
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
primitiveTypesMap.put(jvmPrimitiveType.getName(), JetStandardLibrary.getInstance().getPrimitiveJetType(primitiveType));
primitiveTypesMap.put("[" + jvmPrimitiveType.getName(), JetStandardLibrary.getInstance().getPrimitiveArrayJetType(primitiveType));
primitiveTypesMap.put(jvmPrimitiveType.getWrapper().getFqName().getFqName(), JetStandardLibrary.getInstance().getNullablePrimitiveJetType(
primitiveType));
}
primitiveTypesMap.put("void", JetStandardClasses.getUnitType());
}
return primitiveTypesMap;
}
public Map<FqName, ClassDescriptor> getClassDescriptorMap() {
if (classDescriptorMap == null) {
classDescriptorMap = Maps.newHashMap();
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
classDescriptorMap.put(jvmPrimitiveType.getWrapper().getFqName(), JetStandardLibrary.getInstance().getPrimitiveClassDescriptor(primitiveType));
}
classDescriptorMap.put(new FqName("java.lang.Object"), JetStandardClasses.getAny());
classDescriptorMap.put(new FqName("java.lang.String"), JetStandardLibrary.getInstance().getString());
classDescriptorMap.put(new FqName("java.lang.CharSequence"), JetStandardLibrary.getInstance().getCharSequence());
classDescriptorMap.put(new FqName("java.lang.Throwable"), JetStandardLibrary.getInstance().getThrowable());
classDescriptorMap.put(new FqName("java.lang.Number"), JetStandardLibrary.getInstance().getNumber());
classDescriptorMap.put(new FqName("java.lang.Comparable"), JetStandardLibrary.getInstance().getComparable());
classDescriptorMap.put(new FqName("java.lang.Enum"), JetStandardLibrary.getInstance().getEnum());
classDescriptorMap.put(new FqName("java.lang.Iterable"), JetStandardLibrary.getInstance().getIterable());
classDescriptorMap.put(new FqName("java.util.Iterator"), JetStandardLibrary.getInstance().getIterator());
}
return classDescriptorMap;
}
public Map<FqName, ClassDescriptor> getClassDescriptorMapForCovariantPositions() {
if (classDescriptorMapForCovariantPositions == null) {
classDescriptorMapForCovariantPositions = Maps.newHashMap();
classDescriptorMapForCovariantPositions.put(new FqName("java.lang.Iterable"), JetStandardLibrary.getInstance().getMutableIterable());
classDescriptorMapForCovariantPositions.put(new FqName("java.util.Iterator"), JetStandardLibrary.getInstance().getMutableIterator());
}
return classDescriptorMapForCovariantPositions;
}
@Nullable
public ClassDescriptor getKotlinAnalog(@NotNull FqName fqName, @NotNull TypeUsage typeUsage) {
if (typeUsage == MEMBER_SIGNATURE_COVARIANT) {
ClassDescriptor descriptor = getClassDescriptorMapForCovariantPositions().get(fqName);
if (descriptor != null) {
return descriptor;
}
}
return getClassDescriptorMap().get(fqName);
}
/**
* We convert Java types differently, depending on where they occur in the Java code
* This enum encodes the kinds of occurrences
@@ -95,7 +95,7 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd
this.classDescriptor = null;
if (!forceReal) {
classDescriptor = javaSemanticServices.getTypeTransformer().getKotlinAnalog(ourName, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_INVARIANT);
classDescriptor = JavaToKotlinTypesMap.getInstance().getKotlinAnalog(ourName, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_INVARIANT);
}
if (classDescriptor == null) {