IDEA-60608 Groovy: Code Completion for "in" keyword is missing

This commit is contained in:
peter
2012-03-10 14:46:10 +04:00
parent 1570f401b7
commit ba96ab71a6
3 changed files with 19 additions and 1 deletions
@@ -25,6 +25,7 @@ import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.lookup.TailTypeDecorator;
import com.intellij.lang.ASTNode;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.*;
import com.intellij.psi.templateLanguages.OuterLanguageElement;
@@ -42,6 +43,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.
import org.jetbrains.plugins.groovy.lang.psi.api.statements.*;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseSection;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrTraditionalForClause;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.*;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
@@ -96,7 +98,10 @@ public class GroovyCompletionData {
result.addElement(keyword("as", TailType.HUMBLE_SPACE_BEFORE_WORD));
}
if (isInfixOperatorPosition(position)) {
if (isAfterForParameter(position)) {
addKeywords(result, true, "in");
}
else if (isInfixOperatorPosition(position)) {
addKeywords(result, true, "in", PsiKeyword.INSTANCEOF);
} else if (suggestThrows(position)) {
result.addElement(keyword(PsiKeyword.THROWS, TailType.INSERT_SPACE));
@@ -135,6 +140,13 @@ public class GroovyCompletionData {
}
}
private static boolean isAfterForParameter(PsiElement position) {
ElementPattern<PsiElement> forParameter =
psiElement().withParents(GrParameter.class, GrTraditionalForClause.class, GrForStatement.class);
return psiElement().withParent(GrReferenceExpression.class).afterLeaf(forParameter).accepts(position) ||
forParameter.accepts(position) && psiElement().afterLeaf(psiElement(GroovyTokenTypes.mIDENT)).accepts(position);
}
public static void addModifiers(PsiElement position, CompletionResultSet result) {
PsiClass scope = PsiTreeUtil.getParentOfType(position, PsiClass.class);
PsiModifierList modifierList = ModifierChooser.findModifierList(position);
@@ -184,6 +184,7 @@ class GroovyAutoPopupTest extends CompletionAutoPopupTestCase {
assert !lookup
type 'c'
assert !lookup.focused
assert 'char' in myFixture.lookupElementStrings
assert myFixture.editor.document.text.contains('for(final c)')
type ' in c'
assert lookup.focused
@@ -1188,4 +1188,9 @@ new Base().fie<caret>x''')
assert myFixture.lookupElementStrings == ['field1']
}
public void testForIn() {
assert doContainsTest('in', 'for (int i i<caret>')
assert doContainsTest('in', 'for (i i<caret>')
}
}