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
public boolean isAcceptable(Object element, PsiElement context) {
//noinspection unchecked
return PsiTreeUtil.getNonStrictParentOfType(context, JetParameterList.class, JetTypeParameterList.class) != null;
JetTypeParameter typeParameterElement = PsiTreeUtil.getParentOfType(context, JetTypeParameter.class, true);
if (typeParameterElement != null && PsiTreeUtil.isAncestor(typeParameterElement.getFirstChild(), context, false)) {
return true;
}
return false;
}
}
@@ -271,7 +275,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
registerScopeKeywordsCompletion(
new AndFilter(
new SuperParentFilter(new ClassFilter(JetModifierList.class)),
new NotFilter(new InParameterListsFilter())),
new NotFilter(new InTypeParameterFirstChildFilter())),
ABSTRACT_KEYWORD, FINAL_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD,
OPEN_KEYWORD, PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD);
@@ -302,7 +306,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
ELSE_KEYWORD, FALSE_KEYWORD,
NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD);
registerScopeKeywordsCompletion(new InParameterListsFilter(), OUT_KEYWORD);
registerScopeKeywordsCompletion(new InTypeParameterFirstChildFilter(), false, IN_KEYWORD, OUT_KEYWORD);
// templates
registerScopeKeywordsCompletion(new InWhenFilter(),
@@ -332,6 +336,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
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) {
registerScopeKeywordsCompletion(placeFilter, true, keywords);
}
@@ -351,12 +359,10 @@ public class JetKeywordCompletionContributor extends CompletionContributor {
private static ElementPattern<PsiElement> getPlacePattern(final ElementFilter placeFilter, boolean notIdentifier) {
if (notIdentifier) {
return PlatformPatterns.psiElement().and(
new FilterPattern(new AndFilter(GENERAL_FILTER, NOT_IDENTIFIER_FILTER, placeFilter)));
return PlatformPatterns.psiElement().and(new FilterPattern(new AndFilter(GENERAL_FILTER, NOT_IDENTIFIER_FILTER, placeFilter)));
}
else {
return PlatformPatterns.psiElement().and(
new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter)));
return PlatformPatterns.psiElement().and(new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter)));
}
}
}
@@ -0,0 +1,4 @@
class T<<caret>>
// EXIST: in, out
// ABSENT: private
@@ -2,4 +2,5 @@ class Test<<caret>
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();
}
public void testInClassTypeParameters() {
doTest();
}
public void testInFunctionName() {
doTest();
}