diff --git a/platform/core-api/src/com/intellij/patterns/StandardPatterns.java b/platform/core-api/src/com/intellij/patterns/StandardPatterns.java index 0a1dc14a7c9d..8a157509109b 100644 --- a/platform/core-api/src/com/intellij/patterns/StandardPatterns.java +++ b/platform/core-api/src/com/intellij/patterns/StandardPatterns.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -32,6 +32,8 @@ import java.util.List; @SuppressWarnings("unchecked") public class StandardPatterns { + private static final FalsePattern FALSE_PATTERN = new FalsePattern(); + public static StringPattern string() { return new StringPattern(); } @@ -178,4 +180,30 @@ public class StandardPatterns { }); } + + public static ElementPattern alwaysFalse() { + return FALSE_PATTERN; + } + + private static final class FalsePattern implements ElementPattern { + @Override + public boolean accepts(@Nullable Object o) { + return false; + } + + @Override + public boolean accepts(@Nullable Object o, ProcessingContext context) { + return false; + } + + @Override + public ElementPatternCondition getCondition() { + return new ElementPatternCondition(new InitialPatternCondition(Object.class) { + @Override + public boolean accepts(@Nullable Object o, ProcessingContext context) { + return false; + } + }); + } + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index 198db8478d18..ce5d9c1c2d45 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -78,6 +78,7 @@ import java.util.Set; import static com.intellij.patterns.PlatformPatterns.psiElement; import static com.intellij.patterns.PsiJavaPatterns.elementType; +import static com.intellij.patterns.StandardPatterns.alwaysFalse; import static com.intellij.util.containers.ContainerUtil.*; import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.SEPARATORS; @@ -170,7 +171,8 @@ public class GroovyCompletionContributor extends CompletionContributor { )) ); - private static final ElementPattern AFTER_NUMBER_LITERAL = psiElement().afterLeaf( + private static final ElementPattern AFTER_NUMBER_LITERAL = psiElement().afterLeafSkipping( + alwaysFalse(), psiElement().withElementType(elementType().oneOf(mNUM_DOUBLE, mNUM_INT, mNUM_LONG, mNUM_FLOAT, mNUM_BIG_INT, mNUM_BIG_DECIMAL))); public static final ElementPattern AFTER_AT = psiElement().afterLeaf("@"); public static final ElementPattern IN_CATCH_TYPE = psiElement().afterLeaf(psiElement().withText("(").withParent(GrCatchClause.class)); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java index eba80bc092c3..fa8ea6dc6a10 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java @@ -132,17 +132,16 @@ public class GroovyCompletionData { registerControlCompletion(position, result); - if (parent instanceof GrExpression) { + if (parent instanceof GrExpression || isInfixOperatorPosition(position)) { addKeywords(result, false, PsiKeyword.TRUE, PsiKeyword.FALSE, PsiKeyword.NULL, PsiKeyword.SUPER, PsiKeyword.THIS); result.addElement(keyword(PsiKeyword.NEW, TailType.HUMBLE_SPACE_BEFORE_WORD)); - result.addElement(keyword("as", TailType.HUMBLE_SPACE_BEFORE_WORD)); } if (isAfterForParameter(position)) { result.addElement(keyword("in", TailType.HUMBLE_SPACE_BEFORE_WORD)); } if (isInfixOperatorPosition(position)) { - addKeywords(result, true, "in", PsiKeyword.INSTANCEOF); + addKeywords(result, true, "as", "in", PsiKeyword.INSTANCEOF); } if (suggestPrimitiveTypes(position)) { final boolean addSpace = !IN_CAST_TYPE_ELEMENT.accepts(position) && !GroovySmartCompletionContributor.AFTER_NEW.accepts(position) && !isInExpression(position); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/KeywordCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/KeywordCompletionTest.groovy index bb0a4cb3c3d4..d4bbb2ef5088 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/KeywordCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/KeywordCompletionTest.groovy @@ -106,6 +106,7 @@ public class KeywordCompletionTest extends CompletionTestBase { void testClassAfterAnno2() { doTest() } void testExtends() { doTest() } void testImplements() { doTest() } + void testAfterNumberLiteral() { doTest() } String basePath = TestUtils.testDataPath + 'groovy/oldCompletion/keyword' diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterExpression.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterExpression.test new file mode 100644 index 000000000000..676652a33fc3 --- /dev/null +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterExpression.test @@ -0,0 +1,4 @@ +def foo() { + foo() +} +----- diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterLabel.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterLabel.test index 13aa418c86c7..9dc9886e0a37 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterLabel.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterLabel.test @@ -1,6 +1,5 @@ foo: ----- -as assert boolean byte diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterNumberLiteral.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterNumberLiteral.test new file mode 100644 index 000000000000..8bf7c11ffbe4 --- /dev/null +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/afterNumberLiteral.test @@ -0,0 +1,13 @@ +def foo() { + 4 +} +----- +as +false +in +instanceof +new +null +super +this +true \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/assert.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/assert.test index 0e0be889025f..ecc24d2fa78d 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/assert.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/assert.test @@ -1,4 +1,3 @@ assert true ----- -as assert \ No newline at end of file diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/else2.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/else2.test index e95f662817d1..afcd1e94c062 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/else2.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/else2.test @@ -8,7 +8,6 @@ class BaseLineService { String abc = 5 ----- -as assert boolean byte diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/file12.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/file12.test index 88fa02c67f6e..c671d6d68ce6 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/file12.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/file12.test @@ -11,7 +11,6 @@ class A { } } ----- -as assert boolean byte diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/fin2.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/fin2.test index 64fe8ad6d857..f1796f0ff326 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/fin2.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/fin2.test @@ -2,7 +2,6 @@ try {} ----- abstract -as assert boolean byte diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/keywordsInParentheses.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/keywordsInParentheses.test index 2b95e099cf4d..37025a2fed54 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/keywordsInParentheses.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/keywordsInParentheses.test @@ -1,6 +1,5 @@ () ----- -as boolean byte char diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/mod4.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/mod4.test index 407e86af929c..4a1a02231a92 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/mod4.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/mod4.test @@ -1,7 +1,6 @@ def foo(){} ----- abstract -as assert boolean byte diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var1.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var1.test index c3ed6a48122f..c481d5da2143 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var1.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var1.test @@ -9,7 +9,6 @@ class A { } ----- abstract -as assert boolean byte diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var10.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var10.test index 70e3ca7efde9..336516088702 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var10.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var10.test @@ -11,7 +11,6 @@ class A { } } ----- -as boolean byte char diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var2.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var2.test index 05fcbe1a7972..d4ea980fdbf2 100644 --- a/plugins/groovy/testdata/groovy/oldCompletion/keyword/var2.test +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/var2.test @@ -11,7 +11,6 @@ class A { } ----- abstract -as assert boolean byte