]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/assist/SCLContentProposalProvider.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / assist / SCLContentProposalProvider.java
1 package org.simantics.scl.ui.assist;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Map;
6
7 import org.eclipse.jface.fieldassist.IContentProposal;
8 import org.eclipse.jface.fieldassist.IContentProposalProvider;
9 import org.simantics.scl.compiler.commands.CommandSession;
10 import org.simantics.scl.compiler.elaboration.modules.SCLValue;
11 import org.simantics.scl.compiler.environment.Environments;
12 import org.simantics.scl.compiler.types.Type;
13
14
15 public class SCLContentProposalProvider implements IContentProposalProvider {
16
17     private final CommandSession session;
18
19     public SCLContentProposalProvider(CommandSession session) {
20         this.session = session;
21     }
22
23     @Override
24     public IContentProposal[] getProposals(String contents, int position) {
25         int startPos = getPrefixStartPos(contents, position);
26         String prefix = contents.substring(startPos, position);
27         int prefixLength = prefix.length();
28         int namespaceLength = prefix.indexOf('.');
29         if(namespaceLength < 0)
30             namespaceLength = 0;
31         else
32             ++namespaceLength;
33         
34         List<SCLValue> values = Environments.findValuesForPrefix(
35                 session.getRuntimeEnvironment().getEnvironment(),
36                 prefix);
37         
38         ArrayList<IContentProposal> proposals = new ArrayList<IContentProposal>();
39         for(SCLValue value : values)
40             if(!value.isPrivate() && !(value.getName().name.contains("$") && //$NON-NLS-1$
41                     Character.isLetter(value.getName().name.charAt(0))))
42                 proposals.add(new SCLContentProposal(value));
43         
44         prefix = prefix.toLowerCase();
45         for(Map.Entry<String,Type> entry : session.localNamesForContentProposals().entrySet())
46             if(entry.getKey().toLowerCase().startsWith(prefix))
47                 proposals.add(new SCLContentProposal(entry.getKey(), "LocalEnvironment", entry.getValue())); //$NON-NLS-1$
48         
49         return proposals.toArray(new IContentProposal[proposals.size()]);
50     }
51     
52     private static int getPrefixStartPos(String contents, int position) {
53         int pos = position;
54         while(pos > 0) {
55             char c = contents.charAt(pos-1);
56             if(Character.isJavaIdentifierPart(c) || c == '.')
57                 --pos;
58             else
59                 break;
60         }
61         return pos;
62     }
63 }