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);
if (csTree != null)
{
Dictionary<string, CommonTree> cus = new Dictionary<string, CommonTree>();
JavaMaker javaMaker = new JavaMaker(csTree);
javaMaker.Filename = fullName;
javaMaker.TraceDestination = Console.Error;
JavaMaker.compilation_unit_return java = javaMaker.compilation_unit(cfg, cus);
foreach (KeyValuePair<string, CommonTree> package in cus) {
CommonTreeNodeStream javaSyntaxNodes = new CommonTreeNodeStream(package.Value);
javaSyntaxNodes.TokenStream = csTree.TokenStream;
NetMaker netMaker = new NetMaker(javaSyntaxNodes);
netMaker.Filename = fullName;
netMaker.TraceDestination = Console.Error;
NetMaker.type_declaration_return javaCompilationUnit = netMaker.type_declaration();
CommonTreeNodeStream javaCompilationUnitNodes = new CommonTreeNodeStream(javaCompilationUnit.Tree);
javaCompilationUnitNodes.TokenStream = csTree.TokenStream;
JavaPrettyPrint outputMaker = new JavaPrettyPrint(javaCompilationUnitNodes);
outputMaker.Filename = fullName;
outputMaker.TraceDestination = Console.Error;
outputMaker.type_declaration();
}
// ITreeNodeStream javaTree = java.Tree;
}
// ASTNode t = parseFile(f, s); // ASTNode t = parseFile(f, s);
// if (t != null) // if (t != null)
// { // {
// if (showTree) // if (showTree)
// { // {
// ASTNode r = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); // ASTNode r = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r.setFirstChild(t); // r.setFirstChild(t);
// ASTFrame frame = new ASTFrame("C# AST for file [" + f + "]", r); // ASTFrame frame = new ASTFrame("C# AST for file [" + f + "]", r);
// frame.ShowDialog(); // frame.ShowDialog();
// //frame.Visible = true; // //frame.Visible = true;
// // System.out.println(t.toStringList()); // // System.out.println(t.toStringList());
// } // }
// ASTNode r1 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); // ASTNode r1 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r1.setFirstChild(t); // r1.setFirstChild(t);
// ASTFrame frame1 = new ASTFrame("C# AST for file [" + f + "]", r1); // ASTFrame frame1 = new ASTFrame("C# AST for file [" + f + "]", r1);
// if (showCSharp) // if (showCSharp)
// frame1.ShowDialog(); // frame1.ShowDialog();
// CSharpTranslator transformer = new CSharpTranslator(); // CSharpTranslator transformer = new CSharpTranslator();
// transformer.setASTNodeClass(typeof(ASTNode).FullName); // transformer.setASTNodeClass(typeof(ASTNode).FullName);
// transformer.setASTFactory(new ASTNodeFactory()); // transformer.setASTFactory(new ASTNodeFactory());
// CSharpTranslator.initializeASTFactory(transformer.getASTFactory()); // CSharpTranslator.initializeASTFactory(transformer.getASTFactory());
// long startTime = DateTime.Now.Ticks; // long startTime = DateTime.Now.Ticks;
// transformer.compilationUnit(t, null); // transformer.compilationUnit(t, null);
// //BaseAST.setVerboseStringConversion(true, tokenNames); // //BaseAST.setVerboseStringConversion(true, tokenNames);
// ASTNode r2 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); // ASTNode r2 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r2.setFirstChild(transformer.getAST()); // r2.setFirstChild(transformer.getAST());
// ASTFrame frame2 = new ASTFrame("Java syntax AST for file [" + f + "]", r2); // ASTFrame frame2 = new ASTFrame("Java syntax AST for file [" + f + "]", r2);
// if (showJavaSyntax) // if (showJavaSyntax)
// frame2.ShowDialog(); // frame2.ShowDialog();
// // Take each java compilation unit (each class defn) and write it to the appropriate file // // 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)); // IEnumerator enumCU = transformer.getAST().findAllPartial((ASTNode)transformer.getASTFactory().create(CSharpParser.COMPILATION_UNIT));
// while (enumCU.MoveNext()) // while (enumCU.MoveNext())
// { // {
// ASTNode javaCU = (ASTNode)enumCU.Current; // ASTNode javaCU = (ASTNode)enumCU.Current;
// // Extract class/interface name // // Extract class/interface name
// String claName = JavaTreeParser.getClassName(javaCU); // String claName = JavaTreeParser.getClassName(javaCU);
// // Get package name and convert to directory name // // Get package name and convert to directory name
// String nsDir = ""; // String nsDir = "";
// foreach (String nsc in JavaTreeParser.getPackageName(javaCU)) // foreach (String nsc in JavaTreeParser.getPackageName(javaCU))
// { // {
// nsDir = Path.Combine(nsDir, nsc); // nsDir = Path.Combine(nsDir, nsc);
// } // }
// // Build destination filename for this class // // Build destination filename for this class
// String fName = Path.Combine(Path.Combine(outDir, nsDir), claName + ".java"); // String fName = Path.Combine(Path.Combine(outDir, nsDir), claName + ".java");
// if (cheatDir != "") // if (cheatDir != "")
// { // {
// String cheatFile = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".java")); // String cheatFile = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".java"));
// if (File.Exists(cheatFile)) // if (File.Exists(cheatFile))
// { // {
// // the old switcheroo // // the old switcheroo
// File.Copy(cheatFile, fName, true); // File.Copy(cheatFile, fName, true);
// continue; // continue;
// } // }
// String ignoreMarker = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".none")); // String ignoreMarker = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".none"));
// if (File.Exists(ignoreMarker)) // if (File.Exists(ignoreMarker))
// { // {
// // Don't generate this class // // Don't generate this class
// continue; // continue;
// } // }
// } // }
// NetTranslator netTx = new NetTranslator(); // NetTranslator netTx = new NetTranslator();
// netTx.setASTNodeClass(typeof(ASTNode).FullName); // netTx.setASTNodeClass(typeof(ASTNode).FullName);
// netTx.setASTFactory(new ASTNodeFactory()); // netTx.setASTFactory(new ASTNodeFactory());
// NetTranslator.initializeASTFactory(netTx.getASTFactory()); // NetTranslator.initializeASTFactory(netTx.getASTFactory());
// netTx.compilationUnit(javaCU, null, appEnv); // netTx.compilationUnit(javaCU, null, appEnv);
// //BaseAST.setVerboseStringConversion(true, tokenNames); // //BaseAST.setVerboseStringConversion(true, tokenNames);
// ASTNode r3 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT"); // ASTNode r3 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r3.setFirstChild(netTx.getAST()); // r3.setFirstChild(netTx.getAST());
// ASTFrame frame3 = new ASTFrame("Java AST for file [" + f + "]", r3); // ASTFrame frame3 = new ASTFrame("Java AST for file [" + f + "]", r3);
// if (showJava) // if (showJava)
// frame3.ShowDialog(); // frame3.ShowDialog();
// Console.WriteLine(fName); // Console.WriteLine(fName);
// String fDir = Path.GetDirectoryName(fName); // String fDir = Path.GetDirectoryName(fName);
// if (!Directory.Exists(fDir)) // if (!Directory.Exists(fDir))
// { // {
// Directory.CreateDirectory(fDir); // Directory.CreateDirectory(fDir);
// } // }
// FileInfo outF = new FileInfo(fName); // FileInfo outF = new FileInfo(fName);
// StreamWriter w = new StreamWriter(outF.Create()); // StreamWriter w = new StreamWriter(outF.Create());
// JavaPrettyPrinter writer = new JavaPrettyPrinter(); // JavaPrettyPrinter writer = new JavaPrettyPrinter();
// writer.compilationUnit(netTx.getAST(), w, enumXmlWriter, filter); // writer.compilationUnit(netTx.getAST(), w, enumXmlWriter, filter);
// w.Close(); // w.Close();
// } // }
// double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0; double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0;
// //System.Console.Out.WriteLine(writer.ToString()); //System.Console.Out.WriteLine(writer.ToString());
// System.Console.Out.WriteLine(""); System.Console.Out.WriteLine("");
// System.Console.Out.WriteLine(""); System.Console.Out.WriteLine("");
// System.Console.Out.WriteLine("Pretty-printed {0} in: {1} seconds.", f, elapsedTime); 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" />