Skip to content

Commit a644133

Browse files
committed
Write CSC arguments to file and pass that to the execution
1 parent 166633d commit a644133

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/ProgressMonitor.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,8 @@ internal void RazorSourceGeneratorMissing(string fullPath) =>
114114

115115
internal void CscMissing(string cscPath) =>
116116
LogInfo($"Csc.exe not found at {cscPath}.");
117+
118+
internal void RazorCscArgs(string args) =>
119+
LogInfo($"Running CSC to generate Razor source files. Args: {args}.");
117120
}
118121
}

csharp/extractor/Semmle.Extraction.CSharp.Standalone/Razor.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,21 @@ private static void GenerateAnalyzerConfig(IEnumerable<string> cshtmls, string a
5050

5151
public IEnumerable<string> GenerateFiles(IEnumerable<string> cshtmls, IEnumerable<string> references, string workingDirectory)
5252
{
53-
// TODO: the below command might be too long. It should be written to a temp file and passed to csc via @.
54-
5553
var name = Guid.NewGuid().ToString("N").ToUpper();
56-
var analyzerConfig = Path.Combine(Path.GetTempPath(), name + ".txt");
57-
var dllPath = Path.Combine(Path.GetTempPath(), name + ".dll");
54+
var tempPath = Path.GetTempPath();
55+
var analyzerConfig = Path.Combine(tempPath, name + ".txt");
56+
var dllPath = Path.Combine(tempPath, name + ".dll");
57+
var cscArgsPath = Path.Combine(tempPath, name + ".rsp");
5858
var outputFolder = Path.Combine(workingDirectory, name);
5959
Directory.CreateDirectory(outputFolder);
6060

6161
try
6262
{
63-
GenerateAnalyzerConfig(cshtmls, Path.Combine(sourceGeneratorFolder, analyzerConfig));
63+
GenerateAnalyzerConfig(cshtmls, analyzerConfig);
6464

6565
var args = new StringBuilder();
66-
args.Append($"\"{cscPath}\" /target:exe /generatedfilesout:\"{outputFolder}\" /out:\"{dllPath}\" /analyzerconfig:\"{analyzerConfig}\" ");
66+
args.Append($"/target:exe /generatedfilesout:\"{outputFolder}\" /out:\"{dllPath}\" /analyzerconfig:\"{analyzerConfig}\" ");
6767

68-
// TODO: quote paths:
6968
foreach (var f in Directory.GetFiles(sourceGeneratorFolder, "*.dll"))
7069
{
7170
args.Append($"/analyzer:\"{f}\" ");
@@ -81,14 +80,24 @@ public IEnumerable<string> GenerateFiles(IEnumerable<string> cshtmls, IEnumerabl
8180
args.Append($"/reference:\"{f}\" ");
8281
}
8382

84-
dotNet.Exec(args.ToString());
83+
var argsString = args.ToString();
84+
85+
progressMonitor.RazorCscArgs(argsString);
86+
87+
using (var sw = new StreamWriter(cscArgsPath))
88+
{
89+
sw.Write(argsString);
90+
}
91+
92+
dotNet.Exec($"\"{cscPath}\" /noconfig @\"{cscArgsPath}\"");
8593

8694
return Directory.GetFiles(outputFolder, "*.*", new EnumerationOptions { RecurseSubdirectories = true });
8795
}
8896
finally
8997
{
9098
DeleteFile(analyzerConfig);
9199
DeleteFile(dllPath);
100+
DeleteFile(cscArgsPath);
92101
}
93102
}
94103

0 commit comments

Comments
 (0)