Toluapp 类访问标签 |
|
public
、protected
和 private
标签。
access
标志,它决定对象在其容器内的访问权限。容器对象也有一个名为 curr_member_access
的成员,它决定每个子对象在添加到容器时其 access
的值。
当 access
的值为 nil
、false
或 0
时,对象被认为是公共的。任何其他值都表示非公共,tolua++ 不关心。所有对象的默认访问值为 nil
,因此此新功能不会影响当前用户。
parser_hook
是一个在主解析器函数开始时调用的空函数,它将要解析的文本作为参数。此函数可以在自定义 lua 文件中重新实现,并使用 -L
选项在 tolua++ 中运行。通常,解析器函数会在字符串的开头搜索一个标记,如果找到任何内容,则返回该字符串,但没有该标记(在对该标记执行了必要的操作之后)。parser_hook
可以安全地返回 nil
。
此示例实现 'parser_hook' 来查找标签,并将 curr_member_access
设置为当前访问权限。它还将 curr_member_access
默认设置为私有(基于 curr_member_access
的默认值为 nil
)。这些标签仍然可以在其他容器(模块、命名空间和主包)上工作,但这些容器仍然默认是公共的。
-- access_hook.lua local access = {public = 0, protected = 1, private = 2} function preparse_hook(p) -- we need to make all structs 'public' by default p.code = string.gsub(p.code, "(struct[^;]*{)", "%1\npublic:\n") end function parser_hook(s) local container = classContainer.curr -- get the current container if not container.curr_member_access and container.classtype == 'class' then -- default access for classes is private container.curr_member_access = access.private end -- try labels (public, private, etc) do local b,e,label = string.find(s, "^%s*(%w*)%s*:[^:]") -- we need to check for [^:], otherwise it would match 'namespace::type' if b then -- found a label, get the new access value from the global 'access' table if access[label] then container.curr_member_access = access[label] end -- else ? return strsub(s, e) -- normally we would use 'e+1', but we need to preserve the [^:] end end end
用法
$ tolua++ -L access-hook.lua package.pkg