summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ast-print.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2025-07-29 07:35:58 -0700
committerGitHub <noreply@github.com>2025-07-29 14:35:58 +0000
commit855b1a262f3a769d44765e78f94e566d875b9286 (patch)
treeea41db3717f55aa5032b1f04d71729a452ec68b2 /source/slang/slang-ast-print.cpp
parentea6f8551ad38f2bcc32b542fd52ce17f3829cbeb (diff)
[Language Server]: Show signature help on generic parameters. (#7913)
* Show signature help on generic parameters. * Fix. * Update tests. * slang-test: make vvl error go through stderr. * update slang-rhi * Update slang-rhi
Diffstat (limited to 'source/slang/slang-ast-print.cpp')
-rw-r--r--source/slang/slang-ast-print.cpp47
1 files changed, 30 insertions, 17 deletions
diff --git a/source/slang/slang-ast-print.cpp b/source/slang/slang-ast-print.cpp
index ee747a4c2..1f7478662 100644
--- a/source/slang/slang-ast-print.cpp
+++ b/source/slang/slang-ast-print.cpp
@@ -1313,12 +1313,34 @@ void ASTPrinter::_addDeclPathRec(const DeclRef<Decl>& declRef, Index depth)
else if (depth > 0)
{
// Write out the generic parameters (only if the depth allows it)
- addGenericParams(parentGenericDeclRef);
+ addGenericParams(parentGenericDeclRef, nullptr);
}
}
}
-void ASTPrinter::addGenericParams(const DeclRef<GenericDecl>& genericDeclRef)
+struct ParamScope
+{
+ StringBuilder* sb;
+ List<Range<Index>>* paramRanges;
+ Index rangeStart;
+ ParamScope(StringBuilder* inSb, List<Range<Index>>* outParamRanges)
+ : sb(inSb), paramRanges(outParamRanges)
+ {
+ rangeStart = sb->getLength();
+ }
+ ~ParamScope()
+ {
+ if (paramRanges)
+ {
+ Index rangeEnd = sb->getLength();
+ paramRanges->add(makeRange<Index>(rangeStart, rangeEnd));
+ }
+ }
+};
+
+void ASTPrinter::addGenericParams(
+ const DeclRef<GenericDecl>& genericDeclRef,
+ List<Range<Index>>* outParamRanges)
{
auto& sb = m_builder;
@@ -1331,7 +1353,7 @@ void ASTPrinter::addGenericParams(const DeclRef<GenericDecl>& genericDeclRef)
if (!first)
sb << ", ";
first = false;
-
+ ParamScope paramScope(&sb, outParamRanges);
{
ScopePart scopePart(this, Part::Type::GenericParamType);
sb << getText(genericTypeParam.getName());
@@ -1342,7 +1364,7 @@ void ASTPrinter::addGenericParams(const DeclRef<GenericDecl>& genericDeclRef)
if (!first)
sb << ", ";
first = false;
-
+ ParamScope paramScope(&sb, outParamRanges);
{
ScopePart scopePart(this, Part::Type::GenericParamValueType);
addType(getType(m_astBuilder, genericValParam));
@@ -1358,6 +1380,7 @@ void ASTPrinter::addGenericParams(const DeclRef<GenericDecl>& genericDeclRef)
if (!first)
sb << ", ";
first = false;
+ ParamScope paramScope(&sb, outParamRanges);
{
ScopePart scopePart(this, Part::Type::GenericParamType);
sb << "each ";
@@ -1383,8 +1406,6 @@ void ASTPrinter::addDeclParams(const DeclRef<Decl>& declRef, List<Range<Index>>*
bool first = true;
for (auto paramDeclRef : getParameters(m_astBuilder, funcDeclRef))
{
- auto rangeStart = sb.getLength();
-
ParamDecl* paramDecl = paramDeclRef.getDecl();
auto paramType = getType(m_astBuilder, paramDeclRef);
@@ -1393,9 +1414,10 @@ void ASTPrinter::addDeclParams(const DeclRef<Decl>& declRef, List<Range<Index>>*
if (!first)
{
sb << ", ";
- rangeStart += 2;
}
+ ParamScope paramScope(&sb, outParamRange);
+
// Type part.
{
ScopePart scopePart(this, Part::Type::ParamType);
@@ -1442,11 +1464,6 @@ void ASTPrinter::addDeclParams(const DeclRef<Decl>& declRef, List<Range<Index>>*
sb << " = ";
addExpr(paramDecl->initExpr);
}
-
- auto rangeEnd = sb.getLength();
-
- if (outParamRange)
- outParamRange->add(makeRange<Index>(rangeStart, rangeEnd));
first = false;
};
if (auto typePack = as<ConcreteTypePack>(paramType))
@@ -1467,11 +1484,7 @@ void ASTPrinter::addDeclParams(const DeclRef<Decl>& declRef, List<Range<Index>>*
}
else if (auto genericDeclRef = declRef.as<GenericDecl>())
{
- addGenericParams(genericDeclRef);
-
- addDeclParams(
- m_astBuilder->getMemberDeclRef(genericDeclRef, genericDeclRef.getDecl()->inner),
- outParamRange);
+ addGenericParams(genericDeclRef, outParamRange);
}
else
{