diff options
| author | Yong He <yonghe@outlook.com> | 2024-02-02 22:28:02 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-02 22:28:02 -0800 |
| commit | 14764896c34b230a5563f48d8b8e565de2f3aa10 (patch) | |
| tree | 2f105d3f6222103f458054f1cd38e280b6fb52b4 /source/slang/slang-check-modifier.cpp | |
| parent | c15e7ade4e27e1649d5b98f5854e9e52bb9e60ae (diff) | |
Capability type checking. (#3530)
* Capability type checking.
* Fix.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
| -rw-r--r-- | source/slang/slang-check-modifier.cpp | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 1a7f64944..51cb5346a 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -74,6 +74,30 @@ namespace Slang return false; } + bool SemanticsVisitor::checkCapabilityName(Expr* expr, CapabilityName& outCapabilityName) + { + if (auto varExpr = as<VarExpr>(expr)) + { + if (!varExpr->name) + return false; + if (varExpr->name == getSession()->getCompletionRequestTokenName()) + { + auto& suggestions = getLinkage()->contentAssistInfo.completionSuggestions; + suggestions.clear(); + suggestions.scopeKind = CompletionSuggestions::ScopeKind::Capabilities; + } + outCapabilityName = findCapabilityName(varExpr->name->text.getUnownedSlice()); + if (outCapabilityName == CapabilityName::Invalid) + { + getSink()->diagnose(expr, Diagnostics::unknownCapability, varExpr->name); + return false; + } + return true; + } + getSink()->diagnose(expr, Diagnostics::expectCapability); + return false; + } + void SemanticsVisitor::visitModifier(Modifier*) { // Do nothing with modifiers for now @@ -209,7 +233,7 @@ namespace Slang paramDecl->nameAndLoc = member->nameAndLoc; paramDecl->type = varMember->type; paramDecl->loc = member->loc; - paramDecl->setCheckState(DeclCheckState::Checked); + paramDecl->setCheckState(DeclCheckState::DefinitionChecked); paramDecl->parentDecl = attrDecl; attrDecl->members.add(paramDecl); @@ -233,7 +257,7 @@ namespace Slang // // TODO: what check state is relevant here? // - ensureDecl(attrDecl, DeclCheckState::Checked); + ensureDecl(attrDecl, DeclCheckState::DefinitionChecked); return attrDecl; } @@ -783,6 +807,19 @@ namespace Slang pyExportAttr->name = name; } + else if (auto requireCapAttr = as<RequireCapabilityAttribute>(attr)) + { + List<CapabilityName> capabilityNames; + for (auto& arg : attr->args) + { + CapabilityName capName; + if (checkCapabilityName(arg, capName)) + { + capabilityNames.add(capName); + } + } + requireCapAttr->capabilitySet = CapabilitySet(capabilityNames); + } else { if(attr->args.getCount() == 0) |
