From 04c0e332a4beb21632d4034662423a31dd013258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20D=C3=BCrschmid?= Date: Tue, 23 Aug 2022 14:04:10 -0400 Subject: [PATCH] Normalize type names --- .../rosdiscover-clang/Ast/Stmt/SymbolicDeclRef.h | 13 +++++++++++-- include/rosdiscover-clang/Value/Value.h | 4 ++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/rosdiscover-clang/Ast/Stmt/SymbolicDeclRef.h b/include/rosdiscover-clang/Ast/Stmt/SymbolicDeclRef.h index 5d7304d..1e06163 100644 --- a/include/rosdiscover-clang/Ast/Stmt/SymbolicDeclRef.h +++ b/include/rosdiscover-clang/Ast/Stmt/SymbolicDeclRef.h @@ -6,6 +6,7 @@ #include #include "SymbolicExpr.h" +#include "../../Value/Value.h" #include "../../ApiCall/Calls/Util.h" namespace rosdiscover { @@ -20,7 +21,7 @@ class SymbolicDeclRef : public SymbolicExpr { std::string qualifiedName ) : isInstanceMember(isInstanceMember), isClassMember(isClassMember), - typeName(typeName), + typeName(normalizeTypeName(typeName)), name(name), qualifiedName(qualifiedName) {} @@ -31,10 +32,18 @@ class SymbolicDeclRef : public SymbolicExpr { // Complex logic needed here to avoid duplication in sub-classes. ) : isInstanceMember(declRef->getDecl()->isCXXInstanceMember()), isClassMember(declRef->getDecl()->isCXXClassMember()), - typeName(declRef->getType().getAsString()), + typeName(normalizeTypeName(declRef->getType().getAsString())), name(createName(declRef)), qualifiedName(declRef->getDecl()->getQualifiedNameAsString()) {} + static std::string normalizeTypeName(std::string clangTypeName) { + auto symbolicType = SymbolicValue::getSymbolicType(clangTypeName); + if (symbolicType == SymbolicValueType::Unsupported) { + return clangTypeName; + } + return SymbolicValue::getSymbolicTypeAsString(symbolicType); + } + virtual std::string toString() const override { return name; } diff --git a/include/rosdiscover-clang/Value/Value.h b/include/rosdiscover-clang/Value/Value.h index 94a1489..9fdef8c 100644 --- a/include/rosdiscover-clang/Value/Value.h +++ b/include/rosdiscover-clang/Value/Value.h @@ -28,6 +28,10 @@ class SymbolicValue : public SymbolicExpr { static SymbolicValueType getSymbolicType(clang::QualType clangType) { clangType = clangType.getUnqualifiedType(); auto typeName = clangType.getAsString(); + return getSymbolicType(typeName); + } + + static SymbolicValueType getSymbolicType(std::string typeName) { llvm::outs() << "DEBUG: determining symbolic type for Clang type [" << typeName << "]\n"; if (typeName == "std::string" || typeName.find("const char") != std::string::npos