#include "WfAnalyzer.h"
namespace
{
namespace
{
namespace
{
using
namespace
collections
;
using
namespace
parsing
;
using
namespace
reflection
::
description
;
class
BuildScopeForDeclarationVisitor
:
public
,
public
::
,
public
::
{
public
:
*
;
*
;
<
>
;
<
>
;
BuildScopeForDeclarationVisitor
(
*
,
<
>
,
*
)
:manager(
)
, source(
)
, parentScope(
)
{
}
void
(
<
>
,
<
<
>>&
)
{
FOREACH(Ptr<WfAttribute>, attribute, attributes)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
attribute
);)
{
if
(
attribute
)
{
(
,
,
attribute
);
}
}
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
new
(
);
FOREACH(Ptr<WfDeclaration>, declaration, node->declarations)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
declaration
);)
{
(
,
,
declaration
,
);
}
}
void
(
*
)
override
{
new
(
);
auto
=
<
>();
config
;
=
;
if
(
)
{
if
(
dynamic_cast
<
*>(
))
{
config
=
true
;
config
=
false
;
config
=
true
;
}
else
if
(
dynamic_cast
<
*>(
))
{
config
=
true
;
config
=
true
;
config
=
true
;
}
else
if
(
dynamic_cast
<
*>(
))
{
config
=
false
;
config
=
->
!=
::
;
config
=
false
;
}
}
if
(
->
==
::
)
{
<
>
=
;
if
(
&&
dynamic_cast
<
*>(
))
{
functionNameScope
;
}
<
>
=
new
(
functionNameScope
.
());
symbol
->
.
;
symbol
;
{
<
>
=
new
;
type
->
;
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
type
.
(
argument
);
}
symbol
type
;
}
functionNameScope
.
(
symbol
,
symbol
);
}
if
(
->
)
{
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
<
>
=
new
(
.
());
argumentSymbol
argument
.
;
argumentSymbol
argument
;
argumentSymbol
argument
;
.
(
argumentSymbol
,
argumentSymbol
);
(
,
argument
);
}
(
,
,
->
);
}
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
symbol
->
;
.
(
symbol
,
symbol
);
(
,
,
->
);
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
symbol
->
;
.
(
symbol
,
symbol
);
}
void
(
*
)
override
{
new
(
);
FOREACH(Ptr<WfFunctionArgument>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
<
>
=
new
(
.
());
argumentSymbol
argument
.
;
argumentSymbol
argument
;
argumentSymbol
argument
;
.
(
argumentSymbol
,
argumentSymbol
);
}
FOREACH(Ptr<WfBaseConstructorCall>, call, node->baseConstructorCalls)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
call
);)
{
FOREACH(Ptr<WfExpression>, argument, call->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
call
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
(
,
,
argument
);
}
}
auto
=
<
>(
);
{
auto
=
<
>();
bodyScope
config
;
config
=
false
;
config
=
true
;
config
=
false
;
}
(
,
bodyScope
,
->
);
}
void
(
*
)
override
{
new
(
);
{
auto
=
<
>();
config
;
config
=
false
;
config
=
true
;
config
=
false
;
}
(
,
,
->
);
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
auto
=
->
];
new
(
);
=
td
.
();
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
memberDecl
);)
{
(
,
,
memberDecl
,
);
}
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
FOREACH(Ptr<WfEnumItem>, item, node->items)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
item
);)
{
(
,
item
);
}
}
void
(
*
)
override
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
FOREACH(Ptr<WfStructMember>, member, node->members)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
member
);)
{
(
,
member
);
}
}
void
(
*
)
override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
decl
);)
{
(
,
,
,
decl
);
}
}
void
(
*
)
override
{
->
((
::
*)
this
);
}
void
(
WfStateMachineDeclaration
*
)
override
{
FOREACH(Ptr<WfStateInput>, input, node->inputs)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
input
);)
{
<
>
=
new
(
.
());
stateSymbol
input
.
;
stateSymbol
input
;
.
(
stateSymbol
,
stateSymbol
);
}
FOREACH(Ptr<WfStateDeclaration>, state, node->states)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
state
);)
{
<
>
=
new
(
.
());
stateSymbol
state
.
;
stateSymbol
state
;
.
(
stateSymbol
,
stateSymbol
);
auto
=
<
>(
);
{
auto
=
<
>();
stateScope
config
;
config
=
false
;
config
=
true
;
config
=
true
;
}
stateScope
state
;
->
.
(
state
.
(),
stateScope
);
FOREACH(Ptr<WfFunctionArgument>, argument, state->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
state
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
<
>
=
new
(
stateScope
.
());
argumentSymbol
argument
.
;
argumentSymbol
argument
;
argumentSymbol
argument
;
stateScope
.
(
argumentSymbol
,
argumentSymbol
);
}
(
,
stateScope
,
state
);
}
}
static
<
>
(
*
,
<
>
,
*
,
<
>
)
{
BuildScopeForDeclarationVisitor
(
,
,
);
(&
visitor
);
visitor
.
(
,
);
->
.
(
,
);
if
(
visitor
.
)
{
->
.
(
.
(),
visitor
.
);
visitor
.
;
}
else
{
->
.
(
.
(),
);
}
return
visitor
.
;
}
};
class
BuildScopeForStatementVisitor
:
public
,
public
::
,
public
::
,
public
::
,
public
::
{
public
:
*
;
<
>
;
<
>
;
BuildScopeForStatementVisitor
(
*
,
<
>
)
:manager(
)
, parentScope(
)
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
WfRaiseExceptionStatement
*
)
override
{
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
new
(
);
if
(
->
)
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
->
;
symbol
;
.
(
symbol
,
symbol
);
}
(
,
,
->
);
(
,
,
->
);
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
if
(
->
)
{
new
(
);
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
{
auto
=
<
>();
system
.
=
L"system"
;
auto
=
<
>();
exception
system
;
exception
.
=
L"Exception"
;
auto
=
<
>();
sharedPtr
exception
;
symbol
sharedPtr
;
}
.
(
symbol
,
symbol
);
(
,
,
->
);
}
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
new
(
);
FOREACH(Ptr<WfStatement>, statement, node->statements)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
statement
);)
{
(
,
,
statement
);
}
}
void
(
*
)
override
{
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
,
);
}
void
(
*
)
override
{
->
((
::
*)
this
);
}
void
(
*
)
override
{
(
,
,
->
);
FOREACH(Ptr<WfSwitchCase>, switchCase, node->caseBranches)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
switchCase
);)
{
(
,
,
switchCase
);
(
,
,
switchCase
);
}
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
new
(
);
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
new
(
);
{
<
>
=
new
(
.
());
symbol
=
L"$PROVIDER"
;
symbol
;
.
(
symbol
,
symbol
);
}
{
<
>
=
new
(
.
());
symbol
=
L"$IMPL"
;
symbol
;
.
(
symbol
,
symbol
);
}
(
,
,
->
);
}
void
(
*
)
override
{
->
((
::
*)
this
);
}
void
(
*
)
override
{
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
if
(
->
.
!=
L""
)
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
}
FOREACH(Ptr<WfExpression>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
(
,
,
argument
);
}
}
void
(
*
)
override
{
->
((
::
*)
this
);
}
void
(
*
)
override
{
new
(
);
FOREACH(Ptr<WfStateSwitchCase>, switchCase, node->caseBranches)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
switchCase
);)
{
auto
=
<
>(
);
caseScope
switchCase
;
->
.
(
switchCase
.
(),
caseScope
);
FOREACH(Ptr<WfStateSwitchArgument>, argument, switchCase->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
switchCase
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
<
>
=
new
(
caseScope
.
());
symbol
argument
.
;
symbol
argument
;
caseScope
.
(
symbol
,
symbol
);
}
(
,
caseScope
,
switchCase
);
}
}
void
(
*
)
override
{
FOREACH(Ptr<WfExpression>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
(
,
,
argument
);
}
}
static
<
>
(
*
,
<
>
,
<
>
)
{
BuildScopeForStatementVisitor
(
,
);
(&
visitor
);
if
(
visitor
.
)
{
->
.
(
.
(),
visitor
.
);
visitor
.
;
}
else
{
->
.
(
.
(),
);
}
return
visitor
.
;
}
};
class
BuildScopeForExpressionVisitor
:
public
,
public
::
,
public
::
{
public
:
*
;
<
>
;
<
>
;
BuildScopeForExpressionVisitor
(
*
,
<
>
)
:manager(
)
, parentScope(
)
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
WfOrderedLambdaExpression
*
)
override
{
->
(
);
<
>
;
(
.
(),
->
,
names
);
new
(
);
auto
=
<
>();
config
;
config
=
true
;
config
=
false
;
config
=
true
;
FOREACH(vint, name, names)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
>&
= ::
vl
::
collections
::
(
names
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
;
__foreach_iterator__
.
(
name
);)
{
<
>
=
new
(
.
());
symbol
=
L"$"
+
(
name
);
symbol
;
.
(
symbol
,
symbol
);
}
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
new
(
);
FOREACH(Ptr<WfLetVariable>, variable, node->variables)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
variable
);)
{
<
>
=
new
(
.
());
symbol
variable
.
;
symbol
;
.
(
symbol
,
symbol
);
(
,
,
variable
);
}
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
FOREACH(Ptr<WfConstructorArgument>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
(
,
,
argument
);
if
(
argument
)
{
(
,
,
argument
);
}
}
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
if
(
->
)
{
(
,
,
->
);
}
}
void
(
*
)
override
{
}
void
(
WfTypeOfExpressionExpression
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
if
(
->
==
::
)
{
(
,
,
->
);
FOREACH(Ptr<WfExpression>, event, node->events)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
event
);)
{
(
,
,
event
);
}
}
else
{
new
(
);
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
.
(
symbol
,
symbol
);
}
(
,
,
->
);
FOREACH(Ptr<WfExpression>, event, node->events)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
event
);)
{
(
,
,
event
);
}
}
}
void
(
*
)
override
{
(
,
,
->
);
FOREACH(Ptr<WfExpression>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
(
,
,
argument
);
}
}
void
(
*
)
override
{
->
(
->
.
());
(
,
,
->
,
);
}
void
(
*
)
override
{
FOREACH(Ptr<WfExpression>, argument, node->arguments)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
argument
);)
{
(
,
,
argument
);
}
}
class
CreateLambdaCaptureVisitor
:
public
empty_visitor
::
{
public
:
*
;
<
>
;
CreateLambdaCaptureVisitor
(
*
,
<
>
)
:manager(
)
, capture(
)
{
}
void
(
*
)
override
{
FOREACH(Ptr<WfDeclaration>, decl, node->expandedDeclarations)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
decl
);)
{
decl
(
this
);
}
}
void
(
*
)
override
{
}
void
(
*
)
override
{
->
(
,
);
}
};
void
(
*
)
override
{
new
(
);
auto
=
<
>();
->
(
,
capture
);
CreateLambdaCaptureVisitor
(
,
capture
);
FOREACH(Ptr<WfDeclaration>, memberDecl, node->declarations)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
->
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
memberDecl
);)
{
memberDecl
(&
visitor
);
(
,
,
memberDecl
,
);
}
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
->
((
::
*)
this
);
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
->
(
);
new
(
);
auto
=
<
>();
config
;
if
(
->
.
!=
L""
)
{
<
>
=
new
(
.
());
symbol
->
.
;
symbol
;
symbol
<
<
>>::
();
symbol
(
symbol
.
());
.
(
symbol
,
symbol
);
}
config
=
true
;
config
=
false
;
config
=
true
;
(
,
,
->
);
}
void
(
*
)
override
{
(
,
,
->
);
}
void
(
WfExpectedTypeCastExpression
*
)
override
{
(
,
,
->
);
}
void
(
*
)
override
{
}
static
<
>
(
*
,
<
>
,
<
>
)
{
BuildScopeForExpressionVisitor
(
,
);
(&
visitor
);
if
(
visitor
.
)
{
->
.
(
.
(),
visitor
.
);
visitor
.
;
}
else
{
->
.
(
.
(),
);
}
return
visitor
.
;
}
};
void
(
*
,
<
>
)
{
<
>
=
new
(
);
scope
;
->
.
(
.
(),
scope
);
FOREACH(Ptr<WfDeclaration>, declaration, module->declarations)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
declaration
);)
{
(
,
scope
,
declaration
,
.
());
}
}
void
(
*
,
<
>
,
<
>
,
parsing
::
*
)
{
BuildScopeForDeclarationVisitor
::
(
,
,
,
);
}
void
(
*
,
<
>
,
<
>
)
{
BuildScopeForStatementVisitor
::
(
,
,
);
}
void
(
*
,
<
>
,
<
>
)
{
BuildScopeForExpressionVisitor
::
(
,
,
);
}
}
}
}