ArKanjo 0.5.1
A tool for find code duplicated functions in codebases
function_breaker.cpp
Go to the documentation of this file.
8#include <iostream>
9#include <unordered_map>
10
11void FunctionBreaker::write_output(
12 const fs::path type_path,
13 const fs::path& relative_path,
14 const std::string& function_name,
15 const std::string& content
16) {
17 FunctionStorage storage;
18 fs::path path = storage.build_output_path(type_path, relative_path, function_name);
19 Utils::write_file(path, content);
20}
21
22std::string FunctionBreaker::create_info_json(
23 int line_declaration, int start_number_line,
24 int end_number_line, const fs::path& relative_path,
25 const std::string& function_name
26) {
27 return "{"
28 "\"file_name\":\"" + relative_path.string() + "\","
29 "\"function_name\":\"" + function_name + "\","
30 "\"line_declaration\":" + std::to_string(line_declaration) + ","
31 "\"start_number_line\":" + std::to_string(start_number_line) + ","
32 "\"end_number_line\":" + std::to_string(end_number_line) +
33 "}";
34}
35
36
37void FunctionBreaker::file_breaker(
38 const fs::path& file_path, const fs::path& folder_path,
39 std::function<void(const FunctionData&)> on_function,
40 SkipStats& stats,
41 Granularity granularity,
42 int minimum_lines
43) {
44 if (!fs::exists(file_path)) return;
45
46 fs::path relative_path;
47 try {
48 relative_path = fs::relative(file_path, folder_path);
49 } catch (...) {
50 return;
51 }
52
53 std::string source_code = Utils::read_file(file_path);
54
55 auto handle_unit = [&](const FunctionData& function) {
56 auto source = function.get_feature<SourceFeature>();
57 auto metadata = function.get_feature<MetadataFeature>();
58
59 if (metadata->end_number_line - metadata->start_number_line <= minimum_lines) {
60 return;
61 }
62
63 if (on_function)
64 on_function(function);
65
66 auto& cfg = Config::config();
67
68 write_output(cfg.source_path, relative_path, function.function_name, source->code + "\n");
69 write_output(cfg.header_path, relative_path, function.function_name, metadata->signature);
70 write_output(cfg.info_path, relative_path, function.function_name,
71 create_info_json(metadata->line_declaration, metadata->start_number_line, metadata->end_number_line, relative_path, function.function_name));
72 };
73
74 if (granularity == Granularity::File) {
75 TreeSitterParser::process_file_as_unit(file_path, relative_path, source_code, handle_unit, stats);
76 } else {
77 TreeSitterParser::process_file(file_path, relative_path, source_code, handle_unit, stats);
78 }
79}
80
81// TODO: It's possible to add parallelism to this function.
83 const fs::path& folder_path,
84 std::function<void(const FunctionData&)> on_function,
85 SkipStats& stats,
86 int minimum_lines,
87 Granularity granularity
88) {
89 int size_files = 0;
90
91 for (const auto& dirEntry : fs::recursive_directory_iterator(folder_path)) {
92 if (!dirEntry.is_regular_file()) continue;
93
94 auto path = dirEntry.path();
95 file_breaker(path, folder_path, on_function, stats, granularity, minimum_lines);
96
97 size_files++;
98 }
99
100 return size_files;
101}
static Config & config()
Gets the singleton configuration instance.
Definition: config.cpp:68
int process(const fs::path &folder_path, std::function< void(const FunctionData &)> on_function, SkipStats &stats, int minimum_lines=0, Granularity granularity=Granularity::Function)
Processes all files in directory.
fs::path build_output_path(const fs::path type_path, const fs::path &relative_path, const std::string &function_name) const
Builds file path for a function.
static void process_file_as_unit(const fs::path &file_path, const fs::path &relative_path, const std::string &source_code, std::function< void(const FunctionData &)> callback, SkipStats &stats)
static void process_file(const fs::path &file_path, const fs::path &relative_path, const std::string &source_code, std::function< void(const FunctionData &)> callback, SkipStats &stats)
Configuration management interface.
Main function extraction interface.
Granularity
Comparison granularity used when breaking the codebase.
Provides access to function storage locations.
void write_file(const fs::path &path, const std::string &content)
Writes content to a file at specified path.
Definition: utils.cpp:19
std::string read_file(const fs::path &path)
Reads a file into string.
Definition: utils.cpp:12
Defines utility functions used across all files.