vbscript: Improve parsing of separators in functions and classes.
Signed-off-by: Dmitry Kislyuk <dimaki@rocketmail.com> Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3d505b12e3
commit
31ef99245a
|
@ -396,29 +396,29 @@ PrimaryExpression
|
||||||
| tME { $$ = new_expression(ctx, EXPR_ME, 0); CHECK_ERROR; }
|
| tME { $$ = new_expression(ctx, EXPR_ME, 0); CHECK_ERROR; }
|
||||||
|
|
||||||
ClassDeclaration
|
ClassDeclaration
|
||||||
: tCLASS Identifier tNL ClassBody tEND tCLASS tNL { $4->name = $2; $$ = $4; }
|
: tCLASS Identifier StSep ClassBody tEND tCLASS StSep { $4->name = $2; $$ = $4; }
|
||||||
|
|
||||||
ClassBody
|
ClassBody
|
||||||
: /* empty */ { $$ = new_class_decl(ctx); }
|
: /* empty */ { $$ = new_class_decl(ctx); }
|
||||||
| FunctionDecl tNL ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; }
|
| FunctionDecl StSep ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; }
|
||||||
/* FIXME: We should use DimDecl here to support arrays, but that conflicts with PropertyDecl. */
|
/* FIXME: We should use DimDecl here to support arrays, but that conflicts with PropertyDecl. */
|
||||||
| Storage tIdentifier tNL ClassBody { dim_decl_t *dim_decl = new_dim_decl(ctx, $2, FALSE, NULL); CHECK_ERROR;
|
| Storage tIdentifier StSep ClassBody { dim_decl_t *dim_decl = new_dim_decl(ctx, $2, FALSE, NULL); CHECK_ERROR;
|
||||||
$$ = add_dim_prop(ctx, $4, dim_decl, $1); CHECK_ERROR; }
|
$$ = add_dim_prop(ctx, $4, dim_decl, $1); CHECK_ERROR; }
|
||||||
| tDIM DimDecl tNL ClassBody { $$ = add_dim_prop(ctx, $4, $2, 0); CHECK_ERROR; }
|
| tDIM DimDecl StSep ClassBody { $$ = add_dim_prop(ctx, $4, $2, 0); CHECK_ERROR; }
|
||||||
| PropertyDecl tNL ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; }
|
| PropertyDecl StSep ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; }
|
||||||
|
|
||||||
PropertyDecl
|
PropertyDecl
|
||||||
: Storage_opt tPROPERTY tGET tIdentifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tPROPERTY
|
: Storage_opt tPROPERTY tGET tIdentifier ArgumentsDecl_opt StSep StatementsNl_opt tEND tPROPERTY
|
||||||
{ $$ = new_function_decl(ctx, $4, FUNC_PROPGET, $1, $5, $7); CHECK_ERROR; }
|
{ $$ = new_function_decl(ctx, $4, FUNC_PROPGET, $1, $5, $7); CHECK_ERROR; }
|
||||||
| Storage_opt tPROPERTY tLET tIdentifier '(' ArgumentDecl ')' tNL StatementsNl_opt tEND tPROPERTY
|
| Storage_opt tPROPERTY tLET tIdentifier '(' ArgumentDecl ')' StSep StatementsNl_opt tEND tPROPERTY
|
||||||
{ $$ = new_function_decl(ctx, $4, FUNC_PROPLET, $1, $6, $9); CHECK_ERROR; }
|
{ $$ = new_function_decl(ctx, $4, FUNC_PROPLET, $1, $6, $9); CHECK_ERROR; }
|
||||||
| Storage_opt tPROPERTY tSET tIdentifier '(' ArgumentDecl ')' tNL StatementsNl_opt tEND tPROPERTY
|
| Storage_opt tPROPERTY tSET tIdentifier '(' ArgumentDecl ')' StSep StatementsNl_opt tEND tPROPERTY
|
||||||
{ $$ = new_function_decl(ctx, $4, FUNC_PROPSET, $1, $6, $9); CHECK_ERROR; }
|
{ $$ = new_function_decl(ctx, $4, FUNC_PROPSET, $1, $6, $9); CHECK_ERROR; }
|
||||||
|
|
||||||
FunctionDecl
|
FunctionDecl
|
||||||
: Storage_opt tSUB Identifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tSUB
|
: Storage_opt tSUB Identifier ArgumentsDecl_opt StSep StatementsNl_opt tEND tSUB
|
||||||
{ $$ = new_function_decl(ctx, $3, FUNC_SUB, $1, $4, $6); CHECK_ERROR; }
|
{ $$ = new_function_decl(ctx, $3, FUNC_SUB, $1, $4, $6); CHECK_ERROR; }
|
||||||
| Storage_opt tFUNCTION Identifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tFUNCTION
|
| Storage_opt tFUNCTION Identifier ArgumentsDecl_opt StSep StatementsNl_opt tEND tFUNCTION
|
||||||
{ $$ = new_function_decl(ctx, $3, FUNC_FUNCTION, $1, $4, $6); CHECK_ERROR; }
|
{ $$ = new_function_decl(ctx, $3, FUNC_FUNCTION, $1, $4, $6); CHECK_ERROR; }
|
||||||
|
|
||||||
Storage_opt
|
Storage_opt
|
||||||
|
|
|
@ -752,6 +752,11 @@ Private Sub TestPrivateSub
|
||||||
End Sub
|
End Sub
|
||||||
Call TestPrivateSub
|
Call TestPrivateSub
|
||||||
|
|
||||||
|
Public Sub TestSeparatorSub : :
|
||||||
|
:
|
||||||
|
End Sub
|
||||||
|
Call TestSeparatorSub
|
||||||
|
|
||||||
if false then
|
if false then
|
||||||
Function testfunc
|
Function testfunc
|
||||||
x = true
|
x = true
|
||||||
|
@ -867,6 +872,12 @@ Private Function TestPrivateFunc
|
||||||
End Function
|
End Function
|
||||||
Call TestPrivateFunc
|
Call TestPrivateFunc
|
||||||
|
|
||||||
|
Public Function TestSepFunc(ByVal a) : :
|
||||||
|
: TestSepFunc = a
|
||||||
|
End Function
|
||||||
|
Call ok(TestSepFunc(1) = 1, "Function did not return 1")
|
||||||
|
|
||||||
|
|
||||||
' Stop has an effect only in debugging mode
|
' Stop has an effect only in debugging mode
|
||||||
Stop
|
Stop
|
||||||
|
|
||||||
|
@ -1127,6 +1138,30 @@ Class Property2
|
||||||
End Sub
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
|
|
||||||
|
Class SeparatorTest : : Dim varTest1
|
||||||
|
:
|
||||||
|
Private Sub Class_Initialize : varTest1 = 1
|
||||||
|
End Sub ::
|
||||||
|
|
||||||
|
Property Get Test1() :
|
||||||
|
Test1 = varTest1
|
||||||
|
End Property ::
|
||||||
|
: :
|
||||||
|
Property Let Test1(a) :
|
||||||
|
varTest1 = a
|
||||||
|
End Property :
|
||||||
|
|
||||||
|
Public Function AddToTest1(ByVal a) :: :
|
||||||
|
varTest1 = varTest1 + a
|
||||||
|
AddToTest1 = varTest1
|
||||||
|
End Function : End Class : :: Set obj = New SeparatorTest
|
||||||
|
|
||||||
|
Call ok(obj.Test1 = 1, "obj.Test1 is not 1")
|
||||||
|
obj.Test1 = 6
|
||||||
|
Call ok(obj.Test1 = 6, "obj.Test1 is not 6")
|
||||||
|
obj.AddToTest1(5)
|
||||||
|
Call ok(obj.Test1 = 11, "obj.Test1 is not 11")
|
||||||
|
|
||||||
' Array tests
|
' Array tests
|
||||||
|
|
||||||
Call ok(getVT(arr) = "VT_EMPTY*", "getVT(arr) = " & getVT(arr))
|
Call ok(getVT(arr) = "VT_EMPTY*", "getVT(arr) = " & getVT(arr))
|
||||||
|
|
Loading…
Reference in New Issue