2727import com .intellij .codeInsight .completion .CompletionType ;
2828import com .intellij .codeInsight .lookup .LookupElement ;
2929import com .intellij .codeInsight .lookup .LookupElementBuilder ;
30- import com .intellij .patterns .PsiElementPattern ;
30+ import com .intellij .patterns .PsiElementPattern . Capture ;
3131import com .intellij .psi .PsiElement ;
3232import com .intellij .util .ProcessingContext ;
3333import de .halirutan .mathematica .MathematicaIcons ;
34+ import de .halirutan .mathematica .codeinsight .completion .SymbolInformationProvider .SymbolInformation ;
3435import de .halirutan .mathematica .parsing .psi .MathematicaRecursiveVisitor ;
35- import de .halirutan .mathematica .parsing .psi .api .*;
36+ import de .halirutan .mathematica .parsing .psi .api .FunctionCall ;
37+ import de .halirutan .mathematica .parsing .psi .api .MessageName ;
38+ import de .halirutan .mathematica .parsing .psi .api .Symbol ;
3639import org .jetbrains .annotations .NotNull ;
3740
3841import java .util .Arrays ;
4750 * First case is when you are inside a function call like Plot[...], then the smart completion suggests the
4851 * options for the specific symbol. Secondly, we handel Message[...] calls and display a list of all messages
4952 * from within the file.
53+ *
5054 * @author patrick (4/2/13)
5155 */
52- public class SmartContextAwareCompletion extends MathematicaCompletionProvider {
56+ class SmartContextAwareCompletion extends MathematicaCompletionProvider {
5357
5458
55- static final HashMap <String , SymbolInformationProvider . SymbolInformation > ourSymbolInformation = SymbolInformationProvider .getSymbolNames ();
56- static final HashSet <String > ourOptionsWithSetDelayed = new HashSet <String >(Arrays .asList (new String []{
59+ private static final HashMap <String , SymbolInformation > ourSymbolInformation = SymbolInformationProvider .getSymbolNames ();
60+ private static final HashSet <String > ourOptionsWithSetDelayed = new HashSet <String >(Arrays .asList (new String []{
5761 "EvaluationMonitor" , "StepMonitor" , "DisplayFunction" , "Deinitialization" , "DisplayFunction" ,
5862 "DistributedContexts" , "Initialization" , "UnsavedVariables" , "UntrackedVariables"
5963 }));
6064
6165 @ Override
6266 void addTo (CompletionContributor contributor ) {
63- final PsiElementPattern . Capture <PsiElement > funcPattern = psiElement ().withSuperParent (2 , FunctionCall .class );
67+ final Capture <PsiElement > funcPattern = psiElement ().withSuperParent (2 , FunctionCall .class );
6468 contributor .extend (CompletionType .SMART , funcPattern , this );
6569 }
6670
@@ -70,9 +74,12 @@ protected void addCompletions(@NotNull CompletionParameters parameters, Processi
7074 final PsiElement position = parameters .getPosition ();
7175 final PsiElement function = position .getParent ().getParent ();
7276 if (function instanceof FunctionCall ) {
73- String functionName = ((Symbol ) function .getFirstChild ()).getSymbolName ();
74- if (ourSymbolInformation .containsKey (functionName ) && ourSymbolInformation .get (functionName ).function ) {
75- final SymbolInformationProvider .SymbolInformation functionInformation = ourSymbolInformation .get (functionName );
77+ final Symbol head = (Symbol ) ((FunctionCall ) function ).getHead ();
78+ String functionName = head .getSymbolName ();
79+ String functionContext = head .getMathematicaContext ();
80+ final String key = functionContext + functionName ;
81+ if (ourSymbolInformation .containsKey (key ) && ourSymbolInformation .get (key ).function ) {
82+ final SymbolInformation functionInformation = ourSymbolInformation .get (key );
7683 final String [] options = functionInformation .options ;
7784 if (options != null ) {
7885 for (String opt : options ) {
@@ -89,11 +96,11 @@ protected void addCompletions(@NotNull CompletionParameters parameters, Processi
8996
9097 @ Override
9198 public void visitMessageName (final MessageName messageName ) {
92- usages .add (
93- LookupElementBuilder .create (messageName .getText ()).
94- withIcon (MathematicaIcons .MESSAGES_ICON ).
95- withCaseSensitivity (false )); // make it case insensitive so you can type argx in Sym::argx to
96- // find the correct completion
99+ usages .add (
100+ LookupElementBuilder .create (messageName .getText ()).
101+ withIcon (MathematicaIcons .MESSAGES_ICON ).
102+ withCaseSensitivity (false )); // make it case insensitive so you can type argx in Sym::argx to
103+ // find the correct completion
97104 }
98105 };
99106 visitor .visitFile (parameters .getOriginalFile ());
0 commit comments