From bd815f02d846a50e16dab67e6512db2a6215c41f Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Mon, 21 Jan 2019 16:41:54 -0500 Subject: 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. --- source/slang/diagnostics.cpp | 60 +++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 18 deletions(-) (limited to 'source/slang/diagnostics.cpp') 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) -- cgit v1.2.3