Skip to content

[Mono.Android] Fix generated code build warnings - #12835

Open
simonrozsival wants to merge 2 commits into
simonrozsival-fix-mono-android-warningsfrom
simonrozsival-mono-android-codegen-warnings
Open

simonrozsival wants to merge 2 commits into
simonrozsival-fix-mono-android-warningsfrom
simonrozsival-mono-android-codegen-warnings

Conversation

@simonrozsival

@simonrozsival simonrozsival commented Sep 20, 2026

Copy link
Copy Markdown
Member

Stacked on #12809 (simonrozsival-fix-mono-android-warnings), which fixed every handwritten C# warning in src/Mono.Android/Mono.Android.csproj. This PR goes after the generated code.

Approach

Warnings in generated bindings are fixed in the generator, not suppressed. Where a warning is a genuine consequence of faithfully projecting a Java API into C#, the generator determines which member provokes which diagnostic and emits a #pragma warning disable scoped to that one member, with a comment saying why. An unexpected occurrence of the same diagnostic anywhere else still breaks the build.

Warnings attributable to Mono.Android.csproj at API 37 go from 684 to 88.

Generator bugs fixed

These were producing warnings, not merely hiding them:

  • BoundAbstractProperty never emitted [Obsolete]. An abstract declaration of a deprecated Java property silently lost its deprecation, while the invoker/implementor overrides generated for it kept theirs. That mismatch produced every CS0809.
  • BoundPropertyStringVariant had the same omission. The string convenience property generated alongside a deprecated ICharSequence property lost its deprecation, then reported CS0618 for calling it.
  • MethodAsyncWrapper/MethodExtensionAsyncWrapper did not carry the deprecation of the synchronous method they invoke.
  • GenBase.RequiresNew (Property, ...) applied the System.Object member check to interfaces, which do not inherit System.Object (CS0109).
  • GenBase.HidesInheritedMember ignored generic arity, so methods differing only in type-parameter count compared equal.
  • BoundMethodAbstractDeclaration computed IsShadow from Name rather than AdjustedName — a name the generator does not emit — and computed it before IsOverride was known.

Plus, from the earlier commit on this branch: ~1600 CS0108/CS0114 fixed by correcting new-modifier detection across GenBase and 14 source writers; CS0169 on unused weak-implementor fields; RS0041 fixed by making build-tools/jnienv-gen nullable-aware and regenerating JNIEnv.g.cs; and the javac -source/-target warning replaced with --release.

New infrastructure

  • Xamarin.SourceWriter gains ISuppressWarnings, implemented by the method, property, field and type writers, which brackets a member with #pragma warning disable/restore and an explanatory comment.
  • Method.OverriddenBaseMethod and GenBase.FindOverriddenMethod record the base member an override resolves to, so the generator can compare deprecation and nullability against it. Java allows covariant returns, so the match is on the parameter portion of the JNI signature.
  • SourceWriterExtensions.EmitsObsoleteAttribute factors out the [Obsolete]-versus-[ObsoletedOSPlatform] decision, so the suppression logic and the attribute logic cannot drift apart.

Suppressions actually emitted

Only where the generator has positively determined the diagnostic applies to that member:

Code Emitted when
CS0465 The bound member is Finalize (), which Java permits and C# reserves
CS0618 The member's signature, base type or body references a deprecated binding and the member is not itself deprecated
CS0672 A non-deprecated member overrides a deprecated one
CS0809 A deprecated member overrides a non-deprecated one
CS8764 / CS8766 The return type's nullness annotation differs from the overridden / implemented member
CS8765 / CS8767 A parameter's nullness annotation differs from the overridden / implemented member

Java's @Nullable/@NonNull are documentation rather than part of the type system, so these disagreements can only be resolved by the Java author.

Also in this PR

PublicAPI.Unshipped.txt for API-37.1 and API-37.2 was stale since the API-37.1 binding work, and two duplicate entries (VP9Profile2HDR, VP9Profile3HDR) in PublicAPI.Shipped.txt were triggering RS0025, which makes the analyzer bail out and masks every RS0016/RS0017 it would otherwise report. Deduplicating revealed 418 real errors at 37.1 and 2029 at 37.2; all are now recorded.

Validation

Configuration Result
API 37, Debug, _AndroidTreatWarningsAsErrors=true 0 errors, 88 unique warnings
API 37.1, Debug, _AndroidTreatWarningsAsErrors=true 0 errors, same 88
API 37.2, Debug, _AndroidTreatWarningsAsErrors=true 0 errors, same 88
API 37, Release 0 warnings attributable to Mono.Android.csproj
generator-Tests 497 passed, 0 failed

Not yet fixed

88 warnings remain and need further generator work, so the _AllowProjectWarnings entry for Mono.Android.csproj stays for now — the warnings remain visible in build output rather than silenced by <NoWarn>. The main <NoWarn> list is gone; only the Javadoc-only documentation filter remains.

  • CS0618 (35) — event/listener scaffolding referencing deprecated types.
  • CS0108/CS0114 (28) — two groups. Synthesized string/ICharSequence convenience overloads are invisible to the hiding scan (StringBuffer.Append(string?), ArrayAdapter.GetAutofillOptions(), MockPackageManager.*); and genuinely hand-bound base members the generator cannot see (CellInfo*.CellIdentity/CellSignalStrength, ICompletionStage.Handle). The latter group wants a managedOverride="new" metadata value so src/Mono.Android/metadata can declare them precisely.
  • CS8603/CS8604/CS8625 (11) — body-level nullability in generated marshalling.
  • CS8764/CS8766/CS8767/CS8768 (14) — override/implement pairs the base-member resolution still misses.

The bottom of this stack fixed every handwritten warning in
`Mono.Android.csproj` and trimmed `$(NoWarn)` down to the set that only
generated code still needed. This change fixes those at the source, in the
binding generator and `jnienv-gen`, and removes `$(NoWarn)` entirely along
with the `Mono.Android.csproj` entry in `$(_AllowProjectWarnings)`.

Roughly 1600 of the ~1690 warnings were the generator not emitting `new`
on a member that hides an inherited one (CS0108/CS0114), so `GenBase` now
models C# hiding rules:

  * A class hides members of its base classes, an interface hides members
    of its base interfaces. Base interfaces that are const sugar or
    non-public are excluded, matching `BoundInterface.AddImplements()`.
  * Methods hide only on a matching signature (an unnecessary `new` is
    CS0109), while fields, properties and nested types hide by name alone.
  * `new` is invalid on an `override` (CS0113) or an explicit interface
    implementation (CS0106), so `IsShadow` is computed after the managed
    override fixups.
  * Only a class inherits `Java.Lang.Object`, so `ToString()`/`Equals()`/
    `Clone()` on an interface must not be marked `new`.
  * The generated callback infrastructure (`_members`, `cb_`, `n_`,
    `__n_`, `Get*Handler`) hides the enclosing type's members when a type
    is nested inside one of its own base types.

`Xamarin.SourceWriter.FieldWriter` also had to move `new` ahead of
`static`/`readonly`/`const`, since `public const new int` does not parse.

The remaining diagnostics are inherent to projecting the Java API surface
- deprecated Java types used by non-deprecated members, `finalize()`,
disagreeing nullness annotations, and base members that are hand-bound
rather than generated - so generated files now carry a documented, narrow
`#pragma warning disable` block instead. CS0109 is deliberately left
enabled so an over-applied `new` still fails the build.

Also in this change:

  * `jnienv-gen` emits `#nullable enable` and a nullable `NewArray`
    parameter, which fixes RS0041 in `JNIEnv.g.cs`. The resulting
    nullability annotations are reflected in `PublicAPI.Shipped.txt`.
  * The listener event helpers no longer emit unused weak implementor
    fields (CS0169).
  * `JavaCallableWrappers.targets` uses `--release` instead of
    `-source`/`-target`, and lists itself in `Inputs` so the target is
    invalidated when it changes.
  * `PublicAPI.Unshipped.txt` for API-37.1 and API-37.2 was stale. The
    duplicate entries in their `PublicAPI.Shipped.txt` were masking every
    RS0016/RS0017 the analyzer would otherwise have reported.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI lite review requested due to automatic review settings September 20, 2026 00:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Critical issues remain in Java release-version handling, interface property shadowing, and override modifier computation.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 3 High severity · 1 Medium severity

Open (4)
What changed in this PR

Fixes generated Mono.Android build warnings by correcting member-hiding code generation, narrowing suppressions, updating JNI nullability, and improving Java callable-wrapper compilation.

Changes:

  • Corrects generated new modifiers and modifier ordering.
  • Adds targeted generated-code warning suppressions.
  • Updates JNI nullability and javac --release handling.
  • Refreshes generator fixtures and API baselines.
  • Removes obsolete project-level warning allowances.
File Summary
src/​Mono.Android/​Mono.Android.csproj Removes obsolete warning suppressions.
external/​Java.Interop/​tools/​generator/​SourceWriters/​PeerMembersField.cs Updates generated member handling.
external/​Java.Interop/​tools/​generator/​SourceWriters/​InterfaceMemberAlternativeClass.cs Updates interface member generation.
external/​Java.Interop/​tools/​generator/​SourceWriters/​InterfaceInvokerMethod.cs Updates generated invoker methods.
external/​Java.Interop/​tools/​generator/​SourceWriters/​InterfaceConstsClass.cs Updates interface constant generation.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundProperty.cs Updates property hiding logic.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundMethodAbstractDeclaration.cs Updates abstract method modifiers.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundMethod.cs Updates method hiding logic.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundInterfacePropertyDeclaration.cs Updates interface property modifiers.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundInterfaceMethodDeclaration.cs Updates interface method modifiers.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundInterface.cs Updates interface generation.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundFieldAsProperty.cs Updates field-backed property generation.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundField.cs Updates field generation.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundClass.cs Updates class generation.
external/​Java.Interop/​tools/​generator/​SourceWriters/​BoundAbstractProperty.cs Updates abstract property modifiers.
external/​Java.Interop/​tools/​generator/​Java.Interop.Tools.Generator.ObjectModel/​InterfaceGen.cs Updates interface warning output.
external/​Java.Interop/​tools/​generator/​Java.Interop.Tools.Generator.ObjectModel/​ClassGen.cs Updates class warning output.
external/​Java.Interop/​tests/​generator-Tests/​Unit-Tests/​CodeGeneratorExpectedResults/​XAJavaInterop1/​WriteInterfaceRedeclaredDefaultMethod.txt Refreshes expected output.
external/​Java.Interop/​tests/​generator-Tests/​Unit-Tests/​CodeGeneratorExpectedResults/​JavaInterop1/​WriteInterfaceRedeclaredDefaultMethod.txt Refreshes expected output.
external/​Java.Interop/​tests/​generator-Tests/​Unit-Tests/​CodeGeneratorExpectedResults/​Common/​WriteInterfaceRedeclaredDefaultMethod.txt Refreshes expected output.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.TestInterfaceImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.ITestInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.IGenericPropertyInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.IGenericInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.GenericStringPropertyImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.GenericStringImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.GenericObjectPropertyImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Test.ME.GenericImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Java.Util.ICollection.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Java.Lang.String.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​IInterfaceWithoutNamespace.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​TestInterface/​ClassWithoutNamespace.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Streams/​Java.Lang.Throwable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Streams/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Streams/​Java.IO.OutputStream.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Streams/​Java.IO.IOException.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Streams/​Java.IO.InputStream.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Streams/​Java.IO.FilterOutputStream.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​StaticProperties/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​StaticProperties/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​StaticMethods/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​StaticMethods/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​StaticFields/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​StaticFields/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​ParameterXPath/​Xamarin.Test.A.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​ParameterXPath/​Java.Util.IList.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​ParameterXPath/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​ParameterXPath/​Java.Lang.Integer.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalProperties/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalProperties/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Xamarin.Test.C.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Xamarin.Test.A.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Java.Lang.Throwable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Java.Lang.Integer.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NormalMethods/​Java.Lang.Class.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NonStaticFields/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NonStaticFields/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NestedTypes/​Xamarin.Test.NotificationCompatBase.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​NestedTypes/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.util.List/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.util.List/​Java.Util.IList.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.util.List/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.lang.Object/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.lang.Enum/​Java.Lang.State.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.lang.Enum/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.lang.Enum/​Java.Lang.IComparable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​java.lang.Enum/​Java.Lang.Enum.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​InterfaceMethodsConflict/​Xamarin.Test.SomeObject2.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​InterfaceMethodsConflict/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​InterfaceMethodsConflict/​Xamarin.Test.II2.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​InterfaceMethodsConflict/​Xamarin.Test.II1.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​InterfaceMethodsConflict/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​GenericArguments/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​CSharpKeywords/​Xamarin.Test.CSharpKeywords.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​CSharpKeywords/​Java.Lang.Throwable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​CSharpKeywords/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_Jar2Xml/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_Jar2Xml/​Android.Views.View.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_Jar2Xml/​Android.Text.SpannableStringInternal.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_Jar2Xml/​Android.Text.SpannableString.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_Jar2Xml/​Android.Text.ISpanned.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_Jar2Xml/​Android.Text.ISpannable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_ClassParse/​Xamarin.Test.Invalidnames.InvalidNameMembers.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_ClassParse/​Xamarin.Test.Invalidnames.In.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_ClassParse/​Xamarin.Google.Composable.MyClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_ClassParse/​Java.Lang.String.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Core_ClassParse/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Constructors/​Xamarin.Test.SomeObject2.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Constructors/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Constructors/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Arrays/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Arrays/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Android.Graphics.Color/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Android.Graphics.Color/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Adapters/​Xamarin.Test.ISpinnerAdapter.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Adapters/​Xamarin.Test.IAdapter.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Adapters/​Xamarin.Test.GenericReturnObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Adapters/​Xamarin.Test.AdapterView.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Adapters/​Xamarin.Test.AbsSpinner.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​Adapters/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Xamarin.Test.TestClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Xamarin.Test.PublicFinalClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Xamarin.Test.PublicClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Xamarin.Test.IExtendedInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Xamarin.Test.ExtendPublicClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Xamarin.Test.BasePublicClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.xaji/​AccessModifiers/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.TestInterfaceImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.ITestInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.IGenericPropertyInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.IGenericInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.GenericStringPropertyImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.GenericStringImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.GenericObjectPropertyImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Test.ME.GenericImplementation.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Java.Util.ICollection.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Java.Lang.String.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​IInterfaceWithoutNamespace.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​TestInterface/​ClassWithoutNamespace.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Streams/​Java.Lang.Throwable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Streams/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Streams/​Java.IO.OutputStream.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Streams/​Java.IO.IOException.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Streams/​Java.IO.InputStream.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Streams/​Java.IO.FilterOutputStream.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​StaticProperties/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​StaticProperties/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​StaticMethods/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​StaticMethods/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​StaticFields/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​StaticFields/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​ParameterXPath/​Xamarin.Test.A.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​ParameterXPath/​Java.Util.IList.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​ParameterXPath/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​ParameterXPath/​Java.Lang.Integer.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalProperties/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalProperties/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Xamarin.Test.C.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Xamarin.Test.A.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Java.Lang.Throwable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Java.Lang.Integer.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NormalMethods/​Java.Lang.Class.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NonStaticFields/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NonStaticFields/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NestedTypes/​Xamarin.Test.NotificationCompatBase.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​NestedTypes/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.util.List/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.util.List/​Java.Util.IList.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.util.List/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.lang.Object/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.lang.Enum/​Java.Lang.State.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.lang.Enum/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.lang.Enum/​Java.Lang.IComparable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​java.lang.Enum/​Java.Lang.Enum.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​InterfaceMethodsConflict/​Xamarin.Test.SomeObject2.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​InterfaceMethodsConflict/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​InterfaceMethodsConflict/​Xamarin.Test.II2.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​InterfaceMethodsConflict/​Xamarin.Test.II1.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​InterfaceMethodsConflict/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​GenericArguments/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​CSharpKeywords/​Xamarin.Test.CSharpKeywords.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​CSharpKeywords/​Java.Lang.Throwable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​CSharpKeywords/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_Jar2Xml/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_Jar2Xml/​Android.Views.View.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_Jar2Xml/​Android.Text.SpannableStringInternal.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_Jar2Xml/​Android.Text.SpannableString.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_Jar2Xml/​Android.Text.ISpanned.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_Jar2Xml/​Android.Text.ISpannable.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_ClassParse/​Xamarin.Test.Invalidnames.InvalidNameMembers.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_ClassParse/​Xamarin.Test.Invalidnames.In.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_ClassParse/​Xamarin.Google.Composable.MyClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_ClassParse/​Java.Lang.String.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Core_ClassParse/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Constructors/​Xamarin.Test.SomeObject2.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Constructors/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Constructors/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Arrays/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Arrays/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Android.Graphics.Color/​Xamarin.Test.SomeObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Android.Graphics.Color/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​Xamarin.Test.ISpinnerAdapter.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​Xamarin.Test.IAdapter.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​Xamarin.Test.GenericReturnObject.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​Xamarin.Test.AdapterView.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​Xamarin.Test.AbsSpinner.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​SupportFiles/​AdapterView.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​Adapters/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Xamarin.Test.TestClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Xamarin.Test.PublicFinalClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Xamarin.Test.PublicClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Xamarin.Test.IExtendedInterface.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Xamarin.Test.ExtendPublicClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Xamarin.Test.BasePublicClass.cs Refreshes generated fixture.
external/​Java.Interop/​tests/​generator-Tests/​expected.ji/​AccessModifiers/​Java.Lang.Object.cs Refreshes generated fixture.
external/​Java.Interop/​src/​Xamarin.SourceWriter/​Models/​FieldWriter.cs Corrects modifier ordering.
Directory.Build.props Removes the Mono.Android warning allowance.
build-tools/​scripts/​JavaCallableWrappers.targets Updates release handling and incremental inputs.
build-tools/​jnienv-gen/​Generator.cs Emits nullable JNI signatures.

Comment thread build-tools/scripts/JavaCallableWrappers.targets
The previous commit disabled 14 diagnostics at the top of every generated
file. That is the same blanket suppression `<NoWarn>` provided, just moved
somewhere less visible, and it leaked into every third-party binding built
with this generator. This removes it.

In its place the generator now works out which member provokes which
diagnostic and, where the warning is genuinely unavoidable, emits a
`#pragma warning disable` scoped to that one member for that one code. An
unexpected occurrence of the same diagnostic anywhere else still breaks the
build.

Generator bugs fixed (these were causing warnings, not just hiding them):

* `BoundAbstractProperty` never emitted `[Obsolete]`, so an abstract
  declaration of a deprecated Java property silently lost its deprecation
  while the invoker/implementor overrides generated for it kept theirs.
  That mismatch is what produced every CS0809.
* `BoundPropertyStringVariant` had the same omission, so the `string`
  convenience property generated alongside a deprecated `ICharSequence`
  property lost its deprecation and then reported CS0618 for calling it.
* `MethodAsyncWrapper`/`MethodExtensionAsyncWrapper` did not carry the
  deprecation of the synchronous method they invoke.
* `GenBase.RequiresNew (Property, ...)` applied the `System.Object` member
  check to interfaces, which do not inherit `System.Object` (CS0109).
* `GenBase.HidesInheritedMember` ignored generic arity, so methods that
  differ only in type-parameter count compared equal.
* `BoundMethodAbstractDeclaration` computed `IsShadow` from `Name` rather
  than `AdjustedName`, so the hiding check used a name the generator does
  not emit, and computed it before `IsOverride` was known.

New infrastructure:

* `Xamarin.SourceWriter` gains `ISuppressWarnings`, implemented by the
  method, property, field and type writers, which brackets a member with
  `#pragma warning disable`/`restore` plus a comment explaining why.
* `Method.OverriddenBaseMethod` and `GenBase.FindOverriddenMethod` record
  the base member an override resolves to, so the generator can compare
  deprecation and nullability against it.
* `SourceWriterExtensions.EmitsObsoleteAttribute` factors out the
  `[Obsolete]`-versus-`[ObsoletedOSPlatform]` decision so the suppression
  logic and the attribute logic cannot drift apart.

Remaining suppressions are emitted only where the generator has positively
determined the diagnostic applies:

* CS0465 on a bound `Finalize ()`, which Java permits and C# reserves.
* CS0618/CS0672/CS0809 where a member's signature, base type or overridden
  member is deprecated and the member itself is not, or vice versa.
* CS8764-CS8767 where the nullness annotation on a return type or parameter
  differs from the member being overridden or implemented. Java's nullness
  annotations are advisory, so only the Java author can reconcile these.

Warnings from `Mono.Android.csproj` at API 37 drop from 684 to 88. The
remainder are CS0108/CS0114 hiding cases and body-level nullability, which
need further generator work, so the `_AllowProjectWarnings` entry stays
until they are resolved, keeping the warnings visible rather than silenced.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants