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
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 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 ../../../
xbuild
echo 'All Done'

View File

@ -18,8 +18,8 @@ namespace RusticiSoftware.Translator.CSharp
class CS2J
{
private const string VERSION = "2009.1.1.x";
private static DirectoryHT<TypeRepTemplate> AppEnv { get; set; }
private static CS2JSettings cfg = new CS2JSettings();
private static DirectoryHT<TypeRepTemplate> AppEnv { get; set; }
private static CS2JSettings cfg = new CS2JSettings();
public delegate void FileProcessor(string fName);
@ -49,18 +49,18 @@ namespace RusticiSoftware.Translator.CSharp
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(';');
for (int i = 0; i < argDirs.Length; i++)
strs.Add(Path.GetFullPath(argDirs[i]).ToLower());
}
}
public static void CS2JMain(string[] args)
{
long startTime = DateTime.Now.Ticks;
IList<string> remArgs = new List<string>();
XmlTextWriter enumXmlWriter = null;
AppEnv = new DirectoryHT<TypeRepTemplate>(null);
IList<string> remArgs = new List<string>();
XmlTextWriter enumXmlWriter = null;
AppEnv = new DirectoryHT<TypeRepTemplate>(null);
// Use a try/catch block for parser exceptions
try
@ -71,36 +71,36 @@ namespace RusticiSoftware.Translator.CSharp
if (cfg.Verbosity >= 2) Console.Error.WriteLine("Parsing Command Line Arguments...");
OptionSet p = new OptionSet ()
.Add ("v", v => cfg.Verbosity++)
.Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v))
.Add ("warnings", v => cfg.Warnings = true)
.Add ("version", v => showVersion())
.Add ("help|h|?", v => showUsage())
.Add ("dumpcsharp", v => cfg.DumpCSharp = true)
.Add ("dumpjava", v => cfg.DumpJava = true)
.Add ("dumpjavasyntax", v => cfg.DumpJavaSyntax = true)
.Add ("dumptokens", v => cfg.DisplayTokens = true)
.Add ("D=", def => cfg.MacroDefines.Add(def))
.Add ("dumpenums", v => cfg.DumpEnums = true)
.Add ("enumdir=", dir => cfg.EnumDir = Path.Combine(Directory.GetCurrentDirectory(), dir))
.Add ("dumpxmls", v => cfg.DumpXmls = true)
.Add ("xmldir=", dir => cfg.XmlDir = Path.Combine(Directory.GetCurrentDirectory(), dir))
.Add ("odir=", dir => cfg.OutDir = dir)
.Add ("cheatdir=", dir => cfg.CheatDir = dir)
.Add ("netdir=", dirs => addDirectories(cfg.NetRoot, dirs))
.Add ("exnetdir=", dirs => addDirectories(cfg.ExNetRoot, dirs))
.Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs))
.Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs))
.Add ("exclude=", dirs => addDirectories(cfg.Exclude, dirs))
;
OptionSet p = new OptionSet ()
.Add ("v", v => cfg.Verbosity++)
.Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v))
.Add ("warnings", v => cfg.Warnings = true)
.Add ("version", v => showVersion())
.Add ("help|h|?", v => showUsage())
.Add ("dumpcsharp", v => cfg.DumpCSharp = true)
.Add ("dumpjava", v => cfg.DumpJava = true)
.Add ("dumpjavasyntax", v => cfg.DumpJavaSyntax = true)
.Add ("dumptokens", v => cfg.DisplayTokens = true)
.Add ("D=", def => cfg.MacroDefines.Add(def))
.Add ("dumpenums", v => cfg.DumpEnums = true)
.Add ("enumdir=", dir => cfg.EnumDir = Path.Combine(Directory.GetCurrentDirectory(), dir))
.Add ("dumpxmls", v => cfg.DumpXmls = true)
.Add ("xmldir=", dir => cfg.XmlDir = Path.Combine(Directory.GetCurrentDirectory(), dir))
.Add ("odir=", dir => cfg.OutDir = dir)
.Add ("cheatdir=", dir => cfg.CheatDir = dir)
.Add ("netdir=", dirs => addDirectories(cfg.NetRoot, dirs))
.Add ("exnetdir=", dirs => addDirectories(cfg.ExNetRoot, dirs))
.Add ("appdir=", dirs => addDirectories(cfg.AppRoot, dirs))
.Add ("exappdir=", dirs => addDirectories(cfg.ExAppRoot, dirs))
.Add ("exclude=", dirs => addDirectories(cfg.Exclude, dirs))
;
//TODO: fix enum dump
// Final argument is translation target
remArgs = p.Parse (args);
//TODO: fix enum dump
// Final argument is translation target
remArgs = p.Parse (args);
// Load .Net templates
// Load .Net templates
foreach (string r in cfg.NetRoot)
doFile(r, ".xml", addNetTranslation, cfg.ExNetRoot);
@ -110,16 +110,16 @@ namespace RusticiSoftware.Translator.CSharp
cfg.AppRoot.Add(remArgs[0]);
foreach (string r in cfg.AppRoot)
doFile(r, ".cs", addAppSigTranslation, cfg.ExAppRoot); // parse it
if (cfg.DumpEnums) {
enumXmlWriter = new XmlTextWriter(cfg.EnumDir, System.Text.Encoding.UTF8);
}
if (cfg.DumpEnums) {
enumXmlWriter = new XmlTextWriter(cfg.EnumDir, System.Text.Encoding.UTF8);
}
if (cfg.DumpXmls)
{
// Get package name and convert to directory name
foreach (KeyValuePair<string,TypeRepTemplate> de in AppEnv)
{
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);
if (!Directory.Exists(xmlFDir))
{
@ -135,8 +135,8 @@ namespace RusticiSoftware.Translator.CSharp
if (cfg.DumpEnums)
{
enumXmlWriter.WriteEndElement();
enumXmlWriter.Close();
}
enumXmlWriter.Close();
}
}
else
{
@ -161,7 +161,7 @@ namespace RusticiSoftware.Translator.CSharp
// 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)
{
string canonicalPath = Path.GetFullPath(root);
string canonicalPath = Path.GetFullPath(root);
// If this is a directory, walk each file/dir in that directory
if (!excludes.Contains(canonicalPath.ToLower()))
{
@ -193,16 +193,16 @@ namespace RusticiSoftware.Translator.CSharp
if (cfg.Verbosity > 2) Console.WriteLine("Parsing " + Path.GetFileName(fullName));
ICharStream input = new ANTLRFileStream(fullName);
ICharStream input = new ANTLRFileStream(fullName);
PreProcessor lex = new PreProcessor();
lex.AddDefine(cfg.MacroDefines);
PreProcessor lex = new PreProcessor();
lex.AddDefine(cfg.MacroDefines);
lex.CharStream = input;
lex.TraceDestination = Console.Error;
lex.TraceDestination = Console.Error;
CommonTokenStream tokens = new CommonTokenStream(lex);
csParser p = new csParser(tokens);
p.TraceDestination = Console.Error;
p.TraceDestination = Console.Error;
csParser.compilation_unit_return parser_rt = p.compilation_unit();
@ -220,146 +220,178 @@ namespace RusticiSoftware.Translator.CSharp
}
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)
{
Stream s = new FileStream(fullName, FileMode.Open, FileAccess.Read);
TypeRepTemplate t = TypeRepTemplate.newInstance(s);
TypeRepTemplate t = TypeRepTemplate.newInstance(s);
AppEnv[t.TypeName] = t;
}
// Here's where we do the real work...
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);
if (csTree != null)
{
TemplateExtracter templateWalker = new TemplateExtracter(csTree);
templateWalker.Filename = fullName;
templateWalker.TraceDestination = Console.Error;
templateWalker.compilation_unit(cfg, AppEnv);
TemplateExtracter templateWalker = new TemplateExtracter(csTree);
templateWalker.Filename = fullName;
templateWalker.TraceDestination = Console.Error;
templateWalker.compilation_unit(cfg, AppEnv);
}
}
// Here's where we do the real work...
public static void translateFile(string fullName)
{
if (cfg.DebugLevel > 3) Console.Out.WriteLine("Translating file {0}", fullName);
CommonTreeNodeStream csTree = parseFile(fullName);
if (cfg.DumpCSharp && csTree != null) AntlrUtils.AntlrUtils.DumpNodes(csTree);
long startTime = DateTime.Now.Ticks;
if (cfg.DebugLevel > 3) Console.Out.WriteLine("Translating file {0}", fullName);
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);
// if (t != null)
// {
// if (showTree)
// {
// ASTNode r = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// 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();
// ASTNode t = parseFile(f, s);
// if (t != null)
// {
// if (showTree)
// {
// ASTNode r = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// 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();
// transformer.setASTNodeClass(typeof(ASTNode).FullName);
// transformer.setASTFactory(new ASTNodeFactory());
// CSharpTranslator.initializeASTFactory(transformer.getASTFactory());
// CSharpTranslator transformer = new CSharpTranslator();
// transformer.setASTNodeClass(typeof(ASTNode).FullName);
// transformer.setASTFactory(new ASTNodeFactory());
// CSharpTranslator.initializeASTFactory(transformer.getASTFactory());
// long startTime = DateTime.Now.Ticks;
// transformer.compilationUnit(t, null);
// long startTime = DateTime.Now.Ticks;
// transformer.compilationUnit(t, null);
// //BaseAST.setVerboseStringConversion(true, tokenNames);
// ASTNode r2 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r2.setFirstChild(transformer.getAST());
// ASTFrame frame2 = new ASTFrame("Java syntax AST for file [" + f + "]", r2);
// if (showJavaSyntax)
// frame2.ShowDialog();
// //BaseAST.setVerboseStringConversion(true, tokenNames);
// ASTNode r2 = (ASTNode)new ASTNodeFactory().create(0, "AST ROOT");
// r2.setFirstChild(transformer.getAST());
// 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
// IEnumerator enumCU = transformer.getAST().findAllPartial((ASTNode)transformer.getASTFactory().create(CSharpParser.COMPILATION_UNIT));
// while (enumCU.MoveNext())
// {
// ASTNode javaCU = (ASTNode)enumCU.Current;
// // 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;
// // Extract class/interface name
// String claName = JavaTreeParser.getClassName(javaCU);
// // Extract class/interface name
// String claName = JavaTreeParser.getClassName(javaCU);
// // Get package name and convert to directory name
// String nsDir = "";
// foreach (String nsc in JavaTreeParser.getPackageName(javaCU))
// {
// nsDir = Path.Combine(nsDir, nsc);
// }
// // Get package name and convert to directory name
// String nsDir = "";
// foreach (String nsc in JavaTreeParser.getPackageName(javaCU))
// {
// nsDir = Path.Combine(nsDir, nsc);
// }
// // Build destination filename for this class
// String fName = Path.Combine(Path.Combine(outDir, nsDir), claName + ".java");
// // Build destination filename for this class
// String fName = Path.Combine(Path.Combine(outDir, nsDir), claName + ".java");
// if (cheatDir != "")
// {
// String cheatFile = Path.Combine(cheatDir, Path.Combine(nsDir, claName + ".java"));
// if (File.Exists(cheatFile))
// {
// // the old switcheroo
// File.Copy(cheatFile, fName, true);
// continue;
// }
// if (cheatDir != "")
// {
// 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;
// }
// }
// 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);
// 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();
// //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);
// 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();
// 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.", f, elapsedTime);
// }
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
TemplateExtracter.cs
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);
}
}
// 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);
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) {
// 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();
}
// Nested types can see things in this space
@ -848,10 +832,8 @@ scope NSContext;
{
Debug("Processing delegate: " + $identifier.text);
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) {
// 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;
@ -938,10 +920,8 @@ scope NSContext;
{
Debug("Processing interface: " + $identifier.text);
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) {
// 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();
}
// Nested types can see things in this space
@ -1024,10 +1004,8 @@ scope NSContext;
{
Debug("Processing struct: " + $type_or_generic.type);
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) {
// 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();
}
// 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">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -66,11 +66,17 @@
<Compile Include="Utils\TypeHelper.cs" />
<Compile Include="CSharp\TemplateExtracter.cs" />
<Compile Include="CLR\CS2JSettings.cs" />
<Compile Include="CSharp\JavaMaker.cs" />
<Compile Include="CSharp\JavaPrettyPrint.cs" />
<Compile Include="CSharp\NetMaker.cs" />
</ItemGroup>
<ItemGroup>
<None Include="CSharp\csCrawl.g" />
<None Include="CSharp\cs.g" />
<None Include="CSharp\TemplateExtracter.g" />
<None Include="CSharp\JavaMaker.g" />
<None Include="CSharp\JavaPrettyPrint.g" />
<None Include="CSharp\NetMaker.g" />
</ItemGroup>
<ItemGroup>
<Content Include="README.txt" />