pass usage targets to usage filtering and grouping rules

This commit is contained in:
Dmitry Jemerov
2011-08-31 20:36:13 +02:00
parent c37f7a6ae6
commit 1f4e78681f
7 changed files with 127 additions and 14 deletions
@@ -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);
}
@@ -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() {
@@ -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;
}
@@ -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);
}
@@ -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);
}
@@ -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);
}
@@ -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();