#include "GuiInstanceLocalizedStrings.h"
#include "WorkflowCodegen/GuiInstanceLoader_WorkflowCodegen.h"
namespace
{
namespace
{
using
namespace
collections
;
using
namespace
parsing
;
using
namespace
parsing
::
xml
;
using
namespace
workflow
;
using
namespace
workflow
::
analyzer
;
using
namespace
reflection
::
description
;
GuiInstanceLocalizedStrings
::
::
()
{
return
(
).Aggregate(
(
L""
), [](
const
&
,
const
&
)
{
return
a
L""
?
b
:
a
+
L";"
+
b
;
});
}
<
GuiInstanceLocalizedStrings
>
GuiInstanceLocalizedStrings
::
(
<
>
,
<
parsing
::
xml
::
>
,
::
&
)
{
auto
=
<
GuiInstanceLocalizedStrings
>();
if
(
.
!=
L"LocalizedStrings"
)
{
.
(
({ {
},
.
},
L"Precompile: The root element of localized strings should be \"LocalizedStrings\"."
));
return
nullptr
;
}
ls
{ {
},
.
.
};
auto
=
(
,
L"ref.Class"
);
if
(!
attClassName
)
{
.
(
({ {
},
.
},
L"Precompile: Missing attribute \"ref.Class\" in \"LocalizedStrings\"."
));
}
else
{
ls
=
attClassName
->value.value;
}
auto
=
(
,
L"DefaultLocale"
);
if
(!
attDefaultLocale
)
{
.
(
({ {
},
.
},
L"Precompile: Missing attribute \"DefaultLocale\" in \"LocalizedStrings\"."
));
}
else
{
ls
=
attDefaultLocale
->value.value;
}
if
(!
attClassName
|| !
attDefaultLocale
)
{
return
nullptr
;
}
<
>
;
FOREACH(Ptr<XmlElement>, xmlStrings, XmlGetElements(xml->rootElement))
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
(
));
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
xmlStrings
);)
{
if
(
xmlStrings
.
!=
L"Strings"
)
{
.
(
({ {
},
xmlStrings
.
},
L"Precompile: Unknown element \""
+
xmlStrings
.
+
L"\", it should be \"Strings\"."
));
continue
;
}
auto
=
(
xmlStrings
,
L"Locales"
);
if
(!
attLocales
)
{
.
(
({ {
},
xmlStrings
.
},
L"Precompile: Missing attribute \"Locales\" in \"Strings\"."
));
}
else
{
auto
=
<
GuiInstanceLocalizedStrings
::
>();
ls
.
(
lss
);
lss
{ {
},
xmlStrings
.
.
};
(
attLocales
->value.value,
lss
);
FOREACH(WString, locale, lss->locales)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
>&
= ::
vl
::
collections
::
(
lss
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
;
__foreach_iterator__
.
(
locale
);)
{
if
(!
existingLocales
.
(
locale
))
{
existingLocales
.
(
locale
);
}
else
{
.
(
({ {
},
attLocales
->codeRange.start },
L"Precompile: Locale \""
+
locale
+
L"\" already exists."
));
}
}
FOREACH(Ptr<XmlElement>, xmlString, XmlGetElements(xmlStrings))
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
(
xmlStrings
));
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
xmlString
);)
{
if
(
xmlString
.
!=
L"String"
)
{
.
(
({ {
},
xmlString
.
},
L"Precompile: Unknown element \""
+
xmlString
.
+
L"\", it should be \"String\"."
));
continue
;
}
auto
=
(
xmlString
,
L"Name"
);
auto
=
(
xmlString
,
L"Text"
);
if
(!
attName
)
{
.
(
({ {
},
xmlString
.
},
L"Precompile: Missing attribute \"Name\" in \"String\"."
));
}
if
(!
attText
)
{
.
(
({ {
},
xmlString
.
},
L"Precompile: Missing attribute \"Text\" in \"String\"."
));
}
if
(
attName
&&
attText
)
{
if
(
lss
.
().
(
attName
->value.value))
{
.
(
({ {
},
xmlString
.
},
L"Precompile: String \""
+
attName
->value.value +
L"\" already exists."
));
}
else
{
auto
=
<
GuiInstanceLocalizedStrings
::
>();
item
=
attName
->value.value;
item
text
=
attText
->value.value;
item
= { {
},
attText
->value.codeRange.start };
item
.
+=
1
;
lss
.
(
item
,
item
);
}
}
}
}
}
if
(!
existingLocales
.
(
ls
))
{
.
(
({ {
},
.
},
L"Precompile: Strings for the default locale \""
+
ls
+
L"\" is not defined."
));
}
return
ls
;
}
<
parsing
::
xml
::
>
GuiInstanceLocalizedStrings
::
()
{
auto
=
<
>();
xml
.
=
L"LocalizedStrings"
;
{
auto
=
<
>();
att
.
=
L"ref.Class"
;
att
.
;
xml
.
(
att
);
}
{
auto
=
<
>();
att
.
=
L"DefaultLocale"
;
att
.
;
xml
.
(
att
);
}
FOREACH(Ptr<GuiInstanceLocalizedStrings::Strings>, lss, strings)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
GuiInstanceLocalizedStrings
::
>>&
= ::
vl
::
collections
::
(
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
GuiInstanceLocalizedStrings
::
>
;
__foreach_iterator__
.
(
lss
);)
{
auto
=
<
>();
xml
.
(
xmlStrings
);
xmlStrings
.
=
L"Strings"
;
{
auto
=
<
>();
att
.
=
L"Strings"
;
att
.
lss
();
xmlStrings
.
(
att
);
}
FOREACH(Ptr<GuiInstanceLocalizedStrings::StringItem>, lssi, lss->items.Values())
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
GuiInstanceLocalizedStrings
::
>>&
= ::
vl
::
collections
::
(
lss
.
());
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
GuiInstanceLocalizedStrings
::
>
;
__foreach_iterator__
.
(
lssi
);)
{
auto
=
<
>();
xmlStrings
.
(
xmlString
);
{
auto
=
<
>();
att
.
=
L"Name"
;
att
.
lssi
;
xmlString
.
(
att
);
}
{
auto
=
<
>();
att
.
=
L"Text"
;
att
.
lssi
text
;
xmlString
.
(
att
);
}
}
}
return
xml
;
}
<
GuiInstanceLocalizedStrings
::
>
GuiInstanceLocalizedStrings
::
()
{
return
(
)
.Where([=](
<
>
)
{
return
strings
.
(
);
})
.First();
}
GuiInstanceLocalizedStrings
::
(
bool
)
{
auto pair = INVLOC.FindLast(className, L"::", Locale::None);
auto
=
vl
::
::
().
(
,
L"::"
,
::
);
if
(
pair
.key == -
1
)
{
return
L"I"
+
+
L"Strings"
;
}
else
{
auto
=
.
(
pair
.key +
2
);
auto
=
.
(
.
() -
ns
.Length());
return
(
?
ns
:
L""
) +
L"I"
+
name
+
L"Strings"
;
}
}
<
GuiInstanceLocalizedStrings
::
>
GuiInstanceLocalizedStrings
::
(
const
&
,
,
::
&
)
{
const
wchar_t
*
=
.
();
const
wchar_t
*
=
reading
;
(
0
,
0
);
auto
=
<
>();
auto
= [&](
const
&
)
{
auto
=
;
errorPos
.
+=
formatPos
.
;
errorPos
.
= (
formatPos
.
==
0
?
errorPos
.
:
0
) +
formatPos
.
;
.
({
errorPos
,
message
});
};
bool
=
true
;
while
(*
reading
)
{
const
wchar_t
*
=
(
reading
,
L"$("
);
if
(
begin
)
{
auto
=
(
reading
,
(
begin
-
reading
));
if
(
addedParameter
)
{
textDesc
.
(
text
);
}
else
{
textDesc
textDesc
.
() -
1
]
text
;
}
}
else
{
break
;
}
const
wchar_t
*
=
(
begin
,
L")"
);
if
(!
end
)
{
addError
(
L"Precompile: Does not find matched close bracket."
);
return
nullptr
;
}
while
(
textPosCounter
++ <
begin
+
2
)
{
switch
(
textPosCounter
[-
1
])
{
case
'\n'
:
formatPos
.
++;
formatPos
.
=
0
;
break
;
default
:
formatPos
.
++;
break
;
}
}
if
(
end
-
begin
==
3
&&
(
begin
,
L"$($)"
,
4
) ==
0
)
{
addedParameter
=
false
;
textDesc
textDesc
.
() -
1
] +=
L"$"
;
}
else
{
addedParameter
=
true
;
const
wchar_t
*
=
begin
+
2
;
const
wchar_t
*
=
number
;
while
(
L'0'
<= *
numberEnd
&& *
numberEnd
<
L'9'
)
{
numberEnd
++;
}
if
(
number
==
numberEnd
)
{
addError
(
L"Precompile: Unexpected character, the correct format is $(index) or $(index:function)."
);
return
nullptr
;
}
<
>
;
;
if
(*
numberEnd
==
L':'
)
{
if
(
end
-
numberEnd
>
1
)
{
function
(
numberEnd
+
1
, (
)(
end
-
numberEnd
-
1
));
if
(
function
==
L"ShortDate"
||
function
==
L"LongDate"
||
function
==
L"YearMonthDate"
||
function
==
L"ShortTime"
||
function
==
L"LongTime"
)
{
type
<
>::
();
}
else
if
(
function
.
() >=
5
&& (
function
.
(
5
) ==
L"Date:"
||
function
.
(
5
) ==
L"Time:"
))
{
type
<
>::
();
}
else
if
(
function
==
L"Number"
||
function
==
L"Currency"
)
{
type
<
>::
();
}
else
{
addError
(
L"Precompile: Unknown formatting function name \""
+
function
+
L"\"."
);
return
nullptr
;
}
}
else
{
addError
(
L"Precompile: Unexpected character, the correct format is $(index) or $(index:function)."
);
return
nullptr
;
}
}
else
if
(
numberEnd
!=
end
)
{
addError
(
L"Precompile: Unexpected character, the correct format is $(index) or $(index:function)."
);
return
nullptr
;
}
if
(!
type
)
{
type
<
>::
();
}
textDesc
.
({
type
,
function
});
textDesc
.
(
(
(
number
, (
)(
numberEnd
-
number
))));
}
reading
=
end
+
1
;
}
if
(*
reading
||
textDesc
.
() ==
0
)
{
textDesc
.
(
reading
);
}
FOREACH_INDEXER(vint, i, index, From(textDesc->positions).OrderBy([](vint a, vint b) {return a - b; }))
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
>&
= ::
vl
::
collections
::
(
(
textDesc
).OrderBy([](
,
) {
return
a
-
b
; }));
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
if
(
bool
=
true
)
for
(
=
0
;
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
;
__foreach_iterator__
.
(
i
);
index
++)
{
if
(
i
!=
index
)
{
.
({
,
L"Precompile: Missing parameter \""
+
(
index
) +
L"\"."
});
return
nullptr
;
}
}
return
textDesc
;
}
void
GuiInstanceLocalizedStrings
::
(
&
,
GuiResourcePrecompileContext
&
,
::
&
)
{
auto
=
();
=
.
();
FOREACH(Ptr<Strings>, lss, strings)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
lss
);)
{
if
(
lss
defaultStrings
)
{
auto
=
lss
();
auto
=
(
defaultStrings
.
())
.
(
lss
.
())
.
(
(
L""
), [](
const
&
,
const
&
)
{
return
a
L""
?
b
:
a
+
L", "
+
b
;
});
auto
=
(
lss
.
())
.
(
defaultStrings
.
())
.
(
(
L""
), [](
const
& ,
const
& )
{
return
a
L""
?
b
:
a
+
L", "
+
b
;
});
if
(
missing
!=
L""
)
{
.
({
lss
,
L"Precompile: Missing strings for locale \""
+
localesName
+
L"\": "
+
missing
+
L"."
});
}
if
(
extra
!=
L""
)
{
.
({
lss
,
L"Precompile: Unnecessary strings for locale \""
+
localesName
+
L"\": "
+
extra
+
L"."
});
}
}
}
if
(
.
() !=
errorCount
)
{
return
;
}
FOREACH(Ptr<StringItem>, lssi, defaultStrings->items.Values())
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
defaultStrings
.
());
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
lssi
);)
{
if
(
auto
=
(
lssi
text
,
lssi
,
))
{
.
({
defaultStrings
,
lssi
},
textDesc
);
}
}
if
(
.
() !=
errorCount
)
{
return
;
}
auto
=
defaultStrings
();
FOREACH(Ptr<Strings>, lss, strings)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
lss
);)
{
if
(
lss
defaultStrings
)
{
auto
=
lss
();
FOREACH(Ptr<StringItem>, lssi, lss->items.Values())
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
lss
.
());
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
lssi
);)
{
if
(
auto
=
(
lssi
text
,
lssi
,
))
{
.
({
lss
,
lssi
},
textDesc
);
auto
=
{
defaultStrings
,
lssi
}];
if
(
defaultDesc
.
() !=
textDesc
.
())
{
.
({
lss
,
L"String \""
+
lssi
+
L"\" in locales \""
+
defaultLocalesName
+
L"\" and \""
+
localesName
+
L"\" have different numbers of parameters."
});
}
else
{
for
(
=
0
;
i
<
textDesc
.
();
i
++)
{
auto
=
defaultDesc
defaultDesc
i
]];
auto
=
textDesc
textDesc
i
]];
if
(
defaultParameter
.
()->
()
parameter
.
()->
())
{
.
({
lss
,
L"Parameter \""
+
(
i
) +
L"\" in String \""
+
lssi
+
L"\" in locales \""
+
defaultLocalesName
+
L"\" and \""
+
localesName
+
L"\" are in different types \""
+
defaultParameter
.
() +
L"\" and \""
+
parameter
.
() +
L"\"."
});
}
}
}
}
}
}
}
if
(
.
() !=
errorCount
)
{
return
;
}
}
<
workflow
::
>
GuiInstanceLocalizedStrings
::
(
<
>
,
const
&
,
workflow
::
)
{
auto
=
<
>();
func
=
::
;
func
.
;
func
(
<
>::
().
());
{
auto
=
<
>();
member
=
;
func
member
;
}
for
(
=
0
;
i
<
.
();
i
++)
{
auto
=
i
]];
auto
=
<
>();
argument
.
=
L"<ls>"
+
(
i
);
argument
(
type
.
.
());
func
.
(
argument
);
}
return
func
;
}
<
workflow
::
>
GuiInstanceLocalizedStrings
::
(
&
,
<
>
)
{
auto
=
<
>();
{
auto
=
<
>();
refType
.
(
false
);
auto
=
<
>();
refPointer
refType
;
lsExpr
refPointer
;
}
FOREACH(Ptr<StringItem>, lss, ls->items.Values())
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
.
());
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
lss
);)
{
auto
=
{
,
lss
}];
auto
=
(
textDesc
,
lss
,
::
);
lsExpr
.
(
func
);
auto
=
<
>();
func
block
;
<
>
;
auto
= [&](
<
>
)
{
if
(
resultExpr
)
{
auto
=
<
>();
binaryExpr
=
::
;
binaryExpr
resultExpr
;
binaryExpr
strExpr
;
resultExpr
binaryExpr
;
}
else
{
resultExpr
strExpr
;
}
};
for
(
=
0
;
i
<
textDesc
.
();
i
++)
{
auto
=
<
>();
varDesc
.
=
L"<ls>_"
+
(
i
);
auto
=
<
>();
varStat
varDesc
;
block
.
(
varStat
);
auto
=
textDesc
i
].
;
auto
=
textDesc
i
].
;
auto
=
textDesc
i
];
if
(
function
==
L"ShortDate"
||
function
==
L"LongDate"
||
function
==
L"YearMonthDate"
||
function
==
L"ShortTime"
||
function
==
L"LongTime"
)
{
auto
=
GetExpressionFromTypeDescriptor
(
description
::
<
>());
auto
=
<
>();
refFormats
refLoc
;
refFormats
.
=
L"Get"
+
function
+
L"Formats"
;
auto
=
<
>();
refLocale
.
=
L"<ls>locale"
;
auto
=
<
>();
callFormats
refFormats
;
callFormats
.
(
refLocale
);
auto
=
<
>();
refFirst
.
=
L"<ls>First"
;
auto
=
<
>();
{
callFirst
refFirst
;
callFirst
.
(
callFormats
);
}
auto
=
<
>();
refLocale2
.
=
L"<ls>locale"
;
auto
=
<
>();
refParameter
.
=
L"<ls>"
+
(
index
);
auto
=
GetExpressionFromTypeDescriptor
(
description
::
<
>());
auto
=
<
>();
refFD
refLoc2
;
refFD
.
=
L"Format"
+
function
.
(
4
);
auto
=
<
>();
callFD
refFD
;
callFD
.
(
refLocale2
);
callFD
.
(
callFirst
);
callFD
.
(
refParameter
);
varDesc
callFD
;
}
else
if
(
function
.
() >=
5
&& (
function
.
(
5
) ==
L"Date:"
||
function
.
(
5
) ==
L"Time:"
))
{
auto
=
<
>();
refLocale
.
=
L"<ls>locale"
;
auto
=
<
>();
refFormat
.
function
.
(
function
.
() -
5
);
auto
=
<
>();
refParameter
.
=
L"<ls>"
+
(
index
);
auto
=
GetExpressionFromTypeDescriptor
(
description
::
<
>());
auto
=
<
>();
refFD
refLoc2
;
refFD
.
=
L"Format"
+
function
.
(
4
);
auto
=
<
>();
callFD
refFD
;
callFD
.
(
refLocale
);
callFD
.
(
refFormat
);
callFD
.
(
refParameter
);
varDesc
callFD
;
}
else
if
(
function
==
L"Number"
||
function
==
L"Currency"
)
{
auto
=
<
>();
refLocale
.
=
L"<ls>locale"
;
auto
=
<
>();
refParameter
.
=
L"<ls>"
+
(
index
);
auto
=
GetExpressionFromTypeDescriptor
(
description
::
<
>());
auto
=
<
>();
refFD
refLoc2
;
refFD
.
=
L"Format"
+
function
;
auto
=
<
>();
callFD
refFD
;
callFD
.
(
refLocale
);
callFD
.
(
refParameter
);
varDesc
callFD
;
}
else
{
auto
=
<
>();
refParameter
.
=
L"<ls>"
+
(
index
);
varDesc
refParameter
;
}
}
for
(
=
0
;
i
<
textDesc
.
();
i
++)
{
if
(
textDesc
i
] !=
L""
)
{
auto
=
<
>();
strExpr
.
textDesc
i
];
appendExpr
(
strExpr
);
}
if
(
i
<
textDesc
.
())
{
auto
=
<
>();
refExpr
.
=
L"<ls>_"
+
(
i
);
appendExpr
(
refExpr
);
}
}
if
(!
resultExpr
)
{
resultExpr
<
>();
}
auto
=
<
>();
returnStat
resultExpr
;
block
.
(
returnStat
);
}
return
lsExpr
;
}
<
workflow
::
>
GuiInstanceLocalizedStrings
::
(
GuiResourcePrecompileContext
&
,
const
&
,
::
&
)
{
=
.
();
;
(
textDescs
,
,
);
if
(
.
() !=
errorCount
)
{
return
nullptr
;
}
auto
=
<
>();
module
.
;
{
auto
=
(
(
true
),
module
);
lsInterface
=
::
;
lsInterface
=
::
;
auto
=
();
FOREACH(WString, functionName, defaultStrings->items.Keys())
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
>&
= ::
vl
::
collections
::
(
defaultStrings
.
());
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
;
__foreach_iterator__
.
(
functionName
);)
{
auto
=
(
textDescs
{
defaultStrings
,
functionName
}],
functionName
,
::
);
lsInterface
.
(
func
);
}
}
auto
=
(
,
module
);
{
auto
=
<
>();
lsClass
.
(
func
);
func
=
::
;
func
.
=
L"<ls>First"
;
func
(
<
>::
().
());
{
auto
=
<
>();
argument
(
<
<
>>::
().
());
argument
.
=
L"<ls>formats"
;
func
.
(
argument
);
}
{
auto
=
<
>();
member
=
::
;
func
member
;
}
auto
=
<
>();
func
block
;
{
auto
=
<
>();
block
.
(
forStat
);
forStat
.
=
L"<ls>format"
;
forStat
=
::
;
auto
=
<
>();
refArgument
.
=
L"<ls>formats"
;
forStat
refArgument
;
auto
=
<
>();
forStat
forBlock
;
{
auto
=
<
>();
refFormat
.
=
L"<ls>format"
;
auto
=
<
>();
returnStat
refFormat
;
forBlock
.
(
returnStat
);
}
}
{
auto
=
<
>();
returnStat
<
>();
block
.
(
returnStat
);
}
}
{
auto
=
<
>();
lsClass
.
(
func
);
func
=
::
;
func
.
=
L"Get"
;
{
auto
=
<
>();
refType
.
(
false
);
auto
=
<
>();
refPointer
refType
;
func
refPointer
;
}
{
auto
=
<
>();
member
=
::
;
func
member
;
}
{
auto
=
<
>();
argument
.
=
L"<ls>locale"
;
argument
(
<
>::
().
());
func
.
(
argument
);
}
auto
=
<
>();
func
block
;
auto
=
();
FOREACH(Ptr<Strings>, ls, strings)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
<
>>&
= ::
vl
::
collections
::
(
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
<
>
;
__foreach_iterator__
.
(
ls
);)
{
if
(
ls
defaultStrings
)
{
auto
=
<
>();
FOREACH(WString, locale, ls->locales)
if
(
bool
=
true
)
for
(
const
::
vl
::
collections
::
<
>&
= ::
vl
::
collections
::
(
ls
);
__scope_variable_flag__
;
__scope_variable_flag__
=
false
)
for
(
;
__foreach_iterator__
.
(
locale
);)
{
auto
=
<
>();
strExpr
.
locale
;
auto
=
<
>();
item
strExpr
;
listExpr
.
(
item
);
}
auto
=
<
>();
refLocale
.
=
L"<ls>locale"
;
auto
=
<
>();
inferExpr
(
<
>::
().
());
inferExpr
refLocale
;
auto
=
<
>();
inExpr
=
::
;
inExpr
inferExpr
;
inExpr
listExpr
;
auto
=
<
>();
block
.
(
ifStat
);
ifStat
inExpr
;
auto
=
<
>();
ifStat
trueBlock
;
auto
=
<
>();
returnStat
(
textDescs
,
ls
);
trueBlock
.
(
returnStat
);
}
}
auto
=
<
>();
returnStat
(
textDescs
,
defaultStrings
);
block
.
(
returnStat
);
}
(
.
,
.
);
(
module
, {
pos
,
pos
});
return
module
;
}
}
}