Skip to content

Commit

Permalink
Package names completion
Browse files Browse the repository at this point in the history
  • Loading branch information
zolotov committed Mar 13, 2015
1 parent fb1935c commit bea3c74
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 101 deletions.
2 changes: 1 addition & 1 deletion resources/liveTemplates/go.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
</template>
<template description='Package declaration' name='p' toReformat='true' toShortenFQNames='true'
value='package $NAME$'>
<variable alwaysStopAt='true' defaultValue='' expression='directoryName()' name='NAME'/>
<variable alwaysStopAt='true' defaultValue='' expression='complete()' name='NAME'/>
<context>
<option name='GO_FILE' value='true'/>
</context>
Expand Down
2 changes: 1 addition & 1 deletion resources/liveTemplates/hidden.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<!-- KEYWORDS -->
<template description='Package declaration' id='go_lang_package' name='go_lang_package' toReformat='true' toShortenFQNames='true'
value='package $NAME$'>
<variable alwaysStopAt='true' defaultValue='' expression='directoryName()' name='NAME'/>
<variable alwaysStopAt='true' defaultValue='' expression='complete()' name='NAME'/>
<context>
<option name='GO' value='true'/>
</context>
Expand Down
38 changes: 38 additions & 0 deletions src/com/goide/completion/GoCompletionContributor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.goide.completion;

import com.goide.GoConstants;
import com.goide.GoTypes;
import com.goide.psi.GoPackageClause;
import com.goide.util.GoUtil;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;

import java.util.Collection;

public class GoCompletionContributor extends CompletionContributor {
@Override
public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull CompletionResultSet result) {
PsiElement position = parameters.getPosition();
if (position.getParent() instanceof GoPackageClause && position.getNode().getElementType() == GoTypes.IDENTIFIER) {
PsiDirectory directory = parameters.getOriginalFile().getParent();
Collection<String> packagesInDirectory = GoUtil.getAllPackagesInDirectory(directory);
for (String packageName : packagesInDirectory) {
result.addElement(LookupElementBuilder.create(packageName));
}

if (packagesInDirectory.isEmpty() && directory != null) {
String packageFromDirectory = FileUtil.sanitizeFileName(directory.getName());
if (!packageFromDirectory.isEmpty()) {
result.addElement(LookupElementBuilder.create(packageFromDirectory));
}
}
result.addElement(LookupElementBuilder.create(GoConstants.MAIN));
}
}
}
26 changes: 2 additions & 24 deletions src/com/goide/psi/GoFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.goide.stubs.GoFileStub;
import com.goide.stubs.GoVarSpecStub;
import com.goide.stubs.types.*;
import com.goide.util.GoUtil;
import com.intellij.extapi.psi.PsiFileBase;
import com.intellij.lang.parser.GeneratedParserUtilBase;
import com.intellij.openapi.fileTypes.FileType;
Expand All @@ -38,7 +39,6 @@
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubTree;
import com.intellij.psi.tree.IElementType;
Expand Down Expand Up @@ -203,7 +203,7 @@ public MultiMap<String, GoImportSpec> getImportMap() {
}
GoImportString string = spec.getImportString();
PsiDirectory dir = string.resolve();
final Collection<String> packagesInDirectory = getAllPackagesInDirectory(dir);
Collection<String> packagesInDirectory = GoUtil.getAllPackagesInDirectory(dir);
if (!packagesInDirectory.isEmpty()) {
for (String packageNames : packagesInDirectory) {
if (!StringUtil.isEmpty(packageNames)) {
Expand Down Expand Up @@ -263,28 +263,6 @@ public Result<List<GoConstDefinition>> compute() {
});
}

private static Collection<String> getAllPackagesInDirectory(@Nullable final PsiDirectory dir) {
if (dir == null) {
return Collections.emptyList();
}
return CachedValuesManager.getCachedValue(dir, new CachedValueProvider<Collection<String>>() {
@Nullable
@Override
public Result<Collection<String>> compute() {
Collection<String> set = ContainerUtil.newLinkedHashSet();
for (PsiFile file : dir.getFiles()) {
if (file instanceof GoFile) {
String name = ((GoFile)file).getPackageName();
if (name != null && !GoConstants.MAIN.equals(name)) {
set.add(StringUtil.trimEnd(name, GoConstants.TEST_SUFFIX));
}
}
}
return Result.create(set, dir);
}
});
}

@NotNull
private List<GoTypeSpec> calcTypes() {
final List<GoTypeSpec> result = ContainerUtil.newArrayList();
Expand Down
58 changes: 0 additions & 58 deletions src/com/goide/template/DirectoryNameMacro.java

This file was deleted.

28 changes: 28 additions & 0 deletions src/com/goide/util/GoUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,20 @@
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.CharSequenceHashingStrategy;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand Down Expand Up @@ -158,4 +163,27 @@ public static boolean couldBeReferenceTo(@NotNull PsiElement definition, @NotNul
}
return true;
}

@NotNull
public static Collection<String> getAllPackagesInDirectory(@Nullable final PsiDirectory dir) {
if (dir == null) {
return Collections.emptyList();
}
return CachedValuesManager.getCachedValue(dir, new CachedValueProvider<Collection<String>>() {
@Nullable
@Override
public Result<Collection<String>> compute() {
Collection<String> set = ContainerUtil.newLinkedHashSet();
for (PsiFile file : dir.getFiles()) {
if (file instanceof GoFile) {
String name = ((GoFile)file).getPackageName();
if (name != null && !GoConstants.MAIN.equals(name)) {
set.add(StringUtil.trimEnd(name, GoConstants.TEST_SUFFIX));
}
}
}
return Result.create(set, dir);
}
});
}
}
2 changes: 1 addition & 1 deletion testData/completion/packageKeywordInEmptyFile_after.go
Original file line number Diff line number Diff line change
@@ -1 +1 @@
package src<caret>
package <caret>
2 changes: 1 addition & 1 deletion testData/completion/packageKeyword_after.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package src<caret>
package <caret>

func main() {

Expand Down
52 changes: 37 additions & 15 deletions tests/com/goide/completion/GoCompletionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,19 @@

package com.goide.completion;

import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.TreePrintCondition;
import com.intellij.util.containers.ContainerUtil;

import java.io.IOException;
import java.util.List;

public class GoCompletionTest extends GoCompletionTestBase {
public void testPackageWithoutAlias() {
doTestInclude("package foo; import `fmt`; func main(){<caret>}", "fmt");
}

public void testLocalFunction() {
doTestInclude("package foo; func foo() {}; func main() {<caret>}", "foo", "main");
}
Expand Down Expand Up @@ -90,7 +93,7 @@ public void testBlockKeywords() {
myFixture.testCompletionVariants(getTestName(true) + ".go", "for", "const", "var", "return", "if", "switch", "go", "defer", "select",
"fallthrough", "goto", "main");
}

public void testBlockKeywordsInsideOneLineFunction() {
myFixture.testCompletionVariants(getTestName(true) + ".go", "for", "const", "var", "return", "if", "switch", "go", "defer", "select",
"fallthrough", "goto", "main");
Expand Down Expand Up @@ -152,15 +155,15 @@ public void testMapKeywordInsertHandler() {
public void testMapKeywordInsertHandlerDoNotInsertBrackets() {
doTestCompletion();
}

public void testElseKeyword() {
doTestCompletion();
}

public void testElseKeywordRegression() {
doTestEmptyCompletion();
}

public void testIfKeywordAfterElse() {
doTestCompletion();
}
Expand All @@ -180,7 +183,7 @@ public void testFunctionInGo() {
public void testPackageKeyword() {
doTestCompletion();
}

public void testPackageKeywordInEmptyFile() {
doTestCompletion();
}
Expand Down Expand Up @@ -219,7 +222,7 @@ public void testReceiverCompletion() {
public void testInterfaceTypesNoStruct() {
doTestExclude("package foo; type E struct {}; type B interface {<caret>}", "E");
}

public void testOnlyTypesInParameters() {
doTestExclude("package foo; const a int = 1; var b = 2; func main(<caret>) {}", "a", "b", "main");
}
Expand All @@ -243,15 +246,15 @@ public void testInterfaceType2() {
public void testLabel() {
doTestInclude("package foo; func main() { goto <caret>; Label1: 1}", "Label1");
}

public void testNoMainAnymore() {
doTestEquals("package foo; func ma<caret> { }");
}

public void testNoChanOrMap() {
doTestEquals("package foo; func ma(f int.<caret>) { }");
}

public void testOnTopLevel() {
doTestEquals("package foo; func ma() { }\n<caret>", "var", "const", "func", "type");
}
Expand Down Expand Up @@ -282,7 +285,7 @@ public void testNoDuplicates() {
assertSize(1, ContainerUtil.filter(stringList, new TreePrintCondition.Include("a")));
}

public void testTypeCastAsVar() throws Exception {
public void testTypeCastAsVar() {
doTestInclude("package main\n" +
"var fooVar int = 1\n" +
"func main() {\n" +
Expand All @@ -291,20 +294,39 @@ public void testTypeCastAsVar() throws Exception {
"}", "fooVar");
}

public void testStructConstructions() throws Exception {
doCheckResult("package main; func main() {WaitGr<caret>}; type WaitGroup struct {sema *uint32}",
public void testStructConstructions() {
doCheckResult("package main; func main() {WaitGr<caret>}; type WaitGroup struct {sema *uint32}",
"package main; func main() {WaitGroup{<caret>}}; type WaitGroup struct {sema *uint32}");
}

public void testIntConversion() throws Exception {
public void testIntConversion() {
doCheckResult("package main; func main() {int<caret>}; type int int",
"package main; func main() {int(<caret>)}; type int int");
}

@SuppressWarnings("ConstantConditions")
public void testPackageNames() {
myFixture.configureByText("test_test.go", "package fromTest_test");
myFixture.configureByText("test_file.go", "package fromFile");
myFixture.configureByText("test.go", "package <caret>");
myFixture.completeBasic();
assertSameElements(myFixture.getLookupElementStrings(), "fromTest", "fromFile", "main");
}

@SuppressWarnings("ConstantConditions")
public void testPackageNamesInEmptyDirectory() throws IOException {
VirtualFile dir = myFixture.getTempDirFixture().findOrCreateDir("directory-name");
VirtualFile file = dir.createChildData(this, "test.go");
VfsUtil.saveText(file, "package <caret>");
myFixture.configureFromExistingVirtualFile(file);
myFixture.completeBasic();
assertSameElements(myFixture.getLookupElementStrings(), "directory_name", "main");
}

private void doTestCompletion() {
myFixture.testCompletion(getTestName(true) + ".go", getTestName(true) + "_after.go");
}

private void doTestEmptyCompletion() {
myFixture.testCompletionVariants(getTestName(true) + ".go");
}
Expand Down

0 comments on commit bea3c74

Please sign in to comment.