mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
pass usage targets to usage filtering and grouping rules
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user