diff options
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) |
