From c6f4268b0ae076f3c7b67a54ebcd1327a1da024e Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Mon, 1 Nov 2010 18:28:17 +0100 Subject: [PATCH] extract enums and delegates --- .../src/cs2j/CLR/TranslationTemplate.cs | 3 + .../src/cs2j/CSharp/TemplateExtracter.g | 55 ++++++++++++++++--- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs index d334fef..7518359 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs @@ -1143,6 +1143,9 @@ namespace RusticiSoftware.Translator.CLR _params = new List (); return _params; } + set { + _params = value; + } } private string _return; diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g index 404c78c..6e60eca 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g @@ -790,8 +790,25 @@ remove_accessor_declaration: /////////////////////////////////////////////////////// // enum declaration /////////////////////////////////////////////////////// -enum_declaration: - 'enum' identifier enum_base? enum_body ';'? ; +enum_declaration +scope NSContext; +@init { + $NSContext::nss = new List(); + EnumRepTemplate eenum = new EnumRepTemplate(); +} +: + 'enum' identifier enum_base? + { + Debug("Processing enum: " + $identifier.text); + eenum.Uses = this.NameSpaceContext; + eenum.TypeName = this.ParentNameSpace + "." + $identifier.text; + // Nested types can see things in this space + $NSContext::nss.Add(new UseRepTemplate(eenum.TypeName)); + $NSContext::currentNS = eenum.TypeName; + $NSContext::currentTypeRep = eenum; + AppEnv[eenum.TypeName] = eenum; + } + enum_body ';'? ; enum_base: ':' integral_type ; enum_body: @@ -799,7 +816,9 @@ enum_body: enum_member_declarations: enum_member_declaration (',' enum_member_declaration)* ; enum_member_declaration: - attributes? identifier ('=' expression)? ; + attributes? identifier ('=' expression)? + { ((EnumRepTemplate)$NSContext::currentTypeRep).Members.Add(new EnumMemberRepTemplate($identifier.text, $expression.text)); } // todo: are arbitrary expressions really allowed +; //enum_modifiers: // enum_modifier+ ; //enum_modifier: @@ -808,9 +827,29 @@ integral_type: 'sbyte' | 'byte' | 'short' | 'ushort' | 'int' | 'uint' | 'long' | 'ulong' | 'char' ; // B.2.12 Delegates -delegate_declaration: +delegate_declaration +scope NSContext; +@init { + $NSContext::nss = new List(); + DelegateRepTemplate dlegate = new DelegateRepTemplate(); +} +: 'delegate' return_type identifier variant_generic_parameter_list? - '(' formal_parameter_list? ')' type_parameter_constraints_clauses? ';' ; + '(' formal_parameter_list? ')' type_parameter_constraints_clauses? ';' + { + Debug("Processing delegate: " + $identifier.text); + dlegate.Uses = this.NameSpaceContext; + dlegate.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 + dlegate.TypeName+= "'" + $variant_generic_parameter_list.tyargs.Count.ToString(); + dlegate.TypeParams = $variant_generic_parameter_list.tyargs.ToArray(); + } + dlegate.Return=$return_type.thetext; + dlegate.Params=$formal_parameter_list.paramlist; + AppEnv[dlegate.TypeName] = dlegate; + } +; delegate_modifiers: modifier+ ; // 4.0 @@ -847,9 +886,9 @@ type_variable_name: identifier ; constructor_constraint: 'new' '(' ')' ; -return_type: - type - | 'void'; +return_type returns [string thetext]: + type { $thetext = $type.thetext; } + | v='void' { $thetext = $v.text; } ; formal_parameter_list returns [List paramlist] @init { $paramlist = new List();