1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

extract interfaces

This commit is contained in:
Kevin Glynn 2010-11-01 18:02:17 +01:00
parent 945607bed2
commit 51bf268084

View File

@ -676,8 +676,8 @@ scope NSContext;
if ($type_or_generic.generic_arguments.Count > 0) { if ($type_or_generic.generic_arguments.Count > 0) {
// distinguish classes with same name, but differing numbers of type arguments // distinguish classes with same name, but differing numbers of type arguments
klass.TypeName+= "'" + $type_or_generic.generic_arguments.Count.ToString(); klass.TypeName+= "'" + $type_or_generic.generic_arguments.Count.ToString();
klass.TypeParams = $type_or_generic.generic_arguments.ToArray();
} }
klass.TypeParams = $type_or_generic.generic_arguments.ToArray();
// Nested types can see things in this space // Nested types can see things in this space
$NSContext::nss.Add(new UseRepTemplate(klass.TypeName)); $NSContext::nss.Add(new UseRepTemplate(klass.TypeName));
$NSContext::currentNS = klass.TypeName; $NSContext::currentNS = klass.TypeName;
@ -814,10 +814,13 @@ delegate_declaration:
delegate_modifiers: delegate_modifiers:
modifier+ ; modifier+ ;
// 4.0 // 4.0
variant_generic_parameter_list: variant_generic_parameter_list returns [List<string> tyargs]
'<' variant_type_parameters '>' ; @init {
variant_type_parameters: $tyargs = new List<string>();
variant_type_variable_name (',' variant_type_variable_name)* ; }:
'<' variant_type_parameters[$tyargs] '>' ;
variant_type_parameters [List<String> tyargs]:
v1=variant_type_variable_name { tyargs.Add($v1.text); } (',' vn=variant_type_variable_name { tyargs.Add($vn.text); })* ;
variant_type_variable_name: variant_type_variable_name:
attributes? variance_annotation? type_variable_name ; attributes? variance_annotation? type_variable_name ;
variance_annotation: variance_annotation:
@ -876,41 +879,77 @@ parameter_array returns [ParamRepTemplate param]:
'params' t=type i=identifier { $param=new ParamRepTemplate($t.thetext + "[]", $i.text, false); } ; 'params' t=type i=identifier { $param=new ParamRepTemplate($t.thetext + "[]", $i.text, false); } ;
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
interface_declaration: interface_declaration
'interface' identifier variant_generic_parameter_list? scope NSContext;
interface_base? type_parameter_constraints_clauses? interface_body ';'? ; @init {
$NSContext::nss = new List<UseRepTemplate>();
InterfaceRepTemplate iface = new InterfaceRepTemplate();
}
:
'interface' identifier variant_generic_parameter_list?
{
Debug("Processing interface: " + $identifier.text);
iface.Uses = this.NameSpaceContext;
iface.TypeName = this.ParentNameSpace + "." + $identifier.text;
if ($variant_generic_parameter_list.tyargs != null && $variant_generic_parameter_list.tyargs.Count > 0) {
// distinguish classes with same name, but differing numbers of type arguments
iface.TypeName+= "'" + $variant_generic_parameter_list.tyargs.Count.ToString();
iface.TypeParams = $variant_generic_parameter_list.tyargs.ToArray();
}
// Nested types can see things in this space
$NSContext::nss.Add(new UseRepTemplate(iface.TypeName));
$NSContext::currentNS = iface.TypeName;
$NSContext::currentTypeRep = iface;
AppEnv[iface.TypeName] = iface;
}
(interface_base { iface.Inherits = $interface_base.typeList.ToArray(); } )?
type_parameter_constraints_clauses? interface_body ';'? ;
interface_modifiers: interface_modifiers:
modifier+ ; modifier+ ;
interface_base: interface_base returns [List<string> typeList]:
':' interface_type_list ; ':' interface_type_list { $typeList = $interface_type_list.typeList; } ;
interface_body: interface_body:
'{' interface_member_declarations? '}' ; '{' interface_member_declarations? '}' ;
interface_member_declarations: interface_member_declarations:
interface_member_declaration+ ; interface_member_declaration+ ;
interface_member_declaration: interface_member_declaration:
attributes? modifiers? attributes? modifiers?
('void' interface_method_declaration ('void' interface_method_declaration["System.Void"]
| interface_event_declaration | interface_event_declaration
| type ( (member_name '(') => interface_method_declaration | rt=type ( (member_name '(') => interface_method_declaration[$rt.thetext]
| (member_name '{') => interface_property_declaration | (member_name '{') => interface_property_declaration[$rt.thetext]
| interface_indexer_declaration) | interface_indexer_declaration[$rt.thetext])
) )
; ;
interface_property_declaration: interface_property_declaration [string returnType]:
identifier '{' interface_accessor_declarations '}' ; identifier '{' interface_accessor_declarations '}'
interface_method_declaration: { PropRepTemplate propRep = new PropRepTemplate($returnType, $identifier.text);
propRep.CanRead = $interface_accessor_declarations.hasGetter;
propRep.CanWrite = $interface_accessor_declarations.hasSetter;
((InterfaceRepTemplate)$NSContext::currentTypeRep).Properties.Add(propRep); }
;
interface_method_declaration [string returnType]:
identifier generic_argument_list? identifier generic_argument_list?
'(' formal_parameter_list? ')' type_parameter_constraints_clauses? ';' ; '(' fpl=formal_parameter_list? ')'
{ ((InterfaceRepTemplate)$NSContext::currentTypeRep).Methods.Add(new MethodRepTemplate($returnType, $identifier.text, ($generic_argument_list.tyargs.ToArray()), $fpl.paramlist)); }
type_parameter_constraints_clauses? ';' ;
interface_event_declaration: interface_event_declaration:
//attributes? 'new'? //attributes? 'new'?
'event' type identifier ';' ; 'event' type identifier { ((ClassRepTemplate)$NSContext::currentTypeRep).Events.Add(new FieldRepTemplate($type.thetext, $identifier.text)); } ';' ;
interface_indexer_declaration: interface_indexer_declaration [string returnType]:
// attributes? 'new'? type // attributes? 'new'? type
'this' '[' formal_parameter_list ']' '{' interface_accessor_declarations '}' ; 'this' '[' fpl=formal_parameter_list ']' '{' interface_accessor_declarations '}'
interface_accessor_declarations: { ((InterfaceRepTemplate)$NSContext::currentTypeRep).Indexers.Add(new MethodRepTemplate($returnType, "this", null, $fpl.paramlist)); }
;
interface_accessor_declarations returns [bool hasGetter, bool hasSetter]
@int {
$hasSetter = false;
$hasGetter = false;
}
:
attributes? attributes?
(interface_get_accessor_declaration attributes? interface_set_accessor_declaration? (interface_get_accessor_declaration { $hasGetter = true; } attributes? (interface_set_accessor_declaration { $hasSetter = true; })?
| interface_set_accessor_declaration attributes? interface_get_accessor_declaration?) ; | interface_set_accessor_declaration { $hasSetter = true; } attributes? (interface_get_accessor_declaration { $hasGetter = true; })?) ;
interface_get_accessor_declaration: interface_get_accessor_declaration:
'get' ';' ; // no body / modifiers 'get' ';' ; // no body / modifiers
interface_set_accessor_declaration: interface_set_accessor_declaration:
@ -934,8 +973,8 @@ scope NSContext;
if ($type_or_generic.generic_arguments.Count > 0) { if ($type_or_generic.generic_arguments.Count > 0) {
// distinguish structs with same name, but differing numbers of type arguments // distinguish structs with same name, but differing numbers of type arguments
strukt.TypeName+= "'" + $type_or_generic.generic_arguments.Count.ToString(); strukt.TypeName+= "'" + $type_or_generic.generic_arguments.Count.ToString();
strukt.TypeParams = $type_or_generic.generic_arguments.ToArray();
} }
strukt.TypeParams = $type_or_generic.generic_arguments.ToArray();
// Nested types can see things in this space // Nested types can see things in this space
$NSContext::nss.Add(new UseRepTemplate(strukt.TypeName)); $NSContext::nss.Add(new UseRepTemplate(strukt.TypeName));
$NSContext::currentNS = strukt.TypeName; $NSContext::currentNS = strukt.TypeName;
@ -957,7 +996,7 @@ struct_member_declaration:
attributes? m=modifiers? attributes? m=modifiers?
( 'const' ct=type constant_declarators[$ct.thetext] ';' ( 'const' ct=type constant_declarators[$ct.thetext] ';'
| event_declaration // 'event' | event_declaration // 'event'
| 'partial' (method_declaration["/* partial */"] | p='partial' { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } (method_declaration["/* partial */"]
| interface_declaration | interface_declaration
| class_declaration | class_declaration
| struct_declaration) | struct_declaration)