summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-source-loc.cpp
diff options
context:
space:
mode:
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