Changeset 111

Show
Ignore:
Timestamp:
07/14/08 02:19:00 (6 months ago)
Author:
mb0
Message:

added local (cunit, scoped) content assist for declaration names.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java

    r92 r111  
    22 
    33import org.axdt.as3.imp.parser.*; 
     4import org.axdt.as3.imp.parser.AS3Parser.SymbolTable; 
    45import org.axdt.as3.imp.parser.Ast.*; 
    56import org.axdt.as3.templates.AS3TemplateCompletionProcessor; 
     
    6162        public ICompletionProposal[] getContentProposals(IParseController controller, int offset, 
    6263                        ITextViewer viewer) { 
    63                 // START_HERE 
    6464                AS3TemplateCompletionProcessor templateProcessor = new AS3TemplateCompletionProcessor(); 
    6565                ICompletionProposal[] templateProposals = templateProcessor.computeCompletionProposals( 
    6666                                viewer, offset); 
    6767                ArrayList<ICompletionProposal> list = new ArrayList<ICompletionProposal>(); // a 
    68                 // list 
    69                 // of 
    70                 // proposals. 
    71                 for (ICompletionProposal prop:templateProposals) 
    72                         list.add(prop); 
     68                // list of proposals. 
     69                IToken token = getToken(controller, offset); 
     70                boolean hasspace = offset > token.getEndOffset() + 1; 
     71                String prefix = getPrefix(token, offset); 
    7372                if (controller.getCurrentAst() != null) { 
    74                         IToken token = getToken(controller, offset); 
    75                         boolean hasspace = offset > token.getEndOffset() + 1; 
    76                         String prefix = getPrefix(token, offset); 
    7773 
    7874                        AS3ASTNodeLocator locator = new AS3ASTNodeLocator(); 
    7975                        ASTNode node = (ASTNode) locator.findNode(controller.getCurrentAst(), token 
    8076                                        .getStartOffset(), token.getEndOffset()); 
     77                        Set<String> set = getUnitScopeNames(node, prefix); 
     78                        for (String key:set)  
     79                                list.add(new SourceProposal(key,"",offset)); 
    8180                        if (node != null) { 
    8281                                if (node instanceof BadDirective) { 
     
    104103                        } 
    105104                } else { 
    106                         list.add(new SourceProposal("no info available due to Syntax error(s)", "", offset)); 
     105                        AS3ParseController pc = (AS3ParseController)controller; 
     106                        Object backupAst = pc.getBackupAst(); 
     107                        if (backupAst != null) { 
     108                                AS3ASTNodeLocator locator = new AS3ASTNodeLocator(); 
     109                                Object findNode = locator.findNode(backupAst,offset); 
     110                                Set<String> set = getUnitScopeNames(findNode, prefix); 
     111                                for (String key:set)  
     112                                        list.add(new SourceProposal(key,"",offset)); 
     113                        } 
    107114                } 
     115                for (ICompletionProposal prop:templateProposals) 
     116                        list.add(prop); 
    108117                return (ICompletionProposal[]) list.toArray(new ICompletionProposal[list.size()]); 
    109118        } 
     119        private Set<String> getUnitScopeNames(Object findNode, String prefix) { 
     120                Set<String> set = new HashSet<String>(); 
     121                if (findNode instanceof ASTNode) { 
     122                        ASTNode node = (ASTNode) findNode; 
     123                        SymbolTable table = new AS3ASTNodeLocator().getEnclosingSymbolTable(node); 
     124                        List<String> allKeys = table.getAllKeys(null); 
     125                        for (String key:allKeys) { 
     126                                // TODO: handle namespaces 
     127                                if (key.contains("::")) continue; 
     128                                key = key.trim(); 
     129                                if (key.contains(" ")) 
     130                                        key = key.substring(key.lastIndexOf(' ')+1); 
     131                                if (key.startsWith(prefix)) 
     132                                        set.add(key); 
     133                        } 
     134                } 
     135                return set;  
     136        } 
    110137} 
  • axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ASTNodeLocator.java

    r92 r111  
    44import org.eclipse.core.runtime.Path; 
    55 
     6import org.axdt.as3.imp.parser.AS3Parser.SymbolTable; 
    67import org.axdt.as3.imp.parser.Ast.ASTNode; 
    78import org.axdt.as3.imp.parser.Ast.AbstractVisitor; 
     9import org.axdt.as3.imp.parser.Ast.Block; 
     10import org.axdt.as3.imp.parser.Ast.ClassBody; 
     11import org.axdt.as3.imp.parser.Ast.ClassDeclaration; 
     12import org.axdt.as3.imp.parser.Ast.ForStatement; 
     13import org.axdt.as3.imp.parser.Ast.FunctionExpression; 
     14import org.axdt.as3.imp.parser.Ast.InterfaceBody; 
     15import org.axdt.as3.imp.parser.Ast.MethodDeclaration; 
    816import org.eclipse.imp.parser.ISourcePositionLocator; 
    917 
     
    99107                return new Path(""); 
    100108        } 
     109        public SymbolTable getEnclosingSymbolTable(IAst n) { 
     110                for (; n != null; n = n.getParent()) { 
     111                        if (n instanceof Block) return ((Block) n).getSymbolTable(); 
     112                        if (n instanceof MethodDeclaration) return ((MethodDeclaration) n).getSymbolTable(); 
     113                        if (n instanceof FunctionExpression) return ((FunctionExpression) n).getSymbolTable(); 
     114                        if (n instanceof ClassBody) return ((ClassBody) n).getSymbolTable(); 
     115                        if (n instanceof ClassDeclaration) return ((ClassDeclaration) n).getSymbolTable(); 
     116                        if (n instanceof InterfaceBody) return ((InterfaceBody) n).getSymbolTable(); 
     117                        if (n instanceof ForStatement) return ((ForStatement) n).getSymbolTable(); 
     118                } 
     119                return null; 
     120        } 
    101121} 
  • axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java

    r106 r111  
    2626 
    2727        private AS3Lexer lexer; 
     28 
     29        private Object backupAst; 
    2830 
    2931        public AS3ParseController() { 
     
    8385                // inconsistent wrt the lex stream now 
    8486                if (my_monitor.isCancelled()) return fCurrentAst; 
     87                 
     88                if (fCurrentAst != null) 
     89                        backupAst = fCurrentAst; 
    8590 
    8691                fCurrentAst = parser.parser(my_monitor, 0); 
     
    100105                return result; 
    101106        } 
     107 
     108        public Object getBackupAst() { 
     109                return backupAst; 
     110        } 
    102111} 
  • axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Parser.g

    r110 r111  
    1919    /.import org.eclipse.imp.parser.IParser; 
    2020    import java.util.Hashtable; 
     21    import java.util.ArrayList; 
     22    import java.util.List; 
    2123    import java.util.Stack; 
    2224    ./ 
     
    568570                                return false; 
    569571                        } 
     572                         
     573                        public List<String> getAllKeys(List<String> list) { 
     574                                if (list == null) 
     575                                        list = new ArrayList<String>(); 
     576                                list.addAll(keySet()); 
     577                                if (parent != null) parent.getAllKeys(list); 
     578                                return list; 
     579                        } 
    570580                } 
    571581