annotate Source/TypeBuilder/Builders/BuildContext.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 namespace BLToolkit.TypeBuilder.Builders
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 [DebuggerStepThrough]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public class BuildContext
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 public BuildContext(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 Type = type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 Items = new Dictionary<object,object>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 public TypeHelper Type { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public AssemblyBuilderHelper AssemblyBuilder { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 public TypeBuilderHelper TypeBuilder { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public Dictionary<object,object> Items { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public T GetItem<T>(string key)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 object value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 return Items.TryGetValue(key, out value) ? (T)value : default(T);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 private Dictionary<PropertyInfo,FieldBuilder> _fields;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 public Dictionary<PropertyInfo,FieldBuilder> Fields
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 get { return _fields ?? (_fields = new Dictionary<PropertyInfo, FieldBuilder>(10)); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 private IDictionary<TypeHelper,IAbstractTypeBuilder> _interfaceMap;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public IDictionary<TypeHelper,IAbstractTypeBuilder> InterfaceMap
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 get { return _interfaceMap ?? (_interfaceMap = new Dictionary<TypeHelper,IAbstractTypeBuilder>()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 public TypeHelper CurrentInterface { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 public MethodBuilderHelper MethodBuilder { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 public LocalBuilder ReturnValue { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 public LocalBuilder Exception { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 public Label ReturnLabel { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 #region BuildElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 public BuildElement BuildElement { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 public bool IsAbstractGetter { get { return BuildElement == BuildElement.AbstractGetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 public bool IsAbstractSetter { get { return BuildElement == BuildElement.AbstractSetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 public bool IsAbstractProperty { get { return IsAbstractGetter || IsAbstractSetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 public bool IsAbstractMethod { get { return BuildElement == BuildElement.AbstractMethod; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 public bool IsVirtualGetter { get { return BuildElement == BuildElement.VirtualGetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 public bool IsVirtualSetter { get { return BuildElement == BuildElement.VirtualSetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public bool IsVirtualProperty { get { return IsVirtualGetter || IsVirtualSetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 public bool IsVirtualMethod { get { return BuildElement == BuildElement.VirtualMethod; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 public bool IsGetter { get { return IsAbstractGetter || IsVirtualGetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public bool IsSetter { get { return IsAbstractSetter || IsVirtualSetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 public bool IsProperty { get { return IsGetter || IsSetter; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 public bool IsMethod { get { return IsAbstractMethod || IsVirtualMethod; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 public bool IsMethodOrProperty { get { return IsMethod || IsProperty; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 #region BuildStep
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 public BuildStep Step { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 public bool IsBeginStep { get { return Step == BuildStep.Begin; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 public bool IsBeforeStep { get { return Step == BuildStep.Before; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 public bool IsBuildStep { get { return Step == BuildStep.Build; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 public bool IsAfterStep { get { return Step == BuildStep.After; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 public bool IsCatchStep { get { return Step == BuildStep.Catch; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 public bool IsFinallyStep { get { return Step == BuildStep.Finally; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 public bool IsEndStep { get { return Step == BuildStep.End; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 public bool IsBeforeOrBuildStep
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 get { return Step == BuildStep.Before || Step == BuildStep.Build; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 public AbstractTypeBuilderList TypeBuilders { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 public PropertyInfo CurrentProperty { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 public MethodInfo CurrentMethod { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 #region Internal Methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 public FieldBuilder GetField(string fieldName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 return GetItem<FieldBuilder>("$BLToolkit.Field." + fieldName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 public FieldBuilder CreateField(string fieldName, Type type, FieldAttributes attributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 var field = TypeBuilder.DefineField(fieldName, type, attributes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 field.SetCustomAttribute(MethodBuilder.Type.Assembly.BLToolkitAttribute);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 Items.Add("$BLToolkit.Field." + fieldName, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 public FieldBuilder CreatePrivateField(string fieldName, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 return CreateField(fieldName, type, FieldAttributes.Private);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 public FieldBuilder CreatePrivateField(PropertyInfo propertyInfo, string fieldName, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 var field = CreateField(fieldName, type, FieldAttributes.Private);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 if (propertyInfo != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 Fields.Add(propertyInfo, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 public FieldBuilder CreatePrivateStaticField(string fieldName, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 return CreateField(fieldName, type, FieldAttributes.Private | FieldAttributes.Static);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 public MethodBuilderHelper GetFieldInstanceEnsurer(string fieldName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 return GetItem<MethodBuilderHelper>("$BLToolkit.FieldInstanceEnsurer." + fieldName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 }