mirror of
https://github.com/twiglet/cs2j.git
synced 2025-01-18 13:15:17 +01:00
fix generic method calls and add unsupported to explicit interface implementations
This commit is contained in:
parent
4bde4bfb14
commit
19bf099ae4
@ -315,10 +315,12 @@ primary_expression returns [int precedence]
|
|||||||
| ^((op=POSTINC|op=POSTDEC) expression) { $precedence = precedence[$op.token.Type]; }
|
| ^((op=POSTINC|op=POSTDEC) expression) { $precedence = precedence[$op.token.Type]; }
|
||||||
-> op(pre={$expression.st}, op={ $op.token.Text }, preparens= { comparePrecedence($op.token, $expression.precedence) <= 0 })
|
-> op(pre={$expression.st}, op={ $op.token.Text }, preparens= { comparePrecedence($op.token, $expression.precedence) <= 0 })
|
||||||
| primary_expression_start -> { $primary_expression_start.st }
|
| primary_expression_start -> { $primary_expression_start.st }
|
||||||
| ^(access_operator expression type_or_generic) { $precedence = $access_operator.precedence; }
|
| ^(access_operator expression identifier generic_argument_list?) { $precedence = $access_operator.precedence; }
|
||||||
-> op(pre={ $expression.st }, op={ $access_operator.st }, post={ $type_or_generic.st },
|
-> member_access(pre={ $expression.st }, op={ $access_operator.st }, access={ $identifier.st }, access_tyargs = { $generic_argument_list.st },
|
||||||
preparen = { comparePrecedence($access_operator.precedence, $expression.precedence) < 0 },
|
preparen = { comparePrecedence($access_operator.precedence, $expression.precedence) < 0 })
|
||||||
postparen = { comparePrecedence($access_operator.precedence, $type_or_generic.precedence) <= 0 })
|
// | ^(access_operator expression SEP identifier) { $precedence = $access_operator.precedence; }
|
||||||
|
// -> op(pre={ $expression.st }, op={ $access_operator.st }, post={ $identifier.st },
|
||||||
|
// preparen = { comparePrecedence($access_operator.precedence, $expression.precedence) < 0 })
|
||||||
// ('this' brackets) => 'this' brackets primary_expression_part*
|
// ('this' brackets) => 'this' brackets primary_expression_part*
|
||||||
// | ('base' brackets) => 'this' brackets primary_expression_part*
|
// | ('base' brackets) => 'this' brackets primary_expression_part*
|
||||||
// | primary_expression_start primary_expression_part*
|
// | primary_expression_start primary_expression_part*
|
||||||
@ -867,8 +869,29 @@ variable_declarator:
|
|||||||
// -> method_header(name={ $member_name.st }, typeparams = { $type_parameter_list.st }, params={ $formal_parameter_list.st });
|
// -> method_header(name={ $member_name.st }, typeparams = { $type_parameter_list.st }, params={ $formal_parameter_list.st });
|
||||||
method_body returns [bool isSemi]:
|
method_body returns [bool isSemi]:
|
||||||
block { $isSemi = $block.isSemi; } -> { $block.st };
|
block { $isSemi = $block.isSemi; } -> { $block.st };
|
||||||
member_name:
|
|
||||||
t+=type_or_generic ('.' t+=type_or_generic)* -> dotlist(items = { $t })
|
member_name
|
||||||
|
@init {
|
||||||
|
StringTemplate last_t = null;
|
||||||
|
ArrayList pre_ts = new ArrayList();
|
||||||
|
}
|
||||||
|
:
|
||||||
|
(type_or_generic '.') => t1=type_or_generic { last_t = $t1.st; } (op='.' tn=type_or_generic { pre_ts.Add(last_t); last_t = $tn.st; })*
|
||||||
|
{
|
||||||
|
StringTemplate interfaceText = %dotlist();
|
||||||
|
%{interfaceText}.items = pre_ts;
|
||||||
|
StringTemplate opText = %op();
|
||||||
|
%{opText}.pre = interfaceText;
|
||||||
|
%{opText}.op = $op.token.Text;
|
||||||
|
StringTemplate unsupportedText = %unsupported();
|
||||||
|
%{unsupportedText}.reason = "explicit interface implementation is not supported";
|
||||||
|
%{unsupportedText}.text = opText;
|
||||||
|
$st = %op();
|
||||||
|
%{$st}.pre = unsupportedText;
|
||||||
|
%{$st}.post = last_t;
|
||||||
|
%{$st}.op = " ";
|
||||||
|
}
|
||||||
|
| type_or_generic -> { $type_or_generic.st }
|
||||||
;
|
;
|
||||||
// keving: missing interface_type.identifier
|
// keving: missing interface_type.identifier
|
||||||
// identifier -> { $identifier.st }; // IInterface<int>.Method logic added.
|
// identifier -> { $identifier.st }; // IInterface<int>.Method logic added.
|
||||||
|
@ -248,6 +248,10 @@ op(comments,pre,op,post,preparen,postparen,space) ::= <<
|
|||||||
<comments; separator="\n">
|
<comments; separator="\n">
|
||||||
<if(pre)><if(preparen)>(<endif><pre><if(preparen)>)<endif><space><endif><op><if(post)><space><if(postparen)>(<endif><post><if(postparen)>)<endif><endif>
|
<if(pre)><if(preparen)>(<endif><pre><if(preparen)>)<endif><space><endif><op><if(post)><space><if(postparen)>(<endif><post><if(postparen)>)<endif><endif>
|
||||||
>>
|
>>
|
||||||
|
member_access(comments,pre,op,access,access_tyargs,preparen) ::= <<
|
||||||
|
<comments; separator="\n">
|
||||||
|
<if(preparen)>(<endif><pre><if(preparen)>)<endif><op><access_tyargs><access>
|
||||||
|
>>
|
||||||
assign(lhs,lhsparen,assign,rhs,rhsparen) ::= "<if(lhsparen)>(<endif><lhs><if(lhsparen)>)<endif> <assign> <if(rhsparen)>(<endif><rhs><if(rhsparen)>)<endif>"
|
assign(lhs,lhsparen,assign,rhs,rhsparen) ::= "<if(lhsparen)>(<endif><lhs><if(lhsparen)>)<endif> <assign> <if(rhsparen)>(<endif><rhs><if(rhsparen)>)<endif>"
|
||||||
generic_args(args) ::= "\<<args>\>"
|
generic_args(args) ::= "\<<args>\>"
|
||||||
parameter(annotation,param) ::= "/* <annotation> */ <param>"
|
parameter(annotation,param) ::= "/* <annotation> */ <param>"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user