diff --git a/CSharpTranslator/antlr3/cs2jTest/TestDLLs/Various.cs b/CSharpTranslator/antlr3/cs2jTest/TestDLLs/Various.cs index 977066d..dcd8cbf 100644 --- a/CSharpTranslator/antlr3/cs2jTest/TestDLLs/Various.cs +++ b/CSharpTranslator/antlr3/cs2jTest/TestDLLs/Various.cs @@ -1,12 +1,18 @@ using System; namespace cs2jTest.Various.Features { + + // delegate declaration + public delegate string MyDelegate(int i); + public class Various { public Various () { } + private int myInt; + public string TestRWProperty {get; set;} public string get_TestRWProperty() { diff --git a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs index 3955922..28b4f57 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs @@ -214,6 +214,21 @@ namespace RusticiSoftware.Translator.CLR Java = java; } + + protected string mkJavaParams(IList pars) { + StringBuilder parStr = new StringBuilder(); + parStr.Append("("); + foreach (ParamRepTemplate p in pars) { + parStr.Append("${"+p.Name+"},"); + } + if (parStr[parStr.Length-1] == ',') { + parStr.Remove(parStr.Length-1,1); + } + parStr.Append(")"); + return parStr.ToString(); + } + + #region Equality public bool Equals (TranslationBase other) @@ -281,25 +296,12 @@ namespace RusticiSoftware.Translator.CLR } } - protected string mkJavaParams() { - StringBuilder parStr = new StringBuilder(); - parStr.Append("("); - foreach (ParamRepTemplate p in Params) { - parStr.Append("${"+p.Name+"},"); - } - if (parStr[parStr.Length-1] == ',') { - parStr.Remove(parStr.Length-1,1); - } - parStr.Append(")"); - return parStr.ToString(); - } - public override string mkJava() { string constructorName = "CONSTRUCTOR"; if (SurroundingTypeName != null) { constructorName = SurroundingTypeName.Substring(SurroundingTypeName.LastIndexOf('.') + 1); } - return "new " + constructorName + mkJavaParams(); + return "new " + constructorName + mkJavaParams(Params); } public override string[] mkImports() { @@ -434,7 +436,7 @@ namespace RusticiSoftware.Translator.CLR methStr.Append("${this}."); } methStr.Append(Name); - return methStr.ToString() + mkJavaParams(); + return methStr.ToString() + mkJavaParams(Params); } #region Equality @@ -1104,6 +1106,10 @@ namespace RusticiSoftware.Translator.CLR _params = args; } + public override string mkJava() { + return "${delegate}.Invoke" + mkJavaParams(Params); + } + public override TypeRep mkEmptyRep () { return new DelegateRep (); diff --git a/CSharpTranslator/antlr3/src/cs2jTemplateGen/Main.cs b/CSharpTranslator/antlr3/src/cs2jTemplateGen/Main.cs index fbf5f49..96abb00 100644 --- a/CSharpTranslator/antlr3/src/cs2jTemplateGen/Main.cs +++ b/CSharpTranslator/antlr3/src/cs2jTemplateGen/Main.cs @@ -65,12 +65,12 @@ namespace cs2j.Template.Utils } - private void buildParameters(ConstructorRepTemplate c, MethodBase m) { + private void buildParameters(IList ps, MethodBase m) { foreach (ParameterInfo p in m.GetParameters()) { ParamRepTemplate paramRep = new ParamRepTemplate(); paramRep.Type = TypeHelper.buildTypeName(p.ParameterType); paramRep.Name = p.Name; - c.Params.Add(paramRep); + ps.Add(paramRep); } } @@ -113,7 +113,7 @@ namespace cs2j.Template.Utils } methRep.TypeParams = tParams; } - buildParameters(methRep, m); + buildParameters(methRep.Params, m); if (m.IsStatic) { methRep.IsStatic = true; } @@ -146,7 +146,7 @@ namespace cs2j.Template.Utils // Grab Constructors foreach (ConstructorInfo c in t.GetConstructors()) { ConstructorRepTemplate consRep = new ConstructorRepTemplate(); - buildParameters(consRep, c); + buildParameters(consRep.Params, c); consRep.SurroundingTypeName = klass.TypeName; klass.Constructors.Add(consRep); } @@ -170,6 +170,27 @@ namespace cs2j.Template.Utils } + private void buildDelegate(DelegateRepTemplate d, Type t) { + + if (t.IsGenericType) { + d.TypeName = t.GetGenericTypeDefinition().FullName; + string[] tParams = new string[t.GetGenericArguments().Length]; + for (int i = 0; i < t.GetGenericArguments().Length; i++) { + tParams[i] = t.GetGenericArguments()[i].Name; + } + d.TypeParams = tParams; + } + else { + d.TypeName = t.FullName; + } + + MethodInfo invoker = t.GetMethod("Invoke"); + if (invoker == null) + throw new Exception("Unexpected: class " + t.FullName + " inherits from System.Delegate but doesn't have an Invoke method"); + buildParameters(d.Params, invoker); + d.Return = TypeHelper.buildTypeName(invoker.ReturnType); + } + private IList mkTemplates(string typeName) { List rets = new List(); @@ -181,9 +202,16 @@ namespace cs2j.Template.Utils } TypeRepTemplate retRep = null; if (t.IsClass) { - ClassRepTemplate classRep = new ClassRepTemplate(); - buildClass(classRep, t); - retRep = classRep; + if (t.IsSubclassOf(typeof(System.Delegate))) { + DelegateRepTemplate delRep = new DelegateRepTemplate(); + buildDelegate(delRep, t); + retRep = delRep; + } + else { + ClassRepTemplate classRep = new ClassRepTemplate(); + buildClass(classRep, t); + retRep = classRep; + } } else if (t.IsInterface) { InterfaceRepTemplate intRep = new InterfaceRepTemplate();