diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2022-08-22 10:08:25 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-22 10:08:25 -0400 |
| commit | 15055d20c143cb398bd3e269541eebf24777390a (patch) | |
| tree | 81f96a53824765fabc1fbb81d2d588476996eaa9 /source/compiler-core/slang-visual-studio-compiler-util.cpp | |
| parent | af70651a4843b16dd24e14b5cedffe399ebeb862 (diff) | |
Replace DownstreamCompileResult with Artifact (#2369)
* #include an absolute path didn't work - because paths were taken to always be relative.
* WIP replacing DownstreamCompileResult.
* First attempt at replacing DownstreamCompileResult with IArtifact and associated types.
* Small renaming around CharSlice.
* ICastable -> ISlangCastable
Added IClonable
Fix issue with cloning in ArtifactDiagnostics.
* Only add the blob if one is defined in DXC.
* Guard adding blob representation.
* Make cloneInterface available across code base.
Set enums backing type for ArtifactDiagnostic.
* Added ::create for ArtifactDiagnostics.
Diffstat (limited to 'source/compiler-core/slang-visual-studio-compiler-util.cpp')
| -rw-r--r-- | source/compiler-core/slang-visual-studio-compiler-util.cpp | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/source/compiler-core/slang-visual-studio-compiler-util.cpp b/source/compiler-core/slang-visual-studio-compiler-util.cpp index 21db9570a..4e703f58f 100644 --- a/source/compiler-core/slang-visual-studio-compiler-util.cpp +++ b/source/compiler-core/slang-visual-studio-compiler-util.cpp @@ -14,6 +14,7 @@ #include "../core/slang-io.h" #include "slang-artifact-desc-util.h" +#include "slang-artifact-diagnostic-util.h" #include "slang-artifact-util.h" namespace Slang @@ -288,21 +289,21 @@ namespace Slang return SLANG_OK; } -static SlangResult _parseSeverity(const UnownedStringSlice& in, DownstreamDiagnostics::Diagnostic::Severity& outSeverity) +static SlangResult _parseSeverity(const UnownedStringSlice& in, ArtifactDiagnostic::Severity& outSeverity) { - typedef DownstreamDiagnostics::Diagnostic::Severity Type; + typedef ArtifactDiagnostic::Severity Severity; if (in == "error" || in == "fatal error") { - outSeverity = Type::Error; + outSeverity = Severity::Error; } else if (in == "warning") { - outSeverity = Type::Warning; + outSeverity = Severity::Warning; } else if (in == "info") { - outSeverity = Type::Info; + outSeverity = Severity::Info; } else { @@ -311,22 +312,22 @@ static SlangResult _parseSeverity(const UnownedStringSlice& in, DownstreamDiagno return SLANG_OK; } -static SlangResult _parseVisualStudioLine(const UnownedStringSlice& line, DownstreamDiagnostics::Diagnostic& outDiagnostic) +static SlangResult _parseVisualStudioLine(CharSliceAllocator& allocator, const UnownedStringSlice& line, ArtifactDiagnostic& outDiagnostic) { - typedef DownstreamDiagnostics::Diagnostic Diagnostic; + typedef IArtifactDiagnostics::Diagnostic Diagnostic; UnownedStringSlice linkPrefix = UnownedStringSlice::fromLiteral("LINK :"); if (line.startsWith(linkPrefix)) { - outDiagnostic.stage = Diagnostic::Stage::Link; - outDiagnostic.severity = Diagnostic::Severity::Info; + outDiagnostic.stage = ArtifactDiagnostic::Stage::Link; + outDiagnostic.severity = ArtifactDiagnostic::Severity::Info; - outDiagnostic.text = UnownedStringSlice(line.begin() + linkPrefix.getLength(), line.end()); + outDiagnostic.text = allocator.allocate(line.begin() + linkPrefix.getLength(), line.end()); return SLANG_OK; } - outDiagnostic.stage = Diagnostic::Stage::Compile; + outDiagnostic.stage = ArtifactDiagnostic::Stage::Compile; const char*const start = line.begin(); const char*const end = line.end(); @@ -385,13 +386,13 @@ static SlangResult _parseVisualStudioLine(const UnownedStringSlice& line, Downst return SLANG_FAIL; } - outDiagnostic.filePath = UnownedStringSlice(start, lineNoStart); - outDiagnostic.fileLine = lineNo; + outDiagnostic.filePath = allocator.allocate(start, lineNoStart); + outDiagnostic.location.line = lineNo; } else { - outDiagnostic.filePath = UnownedStringSlice(start, cur + colonIndex); - outDiagnostic.fileLine = 0; + outDiagnostic.filePath = allocator.allocate(start, cur + colonIndex); + outDiagnostic.location.line = 0; } // Save the remaining text in 'postPath' @@ -417,8 +418,8 @@ static SlangResult _parseVisualStudioLine(const UnownedStringSlice& line, Downst } // Extract the code - outDiagnostic.code = UnownedStringSlice(errorSection.begin() + errorCodeIndex + 1, errorSection.end()); - if (outDiagnostic.code.startsWith(UnownedStringSlice::fromLiteral("LNK"))) + outDiagnostic.code = allocator.allocate(errorSection.begin() + errorCodeIndex + 1, errorSection.end()); + if (asStringSlice(outDiagnostic.code).startsWith(UnownedStringSlice::fromLiteral("LNK"))) { outDiagnostic.stage = Diagnostic::Stage::Link; } @@ -430,16 +431,18 @@ static SlangResult _parseVisualStudioLine(const UnownedStringSlice& line, Downst postError = UnownedStringSlice(postPath.begin() + errorColonIndex + 1, end); } - outDiagnostic.text = postError; + outDiagnostic.text = allocator.allocate(postError); return SLANG_OK; } -/* static */SlangResult VisualStudioCompilerUtil::parseOutput(const ExecuteResult& exeRes, DownstreamDiagnostics& outDiagnostics) +/* static */SlangResult VisualStudioCompilerUtil::parseOutput(const ExecuteResult& exeRes, IArtifactDiagnostics* diagnostics) { - outDiagnostics.reset(); + diagnostics->reset(); - outDiagnostics.rawDiagnostics = exeRes.standardOutput; + diagnostics->setRaw(CharSliceCaster::asTerminatedCharSlice(exeRes.standardOutput)); + + CharSliceAllocator allocator; for (auto line : LineParser(exeRes.standardOutput.getUnownedSlice())) { @@ -448,17 +451,17 @@ static SlangResult _parseVisualStudioLine(const UnownedStringSlice& line, Downst fprintf(stdout, "\n"); #endif - Diagnostic diagnostic; - if (SLANG_SUCCEEDED(_parseVisualStudioLine(line, diagnostic))) + ArtifactDiagnostic diagnostic; + if (SLANG_SUCCEEDED(_parseVisualStudioLine(allocator, line, diagnostic))) { - outDiagnostics.diagnostics.add(diagnostic); + diagnostics->add(diagnostic); } } // if it has a compilation error.. set on output - if (outDiagnostics.has(Diagnostic::Severity::Error)) + if (diagnostics->hasOfAtLeastSeverity(ArtifactDiagnostic::Severity::Error)) { - outDiagnostics.result = SLANG_FAIL; + diagnostics->setResult(SLANG_FAIL); } return SLANG_OK; |
