From adaea0e993fd8db351b5dad92802e47ed6d0ec77 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 17 Aug 2022 23:08:34 -0700 Subject: Warning on lossy implicit casts. (#2367) * Warning on bool to float conversion. * Fix test cases. * Improve. * LanguageServer: don't show constant value for non constant variables. * Fix tests. * Fix warnings in tests. Co-authored-by: Yong He --- source/slang/slang-language-server.cpp | 40 +++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 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 f209a4955..cb077cfdb 100644 --- a/source/slang/slang-language-server.cpp +++ b/source/slang/slang-language-server.cpp @@ -15,6 +15,7 @@ #include "../compiler-core/slang-json-native.h" #include "../compiler-core/slang-json-rpc-connection.h" #include "../compiler-core/slang-language-server-protocol.h" +#include "slang-check-impl.h" #include "slang-language-server.h" #include "slang-workspace-version.h" #include "slang-language-server-ast-lookup.h" @@ -201,10 +202,19 @@ SlangResult LanguageServer::didOpenTextDocument(const DidOpenTextDocumentParams& return SLANG_OK; } -String getDeclSignatureString(DeclRef declRef, ASTBuilder* astBuilder) +static bool isBoolType(Type* t) +{ + auto basicType = as(t); + if (!basicType) + return false; + return basicType->baseType == BaseType::Bool; +} + +String getDeclSignatureString(DeclRef declRef, WorkspaceVersion* version) { if (declRef.getDecl()) { + auto astBuilder = version->linkage->getASTBuilder(); ASTPrinter printer( astBuilder, ASTPrinter::OptionFlag::ParamNames | ASTPrinter::OptionFlag::NoInternalKeywords | @@ -213,6 +223,9 @@ String getDeclSignatureString(DeclRef declRef, ASTBuilder* astBuilder) 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(); @@ -224,6 +237,27 @@ String getDeclSignatureString(DeclRef declRef, ASTBuilder* astBuilder) sb << " = " << (isTypeDecl->constantVal->value ? "true" : "false"); } } + else if (varDecl->initExpr) + { + DiagnosticSink sink; + SharedSemanticsContext semanticContext(version->linkage, getModule(varDecl), &sink); + SemanticsVisitor semanticsVisitor(&semanticContext); + if (auto intVal = semanticsVisitor.tryFoldIntegerConstantExpression(varDecl->initExpr, nullptr)) + { + if (auto constantInt = as(intVal)) + { + sb << " = "; + if (isBoolType(varDecl->getType())) + { + sb << (constantInt->value ? "true" : "false"); + } + else + { + sb << constantInt->value; + } + } + } + } } return printer.getString(); } @@ -421,7 +455,7 @@ SlangResult LanguageServer::hover( if (declRef.getDecl()) { sb << "```\n" - << getDeclSignatureString(declRef, version->linkage->getASTBuilder()) + << getDeclSignatureString(declRef, version) << "\n```\n"; _tryGetDocumentation(sb, version, declRef.getDecl()); @@ -777,7 +811,7 @@ SlangResult LanguageServer::completionResolve( if (itemId >= 0 && itemId < candidateItems.getCount()) { auto declRef = candidateItems[itemId].declRef; - resolvedItem.detail = getDeclSignatureString(declRef, version->linkage->getASTBuilder()); + resolvedItem.detail = getDeclSignatureString(declRef, version); StringBuilder docSB; _tryGetDocumentation(docSB, version, declRef.getDecl()); resolvedItem.documentation.value = docSB.ProduceString(); -- cgit v1.2.3