summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-source-loc.cpp
diff options
context:
space:
mode:
authorRonan <ro.cailleau@gmail.com>2025-04-25 00:48:37 +0200
committerGitHub <noreply@github.com>2025-04-24 15:48:37 -0700
commit5f632cd204b7a85f3a97b6c316c5a34f9fc8193e (patch)
tree7dc74fbe8c80870a4c485bbaa5765ff379914779 /source/compiler-core/slang-source-loc.cpp
parentc7ecf3039d2cc8680f1ea5f4bee2d13521ae34f7 (diff)
Implemented #pragma warning (#6748)
* Implemented #pragma warning Based on https://learn.microsoft.com/en-us/cpp/preprocessor/warning?view=msvc-170 * Make #pragma warning work with #includes. - SourceLoc are not sorted by inclusion order. - Construct a mapping from SourceLoc to "absolute locations" that are sorted by inclusion order (roughly represents a location in a raw file with all #include resolved). - The absolute location can be used in the pragma warning timeline * Added preprocessor #pragma warning tests. - Fixed #pragma warning (push / pop) SourceLoc - Fixed unused directiveLoc in #pragma warning parsing * #pragma warning: Added some comments and fixed some typos * Cleaned #pragma warning preprocessor implementation. --------- Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/compiler-core/slang-source-loc.cpp')
-rw-r--r--source/compiler-core/slang-source-loc.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/source/compiler-core/slang-source-loc.cpp b/source/compiler-core/slang-source-loc.cpp
index 5058a1522..cfde5f1da 100644
--- a/source/compiler-core/slang-source-loc.cpp
+++ b/source/compiler-core/slang-source-loc.cpp
@@ -1018,4 +1018,44 @@ PathInfo SourceManager::getPathInfo(SourceLoc loc, SourceLocType type)
}
}
+SourceLoc::RawValue SourceView::getAbsoluteLocation(SourceLoc location) const
+{
+ AbsoluteSegment segment;
+ if (m_absSegments.getCount())
+ {
+ if (m_absSegments.getFirst().begin > location)
+ {
+ segment.begin = m_range.begin;
+ segment.absoluteBegin = m_absoluteLocationBase;
+ }
+ else
+ {
+ auto it = std::upper_bound(
+ m_absSegments.begin(),
+ m_absSegments.end(),
+ location,
+ [](SourceLoc const& loc, AbsoluteSegment const& seg)
+ { return loc < seg.begin; }) -
+ 1;
+ segment = *it;
+ }
+ }
+ else
+ {
+ segment = getLastSegment();
+ }
+ auto offset = SourceRange(segment.begin, location).getSize();
+ return segment.absoluteBegin + offset;
+}
+
+SourceLoc::RawValue SourceManager::getAbsoluteLocation(SourceLoc location) const
+{
+ SourceLoc::RawValue res = 0;
+ if (const SourceView* view = findSourceView(location))
+ {
+ res = view->getAbsoluteLocation(location);
+ }
+ return res;
+}
+
} // namespace Slang