Skip to content

Commit

Permalink
C++ metrics Thrift API (#710)
Browse files Browse the repository at this point in the history
Co-authored-by: Máté Cserép <mcserep@gmail.com>
  • Loading branch information
intjftw and mcserep authored Feb 28, 2024
1 parent 1a1209e commit b7a1c85
Show file tree
Hide file tree
Showing 7 changed files with 176 additions and 33 deletions.
8 changes: 4 additions & 4 deletions plugins/cpp_metrics/model/include/model/cppastnodemetrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ struct CppAstNodeMetrics
{
enum Type
{
PARAMETER_COUNT,
MCCABE,
LACK_OF_COHESION,
LACK_OF_COHESION_HS,
PARAMETER_COUNT = 1,
MCCABE = 2,
LACK_OF_COHESION = 3,
LACK_OF_COHESION_HS = 4,
};

#pragma db id auto
Expand Down
39 changes: 27 additions & 12 deletions plugins/cpp_metrics/service/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
include_directories(
include
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp
${PROJECT_BINARY_DIR}/service/project/gen-cpp
${PROJECT_SOURCE_DIR}/service/project/include
${PROJECT_SOURCE_DIR}/model/include
${PROJECT_BINARY_DIR}/service/language/gen-cpp
${PLUGIN_DIR}/model/include
${PROJECT_SOURCE_DIR}/util/include
${PROJECT_SOURCE_DIR}/webserver/include)

Expand All @@ -9,35 +14,45 @@ include_directories(SYSTEM

add_custom_command(
OUTPUT
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/cxxmetrics_types.cpp
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/cxxmetrics_types.h
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/CppMetricsService.cpp
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/CppMetricsService.h
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp
COMMAND
${THRIFT_EXECUTABLE} --gen cpp
-o ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/cppmetrics.thrift
-I ${PROJECT_SOURCE_DIR}/service
${CMAKE_CURRENT_SOURCE_DIR}/cxxmetrics.thrift
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/cppmetrics.thrift
${CMAKE_CURRENT_SOURCE_DIR}/cxxmetrics.thrift
COMMENT
"Generating Thrift for cppmetrics.thrift")
"Generating Thrift for cxxmetrics.thrift")

add_library(cppmetricsthrift STATIC
add_library(cxxmetricsthrift STATIC
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/cxxmetrics_types.cpp
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/CppMetricsService.cpp)

target_compile_options(cppmetricsthrift PUBLIC -fPIC)
target_compile_options(cxxmetricsthrift PUBLIC -fPIC)

add_library(cppmetricsservice SHARED
add_dependencies(cxxmetricsthrift projectthrift)

add_library(cxxmetricsservice SHARED
src/cppmetricsservice.cpp
src/plugin.cpp)

target_compile_options(cppmetricsservice PUBLIC -Wno-unknown-pragmas)
target_compile_options(cxxmetricsservice PUBLIC -Wno-unknown-pragmas)

target_link_libraries(cppmetricsservice
cppmetricsmodel
model
target_link_libraries(cxxmetricsservice
util
${THRIFT_LIBTHRIFT_LIBRARIES}
model
cppmetricsmodel
projectthrift
projectservice
commonthrift
${ODB_LIBRARIES}
cppmetricsthrift)
cxxmetricsthrift)

install(TARGETS cppmetricsservice DESTINATION ${INSTALL_SERVICE_DIR})
install(TARGETS cxxmetricsservice DESTINATION ${INSTALL_SERVICE_DIR})
install_js_thrift()
7 changes: 0 additions & 7 deletions plugins/cpp_metrics/service/cppmetrics.thrift

This file was deleted.

48 changes: 48 additions & 0 deletions plugins/cpp_metrics/service/cxxmetrics.thrift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
include "project/common.thrift"
include "project/project.thrift"

namespace cpp cc.service.cppmetrics
namespace java cc.service.cppmetrics

enum CppMetricsType
{
ParameterCount = 1,
McCabe = 2,
LackOfCohesion = 3,
LackOfCohesionHS = 4
}

struct CppMetricsTypeName
{
1:CppMetricsType type,
2:string name
}

struct CppMetricsAstNode
{
1:CppMetricsType type,
2:double value
}

service CppMetricsService
{
/**
* This function returns the required C++ metric
* for a particular AST node.
*/
double getSingleCppMetricForAstNode(
1:common.AstNodeId astNodeId,
2:CppMetricsType metric)

/**
* This function returns all available C++ metrics
* for a particular AST node.
*/
list<CppMetricsAstNode> getCppMetricsForAstNode(
1:common.AstNodeId astNodeId)

/**
* This function returns the names of metrics.
*/
list<CppMetricsTypeName> getCppMetricsTypeNames()
}
24 changes: 21 additions & 3 deletions plugins/cpp_metrics/service/include/service/cppmetricsservice.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
#ifndef CC_SERVICE_DUMMY_DUMMYSSERVICE_H
#define CC_SERVICE_DUMMY_DUMMYSSERVICE_H
#ifndef CC_SERVICE_CPPMETRICSSERVICE_H
#define CC_SERVICE_CPPMETRICSSERVICE_H

#include <memory>
#include <vector>

#include <boost/program_options/variables_map.hpp>

#include <odb/database.hxx>

#include <model/cppastnodemetrics.h>
#include <model/cppastnodemetrics-odb.hxx>
#include <model/cppastnode.h>
#include <model/cppastnode-odb.hxx>

#include <odb/database.hxx>
#include <util/odbtransaction.h>
#include <webserver/servercontext.h>
Expand All @@ -27,6 +34,17 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf
std::shared_ptr<std::string> datadir_,
const cc::webserver::ServerContext& context_);

double getSingleCppMetricForAstNode(
const core::AstNodeId& astNodeId_,
CppMetricsType::type metric_) override;

void getCppMetricsForAstNode(
std::vector<CppMetricsAstNode>& _return,
const core::AstNodeId& astNodeId_) override;

void getCppMetricsTypeNames(
std::vector<CppMetricsTypeName>& _return) override;

private:
std::shared_ptr<odb::database> _db;
util::OdbTransaction _transaction;
Expand All @@ -38,4 +56,4 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf
} // service
} // cc

#endif // CC_SERVICE_DUMMY_CPPMETRICSSSERVICE_H
#endif // CC_SERVICE_CPPMETRICSSERVICE_H
67 changes: 66 additions & 1 deletion plugins/cpp_metrics/service/src/cppmetricsservice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,77 @@ namespace cppmetrics

CppMetricsServiceHandler::CppMetricsServiceHandler(
std::shared_ptr<odb::database> db_,
std::shared_ptr<std::string> /*datadir_*/,
std::shared_ptr<std::string> datadir_,
const cc::webserver::ServerContext& context_)
: _db(db_), _transaction(db_), _config(context_.options)
{
}

void CppMetricsServiceHandler::getCppMetricsTypeNames(
std::vector<CppMetricsTypeName>& _return)
{
CppMetricsTypeName typeName;

typeName.type = CppMetricsType::ParameterCount;
typeName.name = "Number of function parameters";
_return.push_back(typeName);

typeName.type = CppMetricsType::McCabe;
typeName.name = "McCabe metric";
_return.push_back(typeName);

typeName.type = CppMetricsType::LackOfCohesion;
typeName.name = "Lack of cohesion of function";
_return.push_back(typeName);

typeName.type = CppMetricsType::LackOfCohesionHS;
typeName.name = "Lack of cohesion of function (Henderson-Sellers variant)";
_return.push_back(typeName);
}

void CppMetricsServiceHandler::getCppMetricsForAstNode(
std::vector<CppMetricsAstNode>& _return,
const core::AstNodeId& astNodeId_)
{
CppMetricsAstNode metric;

_transaction([&, this](){
typedef odb::query<model::CppAstNodeMetrics> CppAstNodeMetricsQuery;

auto nodeMetrics = _db->query<model::CppAstNodeMetrics>(
CppAstNodeMetricsQuery::astNodeId == std::stoull(astNodeId_));

for (const auto& nodeMetric : nodeMetrics)
{
metric.type = static_cast<CppMetricsType::type>(nodeMetric.type);
metric.value = nodeMetric.value;
_return.push_back(metric);
}
});
}

double CppMetricsServiceHandler::getSingleCppMetricForAstNode(
const core::AstNodeId& astNodeId_,
CppMetricsType::type metric_)
{
return _transaction([&, this]() -> std::double_t {
typedef odb::query<model::CppAstNodeMetrics> CppAstNodeMetricsQuery;

auto nodeMetric = _db->query<model::CppAstNodeMetrics>(
CppAstNodeMetricsQuery::astNodeId == std::stoull(astNodeId_) &&
CppAstNodeMetricsQuery::type == static_cast<model::CppAstNodeMetrics::Type>(metric_));

if (nodeMetric.empty())
{
core::InvalidInput ex;
ex.__set_msg("Invalid metric type for AST node: " + astNodeId_);
throw ex;
}

return nodeMetric.begin()->value;
});
}

} // cppmetrics
} // service
} // cc
16 changes: 10 additions & 6 deletions plugins/cpp_metrics/test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
include_directories(
${PLUGIN_DIR}/model/include
${PLUGIN_DIR}/service/include
${CMAKE_CURRENT_BINARY_DIR}/../service/gen-cpp
${PROJECT_SOURCE_DIR}/model/include
${PROJECT_SOURCE_DIR}/plugins/cpp_metrics/model/include
${PROJECT_BINARY_DIR}/plugins/cpp_metrics/model/include)
include
${PLUGIN_DIR}/model/include
${PLUGIN_DIR}/service/include
${CMAKE_CURRENT_BINARY_DIR}/../service/gen-cpp
${PROJECT_SOURCE_DIR}/model/include
${PROJECT_BINARY_DIR}/service/project/gen-cpp
${PROJECT_SOURCE_DIR}/service/project/include
${PROJECT_SOURCE_DIR}/plugins/cpp_metrics/model/include
${PROJECT_BINARY_DIR}/plugins/cpp_metrics/model/include)

include_directories(SYSTEM
${THRIFT_LIBTHRIFT_INCLUDE_DIRS})
Expand All @@ -24,6 +27,7 @@ target_link_libraries(cppmetricsservicetest
model
cppmodel
cppservice
commonthrift
${Boost_LIBRARIES}
${GTEST_BOTH_LIBRARIES}
pthread)
Expand Down

0 comments on commit b7a1c85

Please sign in to comment.