From 1f4e78681fcf8f4dc2a2d1b08a3706e899e9d624 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 31 Aug 2011 17:48:55 +0200 Subject: [PATCH] pass usage targets to usage filtering and grouping rules --- .../usages/impl/UsageNodeTreeBuilder.java | 27 +++++++++++++++-- .../intellij/usages/impl/UsageViewImpl.java | 2 +- .../impl/rules/UsageTypeGroupingRule.java | 26 +++++++++++------ .../impl/rules/UsageTypeProviderEx.java | 29 +++++++++++++++++++ .../usages/rules/UsageFilteringRuleEx.java | 26 +++++++++++++++++ .../usages/rules/UsageGroupingRuleEx.java | 29 +++++++++++++++++++ .../usages/impl/UsageNodeTreeBuilderTest.java | 2 +- 7 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeProviderEx.java create mode 100644 platform/usageView/src/com/intellij/usages/rules/UsageFilteringRuleEx.java create mode 100644 platform/usageView/src/com/intellij/usages/rules/UsageGroupingRuleEx.java diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageNodeTreeBuilder.java b/platform/usageView/src/com/intellij/usages/impl/UsageNodeTreeBuilder.java index 07a32fcd3be6..4a1171d3ae08 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageNodeTreeBuilder.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageNodeTreeBuilder.java @@ -17,8 +17,11 @@ package com.intellij.usages.impl; import com.intellij.usages.Usage; import com.intellij.usages.UsageGroup; +import com.intellij.usages.UsageTarget; import com.intellij.usages.rules.UsageFilteringRule; +import com.intellij.usages.rules.UsageFilteringRuleEx; import com.intellij.usages.rules.UsageGroupingRule; +import com.intellij.usages.rules.UsageGroupingRuleEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,10 +30,15 @@ import org.jetbrains.annotations.Nullable; */ class UsageNodeTreeBuilder { private final GroupNode myRoot; + private final UsageTarget[] myTargets; private UsageGroupingRule[] myGroupingRules; private UsageFilteringRule[] myFilteringRules; - UsageNodeTreeBuilder(@NotNull UsageGroupingRule[] groupingRules, @NotNull UsageFilteringRule[] filteringRules, @NotNull GroupNode root) { + UsageNodeTreeBuilder(UsageTarget[] targets, + @NotNull UsageGroupingRule[] groupingRules, + @NotNull UsageFilteringRule[] filteringRules, + @NotNull GroupNode root) { + myTargets = targets; myGroupingRules = groupingRules; myFilteringRules = filteringRules; myRoot = root; @@ -46,7 +54,14 @@ class UsageNodeTreeBuilder { public boolean isVisible(Usage usage) { for (final UsageFilteringRule rule : myFilteringRules) { - if (!rule.isVisible(usage)) { + final boolean visible; + if (rule instanceof UsageFilteringRuleEx) { + visible = ((UsageFilteringRuleEx) rule).isVisible(usage, myTargets); + } + else { + visible = rule.isVisible(usage); + } + if (!visible) { return false; } } @@ -60,7 +75,13 @@ class UsageNodeTreeBuilder { GroupNode lastGroupNode = myRoot; for (int i = 0; i < myGroupingRules.length; i++) { final UsageGroupingRule rule = myGroupingRules[i]; - final UsageGroup group = rule.groupUsage(usage); + final UsageGroup group; + if (rule instanceof UsageGroupingRuleEx) { + group = ((UsageGroupingRuleEx) rule).groupUsage(usage, myTargets); + } + else { + group = rule.groupUsage(usage); + } if (group != null) { lastGroupNode = lastGroupNode.addGroup(group, i); } diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java index 4aca6760bcaf..de2394a22287 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -162,7 +162,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra myModel = new UsageViewTreeModelBuilder(myPresentation, targets); myRoot = (GroupNode)myModel.getRoot(); - myBuilder = new UsageNodeTreeBuilder(getActiveGroupingRules(project), getActiveFilteringRules(project), myRoot); + myBuilder = new UsageNodeTreeBuilder(myTargets, getActiveGroupingRules(project), getActiveFilteringRules(project), myRoot); final MessageBusConnection messageBusConnection = myProject.getMessageBus().connect(this); messageBusConnection.subscribe(UsageFilteringRuleProvider.RULES_CHANGED, new Runnable() { diff --git a/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeGroupingRule.java b/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeGroupingRule.java index fba4bdf0b878..d71135f0ee35 100644 --- a/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeGroupingRule.java +++ b/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeGroupingRule.java @@ -20,12 +20,9 @@ import com.intellij.openapi.vcs.FileStatus; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.usages.ReadWriteAccessUsage; -import com.intellij.usages.Usage; -import com.intellij.usages.UsageGroup; -import com.intellij.usages.UsageView; +import com.intellij.usages.*; import com.intellij.usages.rules.PsiElementUsage; -import com.intellij.usages.rules.UsageGroupingRule; +import com.intellij.usages.rules.UsageGroupingRuleEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,12 +31,17 @@ import javax.swing.*; /** * @author max */ -public class UsageTypeGroupingRule implements UsageGroupingRule { +public class UsageTypeGroupingRule implements UsageGroupingRuleEx { + @Override public UsageGroup groupUsage(Usage usage) { + return groupUsage(usage, UsageTarget.EMPTY_ARRAY); + } + + public UsageGroup groupUsage(Usage usage, UsageTarget[] targets) { if (usage instanceof PsiElementUsage) { PsiElementUsage elementUsage = (PsiElementUsage)usage; - UsageType usageType = getUsageType(elementUsage.getElement()); + UsageType usageType = getUsageType(elementUsage.getElement(), targets); if (usageType != null) return new UsageTypeGroup(usageType); if (usage instanceof ReadWriteAccessUsage) { @@ -56,14 +58,20 @@ public class UsageTypeGroupingRule implements UsageGroupingRule { } @Nullable - private static UsageType getUsageType(PsiElement element) { + private static UsageType getUsageType(PsiElement element, UsageTarget[] targets) { if (element == null) return null; if (PsiTreeUtil.getParentOfType(element, PsiComment.class, false) != null) { return UsageType.COMMENT_USAGE; } UsageTypeProvider[] providers = Extensions.getExtensions(UsageTypeProvider.EP_NAME); for(UsageTypeProvider provider: providers) { - UsageType usageType = provider.getUsageType(element); + UsageType usageType; + if (provider instanceof UsageTypeProviderEx) { + usageType = ((UsageTypeProviderEx) provider).getUsageType(element, targets); + } + else { + usageType = provider.getUsageType(element); + } if (usageType != null) { return usageType; } diff --git a/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeProviderEx.java b/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeProviderEx.java new file mode 100644 index 000000000000..f31c33801f0c --- /dev/null +++ b/platform/usageView/src/com/intellij/usages/impl/rules/UsageTypeProviderEx.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2011 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.usages.impl.rules; + +import com.intellij.psi.PsiElement; +import com.intellij.usages.UsageTarget; +import org.jetbrains.annotations.Nullable; + +/** + * @author yole + */ +public interface UsageTypeProviderEx extends UsageTypeProvider { + @Nullable + UsageType + getUsageType(PsiElement element, UsageTarget[] targets); +} diff --git a/platform/usageView/src/com/intellij/usages/rules/UsageFilteringRuleEx.java b/platform/usageView/src/com/intellij/usages/rules/UsageFilteringRuleEx.java new file mode 100644 index 000000000000..2d7a9de97e41 --- /dev/null +++ b/platform/usageView/src/com/intellij/usages/rules/UsageFilteringRuleEx.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2011 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.usages.rules; + +import com.intellij.usages.Usage; +import com.intellij.usages.UsageTarget; + +/** + * @author yole + */ +public interface UsageFilteringRuleEx extends UsageFilteringRule { + boolean isVisible(Usage usage, UsageTarget[] targets); +} diff --git a/platform/usageView/src/com/intellij/usages/rules/UsageGroupingRuleEx.java b/platform/usageView/src/com/intellij/usages/rules/UsageGroupingRuleEx.java new file mode 100644 index 000000000000..fe6e9bdd1d56 --- /dev/null +++ b/platform/usageView/src/com/intellij/usages/rules/UsageGroupingRuleEx.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2011 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.usages.rules; + +import com.intellij.usages.Usage; +import com.intellij.usages.UsageGroup; +import com.intellij.usages.UsageTarget; +import org.jetbrains.annotations.Nullable; + +/** + * @author yole + */ +public interface UsageGroupingRuleEx extends UsageGroupingRule { + @Nullable + UsageGroup groupUsage(Usage usage, UsageTarget[] targets); +} diff --git a/platform/usageView/testSrc/com/intellij/usages/impl/UsageNodeTreeBuilderTest.java b/platform/usageView/testSrc/com/intellij/usages/impl/UsageNodeTreeBuilderTest.java index 11fb2df0b0b2..d18129aae587 100644 --- a/platform/usageView/testSrc/com/intellij/usages/impl/UsageNodeTreeBuilderTest.java +++ b/platform/usageView/testSrc/com/intellij/usages/impl/UsageNodeTreeBuilderTest.java @@ -88,7 +88,7 @@ public class UsageNodeTreeBuilderTest extends LightPlatformTestCase { UsageViewTreeModelBuilder model = new UsageViewTreeModelBuilder(new UsageViewPresentation(), new UsageTarget[0]); GroupNode rootNode = new GroupNode(null, 0, model); model.setRoot(rootNode); - UsageNodeTreeBuilder usageNodeTreeBuilder = new UsageNodeTreeBuilder(rules, UsageFilteringRule.EMPTY_ARRAY, rootNode); + UsageNodeTreeBuilder usageNodeTreeBuilder = new UsageNodeTreeBuilder(UsageTarget.EMPTY_ARRAY, rules, UsageFilteringRule.EMPTY_ARRAY, rootNode); for (Usage usage : usages) { usageNodeTreeBuilder.appendUsage(usage); UIUtil.dispatchAllInvocationEvents();