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

Add extra translation steps to the pipeline to (eventually) produce Java

This commit is contained in:
Kevin Glynn 2010-11-07 21:57:24 +01:00
parent e4bd86900b
commit e914af9031
9 changed files with 3400 additions and 175 deletions

View File

@ -5,6 +5,9 @@ set -e
cd src/cs2j/CSharp cd src/cs2j/CSharp
java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make cs.g java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make cs.g
java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make TemplateExtracter.g java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make TemplateExtracter.g
java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make JavaMaker.g
java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make NetMaker.g
java -Xmx512m -jar ../../../jar/antlr-3.3.jar -make JavaPrettyPrint.g
cd ../../../ cd ../../../
xbuild xbuild
echo 'All Done' echo 'All Done'

View File

@ -18,8 +18,8 @@ namespace RusticiSoftware.Translator.CSharp
class CS2J class CS2J
{ {
private const string VERSION = "2009.1.1.x"; private const string VERSION = "2009.1.1.x";
private static DirectoryHT<TypeRepTemplate> AppEnv { get; set; } private static DirectoryHT<TypeRepTemplate> AppEnv { get; set; }
private static CS2JSettings cfg = new CS2JSettings(); private static CS2JSettings cfg = new CS2JSettings();
public delegate void FileProcessor(string fName); public delegate void FileProcessor(string fName);
@ -49,18 +49,18 @@ namespace RusticiSoftware.Translator.CSharp
Environment.Exit(0); Environment.Exit(0);
} }
private static void addDirectories(IList<string> strs, string rawStr) { private static void addDirectories(IList<string> strs, string rawStr) {
string[] argDirs = rawStr.Split(';'); string[] argDirs = rawStr.Split(';');
for (int i = 0; i < argDirs.Length; i++) for (int i = 0; i < argDirs.Length; i++)
strs.Add(Path.GetFullPath(argDirs[i]).ToLower()); strs.Add(Path.GetFullPath(argDirs[i]).ToLower());
} }
public static void CS2JMain(string[] args) public static void CS2JMain(string[] args)
{ {
long startTime = DateTime.Now.Ticks; long startTime = DateTime.Now.Ticks;
IList<string> remArgs = new List<string>(); IList<string> remArgs = new List<string>();
XmlTextWriter enumXmlWriter = null; XmlTextWriter enumXmlWriter = null;
AppEnv = new DirectoryHT<TypeRepTemplate>(null); AppEnv = new DirectoryHT<TypeRepTemplate>(null);
// Use a try/catch block for parser exceptions // Use a try/catch block for parser exceptions
try try
@ -71,36 +71,36 @@ namespace RusticiSoftware.Translator.CSharp
if (cfg.Verbosity >= 2) Console.Error.WriteLine("Parsing Command Line Arguments..."); if (cfg.Verbosity >= 2) Console.Error.WriteLine("Parsing Command Line Arguments...");
OptionSet p = new OptionSet () OptionSet p = new OptionSet ()
.Add ("v", v => cfg.Verbosity++) .Add ("v", v => cfg.Verbosity++)
.Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v)) .Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v))
.Add ("warnings", v => cfg.Warnings = true) .Add ("warnings", v => cfg.Warnings = true)
.Add ("version", v => showVersion()) .Add ("version", v => showVersion())
.Add ("help|h|?", v => showUsage()) .Add ("help|h|?", v => showUsage())
.Add ("dumpcsharp", v => cfg.DumpCSharp = true) .Add ("dumpcsharp", v => cfg.DumpCSharp = true)
.Add ("dumpjava", v => cfg.DumpJava = true) .Add ("dumpjava", v => cfg.DumpJava = true)
.Add ("dumpjavasyntax", v => cfg.DumpJavaSyntax = true) .Add ("dumpjavasyntax", v => cfg.DumpJavaSyntax = true)
.Add ("dumptokens", v => cfg.DisplayTokens = true) .Add ("dumptokens", v => cfg.DisplayTokens = true)
.Add ("D=", def => cfg.MacroDefines.Add(def)) .Add ("D=", def => cfg.MacroDefines.Add(def))
.Add ("dumpenums", v => cfg.DumpEnums = true) .Add ("dumpenums", v => cfg.DumpEnums = true)
.Add ("enumdir=", dir => cfg.EnumDir = Path.Combine(Directory.GetCurrentDirectory(), dir)) .Add ("enumdir=", dir => cfg.EnumDir = Path.Combine(Directory.GetCurrentDirectory(), dir))
.Add ("dumpxmls", v => cfg.DumpXmls = true) .Add ("dumpxmls", v => cfg.DumpXmls = true)
.Add ("xmldir=", dir => cfg.XmlDir = Path.Combine(Directory.GetCurrentDirectory(), dir)) .Add ("xmldir=", dir => cfg.XmlDir = Path.Combine(Directory.GetCurrentDirectory(), dir))
.Add ("odir=", dir => cfg.OutDir = dir) .Add ("odir=", dir => cfg.OutDir = dir)
.Add ("cheatdir=", dir => cfg.CheatDir = dir) .Add ("cheatdir=", dir => cfg.CheatDir = dir)
.Add ("netdir=", dirs => addDirectories(cfg.NetRoot, dirs)) .Add ("netdir=", dirs => addDirectories(cfg.NetRoot, dirs))
.Add ("exnetdir=", dirs => addDirectories(cfg.ExNetRoot, dirs)) .Add ("exnetdir=", dirs => addDirectories(cfg.ExNetRoot, dirs))
.Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs)) .Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs))
.Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs)) .Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs))
.Add ("exclude=", dirs => addDirectories(cfg.Exclude, dirs)) .Add ("exclude=", dirs => addDirectories(cfg.Exclude, dirs))
; ;
//TODO: fix enum dump //TODO: fix enum dump
// Final argument is translation target // Final argument is translation target
remArgs = p.Parse (args); remArgs = p.Parse (args);
// Load .Net templates // Load .Net templates
foreach (string r in cfg.NetRoot) foreach (string r in cfg.NetRoot)
doFile(r, ".xml", addNetTranslation, cfg.ExNetRoot); doFile(r, ".xml", addNetTranslation, cfg.ExNetRoot);
@ -110,16 +110,16 @@ namespace RusticiSoftware.Translator.CSharp
cfg.AppRoot.Add(remArgs[0]); cfg.AppRoot.Add(remArgs[0]);
foreach (string r in cfg.AppRoot) foreach (string r in cfg.AppRoot)
doFile(r, ".cs", addAppSigTranslation, cfg.ExAppRoot); // parse it doFile(r, ".cs", addAppSigTranslation, cfg.ExAppRoot); // parse it
if (cfg.DumpEnums) { if (cfg.DumpEnums) {
enumXmlWriter = new XmlTextWriter(cfg.EnumDir, System.Text.Encoding.UTF8); enumXmlWriter = new XmlTextWriter(cfg.EnumDir, System.Text.Encoding.UTF8);
} }
if (cfg.DumpXmls) if (cfg.DumpXmls)
{ {
// Get package name and convert to directory name // Get package name and convert to directory name
foreach (KeyValuePair<string,TypeRepTemplate> de in AppEnv) foreach (KeyValuePair<string,TypeRepTemplate> de in AppEnv)
{ {
String xmlFName = Path.Combine(cfg.XmlDir, String xmlFName = Path.Combine(cfg.XmlDir,
((string)de.Key).Replace('.', Path.DirectorySeparatorChar) + ".xml"); ((string)de.Key).Replace('.', Path.DirectorySeparatorChar) + ".xml");
String xmlFDir = Path.GetDirectoryName(xmlFName); String xmlFDir = Path.GetDirectoryName(xmlFName);
if (!Directory.Exists(xmlFDir)) if (!Directory.Exists(xmlFDir))
{ {
@ -135,8 +135,8 @@ namespace RusticiSoftware.Translator.CSharp
if (cfg.DumpEnums) if (cfg.DumpEnums)
{ {
enumXmlWriter.WriteEndElement(); enumXmlWriter.WriteEndElement();
enumXmlWriter.Close(); enumXmlWriter.Close();
} }
} }
else else
{ {
@ -161,7 +161,7 @@ namespace RusticiSoftware.Translator.CSharp
// Call processFile on all files below f that have the given extension // Call processFile on all files below f that have the given extension
public static void doFile(string root, string ext, FileProcessor processFile, IList<string> excludes) public static void doFile(string root, string ext, FileProcessor processFile, IList<string> excludes)
{ {
string canonicalPath = Path.GetFullPath(root); string canonicalPath = Path.GetFullPath(root);
// If this is a directory, walk each file/dir in that directory // If this is a directory, walk each file/dir in that directory
if (!excludes.Contains(canonicalPath.ToLower())) if (!excludes.Contains(canonicalPath.ToLower()))
{ {
@ -193,16 +193,16 @@ namespace RusticiSoftware.Translator.CSharp
if (cfg.Verbosity > 2) Console.WriteLine("Parsing " + Path.GetFileName(fullName)); if (cfg.Verbosity > 2) Console.WriteLine("Parsing " + Path.GetFileName(fullName));
ICharStream input = new ANTLRFileStream(fullName); ICharStream input = new ANTLRFileStream(fullName);
PreProcessor lex = new PreProcessor(); PreProcessor lex = new PreProcessor();
lex.AddDefine(cfg.MacroDefines); lex.AddDefine(cfg.MacroDefines);
lex.CharStream = input; lex.CharStream = input;
lex.TraceDestination = Console.Error; lex.TraceDestination = Console.Error;
CommonTokenStream tokens = new CommonTokenStream(lex); CommonTokenStream tokens = new CommonTokenStream(lex);
csParser p = new csParser(tokens); csParser p = new csParser(tokens);
p.TraceDestination = Console.Error; p.TraceDestination = Console.Error;
csParser.compilation_unit_return parser_rt = p.compilation_unit(); csParser.compilation_unit_return parser_rt = p.compilation_unit();
@ -220,146 +220,178 @@ namespace RusticiSoftware.Translator.CSharp
} }
CommonTreeNodeStream nodes = new CommonTreeNodeStream(parser_rt.Tree); CommonTreeNodeStream nodes = new CommonTreeNodeStream(parser_rt.Tree);
nodes.TokenStream = tokens; nodes.TokenStream = tokens;
return nodes; return nodes;
} }
// Here's where we do the real work... // Here's where we do the real work...
public static void addNetTranslation(string fullName) public static void addNetTranslation(string fullName)
{ {
Stream s = new FileStream(fullName, FileMode.Open, FileAccess.Read); Stream s = new FileStream(fullName, FileMode.Open, FileAccess.Read);
TypeRepTemplate t = TypeRepTemplate.newInstance(s); TypeRepTemplate t = TypeRepTemplate.newInstance(s);
AppEnv[t.TypeName] = t; AppEnv[t.TypeName] = t;
} }
// Here's where we do the real work... // Here's where we do the real work...
public static void addAppSigTranslation(string fullName) public static void addAppSigTranslation(string fullName)
{ {
if (cfg.DebugLevel > 3) Console.Out.WriteLine("Extracting type info from file {0}", fullName);
if (cfg.DebugLevel > 3) Console.Out.WriteLine("Extracting type info from file {0}", fullName);
ITreeNodeStream csTree = parseFile(fullName); ITreeNodeStream csTree = parseFile(fullName);
if (csTree != null) if (csTree != null)
{ {
TemplateExtracter templateWalker = new TemplateExtracter(csTree); TemplateExtracter templateWalker = new TemplateExtracter(csTree);
templateWalker.Filename = fullName; templateWalker.Filename = fullName;
templateWalker.TraceDestination = Console.Error; templateWalker.TraceDestination = Console.Error;
templateWalker.compilation_unit(cfg, AppEnv); templateWalker.compilation_unit(cfg, AppEnv);
} }
} }
// Here's where we do the real work... // Here's where we do the real work...
public static void translateFile(string fullName) public static void translateFile(string fullName)
{ {
if (cfg.DebugLevel > 3) Console.Out.WriteLine("Translating file {0}", fullName); long startTime = DateTime.Now.Ticks;
CommonTreeNodeStream csTree = parseFile(fullName); if (cfg.DebugLevel > 3) Console.Out.WriteLine("Translating file {0}", fullName);
if (cfg.DumpCSharp && csTree != null) AntlrUtils.AntlrUtils.DumpNodes(csTree); ITreeNodeStream csTree = parseFile(fullName);
if (cfg.DumpCSharp && csTree != null) AntlrUtils.AntlrUtils.DumpNodes((CommonTreeNodeStream)csTree);
// ASTNode t = parseFile(f, s); if (csTree != null)
// if (t != null) {
// { Dictionary<string, CommonTree> cus = new Dictionary<string, CommonTree>();
// if (showTree) JavaMaker javaMaker = new JavaMaker(csTree);
// { javaMaker.Filename = fullName;
// ASTNode r = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); javaMaker.TraceDestination = Console.Error;
// r.setFirstChild(t);
// ASTFrame frame = new ASTFrame("C# AST for file [" + f + "]", r);
// frame.ShowDialog();
// //frame.Visible = true;
// // System.out.println(t.toStringList());
// }
// ASTNode r1 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r1.setFirstChild(t);
// ASTFrame frame1 = new ASTFrame("C# AST for file [" + f + "]", r1);
// if (showCSharp)
// frame1.ShowDialog();
// CSharpTranslator transformer = new CSharpTranslator(); JavaMaker.compilation_unit_return java = javaMaker.compilation_unit(cfg, cus);
// transformer.setASTNodeClass(typeof(ASTNode).FullName); foreach (KeyValuePair<string, CommonTree> package in cus) {
// transformer.setASTFactory(new ASTNodeFactory());
// CSharpTranslator.initializeASTFactory(transformer.getASTFactory());
// long startTime = DateTime.Now.Ticks; CommonTreeNodeStream javaSyntaxNodes = new CommonTreeNodeStream(package.Value);
// transformer.compilationUnit(t, null); javaSyntaxNodes.TokenStream = csTree.TokenStream;
// //BaseAST.setVerboseStringConversion(true, tokenNames); NetMaker netMaker = new NetMaker(javaSyntaxNodes);
// ASTNode r2 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); netMaker.Filename = fullName;
// r2.setFirstChild(transformer.getAST()); netMaker.TraceDestination = Console.Error;
// ASTFrame frame2 = new ASTFrame("Java syntax AST for file [" + f + "]", r2);
// if (showJavaSyntax)
// frame2.ShowDialog();
// // Take each java compilation unit (each class defn) and write it to the appropriate file NetMaker.type_declaration_return javaCompilationUnit = netMaker.type_declaration();
// IEnumerator enumCU = transformer.getAST().findAllPartial((ASTNode)transformer.getASTFactory().create(CSharpParser.COMPILATION_UNIT));
// while (enumCU.MoveNext())
// {
// ASTNode javaCU = (ASTNode)enumCU.Current;
// // Extract class/interface name CommonTreeNodeStream javaCompilationUnitNodes = new CommonTreeNodeStream(javaCompilationUnit.Tree);
// String claName = JavaTreeParser.getClassName(javaCU); javaCompilationUnitNodes.TokenStream = csTree.TokenStream;
// // Get package name and convert to directory name JavaPrettyPrint outputMaker = new JavaPrettyPrint(javaCompilationUnitNodes);
// String nsDir = ""; outputMaker.Filename = fullName;
// foreach (String nsc in JavaTreeParser.getPackageName(javaCU)) outputMaker.TraceDestination = Console.Error;
// {
// nsDir = Path.Combine(nsDir, nsc);
// }
// // Build destination filename for this class outputMaker.type_declaration();
// String fName = Path.Combine(Path.Combine(outDir, nsDir), claName + ".java"); }
// ITreeNodeStream javaTree = java.Tree;
}
// if (cheatDir != "") // ASTNode t = parseFile(f, s);
// { // if (t != null)
// String cheatFile = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".java")); // {
// if (File.Exists(cheatFile)) // if (showTree)
// { // {
// // the old switcheroo // ASTNode r = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// File.Copy(cheatFile, fName, true); // r.setFirstChild(t);
// continue; // ASTFrame frame = new ASTFrame("C# AST for file [" + f + "]", r);
// } // frame.ShowDialog();
// //frame.Visible = true;
// // System.out.println(t.toStringList());
// }
// ASTNode r1 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r1.setFirstChild(t);
// ASTFrame frame1 = new ASTFrame("C# AST for file [" + f + "]", r1);
// if (showCSharp)
// frame1.ShowDialog();
// String ignoreMarker = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".none")); // CSharpTranslator transformer = new CSharpTranslator();
// if (File.Exists(ignoreMarker)) // transformer.setASTNodeClass(typeof(ASTNode).FullName);
// { // transformer.setASTFactory(new ASTNodeFactory());
// // Don't generate this class // CSharpTranslator.initializeASTFactory(transformer.getASTFactory());
// continue;
// }
// }
// NetTranslator netTx = new NetTranslator(); // long startTime = DateTime.Now.Ticks;
// netTx.setASTNodeClass(typeof(ASTNode).FullName); // transformer.compilationUnit(t, null);
// netTx.setASTFactory(new ASTNodeFactory());
// NetTranslator.initializeASTFactory(netTx.getASTFactory());
// netTx.compilationUnit(javaCU, null, appEnv);
// //BaseAST.setVerboseStringConversion(true, tokenNames); // //BaseAST.setVerboseStringConversion(true, tokenNames);
// ASTNode r3 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); // ASTNode r2 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r3.setFirstChild(netTx.getAST()); // r2.setFirstChild(transformer.getAST());
// ASTFrame frame3 = new ASTFrame("Java AST for file [" + f + "]", r3); // ASTFrame frame2 = new ASTFrame("Java syntax AST for file [" + f + "]", r2);
// if (showJava) // if (showJavaSyntax)
// frame3.ShowDialog(); // frame2.ShowDialog();
// Console.WriteLine(fName); // // Take each java compilation unit (each class defn) and write it to the appropriate file
// IEnumerator enumCU = transformer.getAST().findAllPartial((ASTNode)transformer.getASTFactory().create(CSharpParser.COMPILATION_UNIT));
// while (enumCU.MoveNext())
// {
// ASTNode javaCU = (ASTNode)enumCU.Current;
// String fDir = Path.GetDirectoryName(fName); // // Extract class/interface name
// if (!Directory.Exists(fDir)) // String claName = JavaTreeParser.getClassName(javaCU);
// {
// Directory.CreateDirectory(fDir);
// }
// FileInfo outF = new FileInfo(fName);
// StreamWriter w = new StreamWriter(outF.Create());
// JavaPrettyPrinter writer = new JavaPrettyPrinter();
// writer.compilationUnit(netTx.getAST(), w, enumXmlWriter, filter);
// w.Close();
// } // // Get package name and convert to directory name
// String nsDir = "";
// foreach (String nsc in JavaTreeParser.getPackageName(javaCU))
// {
// nsDir = Path.Combine(nsDir, nsc);
// }
// double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0; // // Build destination filename for this class
// //System.Console.Out.WriteLine(writer.ToString()); // String fName = Path.Combine(Path.Combine(outDir, nsDir), claName + ".java");
// System.Console.Out.WriteLine("");
// System.Console.Out.WriteLine(""); // if (cheatDir != "")
// System.Console.Out.WriteLine("Pretty-printed {0} in: {1} seconds.", f, elapsedTime); // {
// } // String cheatFile = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".java"));
// if (File.Exists(cheatFile))
// {
// // the old switcheroo
// File.Copy(cheatFile, fName, true);
// continue;
// }
// String ignoreMarker = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".none"));
// if (File.Exists(ignoreMarker))
// {
// // Don't generate this class
// continue;
// }
// }
// NetTranslator netTx = new NetTranslator();
// netTx.setASTNodeClass(typeof(ASTNode).FullName);
// netTx.setASTFactory(new ASTNodeFactory());
// NetTranslator.initializeASTFactory(netTx.getASTFactory());
// netTx.compilationUnit(javaCU, null, appEnv);
// //BaseAST.setVerboseStringConversion(true, tokenNames);
// ASTNode r3 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r3.setFirstChild(netTx.getAST());
// ASTFrame frame3 = new ASTFrame("Java AST for file [" + f + "]", r3);
// if (showJava)
// frame3.ShowDialog();
// Console.WriteLine(fName);
// String fDir = Path.GetDirectoryName(fName);
// if (!Directory.Exists(fDir))
// {
// Directory.CreateDirectory(fDir);
// }
// FileInfo outF = new FileInfo(fName);
// StreamWriter w = new StreamWriter(outF.Create());
// JavaPrettyPrinter writer = new JavaPrettyPrinter();
// writer.compilationUnit(netTx.getAST(), w, enumXmlWriter, filter);
// w.Close();
// }
double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0;
//System.Console.Out.WriteLine(writer.ToString());
System.Console.Out.WriteLine("");
System.Console.Out.WriteLine("");
System.Console.Out.WriteLine("Pretty-printed {0} in: {1} seconds.", fullName, elapsedTime);
} }
} }
} }

View File

@ -3,3 +3,9 @@ csLexer.cs
csParser.cs csParser.cs
TemplateExtracter.cs TemplateExtracter.cs
TemplateExtracter.tokens TemplateExtracter.tokens
NetMaker.cs
NetMaker.tokens
JavaMaker.cs
JavaMaker.tokens
JavaPrettyPrint.cs
JavaPrettyPrint.tokens

View File

@ -45,5 +45,25 @@ namespace RusticiSoftware.Translator.CSharp
Console.Out.WriteLine(s); Console.Out.WriteLine(s);
} }
} }
// distinguish classes with same name, but differing numbers of type arguments
protected string mkTypeName (string name, List<String> tyargs) {
return name + (tyargs.Count > 0 ? "'" + tyargs.Count.ToString() : "");
}
protected string formatTyargs(List<string> tyargs) {
if (tyargs.Count == 0) {
return "";
}
StringBuilder buf = new StringBuilder();
buf.Append("<");
foreach (string t in tyargs) {
buf.Append(t + ",");
}
buf.Remove(buf.Length-1,1);
buf.Append(">");
return buf.ToString();
}
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -69,20 +69,6 @@ scope NSContext {
} }
} }
protected string formatTyargs(List<string> tyargs) {
if (tyargs.Count == 0) {
return "";
}
StringBuilder buf = new StringBuilder();
buf.Append("<");
foreach (string t in tyargs) {
buf.Append(t + ",");
}
buf.Remove(buf.Length-1,1);
buf.Append(">");
return buf.ToString();
}
} }
/******************************************************************************************** /********************************************************************************************
@ -672,10 +658,8 @@ scope NSContext;
{ {
Debug("Processing class: " + $type_or_generic.type); Debug("Processing class: " + $type_or_generic.type);
klass.Uses = this.NameSpaceContext; klass.Uses = this.NameSpaceContext;
klass.TypeName = this.ParentNameSpace + "." + $type_or_generic.type; klass.TypeName = this.ParentNameSpace + "." + mkTypeName($type_or_generic.type, $type_or_generic.generic_arguments);
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
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
@ -848,10 +832,8 @@ scope NSContext;
{ {
Debug("Processing delegate: " + $identifier.text); Debug("Processing delegate: " + $identifier.text);
dlegate.Uses = this.NameSpaceContext; dlegate.Uses = this.NameSpaceContext;
dlegate.TypeName = this.ParentNameSpace + "." + $identifier.text; dlegate.TypeName = this.ParentNameSpace + "." + mkTypeName($identifier.text, $variant_generic_parameter_list.tyargs);
if ($variant_generic_parameter_list.tyargs != null && $variant_generic_parameter_list.tyargs.Count > 0) { 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.TypeParams = $variant_generic_parameter_list.tyargs.ToArray();
} }
dlegate.Return=$return_type.thetext; dlegate.Return=$return_type.thetext;
@ -938,10 +920,8 @@ scope NSContext;
{ {
Debug("Processing interface: " + $identifier.text); Debug("Processing interface: " + $identifier.text);
iface.Uses = this.NameSpaceContext; iface.Uses = this.NameSpaceContext;
iface.TypeName = this.ParentNameSpace + "." + $identifier.text; iface.TypeName = this.ParentNameSpace + "." + mkTypeName($identifier.text, $variant_generic_parameter_list.tyargs);
if ($variant_generic_parameter_list.tyargs != null && $variant_generic_parameter_list.tyargs.Count > 0) { 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(); iface.TypeParams = $variant_generic_parameter_list.tyargs.ToArray();
} }
// Nested types can see things in this space // Nested types can see things in this space
@ -1024,10 +1004,8 @@ scope NSContext;
{ {
Debug("Processing struct: " + $type_or_generic.type); Debug("Processing struct: " + $type_or_generic.type);
strukt.Uses = this.NameSpaceContext; strukt.Uses = this.NameSpaceContext;
strukt.TypeName = this.ParentNameSpace + "." + $type_or_generic.type; strukt.TypeName = this.ParentNameSpace + "." + mkTypeName($type_or_generic.type, $type_or_generic.generic_arguments);
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
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

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -66,11 +66,17 @@
<Compile Include="Utils\TypeHelper.cs" /> <Compile Include="Utils\TypeHelper.cs" />
<Compile Include="CSharp\TemplateExtracter.cs" /> <Compile Include="CSharp\TemplateExtracter.cs" />
<Compile Include="CLR\CS2JSettings.cs" /> <Compile Include="CLR\CS2JSettings.cs" />
<Compile Include="CSharp\JavaMaker.cs" />
<Compile Include="CSharp\JavaPrettyPrint.cs" />
<Compile Include="CSharp\NetMaker.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="CSharp\csCrawl.g" /> <None Include="CSharp\csCrawl.g" />
<None Include="CSharp\cs.g" /> <None Include="CSharp\cs.g" />
<None Include="CSharp\TemplateExtracter.g" /> <None Include="CSharp\TemplateExtracter.g" />
<None Include="CSharp\JavaMaker.g" />
<None Include="CSharp\JavaPrettyPrint.g" />
<None Include="CSharp\NetMaker.g" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="README.txt" /> <Content Include="README.txt" />