package org.checkerframework.dataflow.cfg; /*>>> import org.checkerframework.checker.nullness.qual.Nullable; */ import java.util.Map; import org.checkerframework.dataflow.analysis.AbstractValue; import org.checkerframework.dataflow.analysis.Analysis; import org.checkerframework.dataflow.analysis.FlowExpressions; import org.checkerframework.dataflow.analysis.Store; import org.checkerframework.dataflow.analysis.TransferFunction; import org.checkerframework.dataflow.cfg.block.Block; import org.checkerframework.dataflow.cfg.block.SpecialBlock; import org.checkerframework.dataflow.cfg.node.Node; /** * Perform some visualization on a control flow graph. The particular operations depend on the * implementation. */ public interface CFGVisualizer< A extends AbstractValue<A>, S extends Store<S>, T extends TransferFunction<A, S>> { /** * Initialization method guaranteed to be called once before the first invocation of {@link * visualize}. * * @param args implementation-dependent options */ void init(Map<String, Object> args); /** * Output a visualization representing the control flow graph starting at {@code entry}. The * concrete actions are implementation dependent. * * <p>An invocation {@code visualize(cfg, entry, null);} does not output stores at the beginning * of basic blocks. * * @param cfg the CFG to visualize * @param entry the entry node of the control flow graph to be represented * @param analysis an analysis containing information about the program represented by the CFG. * The information includes {@link Store}s that are valid at the beginning of basic blocks * reachable from {@code entry} and per-node information for value producing {@link Node}s. * Can also be {@code null} to indicate that this information should not be output. * @return possible analysis results, e.g. generated file names. */ /*@Nullable*/ Map<String, Object> visualize( ControlFlowGraph cfg, Block entry, /*@Nullable*/ Analysis<A, S, T> analysis); /** * Delegate the visualization responsibility to the passed {@link Store} instance, which will * call back to this visualizer instance for sub-components. * * @param store the store to visualize */ void visualizeStore(S store); /** * Called by a {@code CFAbstractStore} to visualize the class name before calling the {@code * CFAbstractStore#internalVisualize()} method. * * @param classCanonicalName the canonical name of the class */ void visualizeStoreHeader(String classCanonicalName); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize a local variable. * * @param localVar the local variable * @param value the value of the local variable */ void visualizeStoreLocalVar(FlowExpressions.LocalVariable localVar, A value); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of the current * object {@code this} in this Store. * * @param value the value of the current object this */ void visualizeStoreThisVal(A value); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of fields * collected by this Store. * * @param fieldAccess the field * @param value the value of the field */ void visualizeStoreFieldVals(FlowExpressions.FieldAccess fieldAccess, A value); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of arrays * collected by this Store. * * @param arrayValue the array * @param value the value of the array */ void visualizeStoreArrayVal(FlowExpressions.ArrayAccess arrayValue, A value); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of pure method * calls collected by this Store. * * @param methodCall the pure method call * @param value the value of the pure method call */ void visualizeStoreMethodVals(FlowExpressions.MethodCall methodCall, A value); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize the value of class names * collected by this Store. * * @param className the class name * @param value the value of the class name */ void visualizeStoreClassVals(FlowExpressions.ClassName className, A value); /** * Called by {@code CFAbstractStore#internalVisualize()} to visualize the specific information * collected according to the specific kind of Store. Currently, these Stores call this method: * {@code LockStore}, {@code NullnessStore}, and {@code InitializationStore} to visualize * additional information. * * @param keyName the name of the specific information to be visualized * @param value the value of the specific information to be visualized */ void visualizeStoreKeyVal(String keyName, Object value); /** * Called by {@code CFAbstractStore} to visualize any information after the invocation of {@code * CFAbstractStore#internalVisualize()}. */ void visualizeStoreFooter(); /** * Visualize a block based on the analysis. * * @param bb the block * @param analysis the current analysis */ void visualizeBlock(Block bb, /*@Nullable*/ Analysis<A, S, T> analysis); /** * Visualize a SpecialBlock. * * @param sbb the special block */ void visualizeSpecialBlock(SpecialBlock sbb); /** * Visualize the transferInput of a Block based on the analysis. * * @param bb the block * @param analysis the current analysis */ void visualizeBlockTransferInput(Block bb, Analysis<A, S, T> analysis); /** * Visualize a Node based on the analysis. * * @param t the node * @param analysis the current analysis */ void visualizeBlockNode(Node t, /*@Nullable*/ Analysis<A, S, T> analysis); /** Shutdown method called once from the shutdown hook of the {@code BaseTypeChecker}. */ void shutdown(); }