summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-modifier.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-02-02 22:28:02 -0800
committerGitHub <noreply@github.com>2024-02-02 22:28:02 -0800
commit14764896c34b230a5563f48d8b8e565de2f3aa10 (patch)
tree2f105d3f6222103f458054f1cd38e280b6fb52b4 /source/slang/slang-check-modifier.cpp
parentc15e7ade4e27e1649d5b98f5854e9e52bb9e60ae (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.cpp41
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)