diff --git a/community-resources/src/community_progress_tail.png b/community-resources/src/community_progress_tail.png
index b6f7661c913c..96ef6a29a2b4 100644
Binary files a/community-resources/src/community_progress_tail.png and b/community-resources/src/community_progress_tail.png differ
diff --git a/community-resources/src/idea/IdeaApplicationInfo.xml b/community-resources/src/idea/IdeaApplicationInfo.xml
index 7617517167e7..b13f07f17d4c 100644
--- a/community-resources/src/idea/IdeaApplicationInfo.xml
+++ b/community-resources/src/idea/IdeaApplicationInfo.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/community-resources/src/idea_community_logo.png b/community-resources/src/idea_community_logo.png
index 4465f9545620..d70123f66651 100644
Binary files a/community-resources/src/idea_community_logo.png and b/community-resources/src/idea_community_logo.png differ
diff --git a/community-resources/src/idea_community_logo@2x.png b/community-resources/src/idea_community_logo@2x.png
index dc9a5a0af2de..4043de1d7cfe 100644
Binary files a/community-resources/src/idea_community_logo@2x.png and b/community-resources/src/idea_community_logo@2x.png differ
diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java b/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java
index 5a2fa70ec801..b8a27b7818dc 100644
--- a/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java
+++ b/java/compiler/impl/src/com/intellij/compiler/ant/GenerateAntApplication.java
@@ -23,8 +23,6 @@ import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
-import com.intellij.openapi.roots.impl.DirectoryIndex;
-import com.intellij.openapi.roots.impl.DirectoryIndexImpl;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
@@ -81,9 +79,6 @@ public class GenerateAntApplication {
logMessage(0, "Loading project...");
myProject = ProjectManagerEx.getInstanceEx().loadProject(myProjectPath);
- DirectoryIndexImpl dirIndex = (DirectoryIndexImpl)DirectoryIndex.getInstance(myProject);
- dirIndex.initialize();
-
logMessageLn(0, " done");
GenerateAntBuildAction.generateSingleFileBuild(myProject,
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyNodeDescriptor.java b/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyNodeDescriptor.java
index 3e0a0e164dd7..61e530339ffa 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyNodeDescriptor.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyNodeDescriptor.java
@@ -24,10 +24,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.util.CompositeAppearance;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Iconable;
-import com.intellij.psi.PsiClass;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiMethod;
-import com.intellij.psi.PsiModifier;
+import com.intellij.psi.*;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.ui.LayeredIcon;
import com.intellij.ui.RowIcon;
@@ -41,13 +38,12 @@ public final class MethodHierarchyNodeDescriptor extends HierarchyNodeDescriptor
private Icon myStateIcon;
private MethodHierarchyTreeStructure myTreeStructure;
- public MethodHierarchyNodeDescriptor(
- final Project project,
- final HierarchyNodeDescriptor parentDescriptor,
- final PsiClass aClass,
- final boolean isBase,
- final MethodHierarchyTreeStructure treeStructure
- ){
+ public MethodHierarchyNodeDescriptor(final Project project,
+ final HierarchyNodeDescriptor parentDescriptor,
+ final PsiElement aClass,
+ final boolean isBase,
+ final MethodHierarchyTreeStructure treeStructure
+ ) {
super(project, parentDescriptor, aClass, isBase);
myTreeStructure = treeStructure;
}
@@ -60,24 +56,26 @@ public final class MethodHierarchyNodeDescriptor extends HierarchyNodeDescriptor
return MethodHierarchyUtil.findBaseMethodInClass(myTreeStructure.getBaseMethod(), aClass, checkBases);
}
- public final PsiClass getPsiClass() {
- return (PsiClass)myElement;
+ public final PsiElement getPsiClass() {
+ return myElement;
}
/**
* Element for OpenFileDescriptor
*/
public final PsiElement getTargetElement() {
- final PsiClass aClass = getPsiClass();
- if (aClass == null || !aClass.isValid()) return null;
+ final PsiElement element = getPsiClass();
+ if (!(element instanceof PsiClass)) return element;
+ final PsiClass aClass = (PsiClass)getPsiClass();
+ if (!aClass.isValid()) return null;
final PsiMethod method = getMethod(aClass, false);
if (method != null) return method;
return aClass;
}
public final boolean isValid() {
- final PsiClass aClass = getPsiClass();
- return aClass != null && aClass.isValid();
+ final PsiElement psiElement = getPsiClass();
+ return psiElement != null && psiElement.isValid();
}
public final boolean update() {
@@ -88,7 +86,7 @@ public final class MethodHierarchyNodeDescriptor extends HierarchyNodeDescriptor
boolean changes = super.update();
- final PsiClass psiClass = getPsiClass();
+ final PsiElement psiClass = getPsiClass();
if (psiClass == null){
final String invalidPrefix = IdeBundle.message("node.hierarchy.invalid");
@@ -99,7 +97,7 @@ public final class MethodHierarchyNodeDescriptor extends HierarchyNodeDescriptor
}
final Icon newRawIcon = psiClass.getIcon(flags);
- final Icon newStateIcon = calculateState(psiClass);
+ final Icon newStateIcon = psiClass instanceof PsiClass ? calculateState((PsiClass)psiClass) : AllIcons.Hierarchy.MethodDefined;
if (changes || newRawIcon != myRawIcon || newStateIcon != myStateIcon) {
changes = true;
@@ -133,8 +131,12 @@ public final class MethodHierarchyNodeDescriptor extends HierarchyNodeDescriptor
if (myColor != null) {
classNameAttributes = new TextAttributes(myColor, null, null, null, Font.PLAIN);
}
- myHighlightedText.getEnding().addText(ClassPresentationUtil.getNameForClass(psiClass, false), classNameAttributes);
- myHighlightedText.getEnding().addText(" (" + JavaHierarchyUtil.getPackageName(psiClass) + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
+ if (psiClass instanceof PsiClass) {
+ myHighlightedText.getEnding().addText(ClassPresentationUtil.getNameForClass((PsiClass)psiClass, false), classNameAttributes);
+ myHighlightedText.getEnding().addText(" (" + JavaHierarchyUtil.getPackageName((PsiClass)psiClass) + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
+ } else if (psiClass instanceof PsiFunctionalExpression) {
+ myHighlightedText.getEnding().addText(ClassPresentationUtil.getFunctionalExpressionPresentation((PsiFunctionalExpression)psiClass, false));
+ }
myName = myHighlightedText.getText();
if (!Comparing.equal(myHighlightedText, oldText)) {
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java b/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java
index acc90641d725..747bd2a039b1 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/method/MethodHierarchyTreeStructure.java
@@ -21,6 +21,9 @@ import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
+import com.intellij.psi.search.searches.FunctionalExpressionSearch;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -152,11 +155,12 @@ public final class MethodHierarchyTreeStructure extends HierarchyTreeStructure {
@NotNull
@Override
protected final Object[] buildChildren(@NotNull final HierarchyNodeDescriptor descriptor) {
- final PsiClass psiClass = ((MethodHierarchyNodeDescriptor)descriptor).getPsiClass();
-
+ final PsiElement psiElement = ((MethodHierarchyNodeDescriptor)descriptor).getPsiClass();
+ if (!(psiElement instanceof PsiClass)) return ArrayUtil.EMPTY_OBJECT_ARRAY;
+ final PsiClass psiClass = (PsiClass)psiElement;
final Collection subclasses = getSubclasses(psiClass);
- List descriptors = new ArrayList(subclasses.size());
+ final List descriptors = new ArrayList(subclasses.size());
for (final PsiClass aClass : subclasses) {
if (HierarchyBrowserManager.getInstance(myProject).getState().HIDE_CLASSES_WHERE_METHOD_NOT_IMPLEMENTED) {
if (shouldHideClass(aClass)) {
@@ -167,6 +171,15 @@ public final class MethodHierarchyTreeStructure extends HierarchyTreeStructure {
final MethodHierarchyNodeDescriptor d = new MethodHierarchyNodeDescriptor(myProject, descriptor, aClass, false, this);
descriptors.add(d);
}
+
+ FunctionalExpressionSearch.search(psiClass).forEach(new Processor() {
+ @Override
+ public boolean process(PsiFunctionalExpression expression) {
+ descriptors.add(new MethodHierarchyNodeDescriptor(myProject, descriptor, expression, false, MethodHierarchyTreeStructure.this));
+ return true;
+ }
+ });
+
return descriptors.toArray(new HierarchyNodeDescriptor[descriptors.size()]);
}
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java b/java/java-impl/src/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java
index cf7ea89360ee..73504e6db865 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java
@@ -68,7 +68,10 @@ abstract class OverrideImplementMethodAction extends AnAction {
final ReadonlyStatusHandler.OperationStatus status = ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(VfsUtil.toVirtualFileArray(files));
if (!status.hasReadonlyFiles()) {
for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) {
- OverrideImplementUtil.overrideOrImplement(((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass(), methodHierarchyBrowser.getBaseMethod());
+ final PsiElement aClass = ((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass();
+ if (aClass instanceof PsiClass) {
+ OverrideImplementUtil.overrideOrImplement((PsiClass)aClass, methodHierarchyBrowser.getBaseMethod());
+ }
}
ToolWindowManager.getInstance(project).activateEditorComponent();
}
@@ -146,8 +149,10 @@ abstract class OverrideImplementMethodAction extends AnAction {
protected abstract void update(Presentation presentation, int toImplement, int toOverride);
private static boolean canImplementOverride(final MethodHierarchyNodeDescriptor descriptor, final MethodHierarchyBrowser methodHierarchyBrowser, final boolean toImplement) {
- final PsiClass psiClass = descriptor.getPsiClass();
- if (psiClass == null || psiClass instanceof PsiSyntheticClass) return false;
+ final PsiElement psiElement = descriptor.getPsiClass();
+ if (!(psiElement instanceof PsiClass)) return false;
+ final PsiClass psiClass = (PsiClass)psiElement;
+ if (psiClass instanceof PsiSyntheticClass) return false;
final PsiMethod baseMethod = methodHierarchyBrowser.getBaseMethod();
if (baseMethod == null) return false;
final MethodSignature signature = baseMethod.getSignature(PsiSubstitutor.EMPTY);
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/type/SubtypesHierarchyTreeStructure.java b/java/java-impl/src/com/intellij/ide/hierarchy/type/SubtypesHierarchyTreeStructure.java
index 478ecd2e7a4b..dd104332c617 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/type/SubtypesHierarchyTreeStructure.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/type/SubtypesHierarchyTreeStructure.java
@@ -19,12 +19,12 @@ import com.intellij.ide.IdeBundle;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.CommonClassNames;
-import com.intellij.psi.PsiAnonymousClass;
-import com.intellij.psi.PsiClass;
-import com.intellij.psi.PsiModifier;
+import com.intellij.psi.*;
+import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
+import com.intellij.psi.search.searches.FunctionalExpressionSearch;
import com.intellij.util.ArrayUtil;
+import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -45,17 +45,27 @@ public class SubtypesHierarchyTreeStructure extends HierarchyTreeStructure {
@NotNull
protected final Object[] buildChildren(@NotNull final HierarchyNodeDescriptor descriptor) {
- final PsiClass psiClass = ((TypeHierarchyNodeDescriptor)descriptor).getPsiClass();
+ final Object element = ((TypeHierarchyNodeDescriptor)descriptor).getPsiClass();
+ if (!(element instanceof PsiClass)) return ArrayUtil.EMPTY_OBJECT_ARRAY;
+ final PsiClass psiClass = (PsiClass)element;
if (CommonClassNames.JAVA_LANG_OBJECT.equals(psiClass.getQualifiedName())) {
return new Object[]{IdeBundle.message("node.hierarchy.java.lang.object")};
}
if (psiClass instanceof PsiAnonymousClass) return ArrayUtil.EMPTY_OBJECT_ARRAY;
if (psiClass.hasModifierProperty(PsiModifier.FINAL)) return ArrayUtil.EMPTY_OBJECT_ARRAY;
- final List classes = new ArrayList(ClassInheritorsSearch.search(psiClass, psiClass.getUseScope().intersectWith(getSearchScope(myCurrentScopeType, psiClass)), false).findAll());
- final HierarchyNodeDescriptor[] descriptors = new HierarchyNodeDescriptor[classes.size()];
- for (int i = 0; i < classes.size(); i++) {
- descriptors[i] = new TypeHierarchyNodeDescriptor(myProject, descriptor, classes.get(i), false);
+ final SearchScope searchScope = psiClass.getUseScope().intersectWith(getSearchScope(myCurrentScopeType, psiClass));
+ final List classes = new ArrayList(ClassInheritorsSearch.search(psiClass, searchScope, false).findAll());
+ final List descriptors = new ArrayList(classes.size());
+ for (PsiClass aClass : classes) {
+ descriptors.add(new TypeHierarchyNodeDescriptor(myProject, descriptor, aClass, false));
}
- return descriptors;
+ FunctionalExpressionSearch.search(psiClass, searchScope).forEach(new Processor() {
+ @Override
+ public boolean process(PsiFunctionalExpression expression) {
+ descriptors.add(new TypeHierarchyNodeDescriptor(myProject, descriptor, expression, false));
+ return true;
+ }
+ });
+ return descriptors.toArray(new HierarchyNodeDescriptor[descriptors.size()]);
}
}
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/type/SupertypesHierarchyTreeStructure.java b/java/java-impl/src/com/intellij/ide/hierarchy/type/SupertypesHierarchyTreeStructure.java
index fe7bb8287735..b5c6bf03ffe8 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/type/SupertypesHierarchyTreeStructure.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/type/SupertypesHierarchyTreeStructure.java
@@ -18,9 +18,9 @@ package com.intellij.ide.hierarchy.type;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.CommonClassNames;
-import com.intellij.psi.JavaPsiFacade;
-import com.intellij.psi.PsiClass;
+import com.intellij.psi.*;
+import com.intellij.psi.util.PsiUtil;
+import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -34,15 +34,24 @@ public final class SupertypesHierarchyTreeStructure extends HierarchyTreeStructu
@NotNull
protected final Object[] buildChildren(@NotNull final HierarchyNodeDescriptor descriptor) {
- final PsiClass psiClass = ((TypeHierarchyNodeDescriptor)descriptor).getPsiClass();
- final PsiClass[] supers = psiClass.getSupers();
- final List descriptors = new ArrayList();
- PsiClass objectClass = JavaPsiFacade.getInstance(myProject).findClass(CommonClassNames.JAVA_LANG_OBJECT, psiClass.getResolveScope());
- for (PsiClass aSuper : supers) {
- if (!psiClass.isInterface() || !aSuper.equals(objectClass)) {
- descriptors.add(new TypeHierarchyNodeDescriptor(myProject, descriptor, aSuper, false));
+ final Object element = ((TypeHierarchyNodeDescriptor)descriptor).getPsiClass();
+ if (element instanceof PsiClass) {
+ final PsiClass psiClass = (PsiClass)element;
+ final PsiClass[] supers = psiClass.getSupers();
+ final List descriptors = new ArrayList();
+ final PsiClass objectClass = JavaPsiFacade.getInstance(myProject).findClass(CommonClassNames.JAVA_LANG_OBJECT, psiClass.getResolveScope());
+ for (PsiClass aSuper : supers) {
+ if (!psiClass.isInterface() || !aSuper.equals(objectClass)) {
+ descriptors.add(new TypeHierarchyNodeDescriptor(myProject, descriptor, aSuper, false));
+ }
+ }
+ return descriptors.toArray(new HierarchyNodeDescriptor[descriptors.size()]);
+ } else if (element instanceof PsiFunctionalExpression) {
+ final PsiClass functionalInterfaceClass = PsiUtil.resolveClassInType(((PsiFunctionalExpression)element).getFunctionalInterfaceType());
+ if (functionalInterfaceClass != null) {
+ return new HierarchyNodeDescriptor[] {new TypeHierarchyNodeDescriptor(myProject, descriptor, functionalInterfaceClass, false)};
}
}
- return descriptors.toArray(new HierarchyNodeDescriptor[descriptors.size()]);
+ return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
}
diff --git a/java/java-impl/src/com/intellij/ide/hierarchy/type/TypeHierarchyNodeDescriptor.java b/java/java-impl/src/com/intellij/ide/hierarchy/type/TypeHierarchyNodeDescriptor.java
index 042326439e34..2351f6f0b42e 100644
--- a/java/java-impl/src/com/intellij/ide/hierarchy/type/TypeHierarchyNodeDescriptor.java
+++ b/java/java-impl/src/com/intellij/ide/hierarchy/type/TypeHierarchyNodeDescriptor.java
@@ -24,23 +24,25 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.util.CompositeAppearance;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFunctionalExpression;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.ui.LayeredIcon;
import java.awt.*;
public final class TypeHierarchyNodeDescriptor extends HierarchyNodeDescriptor {
- public TypeHierarchyNodeDescriptor(final Project project, final HierarchyNodeDescriptor parentDescriptor, final PsiClass psiClass, final boolean isBase) {
- super(project, parentDescriptor, psiClass, isBase);
+ public TypeHierarchyNodeDescriptor(final Project project, final HierarchyNodeDescriptor parentDescriptor, final PsiElement classOrFunctionalExpression, final boolean isBase) {
+ super(project, parentDescriptor, classOrFunctionalExpression, isBase);
}
- public final PsiClass getPsiClass() {
- return (PsiClass)myElement;
+ public final PsiElement getPsiClass() {
+ return myElement;
}
public final boolean isValid() {
- final PsiClass aClass = getPsiClass();
- return aClass != null && aClass.isValid();
+ final PsiElement psiElement = getPsiClass();
+ return psiElement != null && psiElement.isValid();
}
public final boolean update() {
@@ -61,7 +63,7 @@ public final class TypeHierarchyNodeDescriptor extends HierarchyNodeDescriptor {
setIcon(icon);
}
- final PsiClass psiClass = getPsiClass();
+ final PsiElement psiElement = getPsiClass();
final CompositeAppearance oldText = myHighlightedText;
@@ -71,8 +73,12 @@ public final class TypeHierarchyNodeDescriptor extends HierarchyNodeDescriptor {
if (myColor != null) {
classNameAttributes = new TextAttributes(myColor, null, null, null, Font.PLAIN);
}
- myHighlightedText.getEnding().addText(ClassPresentationUtil.getNameForClass(psiClass, false), classNameAttributes);
- myHighlightedText.getEnding().addText(" (" + JavaHierarchyUtil.getPackageName(psiClass) + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
+ if (psiElement instanceof PsiClass) {
+ myHighlightedText.getEnding().addText(ClassPresentationUtil.getNameForClass((PsiClass)psiElement, false), classNameAttributes);
+ myHighlightedText.getEnding().addText(" (" + JavaHierarchyUtil.getPackageName((PsiClass)psiElement) + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
+ } else if (psiElement instanceof PsiFunctionalExpression) {
+ myHighlightedText.getEnding().addText(ClassPresentationUtil.getFunctionalExpressionPresentation(((PsiFunctionalExpression)psiElement), false));
+ }
myName = myHighlightedText.getText();
if (!Comparing.equal(myHighlightedText, oldText)) {
diff --git a/java/java-impl/src/com/intellij/ide/util/scopeChooser/ClassHierarchyScopeDescriptor.java b/java/java-impl/src/com/intellij/ide/util/scopeChooser/ClassHierarchyScopeDescriptor.java
index 99826b875b33..3b9e2496f125 100644
--- a/java/java-impl/src/com/intellij/ide/util/scopeChooser/ClassHierarchyScopeDescriptor.java
+++ b/java/java-impl/src/com/intellij/ide/util/scopeChooser/ClassHierarchyScopeDescriptor.java
@@ -26,11 +26,14 @@ import com.intellij.ide.util.TreeClassChooserFactory;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFunctionalExpression;
import com.intellij.psi.presentation.java.ClassPresentationUtil;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
+import com.intellij.psi.search.searches.FunctionalExpressionSearch;
import com.intellij.psi.util.PsiUtilCore;
+import com.intellij.util.Processor;
import org.jetbrains.annotations.Nullable;
import java.util.LinkedList;
@@ -59,11 +62,19 @@ public class ClassHierarchyScopeDescriptor extends ScopeDescriptor {
PsiClass aClass = chooser.getSelected();
if (aClass == null) return null;
- List classesToSearch = new LinkedList();
+ final List classesToSearch = new LinkedList();
classesToSearch.add(aClass);
classesToSearch.addAll(ClassInheritorsSearch.search(aClass, true).findAll());
+ FunctionalExpressionSearch.search(aClass).forEach(new Processor() {
+ @Override
+ public boolean process(PsiFunctionalExpression expression) {
+ classesToSearch.add(expression);
+ return true;
+ }
+ });
+
myCachedScope = new LocalSearchScope(PsiUtilCore.toPsiElementArray(classesToSearch),
IdeBundle.message("scope.hierarchy", ClassPresentationUtil.getNameForClass(aClass, true)));
}
diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
index 09d752f28adb..e61ba7af6426 100644
--- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
@@ -30,6 +30,7 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.javadoc.PsiDocTag;
+import com.intellij.psi.search.searches.FunctionalExpressionSearch;
import com.intellij.psi.search.searches.OverridingMethodsSearch;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.MethodSignatureUtil;
@@ -48,6 +49,7 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Processor;
import com.intellij.util.containers.HashMap;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -456,6 +458,8 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase {
removeDeletedMethods(OverridingMethodsSearch.search(psiMethod, true).toArray(PsiMethod.EMPTY_ARRAY),
allElementsToDelete);
+ findFunctionalExpressions(usages, ArrayUtil.prepend(psiMethod, overridingMethods));
+
final HashMap> methodToReferences = new HashMap>();
for (PsiMethod overridingMethod : overridingMethods) {
final Collection overridingReferences = ReferencesSearch.search(overridingMethod).findAll();
@@ -478,6 +482,19 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase {
};
}
+ private static void findFunctionalExpressions(final List usages, PsiMethod... methods) {
+ for (PsiMethod method : methods) {
+ final PsiClass containingClass = method.getContainingClass();
+ FunctionalExpressionSearch.search(containingClass).forEach(new Processor() {
+ @Override
+ public boolean process(PsiFunctionalExpression expression) {
+ usages.add(new SafeDeleteFunctionalExpressionUsageInfo(expression, containingClass));
+ return true;
+ }
+ });
+ }
+ }
+
private static PsiMethod[] removeDeletedMethods(PsiMethod[] methods, final PsiElement[] allElementsToDelete) {
ArrayList list = new ArrayList();
for (PsiMethod method : methods) {
@@ -730,6 +747,8 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase {
return true;
}
});
+
+ findFunctionalExpressions(usages, method);
}
@@ -760,4 +779,13 @@ public class JavaSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase {
return false;
}
+
+ private static class SafeDeleteFunctionalExpressionUsageInfo extends SafeDeleteReferenceUsageInfo {
+ public SafeDeleteFunctionalExpressionUsageInfo(@NotNull PsiElement element, PsiElement referencedElement) {
+ super(element, referencedElement, false);
+ }
+
+ @Override
+ public void deleteElement() throws IncorrectOperationException {}
+ }
}
diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java
index ab112ebf0aa9..7c86ef988f62 100644
--- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java
@@ -22,7 +22,6 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.infos.MethodCandidateInfo;
import com.intellij.psi.util.*;
import org.jetbrains.annotations.Contract;
-import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -35,7 +34,6 @@ import java.util.*;
public class LambdaUtil {
public static ThreadLocal