32
32
33
33
import java .util .Collection ;
34
34
35
+ import static com .goide .completion .GoCompletionUtil .CONTEXT_KEYWORD_PRIORITY ;
36
+ import static com .goide .completion .GoCompletionUtil .KEYWORD_PRIORITY ;
35
37
import static com .goide .completion .GoKeywordCompletionProvider .EMPTY_INSERT_HANDLER ;
36
38
import static com .intellij .patterns .PlatformPatterns .psiElement ;
37
39
import static com .intellij .patterns .PlatformPatterns .psiFile ;
@@ -41,48 +43,44 @@ public class GoKeywordCompletionContributor extends CompletionContributor implem
41
43
private static final InsertHandler <LookupElement > ADD_BRACKETS_INSERT_HANDLER = new AddBracketsInsertHandler ();
42
44
43
45
public GoKeywordCompletionContributor () {
44
- extend (CompletionType .BASIC , packagePattern (), new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY ,
46
+ extend (CompletionType .BASIC , packagePattern (), new GoKeywordCompletionProvider (KEYWORD_PRIORITY ,
45
47
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" ));
49
50
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" ));
52
52
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" ));
54
54
extend (CompletionType .BASIC , insideBlockPattern (GoTypes .IDENTIFIER ),
55
- new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "select" ));
55
+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "select" ));
56
56
extend (CompletionType .BASIC , typeDeclaration (),
57
- new GoKeywordCompletionProvider (GoCompletionUtil . KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "interface" , "struct" ));
57
+ new GoKeywordCompletionProvider (KEYWORD_PRIORITY , BracesInsertHandler .INSTANCE , "interface" , "struct" ));
58
58
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" ));
60
60
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 ,
64
64
ADD_BRACKETS_INSERT_HANDLER , "map" ));
65
65
66
- extend (CompletionType .BASIC , referenceExpression (), new GoKeywordCompletionProvider (GoCompletionUtil . CONTEXT_KEYWORD_PRIORITY ,
66
+ extend (CompletionType .BASIC , referenceExpression (), new GoKeywordCompletionProvider (CONTEXT_KEYWORD_PRIORITY ,
67
67
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 ,
69
69
BracesInsertHandler .ONE_LINER , "struct" ));
70
70
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" ));
76
74
// todo: "range"
77
75
}
78
76
79
77
@ Override
80
78
public void fillCompletionVariants (@ NotNull CompletionParameters parameters , @ NotNull CompletionResultSet result ) {
81
79
super .fillCompletionVariants (parameters , result );
82
- if (insideGoOrDeferStatements ().accepts (parameters .getPosition ())) {
80
+ final PsiElement position = parameters .getPosition ();
81
+ if (insideGoOrDeferStatements ().accepts (position ) || anonymousFunction ().accepts (position )) {
83
82
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 ));
86
84
}
87
85
}
88
86
@@ -125,6 +123,12 @@ private static PsiElementPattern.Capture<PsiElement> insideGoOrDeferStatements()
125
123
return psiElement (GoTypes .IDENTIFIER )
126
124
.withParent (psiElement (GoExpression .class ).withParent (or (psiElement (GoDeferStatement .class ), psiElement (GoGoStatement .class ))));
127
125
}
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
+ }
128
132
129
133
private static PsiElementPattern .Capture <PsiElement > insideBlockPattern (@ NotNull IElementType tokenType ) {
130
134
return onStatementBeginning (tokenType )
0 commit comments