Skip to content

Commit b7a1c85

Browse files
intjftwmcserep
andauthored
C++ metrics Thrift API (#710)
Co-authored-by: Máté Cserép <[email protected]>
1 parent 1a1209e commit b7a1c85

File tree

7 files changed

+176
-33
lines changed

7 files changed

+176
-33
lines changed

plugins/cpp_metrics/model/include/model/cppastnodemetrics.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ struct CppAstNodeMetrics
1515
{
1616
enum Type
1717
{
18-
PARAMETER_COUNT,
19-
MCCABE,
20-
LACK_OF_COHESION,
21-
LACK_OF_COHESION_HS,
18+
PARAMETER_COUNT = 1,
19+
MCCABE = 2,
20+
LACK_OF_COHESION = 3,
21+
LACK_OF_COHESION_HS = 4,
2222
};
2323

2424
#pragma db id auto
Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
include_directories(
22
include
33
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp
4+
${PROJECT_BINARY_DIR}/service/project/gen-cpp
5+
${PROJECT_SOURCE_DIR}/service/project/include
6+
${PROJECT_SOURCE_DIR}/model/include
7+
${PROJECT_BINARY_DIR}/service/language/gen-cpp
8+
${PLUGIN_DIR}/model/include
49
${PROJECT_SOURCE_DIR}/util/include
510
${PROJECT_SOURCE_DIR}/webserver/include)
611

@@ -9,35 +14,45 @@ include_directories(SYSTEM
914

1015
add_custom_command(
1116
OUTPUT
17+
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/cxxmetrics_types.cpp
18+
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/cxxmetrics_types.h
1219
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/CppMetricsService.cpp
1320
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/CppMetricsService.h
1421
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp
1522
COMMAND
1623
${THRIFT_EXECUTABLE} --gen cpp
1724
-o ${CMAKE_CURRENT_BINARY_DIR}
18-
${CMAKE_CURRENT_SOURCE_DIR}/cppmetrics.thrift
25+
-I ${PROJECT_SOURCE_DIR}/service
26+
${CMAKE_CURRENT_SOURCE_DIR}/cxxmetrics.thrift
1927
DEPENDS
20-
${CMAKE_CURRENT_SOURCE_DIR}/cppmetrics.thrift
28+
${CMAKE_CURRENT_SOURCE_DIR}/cxxmetrics.thrift
2129
COMMENT
22-
"Generating Thrift for cppmetrics.thrift")
30+
"Generating Thrift for cxxmetrics.thrift")
2331

24-
add_library(cppmetricsthrift STATIC
32+
add_library(cxxmetricsthrift STATIC
33+
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/cxxmetrics_types.cpp
2534
${CMAKE_CURRENT_BINARY_DIR}/gen-cpp/CppMetricsService.cpp)
2635

27-
target_compile_options(cppmetricsthrift PUBLIC -fPIC)
36+
target_compile_options(cxxmetricsthrift PUBLIC -fPIC)
2837

29-
add_library(cppmetricsservice SHARED
38+
add_dependencies(cxxmetricsthrift projectthrift)
39+
40+
add_library(cxxmetricsservice SHARED
3041
src/cppmetricsservice.cpp
3142
src/plugin.cpp)
3243

33-
target_compile_options(cppmetricsservice PUBLIC -Wno-unknown-pragmas)
44+
target_compile_options(cxxmetricsservice PUBLIC -Wno-unknown-pragmas)
3445

35-
target_link_libraries(cppmetricsservice
36-
cppmetricsmodel
37-
model
46+
target_link_libraries(cxxmetricsservice
3847
util
3948
${THRIFT_LIBTHRIFT_LIBRARIES}
49+
model
50+
cppmetricsmodel
51+
projectthrift
52+
projectservice
53+
commonthrift
4054
${ODB_LIBRARIES}
41-
cppmetricsthrift)
55+
cxxmetricsthrift)
4256

43-
install(TARGETS cppmetricsservice DESTINATION ${INSTALL_SERVICE_DIR})
57+
install(TARGETS cxxmetricsservice DESTINATION ${INSTALL_SERVICE_DIR})
58+
install_js_thrift()

plugins/cpp_metrics/service/cppmetrics.thrift

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
include "project/common.thrift"
2+
include "project/project.thrift"
3+
4+
namespace cpp cc.service.cppmetrics
5+
namespace java cc.service.cppmetrics
6+
7+
enum CppMetricsType
8+
{
9+
ParameterCount = 1,
10+
McCabe = 2,
11+
LackOfCohesion = 3,
12+
LackOfCohesionHS = 4
13+
}
14+
15+
struct CppMetricsTypeName
16+
{
17+
1:CppMetricsType type,
18+
2:string name
19+
}
20+
21+
struct CppMetricsAstNode
22+
{
23+
1:CppMetricsType type,
24+
2:double value
25+
}
26+
27+
service CppMetricsService
28+
{
29+
/**
30+
* This function returns the required C++ metric
31+
* for a particular AST node.
32+
*/
33+
double getSingleCppMetricForAstNode(
34+
1:common.AstNodeId astNodeId,
35+
2:CppMetricsType metric)
36+
37+
/**
38+
* This function returns all available C++ metrics
39+
* for a particular AST node.
40+
*/
41+
list<CppMetricsAstNode> getCppMetricsForAstNode(
42+
1:common.AstNodeId astNodeId)
43+
44+
/**
45+
* This function returns the names of metrics.
46+
*/
47+
list<CppMetricsTypeName> getCppMetricsTypeNames()
48+
}

plugins/cpp_metrics/service/include/service/cppmetricsservice.h

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
#ifndef CC_SERVICE_DUMMY_DUMMYSSERVICE_H
2-
#define CC_SERVICE_DUMMY_DUMMYSSERVICE_H
1+
#ifndef CC_SERVICE_CPPMETRICSSERVICE_H
2+
#define CC_SERVICE_CPPMETRICSSERVICE_H
33

44
#include <memory>
55
#include <vector>
66

77
#include <boost/program_options/variables_map.hpp>
88

9+
#include <odb/database.hxx>
10+
11+
#include <model/cppastnodemetrics.h>
12+
#include <model/cppastnodemetrics-odb.hxx>
13+
#include <model/cppastnode.h>
14+
#include <model/cppastnode-odb.hxx>
15+
916
#include <odb/database.hxx>
1017
#include <util/odbtransaction.h>
1118
#include <webserver/servercontext.h>
@@ -27,6 +34,17 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf
2734
std::shared_ptr<std::string> datadir_,
2835
const cc::webserver::ServerContext& context_);
2936

37+
double getSingleCppMetricForAstNode(
38+
const core::AstNodeId& astNodeId_,
39+
CppMetricsType::type metric_) override;
40+
41+
void getCppMetricsForAstNode(
42+
std::vector<CppMetricsAstNode>& _return,
43+
const core::AstNodeId& astNodeId_) override;
44+
45+
void getCppMetricsTypeNames(
46+
std::vector<CppMetricsTypeName>& _return) override;
47+
3048
private:
3149
std::shared_ptr<odb::database> _db;
3250
util::OdbTransaction _transaction;
@@ -38,4 +56,4 @@ class CppMetricsServiceHandler : virtual public CppMetricsServiceIf
3856
} // service
3957
} // cc
4058

41-
#endif // CC_SERVICE_DUMMY_CPPMETRICSSSERVICE_H
59+
#endif // CC_SERVICE_CPPMETRICSSERVICE_H

plugins/cpp_metrics/service/src/cppmetricsservice.cpp

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,77 @@ namespace cppmetrics
1010

1111
CppMetricsServiceHandler::CppMetricsServiceHandler(
1212
std::shared_ptr<odb::database> db_,
13-
std::shared_ptr<std::string> /*datadir_*/,
13+
std::shared_ptr<std::string> datadir_,
1414
const cc::webserver::ServerContext& context_)
1515
: _db(db_), _transaction(db_), _config(context_.options)
1616
{
1717
}
1818

19+
void CppMetricsServiceHandler::getCppMetricsTypeNames(
20+
std::vector<CppMetricsTypeName>& _return)
21+
{
22+
CppMetricsTypeName typeName;
23+
24+
typeName.type = CppMetricsType::ParameterCount;
25+
typeName.name = "Number of function parameters";
26+
_return.push_back(typeName);
27+
28+
typeName.type = CppMetricsType::McCabe;
29+
typeName.name = "McCabe metric";
30+
_return.push_back(typeName);
31+
32+
typeName.type = CppMetricsType::LackOfCohesion;
33+
typeName.name = "Lack of cohesion of function";
34+
_return.push_back(typeName);
35+
36+
typeName.type = CppMetricsType::LackOfCohesionHS;
37+
typeName.name = "Lack of cohesion of function (Henderson-Sellers variant)";
38+
_return.push_back(typeName);
39+
}
40+
41+
void CppMetricsServiceHandler::getCppMetricsForAstNode(
42+
std::vector<CppMetricsAstNode>& _return,
43+
const core::AstNodeId& astNodeId_)
44+
{
45+
CppMetricsAstNode metric;
46+
47+
_transaction([&, this](){
48+
typedef odb::query<model::CppAstNodeMetrics> CppAstNodeMetricsQuery;
49+
50+
auto nodeMetrics = _db->query<model::CppAstNodeMetrics>(
51+
CppAstNodeMetricsQuery::astNodeId == std::stoull(astNodeId_));
52+
53+
for (const auto& nodeMetric : nodeMetrics)
54+
{
55+
metric.type = static_cast<CppMetricsType::type>(nodeMetric.type);
56+
metric.value = nodeMetric.value;
57+
_return.push_back(metric);
58+
}
59+
});
60+
}
61+
62+
double CppMetricsServiceHandler::getSingleCppMetricForAstNode(
63+
const core::AstNodeId& astNodeId_,
64+
CppMetricsType::type metric_)
65+
{
66+
return _transaction([&, this]() -> std::double_t {
67+
typedef odb::query<model::CppAstNodeMetrics> CppAstNodeMetricsQuery;
68+
69+
auto nodeMetric = _db->query<model::CppAstNodeMetrics>(
70+
CppAstNodeMetricsQuery::astNodeId == std::stoull(astNodeId_) &&
71+
CppAstNodeMetricsQuery::type == static_cast<model::CppAstNodeMetrics::Type>(metric_));
72+
73+
if (nodeMetric.empty())
74+
{
75+
core::InvalidInput ex;
76+
ex.__set_msg("Invalid metric type for AST node: " + astNodeId_);
77+
throw ex;
78+
}
79+
80+
return nodeMetric.begin()->value;
81+
});
82+
}
83+
1984
} // cppmetrics
2085
} // service
2186
} // cc

plugins/cpp_metrics/test/CMakeLists.txt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
include_directories(
2-
${PLUGIN_DIR}/model/include
3-
${PLUGIN_DIR}/service/include
4-
${CMAKE_CURRENT_BINARY_DIR}/../service/gen-cpp
5-
${PROJECT_SOURCE_DIR}/model/include
6-
${PROJECT_SOURCE_DIR}/plugins/cpp_metrics/model/include
7-
${PROJECT_BINARY_DIR}/plugins/cpp_metrics/model/include)
2+
include
3+
${PLUGIN_DIR}/model/include
4+
${PLUGIN_DIR}/service/include
5+
${CMAKE_CURRENT_BINARY_DIR}/../service/gen-cpp
6+
${PROJECT_SOURCE_DIR}/model/include
7+
${PROJECT_BINARY_DIR}/service/project/gen-cpp
8+
${PROJECT_SOURCE_DIR}/service/project/include
9+
${PROJECT_SOURCE_DIR}/plugins/cpp_metrics/model/include
10+
${PROJECT_BINARY_DIR}/plugins/cpp_metrics/model/include)
811

912
include_directories(SYSTEM
1013
${THRIFT_LIBTHRIFT_INCLUDE_DIRS})
@@ -24,6 +27,7 @@ target_link_libraries(cppmetricsservicetest
2427
model
2528
cppmodel
2629
cppservice
30+
commonthrift
2731
${Boost_LIBRARIES}
2832
${GTEST_BOTH_LIBRARIES}
2933
pthread)

0 commit comments

Comments
 (0)