Step 645: project AST CMake generator
This commit is contained in:
@@ -4684,4 +4684,13 @@ target_link_libraries(step644_test PRIVATE
|
||||
tree_sitter_javascript tree_sitter_typescript
|
||||
tree_sitter_java tree_sitter_rust tree_sitter_go)
|
||||
|
||||
add_executable(step645_test tests/step645_test.cpp)
|
||||
target_include_directories(step645_test PRIVATE src)
|
||||
target_link_libraries(step645_test PRIVATE
|
||||
nlohmann_json::nlohmann_json
|
||||
unofficial::tree-sitter::tree-sitter
|
||||
tree_sitter_python tree_sitter_cpp tree_sitter_elisp
|
||||
tree_sitter_javascript tree_sitter_typescript
|
||||
tree_sitter_java tree_sitter_rust tree_sitter_go)
|
||||
|
||||
# Step 12: Dear ImGui shell scaffolding created (main.cpp exists but not built due to dependencies)
|
||||
|
||||
38
editor/src/ProjectAstCMakeGenerator.h
Normal file
38
editor/src/ProjectAstCMakeGenerator.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
// Step 645: CMake generator from project AST
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct ProjectAstDescription {
|
||||
std::string projectName;
|
||||
std::vector<std::string> sources;
|
||||
std::vector<std::string> tests;
|
||||
std::vector<std::string> dependencies;
|
||||
bool includeInstallRules = true;
|
||||
};
|
||||
|
||||
class ProjectAstCMakeGenerator {
|
||||
public:
|
||||
static std::string generate(const ProjectAstDescription& ast) {
|
||||
if (ast.projectName.empty()) return "";
|
||||
std::string cmake;
|
||||
cmake += "cmake_minimum_required(VERSION 3.24)\n";
|
||||
cmake += "project(" + ast.projectName + " LANGUAGES CXX)\n";
|
||||
cmake += "set(CMAKE_CXX_STANDARD 20)\n";
|
||||
cmake += "find_package(vcpkg CONFIG QUIET)\n";
|
||||
for (const auto& dep : ast.dependencies) {
|
||||
cmake += "find_package(" + dep + " CONFIG REQUIRED)\n";
|
||||
}
|
||||
cmake += "add_executable(" + ast.projectName;
|
||||
for (const auto& src : ast.sources) cmake += " " + src;
|
||||
cmake += ")\n";
|
||||
for (const auto& test : ast.tests) {
|
||||
cmake += "add_executable(" + test + " tests/" + test + ".cpp)\n";
|
||||
}
|
||||
if (ast.includeInstallRules) {
|
||||
cmake += "install(TARGETS " + ast.projectName + " DESTINATION bin)\n";
|
||||
}
|
||||
return cmake;
|
||||
}
|
||||
};
|
||||
33
editor/tests/step645_test.cpp
Normal file
33
editor/tests/step645_test.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
// Step 645: CMake generator from project AST (12 tests)
|
||||
|
||||
#include "ProjectAstCMakeGenerator.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
static int passed = 0, failed = 0;
|
||||
#define TEST(name) { std::cout << " " << #name << "... "; }
|
||||
#define PASS() { std::cout << "PASS\n"; ++passed; }
|
||||
#define FAIL(msg) { std::cout << "FAIL: " << msg << "\n"; ++failed; }
|
||||
#define CHECK(cond, msg) if (!(cond)) { FAIL(msg); return; }
|
||||
|
||||
static ProjectAstDescription sample() {
|
||||
return {"whetstone_editor", {"src/main.cpp", "src/FileDialog.cpp"}, {"step645_test"}, {"nlohmann_json"}, true};
|
||||
}
|
||||
|
||||
void test_generate_rejects_missing_project_name(){TEST(generate_rejects_missing_project_name);auto ast=sample();ast.projectName="";CHECK(ProjectAstCMakeGenerator::generate(ast).empty(),"missing project should fail");PASS();}
|
||||
void test_generate_emits_project_line(){TEST(generate_emits_project_line);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("project(whetstone_editor")!=std::string::npos,"project line missing");PASS();}
|
||||
void test_generate_emits_cxx_standard(){TEST(generate_emits_cxx_standard);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("CMAKE_CXX_STANDARD 20")!=std::string::npos,"cxx standard missing");PASS();}
|
||||
void test_generate_emits_vcpkg_line(){TEST(generate_emits_vcpkg_line);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("find_package(vcpkg")!=std::string::npos,"vcpkg line missing");PASS();}
|
||||
void test_generate_emits_dependency_find_package(){TEST(generate_emits_dependency_find_package);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("find_package(nlohmann_json CONFIG REQUIRED)")!=std::string::npos,"dep line missing");PASS();}
|
||||
void test_generate_emits_main_target(){TEST(generate_emits_main_target);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("add_executable(whetstone_editor")!=std::string::npos,"main target missing");PASS();}
|
||||
void test_generate_includes_all_sources(){TEST(generate_includes_all_sources);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("src/main.cpp")!=std::string::npos&&txt.find("src/FileDialog.cpp")!=std::string::npos,"sources missing");PASS();}
|
||||
void test_generate_emits_test_targets(){TEST(generate_emits_test_targets);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("add_executable(step645_test")!=std::string::npos,"test target missing");PASS();}
|
||||
void test_generate_emits_install_rules_when_enabled(){TEST(generate_emits_install_rules_when_enabled);auto txt=ProjectAstCMakeGenerator::generate(sample());CHECK(txt.find("install(TARGETS whetstone_editor")!=std::string::npos,"install missing");PASS();}
|
||||
void test_generate_skips_install_rules_when_disabled(){TEST(generate_skips_install_rules_when_disabled);auto ast=sample();ast.includeInstallRules=false;auto txt=ProjectAstCMakeGenerator::generate(ast);CHECK(txt.find("install(TARGETS")==std::string::npos,"install should be absent");PASS();}
|
||||
void test_generate_handles_empty_tests_edge_case(){TEST(generate_handles_empty_tests_edge_case);auto ast=sample();ast.tests.clear();auto txt=ProjectAstCMakeGenerator::generate(ast);CHECK(txt.find("tests/")==std::string::npos,"tests should be absent");PASS();}
|
||||
void test_generate_handles_empty_dependencies_edge_case(){TEST(generate_handles_empty_dependencies_edge_case);auto ast=sample();ast.dependencies.clear();auto txt=ProjectAstCMakeGenerator::generate(ast);CHECK(txt.find("find_package(nlohmann_json")==std::string::npos,"dep should be absent");PASS();}
|
||||
|
||||
int main(){
|
||||
std::cout<<"Step 645: CMake generator from project AST\n";
|
||||
test_generate_rejects_missing_project_name();test_generate_emits_project_line();test_generate_emits_cxx_standard();test_generate_emits_vcpkg_line();test_generate_emits_dependency_find_package();test_generate_emits_main_target();test_generate_includes_all_sources();test_generate_emits_test_targets();test_generate_emits_install_rules_when_enabled();test_generate_skips_install_rules_when_disabled();test_generate_handles_empty_tests_edge_case();test_generate_handles_empty_dependencies_edge_case();
|
||||
std::cout<<"\nResults: "<<passed<<"/"<<(passed+failed)<<" passed\n";return failed?1:0;}
|
||||
25
progress.md
25
progress.md
@@ -13203,3 +13203,28 @@ self-hosting eligibility checks.
|
||||
- `editor/src/SelfHostingProjectConfig.h` (`53` <= `600`)
|
||||
- `editor/tests/step644_test.cpp` within test-file size guidance (`135` lines)
|
||||
- Header-only architecture and naming conventions remain aligned with `ARCHITECTURE.md`
|
||||
|
||||
### Step 645: CMake generator from Whetstone project description
|
||||
**Status:** PASS (12/12 tests)
|
||||
|
||||
Adds a project-AST-to-CMake generator supporting source target emission, test
|
||||
target scaffolding, dependency `find_package` lines, vcpkg hook, and optional
|
||||
install-rule generation.
|
||||
|
||||
**Files added:**
|
||||
- `editor/src/ProjectAstCMakeGenerator.h` - CMake generation module
|
||||
- `editor/tests/step645_test.cpp` - 12 tests for AST-to-CMake behavior and edges
|
||||
|
||||
**Files modified:**
|
||||
- `editor/CMakeLists.txt` - `step645_test` target
|
||||
|
||||
**Verification run:**
|
||||
- `cmake -S editor -B editor/build-native` - PASS
|
||||
- `cmake --build editor/build-native --target step645_test step644_test` - PASS
|
||||
- `./editor/build-native/step645_test` - PASS (12/12)
|
||||
- `./editor/build-native/step644_test` - PASS (12/12) regression coverage
|
||||
|
||||
**Architecture gate check:**
|
||||
- `editor/src/ProjectAstCMakeGenerator.h` (`38` <= `600`)
|
||||
- `editor/tests/step645_test.cpp` within test-file size guidance (`33` lines)
|
||||
- Header-only architecture and naming conventions remain aligned with `ARCHITECTURE.md`
|
||||
|
||||
Reference in New Issue
Block a user