public static EnumerableClassInfo <Method, Parameter> SeekEnumerableClass(IMethodDriver <APC, Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, Expression, Variable, ILogOptions> methodDriver) { EnumerableHelper <Local, Parameter, Method, Field, Property, Type, Variable, Attribute, Assembly, Expression, ILogOptions> helper = new EnumerableHelper <Local, Parameter, Method, Field, Property, Type, Variable, Attribute, Assembly, Expression, ILogOptions>(methodDriver); Domain initVal = new Domain(); methodDriver.CreateForward(helper)(initVal); return(helper.ToBeAnalyzed); }
public static void Analyze <Label, Local, Parameter, Method, Field, Type, Expression, Variable>( IMethodDriver <Label, Local, Parameter, Method, Field, Type, Expression, Variable> driver, bool doDebug ) where Variable : IEquatable <Variable> { TypeBindings <Label, Local, Parameter, Method, Field, Type, Expression, Variable> .Analysis analysis = new TypeBindings <Label, Local, Parameter, Method, Field, Type, Expression, Variable> .Analysis(driver.MetaDataDecoder); analysis.Debug = doDebug; driver.CreateForward(analysis, doDebug)(analysis.InitialValue(driver.KeyNumber)); }
/// <summary> /// Main interface method of the analyzer. It returns state machine information, given a method driver. /// </summary> /// <param name="fullMethodName">The name of the method, should always be "MoveNext".</param> /// <param name="driver">A method analysis driver.</param> /// <returns></returns> public StateMachineInformation <Local> AnalyzeMoveNext <Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, Expression, Variable, ILogOptions>( string fullMethodName, IMethodDriver <APC, Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, Expression, Variable, ILogOptions> driver ) where Variable : IEquatable <Variable> where Expression : IEquatable <Expression> where Type : IEquatable <Type> where ILogOptions : IFrameworkLogOptions { TypeBindings <Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, Expression, Variable, ILogOptions> .Analysis analysis = new TypeBindings <Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, Expression, Variable, ILogOptions> .Analysis(driver, this); driver.CreateForward(analysis)(analysis.InitialValue()); return(analysis.MoveNextPreAnalysisResult); }
/// <summary> /// It runs the analysis. /// It is there because so we can use the typebinding, and make the code less verbose /// </summary> internal static IMethodResult <Variable> HelperForStringAnalysis(string methodName, IMethodDriver <APC, Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, ExternalExpression, Variable, ILogOptions> driver, IValueAnalysisOptions options) { StringValueAnalysis analysis; analysis = new StringValueAnalysis(methodName, driver, options); // *** The next lines must be strictly sequential *** Action <SimpleStringAbstractDomain <BoxedExpression> > closure = driver.CreateForward <SimpleStringAbstractDomain <BoxedExpression> >(analysis); // At this point, CreateForward has called the Visitor, so the context has been created, so that now we can call initValue SimpleStringAbstractDomain <BoxedExpression> initValue = analysis.InitialValue; closure(initValue); // Do the analysis return(analysis); }
HelperForPartitionAnalysis(string methodName, IMethodDriver <APC, Local, Parameter, Method, Field, Property, Type, Attribute, Assembly, ExternalExpression, Variable, ILogOptions> driver, List <Analyzers.Containers.ContainerOptions> optionsList, IFactQuery <BoxedExpression, Variable> factQuery) { PartitionAnalysis analysis; analysis = new PartitionAnalysis(methodName, driver, optionsList, factQuery); // *** The next lines must be strictly sequential *** var closure = driver.CreateForward <SimplePartitionAbstractDomain <BoxedVariable <Variable>, BoxedExpression> >(analysis); // At this point, CreateForward has called the Visitor, so the context has been created, so that now we can call initValue SimplePartitionAbstractDomain <BoxedVariable <Variable>, BoxedExpression> .Trace = optionsList[0].TracePartitionAnalysis; var initValue = analysis.InitialValue; closure(initValue); // Do the analysis return(analysis); }