Uh oh!
There was an error while loading. Please reload this page.
[typemap] Diagnose unsupported constructor shapes - #12567
Conversation
There was a problem hiding this comment.
Copilot review overview
Review tier: Lite
Findings: 1
New issues introduced by this change (2)
| Severity | Finding |
|---|---|
tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Scanner/ConstructorDetectionTests.cs — 💡 suggestion — ScanPeer opens and reads both fixture assemblies from disk on every test invocation.… | |
src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs — ❌ error — Base-constructor compatibility for non-explicit constructors is currently checked via… |
What changed in this PR
Adds first-class constructor-shape validation to the trimmable typemap pipeline, surfacing new localized XA4259–XA4262 diagnostics and ensuring generation stops before emitting partial Java/type-map output when constructors are not representable or are ambiguous.
Changes:
- Introduces constructor diagnostics (collision, unsupported parameter shapes, missing compatible base ctor, invalid
SuperArgumentsString) and wires them into the generator/Build.Tasks logger with localized resources. - Expands test coverage with new “invalid constructor” fixture assembly and adds focused unit/integration/build tests to validate diagnostics and “no partial output” behavior.
- Documents new error codes (XA4259–XA4262) and adds them to the docs index/TOC.
| File | Description |
|---|---|
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/TestFixtures/StubAttributes.cs | Extends stub ExportAttribute to support ctor usage and SuperArgumentsString for scanner tests. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Scanner/ConstructorDetectionTests.cs | Adds targeted tests for new constructor diagnostics and representable/explicit cases. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests.csproj | Adds a new fixture project and copies its output alongside existing fixtures. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/InvalidConstructorFixtures/InvalidConstructors.cs | New fixture types that intentionally trigger (or avoid) constructor diagnostics. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/InvalidConstructorFixtures/InvalidConstructorFixtures.csproj | New fixture assembly project (unsafe enabled) used as scanner/generator input. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/TrimmableTypeMapGeneratorTests.cs | Verifies generator logs coded errors and returns no partial outputs when ctor diagnostics exist. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/UserTypesFixture/UserTypesFixture.csproj | Enables unsafe to support new user fixture types using pointers/function pointers. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/UserTypesFixture/UserTypes.cs | Adds user fixture types mirroring ctor-collision/unrepresentable/super-args scenarios. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/ScannerRunner.cs | Adds legacy constructor extraction to support ctor parity tests. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/ScannerComparisonTests.cs | Excludes ctor-diagnostic fixtures from legacy↔new marshal-method parity comparisons. |
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.IntegrationTests/ConstructorParityTests.cs | New integration tests that pin legacy behavior around ctor collisions/unrepresentable ctors/super args. |
| src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/TrimmableTypeMapBuildTests.cs | Adds a build-level regression ensuring XA4259 fails before any partial typemap Java is written. |
| src/Xamarin.Android.Build.Tasks/Tasks/GenerateTrimmableTypeMap.cs | Implements new logger hooks for XA4259–XA4262 in the MSBuild task. |
| src/Xamarin.Android.Build.Tasks/Properties/Resources.resx | Adds localized strings for XA4259–XA4262. |
| src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs | Updates generated resource accessors for XA4259–XA4262. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/TrimmableTypeMapGenerator.cs | Validates constructor diagnostics early and returns no generated outputs on failure. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs | Computes ctor diagnostics during scanning, including signature collapse, parameter-shape validation, base-ctor compatibility, and SuperArgumentsString validation. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerInfo.cs | Adds ConstructorDiagnostics model plus diagnostic kind/info types. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/ITrimmableTypeMapLogger.cs | Extends logger interface with ctor diagnostic logging hooks. |
| Documentation/docs-mobile/TOC.yml | Adds entries for XA4259–XA4262 docs. |
| Documentation/docs-mobile/messages/xa4259.md | New documentation page for XA4259. |
| Documentation/docs-mobile/messages/xa4260.md | New documentation page for XA4260. |
| Documentation/docs-mobile/messages/xa4261.md | New documentation page for XA4261. |
| Documentation/docs-mobile/messages/xa4262.md | New documentation page for XA4262. |
| Documentation/docs-mobile/messages/index.md | Adds XA4259–XA4262 to the message index listing. |
Files not reviewed (1)
- src/Xamarin.Android.Build.Tasks/Properties/Resources.Designer.cs: Generated file
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
e03c49d to
c385503Compare765d233 to
8936f2aCompare9d75936 to
7854663Compare7854663 to
8b98f5fCompare3ea14be to
663a4abCompare## Summary - reject unsupported `[Export]`/`[ExportField]` signatures during trimmable scanning with localized XA4263 before typemap, Java, or ACW-map output - preserve supported Java peers/interfaces, primitives, strings, ordinary arrays, enums, collections, and valid scalar `[ExportParameter]` mappings - match Export attributes by full `Java.Interop` identity and resolve peer/enum/special framework types by assembly identity through forwarders - validate exported constructors while preserving constructor identity and scalar adapter dispatch ## Final type-identity behavior Special mappings require canonical framework identity, not just a managed full name: - `System.IO.Stream`: `System.Runtime` facade or resolved `System.Private.CoreLib` - `System.Xml.XmlReader`: `System.Xml.ReaderWriter` facade or resolved `System.Private.Xml` - multi-hop facades such as `netstandard → System.Xml.ReaderWriter → System.Private.Xml` are accepted through the existing cycle-safe forwarder resolver - user assemblies defining the same full names are rejected with XA4263 for method parameter/return, ExportField return, and constructor parameter paths Tests use minimal metadata assemblies for direct `System.Private.Xml`, the two-hop facade chain, and a resolved `User.Xml` assembly containing `System.Xml.XmlReader`. A separately compiled Android fixture and end-to-end builds retain the user-collision/no-output controls. ## Constructor diagnostics ownership PR #12567 owns XA4260 for generic, byref, pointer, function-pointer, rectangular-array constructor parameters, including nested SZ-array forms. XA4263 owns unresolved managed types and invalid `[ExportParameter]` kind/type/identity pairs. This PR does not duplicate XA4259/XA4261 analysis. An isolated composition with the latest #12567 reproduces its remaining follow-up: two XA4263-rejected overloads on the same type with default/missing `SuperArgumentsString` also receive secondary XA4259 and XA4261. The coordinator will make that analyzer skip XA4263-rejected constructors after rebasing #12567 above this PR. ## Validation - 802 standalone trimmable tests - 27 integration tests, including semantic classfile comparison, javac, peer/enum collisions, and Stream/XmlReader collisions - 66 export-signature/runtime-identity and no-output build tests - valid llvm-ir CoreCLR, trimmable CoreCLR, and trimmable NativeAOT fixture builds - legacy `GenerateExportedMembers` - latest #12567 composition: stronger two-overload secondary-diagnostic reproduction and 838 full combined standalone tests - `git diff --check`; every added line at most 180 characters; full-name attribute audit clean Stacked on #12596. Tracks #12561.
Validate Java-visible constructor signatures, base forwarding, collisions, and SuperArgumentsString values while preserving legacy handling for managed-only constructors. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
573889f to
1ef61f1CompareMatch legacy JCW generation by reserving XA4261 for explicit registered or exported constructors while silently skipping implicit constructors without a compatible Java base constructor. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Allow Java constructor wrappers without a matching public managed constructor to use the existing activation-constructor path instead of failing model generation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
simonrozsival
commented
Sep 4, 2026
/review |
✅ Android PR Reviewer completed successfully!
|
There was a problem hiding this comment.
✅ LGTM — No correctness issues found. The constructor diagnostics preserve the intended legacy behavior for implicit constructors while producing focused errors for explicit unsupported shapes, signature collisions, missing base constructors, and invalid super arguments. The scanner, generator, model-builder, integration, and build coverage is strong, and all 44 checks in Azure DevOps/GitHub passed.
One non-blocking inline suggestion requests MSBuild-level coverage for XA4261.
Generated by Android PR Reviewer for #12567 · gpt56 · 430.3 AIC · ⌖ 8.85 AIC · ⊞ 25.7K
Comment /review to run again
| } | ||
| [Theory] | ||
| [InlineData ("MyApp.RegisteredMissingBaseCtorActivity")] |
There was a problem hiding this comment.
🤖 💡 Testing — Please add an end-to-end build case for XA4261, similar to the new XA4259/XA4260/XA4262 cases in TrimmableTypeMapBuildTests. These scanner and generator tests prove detection and mock logging, but they do not exercise GenerateTrimmableTypeMap's real resource mapping or verify that a missing-base-constructor error suppresses partial typemap/Java outputs at the MSBuild boundary.


Summary
SuperArgumentsStringparameter referencesSuperArgumentsString: tokenize literals/comments and defer any expression containing Java lambda (->) or method-reference (::) syntax entirely to javac; retain XA4262 for ordinary bare/call/arithmeticpNreferencesValidation
git diff --check; acceptance commit adds 33 lines (within 180)Part of #12561