Skip to content

Commit f8cff4a

Browse files
committed
Implemented simple caching of file-functions in the PsiFile used for auto-completion
1 parent fd929fa commit f8cff4a

6 files changed

Lines changed: 55 additions & 26 deletions

File tree

src/de/halirutan/mathematica/codeinsight/completion/CommentCompletionProvider.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030
import com.intellij.util.ProcessingContext;
3131
import com.intellij.util.text.StringTokenizer;
3232
import de.halirutan.mathematica.lang.MathematicaLanguage;
33+
import de.halirutan.mathematica.lang.psi.api.MathematicaPsiFile;
3334
import org.jetbrains.annotations.NotNull;
3435

36+
import java.util.Set;
3537
import java.util.regex.Pattern;
3638

3739
import static com.intellij.patterns.PlatformPatterns.psiComment;
@@ -47,7 +49,7 @@ public class CommentCompletionProvider extends MathematicaCompletionProvider {
4749
"Section", "Subsection", "Subsubsection", "Text", "Package", "Title", "Subtitle", "Subsubtitle", "Chapter", "Subchapter", "Subsubsubsection", "Subsubsubsubsubsection",
4850
};
4951

50-
static final public String[] COMMENT_TAGS = {
52+
private static final String[] COMMENT_TAGS = {
5153
"Name", "Title", "Author", "Date", "Summary", "Context",
5254
"Package Version", "Copyright", "Keywords", "Source",
5355
"Mathematica Version", "Limitation", "Discussion"};
@@ -82,10 +84,11 @@ protected void addCompletions(@NotNull CompletionParameters parameters, Processi
8284
}
8385

8486
final PsiFile file = parameters.getOriginalFile();
85-
GlobalDefinitionCompletionProvider provider = new GlobalDefinitionCompletionProvider();
86-
file.accept(provider);
87-
for (String functionName : provider.getFunctionsNames()) {
88-
resultWithPrefix.addElement(LookupElementBuilder.create(functionName));
87+
if (file instanceof MathematicaPsiFile) {
88+
final Set<String> cachedDefinitions = ((MathematicaPsiFile) file).getCachedDefinitions();
89+
for (String definition : cachedDefinitions) {
90+
resultWithPrefix.addElement(LookupElementBuilder.create(definition));
91+
}
8992
}
9093
}
9194
}

src/de/halirutan/mathematica/codeinsight/completion/VariableNameCompletion.java

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@
2525
import com.intellij.codeInsight.completion.*;
2626
import com.intellij.codeInsight.lookup.LookupElementBuilder;
2727
import com.intellij.openapi.project.Project;
28-
import com.intellij.openapi.vfs.VirtualFile;
2928
import com.intellij.patterns.PlatformPatterns;
3029
import com.intellij.patterns.PsiElementPattern.Capture;
3130
import com.intellij.psi.PsiElement;
3231
import com.intellij.psi.PsiFile;
3332
import com.intellij.psi.PsiRecursiveElementVisitor;
3433
import com.intellij.psi.ResolveState;
35-
import com.intellij.psi.search.GlobalSearchScope;
3634
import com.intellij.psi.util.PsiTreeUtil;
3735
import com.intellij.util.ProcessingContext;
3836
import com.intellij.util.containers.hash.HashSet;
3937
import com.intellij.util.indexing.FileBasedIndex;
4038
import de.halirutan.mathematica.index.packageexport.MathematicaPackageExportIndex;
4139
import de.halirutan.mathematica.index.packageexport.PackageExportSymbol;
40+
import de.halirutan.mathematica.lang.psi.api.MathematicaPsiFile;
4241
import de.halirutan.mathematica.lang.psi.api.Symbol;
4342
import org.jetbrains.annotations.NotNull;
4443

@@ -74,34 +73,23 @@ protected void addCompletions(@NotNull CompletionParameters parameters, Processi
7473
final PsiFile containingFile = parameters.getOriginalFile();
7574
List<Symbol> variants = Lists.newArrayList();
7675

77-
GlobalDefinitionCompletionProvider visitor = new GlobalDefinitionCompletionProvider();
78-
containingFile.accept(visitor);
79-
for (String name : visitor.getFunctionsNames()) {
80-
String possibleBuiltIn = name.contains("`") ? name : "Symbol`" + name;
81-
if (!NAMES.contains(possibleBuiltIn)) {
82-
result.addElement(PrioritizedLookupElement.withPriority(LookupElementBuilder.create(name), GLOBAL_VARIABLE_PRIORITY));
76+
if (containingFile instanceof MathematicaPsiFile) {
77+
final Set<String> cachedDefinitions = ((MathematicaPsiFile) containingFile).getCachedDefinitions();
78+
for (String definition : cachedDefinitions) {
79+
result.addElement(PrioritizedLookupElement.withPriority(LookupElementBuilder.create(definition), GLOBAL_VARIABLE_PRIORITY));
8380
}
8481
}
8582

8683
ImportedContextVisitor importVisitor = new ImportedContextVisitor();
8784
callingSymbol.getContainingFile().accept(importVisitor);
88-
final java.util.HashSet<String> importedContexts = importVisitor.getImportedContexts();
85+
// final java.util.HashSet<String> importedContexts = importVisitor.getImportedContexts();
8986
final FileBasedIndex index = FileBasedIndex.getInstance();
9087
final Collection<PackageExportSymbol> allKeys = index.getAllKeys(MathematicaPackageExportIndex.INDEX_ID, project);
9188
for (PackageExportSymbol key : allKeys) {
9289
if (key.isExported()) {
9390
result.addElement(PrioritizedLookupElement.withPriority(LookupElementBuilder.create(key.getSymbol()).appendTailText("(" + key.getFileName() + ")",true), GLOBAL_VARIABLE_PRIORITY));
9491
}
9592
}
96-
// for (String key : allKeys) {
97-
// final MList<MList<PackageExportSymbol>> values = index.getValues(MathematicaPackageExportIndex.INDEX_ID, key, GlobalSearchScope.allScope(callingSymbol.getProject()));
98-
// for (MList<PackageExportSymbol> value : values) {
99-
// for (PackageExportSymbol packageExportSymbol : value) {
100-
// //TODO: Implement adding completions
101-
//// if(packageExportSymbol.nameSpace.equals())
102-
// }
103-
// }
104-
// }
10593

10694

10795
final LocalDefinitionCompletionProvider processor = new LocalDefinitionCompletionProvider(callingSymbol);

src/de/halirutan/mathematica/lang/psi/api/MathematicaPsiFile.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,15 @@
2222
package de.halirutan.mathematica.lang.psi.api;
2323

2424
import com.intellij.psi.PsiFile;
25+
import org.jetbrains.annotations.NotNull;
26+
27+
import java.util.Set;
2528

2629
/**
2730
* Created with IntelliJ IDEA. User: patrick Date: 1/3/13 Time: 12:09 PM Purpose:
2831
*/
2932
public interface MathematicaPsiFile extends PsiFile, Expression {
33+
void cacheDefinition(@NotNull String name);
34+
35+
Set<String> getCachedDefinitions();
3036
}

src/de/halirutan/mathematica/lang/psi/impl/MathematicaPsiFileImpl.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
package de.halirutan.mathematica.lang.psi.impl;
2323

24+
import com.google.common.collect.Sets;
2425
import com.intellij.extapi.psi.PsiFileBase;
2526
import com.intellij.openapi.fileTypes.FileType;
2627
import com.intellij.psi.FileViewProvider;
@@ -32,15 +33,41 @@
3233
import de.halirutan.mathematica.lang.psi.api.MathematicaPsiFile;
3334
import org.jetbrains.annotations.NotNull;
3435

36+
import java.util.HashSet;
37+
import java.util.Set;
38+
3539
/**
3640
* Created with IntelliJ IDEA. User: patrick Date: 1/3/13 Time: 12:09 PM Purpose:
3741
*/
3842
public class MathematicaPsiFileImpl extends PsiFileBase implements MathematicaPsiFile {
3943

44+
private final Set<String> myFileDefintions = Sets.newHashSet();
45+
private boolean myRecacheDefinitions = false;
46+
4047
public MathematicaPsiFileImpl(@NotNull FileViewProvider viewProvider) {
4148
super(viewProvider, MathematicaLanguage.INSTANCE);
4249
}
4350

51+
@Override
52+
public void cacheDefinition(@NotNull final String name) {
53+
if (myRecacheDefinitions) {
54+
myFileDefintions.clear();
55+
myRecacheDefinitions = false;
56+
}
57+
myFileDefintions.add(name);
58+
}
59+
60+
@Override
61+
public void subtreeChanged() {
62+
super.subtreeChanged();
63+
myRecacheDefinitions = true;
64+
}
65+
66+
@Override
67+
public Set<String> getCachedDefinitions() {
68+
return myFileDefintions;
69+
}
70+
4471
@NotNull
4572
@Override
4673
public FileType getFileType() {

src/de/halirutan/mathematica/lang/resolve/MathematicaSymbolResolver.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.intellij.util.indexing.FileBasedIndex;
3434
import de.halirutan.mathematica.index.packageexport.MathematicaPackageExportIndex;
3535
import de.halirutan.mathematica.index.packageexport.PackageExportSymbol;
36+
import de.halirutan.mathematica.lang.psi.api.MathematicaPsiFile;
3637
import de.halirutan.mathematica.lang.psi.api.Symbol;
3738
import de.halirutan.mathematica.lang.psi.impl.LightBuiltInSymbol;
3839
import de.halirutan.mathematica.lang.psi.impl.LightUndefinedSymbol;
@@ -59,18 +60,22 @@ public SymbolResolveResult resolve(@NotNull Symbol ref, boolean incompleteCode)
5960
}
6061

6162
LocalDefinitionResolveProcessor processor = new LocalDefinitionResolveProcessor(ref);
62-
PsiTreeUtil.treeWalkUp(processor, ref, ref.getContainingFile(), ResolveState.initial());
63+
final PsiFile containingFile = ref.getContainingFile();
64+
PsiTreeUtil.treeWalkUp(processor, ref, containingFile, ResolveState.initial());
6365
final Symbol referringSymbol = processor.getMyReferringSymbol();
6466
if (referringSymbol != null) {
6567
return new SymbolResolveResult(referringSymbol, processor.getMyLocalization(), true);
6668
}
6769

6870
GlobalDefinitionResolveProcessor globalProcessor = new GlobalDefinitionResolveProcessor(ref);
69-
PsiTreeUtil.processElements(ref.getContainingFile(), globalProcessor);
71+
PsiTreeUtil.processElements(containingFile, globalProcessor);
7072

7173

7274
final PsiElement globalDefinition = globalProcessor.getMyReferringSymbol();
7375
if (globalDefinition != null) {
76+
if (containingFile instanceof MathematicaPsiFile) {
77+
((MathematicaPsiFile) containingFile).cacheDefinition(globalDefinition.getText());
78+
}
7479
return new SymbolResolveResult(globalDefinition, MScope.FILE_SCOPE, true);
7580
}
7681

src/de/halirutan/mathematica/lang/resolve/processors/LocalDefinitionResolveProcessor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class LocalDefinitionResolveProcessor(private val myStartElement: Symbol) : Base
100100
* found in [MScope].
101101
*
102102
*
103-
* Secondly I check the patterns in e.g. <code>f@var_:=...</code> for `SetDelayed` and `TagSetDelayed`.
103+
* Secondly I check the patterns in e.g. <code>f@var_:=...!</code> for `SetDelayed` and `TagSetDelayed`.
104104
*
105105
*
106106
* Finally, `RuleDelayed` constructs are checked.

0 commit comments

Comments
 (0)