Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ public CallHierarchyBrowser(@Nonnull Project project, @Nonnull PsiMethod method)

@Override
protected void createTrees(@Nonnull Map<String, JTree> type2TreeMap) {
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_CALL_HIERARCHY_POPUP);
ActionGroup group = (ActionGroup) ActionManager.getInstance().getAction(IdeActions.GROUP_CALL_HIERARCHY_POPUP);
JTree tree1 = createTree(false);
PopupHandler.installPopupHandler(tree1, group, ActionPlaces.CALL_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());
BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction();
BaseOnThisMethodAction baseOnThisMethodAction = new JavaBaseOnThisMethodAction();
baseOnThisMethodAction
.registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_CALL_HIERARCHY).getShortcutSet(), tree1);
type2TreeMap.put(CALLEE_TYPE, tree1);
Expand Down Expand Up @@ -98,7 +98,4 @@ else if (CALLEE_TYPE.equals(typeName)) {
protected Comparator<NodeDescriptor> getComparator() {
return JavaHierarchyUtil.getComparator(myProject);
}

public static final class BaseOnThisMethodAction extends CallHierarchyBrowserBase.BaseOnThisMethodAction {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.java.impl.ide.hierarchy.call;

import consulo.annotation.component.ActionImpl;
import consulo.annotation.component.ActionParentRef;
import consulo.annotation.component.ActionRef;
import consulo.annotation.component.ActionRefAnchor;
import consulo.ide.impl.idea.ide.hierarchy.CallHierarchyBrowserBase;

@ActionImpl(
id = "CallHierarchy.BaseOnThisType",
parents = @ActionParentRef(value = @ActionRef(id = "CallHierarchyPopupMenu"), anchor = ActionRefAnchor.FIRST)
)
public final class JavaBaseOnThisMethodAction extends CallHierarchyBrowserBase.BaseOnThisMethodAction {
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,29 @@
*/
package com.intellij.java.impl.ide.hierarchy.method;

import consulo.annotation.component.ActionImpl;
import consulo.annotation.component.ActionRef;
import consulo.ide.localize.IdeLocalize;
import consulo.platform.base.localize.ActionLocalize;
import consulo.ui.ex.action.Presentation;

@ActionImpl(id = "MethodHierarchy.ImplementMethodAction", shortcutFrom = @ActionRef(id = "ImplementMethods"))
public final class ImplementMethodAction extends OverrideImplementMethodAction {
public ImplementMethodAction() {
super(
ActionLocalize.actionMethodhierarchyImplementmethodactionText(),
ActionLocalize.actionMethodhierarchyImplementmethodactionDescription()
);
}

@Override
protected final void update(Presentation presentation, int toImplement, int toOverride) {
if (toImplement > 0) {
presentation.setEnabled(true);
presentation.setVisible(true);
presentation.setEnabledAndVisible(true);
presentation.setTextValue(toImplement == 1 ? IdeLocalize.actionImplementMethod() : IdeLocalize.actionImplementMethods());
}
else {
presentation.setEnabled(false);
presentation.setVisible(false);
presentation.setEnabledAndVisible(false);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.java.impl.ide.hierarchy.method;

import consulo.annotation.component.ActionImpl;
import consulo.annotation.component.ActionParentRef;
import consulo.annotation.component.ActionRef;
import consulo.annotation.component.ActionRefAnchor;
import consulo.ide.impl.idea.ide.hierarchy.MethodHierarchyBrowserBase;

@ActionImpl(
id = "MethodHierarchy.BaseOnThisType",
parents = @ActionParentRef(value = @ActionRef(id = "MethodHierarchyPopupMenu"), anchor = ActionRefAnchor.FIRST)
)
public class JavaBaseOnThisMethodAction extends MethodHierarchyBrowserBase.BaseOnThisMethodAction {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2013-2025 consulo.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.java.impl.ide.hierarchy.method;

import consulo.annotation.component.ActionImpl;
import consulo.annotation.component.ActionParentRef;
import consulo.annotation.component.ActionRef;
import consulo.annotation.component.ActionRefAnchor;
import consulo.application.dumb.DumbAware;
import consulo.localize.LocalizeValue;
import consulo.ui.ex.action.AnSeparator;
import consulo.ui.ex.action.DefaultActionGroup;

/**
* @author UNV
* @since 2025-10-30
*/
@ActionImpl(
id = "JavaMethodHierarchyPopupMenu",
children = {
@ActionRef(type = ImplementMethodAction.class),
@ActionRef(type = OverrideMethodAction.class),
@ActionRef(type = AnSeparator.class)
},
parents = @ActionParentRef(value = @ActionRef(id = "MethodHierarchyPopupMenu"), anchor = ActionRefAnchor.FIRST)
)
public class JavaMethodHierarchyPopupMenuGroup extends DefaultActionGroup implements DumbAware {
public JavaMethodHierarchyPopupMenuGroup() {
super(LocalizeValue.empty(), false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ public PsiElement getTarget(@Nonnull DataContext dataContext) {
return null;
}

@RequiredReadAction
@Nullable
@RequiredReadAction
private static PsiMethod getMethodImpl(DataContext dataContext) {
Project project = dataContext.getData(Project.KEY);
if (project == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.intellij.java.impl.ide.hierarchy.JavaHierarchyUtil;
import com.intellij.java.language.psi.PsiMethod;
import consulo.annotation.access.RequiredReadAction;
import consulo.ide.impl.idea.ide.hierarchy.HierarchyNodeDescriptor;
import consulo.ide.impl.idea.ide.hierarchy.HierarchyTreeBuilder;
import consulo.ide.impl.idea.ide.hierarchy.HierarchyTreeStructure;
Expand Down Expand Up @@ -47,10 +48,10 @@ public MethodHierarchyBrowser(Project project, PsiMethod method) {
@Override
protected void createTrees(@Nonnull Map<String, JTree> trees) {
JTree tree = createTree(false);
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP);
ActionGroup group = (ActionGroup) ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP);
PopupHandler.installPopupHandler(tree, group, ActionPlaces.METHOD_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());

BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction();
BaseOnThisMethodAction baseOnThisMethodAction = new JavaBaseOnThisMethodAction();
baseOnThisMethodAction
.registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), tree);

Expand Down Expand Up @@ -83,21 +84,18 @@ protected HierarchyTreeStructure createHierarchyTreeStructure(@Nonnull String ty
LOG.error("unexpected type: " + typeName);
return null;
}
return new MethodHierarchyTreeStructure(myProject, (PsiMethod)psiElement);
return new MethodHierarchyTreeStructure(myProject, (PsiMethod) psiElement);
}

@Override
protected Comparator<NodeDescriptor> getComparator() {
return JavaHierarchyUtil.getComparator(myProject);
}

@RequiredReadAction
public PsiMethod getBaseMethod() {
HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewType);
MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure)builder.getTreeStructure();
MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure) builder.getTreeStructure();
return treeStructure.getBaseMethod();
}

public static final class BaseOnThisMethodAction extends MethodHierarchyBrowserBase.BaseOnThisMethodAction {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.intellij.java.language.psi.PsiSubstitutor;
import com.intellij.java.language.psi.PsiSyntheticClass;
import com.intellij.java.language.psi.util.MethodSignature;
import consulo.application.Application;
import consulo.dataContext.DataContext;
import consulo.ide.impl.idea.ide.hierarchy.HierarchyNodeDescriptor;
import consulo.ide.impl.idea.ide.hierarchy.MethodHierarchyBrowserBase;
Expand Down Expand Up @@ -50,19 +49,19 @@
abstract class OverrideImplementMethodAction extends AnAction {
private static final Logger LOG = Logger.getInstance(OverrideImplementMethodAction.class);

@RequiredUIAccess
protected OverrideImplementMethodAction(@Nonnull LocalizeValue text, @Nonnull LocalizeValue description) {
super(text, description);
}

@Override
@RequiredUIAccess
public final void actionPerformed(@Nonnull AnActionEvent event) {
DataContext dataContext = event.getDataContext();
MethodHierarchyBrowser methodHierarchyBrowser = (MethodHierarchyBrowser)dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
MethodHierarchyBrowser methodHierarchyBrowser = (MethodHierarchyBrowser) dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
if (methodHierarchyBrowser == null) {
return;
}
Project project = dataContext.getData(Project.KEY);
if (project == null) {
return;
}

Project project = dataContext.getRequiredData(Project.KEY);
LocalizeValue commandName = event.getPresentation().getTextValue();
CommandProcessor.getInstance().newCommand()
.project(project)
Expand All @@ -75,7 +74,7 @@ public final void actionPerformed(@Nonnull AnActionEvent event) {
List<VirtualFile> files = new ArrayList<>(selectedDescriptors.length);
for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) {
PsiFile containingFile =
((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass().getContainingFile();
((MethodHierarchyNodeDescriptor) selectedDescriptor).getPsiClass().getContainingFile();
if (containingFile != null) {
VirtualFile vFile = containingFile.getVirtualFile();
if (vFile != null) {
Expand All @@ -87,15 +86,15 @@ public final void actionPerformed(@Nonnull AnActionEvent event) {
ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(VirtualFileUtil.toVirtualFileArray(files));
if (!status.hasReadonlyFiles()) {
for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) {
PsiElement aClass = ((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass();
PsiElement aClass = ((MethodHierarchyNodeDescriptor) selectedDescriptor).getPsiClass();
if (aClass instanceof PsiClass psiClass) {
OverrideImplementUtil.overrideOrImplement(psiClass, methodHierarchyBrowser.getBaseMethod());
}
}
ToolWindowManager.getInstance(project).activateEditorComponent();
}
else {
Application.get().invokeLater(
project.getApplication().invokeLater(
() -> Messages.showErrorDialog(project, status.getReadonlyFilesMessage(), commandName.get())
);
}
Expand All @@ -107,23 +106,20 @@ public final void actionPerformed(@Nonnull AnActionEvent event) {
});
}

@RequiredUIAccess
@Override
@RequiredUIAccess
public final void update(@Nonnull AnActionEvent e) {
Presentation presentation = e.getPresentation();
DataContext dataContext = e.getDataContext();

MethodHierarchyBrowser methodHierarchyBrowser =
(MethodHierarchyBrowser)dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
(MethodHierarchyBrowser) dataContext.getData(MethodHierarchyBrowserBase.DATA_KEY);
if (methodHierarchyBrowser == null) {
presentation.setEnabled(false);
presentation.setVisible(false);
presentation.setEnabledAndVisible(false);
return;
}
Project project = dataContext.getData(Project.KEY);
if (project == null) {
presentation.setEnabled(false);
presentation.setVisible(false);
if (!dataContext.hasData(Project.KEY)) {
presentation.setEnabledAndVisible(false);
return;
}

Expand All @@ -132,28 +128,25 @@ public final void update(@Nonnull AnActionEvent e) {
int toOverride = 0;

for (HierarchyNodeDescriptor descriptor : selectedDescriptors) {
if (canImplementOverride((MethodHierarchyNodeDescriptor)descriptor, methodHierarchyBrowser, true)) {
if (canImplementOverride((MethodHierarchyNodeDescriptor) descriptor, methodHierarchyBrowser, true)) {
if (toOverride > 0) {
// no mixed actions allowed
presentation.setEnabled(false);
presentation.setVisible(false);
presentation.setEnabledAndVisible(false);
return;
}
toImplement++;
}
else if (canImplementOverride((MethodHierarchyNodeDescriptor)descriptor, methodHierarchyBrowser, false)) {
else if (canImplementOverride((MethodHierarchyNodeDescriptor) descriptor, methodHierarchyBrowser, false)) {
if (toImplement > 0) {
// no mixed actions allowed
presentation.setEnabled(false);
presentation.setVisible(false);
presentation.setEnabledAndVisible(false);
return;
}
toOverride++;
}
else {
// no action is applicable to this node
presentation.setEnabled(false);
presentation.setVisible(false);
presentation.setEnabledAndVisible(false);
return;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,27 @@
*/
package com.intellij.java.impl.ide.hierarchy.method;

import consulo.annotation.component.ActionImpl;
import consulo.annotation.component.ActionRef;
import consulo.ide.localize.IdeLocalize;
import consulo.platform.base.localize.ActionLocalize;
import consulo.ui.ex.action.Presentation;

@ActionImpl(id = "MethodHierarchy.OverrideMethodAction", shortcutFrom = @ActionRef(id = "OverrideMethods"))
public final class OverrideMethodAction extends OverrideImplementMethodAction {
public OverrideMethodAction() {
super(
ActionLocalize.actionMethodhierarchyOverridemethodactionText(),
ActionLocalize.actionMethodhierarchyOverridemethodactionDescription()
);
}

@Override
protected final void update(Presentation presentation, int toImplement, int toOverride) {
if (toOverride > 0) {
presentation.setEnabled(true);
presentation.setVisible(true);
boolean enabled = toOverride > 0;
presentation.setEnabledAndVisible(enabled);
if (enabled) {
presentation.setTextValue(toOverride == 1 ? IdeLocalize.actionOverrideMethod() : IdeLocalize.actionOverrideMethods());
}
else {
presentation.setEnabled(false);
presentation.setVisible(false);
}
}
}
Loading
Loading