5 // Alexander Chebaturkin (chebaturkin@gmail.com)
7 // Copyright (C) 2011 Alexander Chebaturkin
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections.Generic;
31 using Mono.CodeContracts.Static.AST;
32 using Mono.CodeContracts.Static.AST.Visitors;
33 using Mono.CodeContracts.Static.ControlFlow.Blocks;
34 using Mono.CodeContracts.Static.ControlFlow.Subroutines.Builders;
35 using Mono.CodeContracts.Static.DataStructures;
36 using Mono.CodeContracts.Static.Providers;
38 namespace Mono.CodeContracts.Static.ControlFlow.Subroutines {
39 class SubroutineFacade : IMethodCodeConsumer<Dummy, Subroutine> {
40 public readonly IContractProvider ContractProvider;
41 public readonly IMetaDataProvider MetaDataProvider;
43 // private readonly EnsuresFactory ensures_factory;
44 private readonly Dictionary<Method, ICFG> method_cache = new Dictionary<Method, ICFG> ();
45 private readonly RequiresFactory requires_factory;
47 public SubroutineFacade (IMetaDataProvider metaDataProvider,
48 IContractProvider contractProvider)
50 this.MetaDataProvider = metaDataProvider;
51 this.ContractProvider = contractProvider;
52 this.requires_factory = new RequiresFactory (this);
53 // this.ensures_factory = new EnsuresFactory (this);
56 #region IMethodCodeConsumer<Dummy,Subroutine> Members
57 Subroutine IMethodCodeConsumer<Dummy, Subroutine>.Accept<Label, Handler> (
58 IMethodCodeProvider<Label, Handler> codeProvider,
63 var builder = new SubroutineWithHandlersBuilder<Label, Handler> (codeProvider, this, method, entry);
64 return new MethodSubroutine<Label, Handler> (this, method, entry, builder);
68 public Result ForwardDecode<Data, Result, Visitor> (APC pc, Visitor visitor, Data data)
69 where Visitor : IILVisitor<APC, Dummy, Dummy, Data, Result>
71 var block = pc.Block as BlockBase;
73 return block.ForwardDecode<Data, Result, Visitor> (pc, visitor, data);
75 return visitor.Nop (pc, data);
78 public Subroutine GetRequires (Method method)
80 method = this.MetaDataProvider.Unspecialized (method);
81 return this.requires_factory.Get (method);
84 public Subroutine GetEnsures (Method method)
87 //todo: implement handling this in MethodSubroutine and uncomment lines below
89 // method = this.MetaDataProvider.Unspecialized (method);
90 // return this.ensures_factory.Get (method);
93 public Subroutine GetInvariant (TypeNode type)
95 //todo: implement this
99 public ICFG GetControlFlowGraph (Method method)
101 if (this.method_cache.ContainsKey (method))
102 return this.method_cache [method];
104 if (!this.MetaDataProvider.HasBody (method))
105 throw new InvalidOperationException ("Method has no body");
107 return new ControlFlowGraph (this.MetaDataProvider.AccessMethodBody (method, this, Dummy.Value), this);
111 public void AddReads (Method method, Field field)
113 throw new NotImplementedException ();
117 public IEnumerable<Method> GetAffectedGetters (Field field)
119 //todo: implement this
121 return new Method[0];
124 public IEnumerable<Field> GetModifies (Method method)
126 //todo: implement this