public <T> T getCurrentWriteAction(@Nullable Class<T> actionClass) { assertCanRunWriteAction(); for (int i = myWriteActionsStack.size() - 1; i >= 0; i--) { Runnable action = myWriteActionsStack.get(i); if (actionClass == null || ReflectionCache.isAssignable(actionClass, action.getClass())) return (T) action; } return null; }
protected boolean isScopeFinal(Class scopeClass) { if (myFinalScopes.contains(scopeClass)) return true; for (final Class myFinalScope : myFinalScopes) { if (ReflectionCache.isAssignable(myFinalScope, scopeClass)) { return true; } } return false; }
public boolean hasWriteAction(@Nullable Class<?> actionClass) { assertCanRunWriteAction(); for (int i = myWriteActionsStack.size() - 1; i >= 0; i--) { Class action = myWriteActionsStack.get(i); if (actionClass == action || action != null && ReflectionCache.isAssignable(actionClass, action)) return true; } return false; }
@Nullable public PsiElement findElementAt(int offset, Class<? extends Language> lang) { final PsiFile mainRoot = getPsi(getBaseLanguage()); PsiElement ret = null; for (final Language language : getLanguages()) { if (!ReflectionCache.isAssignable(lang, language.getClass())) continue; if (lang.equals(Language.class) && !getLanguages().contains(language)) continue; final PsiFile psiRoot = getPsi(language); final PsiElement psiElement = findElementAt(psiRoot, offset); if (psiElement == null || psiElement instanceof OuterLanguageElement) continue; if (ret == null || psiRoot != mainRoot) { ret = psiElement; } } return ret; }
@Nullable protected static <T extends PsiNamedElement> T restoreElementInternal( @NotNull PsiElement parent, String name, int index, Class<T> hisClass) { PsiElement[] children = parent.getChildren(); for (PsiElement child : children) { if (ReflectionCache.isAssignable(hisClass, child.getClass())) { T namedChild = (T) child; final String childName = namedChild.getName(); if (Comparing.equal(name, childName)) { if (index == 0) { return namedChild; } index--; } } } return null; }
protected static <T extends PsiNamedElement> int getChildIndex( T element, PsiElement parent, String name, Class<T> hisClass) { PsiElement[] children = parent.getChildren(); int index = 0; for (PsiElement child : children) { if (ReflectionCache.isAssignable(hisClass, child.getClass())) { T namedChild = (T) child; final String childName = namedChild.getName(); if (Comparing.equal(name, childName)) { if (namedChild.equals(element)) { return index; } index++; } } } return index; }
@Override public boolean isClassAcceptable(Class hintClass) { return ReflectionCache.isAssignable(hintClass, PsiTypeCodeFragment.class); }
@Override public PsiElement findElementAt(int offset, Class<? extends Language> lang) { if (!ReflectionCache.isAssignable(lang, getBaseLanguage().getClass())) return null; return findElementAt(offset); }