diff --git a/CS2JLibrary/NetFramework/System/Collections/ArrayList.xml b/CS2JLibrary/NetFramework/System/Collections/ArrayList.xml index 2aabed3..a8b5db9 100644 --- a/CS2JLibrary/NetFramework/System/Collections/ArrayList.xml +++ b/CS2JLibrary/NetFramework/System/Collections/ArrayList.xml @@ -118,8 +118,10 @@ System.Void - - ${this:16}.reverse() + + java.util.Collections + + Collections.reverse(${this:16}) Reverse @@ -171,7 +173,7 @@ System.Object ${this:16}.get(${i}) - ${this:16}.add(${i}, ${value}) + ${this:16}.set(${i}, ${value}) diff --git a/CS2JLibrary/NetFramework/System/Collections/Generic/ICollection'1.xml b/CS2JLibrary/NetFramework/System/Collections/Generic/ICollection'1.xml index 7bfdd72..7dec006 100644 --- a/CS2JLibrary/NetFramework/System/Collections/Generic/ICollection'1.xml +++ b/CS2JLibrary/NetFramework/System/Collections/Generic/ICollection'1.xml @@ -23,6 +23,13 @@ ${expr} + + + ${this:16}.size() + System.Int32 + Count + ${this:16}.size() + diff --git a/CS2JLibrary/NetFramework/System/Collections/Generic/IDictionary'2.xml b/CS2JLibrary/NetFramework/System/Collections/Generic/IDictionary'2.xml index f3d3fd8..9cf4351 100644 --- a/CS2JLibrary/NetFramework/System/Collections/Generic/IDictionary'2.xml +++ b/CS2JLibrary/NetFramework/System/Collections/Generic/IDictionary'2.xml @@ -99,5 +99,12 @@ Values ${this:16}.values() + + + ${this:16}.size() + System.Int32 + Count + ${this:16}.size() + BBHaGzWIzkVajkMtIotxcu6p5VY=WOOzmkxA0yBm1tFVetTcQxQc7SztNyQygCPbn5vaHLtHI/MoQMuTuytu5BrGb4UJ7KG68galgfmWUlUD99Txs44X+XdHA7wY0XcAUwXHV+/uti6FicyhHw7mDr9Bj4+Rjq4RIA2I0gS5P25V9nMEIEQCD3/jjc+wc4Lt5AHw/b4= diff --git a/CS2JLibrary/NetFramework/System/Collections/Generic/IList'1.xml b/CS2JLibrary/NetFramework/System/Collections/Generic/IList'1.xml index 726f4e5..2dc669a 100644 --- a/CS2JLibrary/NetFramework/System/Collections/Generic/IList'1.xml +++ b/CS2JLibrary/NetFramework/System/Collections/Generic/IList'1.xml @@ -1,4 +1,4 @@ - + - javax.mail.internet.InternetAddress + CS2JNet.System.Net.Mail.MailAddress - InternetAddress + MailAddress System.Net.Mail.MailAddress @@ -24,9 +24,9 @@ - javax.mail.internet.InternetAddress + CS2JNet.System.Net.Mail.MailAddress - new InternetAddress(${address}) + new MailAddress(${address}) System.String diff --git a/CS2JLibrary/NetFramework/System/Object.xml b/CS2JLibrary/NetFramework/System/Object.xml index 89c270c..d2c680c 100644 --- a/CS2JLibrary/NetFramework/System/Object.xml +++ b/CS2JLibrary/NetFramework/System/Object.xml @@ -26,6 +26,15 @@ Equals System.Boolean + + + + + ${this:16}.clone(${obj}) + + Clone + System.Object @@ -60,6 +69,24 @@ GetHashCode System.Int + + + CS2JNet.System.ObjectSupport + + ObjectSupport.Equals(${obj1}, ${obj2}) + + + System.Object + obj1 + + + System.Object + obj2 + + + Equals + System.Boolean + diff --git a/CS2JLibrary/NetFramework/System/String.xml b/CS2JLibrary/NetFramework/System/String.xml index caa3400..e8d980a 100644 --- a/CS2JLibrary/NetFramework/System/String.xml +++ b/CS2JLibrary/NetFramework/System/String.xml @@ -40,10 +40,7 @@ System.Int32 - - CS2JNet.System.StringSupport - - StringSupport.Compare(${arg1}, ${this}) + ${this:16}.compareTo(${arg1}) System.String @@ -68,7 +65,7 @@ arg2 - System.Bool + System.Boolean isCaseSensitive diff --git a/CS2JLibrary/NetFramework/System/Type.xml b/CS2JLibrary/NetFramework/System/Type.xml index 2407249..d982aba 100644 --- a/CS2JLibrary/NetFramework/System/Type.xml +++ b/CS2JLibrary/NetFramework/System/Type.xml @@ -115,6 +115,17 @@ GetTypeCode System.TypeCode + + System.Boolean + IsAssignableFrom + + + arg1 + System.Type + + + ${this:16}.isAssignableFrom(${arg1}) + diff --git a/CS2JLibrary/src/CS2JNet/System/DateTimeSupport.java b/CS2JLibrary/src/CS2JNet/System/DateTimeSupport.java index 728a8cb..4ca4daf 100755 --- a/CS2JLibrary/src/CS2JNet/System/DateTimeSupport.java +++ b/CS2JLibrary/src/CS2JNet/System/DateTimeSupport.java @@ -1,5 +1,5 @@ /* - Copyright 2007,2008,2009,2010 Rustici Software, LLC + Copyright 2007,2008,2009,2010 Rustici Software, LLC Copyright 2010,2011 Kevin Glynn (kevin.glynn@twigletsoftware.com) Licensed under the Apache License, Version 2.0 (the "License"); @@ -33,7 +33,7 @@ import CS2JNet.JavaSupport.util.LocaleSupport; public class DateTimeSupport { public static String ToString(Date d, String format, Locale loc) { - + SimpleDateFormat formatter = null; if (format.equals("s")) { //TODO: Is this really a db-friendly sortable format? @@ -43,14 +43,22 @@ public class DateTimeSupport { formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'Z'", loc); } else if (format.equals("yyyy-MM-ddTHH:mm:ss.ffZ")) { formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'", loc); - } else { - formatter = new SimpleDateFormat(format, loc); + } else if (format.equals("yyyy-MM-ddTHH:mm:ss.fffZ")) { + formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", loc); + } else if (format.equals("ddd',' dd MMM yyyy HH':'mm':'ss'.'fff GMT")) { + formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss.SSS 'GMT'"); + } else { + formatter = new SimpleDateFormat(format, loc); + } + + if (formatter.toPattern().contains("'Z'") || formatter.toPattern().contains("'GMT'")){ + formatter.setTimeZone(TimeZone.getTimeZone("UTC")); } - + if (d instanceof DateTZ) { formatter.setTimeZone(((DateTZ)d).getTimeZone()); } - + return formatter.format(d); } @@ -75,10 +83,14 @@ public class DateTimeSupport { private static final String[] DATE_FORMATS = new String[] { "E MMM d HH:mm:ss Z yyyy", "MM/dd/yyyy HH:mm:ss a", - "yyyy-MM-dd HH:mm:ss'Z'", + "yyyy-MM-dd'T'HH:mm:ss.SSSZ", + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + "yyyy-MM-dd'T'HH:mm:ssZ", + "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd'T'HH:mm:ss'.'SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd'T'HH:mm:ss", + "yyyy-MM-dd HH:mm:ss'Z'", "yyyy-MM-dd"}; public static Date parse(String s) throws ParseException @@ -92,21 +104,21 @@ public class DateTimeSupport { return parse(val, DATE_FORMATS, Locale.getDefault(), utc); } - protected static String trimMilliSecondsToThreeDigits(String dateString){ - String val = dateString; - if(val != null){ - int milliStart = val.lastIndexOf("."); - if(milliStart != -1){ - milliStart = milliStart + 1; - int milliEnd = val.lastIndexOf("Z"); - milliEnd = (milliEnd == -1) ? val.length() : milliEnd; - if((milliEnd - milliStart) > 3){ - String newMillis = val.substring(milliStart).substring(0, 3); - val = val.substring(0, milliStart) + newMillis + val.substring(milliEnd, val.length()); - } - } - } - return val; + protected static String trimMilliSecondsToThreeDigits(String dateString){ + String val = dateString; + if(val != null){ + int milliStart = val.lastIndexOf("."); + if(milliStart != -1){ + milliStart = milliStart + 1; + int milliEnd = Math.max(val.lastIndexOf("+"), val.lastIndexOf("Z")); + milliEnd = (milliEnd == -1) ? val.length() : milliEnd; + if((milliEnd - milliStart) > 3){ + String newMillis = val.substring(milliStart).substring(0, 3); + val = val.substring(0, milliStart) + newMillis + val.substring(milliEnd, val.length()); + } + } + } + return val; } public static Date parse(String s, String f) throws ParseException @@ -132,7 +144,7 @@ public class DateTimeSupport { try { SimpleDateFormat sdf = new SimpleDateFormat(f); - if(utc){ + if(utc || f.contains("Z")){ sdf.setTimeZone(TimeZone.getTimeZone("UTC")); } Date d = sdf.parse(s); @@ -167,7 +179,7 @@ public class DateTimeSupport { cal.add(field, amount); return cal.getTime(); } - + public static boolean equals(Date d1, Date d2) { return d1 == d2 || (d1 != null && d2 != null && d1.getTime() == d2.getTime()); } diff --git a/CS2JLibrary/src/CS2JNet/System/ObjectSupport.java b/CS2JLibrary/src/CS2JNet/System/ObjectSupport.java new file mode 100644 index 0000000..e2e99e4 --- /dev/null +++ b/CS2JLibrary/src/CS2JNet/System/ObjectSupport.java @@ -0,0 +1,11 @@ +package CS2JNet.System; + +public class ObjectSupport { + public static boolean Equals(Object obj1, Object obj2) { + if (obj1 == null) { + return obj2 == null; + } else { + return obj1.equals(obj2); + } + } +} diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/Templates.cs b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/Templates.cs index 78bd6d5..bb34b0d 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/Templates.cs +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JMain/Templates.cs @@ -239,18 +239,10 @@ default_template() ::= << default: >> -lock(comments,exp,block, indent) ::= << - -lock() - ->> - -synchstat(comments,exp,stats) ::= << +synchstat(comments,exp,stat) ::= << synchronized () -{ - -} + >> yield(comments,exp) ::= << diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g index 28cd3e4..5ff927c 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaMaker.g @@ -2050,8 +2050,13 @@ checked_statement: 'checked' block ; unchecked_statement: 'unchecked' block -> ^(UNCHECKED block); -lock_statement: - 'lock' '(' expression ')' embedded_statement[/* isStatementListCtxt */ false] ; +lock_statement +@init { + CommonTree statAsBlock = null; +}: + l='lock' '(' expression p=')' embedded_statement[/* isStatementListCtxt */ false] + { statAsBlock = dupTree(embeddedStatementToBlock($p.token, $embedded_statement.tree)); } + -> ^(SYNCHRONIZED[$l.token, "synchronized"] expression { statAsBlock }); // TODO: Can we avoid surrounding this with braces if not needed? using_statement[bool isStatementListCtxt] @init { diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g index b07c3ee..48d3b1a 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/JavaPrettyPrint.g @@ -1580,7 +1580,6 @@ embedded_statement returns [bool isSemi, bool isIf, bool indent] | checked_statement -> { $checked_statement.st } | unchecked_statement -> { $unchecked_statement.st } | synchronized_statement -> { $synchronized_statement.st } - | lock_statement -> { $lock_statement.st } | yield_statement -> { $yield_statement.st } | ^('unsafe' { preComments = CollectedComments; } block { someText = %op(); %{someText}.op="unsafe"; %{someText}.post = $block.st; }) -> unsupported(comments = { preComments }, reason = {"unsafe blocks are not supported"}, text = { someText } ) @@ -1681,7 +1680,7 @@ finally_clause: ^('finally' block) -> fin(block = {$block.st}, blockindent = { $block.isSemi }); synchronized_statement: - ^(SYNCHRONIZED expression '{' s+=statement* '}') -> synchstat(exp={ $expression.st }, stats = { $s }); + ^(SYNCHRONIZED expression embedded_statement) -> synchstat(exp={ $expression.st }, stat = { $embedded_statement.st }, indent = { $embedded_statement.indent }); checked_statement @init { @@ -1703,16 +1702,6 @@ unchecked_statement %{someText}.block = $block.st; %{someText}.indent = $block.isSemi; } -> unsupported(reason = {"checked statements are not supported"}, text = { someText } ) ; -lock_statement -@init { - StringTemplate someText = null; -}: - 'lock' '(' expression ')' embedded_statement - { someText = %lock(); - %{someText}.exp = $expression.st; - %{someText}.block = $embedded_statement.st; - %{someText}.indent = $embedded_statement.indent; } -> unsupported(reason = {"lock() statements are not supported"}, text = { someText } ) - ; yield_statement @init { StringTemplate someText = null; diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g index 32e896f..f078d23 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g @@ -1132,6 +1132,14 @@ scope MkNonGeneric { $ForceUnsharedType::fresh = false; } + + protected void AddNSToSearchPath(List search, string ns) { + int idx = 0; + while (ns.IndexOf('.', idx) > 0) { + idx = ns.IndexOf('.', idx)+1; + search.Add(ns.Substring(0,idx-1)); + } + } } public compilation_unit @@ -1155,7 +1163,7 @@ scope NSContext, PrimitiveRep, MkNonGeneric, ForceUnsharedType; $ForceUnsharedType::fresh = false; }: - ^(pkg=PACKAGE ns=PAYLOAD { $NSContext::currentNS = $ns.text; } dec=type_declaration ) + ^(pkg=PACKAGE ns=PAYLOAD { $NSContext::currentNS = $ns.text; AddNSToSearchPath($NSContext::globalNamespaces, $ns.text);} dec=type_declaration ) -> ^($pkg $ns { mkImports() } $dec); type_declaration: @@ -3125,8 +3133,7 @@ embedded_statement[bool isStatementListCtxt] | ^('try' block catch_clauses? finally_clause?) | checked_statement | unchecked_statement - | synchronized_statement // Java: synchronized(obj) {} - | lock_statement + | synchronized_statement | yield_statement | ^('unsafe' block) | fixed_statement @@ -3426,10 +3433,7 @@ unchecked_statement: ^(UNCHECKED block) ; synchronized_statement: - ^(SYNCHRONIZED expression[ObjectType] '{' statement_list '}') ; - -lock_statement: - 'lock' '(' expression[ObjectType] ')' embedded_statement[/* isStatementListCtxt */ false] ; + ^(SYNCHRONIZED expression[ObjectType] embedded_statement[/* isStatementListCtxt */ false]) ; yield_statement: ^(YIELD_RETURN expression[ObjectType]) diff --git a/CSharpTranslator/tests/Tester/Misc/Namespaces/child.cs b/CSharpTranslator/tests/Tester/Misc/Namespaces/child.cs new file mode 100755 index 0000000..514dcb9 --- /dev/null +++ b/CSharpTranslator/tests/Tester/Misc/Namespaces/child.cs @@ -0,0 +1,22 @@ +using System; + +// Test translation for lock statements + +namespace Tester.Parent.Child +{ + + public class ChildClass + { + + private ParentClass myp = null; + + + public ChildClass(int val) + { + myp = new ParentClass(val); + int tmp = myp.GetHashCode(); + } + + } + +} diff --git a/CSharpTranslator/tests/Tester/Misc/Namespaces/parent.cs b/CSharpTranslator/tests/Tester/Misc/Namespaces/parent.cs new file mode 100755 index 0000000..fee9f21 --- /dev/null +++ b/CSharpTranslator/tests/Tester/Misc/Namespaces/parent.cs @@ -0,0 +1,41 @@ +using System; + +// Test translation for lock statements + +namespace Tester.Parent +{ + +public class ParentClass { + + private int loc = 0; + + + public ParentClass(int val) + { + loc = val; + } + + public int GetLoc() + { + return loc; + } + + public override int GetHashCode(){ + return 5; + } + + private class ChildOne { + public int COloc = 0; + private class ChildChildOne + { + public ChildChildOne() { } + + public ChildOne p = new ChildOne(); + public ParentClass gp = new ParentClass(4); + } + } + + +} + +} diff --git a/CSharpTranslator/tests/Tester/Misc/locker.cs b/CSharpTranslator/tests/Tester/Misc/locker.cs new file mode 100755 index 0000000..67f63be --- /dev/null +++ b/CSharpTranslator/tests/Tester/Misc/locker.cs @@ -0,0 +1,31 @@ +using System; + +// Test translation for lock statements + +namespace Tester.Locker +{ +class B { + public virtual void foo() { + lock(this) + Console.WriteLine("summat"); + } +} +class D : B { + public new void foo() { + lock (new String[5]) + { + Console.WriteLine("and"); + Console.WriteLine("nuttin"); + } + } +} + +public class Test5 { + public static void T5Main(){ + B b = new D(); + b.foo(); + Console.WriteLine("Done"); + } +} + +} diff --git a/CSharpTranslator/tests/Tester/Tester.csproj b/CSharpTranslator/tests/Tester/Tester.csproj index 40c54ab..7a3b862 100644 --- a/CSharpTranslator/tests/Tester/Tester.csproj +++ b/CSharpTranslator/tests/Tester/Tester.csproj @@ -1,4 +1,4 @@ - + Debug @@ -45,6 +45,9 @@ + + +