diff --git a/platform/core-api/src/com/intellij/patterns/ObjectPattern.java b/platform/core-api/src/com/intellij/patterns/ObjectPattern.java index fd86e3fd7113..b1751e1b481b 100644 --- a/platform/core-api/src/com/intellij/patterns/ObjectPattern.java +++ b/platform/core-api/src/com/intellij/patterns/ObjectPattern.java @@ -70,6 +70,7 @@ public abstract class ObjectPattern> impl return true; } + @NotNull @SuppressWarnings("unchecked") public final ElementPatternCondition getCondition() { if (myConditions == null) { @@ -82,16 +83,19 @@ public abstract class ObjectPattern> impl return new ElementPatternCondition(myInitialCondition, (List)myConditions); } + @NotNull public Self andNot(final ElementPattern pattern) { ElementPattern not = StandardPatterns.not(pattern); return and(not); } + @NotNull public Self andOr(@NotNull ElementPattern... patterns) { ElementPattern or = StandardPatterns.or(patterns); return and(or); } + @NotNull public Self and(final ElementPattern pattern) { return with(new PatternConditionPlus("and", pattern) { @Override @@ -101,6 +105,7 @@ public abstract class ObjectPattern> impl }); } + @NotNull public Self equalTo(@NotNull final T o) { return with(new ValuePatternCondition("equalTo") { public boolean accepts(@NotNull final T t, final ProcessingContext context) { @@ -159,6 +164,7 @@ public abstract class ObjectPattern> impl }); } + @NotNull public Self isNull() { return adapt(new ElementPatternCondition(new InitialPatternCondition(Object.class) { public boolean accepts(@Nullable final Object o, final ProcessingContext context) { @@ -167,6 +173,7 @@ public abstract class ObjectPattern> impl })); } + @NotNull public Self notNull() { return adapt(new ElementPatternCondition(new InitialPatternCondition(Object.class) { public boolean accepts(@Nullable final Object o, final ProcessingContext context) { @@ -175,6 +182,7 @@ public abstract class ObjectPattern> impl })); } + @NotNull public Self save(final Key key) { return with(new PatternCondition("save") { public boolean accepts(@NotNull final T t, final ProcessingContext context) { @@ -184,6 +192,7 @@ public abstract class ObjectPattern> impl }); } + @NotNull public Self save(@NonNls final String key) { return with(new PatternCondition("save") { public boolean accepts(@NotNull final T t, final ProcessingContext context) { @@ -193,11 +202,13 @@ public abstract class ObjectPattern> impl }); } + @NotNull public Self with(final PatternCondition pattern) { final ElementPatternCondition condition = getCondition().append(pattern); return adapt(condition); } + @NotNull private Self adapt(final ElementPatternCondition condition) { try { final ObjectPattern s = (ObjectPattern)clone(); @@ -212,6 +223,7 @@ public abstract class ObjectPattern> impl } } + @NotNull public Self without(final PatternCondition pattern) { return with(new PatternCondition("without") { public boolean accepts(@NotNull final T o, final ProcessingContext context) { diff --git a/platform/core-api/src/com/intellij/patterns/PsiElementPattern.java b/platform/core-api/src/com/intellij/patterns/PsiElementPattern.java index 5d4599feb32d..7a4a63c0f1bb 100644 --- a/platform/core-api/src/com/intellij/patterns/PsiElementPattern.java +++ b/platform/core-api/src/com/intellij/patterns/PsiElementPattern.java @@ -56,42 +56,52 @@ public abstract class PsiElementPattern pattern) { return afterLeafSkipping(psiElement().whitespaceCommentEmptyOrError(), pattern); } + @NotNull public Self beforeLeaf(@NotNull final ElementPattern pattern) { return beforeLeafSkipping(psiElement().whitespaceCommentEmptyOrError(), pattern); } + @NotNull public Self whitespace() { return withElementType(TokenType.WHITE_SPACE); } + @NotNull public Self whitespaceCommentOrError() { return andOr(psiElement().whitespace(), psiElement(PsiComment.class), psiElement(PsiErrorElement.class)); } + @NotNull public Self whitespaceCommentEmptyOrError() { return andOr(psiElement().whitespace(), psiElement(PsiComment.class), psiElement(PsiErrorElement.class), psiElement().withText("")); } + @NotNull public Self withFirstNonWhitespaceChild(@NotNull final ElementPattern pattern) { return withChildren(collection(PsiElement.class).filter(not(psiElement().whitespace()), collection(PsiElement.class).first(pattern))); } + @NotNull public Self withReference(final Class referenceClass) { return with(new PatternCondition("withReference") { @Override @@ -106,6 +116,7 @@ public abstract class PsiElementPattern filePattern) { return with(new PatternCondition("inFile") { @Override @@ -115,6 +126,7 @@ public abstract class PsiElementPattern filePattern) { return with(new PatternCondition("inVirtualFile") { @Override @@ -124,6 +136,7 @@ public abstract class PsiElementPattern("equalTo") { @@ -135,6 +148,7 @@ public abstract class PsiElementPattern pattern) { return with(new PatternCondition("withElementType") { @Override @@ -146,26 +160,32 @@ public abstract class PsiElementPattern name) { return with(new PsiNamePatternCondition("withName", name)); } + @NotNull public Self afterLeafSkipping(@NotNull final ElementPattern skip, @NotNull final ElementPattern pattern) { return with(new PatternCondition("afterLeafSkipping") { @Override @@ -186,6 +206,7 @@ public abstract class PsiElementPattern("beforeLeafSkipping") { @Override @@ -206,6 +227,7 @@ public abstract class PsiElementPattern("atStartOf") { @Override @@ -222,6 +244,7 @@ public abstract class PsiElementPattern("withTextLength", lengthPattern) { @Override @@ -233,10 +256,12 @@ public abstract class PsiElementPattern("withTextLengthLongerThan") { @Override @@ -246,10 +271,12 @@ public abstract class PsiElementPattern _withText(final ElementPattern pattern) { return new PatternConditionPlus("_withText", pattern) { @Override @@ -261,10 +288,12 @@ public abstract class PsiElementPattern("withLanguage") { @Override @@ -274,6 +303,7 @@ public abstract class PsiElementPattern metaDataPattern) { return with(new PatternCondition("withMetaData") { @Override @@ -283,6 +313,7 @@ public abstract class PsiElementPattern targetPattern) { return with(new PatternCondition("referencing") { @Override @@ -301,6 +332,7 @@ public abstract class PsiElementPattern("compiled") { @Override @@ -310,6 +342,7 @@ public abstract class PsiElementPattern ancestor) { return with(new PatternCondition("withTreeParent") { @Override @@ -319,6 +352,7 @@ public abstract class PsiElementPattern ancestor) { return with(new PatternCondition("insideStarting") { @Override @@ -339,6 +373,7 @@ public abstract class PsiElementPattern("withLastChildSkipping") { @Override diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyElementPattern.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyElementPattern.java index 999261f750ac..723d129c0fce 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyElementPattern.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyElementPattern.java @@ -37,6 +37,7 @@ public class GroovyElementPattern methodPattern) { final PsiNamePatternCondition nameCondition = ContainerUtil.findInstance(methodPattern.getCondition().getConditions(), PsiNamePatternCondition.class); @@ -84,6 +85,7 @@ public class GroovyElementPattern("regExpOperatorArg") { @Override diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java index 6c11824eb176..2cf3a7ae216e 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java @@ -28,6 +28,7 @@ public class GroovyExpressionPattern("ofType") { @Override @@ -37,6 +38,7 @@ public class GroovyExpressionPattern expressionPattern) { return with(new PatternCondition("skipParentheses") { @Override