diff options
| author | Yong He <yonghe@outlook.com> | 2025-05-29 08:05:57 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-29 08:05:57 -0700 |
| commit | faf042ecc3e688a1a3ffbe1ac44d18dd7ddf441a (patch) | |
| tree | b54abb2e65b7791d74335ead396cf762f805ab5c /source/slang/slang-preprocessor.cpp | |
| parent | 45d794f57d453a5564a7360400c5bfc04bf12b31 (diff) | |
Language version + tuple syntax. (#7230)
* Language version + tuple syntax.
* Fix compile error.
* regenerate documentation Table of Contents
* Fix.
* regenerate command line reference
* Fix.
* Fix.
* Fix more test failures.
* revert empty line change,
* Retrigger CI
* #version->#lang
* Update source/core/slang-type-text-util.cpp
Co-authored-by: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com>
* Remove comments.
* Fix parsing logic.
* Fix parser.
* Fix parser.
* update test comment
* Update options.
* regenerate documentation Table of Contents
* regenerate command line reference
---------
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Co-authored-by: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com>
Diffstat (limited to 'source/slang/slang-preprocessor.cpp')
| -rw-r--r-- | source/slang/slang-preprocessor.cpp | 90 |
1 files changed, 84 insertions, 6 deletions
diff --git a/source/slang/slang-preprocessor.cpp b/source/slang/slang-preprocessor.cpp index 3f120d5eb..b29fa2716 100644 --- a/source/slang/slang-preprocessor.cpp +++ b/source/slang/slang-preprocessor.cpp @@ -1305,6 +1305,8 @@ struct Preprocessor /// Detected source language. SourceLanguage language = SourceLanguage::Unknown; + SlangLanguageVersion languageVersion = SLANG_LANGUAGE_VERSION_UNKNOWN; + /// Stores macro definition and invocation info for language server. PreprocessorContentAssistInfo* contentAssistInfo = nullptr; @@ -4360,7 +4362,7 @@ static void HandleExtensionDirective(PreprocessorDirectiveContext* context) static void HandleVersionDirective(PreprocessorDirectiveContext* context) { - [[maybe_unused]] int version; + int version = SLANG_LANGUAGE_VERSION_UNKNOWN; switch (PeekTokenType(context)) { case TokenType::IntegerLiteral: @@ -4374,8 +4376,78 @@ static void HandleVersionDirective(PreprocessorDirectiveContext* context) } SkipToEndOfLine(context); - context->m_preprocessor->language = SourceLanguage::GLSL; - // TODO, just skip the version for now + + if (isValidGLSLVersion(version)) + { + context->m_preprocessor->language = SourceLanguage::GLSL; + } + else + { + GetSink(context)->diagnose( + GetDirectiveLoc(context), + Diagnostics::unknownLanguageVersion, + version); + } + context->m_preprocessor->languageVersion = (SlangLanguageVersion)version; +} + +static void HandleLanguageDirective(PreprocessorDirectiveContext* context) +{ + int version = SLANG_LANGUAGE_VERSION_UNKNOWN; + switch (PeekTokenType(context)) + { + case TokenType::IntegerLiteral: + version = stringToInt(AdvanceToken(context).getContent()); + break; + case TokenType::Identifier: + { + auto token = AdvanceToken(context); + if (token.getContent().caseInsensitiveEquals(toSlice("slang"))) + { + context->m_preprocessor->language = SourceLanguage::Slang; + token = AdvanceToken(context); + } + else if (token.getContent() == "glsl") + { + context->m_preprocessor->language = SourceLanguage::GLSL; + token = AdvanceToken(context); + } + if (token.getContent() == "latest") + version = SLANG_LANGUAGE_VERSION_LATEST; + else if (token.getContent() == "legacy") + version = SLANG_LANGUAGE_VERSION_LEGACY; + else if (token.type == TokenType::IntegerLiteral) + version = stringToInt(token.getContent()); + else + { + GetSink(context)->diagnose( + GetDirectiveLoc(context), + Diagnostics::unknownLanguage, + token); + } + } + break; + default: + GetSink(context)->diagnose( + GetDirectiveLoc(context), + Diagnostics::expectedIntegralVersionNumber); + break; + } + + SkipToEndOfLine(context); + + if (isValidSlangLanguageVersion((SlangLanguageVersion)version)) + { + context->m_preprocessor->language = SourceLanguage::Slang; + } + else + { + GetSink(context)->diagnose( + GetDirectiveLoc(context), + Diagnostics::unknownLanguageVersion, + version); + } + context->m_preprocessor->languageVersion = (SlangLanguageVersion)version; } // Handle an invalid directive @@ -4434,6 +4506,9 @@ static const PreprocessorDirective kDirectives[] = { {"line", &HandleLineDirective, 0}, {"pragma", &HandlePragmaDirective, 0}, + {"language", &HandleLanguageDirective, 0}, + {"lang", &HandleLanguageDirective, 0}, + // GLSL {"version", &HandleVersionDirective, 0}, {"extension", &HandleExtensionDirective, 0}, @@ -4783,6 +4858,7 @@ TokenList preprocessSource( Dictionary<String, String> const& defines, Linkage* linkage, SourceLanguage& outDetectedLanguage, + SlangLanguageVersion& outLanguageVersion, PreprocessorHandler* handler) { PreprocessorDesc desc; @@ -4806,13 +4882,14 @@ TokenList preprocessSource( new preprocessor::WarningStateTracker(desc.sourceManager); desc.sink->setSourceWarningStateTracker(wst); - return preprocessSource(file, desc, outDetectedLanguage); + return preprocessSource(file, desc, outDetectedLanguage, outLanguageVersion); } TokenList preprocessSource( SourceFile* file, PreprocessorDesc const& desc, - SourceLanguage& outDetectedLanguage) + SourceLanguage& outDetectedLanguage, + SlangLanguageVersion& outLanguageVersion) { using namespace preprocessor; @@ -4908,7 +4985,8 @@ TokenList preprocessSource( #endif outDetectedLanguage = preprocessor.language; - + if (preprocessor.languageVersion != SLANG_LANGUAGE_VERSION_UNKNOWN) + outLanguageVersion = preprocessor.languageVersion; return tokens; } |
