mirror of
https://github.com/twiglet/cs2j.git
synced 2025-01-18 13:15:17 +01:00
Ordinarily cast expressions have only unary_expressions as target, but 'as' expansion can provide full expressions
This commit is contained in:
parent
6b3c19f823
commit
752f86e065
@ -840,8 +840,8 @@ relational_expression:
|
|||||||
( ((o='<'|o='>'|o='>='|o='<=') s2=shift_expression -> ^($o $relational_expression $s2))
|
( ((o='<'|o='>'|o='>='|o='<=') s2=shift_expression -> ^($o $relational_expression $s2))
|
||||||
| (i='is' t=non_nullable_type -> ^(INSTANCEOF[$i.Token,"instanceof"] $relational_expression $t)
|
| (i='is' t=non_nullable_type -> ^(INSTANCEOF[$i.Token,"instanceof"] $relational_expression $t)
|
||||||
| i1='as' t1=non_nullable_type -> ^(COND_EXPR[$i1.Token, "?:"]
|
| i1='as' t1=non_nullable_type -> ^(COND_EXPR[$i1.Token, "?:"]
|
||||||
^(INSTANCEOF[$i1.Token,"instanceof"] { dupTree($relational_expression.tree) } { dupTree($t1.tree) } )
|
^(INSTANCEOF[$i1.Token,"instanceof"] { dupTree($s1.tree) } { dupTree($t1.tree) } )
|
||||||
^(CAST_EXPR[$i1.Token, "(cast)"] { dupTree($t1.tree) } { dupTree($relational_expression.tree) })
|
^(CAST_EXPR[$i1.Token, "(cast)"] { dupTree($t1.tree) } { dupTree($s1.tree) })
|
||||||
^(CAST_EXPR[$i1.Token, "(cast)"] { dupTree($t1.tree) } NULL[$i1.Token, "null"])))
|
^(CAST_EXPR[$i1.Token, "(cast)"] { dupTree($t1.tree) } NULL[$i1.Token, "null"])))
|
||||||
)* ;
|
)* ;
|
||||||
equality_expression:
|
equality_expression:
|
||||||
|
@ -734,7 +734,7 @@ unary_expression returns [int precedence]
|
|||||||
}:
|
}:
|
||||||
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
|
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
|
||||||
// ^(CAST_EXPR type expression)
|
// ^(CAST_EXPR type expression)
|
||||||
^(CAST_EXPR type u0=unary_expression) { $precedence = precedence[CAST_EXPR]; } -> cast_expr(type= { $type.st}, exp = { $u0.st})
|
^(CAST_EXPR type u0=expression) { $precedence = precedence[CAST_EXPR]; } -> cast_expr(type= { $type.st}, exp = { $u0.st})
|
||||||
| primary_or_array_creation_expression { $precedence = $primary_or_array_creation_expression.precedence; } -> { $primary_or_array_creation_expression.st }
|
| primary_or_array_creation_expression { $precedence = $primary_or_array_creation_expression.precedence; } -> { $primary_or_array_creation_expression.st }
|
||||||
| ^((op=MONOPLUS | op=MONOMINUS | op=MONONOT | op=MONOTWIDDLE | op=PREINC | op=PREDEC) u1=unary_expression) { $precedence = precedence[$op.token.Type]; }
|
| ^((op=MONOPLUS | op=MONOMINUS | op=MONONOT | op=MONOTWIDDLE | op=PREINC | op=PREDEC) u1=unary_expression) { $precedence = precedence[$op.token.Type]; }
|
||||||
-> op(postparen={ comparePrecedence($op.token, $u1.precedence) <= 0 }, op={ $op.token.Text }, post={$u1.st})
|
-> op(postparen={ comparePrecedence($op.token, $u1.precedence) <= 0 }, op={ $op.token.Text }, post={$u1.st})
|
||||||
|
@ -1448,28 +1448,28 @@ cast_expression returns [TypeRepTemplate dotNetType]
|
|||||||
if (ret != null)
|
if (ret != null)
|
||||||
$cast_expression.tree = ret;
|
$cast_expression.tree = ret;
|
||||||
}:
|
}:
|
||||||
^(c=CAST_EXPR type unary_expression)
|
^(c=CAST_EXPR type expression)
|
||||||
{
|
{
|
||||||
$dotNetType = $type.dotNetType;
|
$dotNetType = $type.dotNetType;
|
||||||
if ($type.dotNetType != null && $unary_expression.dotNetType != null) {
|
if ($type.dotNetType != null && $expression.dotNetType != null) {
|
||||||
// see if expression's type has a cast to type
|
// see if expression's type has a cast to type
|
||||||
ResolveResult kaster = $unary_expression.dotNetType.ResolveCastTo($type.dotNetType, AppEnv);
|
ResolveResult kaster = $expression.dotNetType.ResolveCastTo($type.dotNetType, AppEnv);
|
||||||
if (kaster == null) {
|
if (kaster == null) {
|
||||||
// see if type has a cast from expression's type
|
// see if type has a cast from expression's type
|
||||||
kaster = $type.dotNetType.ResolveCastFrom($unary_expression.dotNetType, AppEnv);
|
kaster = $type.dotNetType.ResolveCastFrom($expression.dotNetType, AppEnv);
|
||||||
}
|
}
|
||||||
if (kaster != null) {
|
if (kaster != null) {
|
||||||
if (!String.IsNullOrEmpty(kaster.Result.Warning)) Warning($c.line, kaster.Result.Warning);
|
if (!String.IsNullOrEmpty(kaster.Result.Warning)) Warning($c.line, kaster.Result.Warning);
|
||||||
Dictionary<string,CommonTree> myMap = new Dictionary<string,CommonTree>();
|
Dictionary<string,CommonTree> myMap = new Dictionary<string,CommonTree>();
|
||||||
myMap["expr"] = wrapExpression($unary_expression.tree, $c.token);
|
myMap["expr"] = wrapExpression($expression.tree, $c.token);
|
||||||
myMap["TYPEOF_totype"] = wrapTypeOfType($type.dotNetType, $c.token);
|
myMap["TYPEOF_totype"] = wrapTypeOfType($type.dotNetType, $c.token);
|
||||||
myMap["TYPEOF_expr"] = wrapTypeOfType($unary_expression.dotNetType, $c.token);
|
myMap["TYPEOF_expr"] = wrapTypeOfType($expression.dotNetType, $c.token);
|
||||||
ret = mkJavaWrapper(kaster.Result.Java, myMap, $c.token);
|
ret = mkJavaWrapper(kaster.Result.Java, myMap, $c.token);
|
||||||
AddToImports(kaster.Result.Imports);
|
AddToImports(kaster.Result.Imports);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
-> ^($c { ($unary_expression.dotNetType != null && $unary_expression.dotNetType.TypeName == "System.Object" ? mkBoxedType($type.tree, $type.tree.Token) : $type.tree) } unary_expression)
|
-> ^($c { ($expression.dotNetType != null && $expression.dotNetType.TypeName == "System.Object" ? mkBoxedType($type.tree, $type.tree.Token) : $type.tree) } expression)
|
||||||
// -> ^($c { ($type.dotNetType.IsUnboxedType && !$unary_expression.dotNetType.IsUnboxedType ? mkBoxedType($type.tree, $type.tree.Token) : $type.tree) } unary_expression)
|
// -> ^($c { ($type.dotNetType.IsUnboxedType && !$unary_expression.dotNetType.IsUnboxedType ? mkBoxedType($type.tree, $type.tree.Token) : $type.tree) } unary_expression)
|
||||||
;
|
;
|
||||||
assignment_operator:
|
assignment_operator:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user