@@ -13,37 +13,20 @@ namespace Signum.TSGenerator
13
13
{
14
14
public static class Program
15
15
{
16
+
17
+
16
18
public static int Main ( string [ ] args )
17
19
{
20
+ var log = Console . Out ;
21
+
18
22
Stopwatch sw = Stopwatch . StartNew ( ) ;
19
23
20
24
string intermediateAssembly = args [ 0 ] ;
21
25
string [ ] references = File . ReadAllLines ( args [ 1 ] ) ;
22
26
string [ ] content = File . ReadAllLines ( args [ 2 ] ) ;
23
27
24
- var log = Console . Out ;
25
-
26
28
log . WriteLine ( "Starting SignumTSGenerator" ) ;
27
29
28
- bool hasPdb = File . Exists ( Path . ChangeExtension ( intermediateAssembly , ".pdb" ) ) ;
29
-
30
- AssemblyDefinition reactAssembly = AssemblyDefinition . ReadAssembly ( intermediateAssembly , new ReaderParameters
31
- {
32
- ReadingMode = ReadingMode . Deferred ,
33
- ReadSymbols = hasPdb ,
34
- InMemory = true ,
35
- SymbolReaderProvider = hasPdb ? new PdbReaderProvider ( ) : null
36
- } ) ;
37
-
38
-
39
- if ( AlreadyProcessed ( reactAssembly ) )
40
- {
41
- log . WriteLine ( "SignumTSGenerator already processed: {0}" , intermediateAssembly ) ;
42
- return 0 ;
43
- }
44
-
45
- PreloadingAssemblyResolver resolver = new PreloadingAssemblyResolver ( references ) ;
46
-
47
30
var assemblyReferences = ( from r in references
48
31
where r . Contains ( ".Entities" )
49
32
let reactDirectory = FindReactDirectory ( r )
@@ -57,23 +40,42 @@ where r.Contains(".Entities")
57
40
58
41
var entitiesAssembly = Path . GetFileNameWithoutExtension ( intermediateAssembly ) . Replace ( ".React" , ".Entities" ) ;
59
42
var entitiesAssemblyReference = assemblyReferences . GetOrThrow ( entitiesAssembly ) ;
60
- var entitiesModule = ModuleDefinition . ReadModule ( entitiesAssemblyReference . AssemblyFullPath , new ReaderParameters { AssemblyResolver = resolver } ) ;
43
+
44
+ var currentDir = Directory . GetCurrentDirectory ( ) ;
45
+ var files = content
46
+ . Where ( file => Path . GetExtension ( file ) == ".t4s" )
47
+ . Select ( file => Path . Combine ( currentDir , file ) )
48
+ . ToList ( ) ;
49
+
50
+ var upToDateContent = string . Join ( "\r \n " ,
51
+ new [ ] { entitiesAssemblyReference . AssemblyFullPath }
52
+ . Concat ( files )
53
+ . OrderBy ( a => a )
54
+ . Select ( f => File . GetLastWriteTimeUtc ( f ) . ToString ( "o" ) + " " + Path . GetFileName ( f ) ) ) ;
55
+
56
+ var signumUpToDatePath = Path . Combine ( Path . GetDirectoryName ( args [ 1 ] ) , "SignumUpToDate.txt" ) ;
57
+
58
+ if ( File . Exists ( signumUpToDatePath ) && File . ReadAllText ( signumUpToDatePath ) == upToDateContent )
59
+ {
60
+ log . WriteLine ( $ "SignumTSGenerator already processed ({ sw . ElapsedMilliseconds . ToString ( ) } ms)") ;
61
+ return 0 ;
62
+ }
63
+
64
+ var entityResolver = new PreloadingAssemblyResolver ( references ) ;
65
+ var entitiesModule = ModuleDefinition . ReadModule ( entitiesAssemblyReference . AssemblyFullPath , new ReaderParameters
66
+ {
67
+ AssemblyResolver = entityResolver
68
+ } ) ;
69
+
61
70
var options = new AssemblyOptions
62
71
{
63
72
CurrentAssembly = entitiesAssembly ,
64
73
AssemblyReferences = assemblyReferences ,
65
74
AllReferences = references . ToDictionary ( a => Path . GetFileNameWithoutExtension ( a ) ) ,
66
75
ModuleDefinition = entitiesModule ,
67
- Resolver = resolver ,
76
+ Resolver = entityResolver ,
68
77
} ;
69
78
70
-
71
- var currentDir = Directory . GetCurrentDirectory ( ) ;
72
- var files = content
73
- . Where ( file => Path . GetExtension ( file ) == ".t4s" )
74
- . Select ( file => Path . Combine ( currentDir , file ) )
75
- . ToList ( ) ;
76
-
77
79
bool hasErrors = false ;
78
80
foreach ( var file in files )
79
81
{
@@ -95,52 +97,26 @@ where r.Contains(".Entities")
95
97
catch ( Exception ex )
96
98
{
97
99
hasErrors = true ;
98
- log . WriteLine ( $ "Error in { file } ") ;
100
+ log . WriteLine ( $ "{ file } :error STSG0001: { ex . Message } ") ;
99
101
log . WriteLine ( ex . Message ) ;
100
102
}
101
103
}
102
104
103
- MarkAsProcessed ( reactAssembly , resolver ) ;
104
-
105
- reactAssembly . Write ( intermediateAssembly , new WriterParameters
105
+ if ( hasErrors )
106
106
{
107
- WriteSymbols = hasPdb ,
108
- SymbolWriterProvider = hasPdb ? new PdbWriterProvider ( ) : null
109
- } ) ;
110
-
111
- log . WriteLine ( $ "SignumTSGenerator finished in { sw . ElapsedMilliseconds . ToString ( ) } ms") ;
112
-
113
- Console . WriteLine ( ) ;
114
-
115
- return hasErrors ? - 1 : 0 ;
116
- }
117
-
118
- static bool AlreadyProcessed ( AssemblyDefinition assembly )
119
- {
120
- var nameof = typeof ( GeneratedCodeAttribute ) . FullName ;
121
- var attr = assembly . CustomAttributes
122
- . Any ( a => a . AttributeType . FullName == nameof && ( ( string ) a . ConstructorArguments [ 0 ] . Value ) == "SignumTask" ) ;
123
-
124
- return attr ;
125
- }
126
-
127
- static void MarkAsProcessed ( AssemblyDefinition assembly , IAssemblyResolver resolver )
128
- {
129
- TypeDefinition generatedCodeAttribute = resolver . Resolve ( AssemblyNameReference . Parse ( typeof ( GeneratedCodeAttribute ) . Assembly . GetName ( ) . Name ) ) . MainModule . GetType ( typeof ( GeneratedCodeAttribute ) . FullName ) ;
130
- MethodDefinition constructor = generatedCodeAttribute . Methods . Single ( a => a . IsConstructor && a . Parameters . Count == 2 ) ;
131
-
132
- TypeReference stringType = assembly . MainModule . TypeSystem . String ;
133
- assembly . CustomAttributes . Add ( new CustomAttribute ( assembly . MainModule . ImportReference ( constructor ) )
107
+ log . WriteLine ( $ "SignumTSGenerator finished with errors ({ sw . ElapsedMilliseconds . ToString ( ) } ms)") ;
108
+ Console . WriteLine ( ) ;
109
+ return 0 ;
110
+ }
111
+ else
134
112
{
135
- ConstructorArguments =
136
- {
137
- new CustomAttributeArgument ( stringType , "SignumTask" ) ,
138
- new CustomAttributeArgument ( stringType , typeof ( Program ) . Assembly . GetName ( ) . Version . ToString ( ) ) ,
139
- }
140
- } ) ;
113
+ File . WriteAllText ( signumUpToDatePath , upToDateContent ) ;
114
+ log . WriteLine ( $ "SignumTSGenerator finished ({ sw . ElapsedMilliseconds . ToString ( ) } ms)") ;
115
+ Console . WriteLine ( ) ;
116
+ return 0 ;
117
+ }
141
118
}
142
119
143
-
144
120
static string FindReactDirectory ( string absoluteFilePath )
145
121
{
146
122
var prefix = absoluteFilePath ;
0 commit comments