Filter out UnsafeVariance annotation when it sticks after substitution

This commit is contained in:
Denis Zharkov
2015-10-09 08:32:53 +03:00
parent 888f8cc548
commit da00ddfc3e
@@ -16,11 +16,15 @@
package org.jetbrains.kotlin.types;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations;
import org.jetbrains.kotlin.descriptors.annotations.FilteredAnnotations;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.resolve.calls.inference.InferencePackage;
import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope;
import org.jetbrains.kotlin.types.typeUtil.TypeUtilPackage;
@@ -179,9 +183,10 @@ public class TypeSubstitutor {
// substitutionType.annotations = replacement.annotations ++ type.annotations
if (!type.getAnnotations().isEmpty()) {
Annotations typeAnnotations = filterOutUnsafeVariance(type.getAnnotations());
substitutedType = TypeUtilPackage.replaceAnnotations(
substitutedType,
new CompositeAnnotations(substitutedType.getAnnotations(), type.getAnnotations())
new CompositeAnnotations(substitutedType.getAnnotations(), typeAnnotations)
);
}
@@ -194,6 +199,17 @@ public class TypeSubstitutor {
return substituteCompoundType(originalProjection, recursionDepth);
}
@NotNull
private static Annotations filterOutUnsafeVariance(@NotNull Annotations annotations) {
if (!annotations.hasAnnotation(KotlinBuiltIns.FQ_NAMES.unsafeVariance)) return annotations;
return new FilteredAnnotations(annotations, new Function1<FqName, Boolean>() {
@Override
public Boolean invoke(@NotNull FqName name) {
return !name.equals(KotlinBuiltIns.FQ_NAMES.unsafeVariance);
}
});
}
private TypeProjection substituteCompoundType(
TypeProjection originalProjection,
int recursionDepth