# HG changeset patch # Parent 4be748a106195f054ca15f8a07515d7c535fa1d7 # User Ralph Benjamin Ruijs [no commit message] diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/callhierarchy/CallHierarchyTasks.java b/refactoring.java/src/org/netbeans/modules/refactoring/java/callhierarchy/CallHierarchyTasks.java --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/callhierarchy/CallHierarchyTasks.java +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/callhierarchy/CallHierarchyTasks.java @@ -336,7 +336,7 @@ Set relevantFiles = null; if (!isCanceled()) { relevantFiles = JavaWhereUsedQueryPlugin.getRelevantFiles( - sourceToQuery, cpInfo, false, false, false, true, null, isCanceled); + sourceToQuery, cpInfo, false, false, false, false, true, null, isCanceled); if (SourceUtils.isScanInProgress()) { elmDesc.setIncomplete(true); } @@ -360,7 +360,7 @@ // XXX log it return; } - FindUsagesVisitor findVisitor = new FindUsagesVisitor(javac, isCanceled, false); + FindUsagesVisitor findVisitor = new FindUsagesVisitor(javac, isCanceled, false, false); findVisitor.scan(javac.getCompilationUnit(), wanted); Collection usages = findVisitor.getUsages(); Map refs = new HashMap(); diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/FindUsagesVisitor.java b/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/FindUsagesVisitor.java --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/FindUsagesVisitor.java +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/FindUsagesVisitor.java @@ -80,29 +80,33 @@ private List elements = new ArrayList(); protected CompilationController workingCopy; private boolean findInComments = false; + private final boolean isSearchOverloadedMethods; private final boolean fromTestRoot; private final AtomicBoolean inImport; private Boolean usagesInComments; private final AtomicBoolean isCancelled; + private List methods; public FindUsagesVisitor(CompilationController workingCopy, AtomicBoolean isCancelled) { - this(workingCopy, isCancelled, false); + this(workingCopy, isCancelled, false, false); } - public FindUsagesVisitor(CompilationController workingCopy, AtomicBoolean isCancelled, boolean findInComments) { - this(workingCopy, isCancelled, findInComments, RefactoringUtils.isFromTestRoot(workingCopy.getFileObject(), workingCopy.getClasspathInfo().getClassPath(PathKind.SOURCE)), new AtomicBoolean()); + public FindUsagesVisitor(CompilationController workingCopy, AtomicBoolean isCancelled, boolean findInComments, boolean isSearchOverloadedMethods) { + this(workingCopy, isCancelled, findInComments, isSearchOverloadedMethods, RefactoringUtils.isFromTestRoot(workingCopy.getFileObject(), workingCopy.getClasspathInfo().getClassPath(PathKind.SOURCE)), new AtomicBoolean()); } - public FindUsagesVisitor(CompilationController workingCopy, AtomicBoolean isCancelled, boolean findInComments, boolean fromTestRoot, AtomicBoolean inImport) { + public FindUsagesVisitor(CompilationController workingCopy, AtomicBoolean isCancelled, boolean findInComments, boolean isSearchOverloadedMethods, boolean fromTestRoot, AtomicBoolean inImport) { try { setWorkingCopy(workingCopy); } catch (ToPhaseException ex) { Exceptions.printStackTrace(ex); } this.findInComments = findInComments; + this.isSearchOverloadedMethods = isSearchOverloadedMethods; this.fromTestRoot = fromTestRoot; this.inImport = inImport; this.isCancelled = isCancelled; + this.methods = new LinkedList(); } // @@ -134,6 +138,20 @@ } } } + if(p.getKind() == ElementKind.METHOD || p.getKind() == ElementKind.CONSTRUCTOR) { + ExecutableElement method = (ExecutableElement) p; + methods.add(method); + TypeElement enclosingTypeElement = workingCopy.getElementUtilities().enclosingTypeElement(method); + if(isSearchOverloadedMethods) { + for (Element overloaded : enclosingTypeElement.getEnclosedElements()) { + if(method != overloaded && + method.getKind() == overloaded.getKind() && + ((ExecutableElement)overloaded).getSimpleName().contentEquals(method.getSimpleName())) { + methods.add((ExecutableElement)overloaded); + } + } + } + } return super.visitCompilationUnit(node, p); } // @@ -190,8 +208,12 @@ } } if (elementToFind != null && elementToFind.getKind() == ElementKind.METHOD && el.getKind() == ElementKind.METHOD) { - if (el.equals(elementToFind) || workingCopy.getElements().overrides((ExecutableElement) el, (ExecutableElement) elementToFind, (TypeElement) elementToFind.getEnclosingElement())) { - addUsage(path); + for (ExecutableElement executableElement : methods) { + if (el.equals(executableElement) + || workingCopy.getElements().overrides((ExecutableElement) el, + executableElement, (TypeElement) elementToFind.getEnclosingElement())) { + addUsage(path); + } } } else if (el.equals(elementToFind)) { final ElementKind kind = elementToFind.getKind(); diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/JavaWhereUsedQueryPlugin.java b/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/JavaWhereUsedQueryPlugin.java --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/JavaWhereUsedQueryPlugin.java +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/JavaWhereUsedQueryPlugin.java @@ -167,6 +167,7 @@ isFindSubclasses(), isFindDirectSubclassesOnly(), isFindOverridingMethods(), + isSearchOverloadedMethods(), isFindUsages(), null, cancelRequested)); } @@ -197,6 +198,7 @@ isFindSubclasses(), isFindDirectSubclassesOnly(), isFindOverridingMethods(), + isSearchOverloadedMethods(), isFindUsages(), packages, cancelRequested)); } } @@ -208,6 +210,7 @@ isFindSubclasses(), isFindDirectSubclassesOnly(), isFindOverridingMethods(), + isSearchOverloadedMethods(), isFindUsages(), null, cancelRequested); @@ -218,8 +221,9 @@ public static Set getRelevantFiles( final TreePathHandle tph, final ClasspathInfo cpInfo, final boolean isFindSubclasses, final boolean isFindDirectSubclassesOnly, - final boolean isFindOverridingMethods, final boolean isFindUsages, - final Set folders, final AtomicBoolean cancel) { + final boolean isFindOverridingMethods, final boolean isSearchOverloadedMethods, + final boolean isFindUsages, final Set folders, + final AtomicBoolean cancel) { final ClassIndex idx = cpInfo.getClassIndex(); final Set set = new TreeSet(new FileComparator()); final Set packages = (folders == null)? Collections.emptySet() : folders; @@ -289,32 +293,48 @@ //get type references from index set.addAll(idx.getResources(ElementHandle.create((TypeElement) el), EnumSet.of(ClassIndex.SearchKind.TYPE_REFERENCES, ClassIndex.SearchKind.IMPLEMENTORS), searchScopeType)); } - } else if (el.getKind() == ElementKind.METHOD && isFindOverridingMethods) { - //Find overriding methods - TypeElement type = (TypeElement) el.getEnclosingElement(); - set.addAll(getImplementorsRecursive(idx, cpInfo, type, cancel)); - } - if (el.getKind() == ElementKind.METHOD && isFindUsages) { - //get method references for method and for all it's overriders - Set> s = RefactoringUtils.getImplementorsAsHandles(idx, cpInfo, (TypeElement) el.getEnclosingElement(), cancel); - for (ElementHandle eh : s) { - if (cancel != null && cancel.get()) { - set.clear(); - return; + } else if (el.getKind() == ElementKind.METHOD) { + ExecutableElement method = (ExecutableElement) el; + List methods = new LinkedList(); + methods.add(method); + TypeElement enclosingTypeElement = info.getElementUtilities().enclosingTypeElement(method); + if(isSearchOverloadedMethods) { + for (Element overloaded : enclosingTypeElement.getEnclosedElements()) { + if(method != overloaded && + method.getKind() == overloaded.getKind() && + ((ExecutableElement)overloaded).getSimpleName().contentEquals(method.getSimpleName())) { + methods.add((ExecutableElement)overloaded); + } } - TypeElement te = eh.resolve(info); - if (te == null) { - continue; - } - for (Element e : te.getEnclosedElements()) { - if (e.getKind() == ElementKind.METHOD || e.getKind() == ElementKind.CONSTRUCTOR) { - if (info.getElements().overrides((ExecutableElement) e, (ExecutableElement) el, te)) { - set.addAll(idx.getResources(ElementHandle.create(te), EnumSet.of(ClassIndex.SearchKind.METHOD_REFERENCES), searchScopeType)); + } + if (isFindOverridingMethods) { + //Find overriding methods + set.addAll(getImplementorsRecursive(idx, cpInfo, enclosingTypeElement, cancel)); + } + if (isFindUsages) { + //get method references for method and for all it's overriders + Set> s = RefactoringUtils.getImplementorsAsHandles(idx, cpInfo, (TypeElement) method.getEnclosingElement(), cancel); + for (ElementHandle eh : s) { + if (cancel != null && cancel.get()) { + set.clear(); + return; + } + TypeElement te = eh.resolve(info); + if (te == null) { + continue; + } + for (Element e : te.getEnclosedElements()) { + if (e.getKind() == ElementKind.METHOD || e.getKind() == ElementKind.CONSTRUCTOR) { + for (ExecutableElement executableElement : methods) { + if (info.getElements().overrides((ExecutableElement) e, executableElement, te)) { + set.addAll(idx.getResources(ElementHandle.create(te), EnumSet.of(ClassIndex.SearchKind.METHOD_REFERENCES), searchScopeType)); + } + } } } } + set.addAll(idx.getResources(ElementHandle.create((TypeElement) el.getEnclosingElement()), EnumSet.of(ClassIndex.SearchKind.METHOD_REFERENCES), searchScopeType)); //????? } - set.addAll(idx.getResources(ElementHandle.create((TypeElement) el.getEnclosingElement()), EnumSet.of(ClassIndex.SearchKind.METHOD_REFERENCES), searchScopeType)); //????? } else if (el.getKind() == ElementKind.CONSTRUCTOR) { set.addAll(idx.getResources(ElementHandle.create((TypeElement) el.getEnclosingElement()), EnumSet.of(ClassIndex.SearchKind.TYPE_REFERENCES, ClassIndex.SearchKind.IMPLEMENTORS), searchScopeType)); } @@ -434,6 +454,9 @@ private boolean isFindOverridingMethods() { return refactoring.getBooleanValue(WhereUsedQueryConstants.FIND_OVERRIDING_METHODS); } + private boolean isSearchOverloadedMethods() { + return refactoring.getBooleanValue(WhereUsedQueryConstants.SEARCH_OVERLOADED); + } private boolean isSearchFromBaseClass() { return refactoring.getBooleanValue(WhereUsedQueryConstants.SEARCH_FROM_BASECLASS); } @@ -505,7 +528,7 @@ final boolean fromTestRoot = RefactoringUtils.isFromTestRoot(compiler.getFileObject(), compiler.getClasspathInfo().getClassPath(ClasspathInfo.PathKind.SOURCE)); AtomicBoolean inImport = new AtomicBoolean(); if (isFindUsages()) { - FindUsagesVisitor findVisitor = new FindUsagesVisitor(compiler, cancelled, refactoring.getBooleanValue(WhereUsedQuery.SEARCH_IN_COMMENTS), fromTestRoot, inImport); + FindUsagesVisitor findVisitor = new FindUsagesVisitor(compiler, cancelled, refactoring.getBooleanValue(WhereUsedQuery.SEARCH_IN_COMMENTS), isSearchOverloadedMethods(), fromTestRoot, inImport); findVisitor.scan(compiler.getCompilationUnit(), element); Collection foundElements = findVisitor.getElements(); for (WhereUsedElement el : foundElements) { diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/Bundle.properties b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/Bundle.properties --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/Bundle.properties +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/Bundle.properties @@ -488,6 +488,7 @@ ReplaceConstructorWithBuilder.jLabel1.text=&Builder Class Name: ReplaceConstructorWithBuilderName=Replace Constructor With Builder ReplaceConstructorWithBuilderDescription=Replace Constructor {0} with Builder {1} +WhereUsedPanelMethod.searchOverloaded.text=Include overloaded methods LBL_BuilderParameter=Parameter LBL_BuilderSetterName=Setter Name LBL_BuilderDefaultValue=Default Value diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanel.java b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanel.java --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanel.java +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanel.java @@ -278,6 +278,14 @@ } return false; } + + public boolean isMethodSearchOverloaded() { + if(panel instanceof WhereUsedPanelMethod) { + WhereUsedPanelMethod methodPanel = (WhereUsedPanelMethod) panel; + return methodPanel.isSearchOverloaded(); + } + return false; + } public boolean isClassSubTypes() { if(panel instanceof WhereUsedPanelClass) { diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.form b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.form --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.form +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.form @@ -30,14 +30,15 @@ - + + - + @@ -65,7 +66,9 @@ - + + + @@ -150,5 +153,18 @@ + + + + + + + + + + + + + diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.java b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.java --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.java +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedPanelMethod.java @@ -101,6 +101,7 @@ btn_usages = new javax.swing.JRadioButton(); btn_overriders = new javax.swing.JRadioButton(); btn_usages_overriders = new javax.swing.JRadioButton(); + searchOverloaded = new javax.swing.JCheckBox(); label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/netbeans/modules/refactoring/java/resources/warning_16.png"))); // NOI18N label.setText("<>"); // NOI18N @@ -129,6 +130,14 @@ buttonGroup1.add(btn_usages_overriders); org.openide.awt.Mnemonics.setLocalizedText(btn_usages_overriders, org.openide.util.NbBundle.getMessage(WhereUsedPanelMethod.class, "LBL_FindUsagesOverridingMethods")); // NOI18N + searchOverloaded.setSelected(((Boolean) RefactoringModule.getOption("searchOverloaded.whereUsed", Boolean.FALSE)).booleanValue()); + org.openide.awt.Mnemonics.setLocalizedText(searchOverloaded, org.openide.util.NbBundle.getMessage(WhereUsedPanelMethod.class, "WhereUsedPanelMethod.searchOverloaded.text")); // NOI18N + searchOverloaded.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + searchOverloadedItemStateChanged(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -144,11 +153,12 @@ .addComponent(jComboBox1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(searchOverloaded) .addComponent(btn_usages_overriders) .addComponent(btn_usages) .addComponent(searchInComments) .addComponent(btn_overriders)) - .addGap(0, 33, Short.MAX_VALUE))) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( @@ -170,7 +180,9 @@ .addComponent(btn_overriders) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btn_usages_overriders) - .addGap(8, 8, 8)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(searchOverloaded) + .addContainerGap()) ); }// //GEN-END:initComponents @@ -180,6 +192,14 @@ Boolean b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE; RefactoringModule.setOption("searchInComments.whereUsed", b); // NOI18N }//GEN-LAST:event_searchInCommentsItemStateChanged + + private void searchOverloadedItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_searchOverloadedItemStateChanged + // used for change default value for searchOverloaded check-box. + // The value is persisted and then used as default in next IDE run. + Boolean b = evt.getStateChange() == ItemEvent.SELECTED ? Boolean.TRUE : Boolean.FALSE; + RefactoringModule.setOption("searchOverloaded.whereUsed", b); // NOI18N + }//GEN-LAST:event_searchOverloadedItemStateChanged + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JRadioButton btn_overriders; private javax.swing.JRadioButton btn_usages; @@ -190,6 +210,7 @@ private javax.swing.JLabel label; private javax.swing.JLabel lbl_usagesof; private javax.swing.JCheckBox searchInComments; + private javax.swing.JCheckBox searchOverloaded; // End of variables declaration//GEN-END:variables @Override @@ -242,6 +263,10 @@ public boolean isSearchInComments() { return searchInComments.isSelected(); } + + public boolean isSearchOverloaded() { + return searchOverloaded.isSelected(); + } @SuppressWarnings("serial") private static class ComboBoxRenderer extends JLabel implements ListCellRenderer, UIResource { diff --git a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedQueryUI.java b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedQueryUI.java --- a/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedQueryUI.java +++ b/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/WhereUsedQueryUI.java @@ -149,6 +149,9 @@ } else if (kind.isClass() || kind.isInterface()) { setForClass(); return query.checkParameters(); + } else if(kind == ElementKind.CONSTRUCTOR) { + setForConstructor(); + return query.checkParameters(); } else { return null; } @@ -160,6 +163,11 @@ query.putValue(WhereUsedQueryConstants.SEARCH_FROM_BASECLASS, panel.isMethodFromBaseClass()); query.putValue(WhereUsedQueryConstants.FIND_OVERRIDING_METHODS, panel.isMethodOverriders()); query.putValue(WhereUsedQuery.FIND_REFERENCES, panel.isMethodFindUsages()); + query.putValue(WhereUsedQueryConstants.SEARCH_OVERLOADED, panel.isMethodSearchOverloaded()); + } + + private void setForConstructor() { + query.putValue(WhereUsedQueryConstants.SEARCH_OVERLOADED, panel.isMethodSearchOverloaded()); } private void setForClass() { @@ -176,6 +184,9 @@ } else if (kind.isClass() || kind.isInterface()) { setForClass(); return query.fastCheckParameters(); + } else if(kind == ElementKind.CONSTRUCTOR) { + setForConstructor(); + return query.fastCheckParameters(); } else { return null; }