private static void groupByNullness( NullAnalysisResult result, SliceRootNode oldRoot, final Map<SliceNode, NullAnalysisResult> map) { SliceRootNode root = createNewTree(result, oldRoot, map); SliceUsage rootUsage = oldRoot.myCachedChildren.get(0).getValue(); SliceManager.getInstance(root.getProject()) .createToolWindow( true, root, true, SliceManager.getElementDescription( null, rootUsage.getElement(), " Grouped by Nullness")); }
private static boolean processValuesFlownTo( @NotNull final PsiExpression argument, PsiElement scope, @NotNull final Processor<PsiExpression> processor) { SliceAnalysisParams params = new SliceAnalysisParams(); params.dataFlowToThis = true; params.scope = new AnalysisScope(new LocalSearchScope(scope), argument.getProject()); SliceRootNode rootNode = new SliceRootNode( scope.getProject(), new DuplicateMap(), SliceManager.createRootUsage(argument, params)); Collection<? extends AbstractTreeNode> children = rootNode.getChildren().iterator().next().getChildren(); for (AbstractTreeNode child : children) { SliceUsage usage = (SliceUsage) child.getValue(); PsiElement element = usage.getElement(); if (element instanceof PsiExpression && !processor.process((PsiExpression) element)) return false; } return !children.isEmpty(); }
private SliceTreeStructure configureTree(@NonNls final String name) throws Exception { configureByFile("/codeInsight/slice/backward/" + name + ".java"); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); PsiElement element = new SliceHandler(true).getExpressionAtCaret(getEditor(), getFile()); assertNotNull(element); Collection<HighlightInfo> errors = highlightErrors(); assertEmpty(errors); SliceAnalysisParams params = new SliceAnalysisParams(); params.scope = new AnalysisScope(getProject()); params.dataFlowToThis = true; SliceUsage usage = SliceUsage.createRootUsage(element, params); SlicePanel panel = new SlicePanel( getProject(), true, new SliceRootNode(getProject(), new DuplicateMap(), usage), false, ToolWindowHeadlessManagerImpl.HEADLESS_WINDOW) { @Override protected void close() {} @Override public boolean isAutoScroll() { return false; } @Override public void setAutoScroll(boolean autoScroll) {} @Override public boolean isPreview() { return false; } @Override public void setPreview(boolean preview) {} }; Disposer.register(getProject(), panel); return (SliceTreeStructure) panel.getBuilder().getTreeStructure(); }
@Override public void customizeCellRendererFor(@NotNull SliceUsage sliceUsage) { boolean isForcedLeaf = sliceUsage instanceof JavaSliceDereferenceUsage; // might come SliceTooComplexDFAUsage JavaSliceUsage javaSliceUsage = sliceUsage instanceof JavaSliceUsage ? (JavaSliceUsage) sliceUsage : null; TextChunk[] text = sliceUsage.getText(); final List<TextRange> usageRanges = new SmartList<TextRange>(); sliceUsage.processRangeMarkers( new Processor<Segment>() { @Override public boolean process(Segment segment) { usageRanges.add(TextRange.create(segment)); return true; } }); boolean isInsideContainer = javaSliceUsage != null && javaSliceUsage.indexNesting != 0; for (int i = 0, length = text.length; i < length; i++) { TextChunk textChunk = text[i]; SimpleTextAttributes attributes = textChunk.getSimpleAttributesIgnoreBackground(); if (isForcedLeaf) { attributes = attributes.derive( attributes.getStyle(), JBColor.LIGHT_GRAY, attributes.getBgColor(), attributes.getWaveColor()); } boolean inUsage = (attributes.getFontStyle() & Font.BOLD) != 0; if (isInsideContainer && inUsage) { // Color darker = Color.BLACK;//attributes.getBgColor() == null ? Color.BLACK : // attributes.getBgColor().darker(); // attributes = attributes.derive(SimpleTextAttributes.STYLE_OPAQUE, // attributes.getFgColor(), UIUtil.getTreeBackground().brighter(), // attributes.getWaveColor()); // setMyBorder(IdeBorderFactory.createRoundedBorder(10, 3)); // setPaintFocusBorder(true); } append(textChunk.getText(), attributes); if (i == 0) { append(FontUtil.spaceAndThinSpace()); } } if (javaSliceUsage != null) { for (int i = 0; i < javaSliceUsage.indexNesting; i++) { append( " (Tracking container contents" + (javaSliceUsage.syntheticField.isEmpty() ? "" : " '" + javaSliceUsage.syntheticField + "'") + ")", SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES); } } PsiElement element = sliceUsage.getElement(); PsiMethod method; PsiClass aClass; while (true) { method = PsiTreeUtil.getParentOfType(element, PsiMethod.class); aClass = method == null ? PsiTreeUtil.getParentOfType(element, PsiClass.class) : method.getContainingClass(); if (aClass instanceof PsiAnonymousClass) { element = aClass; } else { break; } } int methodOptions = PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS | PsiFormatUtilBase.SHOW_CONTAINING_CLASS; String location = method != null ? PsiFormatUtil.formatMethod( method, PsiSubstitutor.EMPTY, methodOptions, PsiFormatUtilBase.SHOW_TYPE, 2) : aClass != null ? PsiFormatUtil.formatClass(aClass, PsiFormatUtilBase.SHOW_NAME) : null; if (location != null) { SimpleTextAttributes attributes = SimpleTextAttributes.GRAY_ATTRIBUTES; append(" in " + location, attributes); } }