diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index f317a240e03..0d75ae83818 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,7 @@ +## 15.0.1 + +* [java] Adds @CanIgnoreReturnValue annotation to class builder. + ## 15.0.0 * **Breaking Change** [kotlin] Updates Flutter API to use new errorClassName. diff --git a/packages/pigeon/example/app/android/app/src/main/java/io/flutter/plugins/Messages.java b/packages/pigeon/example/app/android/app/src/main/java/io/flutter/plugins/Messages.java index 319780d7b71..5d1b693b823 100644 --- a/packages/pigeon/example/app/android/app/src/main/java/io/flutter/plugins/Messages.java +++ b/packages/pigeon/example/app/android/app/src/main/java/io/flutter/plugins/Messages.java @@ -4,6 +4,9 @@ // Autogenerated from Pigeon, do not edit directly. // See also: https://pub.dev/packages/pigeon +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -12,6 +15,8 @@ import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.common.StandardMessageCodec; import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; @@ -61,6 +66,10 @@ protected static FlutterError createConnectionError(@NonNull String channelName) "channel-error", "Unable to establish connection on channel: " + channelName + ".", ""); } + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + public enum Code { ONE(0), TWO(1); @@ -127,6 +136,7 @@ public static final class Builder { private @Nullable String name; + @CanIgnoreReturnValue public @NonNull Builder setName(@Nullable String setterArg) { this.name = setterArg; return this; @@ -134,6 +144,7 @@ public static final class Builder { private @Nullable String description; + @CanIgnoreReturnValue public @NonNull Builder setDescription(@Nullable String setterArg) { this.description = setterArg; return this; @@ -141,6 +152,7 @@ public static final class Builder { private @Nullable Code code; + @CanIgnoreReturnValue public @NonNull Builder setCode(@NonNull Code setterArg) { this.code = setterArg; return this; @@ -148,6 +160,7 @@ public static final class Builder { private @Nullable Map data; + @CanIgnoreReturnValue public @NonNull Builder setData(@NonNull Map setterArg) { this.data = setterArg; return this; diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart index 342800dea9a..c7b29e5f143 100644 --- a/packages/pigeon/lib/generator_tools.dart +++ b/packages/pigeon/lib/generator_tools.dart @@ -13,7 +13,7 @@ import 'ast.dart'; /// The current version of pigeon. /// /// This must match the version in pubspec.yaml. -const String pigeonVersion = '15.0.0'; +const String pigeonVersion = '15.0.1'; /// Read all the content from [stdin] to a String. String readStdin() { diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart index 16e806a170b..55866c7d59d 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -116,6 +116,12 @@ class JavaGenerator extends StructuredGenerator { indent.writeln('package ${generatorOptions.package};'); indent.newln(); } + if (root.classes.isNotEmpty) { + indent.writeln('import static java.lang.annotation.ElementType.METHOD;'); + indent + .writeln('import static java.lang.annotation.RetentionPolicy.CLASS;'); + indent.newln(); + } indent.writeln('import android.util.Log;'); indent.writeln('import androidx.annotation.NonNull;'); indent.writeln('import androidx.annotation.Nullable;'); @@ -124,6 +130,10 @@ class JavaGenerator extends StructuredGenerator { indent.writeln('import io.flutter.plugin.common.MessageCodec;'); indent.writeln('import io.flutter.plugin.common.StandardMessageCodec;'); indent.writeln('import java.io.ByteArrayOutputStream;'); + if (root.classes.isNotEmpty) { + indent.writeln('import java.lang.annotation.Retention;'); + indent.writeln('import java.lang.annotation.Target;'); + } indent.writeln('import java.nio.ByteBuffer;'); indent.writeln('import java.util.ArrayList;'); indent.writeln('import java.util.Arrays;'); @@ -290,6 +300,7 @@ class JavaGenerator extends StructuredGenerator { indent.writeln( 'private @Nullable ${hostDatatype.datatype} ${field.name};'); indent.newln(); + indent.writeln('@CanIgnoreReturnValue'); indent.writeScoped( 'public @NonNull Builder ${_makeSetter(field)}($nullability ${hostDatatype.datatype} setterArg) {', '}', () { @@ -939,6 +950,17 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { }); } + // We are emitting our own definition of [@CanIgnoreReturnValue] to support + // clients who use CheckReturnValue, without having to force Pigeon clients + // to take a new dependency on error_prone_annotations. + void _writeCanIgnoreReturnValueAnnotation( + JavaOptions opt, Root root, Indent indent) { + indent.newln(); + indent.writeln('@Target(METHOD)'); + indent.writeln('@Retention(CLASS)'); + indent.writeln('@interface CanIgnoreReturnValue {}'); + } + @override void writeGeneralUtilities( JavaOptions generatorOptions, @@ -961,6 +983,9 @@ protected static ArrayList wrapError(@NonNull Throwable exception) { indent.newln(); _writeCreateConnectionError(indent); } + if (root.classes.isNotEmpty) { + _writeCanIgnoreReturnValueAnnotation(generatorOptions, root, indent); + } } @override diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java index 60586828274..b6a72835e4a 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java @@ -7,6 +7,9 @@ package com.example.alternate_language_test_plugin; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -15,6 +18,8 @@ import io.flutter.plugin.common.MessageCodec; import io.flutter.plugin.common.StandardMessageCodec; import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -65,6 +70,10 @@ protected static FlutterError createConnectionError(@NonNull String channelName) "channel-error", "Unable to establish connection on channel: " + channelName + ".", ""); } + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + public enum AnEnum { ONE(0), TWO(1), @@ -259,6 +268,7 @@ public static final class Builder { private @Nullable Boolean aBool; + @CanIgnoreReturnValue public @NonNull Builder setABool(@NonNull Boolean setterArg) { this.aBool = setterArg; return this; @@ -266,6 +276,7 @@ public static final class Builder { private @Nullable Long anInt; + @CanIgnoreReturnValue public @NonNull Builder setAnInt(@NonNull Long setterArg) { this.anInt = setterArg; return this; @@ -273,6 +284,7 @@ public static final class Builder { private @Nullable Long anInt64; + @CanIgnoreReturnValue public @NonNull Builder setAnInt64(@NonNull Long setterArg) { this.anInt64 = setterArg; return this; @@ -280,6 +292,7 @@ public static final class Builder { private @Nullable Double aDouble; + @CanIgnoreReturnValue public @NonNull Builder setADouble(@NonNull Double setterArg) { this.aDouble = setterArg; return this; @@ -287,6 +300,7 @@ public static final class Builder { private @Nullable byte[] aByteArray; + @CanIgnoreReturnValue public @NonNull Builder setAByteArray(@NonNull byte[] setterArg) { this.aByteArray = setterArg; return this; @@ -294,6 +308,7 @@ public static final class Builder { private @Nullable int[] a4ByteArray; + @CanIgnoreReturnValue public @NonNull Builder setA4ByteArray(@NonNull int[] setterArg) { this.a4ByteArray = setterArg; return this; @@ -301,6 +316,7 @@ public static final class Builder { private @Nullable long[] a8ByteArray; + @CanIgnoreReturnValue public @NonNull Builder setA8ByteArray(@NonNull long[] setterArg) { this.a8ByteArray = setterArg; return this; @@ -308,6 +324,7 @@ public static final class Builder { private @Nullable double[] aFloatArray; + @CanIgnoreReturnValue public @NonNull Builder setAFloatArray(@NonNull double[] setterArg) { this.aFloatArray = setterArg; return this; @@ -315,6 +332,7 @@ public static final class Builder { private @Nullable List aList; + @CanIgnoreReturnValue public @NonNull Builder setAList(@NonNull List setterArg) { this.aList = setterArg; return this; @@ -322,6 +340,7 @@ public static final class Builder { private @Nullable Map aMap; + @CanIgnoreReturnValue public @NonNull Builder setAMap(@NonNull Map setterArg) { this.aMap = setterArg; return this; @@ -329,6 +348,7 @@ public static final class Builder { private @Nullable AnEnum anEnum; + @CanIgnoreReturnValue public @NonNull Builder setAnEnum(@NonNull AnEnum setterArg) { this.anEnum = setterArg; return this; @@ -336,6 +356,7 @@ public static final class Builder { private @Nullable String aString; + @CanIgnoreReturnValue public @NonNull Builder setAString(@NonNull String setterArg) { this.aString = setterArg; return this; @@ -343,6 +364,7 @@ public static final class Builder { private @Nullable Object anObject; + @CanIgnoreReturnValue public @NonNull Builder setAnObject(@NonNull Object setterArg) { this.anObject = setterArg; return this; @@ -592,6 +614,7 @@ public static final class Builder { private @Nullable Boolean aNullableBool; + @CanIgnoreReturnValue public @NonNull Builder setANullableBool(@Nullable Boolean setterArg) { this.aNullableBool = setterArg; return this; @@ -599,6 +622,7 @@ public static final class Builder { private @Nullable Long aNullableInt; + @CanIgnoreReturnValue public @NonNull Builder setANullableInt(@Nullable Long setterArg) { this.aNullableInt = setterArg; return this; @@ -606,6 +630,7 @@ public static final class Builder { private @Nullable Long aNullableInt64; + @CanIgnoreReturnValue public @NonNull Builder setANullableInt64(@Nullable Long setterArg) { this.aNullableInt64 = setterArg; return this; @@ -613,6 +638,7 @@ public static final class Builder { private @Nullable Double aNullableDouble; + @CanIgnoreReturnValue public @NonNull Builder setANullableDouble(@Nullable Double setterArg) { this.aNullableDouble = setterArg; return this; @@ -620,6 +646,7 @@ public static final class Builder { private @Nullable byte[] aNullableByteArray; + @CanIgnoreReturnValue public @NonNull Builder setANullableByteArray(@Nullable byte[] setterArg) { this.aNullableByteArray = setterArg; return this; @@ -627,6 +654,7 @@ public static final class Builder { private @Nullable int[] aNullable4ByteArray; + @CanIgnoreReturnValue public @NonNull Builder setANullable4ByteArray(@Nullable int[] setterArg) { this.aNullable4ByteArray = setterArg; return this; @@ -634,6 +662,7 @@ public static final class Builder { private @Nullable long[] aNullable8ByteArray; + @CanIgnoreReturnValue public @NonNull Builder setANullable8ByteArray(@Nullable long[] setterArg) { this.aNullable8ByteArray = setterArg; return this; @@ -641,6 +670,7 @@ public static final class Builder { private @Nullable double[] aNullableFloatArray; + @CanIgnoreReturnValue public @NonNull Builder setANullableFloatArray(@Nullable double[] setterArg) { this.aNullableFloatArray = setterArg; return this; @@ -648,6 +678,7 @@ public static final class Builder { private @Nullable List aNullableList; + @CanIgnoreReturnValue public @NonNull Builder setANullableList(@Nullable List setterArg) { this.aNullableList = setterArg; return this; @@ -655,6 +686,7 @@ public static final class Builder { private @Nullable Map aNullableMap; + @CanIgnoreReturnValue public @NonNull Builder setANullableMap(@Nullable Map setterArg) { this.aNullableMap = setterArg; return this; @@ -662,6 +694,7 @@ public static final class Builder { private @Nullable List> nullableNestedList; + @CanIgnoreReturnValue public @NonNull Builder setNullableNestedList(@Nullable List> setterArg) { this.nullableNestedList = setterArg; return this; @@ -669,6 +702,7 @@ public static final class Builder { private @Nullable Map nullableMapWithAnnotations; + @CanIgnoreReturnValue public @NonNull Builder setNullableMapWithAnnotations( @Nullable Map setterArg) { this.nullableMapWithAnnotations = setterArg; @@ -677,6 +711,7 @@ public static final class Builder { private @Nullable Map nullableMapWithObject; + @CanIgnoreReturnValue public @NonNull Builder setNullableMapWithObject(@Nullable Map setterArg) { this.nullableMapWithObject = setterArg; return this; @@ -684,6 +719,7 @@ public static final class Builder { private @Nullable AnEnum aNullableEnum; + @CanIgnoreReturnValue public @NonNull Builder setANullableEnum(@Nullable AnEnum setterArg) { this.aNullableEnum = setterArg; return this; @@ -691,6 +727,7 @@ public static final class Builder { private @Nullable String aNullableString; + @CanIgnoreReturnValue public @NonNull Builder setANullableString(@Nullable String setterArg) { this.aNullableString = setterArg; return this; @@ -698,6 +735,7 @@ public static final class Builder { private @Nullable Object aNullableObject; + @CanIgnoreReturnValue public @NonNull Builder setANullableObject(@Nullable Object setterArg) { this.aNullableObject = setterArg; return this; @@ -834,6 +872,7 @@ public static final class Builder { private @Nullable AllNullableTypes allNullableTypes; + @CanIgnoreReturnValue public @NonNull Builder setAllNullableTypes(@NonNull AllNullableTypes setterArg) { this.allNullableTypes = setterArg; return this; @@ -841,6 +880,7 @@ public static final class Builder { private @Nullable AllTypes allTypes; + @CanIgnoreReturnValue public @NonNull Builder setAllTypes(@Nullable AllTypes setterArg) { this.allTypes = setterArg; return this; @@ -896,6 +936,7 @@ public static final class Builder { private @Nullable List testList; + @CanIgnoreReturnValue public @NonNull Builder setTestList(@Nullable List setterArg) { this.testList = setterArg; return this; diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index f36d47a4a79..5571abfd3bd 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -2,7 +2,7 @@ name: pigeon description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. repository: https://github.com/flutter/packages/tree/main/packages/pigeon issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+pigeon%22 -version: 15.0.0 # This must match the version in lib/generator_tools.dart +version: 15.0.1 # This must match the version in lib/generator_tools.dart environment: sdk: ">=3.0.0 <4.0.0" diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart index 99936ca2b92..1cae5f664a5 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -53,6 +53,7 @@ void main() { expect(code, contains('public static final class Foobar')); expect(code, contains('public static final class Builder')); expect(code, contains('private @Nullable Long field1;')); + expect(code, contains('@CanIgnoreReturnValue')); }); test('gen one enum', () {