Remove legacy NET preprocessor paths#1451
Conversation
Make modern .NET code paths unconditional and remove obsolete non-NET/generated compatibility branches now that Java.Interop targets current .NET or netstandard2.0 only. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/review |
|
✅ Java.Interop PR Reviewer completed successfully! |
There was a problem hiding this comment.
Pull request overview
This PR removes legacy NET/non-NET conditional compilation paths and stale TFM-specific branches across Java.Interop, Java.Runtime.Environment, generator tooling, and associated tests/fixtures, making the modern .NET code paths unconditional.
Changes:
- Remove
#if NET/#if !NET/ version-guarded code paths and associated compatibility stubs (including generator-emitted dummy attributes). - Update generator and expected outputs to no longer emit legacy guards and to always include modern attributes/suppressions.
- Simplify test and benchmark infrastructure by dropping old framework-specific branches (e.g.,
net472run path).
Show a summary per file
| File | Description |
|---|---|
| tools/param-name-importer/param-name-importer.csproj | Adjust comment to reflect current package-asset rationale. |
| tools/generator/Java.Interop.Tools.Generator.ObjectModel/NamespaceMapping.cs | Stop emitting legacy dummy SupportedOSPlatformAttribute for !NET. |
| tools/generator/Java.Interop.Tools.Generator.ObjectModel/ClassGen.cs | Make trimming suppression attribute emission unconditional in generated registrations. |
| tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers/JavaNativeTypeManagerTests.cs | Remove legacy NET/non-NET expected values. |
| tests/Java.Interop-Tests/Java.Interop/JniRuntimeJniValueManagerContract.cs | Remove legacy Mono/non-core runtime contract fixture. |
| tests/Java.Interop-Tests/Java.Interop/JniPeerMembersTests.cs | Remove NET guards around tests and helper types. |
| tests/Java.Interop-Tests/Java.Interop/JavaVMFixture.cs | Make fallback/replacement type logic unconditional (remove NET guards). |
| tests/invocation-overhead/invocation-overhead.targets | Drop net472 run target and unify run path. |
| tests/invocation-overhead/invocation-overhead.cs | Remove NET-only compilation blocks and keep modern code path. |
| tests/generator-Tests/SupportFiles/JavaTypeParametersAttribute.cs | Remove legacy !NET stub support file. |
| tests/generator-Tests/Integration-Tests/Compiler.cs | Always define NET and always reference System.Runtime.dll facade for compilation. |
| tests/generator-Tests/Integration-Tests/BaseGeneratorTest.cs | Remove NET-guarded execution of JavaInterop1 target runs. |
| tests/generator-Tests/expected.xaji/TestInterface/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/TestInterface/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Streams/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Streams/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/StaticProperties/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/StaticProperties/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/StaticMethods/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/StaticMethods/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/StaticFields/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/StaticFields/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/ParameterXPath/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/ParameterXPath/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/NormalProperties/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/NormalProperties/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/NormalMethods/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/NormalMethods/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/NonStaticFields/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/NonStaticFields/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/NestedTypes/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/NestedTypes/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/java.util.List/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/java.util.List/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/java.lang.Object/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/java.lang.Enum/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/java.lang.Enum/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/InterfaceMethodsConflict/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/InterfaceMethodsConflict/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/GenericArguments/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/GenericArguments/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/CSharpKeywords/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/CSharpKeywords/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Core_Jar2Xml/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Core_Jar2Xml/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Core_ClassParse/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Core_ClassParse/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Constructors/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Constructors/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Arrays/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Arrays/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Android.Graphics.Color/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Android.Graphics.Color/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/Adapters/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/Adapters/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| tests/generator-Tests/expected.xaji/AccessModifiers/Java.Interop.__TypeRegistrations.cs | Update expected generated output (remove NET5_0_OR_GREATER guard). |
| tests/generator-Tests/expected.xaji/AccessModifiers/NamespaceMapping.cs | Update expected generated output (remove legacy dummy attribute block). |
| src/Java.Runtime.Environment/Java.Interop/JreTypeManager.cs | Remove NET-only compile guard to make JRE type manager unconditional. |
| src/Java.Runtime.Environment/Java.Interop/JreRuntime.cs | Remove NET/non-NET branching in type manager selection and loader implementation. |
| src/Java.Interop/Java.Interop/ManagedPeer.cs | Remove legacy string marshaling path and always use span-based registration. |
| src/Java.Interop/Java.Interop/JniTypeSignature.cs | Remove legacy hash code implementation branch and use modern overload. |
| src/Java.Interop/Java.Interop/JniType.cs | Make helper TryParse/TryGet*Method APIs unconditional (remove NET guards). |
| src/Java.Interop/Java.Interop/JniRuntime.JniTypeManager.cs | Make replacement/fallback APIs unconditional and remove NET-only obsolete guards. |
| src/Java.Interop/Java.Interop/JniRuntime.cs | Remove NET9+ conditional around Debugger.BreakForUserUnhandledException. |
| src/Java.Interop/Java.Interop/JniPeerMembers.JniStaticMethods.cs | Make replacement/fallback lookup paths unconditional (remove NET guards). |
| src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods.cs | Make replacement lookup unconditional and update stack-trace comment path. |
| src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs | Remove !NET short-circuiting and always enable static redirect invoke logic. |
| src/Java.Interop/Java.Interop/JniPeerMembers.cs | Make replacement type lookup unconditional (remove NET guards). |
| src/Java.Interop/Java.Interop/JniMethodSignatureAttribute.cs | Remove NET-only compilation guard for attribute type. |
| src/Java.Interop/Java.Interop/JniMethodInfo.cs | Make redirect metadata fields unconditional (remove NET guards). |
| src/Java.Interop/Java.Interop/JniMemberSignatureAttribute.cs | Remove NET-only compilation guard for attribute type. |
| src/Java.Interop/Java.Interop/JniMemberSignature.cs | Remove NET-only compilation guard for signature type. |
| src/Java.Interop/Java.Interop/JniEnvironment.Types.cs | Make TryFindClass unconditional and broaden DEBUG-only diagnostics. |
| src/Java.Interop/Java.Interop/JniConstructorSignatureAttribute.cs | Remove NET-only compilation guard for attribute type. |
| src/Java.Interop/Java.Interop/JavaTypeParametersAttribute.cs | Remove NET-only compilation guard for attribute type. |
| src/Java.Interop/Java.Interop/JavaArray.cs | Update nullable-contract comment and remove trailing whitespace. |
| src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs | Remove NETSTANDARD2_0 conditional logic around IJavaPeerable checks. |
| Documentation/Motivation.md | Update motivation text to remove obsolete legacy framework references. |
Copilot's findings
- Files reviewed: 78/78 changed files
- Comments generated: 1
There was a problem hiding this comment.
✅ LGTM — Clean, well-scoped cleanup
This PR correctly removes all legacy #if NET, #if !NET, #if NETCOREAPP, #if NET5_0_OR_GREATER, #if NET9_0_OR_GREATER, and #if NETSTANDARD2_0 preprocessor branches from files outside external/. Since all projects target net10.0, these guards were always-true (or always-false) dead code.
What I verified
- Correctness: In every case, the kept code path matches what was already active under
net10.0. No behavioral changes. Debugger.BreakForUserUnhandledException(JniRuntime.cs): API introduced in .NET 9, safe to use unconditionally on net10.0.JavaNativeTypeManager.cs: NETSTANDARD2_0 fallback removed — correct since the project now targets onlynet10.0, notnetstandard2.0.- Generator codegen (ClassGen.cs, NamespaceMapping.cs): Dummy
SupportedOSPlatformAttributefor!NETremoved;#if NET5_0_OR_GREATERaround[UnconditionalSuppressMessage]removed — both consistent with modern .NET only. - Expected test output files: All updated consistently with the generator changes.
JvmLibraryHandler.Create(): Default handler correctly remainsNativeLibraryJvmLibraryHandler(the NET path).invocation-overhead: net472 target removed; run target renamed from_Run_netcoreappto_Run.- Zero remaining NET/version guards outside
external/confirmed via grep.
CI status
⏳ The dotnet.java-interop CI build is queued but has not run yet. The author reports manual test results (671 passed for Java.Interop-Tests, 455 for generator-Tests, 47 for JCW-Tests) which is encouraging, but CI should be green before merging.
Issues found
| Severity | Count | Category |
|---|---|---|
| 💡 | 1 | Formatting (double blank lines artifact) |
The only issue is minor double blank lines left behind in 8 files after removing #if/#endif directives — see inline comment for the full list.
Generated by Java.Interop PR Reviewer for issue #1451 · ● 14.5M
| @@ -1,4 +1,3 @@ | |||
| #if NET | |||
|
|
|||
There was a problem hiding this comment.
🤖 💡 Formatting — Removing #if NET / #endif guards left behind double consecutive blank lines (or a leading blank line) in several files. The repo convention says "Don't leave random empty lines." These are minor artifacts but easy to clean up in a follow-up pass.
Affected files:
src/Java.Interop/Java.Interop/JavaTypeParametersAttribute.cs(lines 2–3)src/Java.Interop/Java.Interop/JniConstructorSignatureAttribute.cs(lines 5–6)src/Java.Interop/Java.Interop/JniMemberSignatureAttribute.cs(lines 4–5)src/Java.Interop/Java.Interop/JniMethodSignatureAttribute.cs(lines 5–6)src/Java.Runtime.Environment/Java.Interop/JreRuntime.cs(lines 216–217, 279–280, 337–338)src/Java.Runtime.Environment/Java.Interop/JreTypeManager.cs(leading blank at line 1, lines 7–8)
Rule: Minimal diffs
|
@copilot address the code review comments |
Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
|
/review |
|
✅ Java.Interop PR Reviewer completed successfully! |
There was a problem hiding this comment.
✅ LGTM — Clean, well-scoped cleanup
This PR does exactly what it says: mechanically removes #if NET, #if !NET, NETCOREAPP, NET5_0_OR_GREATER, NET9_0_OR_GREATER, and NETSTANDARD2_0 preprocessor guards from code that now targets only modern .NET (net10.0).
Verified:
- All removed code paths were the inactive branches (the
#if !NET/#elsearms). The surviving code is what was already compiling and running. Debugger.BreakForUserUnhandledException(previously#if NET9_0_OR_GREATER) — API available since .NET 9; safe to make unconditional on net10.0.string.GetHashCode(StringComparison)(previously#if NETCOREAPP) — available since .NET Core 2.1; correct to make unconditional.JreRuntimeswitch statement merge correctly preserves the modern .NET behavior (default →NativeLibraryJvmLibraryHandler).ManagedPeer.RegisterNativeMemberscorrectly keeps theReadOnlySpan<char>path and removes thestring-based fallback.- Generator output changes (
ClassGen.cs,NamespaceMapping.cs) are consistent with all 40+ expected test output file updates. - Zero remaining
NET/NETCOREAPP/NETSTANDARD/version-guard references outsideexternal/— confirmed. - The removed
JavaTypeParametersAttribute.cstest support file was a!NET-only stub duplicating the real type; correctly removed.
1 suggestion: A few files have double blank lines left from the mechanical removal (listed in the inline comment). Very minor — can be addressed in a follow-up.
CI note: Only license/cla check is reported (passing). No build/test CI results visible yet — those should be verified before merging.
Generated by Java.Interop PR Reviewer for issue #1451 · ● 12.9M
Draft experiment.
This removes legacy
NET/non-NETpreprocessor branches and stale legacy TFM references from Java.Interop now that the active repo targets are modern .NET ornetstandard2.0support libraries.Changes:
#if NET,#if !NET,NETCOREAPP,NET5_0_OR_GREATER,NET9_0_OR_GREATER, andNETSTANDARD2_0guarded code outsideexternal/.NETcompatibility attributes.!NET.net472/monoandroid/old .NET TFM references outsideexternal/, including theinvocation-overheadnet472 run path.Validation:
external/: 0external/: 0SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csprojSDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/generator-Tests/generator-Tests.csprojSDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csprojSDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet build tests/invocation-overhead/invocation-overhead.csprojNotes:
dotnet build Java.Interop.slnwas attempted but still hits existing/baseline failures unrelated to this cleanup: the Kotlin Gradle fixture inXamarin.Android.Tools.Bytecode-Tests, and the currentJava.Basegenerated binding error that also reproduces on the untouched main worktree.