32. 模板应用程序帮助程序

templates boost 模块为 AST 实现了一系列辅助宏和函数。

所有函数和符号都在 “templates_boost ”模块中,使用 require 访问该模块。

require daslib/templates_boost
Template

Template 字段是

kaboomVar

table<string;tuple<prefix:string;suffix:string>>

call2name

table<string;string>

field2name

table<string;string>

var2name

table<string;string>

var2expr

table<string;smart_ptr< ast::Expression >>

var2exprList

table<string;array<smart_ptr< ast::Expression >>>

type2type

table<string;string>

type2etype

table<string; TypeDeclPtr >

blockArgName

table<string;string>

annArg

table<string;lambda<(ann: rtti::AnnotationDeclaration ):void>>

blkArg

table<string;array< VariablePtr >>

tag2expr

table<string;smart_ptr< ast::Expression >>

该结构包含模板的替换规则集合。

32.1. Call macros

qmacro_expr

此宏实现了 qmacro_expr 表达式的重化。预期输入是一个块表达式(ExprMakeBlock over ExprBlock)。它将重化规则应用于表达式,并返回块中的第一个表达式。 .. _call-macro-templates_boost-qmacro_variable:

qmacro_variable

此宏实现了 qmacro_variable 表达式重定义。预期输入是变量名和类型表达式(type<…>)。结果是一个具有匹配名称和类型的新 VariablePtr。 .. _call-macro-templates_boost-qmacro_block_to_array:

qmacro_block_to_array

此宏实现了 qmacro_block_too_array 表达式重化。预期输入是一个块表达式(ExprMakeBlock over ExprBlock)。它将重化规则应用于表达式,并返回包含块的 “list ”部分内容的数组。

qmacro_function

此宏实现了 qmacro_function 表达式重化。预期输入是一个块表达式(ExprMakeBlock over ExprBlock)。它将重化规则应用于表达式,并返回一个 FunctionPtr。新函数与代码块签名以及代码块主体相匹配。 .. _call-macro-templates_boost-qmacro:

qmacro

This macro implements qmacro expression reification. It applies reification rules to the expression, and returns direct result of the substitution.

qmacro_method

This macro implements expression reification for class methods.

qmacro_block

This macro implements qmacro_block expression reification. Expected input is a block expression (ExprMakeBlock over ExprBlock). It applies reification rules to the expression, and returns unquoted ExprBlock. .. _call-macro-templates_boost-qmacro_type:

qmacro_type

This macro implements qmacro_type expression reification. Expected input is a type expression (type<…>). Result is TypeDeclPtr of a new type matching subtype of the type expression.

32.2. Template rules

kaboomVarField(self: Template; name: string const; prefix: string const; suffix: string const)

argument

argument type

self

templates_boost::Template

name

string const

prefix

string const

suffix

string const

Adds a rule to to the template to replace a variable field access with a prefix and suffix. I.e. foo.bar into prefix + bar + suffix

replaceVariable(self: Template; name: string const; expr: smart_ptr<Expression>)

argument

argument type

self

templates_boost::Template

name

string const

expr

smart_ptr< ast::Expression >

Adds a rule to the template to replace a variable with an expression.

renameVariable(self: Template; name: string const; newName: string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

string const

Adds a rule to the template to rename a variable.

renameVariable(self: Template; name: string const; newName: das_string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

builtin::das_string const

Adds a rule to the template to rename a variable.

replaceType(self: Template; name: string const; newName: string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

string const

Adds a rule to the template to replace a type alias with another type alias, specified by name.

replaceAnnotationArgument(self: Template; name: string const; cb: lambda<(var ann:AnnotationDeclaration):void>)

argument

argument type

self

templates_boost::Template

name

string const

cb

lambda<(ann: rtti::AnnotationDeclaration ):void>

Adds a rule to the template to replace an annotation argument with the result of a callback.

replaceBlockArgument(self: Template; name: string const; newName: string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

string const

Adds a rule to the template to rename a block argument.

32.3. Template application

apply_template(rules: Template; at: LineInfo const; expr: smart_ptr<Expression>; forceAt: bool const)

apply_template returns ExpressionPtr

argument

argument type

rules

templates_boost::Template

at

rtti::LineInfo const

expr

smart_ptr< ast::Expression >

forceAt

bool const

TODO: figure out why this is needed

apply_template(at: LineInfo const; expr: smart_ptr<Expression>&; blk: block<(var rules:Template):void> const)

apply_template returns ExpressionPtr

argument

argument type

at

rtti::LineInfo const

expr

smart_ptr< ast::Expression >&

blk

block<(rules: templates_boost::Template ):void> const

TODO: figure out why this is needed

apply_template(expr: smart_ptr<Expression>&; blk: block<(var rules:Template):void> const)

apply_template returns ExpressionPtr

argument

argument type

expr

smart_ptr< ast::Expression >&

blk

block<(rules: templates_boost::Template ):void> const

TODO: figure out why this is needed

32.4. Expression helpers

remove_deref(varname: string const; expr: smart_ptr<Expression>)

argument

argument type

varname

string const

expr

smart_ptr< ast::Expression >

Removes dereferences of the variable varname from the expression. This is typically used when replacing ‘workhorse’ variable with constant.

32.5. Block helpers

unquote_block(expr: ExpressionPtr)

unquote_block returns smart_ptr< ast::ExprBlock >

argument

argument type

expr

ExpressionPtr

Returns the corresponding block subexpression expression form the ExprMakeBlock.

move_unquote_block(expr: ExpressionPtr)

move_unquote_block returns smart_ptr< ast::ExprBlock >

argument

argument type

expr

ExpressionPtr

Moves the corresponding block subexpression expression form the ExprMakeBlock.

32.6. Global variable helpers

add_global_var(mod: Module? const; vname: string const; vat: LineInfo const; value: ExpressionPtr)

add_global_var returns bool

argument

argument type

mod

rtti::Module ? const

vname

string const

vat

rtti::LineInfo const

value

ExpressionPtr

Adds global variable to the module, given name and initial value. Global variables type is would be inferred from the initial value. priv specifies if the variable is private to the block.

add_global_var(mod: Module? const; vname: string const; typ: TypeDeclPtr; vat: LineInfo const; priv: bool const; blk: block<(var v:smart_ptr<Variable>):void> const)

add_global_var returns bool

argument

argument type

mod

rtti::Module ? const

vname

string const

typ

TypeDeclPtr

vat

rtti::LineInfo const

priv

bool const

blk

block<(v: VariablePtr ):void> const

Adds global variable to the module, given name and initial value. Global variables type is would be inferred from the initial value. priv specifies if the variable is private to the block.

add_global_var(mod: Module? const; vname: string const; typ: TypeDeclPtr; vat: LineInfo const; priv: bool const)

add_global_var returns bool

argument

argument type

mod

rtti::Module ? const

vname

string const

typ

TypeDeclPtr

vat

rtti::LineInfo const

priv

bool const

Adds global variable to the module, given name and initial value. Global variables type is would be inferred from the initial value. priv specifies if the variable is private to the block.

add_global_let(mod: Module? const; vname: string const; vat: LineInfo const; value: ExpressionPtr)

add_global_let returns bool

argument

argument type

mod

rtti::Module ? const

vname

string const

vat

rtti::LineInfo const

value

ExpressionPtr

Add global variable to the module, given name and initial value. Variable type will be constant.

add_global_private_var(mod: Module? const; vname: string const; vat: LineInfo const; value: ExpressionPtr)

add_global_private_var returns bool

argument

argument type

mod

rtti::Module ? const

vname

string const

vat

rtti::LineInfo const

value

ExpressionPtr

Add global variable to the module, given name and initial value. It will be private.

add_global_private_let(mod: Module? const; vname: string const; vat: LineInfo const; value: ExpressionPtr)

add_global_private_let returns bool

argument

argument type

mod

rtti::Module ? const

vname

string const

vat

rtti::LineInfo const

value

ExpressionPtr

Add global variable to the module, given name and initial value. It will be private, and type will be constant.

32.7. Hygenic names

make_unique_private_name(prefix: string const; vat: LineInfo const)

make_unique_private_name returns string

argument

argument type

prefix

string const

vat

rtti::LineInfo const

Generates unique private name for the variable, given prefix and line info.

The assumption is that line info is unique for the context of the unique name generation. If it is not, additional measures must be taken to ensure uniqueness of prefix.

32.8. Uncategorized

replaceVarTag(self: Template; name: string const; expr: smart_ptr<Expression>)

argument

argument type

self

templates_boost::Template

name

string const

expr

smart_ptr< ast::Expression >

Adds a rule to the template to replace a variable tag with an expression.

replaceArgumentWithList(self: Template; name: string const; blka: array<smart_ptr<Variable>> const)

argument

argument type

self

templates_boost::Template

name

string const

blka

array< VariablePtr > const

Adds a rule to the template to replace a block argument with a list of variables.

replaceVariableWithList(self: Template; name: string const; expr: array<smart_ptr<Expression>> const)

argument

argument type

self

templates_boost::Template

name

string const

expr

array< ExpressionPtr > const

Adds a rule to the template to replace a variable with an expression list.

replaceVariableWithList(self: Template; name: string const; expr: dasvector`smart_ptr`Expression const)

argument

argument type

self

templates_boost::Template

name

string const

expr

vector<smart_ptr<Expression>> const

Adds a rule to the template to replace a variable with an expression list.

renameField(self: Template; name: string const; newName: string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

string const

Adds a rule to the template to rename any field lookup (., ?., as, is, etc)

renameField(self: Template; name: string const; newName: das_string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

builtin::das_string const

Adds a rule to the template to rename any field lookup (., ?., as, is, etc)

replaceTypeWithTypeDecl(self: Template; name: string const; expr: TypeDeclPtr)

argument

argument type

self

templates_boost::Template

name

string const

expr

TypeDeclPtr

Adds a rule to the template to replace a type alias with another type alias, specified by type declaration.

renameCall(self: Template; name: string const; newName: string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

string const

Adds a rule to the template to rename a call.

renameCall(self: Template; name: string const; newName: das_string const)

argument

argument type

self

templates_boost::Template

name

string const

newName

builtin::das_string const

Adds a rule to the template to rename a call.

make_expression_block(exprs: array<smart_ptr<Expression>>)

make_expression_block returns smart_ptr< ast::ExprBlock >

argument

argument type

exprs

array< ExpressionPtr >

Create ExprBlock and move all expressions from expr to the list of the block.

make_expression_block(exprs: dasvector`smart_ptr`Expression)

make_expression_block returns smart_ptr< ast::ExprBlock >

argument

argument type

exprs

vector<smart_ptr<Expression>>

Create ExprBlock and move all expressions from expr to the list of the block.

add_type_ptr_ref(a: TypeDeclPtr; flags: TypeDeclFlags)

add_type_ptr_ref returns TypeDeclPtr

argument

argument type

a

TypeDeclPtr

flags

TypeDeclFlags

Implementation details for the reification. This adds any array to the rules.

add_type_ptr_ref(st: StructurePtr; flags: TypeDeclFlags)

add_type_ptr_ref returns TypeDeclPtr

argument

argument type

st

StructurePtr

flags

TypeDeclFlags

Implementation details for the reification. This adds any array to the rules.

add_type_ptr_ref(st: Structure?; flags: TypeDeclFlags)

add_type_ptr_ref returns TypeDeclPtr

argument

argument type

st

ast::Structure ?

flags

TypeDeclFlags

Implementation details for the reification. This adds any array to the rules.

add_type_ptr_ref(st: EnumerationPtr; flags: TypeDeclFlags)

add_type_ptr_ref returns TypeDeclPtr

argument

argument type

st

EnumerationPtr

flags

TypeDeclFlags

Implementation details for the reification. This adds any array to the rules.

add_type_ptr_ref(st: Enumeration?; flags: TypeDeclFlags)

add_type_ptr_ref returns TypeDeclPtr

argument

argument type

st

ast::Enumeration ?

flags

TypeDeclFlags

Implementation details for the reification. This adds any array to the rules.

apply_qmacro(expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qmacro returns ExpressionPtr

argument

argument type

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for the expression reificaiton. This is a generat expression reification.

apply_qblock(expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qblock returns ExpressionPtr

argument

argument type

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for the expression reificaiton. This is a block reification.

apply_qblock_to_array(expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qblock_to_array returns array< ExpressionPtr >

argument

argument type

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for the expression reificaiton. This is a block reification.

apply_qblock_expr(expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qblock_expr returns ExpressionPtr

argument

argument type

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for the expression reificaiton. This is a frist line of the block as expression reification.

apply_qtype(expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qtype returns TypeDeclPtr

argument

argument type

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for the expression reificaiton. This is a type declaration reification.

expression_at(expr: ExpressionPtr; at: LineInfo const)

expression_at returns ExpressionPtr

argument

argument type

expr

ExpressionPtr

at

rtti::LineInfo const

Force expression location, than return it.

emplace_new(arr: array<smart_ptr<Expression>>; expr: ExpressionPtr)

argument

argument type

arr

array< ExpressionPtr >

expr

ExpressionPtr

Unifies emplace and emplace_new for the array<VariablePtr>

emplace_new(arr: array<smart_ptr<Variable>>; expr: VariablePtr)

argument

argument type

arr

array< VariablePtr >

expr

VariablePtr

Unifies emplace and emplace_new for the array<VariablePtr>

apply_qmacro_function(fname: string const; expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qmacro_function returns FunctionPtr

argument

argument type

fname

string const

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for reification. This is a function generation reification.

apply_qmacro_method(fname: string const; parent: StructurePtr; expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qmacro_method returns FunctionPtr

argument

argument type

fname

string const

parent

StructurePtr

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for reification. This is a class method function generation reification.

apply_qmacro_variable(vname: string const; expr: smart_ptr<Expression>; blk: block<(var rules:Template):void> const)

apply_qmacro_variable returns VariablePtr

argument

argument type

vname

string const

expr

smart_ptr< ast::Expression >

blk

block<(rules: templates_boost::Template ):void> const

Implementation details for reification. This is a variable generation reification.

add_structure_field(cls: StructurePtr; name: string const; t: TypeDeclPtr; init: ExpressionPtr)

add_structure_field returns int const

argument

argument type

cls

StructurePtr

name

string const

t

TypeDeclPtr

init

ExpressionPtr

Adds a field to the structure.

make_class(name: string const; mod: Module? const)

make_class returns smart_ptr< ast::Structure >

argument

argument type

name

string const

mod

rtti::Module ? const

Creates a class structure. Adds __rtti, __finalize fields.

make_class(name: string const; baseClass: StructurePtr; mod: Module? const)

make_class returns smart_ptr< ast::Structure >

argument

argument type

name

string const

baseClass

StructurePtr

mod

rtti::Module ? const

Creates a class structure. Adds __rtti, __finalize fields.

make_class(name: string const; baseClass: Structure? const; mod: Module? const)

make_class returns smart_ptr< ast::Structure >

argument

argument type

name

string const

baseClass

ast::Structure ? const

mod

rtti::Module ? const

Creates a class structure. Adds __rtti, __finalize fields.

make_class_constructor(cls: StructurePtr; ctor: FunctionPtr)

make_class_constructor returns smart_ptr< ast::Function >

argument

argument type

cls

StructurePtr

ctor

FunctionPtr

Adds a class constructor from a constructor function.

modify_to_class_member(cls: StructurePtr; fun: FunctionPtr; isExplicit: bool const; Constant: bool const)

argument

argument type

cls

StructurePtr

fun

FunctionPtr

isExplicit

bool const

Constant

bool const

Modifies function to be a member of a particular class.

add_array_ptr_ref(a: array<smart_ptr<auto(TT)>>)

add_array_ptr_ref returns array<smart_ptr<TT>>

argument

argument type

a

array<smart_ptr<auto(TT)>>

Implementation details for the reification. This adds any array to the rules.

enum_class_type(st: auto const)

enum_class_type returns auto

argument

argument type

st

auto const

return underlying type for the enumeration

add_type_ptr_ref(anything: auto(TT) const; flags: TypeDeclFlags)

add_type_ptr_ref returns TypeDeclPtr

argument

argument type

anything

auto(TT) const

flags

TypeDeclFlags

Implementation details for the reification. This adds any array to the rules.