Repository navigation
Expand file tree
/
Copy pathgenerate_AssemblyTypeNames.py
More file actions
123 lines (97 loc) · 4.15 KB
/
Copy pathgenerate_AssemblyTypeNames.py
File metadata and controls
123 lines (97 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#####################################################################################
#
# Copyright (c) Microsoft Corporation. All rights reserved.
#
# This source code is subject to terms and conditions of the Apache License, Version 2.0. A
# copy of the license can be found in the License.html file at the root of this distribution. If
# you cannot locate the Apache License, Version 2.0, please send an email to
# [email protected]. By using this source code in any fashion, you are agreeing to be bound
# by the terms of the Apache License, Version 2.0.
#
# You must not remove this notice, or any other, from this software.
#
#
#####################################################################################
from generate import generate
import sys
import clr
import System
def SortTypesByNamespace(types):
typesByNamespace = {}
for t in types:
# We ignore nested types. They will be loaded when the containing type is loaded
# t.DeclaringType is failing on Silverlight (DDB 76340)
t = clr.GetClrType(t)
if t.DeclaringType:
continue
namespace = t.Namespace
if not typesByNamespace.has_key(namespace):
# This is the first type we are seeing from this namespace
typesByNamespace[namespace] = []
# t.Name is failing on Silverlight (DDB 76340)
typeName = t.Name
typesByNamespace[namespace].append(typeName)
for namespace in typesByNamespace.keys():
typesByNamespace[namespace].sort()
return typesByNamespace
def CountTypes(typesByNamespace):
count = 0
for namespace in typesByNamespace.keys():
count += len(typesByNamespace[namespace])
return count
# Try loading an assembly in different ways
def LoadAssembly(assemName):
try:
return clr.LoadAssemblyByName(assemName)
except IOError:
return clr.LoadAssemblyByPartialName(assemName)
return System.Reflection.Assembly.ReflectionOnlyLoadFrom(assemName)
# Get all public non-nested types in the assembly and list their names
def PrintTypeNames(cw, assemName):
assem = LoadAssembly(assemName)
types = assem.GetExportedTypes()
typesByNamespace = SortTypesByNamespace(types)
namespacesCount = len(typesByNamespace)
sortedNamespaces = typesByNamespace.keys()
sortedNamespaces.sort()
cw.write('static IEnumerable<TypeName> Get_%s_TypeNames() {' % assemName.replace(".", ""))
cw.write(' // %s' % assem.FullName)
cw.write(' // Total number of types = %s' % CountTypes(typesByNamespace))
cw.write('')
cw.write(' string [] namespaces = new string[%i] {' % namespacesCount)
for namespace in sortedNamespaces:
cw.write(' "%s",' % namespace)
cw.write(' };')
cw.write('')
cw.write(' string [][] types = new string[%i][] {' % namespacesCount)
cw.write('')
for namespace in sortedNamespaces:
cw.write(' new string[%i] { // %s' % (len(typesByNamespace[namespace]), namespace))
for t in typesByNamespace[namespace]:
cw.write(' "%s",' % t)
cw.write(' },')
cw.write('')
cw.write(' };')
cw.write(' return GetTypeNames(namespaces, types);')
cw.write('}')
cw.write('')
# This is the set of assemblies used by a WinForms app. We can add more assemblies depending on the
# priority of scenarios
default_assemblies = ["mscorlib", "System", "System.Drawing", "System.Windows.Forms", "System.Xml"]
def do_generate(cw):
for assemName in default_assemblies:
PrintTypeNames(cw, assemName)
def GetGeneratorList():
if 'checkonly' in sys.argv:
# skip checking - even if we're out of date (new types added) the code still does the right thing.
# If we are out of date then we shouldn't fail tests.
print "Skipping generate_AssemblyTypeNames in check only mode"
return []
if System.Environment.Version.Major == 4:
return [("Well-known assembly type names (CLR 4)", do_generate)]
else:
return [("Well-known assembly type names", do_generate)]
def main():
return generate(*GetGeneratorList())
if __name__ == "__main__":
main()