xamarin / java.interop

Java.Interop provides open-source bindings of Java's Java Native Interface (JNI) for use with .NET managed languages such as C#

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Handle properties with getter or setter only `[Obsolete]` attribute

jpobst opened this issue · comments

When we are converting Java getter/setter pairs to C# properties, we can hit an interesting scenario where a getter may be @Deprecated and the setter is not, or vice versa:

  public boolean hasOptionsMenu () { ... }

  @Deprecated
  public void setHasOptionsMenu (boolean hasMenu) { ... }

C# has traditionally not allowed [Obsolete] to be placed on just a get or a set, it can only be placed on the entire property.

  [Obsolete]
  public bool HasOptionsMenu { get; set; }

This can lead to confusion because using the getter will report an obsolete warning when it is not obsolete. Thus, for properties, we only add [Obsolete] in 2 cases:

  • The get is obsolete and there is no set
  • Both the get and set are obsolete

We have this comment in our code:

// Unlike [Register], [Obsolete] cannot be put on property accessors, so we can apply them only under limited condition...

However, the compiler team has determined that preventing [Obsolete] on property accessors was a bug, and has fixed it in C# 8: dotnet/roslyn#32571.

Thus we can update generator to support scenarios in which only the Java getter or setter is marked as @Deprecated.