diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 391b548a..c22f382c 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -113,7 +113,7 @@ void Storage::onFunctionParsed( Node* node = m_graph.createNodeHierarchyWithDistinctSignature( Node::NODE_FUNCTION, fullName, - ParserClient::functionSignatureStr(returnType.type, fullName, parameters, false) + ParserClient::functionSignatureStr(returnType.dataType, fullName, parameters, false) ); addTokenLocation(node, location); @@ -134,7 +134,7 @@ void Storage::onMethodParsed( Node* node = m_graph.createNodeHierarchyWithDistinctSignature( Node::NODE_METHOD, fullName, - ParserClient::functionSignatureStr(returnType.type, fullName, parameters, isConst) + ParserClient::functionSignatureStr(returnType.dataType, fullName, parameters, isConst) ); if (isConst) @@ -492,7 +492,7 @@ Edge* Storage::addTypeEdge(Node* node, Edge::EdgeType edgeType, const ParseTypeU return nullptr; } - Edge* edge = addTypeEdge(node, edgeType, typeUsage.type); + Edge* edge = addTypeEdge(node, edgeType, typeUsage.dataType); addTokenLocation(edge, typeUsage.location); return edge; diff --git a/src/lib/data/parser/ParseTypeUsage.cpp b/src/lib/data/parser/ParseTypeUsage.cpp index 16794c9f..007d92e8 100644 --- a/src/lib/data/parser/ParseTypeUsage.cpp +++ b/src/lib/data/parser/ParseTypeUsage.cpp @@ -1,7 +1,7 @@ #include "data/parser/ParseTypeUsage.h" -ParseTypeUsage::ParseTypeUsage(const ParseLocation& location, const DataType& type) +ParseTypeUsage::ParseTypeUsage(const ParseLocation& location, const DataType& dataType) : location(location) - , type(type) + , dataType(dataType) { } diff --git a/src/lib/data/parser/ParseTypeUsage.h b/src/lib/data/parser/ParseTypeUsage.h index 76c1f1d0..3b7f6985 100644 --- a/src/lib/data/parser/ParseTypeUsage.h +++ b/src/lib/data/parser/ParseTypeUsage.h @@ -6,10 +6,10 @@ struct ParseTypeUsage { - ParseTypeUsage(const ParseLocation& location, const DataType& type); + ParseTypeUsage(const ParseLocation& location, const DataType& dataType); const ParseLocation location; - const DataType type; + const DataType dataType; }; #endif // PARSE_TYPE_USAGE_H diff --git a/src/lib/data/parser/ParseVariable.cpp b/src/lib/data/parser/ParseVariable.cpp index a0521030..8219d96f 100644 --- a/src/lib/data/parser/ParseVariable.cpp +++ b/src/lib/data/parser/ParseVariable.cpp @@ -1,6 +1,6 @@ #include "data/parser/ParseVariable.h" -ParseVariable::ParseVariable(const DataType& type, const std::string& fullName, bool isStatic) +ParseVariable::ParseVariable(const ParseTypeUsage& type, const std::string& fullName, bool isStatic) : type(type) , fullName(fullName) , isStatic(isStatic) diff --git a/src/lib/data/parser/ParseVariable.h b/src/lib/data/parser/ParseVariable.h index cb56e666..f9feb5ab 100644 --- a/src/lib/data/parser/ParseVariable.h +++ b/src/lib/data/parser/ParseVariable.h @@ -3,13 +3,13 @@ #include -#include "data/type/DataType.h" +#include "data/parser/ParseTypeUsage.h" struct ParseVariable { - ParseVariable(const DataType& type, const std::string& fullName, bool isStatic); + ParseVariable(const ParseTypeUsage& type, const std::string& fullName, bool isStatic); - const DataType type; + const ParseTypeUsage type; const std::string fullName; const bool isStatic; }; diff --git a/src/lib/data/parser/ParserClient.cpp b/src/lib/data/parser/ParserClient.cpp index d9be5d78..f9df09d7 100644 --- a/src/lib/data/parser/ParserClient.cpp +++ b/src/lib/data/parser/ParserClient.cpp @@ -63,7 +63,7 @@ std::string ParserClient::addLocationSuffix(const std::string& str, const ParseL std::string ParserClient::variableStr(const ParseVariable& variable) { - std::string str = variable.type.getFullTypeName() + " " + variable.fullName; + std::string str = variable.type.dataType.getFullTypeName() + " " + variable.fullName; return addStaticPrefix(str, variable.isStatic); } @@ -72,7 +72,7 @@ std::string ParserClient::parameterStr(const std::vector paramet std::string str = "("; for (size_t i = 0; i < parameters.size(); i++) { - str += parameters[i].type.getFullTypeName(); + str += parameters[i].dataType.getFullTypeName(); if (i < parameters.size() - 1) { str += ", "; diff --git a/src/lib/data/parser/cxx/ASTVisitor.cpp b/src/lib/data/parser/cxx/ASTVisitor.cpp index 74c15934..628d9485 100644 --- a/src/lib/data/parser/cxx/ASTVisitor.cpp +++ b/src/lib/data/parser/cxx/ASTVisitor.cpp @@ -90,7 +90,7 @@ bool ASTVisitor::VisitVarDecl(clang::VarDecl* declaration) if (access == clang::AS_none) { m_client->onGlobalVariableParsed( - getParseLocation(declaration->getSourceRange()), + getParseLocationForNamedDecl(declaration), getParseVariable(declaration) ); @@ -103,7 +103,7 @@ bool ASTVisitor::VisitVarDecl(clang::VarDecl* declaration) else { m_client->onFieldParsed( - getParseLocation(declaration->getSourceRange()), + getParseLocationForNamedDecl(declaration), getParseVariable(declaration), convertAccessType(declaration->getAccess()) ); @@ -118,7 +118,7 @@ bool ASTVisitor::VisitFieldDecl(clang::FieldDecl* declaration) if (hasValidLocation(declaration)) { m_client->onFieldParsed( - getParseLocation(declaration->getSourceRange()), + getParseLocationForNamedDecl(declaration), getParseVariable(declaration), convertAccessType(declaration->getAccess()) ); @@ -280,18 +280,10 @@ void ASTVisitor::VisitCXXConstructExprInDeclBody(clang::NamedDecl* decl, clang:: void ASTVisitor::VisitFieldUsageExprInDeclBody(clang::NamedDecl* decl, clang::MemberExpr* expr) { - const clang::SourceManager& sourceManager = m_context->getSourceManager(); - const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(expr->getSourceRange().getBegin()); - const clang::PresumedLoc& presumedEnd = sourceManager.getPresumedLoc(expr->getSourceRange().getEnd()); - const std::string exprName = expr->getMemberNameInfo().getAsString(); + ParseLocation parseLocation = getParseLocation(expr->getSourceRange()); - ParseLocation parseLocation( - presumedBegin.getFilename(), - presumedBegin.getLine(), - presumedBegin.getColumn(), - presumedEnd.getLine(), - presumedEnd.getColumn() + exprName.size() - 1 - ); + const std::string exprName = expr->getMemberNameInfo().getAsString(); + parseLocation.endColumnNumber += exprName.size() - 1; m_client->onFieldUsageParsed( parseLocation, @@ -302,18 +294,10 @@ void ASTVisitor::VisitFieldUsageExprInDeclBody(clang::NamedDecl* decl, clang::Me void ASTVisitor::VisitGlobalVariableUsageExprInDeclBody(clang::NamedDecl* decl, clang::DeclRefExpr* expr) { - const clang::SourceManager& sourceManager = m_context->getSourceManager(); - const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(expr->getSourceRange().getBegin()); - const clang::PresumedLoc& presumedEnd = sourceManager.getPresumedLoc(expr->getSourceRange().getEnd()); - const std::string exprName = expr->getNameInfo().getAsString(); + ParseLocation parseLocation = getParseLocation(expr->getSourceRange()); - ParseLocation parseLocation( - presumedBegin.getFilename(), - presumedBegin.getLine(), - presumedBegin.getColumn(), - presumedEnd.getLine(), - presumedEnd.getColumn() + exprName.size() - 1 - ); + const std::string exprName = expr->getNameInfo().getAsString(); + parseLocation.endColumnNumber += exprName.size() - 1; m_client->onGlobalVariableUsageParsed( parseLocation, @@ -336,7 +320,6 @@ ParseLocation ASTVisitor::getParseLocation(const clang::SourceRange& sourceRange } const clang::SourceManager& sourceManager = m_context->getSourceManager(); - const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(sourceRange.getBegin()); const clang::PresumedLoc& presumedEnd = sourceManager.getPresumedLoc(sourceRange.getEnd()); @@ -349,15 +332,21 @@ ParseLocation ASTVisitor::getParseLocation(const clang::SourceRange& sourceRange ); } -ParseTypeUsage ASTVisitor::getParseTypeUsage(clang::ValueDecl* declaration) const +ParseLocation ASTVisitor::getParseLocationForNamedDecl(clang::NamedDecl* decl) const { - return ParseTypeUsage( - getParseLocation(declaration->getSourceRange()), - utility::qualTypeToDataType(declaration->getType()) + const clang::SourceManager& sourceManager = m_context->getSourceManager(); + const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(decl->getLocation()); + + return ParseLocation( + presumedBegin.getFilename(), + presumedBegin.getLine(), + presumedBegin.getColumn(), + presumedBegin.getLine(), + presumedBegin.getColumn() + decl->getNameAsString().size() - 1 ); } -ParseVariable ASTVisitor::getParseVariable(clang::ValueDecl* declaration) const +ParseVariable ASTVisitor::getParseVariable(clang::DeclaratorDecl* declaration) const { bool isStatic = false; if (clang::isa(declaration)) @@ -367,34 +356,47 @@ ParseVariable ASTVisitor::getParseVariable(clang::ValueDecl* declaration) const } return ParseVariable( - utility::qualTypeToDataType(declaration->getType()), + getParseTypeUsage(declaration), declaration->getQualifiedNameAsString(), isStatic ); } +ParseTypeUsage ASTVisitor::getParseTypeUsage(clang::DeclaratorDecl* declaration) const +{ + clang::TypeLoc loc = declaration->getTypeSourceInfo()->getTypeLoc(); + + while (loc.getNextTypeLoc()) + { + loc = loc.getNextTypeLoc(); + } + + ParseLocation parseLocation = getParseLocation(loc.getSourceRange()); + DataType dataType = utility::qualTypeToDataType(declaration->getType()); + + parseLocation.endColumnNumber += dataType.getRawTypeName().size() - 1; + + return ParseTypeUsage(parseLocation, dataType); +} + ParseTypeUsage ASTVisitor::getParseTypeUsageOfReturnType(clang::FunctionDecl* declaration) const { // TODO: use FunctionDecl::getReturnTypeSourceRange() in newer clang version - clang::SourceRange range; const clang::TypeSourceInfo *TSI = declaration->getTypeSourceInfo(); - if (TSI) + const clang::FunctionTypeLoc FTL = TSI->getTypeLoc().IgnoreParens().getAs(); + clang::TypeLoc loc = FTL.getReturnLoc(); + + while (loc.getNextTypeLoc()) { - clang::FunctionTypeLoc FTL = TSI->getTypeLoc().IgnoreParens().getAs(); - if (FTL) - { - // Skip self-referential return types. - range = clang::SourceRange( - FTL.getReturnLoc().getLocStart(), - declaration->getNameInfo().getLocStart().getLocWithOffset(-2) - ); - } + loc = loc.getNextTypeLoc(); } - return ParseTypeUsage( - getParseLocation(range), - utility::qualTypeToDataType(declaration->getReturnType()) - ); + ParseLocation parseLocation = getParseLocation(loc.getSourceRange()); + DataType dataType = utility::qualTypeToDataType(declaration->getReturnType()); + + parseLocation.endColumnNumber += dataType.getRawTypeName().size() - 1; + + return ParseTypeUsage(parseLocation, dataType); } std::vector ASTVisitor::getParameters(clang::FunctionDecl* declaration) const diff --git a/src/lib/data/parser/cxx/ASTVisitor.h b/src/lib/data/parser/cxx/ASTVisitor.h index 3492b7a2..716582c6 100644 --- a/src/lib/data/parser/cxx/ASTVisitor.h +++ b/src/lib/data/parser/cxx/ASTVisitor.h @@ -47,8 +47,9 @@ public: private: bool hasValidLocation(const clang::Decl* declaration) const; ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const; - ParseTypeUsage getParseTypeUsage(clang::ValueDecl* declaration) const; - ParseVariable getParseVariable(clang::ValueDecl* declaration) const; + ParseLocation getParseLocationForNamedDecl(clang::NamedDecl* decl) const; + ParseVariable getParseVariable(clang::DeclaratorDecl* declaration) const; + ParseTypeUsage getParseTypeUsage(clang::DeclaratorDecl* declaration) const; ParseTypeUsage getParseTypeUsageOfReturnType(clang::FunctionDecl* declaration) const; std::vector getParameters(clang::FunctionDecl* declaration) const; DataType qualTypeToDataType(clang::QualType qualType); diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 5104e404..9316bb74 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -125,10 +125,10 @@ public: ); TS_ASSERT_EQUALS(client->globalVariables.size(), 4); - TS_ASSERT_EQUALS(client->globalVariables[0], "int x <1:1 1:5>"); - TS_ASSERT_EQUALS(client->globalVariables[1], "int const y <2:1 2:15>"); - TS_ASSERT_EQUALS(client->globalVariables[2], "static int z <3:1 3:12>"); - TS_ASSERT_EQUALS(client->globalVariables[3], "A * b <5:1 5:4>"); + TS_ASSERT_EQUALS(client->globalVariables[0], "int x <1:5 1:5>"); + TS_ASSERT_EQUALS(client->globalVariables[1], "int const y <2:11 2:11>"); + TS_ASSERT_EQUALS(client->globalVariables[2], "static int z <3:12 3:12>"); + TS_ASSERT_EQUALS(client->globalVariables[3], "A * b <5:4 5:4>"); } void test_cxx_parser_finds_variable_definitions_in_namespace_scope() @@ -143,8 +143,8 @@ public: ); TS_ASSERT_EQUALS(client->globalVariables.size(), 2); - TS_ASSERT_EQUALS(client->globalVariables[0], "int n::x <2:2 2:6>"); - TS_ASSERT_EQUALS(client->globalVariables[1], "n::A * n::b <4:2 4:5>"); + TS_ASSERT_EQUALS(client->globalVariables[0], "int n::x <2:6 2:6>"); + TS_ASSERT_EQUALS(client->globalVariables[1], "n::A * n::b <4:5 4:5>"); } void test_cxx_parser_finds_field_in_nested_class() @@ -162,7 +162,7 @@ public: ); TS_ASSERT_EQUALS(client->fields.size(), 1); - TS_ASSERT_EQUALS(client->fields[0], "private static int const B::C::amount <7:3 7:20>"); + TS_ASSERT_EQUALS(client->fields[0], "private static int const B::C::amount <7:20 7:25>"); } void test_cxx_parser_finds_fields_in_class_with_access_type() @@ -182,10 +182,10 @@ public: ); TS_ASSERT_EQUALS(client->fields.size(), 4); - TS_ASSERT_EQUALS(client->fields[0], "private int A::a <3:2 3:6>"); - TS_ASSERT_EQUALS(client->fields[1], "public int A::b <5:2 5:6>"); - TS_ASSERT_EQUALS(client->fields[2], "protected static int A::c <6:2 6:13>"); - TS_ASSERT_EQUALS(client->fields[3], "private int const A::d <8:2 8:12>"); + TS_ASSERT_EQUALS(client->fields[0], "private int A::a <3:6 3:6>"); + TS_ASSERT_EQUALS(client->fields[1], "public int A::b <5:6 5:6>"); + TS_ASSERT_EQUALS(client->fields[2], "protected static int A::c <6:13 6:13>"); + TS_ASSERT_EQUALS(client->fields[3], "private int const A::d <8:12 8:12>"); } void test_cxx_parser_finds_function_in_global_namespace() @@ -751,7 +751,7 @@ public: TS_ASSERT_EQUALS(client->typeUses.size(), 2); TS_ASSERT_EQUALS(client->typeUses[0], "int <1:1 1:3>"); - TS_ASSERT_EQUALS(client->typeUses[1], "float <1:10 1:16>"); + TS_ASSERT_EQUALS(client->typeUses[1], "float <1:10 1:14>"); } void test_cxx_parser_finds_parameter_type_uses_in_constructor() @@ -764,10 +764,10 @@ public: ); TS_ASSERT_EQUALS(client->typeUses.size(), 4); - TS_ASSERT_EQUALS(client->typeUses[0], "int <3:4 3:8>"); - TS_ASSERT_EQUALS(client->typeUses[1], "_Bool <3:11 3:16>"); - TS_ASSERT_EQUALS(client->typeUses[2], "float <3:19 3:25>"); - TS_ASSERT_EQUALS(client->typeUses[3], "int <3:28 3:32>"); + TS_ASSERT_EQUALS(client->typeUses[0], "int <3:4 3:6>"); + TS_ASSERT_EQUALS(client->typeUses[1], "_Bool <3:11 3:15>"); + TS_ASSERT_EQUALS(client->typeUses[2], "float <3:19 3:23>"); + TS_ASSERT_EQUALS(client->typeUses[3], "int <3:28 3:30>"); } void test_cxx_parser_parses_multiple_files() @@ -829,7 +829,7 @@ private: const ParseLocation& location, const std::string& fullName, const ParseTypeUsage& returnType, const std::vector& parameters ){ - std::string str = functionStr(returnType.type, fullName, parameters, false); + std::string str = functionStr(returnType.dataType, fullName, parameters, false); functions.push_back(addLocationSuffix(str, location)); addTypeUse(returnType); @@ -845,7 +845,7 @@ private: bool isConst, bool isStatic ) { - std::string str = functionStr(returnType.type, fullName, parameters, isConst); + std::string str = functionStr(returnType.dataType, fullName, parameters, isConst); str = addStaticPrefix(addAbstractionPrefix(str, abstraction), isStatic); str = addAccessPrefix(str, access); str = addLocationSuffix(str, location); @@ -918,7 +918,7 @@ private: { if (use.location.isValid()) { - typeUses.push_back(addLocationSuffix(use.type.getFullTypeName(), use.location)); + typeUses.push_back(addLocationSuffix(use.dataType.getFullTypeName(), use.location)); } } };