From ab41d548db376c6b52869004d1b6e21b88b4c9c8 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 6 Feb 2024 16:30:31 -0800 Subject: Improve Capability System (#3555) * Improve capability system. * Update documentation. * Tuning semantics. * LSP: hierarchical diagnostics. * Fix test. * Fix test. --- source/slang/slang-parser.cpp | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-parser.cpp') diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 4b6d9b2d0..45fa5a125 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -3537,6 +3537,28 @@ namespace Slang return fileDecl; } + static NodeBase* parseRequireCapabilityDecl(Parser* parser, void*) + { + auto decl = parser->astBuilder->create(); + parser->FillPosition(decl); + List capNames; + while (parser->LookAheadToken(TokenType::Identifier)) + { + auto capNameToken = parser->ReadToken(TokenType::Identifier); + CapabilityName capName = findCapabilityName(capNameToken.getContent()); + if (capName != CapabilityName::Invalid) + capNames.add(capName); + else + parser->sink->diagnose(capNameToken, Diagnostics::unknownCapability, capNameToken.getContent()); + if (AdvanceIf(parser, "+") || AdvanceIf(parser, ",")) + continue; + break; + } + decl->inferredCapabilityRequirements = CapabilitySet(capNames); + parser->ReadToken(TokenType::Semicolon); + return decl; + } + static NodeBase* parseConstructorDecl(Parser* parser, void* /*userData*/) { ConstructorDecl* decl = parser->astBuilder->create(); @@ -4351,7 +4373,20 @@ namespace Slang Decl* declToModify = decl; if(auto genericDecl = as(decl)) declToModify = genericDecl->inner; - _addModifiers(declToModify, modifiers); + + if (as(decl)) + { + // Modifiers on module declaration should be added to the module itself. + auto moduleDecl = getModuleDecl(containerDecl); + if (moduleDecl) + { + _addModifiers(moduleDecl, modifiers); + } + } + else + { + _addModifiers(declToModify, modifiers); + } if (containerDecl) { @@ -7901,7 +7936,7 @@ namespace Slang _makeParseDecl("__ignored_block", parseIgnoredBlockDecl ), _makeParseDecl("__transparent_block", parseTransparentBlockDecl), _makeParseDecl("__file_decl", parseFileDecl), - + _makeParseDecl("__require_capability", parseRequireCapabilityDecl), // !!!!!!!!!!!!!!!!!!!!!! Modifer !!!!!!!!!!!!!!!!!!!!!! -- cgit v1.2.3