C#: Change source generated razor file paths to be relative to csproj

This commit is contained in:
Tamas Vajk
2025-01-06 09:27:00 +01:00
parent b0062fc727
commit c9fab0b071
5 changed files with 24 additions and 29 deletions

View File

@@ -34,10 +34,25 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
using var sw = new StreamWriter(analyzerConfigPath);
sw.WriteLine("is_global = true");
foreach (var f in cshtmls.Select(f => f.Replace('\\', '/')))
foreach (var cshtml in cshtmls)
{
sw.WriteLine($"\n[{f}]");
var base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(f)); // TODO: this should be the relative path of the file.
var adjustedPath = cshtml.Replace('\\', '/');
string? relativePath;
try
{
var csprojFolder = Path.GetDirectoryName(csprojFile);
relativePath = csprojFolder is not null ? Path.GetRelativePath(csprojFolder, cshtml) : cshtml;
relativePath = relativePath.Replace('\\', '/');
}
catch (Exception e)
{
logger.LogWarning($"Failed to get relative path for {cshtml}: {e.Message}");
relativePath = adjustedPath;
}
sw.WriteLine($"\n[{adjustedPath}]");
var base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(relativePath));
sw.WriteLine($"build_metadata.AdditionalFiles.TargetPath = {base64}");
}
}

View File

@@ -1,4 +1,4 @@
| Program.cs |
| Views/Home/Index.cshtml |
| test-db/working/implicitUsings/GlobalUsings.g.cs |
| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/[...]_ql_csharp_ql_integration_tests_all_platforms_cshtml_standalone_test_test_Views_Home_Index_cshtml.g.cs |
| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs |

View File

@@ -1,21 +1,5 @@
import csharp
private string getPath(File f) {
result = f.getRelativePath() and
not exists(result.indexOf("_ql_csharp_ql_integration_tests_all_platforms_cshtml_standalone_"))
or
exists(int index1, int index2, string pattern |
pattern = "Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator" and
index1 = f.getRelativePath().indexOf(pattern) and
index2 =
f.getRelativePath()
.indexOf("_ql_csharp_ql_integration_tests_all_platforms_cshtml_standalone_") and
result =
f.getRelativePath().substring(0, index1 + pattern.length()) + "/[...]" +
f.getRelativePath().substring(index2, f.getRelativePath().length())
)
}
from File f
where f.fromSource() or f.getExtension() = "cshtml"
select getPath(f)
select f.getRelativePath()

View File

@@ -1,4 +1,4 @@
| Program.cs |
| Views/Home/Index.cshtml |
| test-db/working/implicitUsings/GlobalUsings.g.cs |
| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/[...]/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/[...]_ql_csharp_ql_integration_tests_all_platforms_cshtml_standalone_net6_test_test_Views_Home_Index_cshtml.g.cs |
| test-db/working/razor/EC52D77FE9BF67AD10C5C3F248392316/[...]/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Views_Home_Index_cshtml.g.cs |

View File

@@ -2,21 +2,17 @@ import csharp
private string getPath(File f) {
result = f.getRelativePath() and
not exists(result.indexOf("_ql_csharp_ql_integration_tests_all_platforms_cshtml_standalone_"))
not exists(result.indexOf("EC52D77FE9BF67AD10C5C3F248392316"))
or
exists(int index0, int index1, int index2, string pattern0, string pattern1 |
exists(int index0, int index1, string pattern0, string pattern1 |
// TODO: Remove index0 and pattern0. Currently there's some instability in the path depending on which dotnet SDK is being used. (See issue #448)
pattern0 = "EC52D77FE9BF67AD10C5C3F248392316" and
index0 = f.getRelativePath().indexOf(pattern0) and
pattern1 = "Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator" and
index1 = f.getRelativePath().indexOf(pattern1) and
index2 =
f.getRelativePath()
.indexOf("_ql_csharp_ql_integration_tests_all_platforms_cshtml_standalone_") and
result =
f.getRelativePath().substring(0, index0 + pattern0.length()) + "/[...]/" +
f.getRelativePath().substring(index1, index1 + pattern1.length()) + "/[...]" +
f.getRelativePath().substring(index2, f.getRelativePath().length())
f.getRelativePath().substring(index1, f.getRelativePath().length())
)
}