summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-lexer.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-lexer.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-lexer.cpp')
-rw-r--r--source/compiler-core/slang-lexer.cpp37
1 files changed, 35 insertions, 2 deletions
diff --git a/source/compiler-core/slang-lexer.cpp b/source/compiler-core/slang-lexer.cpp
index 048c266ca..c2ee5cd69 100644
--- a/source/compiler-core/slang-lexer.cpp
+++ b/source/compiler-core/slang-lexer.cpp
@@ -374,9 +374,14 @@ static void _lexIdentifier(Lexer* lexer)
}
}
-static SourceLoc _getSourceLoc(Lexer* lexer)
+static SourceLoc _getSourceLoc(const Lexer& lexer, const char* it)
{
- return lexer->m_startLoc + (lexer->m_cursor - lexer->m_begin);
+ return lexer.m_startLoc + (it - lexer.m_begin);
+}
+
+static SourceLoc _getSourceLoc(const Lexer* lexer)
+{
+ return _getSourceLoc(*lexer, lexer->m_cursor);
}
static void _lexDigits(Lexer* lexer, int base)
@@ -1857,4 +1862,32 @@ TokenList Lexer::lexAllTokens()
return UnownedStringSlice(in.begin() + offset, in.begin() + offset + tok.charsCount);
}
+SourceLoc Lexer::findNextLineEnd(SourceLoc from, UInt& lineCount) const
+{
+ const char* it = m_begin + (from.getRaw() - m_startLoc.getRaw());
+ if (it >= m_begin && it < m_end)
+ {
+ while (it != m_end)
+ {
+ const char c = *it;
+ if (c == '\n' || c == '\r')
+ {
+ const char next = ((it + 1) == m_end) ? char(kEOF) : *(it + 1);
+ if ((next ^ c) == ('\n' ^ '\r'))
+ {
+ ++it;
+ }
+ --lineCount;
+ if (lineCount == 0)
+ {
+ SourceLoc res = _getSourceLoc(*this, it);
+ return res;
+ }
+ }
+ ++it;
+ }
+ }
+ return {};
+}
+
} // namespace Slang