Update mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngPattern.cs
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Static.ControlFlow.Subroutines / SubroutineFacade.cs
1 // 
2 // SubroutineFacade.cs
3 // 
4 // Authors:
5 //      Alexander Chebaturkin (chebaturkin@gmail.com)
6 // 
7 // Copyright (C) 2011 Alexander Chebaturkin
8 // 
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:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //  
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.
27 // 
28
29 using System;
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;
37
38 namespace Mono.CodeContracts.Static.ControlFlow.Subroutines {
39         class SubroutineFacade : IMethodCodeConsumer<Dummy, Subroutine> {
40                 public readonly IContractProvider ContractProvider;
41                 public readonly IMetaDataProvider MetaDataProvider;
42
43 //              private readonly EnsuresFactory ensures_factory;
44                 private readonly Dictionary<Method, ICFG> method_cache = new Dictionary<Method, ICFG> ();
45                 private readonly RequiresFactory requires_factory;
46
47                 public SubroutineFacade (IMetaDataProvider metaDataProvider,
48                                          IContractProvider contractProvider)
49                 {
50                         this.MetaDataProvider = metaDataProvider;
51                         this.ContractProvider = contractProvider;
52                         this.requires_factory = new RequiresFactory (this);
53 //                      this.ensures_factory = new EnsuresFactory (this);
54                 }
55
56                 #region IMethodCodeConsumer<Dummy,Subroutine> Members
57                 Subroutine IMethodCodeConsumer<Dummy, Subroutine>.Accept<Label, Handler> (
58                         IMethodCodeProvider<Label, Handler> codeProvider,
59                         Label entry,
60                         Method method,
61                         Dummy data)
62                 {
63                         var builder = new SubroutineWithHandlersBuilder<Label, Handler> (codeProvider, this, method, entry);
64                         return new MethodSubroutine<Label, Handler> (this, method, entry, builder);
65                 }
66                 #endregion
67
68                 public Result ForwardDecode<Data, Result, Visitor> (APC pc, Visitor visitor, Data data)
69                         where Visitor : IILVisitor<APC, Dummy, Dummy, Data, Result>
70                 {
71                         var block = pc.Block as BlockBase;
72                         if (block != null)
73                                 return block.ForwardDecode<Data, Result, Visitor> (pc, visitor, data);
74
75                         return visitor.Nop (pc, data);
76                 }
77
78                 public Subroutine GetRequires (Method method)
79                 {
80                         method = this.MetaDataProvider.Unspecialized (method);
81                         return this.requires_factory.Get (method);
82                 }
83
84                 public Subroutine GetEnsures (Method method)
85                 {
86                         return null;
87                         //todo: implement handling this in MethodSubroutine and uncomment lines below
88
89 //                      method = this.MetaDataProvider.Unspecialized (method);
90 //                      return this.ensures_factory.Get (method);
91                 }
92
93                 public Subroutine GetInvariant (TypeNode type)
94                 {
95                         //todo: implement this
96                         return null;
97                 }
98
99                 public ICFG GetControlFlowGraph (Method method)
100                 {
101                         if (this.method_cache.ContainsKey (method))
102                                 return this.method_cache [method];
103
104                         if (!this.MetaDataProvider.HasBody (method))
105                                 throw new InvalidOperationException ("Method has no body");
106
107                         return new ControlFlowGraph (this.MetaDataProvider.AccessMethodBody (method, this, Dummy.Value), this);
108                 }
109
110
111                 public void AddReads (Method method, Field field)
112                 {
113                         throw new NotImplementedException ();
114                 }
115
116
117                 public IEnumerable<Method> GetAffectedGetters (Field field)
118                 {
119                         //todo: implement this
120
121                         return new Method[0];
122                 }
123
124                 public IEnumerable<Field> GetModifies (Method method)
125                 {
126                         //todo: implement this
127                         return new Field[0];
128                 }
129         }
130 }