Skip to content

Remove legacy NET preprocessor paths#1451

Open
simonrozsival wants to merge 5 commits into
mainfrom
dev/simonrozsival/remove-net-define
Open

Remove legacy NET preprocessor paths#1451
simonrozsival wants to merge 5 commits into
mainfrom
dev/simonrozsival/remove-net-define

Conversation

@simonrozsival

Copy link
Copy Markdown
Member

Draft experiment.

This removes legacy NET/non-NET preprocessor branches and stale legacy TFM references from Java.Interop now that the active repo targets are modern .NET or netstandard2.0 support libraries.

Changes:

  • Make modern .NET paths unconditional in Java.Interop and Java.Runtime.Environment.
  • Remove #if NET, #if !NET, NETCOREAPP, NET5_0_OR_GREATER, NET9_0_OR_GREATER, and NETSTANDARD2_0 guarded code outside external/.
  • Stop generated XAJavaInterop1 output from emitting dummy non-NET compatibility attributes.
  • Remove the empty generator support stub that only existed for !NET.
  • Remove stale net472/monoandroid/old .NET TFM references outside external/, including the invocation-overhead net472 run path.

Validation:

  • Remaining NET/version guard refs outside external/: 0
  • Remaining legacy TFM refs outside external/: 0
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop-Tests/Java.Interop-Tests.csproj
    • Passed: 671, Failed: 0, Skipped: 4
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/generator-Tests/generator-Tests.csproj
    • Passed: 455, Failed: 0
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet test tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csproj
    • Passed: 47, Failed: 0
  • SDKROOT=$(xcrun --sdk macosx --show-sdk-path) dotnet build tests/invocation-overhead/invocation-overhead.csproj
    • Build succeeded

Notes:

  • Full dotnet build Java.Interop.sln was attempted but still hits existing/baseline failures unrelated to this cleanup: the Kotlin Gradle fixture in Xamarin.Android.Tools.Bytecode-Tests, and the current Java.Base generated binding error that also reproduces on the untouched main worktree.

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>
@simonrozsival simonrozsival marked this pull request as ready for review June 9, 2026 10:03
Copilot AI review requested due to automatic review settings June 9, 2026 10:03
@simonrozsival simonrozsival added the ready-to-review This PR is ready to review/merge, thanks! label Jun 9, 2026
@simonrozsival

Copy link
Copy Markdown
Member Author

/review

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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., net472 run 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

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ 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 only net10.0, not netstandard2.0.
  • Generator codegen (ClassGen.cs, NamespaceMapping.cs): Dummy SupportedOSPlatformAttribute for !NET removed; #if NET5_0_OR_GREATER around [UnconditionalSuppressMessage] removed — both consistent with modern .NET only.
  • Expected test output files: All updated consistently with the generator changes.
  • JvmLibraryHandler.Create(): Default handler correctly remains NativeLibraryJvmLibraryHandler (the NET path).
  • invocation-overhead: net472 target removed; run target renamed from _Run_netcoreapp to _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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🤖 💡 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

@simonrozsival

Copy link
Copy Markdown
Member Author

@copilot address the code review comments

Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>

Copilot AI commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@copilot address the code review comments

Addressed in 94bafb1. I changed JavaNativeTypeManager to resolve Java.Interop.IJavaPeerable with throwOnError: false and added a fallback interface-name check when that type cannot be loaded, so netstandard consumers no longer fail at runtime.

Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
@simonrozsival

Copy link
Copy Markdown
Member Author

/review

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown

Java.Interop PR Reviewer completed successfully!

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ 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 / #else arms). 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.
  • JreRuntime switch statement merge correctly preserves the modern .NET behavior (default → NativeLibraryJvmLibraryHandler).
  • ManagedPeer.RegisterNativeMembers correctly keeps the ReadOnlySpan<char> path and removes the string-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 outside external/ — confirmed.
  • The removed JavaTypeParametersAttribute.cs test 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

Comment thread src/Java.Interop/Java.Interop/JavaTypeParametersAttribute.cs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-review This PR is ready to review/merge, thanks!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants