From 16babbd494f203fff0fab481c0c567f1c039a1de Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Wed, 10 Nov 2010 19:03:09 +0100 Subject: [PATCH] Add template file to control Java pretty printing --- CSharpTranslator/antlr3/dll/antlr.runtime.dll | Bin 0 -> 114688 bytes CSharpTranslator/antlr3/src/cs2j/CLR/cs2j.cs | 54 ++++++++++- .../antlr3/src/cs2j/CSharp/JavaMaker.g | 84 ++++++++++++------ .../antlr3/src/cs2j/CSharp/JavaPrettyPrint.g | 19 ++-- .../src/cs2j/CSharp/TemplateExtracter.g | 2 - .../antlr3/src/cs2j/CSharp/Templates.cs | 16 ++++ .../src/cs2j/bin/Debug/templates/java.stg | 24 +++++ CSharpTranslator/antlr3/src/cs2j/cs2j.csproj | 9 ++ 8 files changed, 165 insertions(+), 43 deletions(-) create mode 100755 CSharpTranslator/antlr3/dll/antlr.runtime.dll create mode 100644 CSharpTranslator/antlr3/src/cs2j/CSharp/Templates.cs create mode 100644 CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg diff --git a/CSharpTranslator/antlr3/dll/antlr.runtime.dll b/CSharpTranslator/antlr3/dll/antlr.runtime.dll new file mode 100755 index 0000000000000000000000000000000000000000..cb95c6a10afc161128d32433b26ecfbf0a68cee1 GIT binary patch literal 114688 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 AppEnv { get; set; } private static CS2JSettings cfg = new CS2JSettings(); - + private static StringTemplateGroup templates = null; + public delegate void FileProcessor(string fName); private static void showVersion() @@ -131,6 +134,16 @@ namespace RusticiSoftware.Translator.CSharp w.Close(); } } + // load in T.stg template group, put in templates variable + string templateLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.Combine("templates", "java.stg")); + if (File.Exists(templateLocation)) { + TextReader groupFileR = new StreamReader(templateLocation); + templates = new StringTemplateGroup(groupFileR); + groupFileR.Close(); + } + else { + templates = new StringTemplateGroup(new StringReader(Templates.JavaTemplateGroup)); + } doFile(remArgs[0], ".cs", translateFile, cfg.Exclude); // parse it if (cfg.DumpEnums) { @@ -260,6 +273,7 @@ namespace RusticiSoftware.Translator.CSharp if (csTree != null) { + // Make java compilation units from C# file Dictionary cus = new Dictionary(); JavaMaker javaMaker = new JavaMaker(csTree); javaMaker.Filename = fullName; @@ -267,7 +281,39 @@ namespace RusticiSoftware.Translator.CSharp JavaMaker.compilation_unit_return java = javaMaker.compilation_unit(cfg, cus); foreach (KeyValuePair package in cus) { + Console.WriteLine (package.Key); + string claName = package.Key.Substring(package.Key.LastIndexOf('.')+1); + string nsDir = package.Key.Substring(0,package.Key.LastIndexOf('.')).Replace('.', Path.DirectorySeparatorChar); + + if (cfg.CheatDir != "") + { + String ignoreMarker = Path.Combine(cfg.CheatDir, Path.Combine(nsDir, claName + ".none")); + if (File.Exists(ignoreMarker)) + { + // Don't generate this class + continue; + } + } + // Make sure parent directory exists + String javaFDir = Path.Combine(cfg.OutDir, nsDir); + String javaFName = Path.Combine(javaFDir, claName + ".java"); + if (!Directory.Exists(javaFDir)) + { + Directory.CreateDirectory(javaFDir); + } + if (cfg.CheatDir != "") + { + String cheatFile = Path.Combine(cfg.CheatDir, Path.Combine(nsDir, claName + ".java")); + if (File.Exists(cheatFile)) + { + // the old switcheroo + File.Copy(cheatFile, javaFName,true); + continue; + } + } + + // Translate calls to .Net to calls to Java libraries CommonTreeNodeStream javaSyntaxNodes = new CommonTreeNodeStream(package.Value); javaSyntaxNodes.TokenStream = csTree.TokenStream; @@ -280,11 +326,15 @@ namespace RusticiSoftware.Translator.CSharp CommonTreeNodeStream javaCompilationUnitNodes = new CommonTreeNodeStream(javaCompilationUnit.Tree); javaCompilationUnitNodes.TokenStream = csTree.TokenStream; + // Pretty print java parse tree as text JavaPrettyPrint outputMaker = new JavaPrettyPrint(javaCompilationUnitNodes); outputMaker.Filename = fullName; outputMaker.TraceDestination = Console.Error; + outputMaker.TemplateLib = templates; - outputMaker.type_declaration(); + StreamWriter javaW = new StreamWriter(javaFName); + javaW.Write(outputMaker.type_declaration().ToString()); + javaW.Close(); } // ITreeNodeStream javaTree = java.Tree; } diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g index 23ec246..57b1509 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g @@ -15,6 +15,12 @@ options { output=AST; } +// A scope to keep track of the namespaces available at any point in the program +scope NSContext { + int filler; + string currentNS; +} + @namespace { RusticiSoftware.Translator.CSharp } @header @@ -26,6 +32,11 @@ options { { private IDictionary CUs { get; set; } + protected string ParentNameSpace { + get { + return ((NSContext_scope)$NSContext.ToArray()[$NSContext.Count-2]).currentNS; + } + } } /******************************************************************************************** @@ -35,14 +46,23 @@ options { /////////////////////////////////////////////////////// compilation_unit[CS2JSettings inCfg, IDictionary inCus /*, DirectoryHT inAppEnv*/] +scope NSContext; @init { CUs = inCus; + $NSContext::currentNS = ""; } : namespace_body; -namespace_declaration: - 'namespace' qualified_identifier namespace_block ';'? ; +namespace_declaration +scope NSContext; +: + 'namespace' qi=qualified_identifier + { + // extend parent namespace + $NSContext::currentNS = this.ParentNameSpace + $qi.thetext; + } + namespace_block ';'? ; namespace_block: '{' namespace_body '}' ; namespace_body: @@ -50,7 +70,7 @@ namespace_body: extern_alias_directives: extern_alias_directive+ ; extern_alias_directive: - 'extern' 'alias' identifier ';' ; + e='extern' 'alias' i=identifier ';' { Warning($e.line, "[UNSUPPORTED] External Alias " + $i.text); } ; using_directives: using_directive+ ; using_directive: @@ -68,19 +88,20 @@ namespace_member_declaration: // type_declaration is only called at the top level, so each of the types declared // here will become a Java compilation unit (and go to its own file) type_declaration +@init { string ns = $NSContext::currentNS; } : ('partial') => p='partial' { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } - (pc=class_declaration { CUs.Add($pc.name, $pc.tree); } - | ps=struct_declaration { CUs.Add($ps.name, $ps.tree); } - | pi=interface_declaration { CUs.Add($pi.name, $pi.tree); }) - | c=class_declaration { CUs.Add($c.name, $c.tree); } - | s=struct_declaration { CUs.Add($s.name, $s.tree); } - | i=interface_declaration { CUs.Add($i.name, $i.tree); } - | e=enum_declaration { CUs.Add($e.name, $e.tree); } - | d=delegate_declaration { CUs.Add($d.name, $d.tree); } ; + (pc=class_declaration { CUs.Add(ns+"."+$pc.name, $pc.tree); } + | ps=struct_declaration { CUs.Add(ns+"."+$ps.name, $ps.tree); } + | pi=interface_declaration { CUs.Add(ns+"."+$pi.name, $pi.tree); }) + | c=class_declaration { CUs.Add(ns+"."+$c.name, $c.tree); } + | s=struct_declaration { CUs.Add(ns+"."+$s.name, $s.tree); } + | i=interface_declaration { CUs.Add(ns+"."+$i.name, $i.tree); } + | e=enum_declaration { CUs.Add(ns+"."+$e.name, $e.tree); } + | d=delegate_declaration { CUs.Add(ns+"."+$d.name, $d.tree); } ; // Identifiers -qualified_identifier: - identifier ('.' identifier)*; +qualified_identifier returns [string thetext]: + i1=identifier { $thetext = $i1.text; } ('.' ip=identifier { $thetext += "." + $ip.text; } )*; namespace_name : namespace_or_type_name ; @@ -92,10 +113,11 @@ modifier: class_member_declaration: attributes? + // TODO: Don't emit private m=modifiers? ( 'const' type constant_declarators ';' | event_declaration // 'event' - | 'partial' (method_declaration + | p='partial' { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } (method_declaration | interface_declaration | class_declaration | struct_declaration) @@ -327,16 +349,18 @@ type_or_generic returns [string type, List generic_arguments] }: (identifier generic_argument_list) => t=identifier ga=generic_argument_list { $generic_arguments = $ga.tyargs; } | t=identifier ; -qid: // qualified_identifier v2 - qid_start qid_part* + +// keving: as far as I can see this is (.)?identifier ()? at lease for C# 3.0 and less. +qid returns [string name, List tyargs]: // qualified_identifier v2 + qid_start qid_part* { $name=$qid_start.name; $tyargs = $qid_start.tyargs; } ; -qid_start: - predefined_type - | (identifier generic_argument_list) => identifier generic_argument_list +qid_start returns [string name, List tyargs]: + predefined_type { $name = $predefined_type.thetext; } + | (identifier generic_argument_list) => identifier generic_argument_list { $name = $identifier.text; $tyargs = $generic_argument_list.tyargs; } // | 'this' // | 'base' - | identifier ('::' identifier)? - | literal + | i1=identifier { $name = $i1.text; } ('::' inext=identifier { $name+="::" + $inext.text; })? + | literal { $name = $literal.text; } ; // 0.ToString() is legal @@ -362,7 +386,6 @@ type returns [string thetext]: | (p3=predefined_type { $thetext = $p3.thetext; } | tn3=type_name { $thetext = $tn3.thetext; }) | 'void' { $thetext = "System.Void"; } ('*' { $thetext += "*"; })+ ; - non_nullable_type: (predefined_type | type_name) ( rank_specifiers '*'* @@ -621,8 +644,8 @@ method_header: member_name '(' formal_parameter_list? ')' type_parameter_constraints_clauses? ; method_body: block ; -member_name: - qid ; // IInterface.Method logic added. +member_name returns [string name, List tyargs]: + qid { $name = $qid.name; $tyargs = $qid.tyargs; } ; // IInterface.Method logic added. /////////////////////////////////////////////////////// property_declaration: @@ -683,10 +706,13 @@ delegate_declaration returns [string name]: delegate_modifiers: modifier+ ; // 4.0 -variant_generic_parameter_list: - '<' variant_type_parameters '>' ; -variant_type_parameters: - variant_type_variable_name (',' variant_type_variable_name)* ; +variant_generic_parameter_list returns [List tyargs] +@init { + $tyargs = new List(); +}: + '<' variant_type_parameters[$tyargs] '>' ; +variant_type_parameters [List tyargs]: + v1=variant_type_variable_name { tyargs.Add($v1.text); } (',' vn=variant_type_variable_name { tyargs.Add($vn.text); })* ; variant_type_variable_name: attributes? variance_annotation? type_variable_name ; variance_annotation: @@ -794,7 +820,7 @@ struct_member_declaration: attributes? m=modifiers? ( 'const' type constant_declarators ';' | event_declaration // 'event' - | 'partial' (method_declaration + | p='partial' { Warning($p.line, "[UNSUPPORTED] 'partial' definition"); } (method_declaration | interface_declaration | class_declaration | struct_declaration) diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g index e6c8849..d53a96e 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g @@ -5,7 +5,7 @@ options { ASTLabelType=CommonTree; language=CSharp2; superClass='RusticiSoftware.Translator.CSharp.CommonWalker'; - //output=template; + output=template; } @namespace { RusticiSoftware.Translator.CSharp } @@ -17,20 +17,19 @@ options { @members { - protected bool is_class_modifier() - { - return false; - } + } compilation_unit: - namespace_body[true]; - + package; +package: + (PACKAGE string type_declaration) -> + package(now = {DateTime.Now}, includeDate = {true}, packageName = {$string}, type = {$type_declaration}); namespace_declaration: 'namespace' qualified_identifier namespace_block ';'? ; namespace_block: - '{' namespace_body[false] '}' ; -namespace_body[bool bGlobal]: + '{' namespace_body '}' ; +namespace_body: extern_alias_directives? using_directives? global_attributes? namespace_member_declarations? ; extern_alias_directives: extern_alias_directive+ ; @@ -51,7 +50,7 @@ namespace_member_declaration: namespace_declaration | attributes? modifiers? type_declaration ; type_declaration: - ('partial') => 'partial' (class_declaration + ('partial') => 'partial' (class_declaration | struct_declaration | interface_declaration) | class_declaration diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g index 132013f..ade7028 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/TemplateExtracter.g @@ -13,8 +13,6 @@ options { ASTLabelType=CommonTree; language=CSharp2; superClass='RusticiSoftware.Translator.CSharp.CommonWalker'; - //output=AST; - //backtrack=true; } // A scope to keep track of the namespaces available at any point in the program diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/Templates.cs b/CSharpTranslator/antlr3/src/cs2j/CSharp/Templates.cs new file mode 100644 index 0000000..a0242a4 --- /dev/null +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/Templates.cs @@ -0,0 +1,16 @@ +using System; + +namespace RusticiSoftware.Translator.CSharp +{ + public class Templates + { + + private static string _javaTemplateGroup = @" +Nothing to see here +"; + + public static string JavaTemplateGroup { get + { return _javaTemplateGroup; } + } + } +} diff --git a/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg b/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg new file mode 100644 index 0000000..8a31042 --- /dev/null +++ b/CSharpTranslator/antlr3/src/cs2j/bin/Debug/templates/java.stg @@ -0,0 +1,24 @@ +group JavaPrettyPrintTemplates; + +itsmine(now, includeDate) ::= << +// +// +// This file was translated from C# to Java by CS2J (http://www.cs2j.com). +// +// This code is to be used for evaluation of the CS2J tool ONLY. +// +// For more information about CS2J please contact cs2jcontact@scorm.com + +// +// Translated: <\n> + +// + +>> + +package(now, includeDate, packageName, type) ::= << + +package ; + + +>> diff --git a/CSharpTranslator/antlr3/src/cs2j/cs2j.csproj b/CSharpTranslator/antlr3/src/cs2j/cs2j.csproj index 3a453b7..c711a5c 100644 --- a/CSharpTranslator/antlr3/src/cs2j/cs2j.csproj +++ b/CSharpTranslator/antlr3/src/cs2j/cs2j.csproj @@ -69,6 +69,7 @@ + @@ -125,5 +126,13 @@ + + False + ..\..\dll\antlr.runtime.dll + + + False + ..\..\dll\StringTemplate.dll + \ No newline at end of file