From f89b0c31931e3449fdbe82da3f45507603285102 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 23 Feb 2012 23:46:14 +0400 Subject: [PATCH] Fixed tests. Added 'object {...}' template after "class" inside class. --- .../JetKeywordCompletionContributor.java | 107 ++++++++++++------ .../liveTemplates/JetTemplateContextType.java | 8 ++ .../completion/keywords/classObject.kt | 2 +- 3 files changed, 79 insertions(+), 38 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java index fdd3432712c..17ea49e999b 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetKeywordCompletionContributor.java @@ -26,10 +26,12 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.filters.*; import com.intellij.psi.filters.position.FilterPattern; import com.intellij.psi.filters.position.LeftNeighbour; import com.intellij.psi.filters.position.PositionElementFilter; +import com.intellij.psi.impl.source.tree.LeafPsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; @@ -62,11 +64,14 @@ public class JetKeywordCompletionContributor extends CompletionContributor { new CommentFilter(), // or new ParentFilter(new ClassFilter(JetLiteralStringTemplateEntry.class)), // or new ParentFilter(new ClassFilter(JetConstantExpression.class)), // or - new LeftNeighbour(new TextFilter(".")), // or - new AndFilter(new LeafElementFilter(JetTokens.IDENTIFIER), - new NotFilter(new ParentFilter(new ClassFilter(JetReferenceExpression.class)))) + new LeftNeighbour(new TextFilter(".")) )); + private final static ElementFilter NOT_IDENTIFIER_FILTER = new NotFilter(new AndFilter( + new LeafElementFilter(JetTokens.IDENTIFIER), + new NotFilter(new ParentFilter(new ClassFilter(JetReferenceExpression.class)))) + ); + private final static List FUNCTION_KEYWORDS = Lists.newArrayList(GET_KEYWORD.toString(), SET_KEYWORD.toString()); private static final String IF_TEMPLATE = "if (<##>) {\n<##>\n}"; @@ -82,6 +87,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { private static final String TRAIT_TEMPLATE = "trait <##> {\n<##>\n}"; private static final String CLASS_TEMPLATE = "class <##> {\n<##>\n}"; private static final String CLASS_OBJECT_TEMPLATE = "class object {\n<##>\n}"; + private static final String CLASS_OBJECT_WITHOUT_CLASS_TEMPLATE = "object {\n<##>\n}"; private static final String FOR_TEMPLATE = "for (<##> in <##>) {\n<##>\n}"; private static final String WHEN_TEMPLATE = "when (<##>) {\n<##> -> <##>\n" + "else -> <##>\n}"; @@ -165,7 +171,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { public boolean isAcceptable(Object element, PsiElement context) { //noinspection unchecked return PsiTreeUtil.getParentOfType(context, JetClassBody.class, true, - JetBlockExpression.class, JetProperty.class, JetParameterList.class) != null; + JetBlockExpression.class, JetProperty.class, JetParameterList.class) != null; } @Override @@ -174,6 +180,22 @@ public class JetKeywordCompletionContributor extends CompletionContributor { } } + private static class AfterClassInClassBodyFilter extends InClassBodyFilter { + @Override + public boolean isAcceptable(Object element, PsiElement context) { + if (super.isAcceptable(element, context)) { + PsiElement ps = context.getPrevSibling(); + if (ps instanceof PsiWhiteSpace) { + ps = ps.getPrevSibling(); + } + if (ps instanceof LeafPsiElement) { + return ((LeafPsiElement) ps).getElementType() == JetTokens.CLASS_KEYWORD; + } + } + return false; + } + } + private static class InPropertyFilter implements ElementFilter { @Override public boolean isAcceptable(Object element, PsiElement context) { @@ -202,7 +224,7 @@ public class JetKeywordCompletionContributor extends CompletionContributor { private final Collection elements; - public KeywordsCompletionProvider(String ...keywords) { + public KeywordsCompletionProvider(String... keywords) { List elementsList = Lists.newArrayList(keywords); elements = Collections2.transform(elementsList, new Function() { @Override @@ -232,39 +254,39 @@ public class JetKeywordCompletionContributor extends CompletionContributor { public JetKeywordCompletionContributor() { registerScopeKeywordsCompletion(new InTopFilter(), - ABSTRACT_KEYWORD, - FINAL_KEYWORD, GET_KEYWORD, - IMPORT_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, - OPEN_KEYWORD, PACKAGE_KEYWORD, PRIVATE_KEYWORD, - PROTECTED_KEYWORD, PUBLIC_KEYWORD, SET_KEYWORD, - TYPE_KEYWORD); + ABSTRACT_KEYWORD, + FINAL_KEYWORD, GET_KEYWORD, + IMPORT_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, + OPEN_KEYWORD, PACKAGE_KEYWORD, PRIVATE_KEYWORD, + PROTECTED_KEYWORD, PUBLIC_KEYWORD, SET_KEYWORD, + TYPE_KEYWORD); registerScopeKeywordsCompletion(new InClassBodyFilter(), - ABSTRACT_KEYWORD, - FINAL_KEYWORD, GET_KEYWORD, - INLINE_KEYWORD, INTERNAL_KEYWORD, OBJECT_KEYWORD, - OPEN_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, - PROTECTED_KEYWORD, PUBLIC_KEYWORD, SET_KEYWORD, - TYPE_KEYWORD); + ABSTRACT_KEYWORD, + FINAL_KEYWORD, GET_KEYWORD, + INLINE_KEYWORD, INTERNAL_KEYWORD, + OPEN_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, + PROTECTED_KEYWORD, PUBLIC_KEYWORD, SET_KEYWORD, + TYPE_KEYWORD); registerScopeKeywordsCompletion(new InNonClassBlockFilter(), - AS_KEYWORD, BREAK_KEYWORD, BY_KEYWORD, - CATCH_KEYWORD, CONTINUE_KEYWORD, - ELSE_KEYWORD, - FALSE_KEYWORD, FINALLY_KEYWORD, - GET_KEYWORD, - IN_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, - IS_KEYWORD, NULL_KEYWORD, OBJECT_KEYWORD, - PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, - RETURN_KEYWORD, SET_KEYWORD, SUPER_KEYWORD, - CAPITALIZED_THIS_KEYWORD, THIS_KEYWORD, THROW_KEYWORD, - TRUE_KEYWORD, TRY_KEYWORD, - TYPE_KEYWORD, - VARARG_KEYWORD, WHERE_KEYWORD); + AS_KEYWORD, BREAK_KEYWORD, BY_KEYWORD, + CATCH_KEYWORD, CONTINUE_KEYWORD, + ELSE_KEYWORD, + FALSE_KEYWORD, FINALLY_KEYWORD, + GET_KEYWORD, + IN_KEYWORD, INLINE_KEYWORD, INTERNAL_KEYWORD, + IS_KEYWORD, NULL_KEYWORD, OBJECT_KEYWORD, + PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, + RETURN_KEYWORD, SET_KEYWORD, SUPER_KEYWORD, + CAPITALIZED_THIS_KEYWORD, THIS_KEYWORD, THROW_KEYWORD, + TRUE_KEYWORD, TRY_KEYWORD, + TYPE_KEYWORD, + VARARG_KEYWORD, WHERE_KEYWORD); registerScopeKeywordsCompletion(new InPropertyFilter(), - ELSE_KEYWORD, FALSE_KEYWORD, - NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD); + ELSE_KEYWORD, FALSE_KEYWORD, + NULL_KEYWORD, THIS_KEYWORD, TRUE_KEYWORD); registerScopeKeywordsCompletion(new InParametersFilter(), OUT_KEYWORD); @@ -287,11 +309,17 @@ public class JetKeywordCompletionContributor extends CompletionContributor { WHEN_TEMPLATE, WHILE_TEMPLATE, DO_WHILE_TEMPLATE, ENUM_CLASS_TEMPLATE); registerScopeKeywordsCompletion(new InPropertyFilter(), IF_ELSE_ONELINE_TEMPLATE, WHEN_TEMPLATE); + registerScopeKeywordsCompletion(new AfterClassInClassBodyFilter(), false, + CLASS_OBJECT_WITHOUT_CLASS_TEMPLATE); + } + + private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, boolean notIdentifier, String... keywords) { + extend(CompletionType.BASIC, getPlacePattern(placeFilter, notIdentifier), + new KeywordsCompletionProvider(keywords)); } private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, String... keywords) { - extend(CompletionType.BASIC, getPlacePattern(placeFilter), - new KeywordsCompletionProvider(keywords)); + registerScopeKeywordsCompletion(placeFilter, true, keywords); } private void registerScopeKeywordsCompletion(final ElementFilter placeFilter, JetToken... keywords) { @@ -307,9 +335,14 @@ public class JetKeywordCompletionContributor extends CompletionContributor { return ArrayUtil.toStringArray(strings); } - private static ElementPattern getPlacePattern(final ElementFilter placeFilter) { - return PlatformPatterns.psiElement().and( - new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter))); + 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))); + } else { + return PlatformPatterns.psiElement().and( + new FilterPattern(new AndFilter(GENERAL_FILTER, placeFilter))); + } } diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java index 3dd31811d4e..20153d38ede 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java @@ -21,11 +21,14 @@ import com.intellij.codeInsight.template.TemplateContextType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiWhiteSpace; +import com.intellij.psi.impl.source.tree.LeafPsiElement; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiUtilBase; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetLanguage; /** @@ -43,6 +46,11 @@ public abstract class JetTemplateContextType extends TemplateContextType { PsiElement element = file.findElementAt(offset); if (element instanceof PsiWhiteSpace) { return false; + } else if (element instanceof LeafPsiElement) { + IElementType elementType = ((LeafPsiElement) element).getElementType(); + if (elementType == JetTokens.IDENTIFIER && !(element.getParent() instanceof JetReferenceExpression)) { + return false; + } } return element != null && isInContext(element); } diff --git a/idea/testData/completion/keywords/classObject.kt b/idea/testData/completion/keywords/classObject.kt index cfaa7effe3e..e01d361c586 100644 --- a/idea/testData/completion/keywords/classObject.kt +++ b/idea/testData/completion/keywords/classObject.kt @@ -2,4 +2,4 @@ class Test { class } -// EXIST: object \ No newline at end of file +// EXIST: object {...} \ No newline at end of file