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 6fbccb0b69f8..5dc65fd06281 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 @@ -400,6 +400,21 @@ public class GroovyCompletionData { return true; } } + + /* + @Anno + cl + */ + if (parent instanceof GrVariable && context == ((GrVariable)parent).getNameIdentifierGroovy()) { + final PsiElement decl = parent.getParent(); + if (decl instanceof GrVariableDeclaration && + !((GrVariableDeclaration)decl).isTuple() && + ((GrVariableDeclaration)decl).getTypeElementGroovy() == null && + (decl.getParent() instanceof GrTypeDefinitionBody || decl.getParent() instanceof GroovyFile)) { + return true; + } + } + final PsiElement leaf = getLeafByOffset(context.getTextRange().getStartOffset() - 1, context); if (leaf != null) { PsiElement prev = leaf; @@ -589,7 +604,8 @@ public class GroovyCompletionData { } if (asSimpleVariable(context) || asTypedMethod(context) || - asVariableInBlock(context)) { + asVariableInBlock(context) || + asVariableAfterModifiers(context)) { return true; } if ((parent instanceof GrParameter && @@ -617,6 +633,20 @@ public class GroovyCompletionData { isNewStatement(context, false); } + private static boolean asVariableAfterModifiers(PsiElement context) { + final PsiElement parent = context.getParent(); + if (parent instanceof GrVariable && context == ((GrVariable)parent).getNameIdentifierGroovy()) { + final PsiElement decl = parent.getParent(); + if (decl instanceof GrVariableDeclaration && + !((GrVariableDeclaration)decl).isTuple() && + ((GrVariableDeclaration)decl).getTypeElementGroovy() == null) { + return true; + } + } + + return false; + } + private static boolean isInfixOperatorPosition(PsiElement context) { if (context.getParent() != null && context.getParent() instanceof GrReferenceExpression && 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 5bdf156abd1e..127f8d16ab6e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/KeywordCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/KeywordCompletionTest.groovy @@ -102,6 +102,8 @@ public class KeywordCompletionTest extends CompletionTestBase { void testDefaultInAnnotation() { doTest() } void testElse1() { doTest() } void testElse2() { doTest() } + void testClassAfterAnnotation(){ doTest() } + void testClassAfterAnno2() { doTest() } String basePath = TestUtils.testDataPath + 'groovy/oldCompletion/keyword' diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/classAfterAnno2.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/classAfterAnno2.test new file mode 100644 index 000000000000..c1869f2b192c --- /dev/null +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/classAfterAnno2.test @@ -0,0 +1,24 @@ +@Anno +public +----- +abstract +boolean +byte +char +class +def +double +enum +final +float +int +interface +long +native +short +static +strictfp +synchronized +transient +void +volatile diff --git a/plugins/groovy/testdata/groovy/oldCompletion/keyword/classAfterAnnotation.test b/plugins/groovy/testdata/groovy/oldCompletion/keyword/classAfterAnnotation.test new file mode 100644 index 000000000000..213071dee374 --- /dev/null +++ b/plugins/groovy/testdata/groovy/oldCompletion/keyword/classAfterAnnotation.test @@ -0,0 +1,27 @@ +@Anno + +----- +abstract +boolean +byte +char +class +double +enum +final +float +if +int +interface +long +native +private +protected +public +short +static +strictfp +synchronized +transient +void +volatile \ No newline at end of file