@@ -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;
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4