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 @@
+
+
+