In and Out keyword completion for generic parameters

This commit is contained in:
Nikolay Krasko
2012-09-07 20:57:29 +04:00
parent e043a6c699
commit df76d2d3a8
4 changed files with 25 additions and 10 deletions
@@ -147,11 +147,15 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
} }
} }
private static class InParameterListsFilter extends PositionElementFilter { private static class InTypeParameterFirstChildFilter extends PositionElementFilter {
@Override @Override
public boolean isAcceptable(Object element, PsiElement context) { public boolean isAcceptable(Object element, PsiElement context) {
//noinspection unchecked JetTypeParameter typeParameterElement = PsiTreeUtil.getParentOfType(context, JetTypeParameter.class, true);
return PsiTreeUtil.getNonStrictParentOfType(context, JetParameterList.class, JetTypeParameterList.class) != null; if (typeParameterElement != null && PsiTreeUtil.isAncestor(typeParameterElement.getFirstChild(), context, false)) {
return true;
}
return false;
} }
} }
@@ -271,7 +275,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
registerScopeKeywordsCompletion( registerScopeKeywordsCompletion(
new AndFilter( new AndFilter(
new SuperParentFilter(new ClassFilter(JetModifierList.class)), new SuperParentFilter(new ClassFilter(JetModifierList.class)),
new NotFilter(new InParameterListsFilter())), new NotFilter(new InTypeParameterFirstChildFilter())),
ABSTRACT_KEYWORD, FINAL_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, ABSTRACT_KEYWORD, FINAL_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD,
OPEN_KEYWORD, PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD); OPEN_KEYWORD, PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD);
@@ -302,7 +306,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
ELSE_KEYWORD, FALSE_KEYWORD, ELSE_KEYWORD, FALSE_KEYWORD,
NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD); NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD);
registerScopeKeywordsCompletion(new InParameterListsFilter(), OUT_KEYWORD); registerScopeKeywordsCompletion(new InTypeParameterFirstChildFilter(), false, IN_KEYWORD, OUT_KEYWORD);
// templates // templates
registerScopeKeywordsCompletion(new InWhenFilter(), registerScopeKeywordsCompletion(new InWhenFilter(),
@@ -332,6 +336,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
new KeywordsCompletionProvider(keywords)); new KeywordsCompletionProvider(keywords));
} }
private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, boolean notIdentifier, JetToken... keywords) {
registerScopeKeywordsCompletion(placeFilter, notIdentifier, convertTokensToStrings(keywords));
}
private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, String... keywords) { private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, String... keywords) {
registerScopeKeywordsCompletion(placeFilter, true, keywords); registerScopeKeywordsCompletion(placeFilter, true, keywords);
} }
@@ -351,12 +359,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
private static ElementPattern<PsiElement> getPlacePattern(final ElementFilter placeFilter, boolean notIdentifier) { private static ElementPattern<PsiElement> getPlacePattern(final ElementFilter placeFilter, boolean notIdentifier) {
if (notIdentifier) { if (notIdentifier) {
return PlatformPatterns.psiElement().and( return PlatformPatterns.psiElement().and(new FilterPattern(new AndFilter(GENERAL_FILTER, NOT_IDENTIFIER_FILTER, placeFilter)));
new FilterPattern(new AndFilter(GENERAL_FILTER, NOT_IDENTIFIER_FILTER, placeFilter)));
} }
else { else {
return PlatformPatterns.psiElement().and( return PlatformPatterns.psiElement().and(new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter)));
new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter)));
} }
} }
} }
@@ -0,0 +1,4 @@
class T<<caret>>
// EXIST: in, out
// ABSENT: private
@@ -3,3 +3,4 @@ class Test<<caret>
fun testing() {} fun testing() {}
// ABSENT: private, public, protected, abstract // ABSENT: private, public, protected, abstract
// EXIST: in, out
@@ -63,6 +63,10 @@ public class KeywordsCompletionTest extends JetCompletionTestBase {
doTest(); doTest();
} }
public void testInClassTypeParameters() {
doTest();
}
public void testInFunctionName() { public void testInFunctionName() {
doTest(); doTest();
} }