diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/BraceEnforcer.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/BraceEnforcer.java index 2eb14e8b9a75..a8ef133c5afc 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/BraceEnforcer.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/BraceEnforcer.java @@ -32,10 +32,10 @@ import org.jetbrains.annotations.NotNull; public class BraceEnforcer extends JavaJspRecursiveElementVisitor { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.codeStyle.BraceEnforcer"); - private final AbstractPostFormatProcessor myPostProcessor; + private final PostFormatProcessorHelper myPostProcessor; public BraceEnforcer(CodeStyleSettings settings) { - myPostProcessor = new AbstractPostFormatProcessor(settings); + myPostProcessor = new PostFormatProcessorHelper(settings); } @Override public void visitReferenceExpression(PsiReferenceExpression expression) { @@ -96,7 +96,7 @@ public class BraceEnforcer extends JavaJspRecursiveElementVisitor { private void processStatement(PsiStatement statement, PsiStatement blockCandidate, int options) { if (blockCandidate instanceof PsiBlockStatement || blockCandidate == null) return; if (options == CodeStyleSettings.FORCE_BRACES_ALWAYS || - options == CodeStyleSettings.FORCE_BRACES_IF_MULTILINE && AbstractPostFormatProcessor.isMultiline(statement)) { + options == CodeStyleSettings.FORCE_BRACES_IF_MULTILINE && PostFormatProcessorHelper.isMultiline(statement)) { replaceWithBlock(statement, blockCandidate); } } @@ -146,11 +146,11 @@ public class BraceEnforcer extends JavaJspRecursiveElementVisitor { } protected boolean checkElementContainsRange(final PsiElement element) { - return myPostProcessor.checkElementContainsRange(element); + return myPostProcessor.isElementPartlyInRange(element); } protected boolean checkRangeContainsElement(final PsiElement element) { - return myPostProcessor.checkRangeContainsElement(element); + return myPostProcessor.isElementFullyInRange(element); } public PsiElement process(PsiElement formatted) { diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportsFormatter.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportsFormatter.java index 35531343cec7..c18fb77fb34c 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportsFormatter.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportsFormatter.java @@ -40,10 +40,10 @@ public class ImportsFormatter extends XmlRecursiveElementVisitor { private static final @NonNls String PAGE_DIRECTIVE = "page"; private static final @NonNls String IMPORT_ATT = "import"; - private final AbstractPostFormatProcessor myPostProcessor; + private final PostFormatProcessorHelper myPostProcessor; public ImportsFormatter(final CodeStyleSettings settings, PsiFile file) { - myPostProcessor = new AbstractPostFormatProcessor(settings); + myPostProcessor = new PostFormatProcessorHelper(settings); myDocumentModel = FormattingDocumentModelImpl.createOn(file); myIndentOptions = settings.getIndentOptions(file.getFileType()); } @@ -65,7 +65,7 @@ public class ImportsFormatter extends XmlRecursiveElementVisitor { @Override public void visitXmlAttribute(XmlAttribute attribute) { if (isPageDirectiveTag(attribute.getParent())) { final XmlAttributeValue valueElement = attribute.getValueElement(); - if (valueElement != null && checkRangeContainsElement(attribute) && isImportAttribute(attribute) && AbstractPostFormatProcessor + if (valueElement != null && checkRangeContainsElement(attribute) && isImportAttribute(attribute) && PostFormatProcessorHelper .isMultiline(valueElement)) { final int oldLength = attribute.getTextLength(); ASTNode valueToken = findValueToken(valueElement.getNode()); @@ -147,11 +147,11 @@ public class ImportsFormatter extends XmlRecursiveElementVisitor { } protected boolean checkElementContainsRange(final PsiElement element) { - return myPostProcessor.checkElementContainsRange(element); + return myPostProcessor.isElementPartlyInRange(element); } protected boolean checkRangeContainsElement(final PsiElement element) { - return myPostProcessor.checkRangeContainsElement(element); + return myPostProcessor.isElementFullyInRange(element); } public PsiElement process(PsiElement formatted) { diff --git a/platform/lang-api/src/com/intellij/psi/util/PsiTreeUtil.java b/platform/lang-api/src/com/intellij/psi/util/PsiTreeUtil.java index 4338f79635e3..ee06af7ba7fd 100644 --- a/platform/lang-api/src/com/intellij/psi/util/PsiTreeUtil.java +++ b/platform/lang-api/src/com/intellij/psi/util/PsiTreeUtil.java @@ -33,6 +33,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; public class PsiTreeUtil { @@ -194,27 +195,19 @@ public class PsiTreeUtil { return parents; } - @Nullable - public static T findChildOfType(@NotNull final PsiElement element, @NotNull final Class aClass) { + @Nullable public static T findChildOfType(@Nullable final PsiElement element, @NotNull final Class aClass) { return findChildOfType(element, aClass, true); } - @Nullable - public static T findChildOfType(@NotNull final PsiElement element, - @NotNull final Class aClass, - final boolean strict) { + @Nullable public static T findChildOfType(@Nullable final PsiElement element, @NotNull final Class aClass, final boolean strict) { return findChildOfAnyType(element, strict, aClass); } - @Nullable - public static T findChildOfAnyType(@NotNull final PsiElement element, @NotNull final Class... classes) { + @Nullable public static T findChildOfAnyType(@Nullable final PsiElement element, @NotNull final Class... classes) { return findChildOfAnyType(element, true, classes); } - @Nullable - public static T findChildOfAnyType(@NotNull final PsiElement element, - final boolean strict, - @NotNull final Class... classes) { + @Nullable public static T findChildOfAnyType(@Nullable final PsiElement element, final boolean strict, @NotNull final Class... classes) { PsiElementProcessor.FindElement processor = new PsiElementProcessor.FindElement() { @Override public boolean execute(PsiElement each) { @@ -232,9 +225,9 @@ public class PsiTreeUtil { return (T)processor.getFoundElement(); } - @Nullable - public static T getChildOfType(@NotNull PsiElement element, @NotNull Class aClass) { - for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { + @Nullable public static T getChildOfType(@Nullable PsiElement element, @NotNull Class aClass) { + if (element == null) return null; + for(PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()){ if (instanceOf(aClass, child)) return (T)child; } return null; @@ -247,8 +240,9 @@ public class PsiTreeUtil { return child; } - @Nullable - public static T[] getChildrenOfType(@NotNull PsiElement element, @NotNull Class aClass) { + @Nullable public static T[] getChildrenOfType(@Nullable PsiElement element, @NotNull Class aClass) { + if (element == null) return null; + List result = null; for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { if (instanceOf(aClass, child)) { @@ -259,8 +253,9 @@ public class PsiTreeUtil { return result == null ? null : ArrayUtil.toObjectArray(result, aClass); } - @NotNull - public static List getChildrenOfTypeAsList(@NotNull PsiElement element, @NotNull Class aClass) { + @NotNull public static List getChildrenOfTypeAsList(@Nullable PsiElement element, @NotNull Class aClass) { + if (element == null) return Collections.emptyList(); + List result = new SmartList(); for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { if (instanceOf(aClass, child)) { @@ -296,28 +291,28 @@ public class PsiTreeUtil { * @return the element, or null if none was found. * @since 5.1 */ - @Nullable - public static T getChildOfAnyType(@NotNull PsiElement element, @NotNull Class... classes) { - for (PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()) { - for (Class aClass : classes) { + @Nullable public static T getChildOfAnyType(@Nullable PsiElement element, @NotNull Class... classes) { + if (element == null) return null; + for(PsiElement child = element.getFirstChild(); child != null; child = child.getNextSibling()){ + for(Class aClass : classes) { if (instanceOf(aClass, child)) return (T)child; } } return null; } - @Nullable - public static T getNextSiblingOfType(@NotNull PsiElement sibling, @NotNull Class aClass) { - for (PsiElement child = sibling.getNextSibling(); child != null; child = child.getNextSibling()) { + @Nullable public static T getNextSiblingOfType(@Nullable PsiElement sibling, @NotNull Class aClass) { + if (sibling == null) return null; + for(PsiElement child = sibling.getNextSibling(); child != null; child = child.getNextSibling()){ if (instanceOf(aClass, child)) return (T)child; } return null; } - @Nullable - public static T getPrevSiblingOfType(@NotNull PsiElement sibling, @NotNull Class aClass) { - for (PsiElement child = sibling.getPrevSibling(); child != null; child = child.getPrevSibling()) { - if (instanceOf(aClass, child)) return (T)child; + @Nullable public static T getPrevSiblingOfType(@Nullable PsiElement sibling, @NotNull Class aClass) { + if (sibling == null) return null; + for(PsiElement child = sibling.getPrevSibling(); child != null; child = child.getPrevSibling()){ + if (instanceOf(aClass, child)) return (T)child; } return null; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/AbstractPostFormatProcessor.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/PostFormatProcessorHelper.java similarity index 89% rename from platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/AbstractPostFormatProcessor.java rename to platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/PostFormatProcessorHelper.java index 4a0ceb18e09c..b78dd38c98b7 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/AbstractPostFormatProcessor.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/PostFormatProcessorHelper.java @@ -23,11 +23,11 @@ import org.jetbrains.annotations.Nullable; /** * @author lesya */ -public class AbstractPostFormatProcessor { +public class PostFormatProcessorHelper { public final CodeStyleSettings mySettings; private TextRange myResultTextRange; - public AbstractPostFormatProcessor(final CodeStyleSettings settings) { + public PostFormatProcessorHelper(final CodeStyleSettings settings) { mySettings = settings; } @@ -38,7 +38,7 @@ public class AbstractPostFormatProcessor { myResultTextRange.getEndOffset() - oldTextLength + newTextLength); } - public boolean checkElementContainsRange(final PsiElement element) { + public boolean isElementPartlyInRange(final PsiElement element) { if (myResultTextRange == null) return true; final TextRange elementRange = element.getTextRange(); @@ -47,7 +47,7 @@ public class AbstractPostFormatProcessor { } - public boolean checkRangeContainsElement(final PsiElement element) { + public boolean isElementFullyInRange(final PsiElement element) { if (myResultTextRange == null) return true; final TextRange elementRange = element.getTextRange();