Skip to content

Commit c4aa1c5

Browse files
committed
Complete func keyword in function arguments and variable values
Fixes #1798
1 parent 251be44 commit c4aa1c5

File tree

6 files changed

+53
-25
lines changed

6 files changed

+53
-25
lines changed

src/com/goide/completion/GoKeywordCompletionContributor.java

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
import java.util.Collection;
3434

35+
import static com.goide.completion.GoCompletionUtil.CONTEXT_KEYWORD_PRIORITY;
36+
import static com.goide.completion.GoCompletionUtil.KEYWORD_PRIORITY;
3537
import static com.goide.completion.GoKeywordCompletionProvider.EMPTY_INSERT_HANDLER;
3638
import static com.intellij.patterns.PlatformPatterns.psiElement;
3739
import 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)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package main
2+
3+
func main() {
4+
println(fun<caret>)
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package main
2+
3+
func main() {
4+
println(func() { <caret> })
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package main
2+
3+
func main() {
4+
a := fun<caret>
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package main
2+
3+
func main() {
4+
a := func() { <caret> }
5+
}

tests/com/goide/completion/GoCompletionTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public void testTypeKeywords() {
187187
}
188188

189189
public void testExpressionKeywords() {
190-
myFixture.testCompletionVariants(getTestName(true) + ".go", "struct", "map", "main");
190+
myFixture.testCompletionVariants(getTestName(true) + ".go", "struct", "map", "main", "func");
191191
}
192192

193193
public void testTypeKeywordsInsideParentheses() {
@@ -267,7 +267,11 @@ public void testFunctionInDefer() {
267267
doTestCompletion();
268268
}
269269

270-
public void testFunctionInMethodInvocation() {
270+
public void testFunctionAsFunctionArgument() {
271+
doTestCompletion();
272+
}
273+
274+
public void testFunctionAsVariableValue() {
271275
doTestCompletion();
272276
}
273277

0 commit comments

Comments
 (0)