summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-json-source-map-util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-json-source-map-util.cpp')
-rw-r--r--source/compiler-core/slang-json-source-map-util.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/source/compiler-core/slang-json-source-map-util.cpp b/source/compiler-core/slang-json-source-map-util.cpp
index 3929a3387..4ef6ee3d6 100644
--- a/source/compiler-core/slang-json-source-map-util.cpp
+++ b/source/compiler-core/slang-json-source-map-util.cpp
@@ -3,6 +3,7 @@
#include "../../slang-com-helper.h"
#include "../core/slang-string-util.h"
+#include "../core/slang-blob.h"
#include "slang-json-native.h"
@@ -454,6 +455,11 @@ SlangResult JSONSourceMapUtil::encode(SourceMap* sourceMap, JSONContainer* conta
return SLANG_OK;
}
+/* static */SlangResult JSONSourceMapUtil::read(ISlangBlob* blob, RefPtr<SourceMap>& outSourceMap)
+{
+ return read(blob, nullptr, outSourceMap);
+}
+
SlangResult JSONSourceMapUtil::read(ISlangBlob* blob, DiagnosticSink* parentSink, RefPtr<SourceMap>& outSourceMap)
{
SourceManager sourceManager;
@@ -489,4 +495,41 @@ SlangResult JSONSourceMapUtil::read(ISlangBlob* blob, DiagnosticSink* parentSink
return SLANG_OK;
}
+
+/* static */SlangResult JSONSourceMapUtil::write(SourceMap* sourceMap, ComPtr<ISlangBlob>& outBlob)
+{
+ SourceManager sourceMapSourceManager;
+ sourceMapSourceManager.initialize(nullptr, nullptr);
+
+ // Create a sink
+ DiagnosticSink sourceMapSink(&sourceMapSourceManager, nullptr);
+
+ SLANG_RETURN_ON_FAIL(write(sourceMap, &sourceMapSink, outBlob));
+ return SLANG_OK;
+}
+
+/* static */ SlangResult JSONSourceMapUtil::write(SourceMap* sourceMap, DiagnosticSink* sink, ComPtr<ISlangBlob>& outBlob)
+{
+ auto sourceManager = sink->getSourceManager();
+
+ // Write it out
+ String json;
+ {
+ RefPtr<JSONContainer> jsonContainer(new JSONContainer(sourceManager));
+
+ JSONValue jsonValue;
+
+ SLANG_RETURN_ON_FAIL(JSONSourceMapUtil::encode(sourceMap, jsonContainer, sink, jsonValue));
+
+ // Convert into a string
+ JSONWriter writer(JSONWriter::IndentationStyle::Allman);
+ jsonContainer->traverseRecursively(jsonValue, &writer);
+
+ json = writer.getBuilder();
+ }
+
+ outBlob = StringBlob::moveCreate(json);
+ return SLANG_OK;
+}
+
} // namespace Slang