mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
refactor slicer: avoid accessing package-private members of platform modules from java modules (IDEA-200277)
Add SliceRootNode::setChildren metod to avoid external writings to myCachedChildren field.
This commit is contained in:
@@ -34,6 +34,8 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static com.intellij.util.containers.ContainerUtil.addIfNotNull;
|
||||
|
||||
public abstract class SliceNullnessAnalyzerBase {
|
||||
@NotNull
|
||||
private final SliceLeafEquality myLeafEquality;
|
||||
@@ -50,39 +52,38 @@ public abstract class SliceNullnessAnalyzerBase {
|
||||
private void groupByNullness(NullAnalysisResult result, SliceRootNode oldRoot, final Map<SliceNode, NullAnalysisResult> map) {
|
||||
SliceRootNode root = createNewTree(result, oldRoot, map);
|
||||
|
||||
SliceUsage rootUsage = oldRoot.myCachedChildren.get(0).getValue();
|
||||
SliceUsage rootUsage = oldRoot.getCachedChildren().get(0).getValue();
|
||||
SliceManager.getInstance(root.getProject()).createToolWindow(true, root, true, SliceManager.getElementDescription(null, rootUsage.getElement(), " Grouped by Nullness") );
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public SliceRootNode createNewTree(NullAnalysisResult result, SliceRootNode oldRoot, final Map<SliceNode, NullAnalysisResult> map) {
|
||||
SliceRootNode root = oldRoot.copy();
|
||||
assert oldRoot.myCachedChildren.size() == 1;
|
||||
SliceNode oldRootStart = oldRoot.myCachedChildren.get(0);
|
||||
assert oldRoot.getCachedChildren().size() == 1;
|
||||
SliceNode oldRootStart = oldRoot.getCachedChildren().get(0);
|
||||
root.setChanged();
|
||||
root.targetEqualUsages.clear();
|
||||
root.myCachedChildren = new ArrayList<>();
|
||||
|
||||
createValueRootNode(result, oldRoot, map, root, oldRootStart, "Null Values", NullAnalysisResult.NULLS);
|
||||
createValueRootNode(result, oldRoot, map, root, oldRootStart, "NotNull Values", NullAnalysisResult.NOT_NULLS);
|
||||
createValueRootNode(result, oldRoot, map, root, oldRootStart, "Other Values", NullAnalysisResult.UNKNOWNS);
|
||||
|
||||
List<SliceLeafValueClassNode> children = new ArrayList<>();
|
||||
addIfNotNull(children, createValueRootNode(result, oldRoot, map, root, oldRootStart, "Null Values", NullAnalysisResult.NULLS));
|
||||
addIfNotNull(children, createValueRootNode(result, oldRoot, map, root, oldRootStart, "NotNull Values", NullAnalysisResult.NOT_NULLS));
|
||||
addIfNotNull(children, createValueRootNode(result, oldRoot, map, root, oldRootStart, "Other Values", NullAnalysisResult.UNKNOWNS));
|
||||
root.setChildren(children);
|
||||
return root;
|
||||
}
|
||||
|
||||
private void createValueRootNode(NullAnalysisResult result,
|
||||
SliceRootNode oldRoot,
|
||||
final Map<SliceNode, NullAnalysisResult> map,
|
||||
SliceRootNode root,
|
||||
SliceNode oldRootStart,
|
||||
String nodeName,
|
||||
final int group) {
|
||||
private SliceLeafValueClassNode createValueRootNode(NullAnalysisResult result,
|
||||
SliceRootNode oldRoot,
|
||||
final Map<SliceNode, NullAnalysisResult> map,
|
||||
SliceRootNode root,
|
||||
SliceNode oldRootStart,
|
||||
String nodeName,
|
||||
final int group) {
|
||||
Collection<PsiElement> groupedByValue = result.groupedByValue[group];
|
||||
if (groupedByValue.isEmpty()) {
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
SliceLeafValueClassNode valueRoot = new SliceLeafValueClassNode(root.getProject(), root, nodeName);
|
||||
root.myCachedChildren.add(valueRoot);
|
||||
|
||||
Set<PsiElement> uniqueValues = new THashSet<>(groupedByValue, myLeafEquality);
|
||||
for (final PsiElement expression : uniqueValues) {
|
||||
@@ -110,6 +111,7 @@ public abstract class SliceNullnessAnalyzerBase {
|
||||
Collections.singletonList(newRoot))
|
||||
);
|
||||
}
|
||||
return valueRoot;
|
||||
}
|
||||
|
||||
public void startAnalyzeNullness(@NotNull AbstractTreeStructure treeStructure, @NotNull Runnable finish) {
|
||||
|
||||
@@ -54,9 +54,9 @@ public class SliceLeafAnalyzer {
|
||||
myProvider = provider;
|
||||
}
|
||||
|
||||
static SliceNode filterTree(SliceNode oldRoot,
|
||||
NullableFunction<? super SliceNode, ? extends SliceNode> filter,
|
||||
PairProcessor<? super SliceNode, ? super List<SliceNode>> postProcessor) {
|
||||
public static SliceNode filterTree(SliceNode oldRoot,
|
||||
NullableFunction<? super SliceNode, ? extends SliceNode> filter,
|
||||
PairProcessor<? super SliceNode, ? super List<SliceNode>> postProcessor) {
|
||||
SliceNode filtered = filter.fun(oldRoot);
|
||||
if (filtered == null) return null;
|
||||
|
||||
@@ -95,7 +95,7 @@ public class SliceLeafAnalyzer {
|
||||
SliceRootNode root = oldRoot.copy();
|
||||
root.setChanged();
|
||||
root.targetEqualUsages.clear();
|
||||
root.myCachedChildren = new ArrayList<>(leaves.size());
|
||||
List<SliceNode> leafValueRoots = new ArrayList<>(leaves.size());
|
||||
|
||||
for (final PsiElement leafExpression : leaves) {
|
||||
SliceNode newNode = filterTree(oldRootStart, oldNode -> {
|
||||
@@ -114,8 +114,10 @@ public class SliceLeafAnalyzer {
|
||||
root,
|
||||
myProvider.createRootUsage(leafExpression, oldRoot.getValue().params),
|
||||
Collections.singletonList(newNode));
|
||||
root.myCachedChildren.add(lvNode);
|
||||
leafValueRoots.add(lvNode);
|
||||
}
|
||||
root.setChildren(leafValueRoots);
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
@@ -162,7 +164,7 @@ public class SliceLeafAnalyzer {
|
||||
() -> ConcurrentCollectionFactory.createMap(ContainerUtil.identityStrategy()));
|
||||
}
|
||||
|
||||
static class SliceNodeGuide implements WalkingState.TreeGuide<SliceNode> {
|
||||
public static class SliceNodeGuide implements WalkingState.TreeGuide<SliceNode> {
|
||||
private final AbstractTreeStructure myTreeStructure;
|
||||
// use tree structure because it's setting 'parent' fields in the process
|
||||
|
||||
|
||||
@@ -23,10 +23,10 @@ import java.util.List;
|
||||
public class SliceLeafValueRootNode extends SliceNode implements MyColoredTreeCellRenderer {
|
||||
public final List<SliceNode> myCachedChildren;
|
||||
|
||||
SliceLeafValueRootNode(@NotNull Project project,
|
||||
@NotNull SliceNode root,
|
||||
@NotNull SliceUsage sliceUsage,
|
||||
@NotNull List<SliceNode> children) {
|
||||
public SliceLeafValueRootNode(@NotNull Project project,
|
||||
@NotNull SliceNode root,
|
||||
@NotNull SliceUsage sliceUsage,
|
||||
@NotNull List<SliceNode> children) {
|
||||
super(project, sliceUsage, root.targetEqualUsages);
|
||||
myCachedChildren = children;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class SliceNode extends AbstractTreeNode<SliceUsage> implements Duplicate
|
||||
}
|
||||
|
||||
@NotNull
|
||||
SliceNode copy() {
|
||||
public SliceNode copy() {
|
||||
SliceUsage newUsage = getValue().copy();
|
||||
SliceNode newNode = new SliceNode(getProject(), newUsage, targetEqualUsages);
|
||||
newNode.dupNodeCalculated = dupNodeCalculated;
|
||||
|
||||
@@ -19,8 +19,10 @@ import com.intellij.openapi.project.Project;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author cdr
|
||||
@@ -43,7 +45,7 @@ public class SliceRootNode extends SliceNode {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
SliceRootNode copy() {
|
||||
public SliceRootNode copy() {
|
||||
SliceUsage newUsage = getValue().copy();
|
||||
SliceRootNode newNode = new SliceRootNode(getProject(), new DuplicateMap(), newUsage);
|
||||
newNode.dupNodeCalculated = dupNodeCalculated;
|
||||
@@ -73,7 +75,11 @@ public class SliceRootNode extends SliceNode {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
SliceUsage getRootUsage() {
|
||||
public SliceUsage getRootUsage() {
|
||||
return myRootUsage;
|
||||
}
|
||||
|
||||
public void setChildren(List<? extends SliceNode> children) {
|
||||
myCachedChildren = new ArrayList<>(children);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ public class SliceTreeBuilder extends AbstractTreeBuilder {
|
||||
}
|
||||
|
||||
|
||||
void switchToLeafNulls() {
|
||||
public void switchToLeafNulls() {
|
||||
SliceLanguageSupportProvider provider = getRootSliceNode().getProvider();
|
||||
if(provider == null){
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user