[Pydev-cvs] org.python.pydev/src_completions/org/python/pydev/editor/codecompletion/revisited/visit
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2008-08-17 00:26:39
|
Update of /cvsroot/pydev/org.python.pydev/src_completions/org/python/pydev/editor/codecompletion/revisited/visitors In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6943/src_completions/org/python/pydev/editor/codecompletion/revisited/visitors Modified Files: GlobalModelVisitor.java AbstractVisitor.java LocalScope.java Log Message: <li><strong>Pydev debugger</strong>Workaround for python bug when filenames don't have absolute paths correctly generated</li> <li><strong>Pydev code-completion</strong>Wild import will only show tokens defined in __all__ (if it's available)</li> <li><strong>Interactive console</strong>: Fixed problem when more attempts to connect were needed</li> <li><strong>Interactive console</strong>Fixed console integration problem with other plugins because of interfaces not properly implemented</li> <li><strong>Code Formatter</strong>: Exponentials handled correctly</li> <li><strong>Launching</strong>: Unit-test and code-coverage may launch multiple folders/files at once</li> <li><strong>Code coverage</strong>: Number format exception no longer given when trying to show lines not executed in the editor and all lines are executed</li> Index: LocalScope.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src_completions/org/python/pydev/editor/codecompletion/revisited/visitors/LocalScope.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** LocalScope.java 5 Jul 2008 21:52:55 -0000 1.8 --- LocalScope.java 17 Aug 2008 00:26:46 -0000 1.9 *************** *** 156,160 **** try { for (int i = 0; i < body.length; i++) { ! GlobalModelVisitor visitor = new GlobalModelVisitor(GlobalModelVisitor.GLOBAL_TOKENS, ""); stmtType stmt = body[i]; if(stmt == null){ --- 156,160 ---- try { for (int i = 0; i < body.length; i++) { ! GlobalModelVisitor visitor = new GlobalModelVisitor(GlobalModelVisitor.GLOBAL_TOKENS, "", false); stmtType stmt = body[i]; if(stmt == null){ *************** *** 235,239 **** stmtType stmt = f.body[i]; if(stmt != null){ ! importedModules.addAll(GlobalModelVisitor.getTokens(stmt, GlobalModelVisitor.ALIAS_MODULES, moduleName, null)); } } --- 235,239 ---- stmtType stmt = f.body[i]; if(stmt != null){ ! importedModules.addAll(GlobalModelVisitor.getTokens(stmt, GlobalModelVisitor.ALIAS_MODULES, moduleName, null, false)); } } Index: AbstractVisitor.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src_completions/org/python/pydev/editor/codecompletion/revisited/visitors/AbstractVisitor.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** AbstractVisitor.java 4 Aug 2007 23:14:59 -0000 1.4 --- AbstractVisitor.java 17 Aug 2008 00:26:46 -0000 1.5 *************** *** 55,62 **** * @param node */ ! protected void addToken(SimpleNode node) { //add the token SourceToken t = makeToken(node, moduleName); this.tokens.add(t); } --- 55,63 ---- * @param node */ ! protected SourceToken addToken(SimpleNode node) { //add the token SourceToken t = makeToken(node, moduleName); this.tokens.add(t); + return t; } *************** *** 230,242 **** * @param state * @param name * @return * @throws Exception */ ! public static List<IToken> getTokens(SimpleNode ast, int which, String moduleName, ICompletionState state) { AbstractVisitor modelVisitor; if(which == INNER_DEFS){ modelVisitor = new InnerModelVisitor(moduleName, state); }else{ ! modelVisitor = new GlobalModelVisitor(which, moduleName); } --- 231,246 ---- * @param state * @param name + * @param onlyAllowTokensIn__all__: only used when checking global tokens: if true, if a token named __all__ is available, + * only the classes that have strings that match in __all__ are available. * @return * @throws Exception */ ! public static List<IToken> getTokens(SimpleNode ast, int which, String moduleName, ICompletionState state, ! boolean onlyAllowTokensIn__all__) { AbstractVisitor modelVisitor; if(which == INNER_DEFS){ modelVisitor = new InnerModelVisitor(moduleName, state); }else{ ! modelVisitor = new GlobalModelVisitor(which, moduleName, onlyAllowTokensIn__all__); } *************** *** 247,250 **** --- 251,255 ---- throw new RuntimeException(e); } + modelVisitor.finishVisit(); return modelVisitor.tokens; }else{ *************** *** 254,257 **** --- 259,271 ---- + /** + * This method is available so that subclasses can do some post-processing before the tokens are actually + * returned. + */ + protected void finishVisit() { + /**Empty**/ + } + + Index: GlobalModelVisitor.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src_completions/org/python/pydev/editor/codecompletion/revisited/visitors/GlobalModelVisitor.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GlobalModelVisitor.java 2 May 2008 13:42:00 -0000 1.3 --- GlobalModelVisitor.java 17 Aug 2008 00:26:46 -0000 1.4 *************** *** 6,9 **** --- 6,13 ---- package org.python.pydev.editor.codecompletion.revisited.visitors; + import java.util.HashSet; + import java.util.Iterator; + + import org.python.pydev.core.IToken; import org.python.pydev.editor.codecompletion.revisited.modules.SourceToken; import org.python.pydev.parser.jython.SimpleNode; *************** *** 13,18 **** --- 17,24 ---- import org.python.pydev.parser.jython.ast.Import; import org.python.pydev.parser.jython.ast.ImportFrom; + import org.python.pydev.parser.jython.ast.List; import org.python.pydev.parser.jython.ast.Name; import org.python.pydev.parser.jython.ast.Str; + import org.python.pydev.parser.jython.ast.exprType; /** *************** *** 24,27 **** --- 30,37 ---- private int visitWhat; + private SourceToken __all__; + private Assign __all__Assign; + private Assign lastAssign; + private boolean onlyAllowTokensIn__all__; /** *************** *** 29,36 **** * @param global_tokens2 */ ! public GlobalModelVisitor(int visitWhat, String moduleName) { this.visitWhat = visitWhat; this.moduleName = moduleName; ! if(moduleName != null && moduleName.endsWith("__init__")){ this.tokens.add(new SourceToken(new Name("__path__", Name.Load), "__path__", "", "", moduleName)); --- 39,46 ---- * @param global_tokens2 */ ! public GlobalModelVisitor(int visitWhat, String moduleName, boolean onlyAllowTokensIn__all__) { this.visitWhat = visitWhat; this.moduleName = moduleName; ! this.onlyAllowTokensIn__all__ = onlyAllowTokensIn__all__; if(moduleName != null && moduleName.endsWith("__init__")){ this.tokens.add(new SourceToken(new Name("__path__", Name.Load), "__path__", "", "", moduleName)); *************** *** 68,71 **** --- 78,82 ---- */ public Object visitAssign(Assign node) throws Exception { + lastAssign = node; node.traverse(this); return null; *************** *** 81,85 **** if ((this.visitWhat & GLOBAL_TOKENS) != 0) { if (node.ctx == Name.Store) { ! addToken(node); } } --- 92,100 ---- if ((this.visitWhat & GLOBAL_TOKENS) != 0) { if (node.ctx == Name.Store) { ! SourceToken added = addToken(node); ! if(onlyAllowTokensIn__all__ && added.getRepresentation().equals("__all__")){ ! __all__ = added; ! __all__Assign = lastAssign; ! } } } *************** *** 125,127 **** --- 140,178 ---- return null; } + + + /** + * Overridden to check __all__ + */ + @Override + protected void finishVisit() { + if(__all__ != null){ + SimpleNode ast = __all__.getAst(); + //just checking it + if(__all__Assign.targets != null && __all__Assign.targets.length == 1 && __all__Assign.targets[0] == ast){ + HashSet<String> validTokensInAll = new HashSet<String>(); + exprType value = __all__Assign.value; + if(value instanceof List){ + List valueList = (List) value; + if(valueList.elts != null){ + for(exprType elt:valueList.elts){ + if(elt instanceof Str){ + Str str = (Str) elt; + validTokensInAll.add(str.s); + } + } + } + } + + if(validTokensInAll.size() > 0){ + for(Iterator<IToken> it = tokens.iterator();it.hasNext();){ + IToken tok = it.next(); + if(!validTokensInAll.contains(tok.getRepresentation())){ + it.remove(); + } + } + } + } + } + } } \ No newline at end of file |