From 2c4f9810327d58023e9ec44f579cd78adf56317b Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 1 Apr 2024 15:56:02 -0700 Subject: Allow bit operators on enum types. (#3862) * Allow bit operators on enum types. * Fix. --- source/slang/slang-language-server.cpp | 77 +++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 33 deletions(-) (limited to 'source/slang/slang-language-server.cpp') 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 declRef, WorkspaceVersion* version) ASTPrinter::OptionFlag::SimplifiedBuiltinType); printer.getStringBuilder() << getDeclKindString(declRef); printer.addDeclSignature(declRef); - if (auto varDecl = as(declRef.getDecl())) - { - auto& sb = printer.getStringBuilder(); - if (!varDecl->findModifier() && !as(declRef.getDecl())) - return printer.getString(); - - if (auto litExpr = as(varDecl->initExpr)) - { - sb << " = " << litExpr->token.getContent(); - } - else if (auto isTypeDecl = as(varDecl->initExpr)) + auto printInitExpr = [&](Module* module, Type* declType, Expr* initExpr) { - if (isTypeDecl->constantVal) + auto& sb = printer.getStringBuilder(); + + if (auto litExpr = as(initExpr)) { - sb << " = " << (isTypeDecl->constantVal->value ? "true" : "false"); + if (litExpr->token.type != TokenType::Unknown) + sb << " = " << litExpr->token.getContent(); + else if (auto intLit = as(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(initExpr)) { - if (auto constantInt = as(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(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(declRef.getDecl())) + { + if (!varDecl->findModifier() && !as(declRef.getDecl())) + return printer.getString(); + printInitExpr(getModule(varDecl), varDecl->type, varDecl->initExpr); + } + else if (auto enumCase = as(declRef.getDecl())) + { + printInitExpr(getModule(enumCase), nullptr, enumCase->tagExpr); } return printer.getString(); } -- cgit v1.2.3