The base architecture for code-contracts analysis
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Static.AST.Visitors / CodeVisitor.cs
1 using System;
2 using System.IO;
3 using Mono.CodeContracts.Static.Analysis;
4 using Mono.CodeContracts.Static.ControlFlow;
5 using Mono.CodeContracts.Static.DataFlowAnalysis;
6 using Mono.CodeContracts.Static.DataStructures;
7 using Mono.CodeContracts.Static.Providers;
8
9 namespace Mono.CodeContracts.Static.AST.Visitors {
10         class CodeVisitor<Variable, Expression, ContextData, EdgeData>
11                 : ILVisitorBase<APC, Expression, Variable, bool, bool>,
12                   IAnalysis<APC, bool, IILVisitor<APC, Expression, Variable, bool, bool>, EdgeData>
13                 where ContextData : IMethodContextProvider {
14                 private ICodeLayer<Expression, Variable, ContextData, EdgeData> codeLayer;
15
16                 public ContextData Context
17                 {
18                         get { return this.codeLayer.ILDecoder.ContextProvider; }
19                 }
20
21                 protected IMetaDataProvider MetaDataProvider
22                 {
23                         get { return this.codeLayer.MetaDataProvider; }
24                 }
25
26                 public void Run (ICodeLayer<Expression, Variable, ContextData, EdgeData> codeLayer)
27                 {
28                         this.codeLayer = codeLayer;
29                         codeLayer.CreateForward (this) (true);
30                 }
31
32                 #region Overrides of ILVisitorBase<APC,Expression,Variable,bool,bool>
33                 public override bool DefaultVisit (APC pc, bool data)
34                 {
35                         return data;
36                 }
37                 #endregion
38
39                 #region Implementation of IAnalysis<APC,bool,IILVisitor<APC,Expression,Variable,bool,bool>,EdgeData>
40                 public IILVisitor<APC, Expression, Variable, bool, bool> GetVisitor ()
41                 {
42                         return this;
43                 }
44
45                 public virtual bool Join (Pair<APC, APC> edge, bool newstate, bool prevstate, out bool weaker, bool widen)
46                 {
47                         weaker = false;
48                         return true;
49                 }
50
51                 public bool ImmutableVersion (bool arg)
52                 {
53                         return arg;
54                 }
55
56                 public bool MutableVersion (bool arg)
57                 {
58                         return arg;
59                 }
60
61                 public bool EdgeConversion (APC @from, APC to, bool isJoinPoint, EdgeData data, bool state)
62                 {
63                         return state;
64                 }
65
66                 public bool IsBottom (APC pc, bool state)
67                 {
68                         return !state;
69                 }
70
71                 public Predicate<APC> SaveFixPointInfo (IFixPointInfo<APC, bool> fixPointInfo)
72                 {
73                         return null;
74                 }
75
76                 public void Dump (Pair<bool, TextWriter> pair)
77                 {
78                 }
79                 #endregion
80         }
81 }