diff options
| author | Yong He <yonghe@outlook.com> | 2022-08-17 23:08:34 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-17 23:08:34 -0700 |
| commit | adaea0e993fd8db351b5dad92802e47ed6d0ec77 (patch) | |
| tree | dfad5201677b0202b0b890cbae066b5b2f3f033b /source/slang/slang-language-server.cpp | |
| parent | d65c6183c0d8b365aa182c3d9026ba85522531f2 (diff) | |
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 <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-language-server.cpp')
| -rw-r--r-- | source/slang/slang-language-server.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
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<Decl> declRef, ASTBuilder* astBuilder) +static bool isBoolType(Type* t) +{ + auto basicType = as<BasicExpressionType>(t); + if (!basicType) + return false; + return basicType->baseType == BaseType::Bool; +} + +String getDeclSignatureString(DeclRef<Decl> 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<Decl> declRef, ASTBuilder* astBuilder) 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(); @@ -224,6 +237,27 @@ String getDeclSignatureString(DeclRef<Decl> 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<ConstantIntVal>(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(); |
