diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g index 038b42b..07b225e 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g @@ -33,6 +33,11 @@ scope SymTab { Dictionary symtab; } +// When this scope is true, then generate equivalent Object types instead of primitive types +scope PrimitiveRep { + bool primitiveTypeAsObject; +} + @namespace { Twiglet.CS2J.Translator.Transform } @header @@ -183,6 +188,20 @@ scope SymTab { } } + // Map of Java built in types to their object based equivalents + Dictionary primitive_to_object_type_map = new Dictionary() + { + {"byte", "Byte"}, + {"short", "Short"}, + {"int", "Integer"}, + {"long", "Long"}, + {"float", "Float"}, + {"double", "Double"}, + {"boolean", "Boolean"}, + {"char", "Character"} + }; + + protected TypeRepTemplate SymTabLookup(string name) { return SymTabLookup(name, null); } @@ -444,11 +463,13 @@ scope SymTab { } public compilation_unit -scope NSContext; +scope NSContext, PrimitiveRep; @init { Imports = new Set(); + $PrimitiveRep::primitiveTypeAsObject = false; + // TODO: Do we need to ensure we have access to System? If so, can add it here. $NSContext::namespaces = SearchPath ?? new List(); $NSContext::globalNamespaces = SearchPath ?? new List(); @@ -1018,7 +1039,9 @@ qid_part: generic_argument_list returns [List argTypes, List argTrees]: '<' type_arguments '>' { $argTypes = $type_arguments.tyTypes; $argTrees = $type_arguments.argTrees; }; type_arguments returns [List tyTypes, List argTrees] +scope PrimitiveRep; @init { + $PrimitiveRep::primitiveTypeAsObject = true; $tyTypes = new List(); $argTrees = new List(); }: @@ -2133,6 +2156,12 @@ predefined_type returns [TypeRepTemplate dotNetType] @after { $dotNetType = new ClassRepTemplate((ClassRepTemplate)AppEnv.Search(ns)); $dotNetType.IsUnboxedType = true; + + // In certain contexts we must translate primitive types into their object based equivalent + string newText; + if ($PrimitiveRep::primitiveTypeAsObject && primitive_to_object_type_map.TryGetValue($predefined_type.tree.Token.Text, out newText)) { + $predefined_type.tree.Token.Text = newText; + } }: 'bool' { ns = "System.Boolean"; } | 'byte' { ns = "System.Byte"; }