2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2017 年 3 月 4 日 |
---|---|
0.1.16 | 2016 年 8 月 25 日 |
#1912 在 开发工具
27KB
629 行
从 C++ 类生成代码
cpp-codegen-rs 使用 libclang 读取 C++ 类定义并生成代码。示例用例包括生成 Google Mock 类、反射库、(反)序列化、RPC 框架等。其基本概念是,有时使用实际代码作为 IDL 来生成这些内容比使用专门的 IDL 更可取。
项目状态
目前处于 alpha 阶段。请期待存在错误和 API 变更。
用法
cpp-codegen-rs 是一种源到源编译器。虽然输入必须非常具体(C++ 类),但输出可以是任何从更多 C++ 代码到其他语言的绑定再到文档的内容。
以下示例创建 C++ 类的 GoogleTest 模拟对象。通常在真正的编译之前运行代码生成。
给定以下 C++ 头文件
#pragma once
struct Interface {
virtual ~Interface() = default;
virtual void method(int foo) = 0;
virtual int foo(double) = 0;
};
相应的 GoogleTest 模拟对象将如下所示
#pragma once
#include <gmock/gmock.h>
class MockInterface : public Interface {
MOCK_METHOD1(method, void(int));
MOCK_METHOD1(foo, void(double));
};
cpp-codegen-rs 解析 C++ 头文件,并从头文件定义的抽象语法树中创建一个 Model
对象。然后,将 Model
传递给模板文件。为了实现所需的转换,一个合适的模板可能如下所示
// THIS FILE IS GENERATED, CHANGING IT IS FUTILE
#pragma once
#include <gmock/gmock.h>
{{#each interfaces ~}}
class Mock{{name}} : public {{name}} {
{{#each methods ~}}
MOCK_METHOD{{len arguments}}({{name}}, {{return_type}}({{#each arguments}}{{argument_type}}{{#unless @last}}, {{/unless}}{{/each}}));
{{/each ~}}
};
{{/each ~}}
模板语言基于HandleBars Rust库,有关如何编写模板的文档请查阅该库。一个完整的GoogleTest模拟对象模板,包括命名空间和类模板的处理,可以在gmock.hbs中找到。
为了执行实际的编译,使用以下参数调用cpp-codegen-rs:
cpp_codegen interface.h -t templates/gmock.hbs
生成的代码将写入标准输出。
分发
我的目标是提供针对Linux、OS X和Windows的静态链接(针对libclang)的发布二进制文件,以简化部署。
许可证
MIT
依赖项
约10MB
约199K SLoC