|
From: <jas...@us...> - 2006-07-20 22:15:28
|
Revision: 1533 Author: jasonpmorrison Date: 2006-07-20 15:15:17 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/rubyeclipse/?rev=1533&view=rev Log Message: ----------- Mark occurrences for class variables Modified Paths: -------------- branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/DefaultOccurrencesFinder.java Modified: branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/DefaultOccurrencesFinder.java =================================================================== --- branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/DefaultOccurrencesFinder.java 2006-07-20 05:33:35 UTC (rev 1532) +++ branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/DefaultOccurrencesFinder.java 2006-07-20 22:15:17 UTC (rev 1533) @@ -9,6 +9,9 @@ import org.jruby.ast.BlockNode; import org.jruby.ast.CallNode; import org.jruby.ast.ClassNode; +import org.jruby.ast.ClassVarAsgnNode; +import org.jruby.ast.ClassVarDeclNode; +import org.jruby.ast.ClassVarNode; import org.jruby.ast.Colon2Node; import org.jruby.ast.ConstNode; import org.jruby.ast.DVarNode; @@ -89,6 +92,10 @@ pushInstVarRefs( root, orig, occurrences ); } + if ( isClassVarRef(orig) ) { + pushClassVarRefs( root, orig, occurrences ); + } + if ( isGlobalVarRef(orig) ) { pushGlobalVarRefs( root, orig, occurrences ); } @@ -142,6 +149,15 @@ } /** + * Determines whether a given node is a class variable reference + * @param node + * @return + */ + private boolean isClassVarRef( Node node ) { + return ( ( node instanceof ClassVarNode ) || ( node instanceof ClassVarAsgnNode ) || ( node instanceof ClassVarDeclNode ) ); + } + + /** * Determines whether a given node is a global variable reference * @param node * @return @@ -284,6 +300,74 @@ } /** + * Collects all class variable occurrences + * @param root + * @param orig + * @param occurrences + */ + private void pushClassVarRefs( Node root, Node orig, List<ISourcePosition> occurrences ) { +// System.out.println("Finding occurrences for an instance variable " + orig.toString() ); + + Node searchSpace; + + // Find the name of the enclosing class + ClassNode enclosingClass = (ClassNode)FirstPrecursorNodeLocator.Instance().findFirstPrecursor(root, orig.getPosition().getStartOffset(), new INodeAcceptor() { + public boolean doesAccept(Node node) { + return ( node instanceof ClassNode ); + } + }); + + // If no enclosing class is identified, search root. + if ( enclosingClass == null ) { + searchSpace = root; + } + // Find the search space - all ClassNodes for that name within root scope + else { + final String className = getClassNodeName(enclosingClass); + List<Node> classNodes = ScopedNodeLocator.Instance().findNodesInScope(root, new INodeAcceptor() { + public boolean doesAccept(Node node) { + if ( node instanceof ClassNode ) + { + return getClassNodeName((ClassNode)node).equals(className); + } + return false; + } + }); + BlockNode blockNode = new BlockNode(new SourcePosition("",0)); + for ( Node classNode : classNodes ) + { + blockNode.add( classNode ); + } + searchSpace = blockNode; + } + + // Finalize searchSpace because Java's scoping rules are the awesome + //todo: not needed? + //final Node finalSearchSpace = searchSpace; + + // Get name of local variable reference + final String origName = getClassVarRefName(orig); + + // Find all pertinent nodes + List<Node> searchResults = ScopedNodeLocator.Instance().findNodesInScope(searchSpace, new INodeAcceptor() { + public boolean doesAccept(Node node) { + if ( isClassVarRef(node) ) + { + String name = getClassVarRefName(node); + return ( name != null && name.equals(origName)); + } + return false; + } + }); + + // Scrape position from pertinent nodes + for ( Node searchResult : searchResults ) { + occurrences.add(getPositionOfName(searchResult, searchSpace)); + } + + } + + /** * Collects all global variable occurrences * @param root * @param orig @@ -397,6 +481,7 @@ if ( isLocalVarRef(node) ) { name = getLocalVarRefName(node, scope); } if ( isInstanceVarRef(node) ) { name = getInstVarRefName(node ); } if ( isGlobalVarRef(node) ) { name = getGlobalVarRefName(node); } + if ( isClassVarRef(node) ) { name = getClassVarRefName(node); } // if ( isConstRef(node) ) { name = getConstRefName(node); } if ( node instanceof ConstNode ) { name = ((ConstNode)node).getName(); } if ( node instanceof ClassNode ) { @@ -477,7 +562,7 @@ /** * Gets the name of an instance variable reference - * @param node Instanve variable reference + * @param node Instance variable reference * @return */ private String getInstVarRefName( Node node ) { @@ -492,7 +577,24 @@ if ( node instanceof DVarNode ) { return ((DVarNode)node).getName(); } + return null; + } + /** + * Gets the name of a class variable reference + * @param node Class variable reference + * @return + */ + private String getClassVarRefName( Node node ) { + if ( node instanceof ClassVarNode ) { + return ((ClassVarNode)node).getName(); + } + if ( node instanceof ClassVarDeclNode ) { + return ((ClassVarDeclNode)node).getName(); + } + if ( node instanceof ClassVarAsgnNode ) { + return ((ClassVarAsgnNode)node).getName(); + } return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |