1 //
2 // CallSite.cs
3 //
4 // Author:
5 //   Jb Evain (jbevain@gmail.com)
6 //
7 // Copyright (c) 2008 - 2011 Jb Evain
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.Text;
31 
32 using Mono.Collections.Generic;
33 
34 namespace Mono.Cecil {
35 
36 	public sealed class CallSite : IMethodSignature {
37 
38 		readonly MethodReference signature;
39 
40 		public bool HasThis {
41 			get { return signature.HasThis; }
42 			set { signature.HasThis = value; }
43 		}
44 
45 		public bool ExplicitThis {
46 			get { return signature.ExplicitThis; }
47 			set { signature.ExplicitThis = value; }
48 		}
49 
50 		public MethodCallingConvention CallingConvention {
51 			get { return signature.CallingConvention; }
52 			set { signature.CallingConvention = value; }
53 		}
54 
55 		public bool HasParameters {
56 			get { return signature.HasParameters; }
57 		}
58 
59 		public Collection<ParameterDefinition> Parameters {
60 			get { return signature.Parameters; }
61 		}
62 
63 		public TypeReference ReturnType {
64 			get { return signature.MethodReturnType.ReturnType; }
65 			set { signature.MethodReturnType.ReturnType = value; }
66 		}
67 
68 		public MethodReturnType MethodReturnType {
69 			get { return signature.MethodReturnType; }
70 		}
71 
72 		public string Name {
73 			get { return string.Empty; }
74 			set { throw new InvalidOperationException (); }
75 		}
76 
77 		public string Namespace {
78 			get { return string.Empty; }
79 			set { throw new InvalidOperationException (); }
80 		}
81 
82 		public ModuleDefinition Module {
83 			get { return ReturnType.Module; }
84 		}
85 
86 		public IMetadataScope Scope {
87 			get { return signature.ReturnType.Scope; }
88 		}
89 
90 		public MetadataToken MetadataToken {
91 			get { return signature.token; }
92 			set { signature.token = value; }
93 		}
94 
95 		public string FullName {
96 			get {
97 				var signature = new StringBuilder ();
98 				signature.Append (ReturnType.FullName);
99 				this.MethodSignatureFullName (signature);
100 				return signature.ToString ();
101 			}
102 		}
103 
CallSite()104 		internal CallSite ()
105 		{
106 			this.signature = new MethodReference ();
107 			this.signature.token = new MetadataToken (TokenType.Signature, 0);
108 		}
109 
CallSite(TypeReference returnType)110 		public CallSite (TypeReference returnType)
111 			: this ()
112 		{
113 			if (returnType == null)
114 				throw new ArgumentNullException ("returnType");
115 
116 			this.signature.ReturnType = returnType;
117 		}
118 
ToString()119 		public override string ToString ()
120 		{
121 			return FullName;
122 		}
123 	}
124 }
125