#include "GuiInstanceLoader.h"
#include "InstanceQuery/GuiInstanceQuery.h"
#include "GuiInstanceSharedScript.h"
#include "GuiInstanceAnimation.h"
#include "GuiInstanceLocalizedStrings.h"
#include "WorkflowCodegen/GuiInstanceLoader_WorkflowCodegen.h"
#include "../Reflection/GuiInstanceCompiledWorkflow.h"
#include "../Resources/GuiParserManager.h"
#include "../Resources/GuiResourceManager.h"
namespace
{
namespace
{
using
namespace
parsing
;
using
namespace
parsing
::
xml
;
using
namespace
workflow
;
using
namespace
workflow
::
analyzer
;
using
namespace
workflow
::
emitter
;
using
namespace
workflow
::
runtime
;
using
namespace
reflection
::
description
;
using
namespace
collections
;
using
namespace
stream
;
using
namespace
controls
;
class
WorkflowVirtualScriptPositionVisitor
:
public
traverse_visitor
::
{
public
:
GuiResourcePrecompileContext
&
;
<
types
::
>
;
WorkflowVirtualScriptPositionVisitor
(
GuiResourcePrecompileContext
&
)
:context(
)
{
Workflow_GetScriptPosition
(
);
}
void
(
*
)
override
{
traverse_visitor
::
::
(
);
=
.
().
(
);
if
(
index
!= -
1
)
{
auto
=
.
()
index
];
Workflow_RecordScriptPosition
(
,
record
.
,
->
,
record
.
);
}
}
void
(
*
)
override
{
traverse_visitor
::
::
(
);
=
.
().
(
);
if
(
index
!= -
1
)
{
auto
=
.
()
index
];
Workflow_RecordScriptPosition
(
,
record
.
,
->
,
record
.
);
}
}
void
(
*
)
override
{
traverse_visitor
::
::
(
);
=
.
().
(
);
if
(
index
!= -
1
)
{
auto
=
.
()
index
];
Workflow_RecordScriptPosition
(
,
record
.
,
->
,
record
.
);
}
}
void
(
*
)
override
{
traverse_visitor
::
::
(
);
=
.
().
(
);
if
(
index
!= -
1
)
{
auto
=
.
()
index
];
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
);)
{
Workflow_RecordScriptPosition
(
,
record
.
,
decl
,
record
.
);
}
}
}
void
(
*
)
override
{
traverse_visitor
::
::
(
);
=
.
().
(
);
if
(
index
!= -
1
)
{
auto
=
.
()
index
];
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
);)
{
Workflow_RecordScriptPosition
(
,
record
.
,
decl
,
record
.
);
}
}
}
};
<
GuiInstanceCompiledWorkflow
>
(
GuiResourcePrecompileContext
&
,
const
&
,
<
GuiInstanceCompiledWorkflow
::
>
)
{
auto
=
.
(
).
<
GuiInstanceCompiledWorkflow
>();
if
(
&& !
compiled
)
{
compiled
new
GuiInstanceCompiledWorkflow
;
compiled
=
.
();
.
(
,
L"Workflow"
,
compiled
);
}
return
compiled
;
}
void
(
GuiResourcePrecompileContext
&
,
const
&
,
<
>
,
GuiInstanceCompiledWorkflow
::
,
)
{
auto
=
(
,
,
);
CHECK_ERROR(compiled->type == assemblyType, L"Workflow_AddModule(GuiResourcePrecompiledContext&, const WString&, GuiInstanceCompiledWorkflow::AssemblyType)#Unexpected assembly type.");
do
{
if
(!(
compiled
==
))
throw
(
L"Workflow_AddModule(GuiResourcePrecompiledContext&, const WString&, GuiInstanceCompiledWorkflow::AssemblyType)#Unexpected assembly type."
);}
while
(
0
);
GuiInstanceCompiledWorkflow
::
;
record
.
;
record
.
;
record
.
=
==
GuiInstanceCompiledWorkflow
::
;
compiled
.
(
record
);
}
void
Workflow_GenerateAssembly
(
GuiResourcePrecompileContext
&
,
const
&
,
::
&
,
bool
,
*
)
{
auto
=
(
,
, {});
if
(!
compiled
)
{
return
;
}
if
(!
compiled
)
{
<
>
;
auto
=
Workflow_GetSharedManager
();
manager
->
(
false
,
true
);
auto
= [&codes](
&
)
{
=
0
;
;
while
(!
reader
.
())
{
auto
=
(++
row
);
while
(
rowHeader
.
() <
6
)
{
rowHeader
=
L" "
+
rowHeader
;
}
code
+=
rowHeader
+
L" : "
+
reader
.
() +
L"\r\n"
;
}
codes
.
(
code
);
};
for
(
=
0
;
i
<
compiled
.
();
i
++)
{
manager
->
(
compiled
i
].
);
}
if
(
manager
->
.
() ==
0
)
{
manager
->
(
true
,
);
}
if
(
manager
->
.
() ==
0
)
{
compiled
(
manager
,
);
;
if
(!
compiled
(
true
,
loadErrors
))
{
manager
->
.
(
new
(
L"Internal error happened during loading an assembly that just passed type verification."
));
}
}
else
{
for
(
=
0
;
i
<
compiled
.
();
i
++)
{
auto
=
compiled
i
];
WorkflowVirtualScriptPositionVisitor
(
);
visitor
.
(
module
.
.
());
Workflow_RecordScriptPosition
(
,
module
.
,
module
.
);
}
auto
=
Workflow_GetScriptPosition
(
);
for
(
=
0
;
i
<
manager
->
.
();
i
++)
{
auto
=
manager
->
i
];
.
({
sp
error
].
,
error
});
}
}
if
(
)
{
compiled
Workflow_TransferSharedManager
();
}
else
{
manager
->
(
false
,
true
);
}
}
}
#define Path_Shared L"Workflow/Shared"
#define Path_TemporaryClass L"Workflow/TemporaryClass"
#define Path_InstanceClass L"Workflow/InstanceClass"
class
GuiResourceSharedScriptTypeResolver
:
public
,
public
,
private
IGuiResourceTypeResolver_Precompile
,
private
IGuiResourceTypeResolver_IndirectLoad
{
public
:
()
override
{
return
L"Script"
;
}
bool
()
override
{
return
true
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
L"Xml"
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
;
}
(
)
override
{
switch
(
)
{
case
:
return
;
case
:
return
;
default
:
return
;
}
}
void
(
<
>
,
GuiResourcePrecompileContext
&
,
::
&
)
override
{
switch
(
.
)
{
case
:
{
if
(
auto
=
().
<
>())
{
if
(
obj
==
L"Workflow"
)
{
if
(
auto
=
(
,
obj
.
,
obj
,
obj
,
))
{
Workflow_AddModule(context, Path_Shared, module, GuiInstanceCompiledWorkflow::Shared, obj->codePosition);
(
,
L"Workflow/Shared"
,
module
,
GuiInstanceCompiledWorkflow
::
,
obj
);
}
}
}
}
break
;
}
}
void
(
GuiResourcePrecompileContext
&
,
::
&
)
override
{
switch
(
.
)
{
case
:
Workflow_GenerateAssembly(context, Path_Shared, errors, false, context.compilerCallback);
Workflow_GenerateAssembly
(
,
L"Workflow/Shared"
,
,
false
,
.
);
if (auto compiled = Workflow_GetModule(context, Path_Shared, {}))
if
(
auto
=
(
,
L"Workflow/Shared"
, {}))
{
for
(
=
0
;
i
<
compiled
->modules.Count();
i
++)
{
auto
&
=
compiled
->modules[
i
];
if
(
module
.module)
{
module
.module =
(
module
.module,
true
);
}
}
}
break
;
}
}
IGuiResourceTypeResolver_Precompile
*
()
override
{
return
this
;
}
IGuiResourceTypeResolver_IndirectLoad
*
()
override
{
return
this
;
}
<
>
(
<
>
,
<
>
)
override
{
if
(
auto
=
.
<
>())
{
return
obj
();
}
return
nullptr
;
}
<
>
(
<
>
,
<
>
,
::
&
)
override
{
if
(
auto
=
().
<
>())
{
auto
=
::
(
,
xml
,
);
return
schema
;
}
return
nullptr
;
}
};
class
GuiResourceInstanceTypeResolver
:
public
,
public
,
private
IGuiResourceTypeResolver_Precompile
,
private
IGuiResourceTypeResolver_IndirectLoad
{
public
:
()
override
{
return
L"Instance"
;
}
bool
()
override
{
return
true
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
L"Xml"
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
;
}
(
)
override
{
switch
(
)
{
case
:
case
Instance_CollectInstanceTypes
:
case
Instance_CollectEventHandlers
:
case
Instance_GenerateInstanceClass
:
return
;
case
Instance_CompileInstanceTypes
:
case
Instance_CompileEventHandlers
:
case
Instance_CompileInstanceClass
:
return
;
default
:
return
;
}
}
#define ENSURE_ASSEMBLY_EXISTS(PATH, ASSEMBLY_TYPE)\
if (auto compiled = Workflow_GetModule(context, PATH, GuiInstanceCompiledWorkflow::ASSEMBLY_TYPE))\
{\
if (!compiled->assembly)\
{\
break;\
}\
}\
else\
{\
break;\
}\
#define UNLOAD_ASSEMBLY(PATH)\
if (auto compiled = Workflow_GetModule(context, PATH, {}))\
{\
compiled->UnloadTypes();\
}\
#define DELETE_ASSEMBLY(PATH)\
if (auto compiled = Workflow_GetModule(context, PATH, {}))\
{\
compiled->UnloadAssembly();\
}\
void
(
<
>
,
GuiResourcePrecompileContext
&
,
::
&
)
override
{
switch
(
.
)
{
case
:
{
if
(
auto
=
().
<
>())
{
auto
=
.
(
L"ClassNameRecord"
).Cast<
GuiResourceClassNameRecord
>();
if
(!
record
)
{
record
=
<
GuiResourceClassNameRecord
>();
.
(
L"ClassNameRecord"
,
L"ClassNameRecord"
,
record
);
}
if
(!
record
->classResources.Keys().Contains(
obj
))
{
record
->classNames.Add(
obj
);
record
->classResources.Add(
obj
,
);
}
}
}
break
;
case
Instance_CollectEventHandlers
:
ENSURE_ASSEMBLY_EXISTS(Path_TemporaryClass, TemporaryClass)
if
(
auto
=
(
,
L"Workflow/TemporaryClass"
,
GuiInstanceCompiledWorkflow
::
)) {
if
(!
compiled
->assembly) {
break
; } }
else
{
break
; }
case
Instance_CollectInstanceTypes
:
{
if
(
auto
=
().
<
>())
{
if
(
obj
==
L""
)
{
.
(
({
},
obj
,
L"Precompile: Instance \""
+
(
obj
==
::
?
obj
.
()
:
obj
.
() +
L":"
+
obj
.
()
) +
L"\" should have the class name specified in the ref.Class attribute."
));
}
FOREACH_INDEXER(Ptr<GuiInstanceLocalized>, localized, index,
From(obj->localizeds).Where([](Ptr<GuiInstanceLocalized> ls) {return ls->defaultStrings; })
)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
(
obj
).Where([](
<
>
) {
return
ls
; }));
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
if
(
bool
=
true
)
for
(
=
0
;
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
localized
);
index
++)
{
if
(
index
>
0
)
{
.
(
({
},
localized
,
L"Precompile: Only one <ref.LocalizedStrings> can be the default one."
));
}
}
obj
(
,
.
,
);
types
::
;
resolvingResult
.
;
resolvingResult
.
obj
;
if
(
auto
=
Workflow_GenerateInstanceClass
(
,
L"<instance>"
+
obj
,
resolvingResult
,
,
.
))
{
Workflow_AddModule(context, Path_TemporaryClass, module, GuiInstanceCompiledWorkflow::TemporaryClass, obj->tagPosition);
(
,
L"Workflow/TemporaryClass"
,
module
,
GuiInstanceCompiledWorkflow
::
,
obj
);
}
}
}
break
;
case
Instance_GenerateInstanceClass
:
{
ENSURE_ASSEMBLY_EXISTS(Path_TemporaryClass, TemporaryClass)
if
(
auto
=
(
,
L"Workflow/TemporaryClass"
,
GuiInstanceCompiledWorkflow
::
)) {
if
(!
compiled
->assembly) {
break
; } }
else
{
break
; }
if
(
auto
=
().
<
>())
{
=
.
();
types
::
;
resolvingResult
.
;
resolvingResult
.
obj
;
resolvingResult
.
Workflow_CollectReferences
(
,
resolvingResult
,
);
if
(
.
() ==
previousErrorCount
)
{
if
(
auto
=
Workflow_PrecompileInstanceContext
(
,
L"<constructor>"
+
obj
,
resolvingResult
,
))
{
if
(
auto
=
Workflow_GenerateInstanceClass
(
,
L"<instance>"
+
obj
,
resolvingResult
,
,
.
))
{
Workflow_AddModule(context, Path_InstanceClass, ctorModule, GuiInstanceCompiledWorkflow::InstanceClass, obj->tagPosition);
(
,
L"Workflow/InstanceClass"
,
ctorModule
,
GuiInstanceCompiledWorkflow
::
,
obj
);
Workflow_AddModule(context, Path_InstanceClass, instanceModule, GuiInstanceCompiledWorkflow::InstanceClass, obj->tagPosition);
(
,
L"Workflow/InstanceClass"
,
instanceModule
,
GuiInstanceCompiledWorkflow
::
,
obj
);
}
}
}
}
}
break
;
}
}
void
(
GuiResourcePrecompileContext
&
,
::
&
)
override
{
;
GuiInstanceCompiledWorkflow
::
;
switch
(
.
)
{
case
Instance_CompileInstanceTypes
:
DELETE_ASSEMBLY(Path_Shared)
if
(
auto
=
(
,
L"Workflow/Shared"
, {})) {
compiled
->UnloadAssembly(); }
path = Path_TemporaryClass;
path
=
L"Workflow/TemporaryClass"
;
assemblyType
=
GuiInstanceCompiledWorkflow
::
;
break
;
case
Instance_CompileEventHandlers
:
DELETE_ASSEMBLY(Path_TemporaryClass)
if
(
auto
=
(
,
L"Workflow/TemporaryClass"
, {})) {
compiled
->UnloadAssembly(); }
path = Path_TemporaryClass;
path
=
L"Workflow/TemporaryClass"
;
assemblyType
=
GuiInstanceCompiledWorkflow
::
;
break
;
case
Instance_CompileInstanceClass
:
UNLOAD_ASSEMBLY(Path_TemporaryClass)
if
(
auto
=
(
,
L"Workflow/TemporaryClass"
, {})) {
compiled
->UnloadTypes(); }
path = Path_InstanceClass;
path
=
L"Workflow/InstanceClass"
;
assemblyType
=
GuiInstanceCompiledWorkflow
::
;
break
;
default
:
return
;
}
auto sharedCompiled = Workflow_GetModule(context, Path_Shared, {});
auto
=
(
,
L"Workflow/Shared"
, {});
auto
=
(
,
path
,
assemblyType
);
if
(
sharedCompiled
&&
compiled
)
{
(
compiled
,
(
sharedCompiled
->modules)
.Where([](
const
GuiInstanceCompiledWorkflow
::
&
)
{
return
module
.
;
}),
true
);
}
switch
(
.
)
{
case
Instance_CompileInstanceTypes
:
Workflow_GenerateAssembly
(
,
path
,
,
false
,
.
);
compiled
.
();
break
;
case
Instance_CompileEventHandlers
:
Workflow_GenerateAssembly
(
,
path
,
,
false
,
.
);
break
;
case
Instance_CompileInstanceClass
:
Workflow_GenerateAssembly
(
,
path
,
,
true
,
.
);
break
;
default
:;
}
Workflow_ClearScriptPosition
(
);
()->
();
}
#undef DELETE_ASSEMBLY
#undef UNLOAD_ASSEMBLY
#undef ENSURE_ASSEMBLY_EXISTS
IGuiResourceTypeResolver_Precompile
*
()
override
{
return
this
;
}
IGuiResourceTypeResolver_IndirectLoad
*
()
override
{
return
this
;
}
<
>
(
<
>
,
<
>
)
override
{
if
(
auto
=
.
<
>())
{
return
obj
();
}
return
nullptr
;
}
<
>
(
<
>
,
<
>
,
::
&
)
override
{
if
(
auto
=
().
<
>())
{
<
>
=
::
(
,
xml
,
);
return
context
;
}
return
nullptr
;
}
};
class
GuiResourceInstanceStyleTypeResolver
:
public
,
public
,
private
IGuiResourceTypeResolver_IndirectLoad
{
public
:
()
override
{
return
L"InstanceStyle"
;
}
bool
()
override
{
return
true
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
L"Xml"
;
}
bool
()
override
{
return
false
;
}
IGuiResourceTypeResolver_IndirectLoad
*
()
override
{
return
this
;
}
<
>
(
<
>
,
<
>
)
override
{
if
(
auto
=
.
<
>())
{
return
obj
();
}
return
nullptr
;
}
<
>
(
<
>
,
<
>
,
::
&
)
override
{
if
(
auto
=
().
<
>())
{
auto
=
::
(
,
xml
,
);
return
context
;
}
return
nullptr
;
}
};
class
GuiResourceAnimationTypeResolver
:
public
,
public
,
private
IGuiResourceTypeResolver_Precompile
,
private
IGuiResourceTypeResolver_IndirectLoad
{
public
:
()
override
{
return
L"Animation"
;
}
bool
()
override
{
return
true
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
L"Xml"
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
;
}
(
)
override
{
switch
(
)
{
case
Instance_CollectInstanceTypes
:
case
Instance_CollectEventHandlers
:
case
Instance_GenerateInstanceClass
:
return
;
default
:
return
;
}
}
void
(
<
>
,
GuiResourcePrecompileContext
&
,
::
&
)
override
{
bool
=
true
;
auto path = Path_InstanceClass;
auto
=
L"Workflow/InstanceClass"
;
auto
=
GuiInstanceCompiledWorkflow
::
;
switch
(
.
)
{
case
Instance_CollectEventHandlers
:
case
Instance_CollectInstanceTypes
:
generateImpl
=
false
;
path = Path_TemporaryClass;
path
=
L"Workflow/TemporaryClass"
;
assemblyType
=
GuiInstanceCompiledWorkflow
::
;
case
Instance_GenerateInstanceClass
:
{
if
(
auto
=
().
<
GuiInstanceGradientAnimation
>())
{
if
(
auto
=
obj
(
,
L"<animation>"
+
obj
,
generateImpl
,
))
{
(
,
path
,
module
,
assemblyType
,
obj
);
}
}
}
break
;
}
}
void
(
GuiResourcePrecompileContext
&
,
::
&
)
override
{
CHECK_FAIL(L"GuiResourceAnimationTypeResolver::PerPassPrecompile(GuiResourcePrecompileContext&, GuiResourceError::List&)#This function should not be called.");
do
{
throw
(
L"GuiResourceAnimationTypeResolver::PerPassPrecompile(GuiResourcePrecompileContext&, GuiResourceError::List&)#This function should not be called."
);}
while
(
0
);
}
IGuiResourceTypeResolver_Precompile
*
()
override
{
return
this
;
}
IGuiResourceTypeResolver_IndirectLoad
*
()
override
{
return
this
;
}
<
>
(
<
>
,
<
>
)
override
{
if
(
auto
=
.
<
GuiInstanceGradientAnimation
>())
{
return
obj
();
}
return
nullptr
;
}
<
>
(
<
>
,
<
>
,
::
&
)
override
{
if
(
auto
=
().
<
>())
{
if
(
xml
.
==
L"Gradient"
)
{
return
GuiInstanceGradientAnimation
::
(
,
xml
,
);
}
else
{
.
({
{ {
},
xml
.
},
L"Precompile: Unknown animation type: \""
+
xml
.
+
L"\"."
});
}
}
return
nullptr
;
}
};
class
GuiResourceLocalizedStringsTypeResolver
:
public
,
public
,
private
IGuiResourceTypeResolver_Precompile
,
private
IGuiResourceTypeResolver_IndirectLoad
{
public
:
()
override
{
return
L"LocalizedStrings"
;
}
bool
()
override
{
return
true
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
L"Xml"
;
}
bool
()
override
{
return
false
;
}
()
override
{
return
+
1
;
}
(
)
override
{
switch
(
)
{
case
:
return
;
default
:
return
;
}
}
void
(
<
>
,
GuiResourcePrecompileContext
&
,
::
&
)
override
{
switch
(
.
)
{
case
:
{
if
(
auto
=
().
<
GuiInstanceLocalizedStrings
>())
{
if
(
auto
=
obj
(
,
L"<localized-strings>"
+
obj
,
))
{
Workflow_AddModule(context, Path_Shared, module, GuiInstanceCompiledWorkflow::Shared, obj->tagPosition);
(
,
L"Workflow/Shared"
,
module
,
GuiInstanceCompiledWorkflow
::
,
obj
);
}
}
}
break
;
}
}
void
(
GuiResourcePrecompileContext
&
,
::
&
)
override
{
CHECK_FAIL(L"GuiResourceLocalizedStringsTypeResolver::PerPassPrecompile(GuiResourcePrecompileContext&, GuiResourceError::List&)#This function should not be called.");
do
{
throw
(
L"GuiResourceLocalizedStringsTypeResolver::PerPassPrecompile(GuiResourcePrecompileContext&, GuiResourceError::List&)#This function should not be called."
);}
while
(
0
);
}
IGuiResourceTypeResolver_Precompile
*
()
override
{
return
this
;
}
IGuiResourceTypeResolver_IndirectLoad
*
()
override
{
return
this
;
}
<
>
(
<
>
,
<
>
)
override
{
if
(
auto
=
.
<
GuiInstanceLocalizedStrings
>())
{
return
obj
();
}
return
nullptr
;
}
<
>
(
<
>
,
<
>
,
::
&
)
override
{
if
(
auto
=
().
<
>())
{
return
GuiInstanceLocalizedStrings
::
(
,
xml
,
);
}
return
nullptr
;
}
};
#undef Path_Shared
#undef Path_TemporaryClass
#undef Path_InstanceClass
class
GuiCompilerTypeResolversPlugin
:
public
,
public
{
public
:
GUI_PLUGIN_NAME(GacUI_Compiler_InstanceTypeResolvers)
vl
::
()
override
{
return
L"GacUI_Compiler_InstanceTypeResolvers"
; }
void
(
vl
::
collections
::
<
>&
)
override
{
GUI_PLUGIN_DEPEND(GacUI_Res_ResourceResolver);
.
(
L"GacUI_Res_ResourceResolver"
);
}
void
()
override
{
IGuiResourceResolverManager
*
=
GetResourceResolverManager
();
manager
->
(
new
GuiResourceSharedScriptTypeResolver
);
manager
->
(
new
GuiResourceInstanceTypeResolver
);
manager
->
(
new
GuiResourceInstanceStyleTypeResolver
);
manager
->
(
new
GuiResourceAnimationTypeResolver
);
manager
->
(
new
GuiResourceLocalizedStringsTypeResolver
);
}
void
()
override
{
}
};
GUI_REGISTER_PLUGIN(GuiCompilerTypeResolversPlugin)
class
GuiRegisterPluginClass_GuiCompilerTypeResolversPlugin
{
public
:
GuiRegisterPluginClass_GuiCompilerTypeResolversPlugin
() {
vl
::
presentation
::
controls
::
()->
(
new
GuiCompilerTypeResolversPlugin
); } }
instance_GuiRegisterPluginClass_GuiCompilerTypeResolversPlugin
;
}
}