Changeset 111
- Timestamp:
- 07/14/08 02:19:00 (6 months ago)
- Files:
-
- axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java (modified) (3 diffs)
- axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ASTNodeLocator.java (modified) (2 diffs)
- axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java (modified) (3 diffs)
- axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Parser.g (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/contentProposer/AS3ContentProposer.java
r92 r111 2 2 3 3 import org.axdt.as3.imp.parser.*; 4 import org.axdt.as3.imp.parser.AS3Parser.SymbolTable; 4 5 import org.axdt.as3.imp.parser.Ast.*; 5 6 import org.axdt.as3.templates.AS3TemplateCompletionProcessor; … … 61 62 public ICompletionProposal[] getContentProposals(IParseController controller, int offset, 62 63 ITextViewer viewer) { 63 // START_HERE64 64 AS3TemplateCompletionProcessor templateProcessor = new AS3TemplateCompletionProcessor(); 65 65 ICompletionProposal[] templateProposals = templateProcessor.computeCompletionProposals( 66 66 viewer, offset); 67 67 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); 73 72 if (controller.getCurrentAst() != null) { 74 IToken token = getToken(controller, offset);75 boolean hasspace = offset > token.getEndOffset() + 1;76 String prefix = getPrefix(token, offset);77 73 78 74 AS3ASTNodeLocator locator = new AS3ASTNodeLocator(); 79 75 ASTNode node = (ASTNode) locator.findNode(controller.getCurrentAst(), token 80 76 .getStartOffset(), token.getEndOffset()); 77 Set<String> set = getUnitScopeNames(node, prefix); 78 for (String key:set) 79 list.add(new SourceProposal(key,"",offset)); 81 80 if (node != null) { 82 81 if (node instanceof BadDirective) { … … 104 103 } 105 104 } 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 } 107 114 } 115 for (ICompletionProposal prop:templateProposals) 116 list.add(prop); 108 117 return (ICompletionProposal[]) list.toArray(new ICompletionProposal[list.size()]); 109 118 } 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 } 110 137 } axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ASTNodeLocator.java
r92 r111 4 4 import org.eclipse.core.runtime.Path; 5 5 6 import org.axdt.as3.imp.parser.AS3Parser.SymbolTable; 6 7 import org.axdt.as3.imp.parser.Ast.ASTNode; 7 8 import org.axdt.as3.imp.parser.Ast.AbstractVisitor; 9 import org.axdt.as3.imp.parser.Ast.Block; 10 import org.axdt.as3.imp.parser.Ast.ClassBody; 11 import org.axdt.as3.imp.parser.Ast.ClassDeclaration; 12 import org.axdt.as3.imp.parser.Ast.ForStatement; 13 import org.axdt.as3.imp.parser.Ast.FunctionExpression; 14 import org.axdt.as3.imp.parser.Ast.InterfaceBody; 15 import org.axdt.as3.imp.parser.Ast.MethodDeclaration; 8 16 import org.eclipse.imp.parser.ISourcePositionLocator; 9 17 … … 99 107 return new Path(""); 100 108 } 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 } 101 121 } axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3ParseController.java
r106 r111 26 26 27 27 private AS3Lexer lexer; 28 29 private Object backupAst; 28 30 29 31 public AS3ParseController() { … … 83 85 // inconsistent wrt the lex stream now 84 86 if (my_monitor.isCancelled()) return fCurrentAst; 87 88 if (fCurrentAst != null) 89 backupAst = fCurrentAst; 85 90 86 91 fCurrentAst = parser.parser(my_monitor, 0); … … 100 105 return result; 101 106 } 107 108 public Object getBackupAst() { 109 return backupAst; 110 } 102 111 } axdt/trunk/org.axdt.as3/src/org/axdt/as3/imp/parser/AS3Parser.g
r110 r111 19 19 /.import org.eclipse.imp.parser.IParser; 20 20 import java.util.Hashtable; 21 import java.util.ArrayList; 22 import java.util.List; 21 23 import java.util.Stack; 22 24 ./ … … 568 570 return false; 569 571 } 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 } 570 580 } 571 581
