Drop BindingContext.ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT

Use AnnotationDescriptor.getSource() instead
This commit is contained in:
Alexander Udalov
2015-07-24 02:20:36 +03:00
parent d0562b7b90
commit 49a8c7a947
6 changed files with 23 additions and 26 deletions
@@ -181,7 +181,7 @@ public class PublicFieldAnnotationChecker: DeclarationChecker {
val annotation = descriptor.findPublicFieldAnnotation() ?: return
fun report() {
val annotationEntry = bindingContext.get(BindingContext.ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT, annotation) ?: return
val annotationEntry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation) ?: return
diagnosticHolder.report(ErrorsJvm.INAPPLICABLE_PUBLIC_FIELD.on(annotationEntry))
}
@@ -86,9 +86,7 @@ public interface BindingContext {
}
};
WritableSlice<AnnotationDescriptor, JetAnnotationEntry> ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT = Slices.createSimpleSlice();
WritableSlice<JetAnnotationEntry, AnnotationDescriptor> ANNOTATION =
Slices.<JetAnnotationEntry, AnnotationDescriptor>sliceBuilder().setOpposite(ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT).build();
WritableSlice<JetAnnotationEntry, AnnotationDescriptor> ANNOTATION = Slices.createSimpleSlice();
WritableSlice<JetExpression, CompileTimeConstant<?>> COMPILE_TIME_VALUE = Slices.createSimpleSlice();
@@ -17,19 +17,18 @@
package org.jetbrains.kotlin.resolve
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.psi.JetAnnotationEntry
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.resolve.source.*
import org.jetbrains.kotlin.resolve.source.getPsi
import java.util.ArrayList
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED
import kotlin.platform.*
import kotlin.platform.platformStatic
public object DescriptorToSourceUtils {
private fun collectEffectiveReferencedDescriptors(result: MutableList<DeclarationDescriptor>, descriptor: DeclarationDescriptor) {
@@ -57,6 +56,11 @@ public object DescriptorToSourceUtils {
return (descriptor as? DeclarationDescriptorWithSource)?.getSource()?.getPsi()
}
platformStatic
public fun getSourceFromAnnotation(descriptor: AnnotationDescriptor): JetAnnotationEntry? {
return descriptor.source.getPsi() as? JetAnnotationEntry
}
// NOTE this is also used by KDoc
// Returns PSI element for descriptor. If there are many relevant elements (e.g. it is fake override
// with multiple declarations), returns null. It can't find declarations in builtins or decompiled code.
@@ -377,7 +377,7 @@ public class ModifiersChecker {
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(new FqName("kotlin.platform.platformName"));
if (annotation == null) return;
JetAnnotationEntry annotationEntry = trace.get(BindingContext.ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT, annotation);
JetAnnotationEntry annotationEntry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation);
if (annotationEntry == null) return;
if (descriptor instanceof FunctionDescriptor && !isRenamableFunction((FunctionDescriptor) descriptor)) {
@@ -30,6 +30,7 @@ import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.kotlin.lexer.JetTokens;
@@ -49,7 +50,6 @@ import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.*;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractMembers;
import static org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage.getBuiltIns;
public class OverrideResolver {
@@ -716,15 +716,15 @@ public class OverrideResolver {
}
@NotNull
private JetAnnotationEntry findDataAnnotationForDataClass(@NotNull DeclarationDescriptor dataClass) {
ClassDescriptor stdDataClassAnnotation = getBuiltIns(dataClass).getDataClassAnnotation();
AnnotationDescriptor annotation = dataClass.getAnnotations().findAnnotation(DescriptorUtils.getFqNameSafe(stdDataClassAnnotation));
if (annotation == null) {
throw new IllegalStateException("No data annotation is found for data class " + dataClass);
private static JetAnnotationEntry findDataAnnotationForDataClass(@NotNull DeclarationDescriptor dataClass) {
AnnotationDescriptor annotation = dataClass.getAnnotations().findAnnotation(KotlinBuiltIns.FQ_NAMES.data);
if (annotation != null) {
JetAnnotationEntry entry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation);
if (entry != null) {
return entry;
}
}
return BindingContextUtils.getNotNull(trace.getBindingContext(),
BindingContext.ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT,
annotation);
throw new IllegalStateException("No data annotation is found for data class " + dataClass);
}
@Nullable
@@ -381,11 +381,6 @@ public class KotlinBuiltIns {
return getBuiltInClassByName("Cloneable");
}
@NotNull
public ClassDescriptor getDataClassAnnotation() {
return getBuiltInClassByName("data");
}
@NotNull
public ClassDescriptor getDeprecatedAnnotation() {
return getBuiltInClassByName("deprecated");