-
Notifications
You must be signed in to change notification settings - Fork 63
Description
Context: dotnet/android#3646
One of the long-ago design choices we made in binding Java code was we bound java.io.InputStream and java.io.OutputStream as System.IO.Stream, because we thought this would make it easier for new Java code to be used with existing .NET code.
Unfortunately, in the process we forgot about exception handling semantics: Android.Runtime.InputStreamInvoker wraps a Java.IO.InputStream, but does no "exception mapping". Thus, calling System.IO.Stream.Read() may cause a Java.IO.IOException to be thrown, which is not an exception type documented as throwable by Stream.Read().
We can't (easily) fix our existing bindings.
We can prevent new bindings from following this madness.
Update generator so that the e.g. "bind java.io.InputStream as System.IO.Stream" behavior can be controlled via Metadata.xml, and change the default behavior so that java.io.InputStream is bound as Java.IO.InputStream, not System.IO.Stream. (The metadata support is so that existing bindings can enable the previous behavior and maintain API compatibility.)
This way, we won't make the problem worse.
We should also re-evaluate type bindings and stop similar mappings, e.g. XmlPullParserSymbol and XmlResourceParserSymbol.