ankidroid / Anki-Android-Backend

JNI bridge between AnkiDroid and Anki Desktop's rust code
GNU General Public License v3.0
65 stars 24 forks source link

Lists should be exposed to Kotlin as `List`, not `MutableList` #334

Open david-allison opened 9 months ago

david-allison commented 9 months ago

Backend Codegen is problematic: it exposes a java.util.List, but this is actually a com.google.protobuf.Internal.ProtobufList. ProtobufList throws on mutation

Extends List to add the capability to make the list immutable and inspect if it is modifiable.

https://protobuf.dev/reference/java/api-docs/com/google/protobuf/Internal.ProtobufList

Reported in: https://github.com/ankidroid/Anki-Android/pull/14948

david-allison commented 9 months ago

I've had a quick Google, but no obvious annotations came up to tell the kotlin compiler that the Java list should be List<T> rather than MutableList<T> when accessed by Kotlin

If it means we need to port our codegen to Kotlin, this is likely not worthwhile

dae commented 9 months ago

Where are you seeing mutable? I looked in the generated Note.java, and it's a plain list:

  /**
   * <code>repeated string fields = 7;</code>
   * @return A list containing the fields.
   */
  @java.lang.Override
  public java.util.List<java.lang.String> getFieldsList() {
    return fields_;
  }
dae commented 9 months ago

Sorry, ignore me - I assumed that List was always an immutable variant in Java, but apparently that's not the case.

dae commented 9 months ago

And this is not our codegen by the way - it's the output of protoc.