3232
3333import java .util .Collection ;
3434
35+ import static com .goide .completion .GoCompletionUtil .CONTEXT_KEYWORD_PRIORITY ;
36+ import static com .goide .completion .GoCompletionUtil .KEYWORD_PRIORITY ;
3537import static com .goide .completion .GoKeywordCompletionProvider .EMPTY_INSERT_HANDLER ;
3638import static com .intellij .patterns .PlatformPatterns .psiElement ;
3739import static com .intellij .patterns .PlatformPatterns .psiFile ;
@@ -41,48 +43,44 @@ public class GoKeywordCompletionContributor extends CompletionContributor implem
4143 private static final InsertHandler <LookupElement > ADD_BRACKETS_INSERT_HANDLER = new AddBracketsInsertHandler ();
4244
4345 public GoKeywordCompletionContributor () {
44- extend (CompletionType .BASIC , packagePattern (), new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY ,
46+ extend (CompletionType .BASIC , packagePattern (), new GoKeywordCompletionProvider (KEYWORD_PRIORITY ,
4547 AutoCompletionPolicy .ALWAYS_AUTOCOMPLETE , "package" ));
46- extend (CompletionType .BASIC , importPattern (), new GoKeywordCompletionProvider (GoCompletionUtil .KEYWORD_PRIORITY , "import" ));
47- extend (CompletionType .BASIC , topLevelPattern (),
48- new GoKeywordCompletionProvider (GoCompletionUtil .KEYWORD_PRIORITY , "const" , "var" , "func" , "type" ));
48+ extend (CompletionType .BASIC , importPattern (), new GoKeywordCompletionProvider (KEYWORD_PRIORITY , "import" ));
49+ extend (CompletionType .BASIC , topLevelPattern (), new GoKeywordCompletionProvider (KEYWORD_PRIORITY , "const" , "var" , "func" , "type" ));
4950 extend (CompletionType .BASIC , insideBlockPattern (GoTypes .IDENTIFIER ),
50- new GoKeywordCompletionProvider (GoCompletionUtil .KEYWORD_PRIORITY , "for" , "const" , "var" , "return" , "if" , "switch" , "go" ,
51- "defer" , "goto" ));
51+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , "for" , "const" , "var" , "return" , "if" , "switch" , "go" , "defer" , "goto" ));
5252 extend (CompletionType .BASIC , insideBlockPattern (GoTypes .IDENTIFIER ),
53- new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY , EMPTY_INSERT_HANDLER , "fallthrough" ));
53+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , EMPTY_INSERT_HANDLER , "fallthrough" ));
5454 extend (CompletionType .BASIC , insideBlockPattern (GoTypes .IDENTIFIER ),
55- new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "select" ));
55+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "select" ));
5656 extend (CompletionType .BASIC , typeDeclaration (),
57- new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "interface" , "struct" ));
57+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "interface" , "struct" ));
5858 extend (CompletionType .BASIC , typeExpression (),
59- new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY , BracesInsertHandler .ONE_LINER , "interface" , "struct" ));
59+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , BracesInsertHandler .ONE_LINER , "interface" , "struct" ));
6060 extend (CompletionType .BASIC , insideForStatement (GoTypes .IDENTIFIER ),
61- new GoKeywordCompletionProvider (GoCompletionUtil . CONTEXT_KEYWORD_PRIORITY , EMPTY_INSERT_HANDLER , "break" , "continue" ));
62- extend (CompletionType .BASIC , typeExpression (), new GoKeywordCompletionProvider (GoCompletionUtil . CONTEXT_KEYWORD_PRIORITY , "chan" ));
63- extend (CompletionType .BASIC , typeExpression (), new GoKeywordCompletionProvider (GoCompletionUtil . CONTEXT_KEYWORD_PRIORITY ,
61+ new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY , EMPTY_INSERT_HANDLER , "break" , "continue" ));
62+ extend (CompletionType .BASIC , typeExpression (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY , "chan" ));
63+ extend (CompletionType .BASIC , typeExpression (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY ,
6464 ADD_BRACKETS_INSERT_HANDLER , "map" ));
6565
66- extend (CompletionType .BASIC , referenceExpression (), new GoKeywordCompletionProvider (GoCompletionUtil . CONTEXT_KEYWORD_PRIORITY ,
66+ extend (CompletionType .BASIC , referenceExpression (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY ,
6767 ADD_BRACKETS_INSERT_HANDLER , "map" ));
68- extend (CompletionType .BASIC , referenceExpression (), new GoKeywordCompletionProvider (GoCompletionUtil . CONTEXT_KEYWORD_PRIORITY ,
68+ extend (CompletionType .BASIC , referenceExpression (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY ,
6969 BracesInsertHandler .ONE_LINER , "struct" ));
7070
71- extend (CompletionType .BASIC , afterIfBlock (GoTypes .IDENTIFIER ),
72- new GoKeywordCompletionProvider (GoCompletionUtil .CONTEXT_KEYWORD_PRIORITY , "else" ));
73- extend (CompletionType .BASIC , afterElseKeyword (), new GoKeywordCompletionProvider (GoCompletionUtil .CONTEXT_KEYWORD_PRIORITY , "if" ));
74- extend (CompletionType .BASIC , insideSwitchStatement (),
75- new GoKeywordCompletionProvider (GoCompletionUtil .CONTEXT_KEYWORD_PRIORITY , "case" , "default" ));
71+ extend (CompletionType .BASIC , afterIfBlock (GoTypes .IDENTIFIER ), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY , "else" ));
72+ extend (CompletionType .BASIC , afterElseKeyword (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY , "if" ));
73+ extend (CompletionType .BASIC , insideSwitchStatement (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY , "case" , "default" ));
7674 // todo: "range"
7775 }
7876
7977 @ Override
8078 public void fillCompletionVariants (@ NotNull CompletionParameters parameters , @ NotNull CompletionResultSet result ) {
8179 super .fillCompletionVariants (parameters , result );
82- if (insideGoOrDeferStatements ().accepts (parameters .getPosition ())) {
80+ final PsiElement position = parameters .getPosition ();
81+ if (insideGoOrDeferStatements ().accepts (position ) || anonymousFunction ().accepts (position )) {
8382 InsertHandler <LookupElement > insertHandler = GoKeywordCompletionProvider .createTemplateBasedInsertHandler ("go_lang_anonymous_func" );
84- result .addElement (
85- GoKeywordCompletionProvider .createKeywordLookupElement ("func" , GoCompletionUtil .CONTEXT_KEYWORD_PRIORITY , insertHandler ));
83+ result .addElement (GoKeywordCompletionProvider .createKeywordLookupElement ("func" , CONTEXT_KEYWORD_PRIORITY , insertHandler ));
8684 }
8785 }
8886
@@ -125,6 +123,12 @@ private static PsiElementPattern.Capture<PsiElement> insideGoOrDeferStatements()
125123 return psiElement (GoTypes .IDENTIFIER )
126124 .withParent (psiElement (GoExpression .class ).withParent (or (psiElement (GoDeferStatement .class ), psiElement (GoGoStatement .class ))));
127125 }
126+
127+ private static ElementPattern <? extends PsiElement > anonymousFunction () {
128+ return and (referenceExpression (),
129+ psiElement ().withParent (psiElement (GoReferenceExpression .class )
130+ .withParent (or (psiElement (GoArgumentList .class ), not (psiElement (GoLeftHandExprList .class ))))));
131+ }
128132
129133 private static PsiElementPattern .Capture <PsiElement > insideBlockPattern (@ NotNull IElementType tokenType ) {
130134 return onStatementBeginning (tokenType )
0 commit comments