From df76d2d3a8c2b25a3641193e4900e954bb662992 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 7 Sep 2012 20:57:29 +0400 Subject: [PATCH] In and Out keyword completion for generic parameters --- .../JetKeywordCompletionContributor.java | 24 ++++++++++++------- .../keywords/InClassTypeParameters.kt | 4 ++++ .../InNotFinishedGenericWithFunAfter.kt | 3 ++- .../completion/KeywordsCompletionTest.java | 4 ++++ 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 idea/testData/completion/keywords/InClassTypeParameters.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index febc039e697..0f2a87b1075 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -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 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))); } } } diff --git a/idea/testData/completion/keywords/InClassTypeParameters.kt b/idea/testData/completion/keywords/InClassTypeParameters.kt new file mode 100644 index 00000000000..dd327fb4561 --- /dev/null +++ b/idea/testData/completion/keywords/InClassTypeParameters.kt @@ -0,0 +1,4 @@ +class T<> + +// EXIST: in, out +// ABSENT: private \ No newline at end of file diff --git a/idea/testData/completion/keywords/InNotFinishedGenericWithFunAfter.kt b/idea/testData/completion/keywords/InNotFinishedGenericWithFunAfter.kt index 8527037573a..0976920a34c 100644 --- a/idea/testData/completion/keywords/InNotFinishedGenericWithFunAfter.kt +++ b/idea/testData/completion/keywords/InNotFinishedGenericWithFunAfter.kt @@ -2,4 +2,5 @@ class Test< fun testing() {} -// ABSENT: private, public, protected, abstract \ No newline at end of file +// ABSENT: private, public, protected, abstract +// EXIST: in, out \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java b/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java index f3104152655..e90a03da3f0 100644 --- a/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java +++ b/idea/tests/org/jetbrains/jet/completion/KeywordsCompletionTest.java @@ -63,6 +63,10 @@ public class KeywordsCompletionTest extends JetCompletionTestBase { doTest(); } + public void testInClassTypeParameters() { + doTest(); + } + public void testInFunctionName() { doTest(); }