diff options
| author | Yong He <yonghe@outlook.com> | 2024-04-01 15:56:02 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-01 15:56:02 -0700 |
| commit | 2c4f9810327d58023e9ec44f579cd78adf56317b (patch) | |
| tree | b5498a74bd7d01fd2e4c321a0d2e551d5f024d6d /source/slang/slang-language-server.cpp | |
| parent | 65ac9f3a9ddcb8bcfc099ffb29beaa9a92ba1f53 (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.cpp | 77 |
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(); } |
