diff --git a/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java b/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java index 5799c9f946b5..459ec283eb59 100644 --- a/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/filters/FilterPositionUtil.java @@ -30,10 +30,17 @@ public class FilterPositionUtil { @Nullable public static PsiElement searchNonSpaceNonCommentBack(PsiElement element) { + return searchNonSpaceNonCommentBack(element, false); + } + + @Nullable + public static PsiElement searchNonSpaceNonCommentBack(PsiElement element, final boolean strict) { if(element == null || element.getNode() == null) return null; ASTNode leftNeibour = TreeUtil.prevLeaf(element.getNode()); - while (leftNeibour != null && (leftNeibour.getElementType() == TokenType.WHITE_SPACE || leftNeibour.getPsi() instanceof PsiComment)){ - leftNeibour = TreeUtil.prevLeaf(leftNeibour); + if (!strict) { + while (leftNeibour != null && (leftNeibour.getElementType() == TokenType.WHITE_SPACE || leftNeibour.getPsi() instanceof PsiComment)){ + leftNeibour = TreeUtil.prevLeaf(leftNeibour); + } } return leftNeibour != null ? leftNeibour.getPsi() : null; diff --git a/platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java b/platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java new file mode 100644 index 000000000000..233bb683fb79 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/filters/position/AfterElement.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi.filters.position; + +import com.intellij.psi.PsiElement; +import com.intellij.psi.filters.ElementFilter; +import com.intellij.psi.filters.FilterPositionUtil; + +/** + * User: spLeaner + */ +public class AfterElement extends PositionElementFilter { + public AfterElement(){} + + public AfterElement(ElementFilter filter){ + setFilter(filter); + } + + public boolean isAcceptable(Object element, PsiElement context){ + if (!(element instanceof PsiElement)) return false; + final PsiElement previous = FilterPositionUtil.searchNonSpaceNonCommentBack((PsiElement) element, true); + if(previous != null){ + return getFilter().isAcceptable(previous, context); + } + return false; + } + + public String toString(){ + return "after(" +getFilter()+")"; + } +}