diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2023-03-17 11:05:15 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-17 11:05:15 -0400 |
| commit | 8a61b9dd0ca729df894dad4c89c6ce3bf39ef0be (patch) | |
| tree | b7f3da5d30772ba1497f14cdeb39935225183bbb /source/slang/slang-emit.cpp | |
| parent | 9476d4543f4336a66308e55f722b0b0b2bd69dd2 (diff) | |
Support for producing SourceMap on emit (#2707)
* #include an absolute path didn't work - because paths were taken to always be relative.
* WIP source map.
* Split out handling of RttiTypeFuncs to a map type.
* Make RttiTypeFuncsMap hold default impls.
* Slightly more sophisticated RttiTypeFuncsMap
* Source map decoding.
* Fix tabs.
* Fix asserts due to negative values.
* Use less obscure mechanisms in SourceMap.
* Source map decoding.
Simplifying SourceMap usage.
* First attempt at ouputting a source map as part of emit.
* Added support for -source-map option. SourceMap is added to the artifact.
Diffstat (limited to 'source/slang/slang-emit.cpp')
| -rw-r--r-- | source/slang/slang-emit.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index a25fae5ae..335e95c9e 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -935,7 +935,15 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr lineDirectiveMode = LineDirectiveMode::GLSL; } - SourceWriter sourceWriter(sourceManager, lineDirectiveMode ); + RefPtr<SourceMap> sourceMap; + + // If SourceMap is enabled, we create one and associate it with the sourceWriter + if (targetRequest->getLinkage()->m_generateSourceMap) + { + sourceMap = new SourceMap; + } + + SourceWriter sourceWriter(sourceManager, lineDirectiveMode, sourceMap ); CLikeSourceEmitter::Desc desc; @@ -1096,6 +1104,34 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr artifact->addAssociated(metadata); } + if (sourceMap) + { + SourceManager sourceMapSourceManager; + sourceMapSourceManager.initialize(nullptr, nullptr); + + // Create a sink + DiagnosticSink sourceMapSink(&sourceMapSourceManager, nullptr); + + // Turn into JSON + RefPtr<JSONContainer> jsonContainer(new JSONContainer(&sourceMapSourceManager)); + + JSONValue jsonValue; + SLANG_RETURN_ON_FAIL(sourceMap->encode(jsonContainer, &sourceMapSink, jsonValue)); + + // Okay now convert this into a text file and then a blob + + // Convert into a string + JSONWriter writer(JSONWriter::IndentationStyle::KNR); + jsonContainer->traverseRecursively(jsonValue, &writer); + + auto sourceMapBlob = StringBlob::moveCreate(writer.getBuilder()); + + auto sourceMapArtifact = ArtifactUtil::createArtifact(ArtifactDesc::make(ArtifactKind::Text, ArtifactPayload::SourceMap, ArtifactStyle::None)); + sourceMapArtifact->addRepresentationUnknown(sourceMapBlob); + + artifact->addAssociated(sourceMapArtifact); + } + outArtifact.swap(artifact); return SLANG_OK; } |
