1
0
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:
Kevin Glynn 2010-12-19 16:13:15 +01:00
parent 4bde4bfb14
commit 19bf099ae4
2 changed files with 33 additions and 6 deletions

View File

@ -315,10 +315,12 @@ primary_expression returns [int precedence]
| ^((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 })
| primary_expression_start -> { $primary_expression_start.st }
| ^(access_operator expression type_or_generic) { $precedence = $access_operator.precedence; }
-> op(pre={ $expression.st }, op={ $access_operator.st }, post={ $type_or_generic.st },
preparen = { comparePrecedence($access_operator.precedence, $expression.precedence) < 0 },
postparen = { comparePrecedence($access_operator.precedence, $type_or_generic.precedence) <= 0 })
| ^(access_operator expression identifier generic_argument_list?) { $precedence = $access_operator.precedence; }
-> 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 })
// | ^(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*
// | ('base' brackets) => 'this' brackets 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_body returns [bool isSemi]:
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
// identifier -> { $identifier.st }; // IInterface<int>.Method logic added.

View File

@ -248,6 +248,10 @@ op(comments,pre,op,post,preparen,postparen,space) ::= <<
<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>
>>
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>"
generic_args(args) ::= "\<<args>\>"
parameter(annotation,param) ::= "/* <annotation> */ <param>"