Skip to content

Commit

Permalink
update to Signum.TSGEnerator 2.2.2
Browse files Browse the repository at this point in the history
  • Loading branch information
olmobrutall committed Dec 3, 2019
1 parent b9199a2 commit a6d3c79
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 72 deletions.
2 changes: 1 addition & 1 deletion Signum.React/Signum.React.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Signum.Analyzer" Version="2.5.0" />
<PackageReference Include="Signum.TSGenerator" Version="2.0.5" />
<PackageReference Include="Signum.TSGenerator" Version="2.2.2" />
</ItemGroup>

<ItemGroup>
Expand Down
112 changes: 44 additions & 68 deletions Signum.TSGenerator/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,20 @@ namespace Signum.TSGenerator
{
public static class Program
{


public static int Main(string[] args)
{
var log = Console.Out;

Stopwatch sw = Stopwatch.StartNew();

string intermediateAssembly = args[0];
string[] references = File.ReadAllLines(args[1]);
string[] content = File.ReadAllLines(args[2]);

var log = Console.Out;

log.WriteLine("Starting SignumTSGenerator");

bool hasPdb = File.Exists(Path.ChangeExtension(intermediateAssembly, ".pdb"));

AssemblyDefinition reactAssembly = AssemblyDefinition.ReadAssembly(intermediateAssembly, new ReaderParameters
{
ReadingMode = ReadingMode.Deferred,
ReadSymbols = hasPdb,
InMemory = true,
SymbolReaderProvider = hasPdb ? new PdbReaderProvider() : null
});


if (AlreadyProcessed(reactAssembly))
{
log.WriteLine("SignumTSGenerator already processed: {0}", intermediateAssembly);
return 0;
}

PreloadingAssemblyResolver resolver = new PreloadingAssemblyResolver(references);

var assemblyReferences = (from r in references
where r.Contains(".Entities")
let reactDirectory = FindReactDirectory(r)
Expand All @@ -57,23 +40,42 @@ where r.Contains(".Entities")

var entitiesAssembly = Path.GetFileNameWithoutExtension(intermediateAssembly).Replace(".React", ".Entities");
var entitiesAssemblyReference = assemblyReferences.GetOrThrow(entitiesAssembly);
var entitiesModule = ModuleDefinition.ReadModule(entitiesAssemblyReference.AssemblyFullPath, new ReaderParameters { AssemblyResolver = resolver });

var currentDir = Directory.GetCurrentDirectory();
var files = content
.Where(file => Path.GetExtension(file) == ".t4s")
.Select(file => Path.Combine(currentDir, file))
.ToList();

var upToDateContent = string.Join("\r\n",
new[] { entitiesAssemblyReference.AssemblyFullPath }
.Concat(files)
.OrderBy(a => a)
.Select(f => File.GetLastWriteTimeUtc(f).ToString("o") + " " + Path.GetFileName(f)));

var signumUpToDatePath = Path.Combine(Path.GetDirectoryName(args[1]), "SignumUpToDate.txt");

if(File.Exists(signumUpToDatePath) && File.ReadAllText(signumUpToDatePath) == upToDateContent)
{
log.WriteLine($"SignumTSGenerator already processed ({sw.ElapsedMilliseconds.ToString()}ms)");
return 0;
}

var entityResolver = new PreloadingAssemblyResolver(references);
var entitiesModule = ModuleDefinition.ReadModule(entitiesAssemblyReference.AssemblyFullPath, new ReaderParameters
{
AssemblyResolver = entityResolver
});

var options = new AssemblyOptions
{
CurrentAssembly = entitiesAssembly,
AssemblyReferences = assemblyReferences,
AllReferences = references.ToDictionary(a => Path.GetFileNameWithoutExtension(a)),
ModuleDefinition = entitiesModule,
Resolver = resolver,
Resolver = entityResolver,
};


var currentDir = Directory.GetCurrentDirectory();
var files = content
.Where(file => Path.GetExtension(file) == ".t4s")
.Select(file => Path.Combine(currentDir, file))
.ToList();

bool hasErrors = false;
foreach (var file in files)
{
Expand All @@ -95,52 +97,26 @@ where r.Contains(".Entities")
catch (Exception ex)
{
hasErrors = true;
log.WriteLine($"Error in {file}");
log.WriteLine($"{file}:error STSG0001:{ex.Message}");
log.WriteLine(ex.Message);
}
}

MarkAsProcessed(reactAssembly, resolver);

reactAssembly.Write(intermediateAssembly, new WriterParameters
if (hasErrors)
{
WriteSymbols = hasPdb,
SymbolWriterProvider = hasPdb ? new PdbWriterProvider() : null
});

log.WriteLine($"SignumTSGenerator finished in {sw.ElapsedMilliseconds.ToString()}ms");

Console.WriteLine();

return hasErrors ? -1 : 0;
}

static bool AlreadyProcessed(AssemblyDefinition assembly)
{
var nameof = typeof(GeneratedCodeAttribute).FullName;
var attr = assembly.CustomAttributes
.Any(a => a.AttributeType.FullName == nameof && ((string)a.ConstructorArguments[0].Value) == "SignumTask");

return attr;
}

static void MarkAsProcessed(AssemblyDefinition assembly, IAssemblyResolver resolver)
{
TypeDefinition generatedCodeAttribute = resolver.Resolve(AssemblyNameReference.Parse(typeof(GeneratedCodeAttribute).Assembly.GetName().Name)).MainModule.GetType(typeof(GeneratedCodeAttribute).FullName);
MethodDefinition constructor = generatedCodeAttribute.Methods.Single(a => a.IsConstructor && a.Parameters.Count == 2);

TypeReference stringType = assembly.MainModule.TypeSystem.String;
assembly.CustomAttributes.Add(new CustomAttribute(assembly.MainModule.ImportReference(constructor))
log.WriteLine($"SignumTSGenerator finished with errors ({sw.ElapsedMilliseconds.ToString()}ms)");
Console.WriteLine();
return 0;
}
else
{
ConstructorArguments =
{
new CustomAttributeArgument(stringType, "SignumTask"),
new CustomAttributeArgument(stringType, typeof(Program).Assembly.GetName().Version.ToString()),
}
});
File.WriteAllText(signumUpToDatePath, upToDateContent);
log.WriteLine($"SignumTSGenerator finished ({sw.ElapsedMilliseconds.ToString()}ms)");
Console.WriteLine();
return 0;
}
}


static string FindReactDirectory(string absoluteFilePath)
{
var prefix = absoluteFilePath;
Expand Down
Binary file not shown.
2 changes: 1 addition & 1 deletion Signum.TSGenerator/Signum.TSGenerator.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
<LangVersion>latest</LangVersion>
<Platforms>x64;AnyCPU</Platforms>
<Version>2.1.3</Version>
<Version>2.2.2</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion Signum.TSGenerator/Signum.TSGenerator.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<package >
<metadata>
<id>Signum.TSGenerator</id>
<version>2.1.3</version>
<version>2.2.2</version>
<title>TypeScript generator for Signum Framework applications</title>
<authors>Olmo del Corral</authors>
<license type="expression">MIT</license>
Expand Down
2 changes: 1 addition & 1 deletion Signum.TSGenerator/Signum.TSGenerator.targets
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<Target Name="GenerateSignumTS">
<WriteLinesToFile File="$(BaseIntermediateOutputPath)SignumReferences.txt" Lines="@(ReferencePath)" Overwrite="true" Encoding="Unicode" />
<WriteLinesToFile File="$(BaseIntermediateOutputPath)SignumContent.txt" Lines="@(Content);@(None)" Overwrite="true" Encoding="Unicode" />
<Exec command="dotnet &quot;$(MSBuildThisFileDirectory)Signum.TSGenerator.dll&quot; &quot;@(IntermediateAssembly)&quot; &quot;$(BaseIntermediateOutputPath)SignumReferences.txt&quot; &quot;$(BaseIntermediateOutputPath)SignumContent.txt&quot;" ConsoleToMSBuild="false">
<Exec command="dotnet &quot;$(MSBuildThisFileDirectory)Signum.TSGenerator.dll&quot; &quot;@(IntermediateAssembly)&quot; &quot;$(BaseIntermediateOutputPath)SignumReferences.txt&quot; &quot;$(BaseIntermediateOutputPath)SignumContent.txt&quot;" ConsoleToMSBuild="true">
<Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
</Exec>
</Target>
Expand Down

3 comments on commit a6d3c79

@olmobrutall
Copy link
Collaborator Author

@olmobrutall olmobrutall commented on a6d3c79 Dec 4, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

More improvements in compilation speed using TSGenerator caching

Project References Build Mode (2) Signum.React Signum.React.Extensions Southwind.React Total (All proyects)
Clean Build (delete ts_out) 30 35 17 88
Build Signum.React Change 4 13 7 24
Build Signum.React.Extensions.Change 2 11 5 19
Build Southwind.React Change 2 7 5 15
No Changes 2 7 5 15
Faster TSGenerator Signum.React Signum.React.Extensions Southwind.React Total (All proyects)
Clean Build (delete ts_out) 25 34 16 80
Build Signum.React Change 5 8 5 18
Build Signum.React.Extensions.Change 2 6 5 13
Build Southwind.React Change 2 2 5 9
No Changes 2 2 3 7
Improvement % Signum.React Signum.React.Extensions Southwind.React Total (All proyects)
Clean Build (delete ts_out) 17% 3% 6% 9%
Build Signum.React Change -25% 38% 29% 25%
Build Signum.React.Extensions.Change 0% 45% 0% 32%
Build Southwind.React Change 0% 71% 0% 40%
No Changes 0% 71% 40% 53%

@MehdyKarimpour
Copy link
Contributor

@MehdyKarimpour MehdyKarimpour commented on a6d3c79 Dec 4, 2019 via email

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rezanos
Copy link
Contributor

@rezanos rezanos commented on a6d3c79 Dec 4, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perfect!

Please sign in to comment.