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:
nik
2018-10-11 11:36:05 +03:00
parent 6bd0f9e3be
commit ec93bde170
6 changed files with 41 additions and 31 deletions
@@ -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;