diff options
| author | Yong He <yonghe@outlook.com> | 2023-05-03 16:17:04 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-03 16:17:04 -0700 |
| commit | bf2b05528d6edbbf1beb87552f447d29f92eee47 (patch) | |
| tree | 06c837c75e72b7bbd86dc713d9d830d13505c4ee | |
| parent | d87dd1dcfd0f13a6be1a2096d654f4d62044ad48 (diff) | |
Improve intellisense for attribute arguments. (#2864)
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 57b97d18b..3fd7bee7a 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -1017,10 +1017,18 @@ namespace Slang { // For completion requests, we skip all funtion bodies except for the one // that the current cursor is in. + auto startingLine = humaneLoc.line; + for (auto modifier : funcDecl->modifiers) + { + auto modifierLoc = getLinkage()->getSourceManager()->getHumaneLoc( + modifier->loc, SourceLocType::Actual); + if (modifierLoc.line < startingLine) + startingLine = modifierLoc.line; + } auto closingLoc = getLinkage()->getSourceManager()->getHumaneLoc( funcDecl->closingSourceLoc, SourceLocType::Actual); - if (assistInfo.cursorLine < humaneLoc.line || + if (assistInfo.cursorLine < startingLine || assistInfo.cursorLine > closingLoc.line) return true; } @@ -1906,7 +1914,6 @@ namespace Slang DeclCheckState::ModifiersChecked, DeclCheckState::ReadyForReference, DeclCheckState::ReadyForLookup, - DeclCheckState::ReadyForLookup, DeclCheckState::Checked }; for(auto s : states) @@ -6921,9 +6928,13 @@ namespace Slang auto ctx = visitor->withExprLocalScope(&scope); auto subVisitor = SemanticsVisitor(ctx); auto checkedFuncExpr = visitor->dispatchExpr(attr->funcExpr, ctx); + attr->funcExpr = checkedFuncExpr; + if (attr->args.getCount()) + attr->args[0] = attr->funcExpr; if (auto declRefExpr = as<DeclRefExpr>(checkedFuncExpr)) { - visitor->ensureDecl(declRefExpr->declRef, DeclCheckState::TypesFullyResolved); + if (declRefExpr->declRef) + visitor->ensureDecl(declRefExpr->declRef, DeclCheckState::TypesFullyResolved); } else if (auto overloadedExpr = as<OverloadedExpr>(checkedFuncExpr)) { @@ -6945,10 +6956,12 @@ namespace Slang if (auto calleeDeclRef = as<DeclRefExpr>(resolvedInvoke->functionExpr)) { attr->funcExpr = calleeDeclRef; + if (attr->args.getCount()) + attr->args[0] = attr->funcExpr; return; } } - + visitor->getSink()->diagnose(attr, Diagnostics::invalidCustomDerivative); } @@ -7082,7 +7095,8 @@ namespace Slang DeclRefExpr* calleeDeclRefExpr = nullptr; HigherOrderInvokeExpr* higherOrderFuncExpr = visitor->getASTBuilder()->create<TDifferentiateExpr>(); higherOrderFuncExpr->baseFunction = derivativeOfAttr->funcExpr; - higherOrderFuncExpr->loc = derivativeOfAttr->loc; + if (derivativeOfAttr->args.getCount() > 0) + higherOrderFuncExpr->loc = derivativeOfAttr->args[0]->loc; Expr* checkedHigherOrderFuncExpr = visitor->dispatchExpr(higherOrderFuncExpr, visitor->allowStaticReferenceToNonStaticMember()); if (!checkedHigherOrderFuncExpr) { @@ -7107,6 +7121,11 @@ namespace Slang visitor->getSink()->diagnose(derivativeOfAttr, Diagnostics::cannotResolveOriginalFunctionForDerivative); return; } + + calleeDeclRefExpr->loc = higherOrderFuncExpr->loc; + if (derivativeOfAttr->args.getCount() > 0) + derivativeOfAttr->args[0] = calleeDeclRefExpr; + calleeDeclRef = calleeDeclRefExpr->declRef; auto calleeFunc = as<FunctionDeclBase>(calleeDeclRef.getDecl()); |
