summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-language-server.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-04-01 15:56:02 -0700
committerGitHub <noreply@github.com>2024-04-01 15:56:02 -0700
commit2c4f9810327d58023e9ec44f579cd78adf56317b (patch)
treeb5498a74bd7d01fd2e4c321a0d2e551d5f024d6d /source/slang/slang-language-server.cpp
parent65ac9f3a9ddcb8bcfc099ffb29beaa9a92ba1f53 (diff)
Allow bit operators on enum types. (#3862)
* Allow bit operators on enum types. * Fix.
Diffstat (limited to 'source/slang/slang-language-server.cpp')
-rw-r--r--source/slang/slang-language-server.cpp77
1 files changed, 44 insertions, 33 deletions
diff --git a/source/slang/slang-language-server.cpp b/source/slang/slang-language-server.cpp
index 9cfef50a0..8f71666dd 100644
--- a/source/slang/slang-language-server.cpp
+++ b/source/slang/slang-language-server.cpp
@@ -291,51 +291,62 @@ String getDeclSignatureString(DeclRef<Decl> declRef, WorkspaceVersion* version)
ASTPrinter::OptionFlag::SimplifiedBuiltinType);
printer.getStringBuilder() << getDeclKindString(declRef);
printer.addDeclSignature(declRef);
- if (auto varDecl = as<VarDeclBase>(declRef.getDecl()))
- {
- auto& sb = printer.getStringBuilder();
- if (!varDecl->findModifier<ConstModifier>() && !as<LetDecl>(declRef.getDecl()))
- return printer.getString();
-
- if (auto litExpr = as<LiteralExpr>(varDecl->initExpr))
- {
- sb << " = " << litExpr->token.getContent();
- }
- else if (auto isTypeDecl = as<IsTypeExpr>(varDecl->initExpr))
+ auto printInitExpr = [&](Module* module, Type* declType, Expr* initExpr)
{
- if (isTypeDecl->constantVal)
+ auto& sb = printer.getStringBuilder();
+
+ if (auto litExpr = as<LiteralExpr>(initExpr))
{
- sb << " = " << (isTypeDecl->constantVal->value ? "true" : "false");
+ if (litExpr->token.type != TokenType::Unknown)
+ sb << " = " << litExpr->token.getContent();
+ else if (auto intLit = as<IntegerLiteralExpr>(litExpr))
+ sb << " = " << intLit->value;
}
- }
- else if (varDecl->initExpr)
- {
- DiagnosticSink sink;
- SharedSemanticsContext semanticContext(version->linkage, getModule(varDecl), &sink);
- SemanticsVisitor semanticsVisitor(&semanticContext);
- if (auto intVal = semanticsVisitor.tryFoldIntegerConstantExpression(
- declRef.substitute(version->linkage->getASTBuilder(), varDecl->initExpr),
- SemanticsVisitor::ConstantFoldingKind::LinkTime, nullptr))
+ else if (auto isTypeDecl = as<IsTypeExpr>(initExpr))
{
- if (auto constantInt = as<ConstantIntVal>(intVal))
+ if (isTypeDecl->constantVal)
{
- sb << " = ";
- if (isBoolType(varDecl->getType()))
+ sb << " = " << (isTypeDecl->constantVal->value ? "true" : "false");
+ }
+ }
+ else if (initExpr)
+ {
+ DiagnosticSink sink;
+ SharedSemanticsContext semanticContext(version->linkage, module, &sink);
+ SemanticsVisitor semanticsVisitor(&semanticContext);
+ if (auto intVal = semanticsVisitor.tryFoldIntegerConstantExpression(
+ declRef.substitute(version->linkage->getASTBuilder(), initExpr),
+ SemanticsVisitor::ConstantFoldingKind::LinkTime, nullptr))
+ {
+ if (auto constantInt = as<ConstantIntVal>(intVal))
{
- sb << (constantInt->getValue() ? "true" : "false");
+ sb << " = ";
+ if (isBoolType(declType))
+ {
+ sb << (constantInt->getValue() ? "true" : "false");
+ }
+ else
+ {
+ sb << constantInt->getValue();
+ }
}
else
{
- sb << constantInt->getValue();
+ sb << " = ";
+ intVal->toText(sb);
}
}
- else
- {
- sb << " = ";
- intVal->toText(sb);
- }
}
- }
+ };
+ if (auto varDecl = as<VarDeclBase>(declRef.getDecl()))
+ {
+ if (!varDecl->findModifier<ConstModifier>() && !as<LetDecl>(declRef.getDecl()))
+ return printer.getString();
+ printInitExpr(getModule(varDecl), varDecl->type, varDecl->initExpr);
+ }
+ else if (auto enumCase = as<EnumCaseDecl>(declRef.getDecl()))
+ {
+ printInitExpr(getModule(enumCase), nullptr, enumCase->tagExpr);
}
return printer.getString();
}