[Pydev-cvs] org.python.pydev.parser/src/org/python/pydev/parser/visitors/scope DefinitionsASTItera
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2008-05-03 16:20:03
|
Update of /cvsroot/pydev/org.python.pydev.parser/src/org/python/pydev/parser/visitors/scope In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10107/src/org/python/pydev/parser/visitors/scope Modified Files: DefinitionsASTIteratorVisitor.java Log Message: Outline: Assign with multiple targets is recognized Index: DefinitionsASTIteratorVisitor.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev.parser/src/org/python/pydev/parser/visitors/scope/DefinitionsASTIteratorVisitor.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** DefinitionsASTIteratorVisitor.java 10 Jun 2006 18:43:19 -0000 1.7 --- DefinitionsASTIteratorVisitor.java 3 May 2008 16:20:07 -0000 1.8 *************** *** 8,11 **** --- 8,12 ---- import org.python.pydev.parser.jython.ast.Attribute; import org.python.pydev.parser.jython.ast.Name; + import org.python.pydev.parser.jython.ast.Tuple; import org.python.pydev.parser.jython.ast.exprType; *************** *** 39,73 **** */ public static Object visitAssign(EasyAstIteratorBase visitor, Assign node, boolean visitUnhandledAndTraverse) throws Exception { ! exprType[] targets = node.targets; ! for (int i = 0; i < targets.length; i++) { ! exprType t = targets[i]; ! ! if(t instanceof Name){ ! //we are in the class declaration ! if(visitor.isInClassDecl() || visitor.isInGlobal()){ ! //add the attribute for the class ! visitor.atomic(t); ! } ! ! }else if(t instanceof Attribute){ ! ! //we are in a method from the class ! if(visitor.isInClassMethodDecl()){ ! Attribute a = (Attribute) t; ! if(a.value instanceof Name){ ! ! //it is an instance variable attribute ! Name n = (Name) a.value; ! if (n.id.equals("self")){ ! visitor.atomic(t); ! } ! } ! ! }else if(visitor.isInClassDecl() || visitor.isInGlobal()){ ! //add the attribute for the class ! visitor.atomic(t); ! } ! } ! } if(visitUnhandledAndTraverse){ Object ret = visitor.unhandled_node(node); --- 40,45 ---- */ public static Object visitAssign(EasyAstIteratorBase visitor, Assign node, boolean visitUnhandledAndTraverse) throws Exception { ! visitTargetsInAssign(visitor, node.targets); ! if(visitUnhandledAndTraverse){ Object ret = visitor.unhandled_node(node); *************** *** 81,84 **** --- 53,110 ---- /** + * Given a visitor and the targets found in an assign, visit them to find class attributes / instance variables. + * + * @param visitor the visitor + * @param targets the expressions in the target + */ + private static void visitTargetsInAssign(EasyAstIteratorBase visitor, exprType[] targets) { + if(targets == null){ + return; + } + for (int i = 0; i < targets.length; i++) { + exprType t = targets[i]; + if(t instanceof Tuple){ + Tuple tuple = (Tuple) t; + visitTargetsInAssign(visitor, tuple.elts); + } + visitTargetInAssign(visitor, t); + } + } + + /** + * Visit a single target found in an assign to create a class attributes / instance variables if possible. + * @param visitor the visitor + * @param t the expression to visit + */ + private static void visitTargetInAssign(EasyAstIteratorBase visitor, exprType t) { + if(t instanceof Name){ + //we are in the class declaration + if(visitor.isInClassDecl() || visitor.isInGlobal()){ + //add the attribute for the class + visitor.atomic(t); + } + + }else if(t instanceof Attribute){ + + //we are in a method from the class + if(visitor.isInClassMethodDecl()){ + Attribute a = (Attribute) t; + if(a.value instanceof Name){ + + //it is an instance variable attribute + Name n = (Name) a.value; + if (n.id.equals("self")){ + visitor.atomic(t); + } + } + + }else if(visitor.isInClassDecl() || visitor.isInGlobal()){ + //add the attribute for the class + visitor.atomic(t); + } + } + } + + /** * Creates the iterator and transverses the passed root so that the results can be gotten. */ |