diff --git a/plugins/cpp_metrics/model/include/model/cppastnodemetrics.h b/plugins/cpp_metrics/model/include/model/cppastnodemetrics.h index e4c039e8c..184b3b455 100644 --- a/plugins/cpp_metrics/model/include/model/cppastnodemetrics.h +++ b/plugins/cpp_metrics/model/include/model/cppastnodemetrics.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace cc { @@ -78,6 +79,42 @@ struct CppAstNodeMetricsForPathView double value; }; +#pragma db view \ + object(CppAstNodeMetrics) \ + object(CppAstNode : CppAstNodeMetrics::astNodeId == CppAstNode::id) \ + object(File = LocFile : CppAstNode::location.file) +struct CppAstNodeMetricsAndDataForPathView +{ + typedef cc::model::Position::PosType PosType; + + #pragma db column(CppAstNodeMetrics::astNodeId) + CppAstNodeId astNodeId; + + #pragma db column(LocFile::path) + std::string path; + + #pragma db column(CppAstNode::location.range.start.line) + PosType startLine; + + #pragma db column(CppAstNode::location.range.end.line) + PosType endLine; + + #pragma db column(CppAstNode::astValue) + std::string astValue; + + #pragma db column(CppAstNode::symbolType) + CppAstNode::SymbolType symbolType; + + #pragma db column(CppAstNode::astType) + CppAstNode::AstType astType; + + #pragma db column(CppAstNodeMetrics::type) + CppAstNodeMetrics::Type type; + + #pragma db column(CppAstNodeMetrics::value) + double value; +}; + } //model } //cc diff --git a/plugins/cpp_metrics/service/cxxmetrics.thrift b/plugins/cpp_metrics/service/cxxmetrics.thrift index 24a86d102..6ab81d974 100644 --- a/plugins/cpp_metrics/service/cxxmetrics.thrift +++ b/plugins/cpp_metrics/service/cxxmetrics.thrift @@ -38,10 +38,16 @@ struct CppMetricsAstNodeSingle 3:double value } -struct CppMetricsAstNodeAll +struct CppMetricsAstNodeDetailed { - 1:common.AstNodeId id, - 2:list metrics + 1:string path, + 2:string file, + 3:string symbolType, + 4:string astType, + 5:i32 startLine, + 6:i32 endLine, + 7:string astValue, + 8:map metrics } struct CppMetricsModuleSingle @@ -90,6 +96,15 @@ service CppMetricsService map> getCppAstNodeMetricsForPath( 1:string path) + /** + * This function returns all available C++ metrics + * (AST node-level) and miscellaneous data for a particular path. + * + * The given path is a handled as a prefix. + */ + map getCppAstNodeMetricsDetailedForPath( + 1:string path) + /** * This function returns all available C++ metrics * (file-level) for a particular path. diff --git a/plugins/cpp_metrics/service/include/service/cppmetricsservice.h b/plugins/cpp_metrics/service/include/service/cppmetricsservice.h index 6257e95a1..4374b29ce 100644 --- a/plugins/cpp_metrics/service/include/service/cppmetricsservice.h +++ b/plugins/cpp_metrics/service/include/service/cppmetricsservice.h @@ -53,6 +53,10 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf std::map>& _return, const std::string& path_) override; + void getCppAstNodeMetricsDetailedForPath( + std::map& _return, + const std::string& path_) override; + void getCppFileMetricsForPath( std::map>& _return, const std::string& path_) override; diff --git a/plugins/cpp_metrics/service/src/cppmetricsservice.cpp b/plugins/cpp_metrics/service/src/cppmetricsservice.cpp index 5aabd2f42..0dd92371e 100644 --- a/plugins/cpp_metrics/service/src/cppmetricsservice.cpp +++ b/plugins/cpp_metrics/service/src/cppmetricsservice.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include namespace cc { @@ -161,6 +163,46 @@ void CppMetricsServiceHandler::getCppAstNodeMetricsForPath( }); } +void CppMetricsServiceHandler::getCppAstNodeMetricsDetailedForPath( + std::map& _return, + const std::string& path_) +{ + _transaction([&, this](){ + typedef odb::query CppAstNodeFilePathQuery; + typedef odb::result CppAstNodeFilePathResult; + typedef odb::query CppAstNodeMetricsAndDataForPathViewQuery; + typedef odb::result CppAstNodeMetricsAndDataForPathViewResult; + + auto nodes = _db->query( + CppAstNodeFilePathQuery::LocFile::path.like(path_ + '%')); + + for (const auto& node : nodes) + { + auto pair = std::make_pair(static_cast(node.type), node.value); + if (_return.count(std::to_string(node.astNodeId))) + { + _return[std::to_string(node.astNodeId)].metrics.insert(pair); + } + else + { + CppMetricsAstNodeDetailed metric; + std::size_t pos = node.path.find_last_of('/'); + metric.path = node.path.substr(0, pos + 1); + metric.file = node.path.substr(pos + 1); + metric.startLine = node.startLine; + metric.endLine = node.endLine; + metric.astValue = node.astValue; + metric.symbolType = cc::model::symbolTypeToString(node.symbolType); + metric.astType = cc::model::astTypeToString(node.astType); + + std::map metricsList; + metricsList.insert(pair); + _return.insert(std::make_pair(std::to_string(node.astNodeId), metric)); + } + } + }); +} + void CppMetricsServiceHandler::getCppFileMetricsForPath( std::map>& _return, const std::string& path_)