什么是Apache Thrift中的“注释”,它用于什么?

时间:2014-09-02 19:49:35

标签: thrift

Thrift解析器有一个"注释"的定义:

https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=compiler/cpp/src/thrifty.yy;h=da5c562f9d7adf87b21e4c3ae30fbb9657e0c8b3;hb=HEAD#l85

这些意味着什么,并且可以在生成的客户端和/或服务器代码中访问它们包含的信息?

3 个答案:

答案 0 :(得分:2)

注释用于将元数据与Thrift定义(“.thrift”)文件中定义的类型相关联。源代码发布中的The AnnotationThrift.test file有示例。

例如,这里是带注释的struct(在括号中):

struct foo {
  1: i32 bar ( presence = "required" );
  2: i32 baz ( presence = "manual", cpp.use_pointer = "", );
  3: i32 qux;
  4: i32 bop;
} (
  cpp.type = "DenseFoo",
  python.type = "DenseFoo",
  java.final = "",
  annotation.without.value,
)

查看代码,似乎注释只用于向编译器提供指令 - 例如,C ++编译器在生成的代码中使用cpp.type注释(如果存在)到override a type's name

我没有看到任何迹象表明注释本身在生成的代码中被复制或可访问,但如果这样的代码 存在,它将位于compiler/cpp/src/generate/

答案 1 :(得分:2)

正如Simon所指出的,注释可以被想象为基本IDL语言的扩展点,以控制代码生成的某些方面。它们通常是语言特定的,但不限于此。在某些情况下,注释后来已成为核心IDl的一部分。另一件事是,注释仍然很难记录(我在这里很友好)。

  

可以在生成的客户端和/或服务器代码中访问它们包含的信息吗?

这取决于注释和你所说的"访问"。如果通过注释更改基类,或者创建Java类final,则信息当然会出现在生成的代码中。

答案 2 :(得分:1)

我们通过Go Thrift parser利用了注释。示例包括Thrift linter,其中注释选择性地禁用检查。