summaryrefslogtreecommitdiff
path: root/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java')
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java39
1 files changed, 34 insertions, 5 deletions
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
index 77fd0081d161..81ada724578f 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java
@@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.filters.ElementFilter;
@@ -709,10 +710,9 @@ public class PsiImplUtil {
if (count == 0) return result;
int idx = 0;
for (ASTNode child = psiCodeBlock.getFirstChildNode(); child != null && idx < count; child = child.getTreeNext()) {
- if (child.getPsi() instanceof PsiStatement) {
- PsiStatement element = (PsiStatement)child.getPsi();
- LOG.assertTrue(element != null, child);
- result[idx++] = element;
+ PsiElement element = child.getPsi();
+ if (element instanceof PsiStatement) {
+ result[idx++] = (PsiStatement)element;
}
}
return result;
@@ -740,12 +740,17 @@ public class PsiImplUtil {
return null;
}
+ public static boolean isTypeAnnotation(@Nullable PsiElement element) {
+ return element instanceof PsiAnnotation &&
+ findApplicableTarget((PsiAnnotation)element, TargetType.TYPE_USE) == TargetType.TYPE_USE;
+ }
+
@Nullable
public static List<PsiAnnotation> getTypeUseAnnotations(@NotNull PsiModifierList modifierList) {
SmartList<PsiAnnotation> result = null;
for (PsiAnnotation annotation : modifierList.getAnnotations()) {
- if (findApplicableTarget(annotation, TargetType.TYPE_USE) == TargetType.TYPE_USE) {
+ if (isTypeAnnotation(annotation)) {
if (result == null) result = new SmartList<PsiAnnotation>();
result.add(annotation);
}
@@ -754,6 +759,30 @@ public class PsiImplUtil {
return result;
}
+ private static final Key<Boolean> TYPE_ANNO_MARK = Key.create("type.annotation.mark");
+
+ public static void markTypeAnnotations(@NotNull PsiTypeElement typeElement) {
+ PsiElement left = PsiTreeUtil.skipSiblingsBackward(typeElement, PsiComment.class, PsiWhiteSpace.class, PsiTypeParameterList.class);
+ if (left instanceof PsiModifierList) {
+ for (PsiAnnotation annotation : ((PsiModifierList)left).getAnnotations()) {
+ if (isTypeAnnotation(annotation)) {
+ annotation.putUserData(TYPE_ANNO_MARK, Boolean.TRUE);
+ }
+ }
+ }
+ }
+
+ public static void deleteTypeAnnotations(@NotNull PsiTypeElement typeElement) {
+ PsiElement left = PsiTreeUtil.skipSiblingsBackward(typeElement, PsiComment.class, PsiWhiteSpace.class, PsiTypeParameterList.class);
+ if (left instanceof PsiModifierList) {
+ for (PsiAnnotation annotation : ((PsiModifierList)left).getAnnotations()) {
+ if (TYPE_ANNO_MARK.get(annotation) == Boolean.TRUE) {
+ annotation.delete();
+ }
+ }
+ }
+ }
+
public static boolean isLeafElementOfType(@Nullable PsiElement element, IElementType type) {
return element instanceof LeafElement && ((LeafElement)element).getElementType() == type;
}