|
From: <jas...@us...> - 2006-07-20 04:16:25
|
Revision: 1526 Author: jasonpmorrison Date: 2006-07-19 21:16:16 -0700 (Wed, 19 Jul 2006) ViewCVS: http://svn.sourceforge.net/rubyeclipse/?rev=1526&view=rev Log Message: ----------- Added refinements to locate particular ArgumentNode within an ArgsNode Modified Paths: -------------- branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/OffsetNodeLocator.java branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/ScopedNodeLocator.java Modified: branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/OffsetNodeLocator.java =================================================================== --- branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/OffsetNodeLocator.java 2006-07-20 00:10:25 UTC (rev 1525) +++ branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/OffsetNodeLocator.java 2006-07-20 04:16:16 UTC (rev 1526) @@ -1,5 +1,9 @@ package org.rubypeople.rdt.internal.ti.util; +import java.util.Iterator; + +import org.jruby.ast.ArgsNode; +import org.jruby.ast.ArgumentNode; import org.jruby.ast.Node; import org.jruby.evaluator.Instruction; @@ -38,10 +42,32 @@ // Traverse to find closest node rootNode.accept(this); + + // Refine the node, if possible, to an inner node not covered by the visitor + // (Why? Nodes such as ArgumentNode don't like being visited, so they must be handled here.) + locatedNode = refine(locatedNode); // Return the node return locatedNode; } + + private Node refine(Node node) { + // If the search returned an ArgsNode, try to find the specific ArgumentNode matched + if ( node instanceof ArgsNode ) + { + ArgsNode argsNode = (ArgsNode)node; + if ( argsNode.getArgsCount() > 0 ) { + for (Iterator iter = argsNode.getArgs().iterator(); iter.hasNext();) { + ArgumentNode argNode = (ArgumentNode) iter.next(); + if ( nodeDoesSpanOffset(argNode, offset) ) { +// System.out.println("Refining " + node.getClass().getSimpleName() + "["+node.getPosition().getStartOffset() + ".." + node.getPosition().getEndOffset() + "] to " + argNode.getClass().getSimpleName() + "["+argNode.getPosition().getStartOffset() + ".." + argNode.getPosition().getEndOffset() + "]"); + return argNode; + } + } + } + } + return node; + } /** * For each node, see if it spans the desired offset. Modified: branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/ScopedNodeLocator.java =================================================================== --- branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/ScopedNodeLocator.java 2006-07-20 00:10:25 UTC (rev 1525) +++ branches/type_inferrence/trunk/org.rubypeople.rdt.core/src/org/rubypeople/rdt/internal/ti/util/ScopedNodeLocator.java 2006-07-20 04:16:16 UTC (rev 1526) @@ -1,8 +1,11 @@ package org.rubypeople.rdt.internal.ti.util; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import org.jruby.ast.ArgsNode; +import org.jruby.ast.ArgumentNode; import org.jruby.ast.Node; import org.jruby.evaluator.Instruction; @@ -55,5 +58,32 @@ return super.handleNode(iVisited); } + /** + * Handle the parsing of ArgsNode, to get at its ArgumentNodes + * + * @see org.jruby.ast.visitor.NodeVisitor#visitArgsNode(org.jruby.ast.ArgsNode) + */ + public Instruction visitArgsNode(ArgsNode iVisited) { + if ( iVisited.getArgsCount() > 0 ) + { + for (Iterator iter = iVisited.getArgs().iterator(); iter.hasNext();) { + ArgumentNode argNode = (ArgumentNode) iter.next(); + if ( acceptor.doesAccept(argNode)) + { + locatedNodes.add(argNode); + } + } + } + + return super.visitArgsNode(iVisited); +// +// handleNode(iVisited); +// acceptNode(iVisited.getBlockArgNode()); +// if (iVisited.getOptArgs() != null) { +// visitIter(iVisited.getOptArgs().iterator()); +// } +// return null; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |