[duplicates] enable duplicates analysis in PyCharm/WebStorm/PhpStorm/RubyMine
[idea/community.git] / java / java-psi-api / src / com / intellij / psi / PsiAnnotationAttributeValues.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.psi;
3
4 import com.intellij.lang.jvm.JvmAnnotation;
5 import com.intellij.lang.jvm.JvmClass;
6 import com.intellij.lang.jvm.JvmEnumField;
7 import com.intellij.lang.jvm.annotation.*;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.Nullable;
10
11 import java.util.List;
12
13 import static com.intellij.util.containers.ContainerUtil.map;
14
15 abstract class PsiAnnotationAttributeValue<T extends PsiAnnotationMemberValue> implements JvmAnnotationAttributeValue {
16
17   protected final T myElement;
18
19   protected PsiAnnotationAttributeValue(@NotNull T value) {
20     myElement = value;
21   }
22
23   @Nullable
24   @Override
25   public PsiElement getSourceElement() {
26     return myElement;
27   }
28
29   @Override
30   public boolean isValid() {
31     return myElement.isValid();
32   }
33
34   @Override
35   public void navigate(boolean requestFocus) {}
36
37   @Override
38   public boolean canNavigate() {
39     return false;
40   }
41
42   @Override
43   public boolean canNavigateToSource() {
44     return false;
45   }
46 }
47
48 class PsiAnnotationConstantValue extends PsiAnnotationAttributeValue<PsiExpression> implements JvmAnnotationConstantValue {
49
50   PsiAnnotationConstantValue(@NotNull PsiExpression value) {
51     super(value);
52   }
53
54   @Nullable
55   @Override
56   public Object getConstantValue() {
57     PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(myElement.getProject()).getConstantEvaluationHelper();
58     return evaluationHelper.computeConstantExpression(myElement);
59   }
60 }
61
62 class PsiAnnotationClassValue extends PsiAnnotationAttributeValue<PsiClassObjectAccessExpression> implements JvmAnnotationClassValue {
63
64   PsiAnnotationClassValue(@NotNull PsiClassObjectAccessExpression value) {
65     super(value);
66   }
67
68   private PsiJavaCodeReferenceElement getReferenceElement() {
69     return myElement.getOperand().getInnermostComponentReferenceElement();
70   }
71
72   @Nullable
73   @Override
74   public String getQualifiedName() {
75     final PsiJavaCodeReferenceElement referenceElement = getReferenceElement();
76     return referenceElement == null ? null : referenceElement.getQualifiedName();
77   }
78
79   @Nullable
80   @Override
81   public JvmClass getClazz() {
82     PsiJavaCodeReferenceElement referenceElement = getReferenceElement();
83     if (referenceElement == null) return null;
84     PsiElement resolved = referenceElement.resolve();
85     return resolved instanceof JvmClass ? (JvmClass)resolved : null;
86   }
87 }
88
89 class PsiNestedAnnotationValue extends PsiAnnotationAttributeValue<PsiAnnotation> implements JvmNestedAnnotationValue {
90
91   PsiNestedAnnotationValue(@NotNull PsiAnnotation value) {
92     super(value);
93   }
94
95   @NotNull
96   @Override
97   public JvmAnnotation getValue() {
98     return myElement;
99   }
100 }
101
102 class PsiAnnotationEnumFieldValue extends PsiAnnotationAttributeValue<PsiReferenceExpression> implements JvmAnnotationEnumFieldValue {
103
104   private final JvmEnumField myEnumField;
105
106   PsiAnnotationEnumFieldValue(@NotNull PsiReferenceExpression value, @NotNull JvmEnumField field) {
107     super(value);
108     myEnumField = field;
109   }
110
111   @Nullable
112   @Override
113   public JvmEnumField getField() {
114     return myEnumField;
115   }
116 }
117
118 class PsiAnnotationArrayValue extends PsiAnnotationAttributeValue<PsiArrayInitializerMemberValue> implements JvmAnnotationArrayValue {
119
120   PsiAnnotationArrayValue(@NotNull PsiArrayInitializerMemberValue value) {
121     super(value);
122   }
123
124   @NotNull
125   @Override
126   public List<JvmAnnotationAttributeValue> getValues() {
127     return map(myElement.getInitializers(), PsiJvmConversionHelper::getAnnotationAttributeValue);
128   }
129 }