Implement mutability annotation support in type resolver
This commit is contained in:
+15
@@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
@@ -267,4 +268,18 @@ public class JavaTypeTransformer {
|
|||||||
return classType.isRaw() || argumentsExpected && classType.getParameterCount() == 0;
|
return classType.isRaw() || argumentsExpected && classType.getParameterCount() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TypeUsage adjustTypeUsageWithMutabilityAnnotations(PsiModifierListOwner owner, TypeUsage originalTypeUsage) {
|
||||||
|
EnumSet<TypeUsage> signatureTypeUsages =
|
||||||
|
EnumSet.of(TypeUsage.MEMBER_SIGNATURE_COVARIANT, TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, TypeUsage.MEMBER_SIGNATURE_INVARIANT);
|
||||||
|
if (!signatureTypeUsages.contains(originalTypeUsage)) {
|
||||||
|
return originalTypeUsage;
|
||||||
|
}
|
||||||
|
if (JavaAnnotationResolver.findAnnotationWithExternal(owner, JvmAbi.JETBRAINS_MUTABLE_ANNOTATION.getFqName().getFqName()) != null) {
|
||||||
|
return TypeUsage.MEMBER_SIGNATURE_COVARIANT;
|
||||||
|
}
|
||||||
|
if (JavaAnnotationResolver.findAnnotationWithExternal(owner, JvmAbi.JETBRAINS_READONLY_ANNOTATION.getFqName().getFqName()) != null) {
|
||||||
|
return TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT;
|
||||||
|
}
|
||||||
|
return originalTypeUsage;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ public class JvmAbi {
|
|||||||
public static final JvmClassName JETBRAINS_NOT_NULL_ANNOTATION =
|
public static final JvmClassName JETBRAINS_NOT_NULL_ANNOTATION =
|
||||||
JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.annotations.NotNull");
|
JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.annotations.NotNull");
|
||||||
|
|
||||||
|
public static final JvmClassName JETBRAINS_MUTABLE_ANNOTATION =
|
||||||
|
JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.annotations.Mutable");
|
||||||
|
public static final JvmClassName JETBRAINS_READONLY_ANNOTATION =
|
||||||
|
JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.annotations.ReadOnly");
|
||||||
|
|
||||||
public static boolean isClassObjectFqName(@NotNull FqName fqName) {
|
public static boolean isClassObjectFqName(@NotNull FqName fqName) {
|
||||||
return fqName.lastSegmentIs(Name.identifier(CLASS_OBJECT_CLASS_NAME));
|
return fqName.lastSegmentIs(Name.identifier(CLASS_OBJECT_CLASS_NAME));
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-7
@@ -21,6 +21,7 @@ import com.google.common.collect.Sets;
|
|||||||
import com.intellij.openapi.diagnostic.Logger;
|
import com.intellij.openapi.diagnostic.Logger;
|
||||||
import com.intellij.psi.PsiClass;
|
import com.intellij.psi.PsiClass;
|
||||||
import com.intellij.psi.PsiMethod;
|
import com.intellij.psi.PsiMethod;
|
||||||
|
import com.intellij.psi.PsiModifierListOwner;
|
||||||
import com.intellij.psi.PsiType;
|
import com.intellij.psi.PsiType;
|
||||||
import com.intellij.psi.util.PsiFormatUtil;
|
import com.intellij.psi.util.PsiFormatUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -45,10 +46,7 @@ import org.jetbrains.jet.lang.types.*;
|
|||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.util.Collections;
|
import java.util.*;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
|
||||||
import static org.jetbrains.jet.lang.resolve.OverridingUtil.*;
|
import static org.jetbrains.jet.lang.resolve.OverridingUtil.*;
|
||||||
@@ -143,7 +141,6 @@ public final class JavaFunctionResolver {
|
|||||||
functionDescriptorImpl,
|
functionDescriptorImpl,
|
||||||
context);
|
context);
|
||||||
|
|
||||||
|
|
||||||
JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = parameterResolver
|
JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = parameterResolver
|
||||||
.resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
|
.resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
|
||||||
JetType returnType = makeReturnType(returnPsiType, method, methodTypeVariableResolver);
|
JetType returnType = makeReturnType(returnPsiType, method, methodTypeVariableResolver);
|
||||||
@@ -414,8 +411,8 @@ public final class JavaFunctionResolver {
|
|||||||
transformedType = typeTransformer.transformToType(returnTypeFromAnnotation, typeVariableResolver);
|
transformedType = typeTransformer.transformToType(returnTypeFromAnnotation, typeVariableResolver);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
transformedType = typeTransformer.transformToType(
|
TypeUsage typeUsage = JavaTypeTransformer.adjustTypeUsageWithMutabilityAnnotations(method.getPsiMethod(), TypeUsage.MEMBER_SIGNATURE_COVARIANT);
|
||||||
returnType, TypeUsage.MEMBER_SIGNATURE_COVARIANT, typeVariableResolver);
|
transformedType = typeTransformer.transformToType(returnType, typeUsage, typeVariableResolver);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (JavaAnnotationResolver.findAnnotationWithExternal(method.getPsiMethod(), JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) !=
|
if (JavaAnnotationResolver.findAnnotationWithExternal(method.getPsiMethod(), JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) !=
|
||||||
|
|||||||
+2
-2
@@ -71,8 +71,8 @@ public final class JavaValueParameterResolver {
|
|||||||
outType = getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
|
outType = getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
outType = getTypeTransformer().transformToType(psiType, TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT,
|
TypeUsage typeUsage = JavaTypeTransformer.adjustTypeUsageWithMutabilityAnnotations(parameter.getPsiParameter(), TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT);
|
||||||
typeVariableResolver);
|
outType = getTypeTransformer().transformToType(psiType, typeUsage, typeVariableResolver);
|
||||||
}
|
}
|
||||||
|
|
||||||
JetType varargElementType;
|
JetType varargElementType;
|
||||||
|
|||||||
Reference in New Issue
Block a user