1
- using System ;
1
+ using System ;
2
2
using System . Collections . Generic ;
3
3
using System . IO ;
4
4
using System . Text ;
5
- using System . Linq ;
6
5
using Semmle . Util ;
7
6
using Semmle . Util . Logging ;
8
7
9
8
namespace Semmle . Extraction . CSharp . DependencyFetching
10
9
{
11
- internal class Razor
10
+ internal abstract class DotnetSourceGeneratorWrapper
12
11
{
13
- private readonly DotNetVersion sdk ;
14
- private readonly ILogger logger ;
15
- private readonly IDotNet dotNet ;
16
- private readonly string sourceGeneratorFolder ;
17
- private readonly string cscPath ;
12
+ protected readonly ILogger logger ;
13
+ private readonly Sdk sdk ;
14
+ protected readonly IDotNet dotnet ;
18
15
19
- public Razor ( DotNetVersion sdk , IDotNet dotNet , ILogger logger )
16
+ protected abstract string SourceGeneratorFolder { get ; init ; }
17
+ protected abstract string FileType { get ; }
18
+
19
+ public DotnetSourceGeneratorWrapper (
20
+ Sdk sdk ,
21
+ IDotNet dotnet ,
22
+ ILogger logger )
20
23
{
21
- this . sdk = sdk ;
22
24
this . logger = logger ;
23
- this . dotNet = dotNet ;
24
-
25
- sourceGeneratorFolder = Path . Combine ( this . sdk . FullPath , "Sdks" , "Microsoft.NET.Sdk.Razor" , "source-generators" ) ;
26
- this . logger . LogInfo ( $ "Razor source generator folder: { sourceGeneratorFolder } ") ;
27
- if ( ! Directory . Exists ( sourceGeneratorFolder ) )
28
- {
29
- this . logger . LogInfo ( $ "Razor source generator folder { sourceGeneratorFolder } does not exist.") ;
30
- throw new Exception ( $ "Razor source generator folder { sourceGeneratorFolder } does not exist.") ;
31
- }
32
-
33
- cscPath = Path . Combine ( this . sdk . FullPath , "Roslyn" , "bincore" , "csc.dll" ) ;
34
- this . logger . LogInfo ( $ "Razor source generator CSC: { cscPath } ") ;
35
- if ( ! File . Exists ( cscPath ) )
36
- {
37
- this . logger . LogInfo ( $ "Csc.exe not found at { cscPath } .") ;
38
- throw new Exception ( $ "csc.dll { cscPath } does not exist.") ;
39
- }
25
+ this . sdk = sdk ;
26
+ this . dotnet = dotnet ;
40
27
}
41
28
42
- private static void GenerateAnalyzerConfig ( IEnumerable < string > cshtmls , string analyzerConfigPath )
43
- {
44
- using var sw = new StreamWriter ( analyzerConfigPath ) ;
45
- sw . WriteLine ( "is_global = true" ) ;
29
+ protected abstract void GenerateAnalyzerConfig ( IEnumerable < string > additionalFiles , string analyzerConfigPath ) ;
46
30
47
- foreach ( var f in cshtmls . Select ( f => f . Replace ( '\\ ' , '/' ) ) )
31
+ public IEnumerable < string > RunSourceGenerator ( IEnumerable < string > additionalFiles , IEnumerable < string > references , string targetDir )
32
+ {
33
+ if ( sdk . CscPath is null )
48
34
{
49
- sw . WriteLine ( $ "\n [{ f } ]") ;
50
- var base64 = Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( f ) ) ; // TODO: this should be the relative path of the file.
51
- sw . WriteLine ( $ "build_metadata.AdditionalFiles.TargetPath = { base64 } ") ;
35
+ logger . LogWarning ( "Not running source generator because csc path is not available." ) ;
36
+ return [ ] ;
52
37
}
53
- }
54
38
55
- public IEnumerable < string > GenerateFiles ( IEnumerable < string > cshtmls , IEnumerable < string > references , string workingDirectory )
56
- {
57
39
var name = Guid . NewGuid ( ) . ToString ( "N" ) . ToUpper ( ) ;
58
40
var tempPath = FileUtils . GetTemporaryWorkingDirectory ( out var shouldCleanUp ) ;
59
41
var analyzerConfig = Path . Combine ( tempPath , $ "{ name } .txt") ;
60
42
var dllPath = Path . Combine ( tempPath , $ "{ name } .dll") ;
61
43
var cscArgsPath = Path . Combine ( tempPath , $ "{ name } .rsp") ;
62
- var outputFolder = Path . Combine ( workingDirectory , name ) ;
44
+ var outputFolder = Path . Combine ( targetDir , name ) ;
63
45
Directory . CreateDirectory ( outputFolder ) ;
64
46
65
47
try
66
48
{
67
49
logger . LogInfo ( "Produce analyzer config content." ) ;
68
- GenerateAnalyzerConfig ( cshtmls , analyzerConfig ) ;
50
+ GenerateAnalyzerConfig ( additionalFiles , analyzerConfig ) ;
69
51
70
52
logger . LogDebug ( $ "Analyzer config content: { File . ReadAllText ( analyzerConfig ) } ") ;
71
53
72
54
var args = new StringBuilder ( ) ;
73
55
args . Append ( $ "/target:exe /generatedfilesout:\" { outputFolder } \" /out:\" { dllPath } \" /analyzerconfig:\" { analyzerConfig } \" ") ;
74
56
75
- foreach ( var f in Directory . GetFiles ( sourceGeneratorFolder , "*.dll" , new EnumerationOptions { RecurseSubdirectories = false , MatchCasing = MatchCasing . CaseInsensitive } ) )
57
+ foreach ( var f in Directory . GetFiles ( SourceGeneratorFolder , "*.dll" , new EnumerationOptions { RecurseSubdirectories = false , MatchCasing = MatchCasing . CaseInsensitive } ) )
76
58
{
77
59
args . Append ( $ "/analyzer:\" { f } \" ") ;
78
60
}
79
61
80
- foreach ( var f in cshtmls )
62
+ foreach ( var f in additionalFiles )
81
63
{
82
64
args . Append ( $ "/additionalfile:\" { f } \" ") ;
83
65
}
@@ -89,19 +71,19 @@ public IEnumerable<string> GenerateFiles(IEnumerable<string> cshtmls, IEnumerabl
89
71
90
72
var argsString = args . ToString ( ) ;
91
73
92
- logger . LogInfo ( $ "Running CSC to generate Razor source files.") ;
93
- logger . LogDebug ( $ "Running CSC to generate Razor source files with arguments: { argsString } .") ;
74
+ logger . LogInfo ( $ "Running CSC to generate source files from { FileType } files.") ;
75
+ logger . LogDebug ( $ "Running CSC to generate source files from { FileType } files with arguments: { argsString } .") ;
94
76
95
77
using ( var sw = new StreamWriter ( cscArgsPath ) )
96
78
{
97
79
sw . Write ( argsString ) ;
98
80
}
99
81
100
- dotNet . Exec ( $ "\" { cscPath } \" /noconfig @\" { cscArgsPath } \" ") ;
82
+ dotnet . Exec ( $ "\" { sdk . CscPath } \" /noconfig @\" { cscArgsPath } \" ") ;
101
83
102
84
var files = Directory . GetFiles ( outputFolder , "*.*" , new EnumerationOptions { RecurseSubdirectories = true } ) ;
103
85
104
- logger . LogInfo ( $ "Generated { files . Length } source files from cshtml files.") ;
86
+ logger . LogInfo ( $ "Generated { files . Length } source files from { FileType } files.") ;
105
87
106
88
return files ;
107
89
}
0 commit comments