diff options
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.java | 39 |
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; } |