summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-diagnostics.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-11-11 09:56:50 -0500
committerGitHub <noreply@github.com>2020-11-11 09:56:50 -0500
commit8f0895e0f8257da2fd10b6325931627a9a1792ba (patch)
tree448c221583fe160df70a2e90fd2c8b80b82634b6 /source/slang/slang-diagnostics.cpp
parent7bcc2b15c8be4aebc6b9b8f05af6db7a451b228b (diff)
Include hierarchy output (#1595)
* #include an absolute path didn't work - because paths were taken to always be relative. * Improve diagnostic for token pasting. * Token paste location test. * Output include hierarchy. * WIP on includes hierarchy. * Improved include hierarchy output - to handle source files without tokens. Improved test case. * Small comment improvements. Fixed a typo with not returning a reference. * Slight simplification of the ViewInitiatingHierarchy, by adding GetOrAddValue to Dictionary. * Remove the need for ViewInitiatingHierarchy type. * Improve output of path in diagnostic for includes hierarchy. * Remove comment in diagnostic for token-paste-location.slang * Update command line docs to include `-output-includes` Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-diagnostics.cpp')
-rw-r--r--source/slang/slang-diagnostics.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/source/slang/slang-diagnostics.cpp b/source/slang/slang-diagnostics.cpp
index c3b7e27a2..04ada6fc4 100644
--- a/source/slang/slang-diagnostics.cpp
+++ b/source/slang/slang-diagnostics.cpp
@@ -177,6 +177,42 @@ static void formatDiagnostic(
humaneLoc = sourceView->getHumaneLoc(sourceLoc);
}
formatDiagnostic(humaneLoc, diagnostic, sb);
+
+ {
+ SourceView* currentView = sourceView;
+
+ while (currentView && currentView->getInitiatingSourceLoc().isValid() && currentView->getSourceFile()->getPathInfo().type == PathInfo::Type::TokenPaste)
+ {
+ SourceView* initiatingView = sourceManager->findSourceView(currentView->getInitiatingSourceLoc());
+ if (initiatingView == nullptr)
+ {
+ break;
+ }
+
+ const DiagnosticInfo& diagnosticInfo = Diagnostics::seeTokenPasteLocation;
+
+ // Turn the message format into a message. For the moment it assumes no parameters.
+ StringBuilder msg;
+ formatDiagnosticMessage(msg, diagnosticInfo.messageFormat, 0, nullptr);
+
+ // Set up the diagnostic.
+ Diagnostic initiationDiagnostic;
+ initiationDiagnostic.ErrorID = diagnosticInfo.id;
+ initiationDiagnostic.Message = msg.ProduceString();
+ initiationDiagnostic.loc = sourceView->getInitiatingSourceLoc();
+ initiationDiagnostic.severity = diagnosticInfo.severity;
+
+ // TODO(JS):
+ // Not 100% clear what the best sourceLoc type is most useful here - we will go with default for now
+ HumaneSourceLoc pasteHumaneLoc = initiatingView->getHumaneLoc(sourceView->getInitiatingSourceLoc());
+
+ // Okay we should output where the token paste took place
+ formatDiagnostic(pasteHumaneLoc, initiationDiagnostic, sb);
+
+ // Make the initiatingView the current view
+ currentView = initiatingView;
+ }
+ }
}
if (sourceView && sink->isFlagSet(DiagnosticSink::Flag::VerbosePath))