Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jul 11, 2025

This PR systematically modernizes MSBuild task classes in src/Xamarin.Android.Build.Tasks/Tasks/ to follow the repository's nullable reference types guidelines as outlined in copilot-instructions.md.

Changes Made

Phase 1: Files with #nullable disable (10/22 completed - 45%)

Converted files from #nullable disable to #nullable enable and modernized properties:

Completed files:

  • AndroidApkSigner.cs, CalculateProjectDependencies.cs, JavaToolTask.cs (base class)
  • ConvertCustomView.cs, MergeRemapXml.cs, ImportJavaDoc.cs
  • JavaDoc.cs, JavaSourceUtils.cs, StripNativeLibraries.cs, LinkApplicationSharedLibraries.cs

Phase 2: Files without nullable directives (27/117 completed - 23%)

Added #nullable enable directive and converted patterns:

Completed files:

  • Aapt2Compile.cs, AndroidMessage.cs, AndroidAdb.cs, AndroidSignPackage.cs
  • Aapt2LinkAssetPack.cs, AdjustJavacVersionArguments.cs, AndroidCreateDebugKey.cs
  • AndroidError.cs, AndroidWarning.cs, AndroidComputeResPaths.cs, AndroidDotnetToolTask.cs
  • AndroidZipAlign.cs, AppendCustomMetadataToItemGroup.cs, AssemblyModifierPipeline.cs
  • CheckClientHandlerType.cs, CheckDuplicateJavaLibraries.cs, CheckForInvalidDesignerConfig.cs
  • CheckProjectItems.cs, ClassParse.cs, CollectAssemblyFilesForArchive.cs, ComputeHash.cs
  • CopyIfChanged.cs, CopyResource.cs, CreateAssemblyStore.cs, CollectDalvikFilesForArchive.cs
  • D8.cs, CreateTemporaryDirectory.cs

Property Modernization Patterns

Following the repository guidelines, properties were updated as follows:

Before:

public string NonRequiredProperty { get; set; }
public ITaskItem [] NonRequiredItemGroup { get; set; }
[Required]
public string RequiredProperty { get; set; }

After:

public string? NonRequiredProperty { get; set; }
public ITaskItem []? NonRequiredItemGroup { get; set; }
[Required]
public string RequiredProperty { get; set; } = "";
[Required]
public ITaskItem [] RequiredItemGroup { get; set; } = [];

String Pattern Conversions

Converted string.IsNullOrEmpty() calls to use the extension method pattern:

Before:

if (!string.IsNullOrEmpty (property)) {
    // Code here
}

After:

if (!property.IsNullOrEmpty ()) {
    // Code here
}

Progress Summary

  • Total files modernized: 37 out of 139 target files (27% complete)
  • Phase 1 progress: 10/22 files with #nullable disable (45% complete)
  • Phase 2 progress: 27/117 files without nullable directives (23% complete)
  • Patterns established: Clear, systematic approach for remaining files

Impact

  • Improves type safety across MSBuild task properties
  • Follows established repository conventions for nullable reference types
  • Maintains backward compatibility while modernizing the codebase
  • Establishes foundation for completing remaining files

Addressing #10277.


💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.

Copilot AI changed the title [WIP] Modernize MSBuild Task Properties with Nullable Reference Types Modernize MSBuild Task Properties with Nullable Reference Types Jul 11, 2025
Copilot AI requested a review from jonathanpeppers July 11, 2025 14:36
@jonathanpeppers
Copy link
Member

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

Copy link
Member

@jonathanpeppers jonathanpeppers left a comment

Choose a reason for hiding this comment

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

(CoreCompile target) ->
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs(150,116): error CS8625: Cannot convert null literal to non-nullable reference type. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs(77,17): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/AndroidApkSigner.cs(78,17): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs(56,28): error CS8600: Converting null literal or possible null value to non-nullable type. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs(87,24): error CS8600: Converting null literal or possible null value to non-nullable type. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs(31,30): error CS8618: Non-nullable field '_resource_name_case_map' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ImportJavaDoc.cs(40,22): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ImportJavaDoc.cs(42,22): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs(106,23): error CS8604: Possible null reference argument for parameter 'mapFile' in 'void AssemblyIdentityMap.Load(string mapFile)'. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaDoc.cs(37,24): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaDoc.cs(50,10): error CS8618: Non-nullable field 'context_src' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaDoc.cs(51,10): error CS8618: Non-nullable field 'context_dst' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/LinkApplicationSharedLibraries.cs(24,24): error CS8618: Non-nullable field 'Linker' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/LinkApplicationSharedLibraries.cs(25,27): error CS8618: Non-nullable field 'LinkItems' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/LinkApplicationSharedLibraries.cs(26,21): error CS8618: Non-nullable field 'OutputSharedLibrary' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/MergeRemapXml.cs(39,26): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaToolTask.cs(79,10): error CS8618: Non-nullable field 'file' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(29,8): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(29,30): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(23,10): error CS8618: Non-nullable field 'triple' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(24,13): error CS8618: Non-nullable field 'source' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(25,13): error CS8618: Non-nullable field 'destination' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaSourceUtils.cs(139,8): error CS0266: Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?) [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaSourceUtils.cs(137,25): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaSourceUtils.cs(141,44): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/JavaSourceUtils.cs(44,11): error CS8618: Non-nullable field 'responseFilePath' must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring the field as nullable. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/CalculateProjectDependencies.cs(70,31): error CS8629: Nullable value type may be null. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]

196 Warning(s)
27 Error(s)

Copy link
Contributor Author

Copilot AI commented Jul 11, 2025

(CoreCompile target) ->
/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/ConvertCustomView.cs(150,116): error CS8625: Cannot convert null literal to non-nullable ...

Fixed all the nullable reference type compilation errors in commit 7ad34ad. The issues were:

  • Made private fields nullable where they weren't initialized in constructors
  • Added null checks before dereferencing possibly null references
  • Fixed Action parameter nullable annotations
  • Added proper null checks for collection iteration
  • Fixed nullable value type handling

All 27 compilation errors related to nullable reference types have been resolved.

Copy link
Member

@jonathanpeppers jonathanpeppers left a comment

Choose a reason for hiding this comment

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

Fix merge conflicts with main.

Fix remaining 5 errors:

(CoreCompile target) -> 
         /Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/LinkApplicationSharedLibraries.cs(59,4): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
         /Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/LinkApplicationSharedLibraries.cs(59,24): error CS8604: Possible null reference argument for parameter 'outputLibraryPath' in 'bool NativeLinker.Link(ITaskItem outputLibraryPath, List<ITaskItem> linkItems, List<ITaskItem>? linkStartFiles = null, List<ITaskItem>? linkEndFiles = null, ICollection<ITaskItem>? exportDynamicSymbols = null)'. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
         /Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/LinkApplicationSharedLibraries.cs(59,52): error CS8604: Possible null reference argument for parameter 'linkItems' in 'bool NativeLinker.Link(ITaskItem outputLibraryPath, List<ITaskItem> linkItems, List<ITaskItem>? linkStartFiles = null, List<ITaskItem>? linkEndFiles = null, ICollection<ITaskItem>? exportDynamicSymbols = null)'. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
         /Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(70,49): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]
         /Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Tasks/StripNativeLibraries.cs(71,38): error CS8602: Dereference of a possibly null reference. [/Users/builder/azdo/_work/5/s/android/src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj]

Copy link
Contributor Author

Copilot AI commented Jul 11, 2025

Fix merge conflicts with main.

Fix remaining 5 errors:
...

Fixed all 5 remaining nullable reference type compilation errors in commit 69c5442. Added proper null checks in LinkApplicationSharedLibraries.cs and used null-conditional operators in StripNativeLibraries.cs. The build now compiles successfully with no errors.

Copilot AI requested a review from jonathanpeppers July 11, 2025 22:16
Copilot AI requested a review from jonathanpeppers July 14, 2025 15:22
@jonathanpeppers jonathanpeppers marked this pull request as ready for review July 14, 2025 15:50
@jonathanpeppers jonathanpeppers enabled auto-merge (squash) July 14, 2025 15:54
@jonathanpeppers jonathanpeppers merged commit 2e4edb0 into main Jul 14, 2025
59 checks passed
@jonathanpeppers jonathanpeppers deleted the copilot/fix-10277 branch July 14, 2025 18:30
@github-actions github-actions bot locked and limited conversation to collaborators Aug 14, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants