2007-12-18 Ivan N. Zlatev <contact@i-nz.net>
[mono.git] / mcs / class / Mono.Cecil / CodeGen / cecil-mig.rb
1 #!/usr/bin/env ruby
2
3 #
4 # usage cecil-mig.rb directory
5 #
6
7 dir = ARGV.length > 0 ? ARGV[0] : "."
8
9 $replaces = {
10         "GenericParamAttributes" => "GenericParameterAttributes",
11         "ParamAttributes" => "ParameterAttributes",
12         "IParameterReference" => "ParameterDefinition",
13         "IPropertyReference" => "PropertyDefinition",
14         "IEventReference" => "EventDefinition",
15         "IVariableReference" => "VariableDefinition",
16         "IMarshalDesc" => "MarshalSpec",
17         "MarshalDesc" => "MarshalSpec",
18         "IArrayMarshalDesc" => "ArrayMarshalSpec",
19         "ArrayMarshalDesc" => "ArrayMarshalSpec",
20         "ICustomMarshalerDesc" => "CustomMarshalerSpec",
21         "CustomMarshalerDesc" => "CustomMarshalerSpec",
22         "ISafeArrayDesc" => "SafeArraySpec",
23         "SafeArrayDesc" => "SafeArraySpec",
24         "IFixedArrayDesc" => "FixedArraySpec",
25         "FixedArrayDesc" => "FixedArraySpec",
26         "IFixedSysStringDesc" => "FixedSysStringSpec",
27         "FixedSysStringDesc" => "FixedSysStringSpec",
28         "IModifierType" => "ModType"
29 }
30
31 $collections = [
32         "AssemblyNameReferenceCollection",
33         "ModuleReferenceCollection",
34         "ModuleDefinitionCollection",
35         "ResourceCollection",
36         "TypeDefinitionCollection",
37         "TypeReferenceCollection",
38         "InterfaceCollection",
39         "ParameterDefinitionCollection",
40         "OverrideCollection",
41         "MethodDefinitionCollection",
42         "ConstructorCollection",
43         "EventDefinitionCollection",
44         "FieldDefinitionCollection",
45         "PropertyDefinitionCollection",
46         "InstructionCollection",
47         "ExceptionHandlerCollection",
48         "VariableDefinitionCollection",
49         "ArrayDimensionCollection",
50         "CustomAttributeCollection",
51         "ExternTypeCollection",
52         "NestedTypeCollection",
53         "SecurityDeclarationCollection",
54         "MemberReferenceCollection",
55         "GenericParameterCollection",
56         "GenericArgumentCollection",
57         "ConstraintCollection"
58 ]
59
60 $types = [
61         "AssemblyDefinition",
62         "ArrayDimension",
63         "ArrayType",
64         "AssemblyLinkedResource",
65         "AssemblyNameReference",
66         "AssemblyNameDefinition",
67         "CallSite",
68         "CustomAttribute",
69         "EmbeddedResource",
70         "EventDefinition",
71         "EventReference",
72         "FieldDefinition",
73         "FieldReference",
74         "FunctionPointerType",
75         "GenericInstanceMethod",
76         "GenericInstanceType",
77         "GenericParameter",
78         "LinkedResource",
79         "MethodDefinition",
80         "MethodReference",
81         "MethodReturnType",
82         "ModifierOptional",
83         "ModifierRequired",
84         "ModuleDefinition",
85         "ModuleReference",
86         "ParameterDefinition",
87         "ParameterReference",
88         "PinnedType",
89         "PInvokeInfo",
90         "PropertyDefinition",
91         "PropertyReference",
92         "ReferenceType",
93         "Resource",
94         "SecurityDeclaration",
95         "TypeDefinition",
96         "TypeReference",
97         "TypeSpecification",
98
99         "Instruction",
100         "ExceptionHandler",
101         "MethodBody",
102         "VariableDefinition",
103         "VariableReference"
104 ]
105
106 def iface(name)
107         return "I" + name
108 end
109
110 def bang(buffer, re, str)
111         nl = "([\\W])"
112         buffer.gsub!(Regexp.new("#{nl}(#{re})#{nl}"), "\\1" + str + "\\3")
113 end
114
115 def process_replaces(buffer)
116         $replaces.each_key { |key|
117                 bang(buffer, key, $replaces[key])
118         }
119 end
120
121 def process_collections(buffer)
122         $collections.each { |name|
123                 bang(buffer, iface(name), name)
124         }
125 end
126
127 def process_types(buffer)
128         $types.each { |name|
129                 bang(buffer, iface(name), name)
130         }
131 end
132
133 def process_unbreak(buffer)
134         $unbreak.each { |name|
135                 bang(buffer, name, iface(name))
136         }
137 end
138
139 def process(file)
140         buffer = ""
141         original = ""
142         File.open(file, File::RDONLY) { |f|
143                 original = f.read()
144                 buffer = original.clone
145                 process_replaces(buffer)
146                 process_collections(buffer)
147                 process_types(buffer)
148         }
149
150         File.open(file, File::WRONLY | File::TRUNC) { |f|
151                 f.write(buffer)
152                 puts("#{file} processed")
153         } if (original != buffer)
154
155 end
156
157 Dir[File.join(dir, "**", "*.*")].each { |file|
158         process(file) if not File.directory?(file)
159 }