ruby/src/org/netbeans/modules/ruby/RubyRenameHandler.java
changeset 4555 3773928e70d0
parent 4554 07958c1ff402
child 4556 e276e451257b
     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  }