summaryrefslogtreecommitdiffstats
path: root/source/slang/diagnostics.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-01-21 16:41:54 -0500
committerGitHub <noreply@github.com>2019-01-21 16:41:54 -0500
commitbd815f02d846a50e16dab67e6512db2a6215c41f (patch)
tree01e391757bdb8f2d15bdc010227d522bddac3936 /source/slang/diagnostics.cpp
parent0a3ef7b4ae02983ea3f986ba8211e7c6af9d254b (diff)
Feature/file unique identity (#789)
* * Fix memory bug around expanding va_args - needed buffer to have space for terminating 0 * Fix problem with FileWriter defaults being globals, as memory they allocate, will only be freed after return from main - work around by making StdWriters RefObject derived, and kept in scope such the writers are destroyed before checks for leaks is found * Added SimplifyPathAndHash mode for CacheFileSystem - will simplify the path and see if simplified path is in cache before reading file (limiting amout of underlying file requests) * * Added calcReplaceChar * Renamed DefaultFileSystem to OSFileSystem * Made OSFileSystem convert windows \ to / on linux * Simplified logic for caching in CacheFileSystem. * Added pragma-once-c to add extra test, but also so there is an 'include' directory in preprocessor tests. * Small fixes in pragma once test. * Simplified cache handling path, so that paths/simplified paths area always added. * Improve naming of methods for different caches. * Removed references to 'canonicalPath' and made 'uniqueIdentity' * * Re-add support for canonicalPath to ISlangFileSystem -> not for uniqueIdentifier but as a way to display 'canonicalPath' * Added peliminary support for being able to display verbose paths in a diagnostic * Added 'clearCache' support * Added verbose path support to SourceManager (now needs a ISlangFileSystemExt to do this) * Added support for '-verbose-path' option to slangc and slang-test.
Diffstat (limited to 'source/slang/diagnostics.cpp')
-rw-r--r--source/slang/diagnostics.cpp60
1 files changed, 42 insertions, 18 deletions
diff --git a/source/slang/diagnostics.cpp b/source/slang/diagnostics.cpp
index 9a88c041d..00205fed3 100644
--- a/source/slang/diagnostics.cpp
+++ b/source/slang/diagnostics.cpp
@@ -199,30 +199,54 @@ static void formatDiagnosticMessage(StringBuilder& sb, char const* format, int a
}
}
+static void formatDiagnostic(const HumaneSourceLoc& humaneLoc, Diagnostic const& diagnostic, StringBuilder& outBuilder)
+{
+ outBuilder << humaneLoc.pathInfo.foundPath;
+ outBuilder << "(";
+ outBuilder << Int32(humaneLoc.line);
+ outBuilder << "): ";
+
+ outBuilder << getSeverityName(diagnostic.severity);
+
+ if (diagnostic.ErrorID >= 0)
+ {
+ outBuilder << " ";
+ outBuilder << diagnostic.ErrorID;
+ }
+
+ outBuilder << ": ";
+ outBuilder << diagnostic.Message;
+ outBuilder << "\n";
+}
+
static void formatDiagnostic(
DiagnosticSink* sink,
- StringBuilder& sb,
- Diagnostic const& diagnostic)
+ Diagnostic const& diagnostic,
+ StringBuilder& sb)
{
auto sourceManager = sink->sourceManager;
- auto humaneLoc = sourceManager->getHumaneLoc(diagnostic.loc);
-
- sb << humaneLoc.pathInfo.foundPath;
- sb << "(";
- sb << Int32(humaneLoc.line);
- sb << "): ";
- sb << getSeverityName(diagnostic.severity);
-
- if( diagnostic.ErrorID >= 0 )
+ SourceView* sourceView = nullptr;
+ HumaneSourceLoc humaneLoc;
+ const auto sourceLoc = diagnostic.loc;
{
- sb << " ";
- sb << diagnostic.ErrorID;
+ sourceView = sourceManager->findSourceViewRecursively(sourceLoc);
+ if (sourceView)
+ {
+ humaneLoc = sourceView->getHumaneLoc(sourceLoc);
+ }
+ formatDiagnostic(humaneLoc, diagnostic, sb);
}
+
+ if (sourceView && (sink->flags & DiagnosticSink::Flag::VerbosePath))
+ {
+ auto actualLoc = sourceView->getHumaneLoc(diagnostic.loc, SourceLocType::Actual);
+ // Look up the full path
+ SourceFile* sourceFile = sourceView->getSourceFile();
+ actualLoc.pathInfo.foundPath = sourceFile->calcVerbosePath();
- sb << ": ";
- sb << diagnostic.Message;
- sb << "\n";
+ formatDiagnostic(actualLoc, diagnostic, sb);
+ }
}
void DiagnosticSink::diagnoseImpl(SourceLoc const& pos, DiagnosticInfo const& info, int argCount, DiagnosticArg const* const* args)
@@ -246,7 +270,7 @@ void DiagnosticSink::diagnoseImpl(SourceLoc const& pos, DiagnosticInfo const& in
{
// If so, pass the error string along to them
StringBuilder messageBuilder;
- formatDiagnostic(this, messageBuilder, diagnostic);
+ formatDiagnostic(this, diagnostic, messageBuilder);
writer->write(messageBuilder.Buffer(), messageBuilder.Length());
}
@@ -254,7 +278,7 @@ void DiagnosticSink::diagnoseImpl(SourceLoc const& pos, DiagnosticInfo const& in
{
// If the user doesn't have a callback, then just
// collect our diagnostic messages into a buffer
- formatDiagnostic(this, outputBuffer, diagnostic);
+ formatDiagnostic(this, diagnostic, outputBuffer);
}
if (diagnostic.severity >= Severity::Fatal)