diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java index b8767c9667e3..3ef85844537b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/TokenSets.java @@ -152,7 +152,7 @@ public abstract class TokenSets implements GroovyTokenTypes, GroovyElementTypes public static final TokenSet BINARY_OP_SET = TokenSet.create(mBAND, mBOR, mBXOR, mDIV, mEQUAL, mGE, mGT, mLAND, mLOR, mLT, mLE, mMINUS, mMOD, mPLUS, mSTAR, mSTAR_STAR, mNOT_EQUAL, mCOMPARE_TO, - COMPOSITE_SHIFT_SIGN); + COMPOSITE_SHIFT_SIGN, kIN, kINSTANCEOF, kAS); public static final TokenSet DOTS = TokenSet.create(mSPREAD_DOT, mOPTIONAL_DOT, mMEMBER_POINTER, mDOT); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/ExpressionStatement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/ExpressionStatement.java index bd67a2c0685d..25fee409a7bc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/ExpressionStatement.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/expressions/ExpressionStatement.java @@ -141,6 +141,7 @@ public class ExpressionStatement implements GroovyElementTypes { } private static GroovyElementType namePartParse(PsiBuilder builder, GroovyParser parser) { + if (BINARY_OP_SET.contains(builder.getTokenType())) return WRONGWAY; final GroovyElementType type = PathExpression.namePartParse(builder, parser); if (type == WRONGWAY && NUMBERS.contains(builder.getTokenType())) { builder.advanceLexer(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementImpl.java index eb2e1dcb30b3..5be21215d2a9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiElementImpl.java @@ -67,6 +67,10 @@ public abstract class GroovyPsiElementImpl extends ASTWrapperPsiElement implemen } } + /** + * don't remove. it is used by inheritors + */ + @SuppressWarnings({"UnusedDeclaration"}) public void removeElements(PsiElement[] elements) throws IncorrectOperationException { removeElements(this, elements); } @@ -84,6 +88,10 @@ public abstract class GroovyPsiElementImpl extends ASTWrapperPsiElement implemen } } + /** + * don't remove. it is used by inheritors + */ + @SuppressWarnings({"UnusedDeclaration"}) public void removeStatement() throws IncorrectOperationException { removeStatement(this); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java index 0da8e56ad589..b7226da10d49 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/blocks/GrClosableBlockImpl.java @@ -22,6 +22,7 @@ import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Function; +import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; @@ -36,6 +37,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.impl.GrClosureType; +import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiManager; import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; @@ -220,4 +222,9 @@ public class GrClosableBlockImpl extends GrBlockImpl implements GrClosableBlock public PsiType getReturnType() { return GroovyPsiManager.getInstance(getProject()).getType(this, ourTypesCalculator); } + + @Override + public void removeStatement() throws IncorrectOperationException { + GroovyPsiElementImpl.removeStatement(this); + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy index d140092bad3b..105974ff5803 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/ExpressionsParsingTest.groovy @@ -254,4 +254,10 @@ public class ExpressionsParsingTest extends GroovyParsingTestCase { public void testcommandExpr$not() {doTest()} public void testcommandExpr$methodCall() {doTest()} public void testcommandExpr$indexProperty() {doTest()} + + public void testcommandExpr$instanceof() {doTest()} + public void testcommandExpr$instanceof2() {doTest()} + public void testcommandExpr$in() {doTest()} + public void testcommandExpr$as() {doTest()} + public void testcommandExpr$arrayAccess() {doTest()} } diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/arrayAccess.test b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/arrayAccess.test new file mode 100644 index 000000000000..19094493b89a --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/arrayAccess.test @@ -0,0 +1,28 @@ +def b = foo [1] instanceof String +----- +Groovy script + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('b') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Instanceof expression + Property by index + Reference expression + PsiElement(identifier)('foo') + PsiWhiteSpace(' ') + Arguments + PsiElement([)('[') + Literal + PsiElement(Integer)('1') + PsiElement(])(']') + PsiWhiteSpace(' ') + PsiElement(instanceof)('instanceof') + PsiWhiteSpace(' ') + Type element + Reference element + PsiElement(identifier)('String') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/as.test b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/as.test new file mode 100644 index 000000000000..b70061f135f5 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/as.test @@ -0,0 +1,26 @@ +def string = foo a as String +----- +Groovy script + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('string') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Call expression + Reference expression + PsiElement(identifier)('foo') + PsiWhiteSpace(' ') + Command arguments + Safe cast expression + Reference expression + PsiElement(identifier)('a') + PsiWhiteSpace(' ') + PsiElement(as)('as') + PsiWhiteSpace(' ') + Type element + Reference element + PsiElement(identifier)('String') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/in.test b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/in.test new file mode 100644 index 000000000000..9d356a2df9bb --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/in.test @@ -0,0 +1,35 @@ +def contains = abc() in [1, 2, 3] +----- +Groovy script + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('contains') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Relational expression + Method call + Reference expression + PsiElement(identifier)('abc') + Arguments + PsiElement(()('(') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(in)('in') + PsiWhiteSpace(' ') + Generalized list + PsiElement([)('[') + Literal + PsiElement(Integer)('1') + PsiElement(,)(',') + PsiWhiteSpace(' ') + Literal + PsiElement(Integer)('2') + PsiElement(,)(',') + PsiWhiteSpace(' ') + Literal + PsiElement(Integer)('3') + PsiElement(])(']') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/instanceof.test b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/instanceof.test new file mode 100644 index 000000000000..0ea572686428 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/instanceof.test @@ -0,0 +1,25 @@ +def inst = foo() instanceof String +----- +Groovy script + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('inst') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Instanceof expression + Method call + Reference expression + PsiElement(identifier)('foo') + Arguments + PsiElement(()('(') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement(instanceof)('instanceof') + PsiWhiteSpace(' ') + Type element + Reference element + PsiElement(identifier)('String') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/instanceof2.test b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/instanceof2.test new file mode 100644 index 000000000000..876bf4babec0 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/expressions/commandExpr/instanceof2.test @@ -0,0 +1,26 @@ +def inst = foo arg instanceof String +----- +Groovy script + Variable definitions + Modifiers + PsiElement(def)('def') + PsiWhiteSpace(' ') + Variable + PsiElement(identifier)('inst') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + Call expression + Reference expression + PsiElement(identifier)('foo') + PsiWhiteSpace(' ') + Command arguments + Instanceof expression + Reference expression + PsiElement(identifier)('arg') + PsiWhiteSpace(' ') + PsiElement(instanceof)('instanceof') + PsiWhiteSpace(' ') + Type element + Reference element + PsiElement(identifier)('String') \ No newline at end of file