1.1 --- a/ruby/src/org/netbeans/modules/ruby/RubyRenameHandler.java Sun Dec 08 11:39:16 2013 -0600
1.2 +++ b/ruby/src/org/netbeans/modules/ruby/RubyRenameHandler.java Sun Dec 08 12:20:16 2013 -0600
1.3 @@ -47,19 +47,7 @@
1.4 import java.util.HashSet;
1.5 import java.util.Set;
1.6
1.7 -import org.jrubyparser.ast.ArgsNode;
1.8 -import org.jrubyparser.ast.ArgumentNode;
1.9 -import org.jrubyparser.ast.BlockArgNode;
1.10 -import org.jrubyparser.ast.ListNode;
1.11 -import org.jrubyparser.ast.LocalAsgnNode;
1.12 -import org.jrubyparser.ast.LocalVarNode;
1.13 -import org.jrubyparser.ast.MethodDefNode;
1.14 import org.jrubyparser.ast.Node;
1.15 -import org.jrubyparser.ast.NodeType;
1.16 -import org.jrubyparser.ast.INameNode;
1.17 -import org.jrubyparser.SourcePosition;
1.18 -import org.jrubyparser.ast.AssignableNode;
1.19 -import org.jrubyparser.ast.ILocalScope;
1.20 import org.jrubyparser.ast.ILocalVariable;
1.21 import org.netbeans.modules.csl.api.InstantRenamer;
1.22 import org.netbeans.modules.csl.api.OffsetRange;
1.23 @@ -134,102 +122,22 @@
1.24
1.25 @Override
1.26 public Set<OffsetRange> getRenameRegions(ParserResult info, int caretOffset) {
1.27 - Node root = AstUtilities.getRoot(info);
1.28 - if (root == null) return Collections.emptySet();
1.29 + Node closest = AstUtilities.findNodeAtOffset(info, caretOffset);
1.30 + if (closest == null || !(closest instanceof ILocalVariable)) return Collections.emptySet();
1.31
1.32 + ILocalVariable variable = (ILocalVariable) closest;
1.33 Set<OffsetRange> regions = new HashSet<OffsetRange>();
1.34
1.35 - int astOffset = AstUtilities.getAstOffset(info, caretOffset);
1.36 - if (astOffset == -1) return Collections.emptySet();
1.37 + for (ILocalVariable occurrence: variable.getOccurrences()) {
1.38 + OffsetRange range = LexUtilities.getLexerOffsets(info,
1.39 + AstUtilities.offsetRangeFor(occurrence.getNamePosition()));
1.40
1.41 - AstPath path = new AstPath(root, astOffset);
1.42 - Node closest = path.leaf();
1.43 - if (closest == null) return Collections.emptySet();
1.44 -
1.45 - if (closest.isBlockParameter()) {
1.46 - ILocalVariable blockParameter = (ILocalVariable) closest;
1.47 -
1.48 - for (ILocalVariable occurrence: blockParameter.getOccurrences()) {
1.49 - OffsetRange range = LexUtilities.getLexerOffsets(info,
1.50 - AstUtilities.offsetRangeFor(occurrence.getLexicalNamePosition()));
1.51 -
1.52 - if (range != OffsetRange.NONE) regions.add(range);
1.53 - }
1.54 - } else if (closest instanceof LocalVarNode || closest instanceof LocalAsgnNode) {
1.55 - // A local variable read or a parameter read, or an assignment to one of these
1.56 - String name = ((INameNode)closest).getName();
1.57 - Node localScope = AstUtilities.findLocalScope(closest, path);
1.58 -
1.59 - if (localScope == null) {
1.60 - // Use parent, possibly Grand Parent if we have a newline node in the way
1.61 - localScope = path.leafParent();
1.62 -
1.63 - if (localScope.getNodeType() == NodeType.NEWLINENODE) localScope = path.leafGrandParent();
1.64 - if (localScope == null) localScope = closest;
1.65 - }
1.66 -
1.67 - addLocals(info, localScope, name, regions);
1.68 - } else if (closest.getNodeType() == NodeType.DVARNODE || closest.getNodeType() == NodeType.DASGNNODE) {
1.69 - // 1.8-style block declaration: iter { dasgn }
1.70 - String name = ((INameNode)closest).getName();
1.71 -
1.72 - for (Node block : AstUtilities.getApplicableBlocks(path, true)) {
1.73 - addDynamicVars(info, block, name, regions);
1.74 - }
1.75 - } else if (closest.getNodeType() == NodeType.ARGUMENTNODE || closest.getNodeType() == NodeType.BLOCKARGNODE) {
1.76 - // A method name (if under a DefnNode or DefsNode) or a parameter (if indirectly under an ArgsNode)
1.77 - String name = ((INameNode)closest).getName();
1.78 -
1.79 - Node parent = path.leafParent();
1.80 -
1.81 - if (parent != null) {
1.82 - // Make sure it's a parameter, not a method
1.83 - if (!(parent instanceof MethodDefNode)) {
1.84 - // Parameter (check to see if its under ArgumentNode)
1.85 - Node method = AstUtilities.findMethodAtOffset(root, astOffset);
1.86 -
1.87 - if (method == null) method = AstUtilities.findBlock(path);
1.88 -
1.89 - if (method == null) {
1.90 - // Use parent, possibly Grand Parent if we have a newline node in the way
1.91 - method = path.leafParent();
1.92 -
1.93 - if (method.getNodeType() == NodeType.NEWLINENODE) method = path.leafGrandParent();
1.94 - if (method == null) method = closest;
1.95 - }
1.96 -
1.97 - addLocals(info, method, name, regions);
1.98 - }
1.99 - }
1.100 + if (range != OffsetRange.NONE) regions.add(range);
1.101 }
1.102
1.103 return regions;
1.104 }
1.105
1.106 - private void addLocals(ParserResult info, Node node, String name, Set<OffsetRange> ranges) {
1.107 - if (node.getNodeType() == NodeType.LOCALVARNODE) {
1.108 - if (((INameNode)node).getName().equals(name)) {
1.109 - OffsetRange range = AstUtilities.getRange(node);
1.110 - range = LexUtilities.getLexerOffsets(info, range);
1.111 - if (range != OffsetRange.NONE) ranges.add(range);
1.112 - }
1.113 - } else if (node.getNodeType() == NodeType.LOCALASGNNODE) {
1.114 - if (((INameNode)node).getName().equals(name)) {
1.115 - OffsetRange range = AstUtilities.getRange(node);
1.116 - // Adjust end offset to only include the left hand size
1.117 - range = new OffsetRange(range.getStart(), range.getStart() + name.length());
1.118 - range = LexUtilities.getLexerOffsets(info, range);
1.119 - if (range != OffsetRange.NONE) ranges.add(range);
1.120 - }
1.121 - } else if (node.getNodeType() == NodeType.ARGSNODE) {
1.122 - addArgsNode(node, name, info, ranges);
1.123 - }
1.124 -
1.125 - for (Node child : node.childNodes()) {
1.126 - addLocals(info, child, name, ranges);
1.127 - }
1.128 - }
1.129 -
1.130 // TODO: Check
1.131 // quick tip renaming
1.132 // unused detection
1.133 @@ -240,84 +148,4 @@
1.134 //
1.135 // Test both parent blocks, sibling blocks and descendant blocks
1.136 // Make sure the "isUsed" detection is smarter too.
1.137 -
1.138 - private void addDynamicVars(ParserResult info, Node node, String name, Set<OffsetRange> ranges) {
1.139 - switch (node.getNodeType()) {
1.140 - case DVARNODE:
1.141 - if (((INameNode)node).getName().equals(name)) {
1.142 - OffsetRange range = LexUtilities.getLexerOffsets(info, AstUtilities.getRange(node));
1.143 - if (range != OffsetRange.NONE) ranges.add(range);
1.144 - }
1.145 - break;
1.146 - case DASGNNODE:
1.147 - if (((INameNode)node).getName().equals(name)) {
1.148 - OffsetRange range = AstUtilities.offsetRangeFor(((AssignableNode) node).getLeftHandSidePosition());
1.149 - range = LexUtilities.getLexerOffsets(info, range);
1.150 - if (range != OffsetRange.NONE) ranges.add(range);
1.151 - }
1.152 - break;
1.153 - case ARGSNODE:
1.154 - addArgsNode(node, name, info, ranges);
1.155 - }
1.156 -
1.157 - for (Node child : node.childNodes()) {
1.158 - if (child instanceof ILocalScope || child.getNodeType() == NodeType.ITERNODE) continue;
1.159 -
1.160 - addDynamicVars(info, child, name, ranges);
1.161 - }
1.162 - }
1.163 -
1.164 - private void addArgsNode(Node node, String name, ParserResult info, Set<OffsetRange> ranges) {
1.165 - ArgsNode an = (ArgsNode)node;
1.166 -
1.167 - if (an.getRequiredCount() > 0) {
1.168 - for (Node arg : an.childNodes()) {
1.169 - if (!(arg instanceof ListNode)) continue;
1.170 - for (Node arg2 : arg.childNodes()) {
1.171 - if (arg2.getNodeType() == NodeType.ARGUMENTNODE) {
1.172 - if (((ArgumentNode)arg2).getName().equals(name)) {
1.173 - OffsetRange range = AstUtilities.getRange(arg2);
1.174 - range = LexUtilities.getLexerOffsets(info, range);
1.175 - if (range != OffsetRange.NONE) ranges.add(range);
1.176 - }
1.177 - } else if (arg2.getNodeType() == NodeType.LOCALASGNNODE) {
1.178 - if (((LocalAsgnNode)arg2).getName().equals(name)) {
1.179 - OffsetRange range = AstUtilities.getRange(arg2);
1.180 - // Adjust end offset to only include the left hand size
1.181 - range = new OffsetRange(range.getStart(), range.getStart() + name.length());
1.182 - range = LexUtilities.getLexerOffsets(info, range);
1.183 - if (range != OffsetRange.NONE) ranges.add(range);
1.184 - }
1.185 - }
1.186 - }
1.187 - }
1.188 - }
1.189 -
1.190 - // Rest args
1.191 - if (an.getRest() != null) {
1.192 - ArgumentNode bn = an.getRest();
1.193 -
1.194 - if (bn.getName().equals(name)) {
1.195 - SourcePosition pos = bn.getPosition();
1.196 -
1.197 - // +1: Skip "*" and "&" prefix
1.198 - OffsetRange range = new OffsetRange(pos.getStartOffset() + 1, pos.getEndOffset());
1.199 - range = LexUtilities.getLexerOffsets(info, range);
1.200 - if (range != OffsetRange.NONE) ranges.add(range);
1.201 - }
1.202 - }
1.203 -
1.204 - if (an.getBlock() != null) {
1.205 - BlockArgNode bn = an.getBlock();
1.206 -
1.207 - if (bn.getName().equals(name)) {
1.208 - SourcePosition pos = bn.getPosition();
1.209 -
1.210 - // +1: Skip "*" and "&" prefix
1.211 - OffsetRange range = new OffsetRange(pos.getStartOffset() + 1, pos.getEndOffset());
1.212 - range = LexUtilities.getLexerOffsets(info, range);
1.213 - if (range != OffsetRange.NONE) ranges.add(range);
1.214 - }
1.215 - }
1.216 - }
1.217 }