Skip to content

Commit 65430b1

Browse files
authored
[XABT] Enable NRT for some tasks. (#10099)
Enable NRT for tasks in `Xamarin.Android.Build.Tasks` that only needed trivial changes. The following conventions were used: When the task property is guarded by `[Register]`, MSBuild will ensure the property is not `null`, thus we set these values to a non-allocating default: ```csharp [Required] public ITaskItem Manifest { get; set; } = null!; // NRT - guarded by [Required] [Required] public ITaskItem[] AssetDirectories { get; set; } = []; [Required] public string PackageName { get; set; } = ""; ``` For non-`[Required]` properties and fields, set the type to nullable. ```csharp public ITaskItem? Manifest { get; set; } public ITaskItem[]? AssetDirectories { get; set; } public string? PackageName { get; set; } ``` Additionally, `string.IsNullOrEmpty (string)` and friends are not properly annotated for NRT in `netstandard2.0`. Create `string` extension methods like `foo.IsNullOrEmpty ()` that are properly annotated and use them where needed. A few of our unit tests were not filling in `[Required]` task properties and thus failing due to getting different results. Update the tests to pass the `[Required]` properties.
1 parent 525f755 commit 65430b1

File tree

97 files changed

+466
-620
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+466
-620
lines changed

.github/copilot-instructions.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ if (!string.IsNullOrEmpty (NonRequiredProperty)) {
6666
}
6767
```
6868

69-
Convert this to:
69+
Convert this to use the extension method:
7070

7171
```csharp
72-
if (NonRequiredProperty is { Length: > 0 }) {
72+
if (!NonRequiredProperty.IsNullOrEmpty ()) {
7373
// Code here
7474
}
7575
```

src/Xamarin.Android.Build.Tasks/MamJsonToXml.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using System;
42
using System.IO;
53

@@ -14,10 +12,10 @@ public class MamJsonToXml : AndroidTask
1412
public override string TaskPrefix => "A2C";
1513

1614
[Required]
17-
public ITaskItem[] MappingFiles { get; set; }
15+
public ITaskItem[] MappingFiles { get; set; } = [];
1816

1917
[Required]
20-
public ITaskItem XmlMappingOutput { get; set; }
18+
public ITaskItem XmlMappingOutput { get; set; } = null!; // NRT - guarded by [Required]
2119

2220
public override bool RunTask ()
2321
{

src/Xamarin.Android.Build.Tasks/Tasks/Aapt2Compile.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
// Copyright (C) 2011 Xamarin, Inc. All rights reserved.
2-
#nullable disable
3-
42
using System;
53
using System.Diagnostics;
64
using System.IO;
@@ -23,12 +21,12 @@ public class Aapt2Compile : Aapt2 {
2321
List<ITaskItem> archives = new List<ITaskItem> ();
2422
List<ITaskItem> files = new List<ITaskItem> ();
2523

26-
public string ExtraArgs { get; set; }
24+
public string? ExtraArgs { get; set; }
2725

28-
public string FlatArchivesDirectory { get; set; }
26+
public string? FlatArchivesDirectory { get; set; }
2927

30-
public string FlatFilesDirectory { get; set; }
31-
public ITaskItem [] ResourcesToCompile { get; set; }
28+
public string? FlatFilesDirectory { get; set; }
29+
public ITaskItem []? ResourcesToCompile { get; set; }
3230

3331
[Output]
3432
public ITaskItem [] CompiledResourceFlatArchives => archives.ToArray ();
@@ -127,7 +125,7 @@ protected string[] GenerateCommandLineCommands (string fileOrDirectory, bool isD
127125
cmd.Add (GetFullPath (fileOrDirectory).TrimEnd ('\\'));
128126
} else
129127
cmd.Add (GetFullPath (fileOrDirectory));
130-
if (!string.IsNullOrEmpty (ExtraArgs))
128+
if (!ExtraArgs.IsNullOrEmpty ())
131129
cmd.Add (ExtraArgs);
132130
if (MonoAndroidHelper.LogInternalExceptions)
133131
cmd.Add ("-v");

src/Xamarin.Android.Build.Tasks/Tasks/Aapt2LinkAssetPack.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using System;
42
using System.Diagnostics;
53
using System.IO;
@@ -20,16 +18,16 @@ public class Aapt2LinkAssetPack : Aapt2 {
2018
public override string TaskPrefix => "A2LAP";
2119

2220
[Required]
23-
public ITaskItem Manifest { get; set; }
21+
public ITaskItem Manifest { get; set; } = null!; // NRT - guarded by [Required]
2422

2523
[Required]
26-
public ITaskItem[] AssetDirectories { get; set; }
24+
public ITaskItem[] AssetDirectories { get; set; } = [];
2725

2826
[Required]
29-
public string PackageName { get; set; }
27+
public string PackageName { get; set; } = "";
3028

3129
[Required]
32-
public ITaskItem OutputArchive { get; set; }
30+
public ITaskItem OutputArchive { get; set; } = null!; // NRT - guarded by [Required]
3331

3432
protected override int GetRequiredDaemonInstances ()
3533
{

src/Xamarin.Android.Build.Tasks/Tasks/AdjustJavacVersionArguments.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using System;
42
using Microsoft.Build.Utilities;
53
using Microsoft.Build.Framework;
@@ -15,20 +13,20 @@ public class AdjustJavacVersionArguments : AndroidTask
1513
public override string TaskPrefix => "AJV";
1614

1715
[Required]
18-
public string JdkVersion { get; set; }
16+
public string JdkVersion { get; set; } = "";
1917

2018
[Required]
21-
public string DefaultJdkVersion { get; set; }
19+
public string DefaultJdkVersion { get; set; } = "";
2220

2321
public bool EnableMultiDex { get; set; }
2422

2523
public bool SkipJavacVersionCheck { get; set; }
2624

2725
[Output]
28-
public string TargetVersion { get; set; }
26+
public string? TargetVersion { get; set; }
2927

3028
[Output]
31-
public string SourceVersion { get; set; }
29+
public string? SourceVersion { get; set; }
3230

3331
public override bool RunTask ()
3432
{

src/Xamarin.Android.Build.Tasks/Tasks/AndroidAdb.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using Microsoft.Android.Build.Tasks;
42
using Microsoft.Build.Framework;
53
using Microsoft.Build.Utilities;
@@ -13,9 +11,9 @@ public class AndroidAdb : AndroidToolTask
1311
{
1412
public override string TaskPrefix => "AADB";
1513

16-
public string AdbTarget { get; set; }
17-
public string Command { get; set; }
18-
public string Arguments { get; set; }
14+
public string? AdbTarget { get; set; }
15+
public string? Command { get; set; }
16+
public string? Arguments { get; set; }
1917

2018
public bool IgnoreErrors { get; set; } = false;
2119

src/Xamarin.Android.Build.Tasks/Tasks/AndroidComputeResPaths.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2525
// THE SOFTWARE.
2626

27-
#nullable disable
28-
2927
using System;
3028
using System.Text;
3129
using Microsoft.Build.Utilities;
@@ -42,38 +40,38 @@ public class AndroidComputeResPaths : AndroidTask
4240
public override string TaskPrefix => "CRP";
4341

4442
[Required]
45-
public ITaskItem[] ResourceFiles { get; set; }
43+
public ITaskItem[] ResourceFiles { get; set; } = [];
4644

4745
[Required]
48-
public string IntermediateDir { get; set; }
46+
public string IntermediateDir { get; set; } = "";
4947

50-
public string AssetPackIntermediateDir { get; set; }
48+
public string? AssetPackIntermediateDir { get; set; }
5149

52-
public string Prefixes { get; set; }
50+
public string? Prefixes { get; set; }
5351

5452
public string PrefixProperty { get; set; }
5553

5654
public bool LowercaseFilenames { get; set; }
5755

58-
public string ProjectDir { get; set; }
56+
public string? ProjectDir { get; set; }
5957

60-
public string AndroidLibraryFlatFilesDirectory { get; set; }
58+
public string? AndroidLibraryFlatFilesDirectory { get; set; }
6159

6260
[Output]
63-
public ITaskItem[] IntermediateFiles { get; set; }
61+
public ITaskItem[]? IntermediateFiles { get; set; }
6462

6563
[Output]
66-
public ITaskItem [] ResolvedResourceFiles { get; set; }
64+
public ITaskItem []? ResolvedResourceFiles { get; set; }
6765

6866
[Output]
69-
public string FilesHash { get; set; }
67+
public string? FilesHash { get; set; }
7068

7169
public override bool RunTask ()
7270
{
7371
var intermediateFiles = new List<ITaskItem> (ResourceFiles.Length);
7472
var resolvedFiles = new List<ITaskItem> (ResourceFiles.Length);
7573

76-
string[] prefixes = Prefixes != null ? Prefixes.Split (';') : null;
74+
string[]? prefixes = Prefixes != null ? Prefixes.Split (';') : null;
7775
if (prefixes != null) {
7876
for (int i = 0; i < prefixes.Length; i++) {
7977
string p = prefixes [i];

src/Xamarin.Android.Build.Tasks/Tasks/AndroidDotnetToolTask.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using System;
42
using System.IO;
53
using System.Runtime.InteropServices;
@@ -18,7 +16,7 @@ public abstract class AndroidDotnetToolTask : AndroidToolTask
1816
/// <summary>
1917
/// Path to the folder that contains dotnet / dotnet.exe.
2018
/// </summary>
21-
public string NetCoreRoot { get; set; }
19+
public string? NetCoreRoot { get; set; }
2220

2321
/// <summary>
2422
/// If `true`, this task should run `dotnet foo.dll` and `foo.exe` otherwise.
@@ -34,7 +32,7 @@ public abstract class AndroidDotnetToolTask : AndroidToolTask
3432
/// <summary>
3533
/// The path to the assembly `foo.dll`. Will be `null` when NeedsDotnet and NeedsMono are `false`.
3634
/// </summary>
37-
protected string AssemblyPath { get; private set; }
35+
protected string? AssemblyPath { get; private set; }
3836

3937
public override bool Execute ()
4038
{

src/Xamarin.Android.Build.Tasks/Tasks/AndroidError.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using Microsoft.Build.Framework;
42
using Microsoft.Build.Utilities;
53
using Microsoft.Android.Build.Tasks;
@@ -15,18 +13,18 @@ public class AndroidError : Task
1513
/// Error code
1614
/// </summary>
1715
[Required]
18-
public string Code { get; set; }
16+
public string Code { get; set; } = "";
1917

2018
/// <summary>
2119
/// The name of the resource from Properties\Resources.resx that contains the message
2220
/// </summary>
2321
[Required]
24-
public string ResourceName { get; set; }
22+
public string ResourceName { get; set; } = "";
2523

2624
/// <summary>
2725
/// The string format arguments to use for any numbered format items in the resource provided by ResourceName
2826
/// </summary>
29-
public string [] FormatArguments { get; set; }
27+
public string []? FormatArguments { get; set; }
3028

3129
public override bool Execute ()
3230
{

src/Xamarin.Android.Build.Tasks/Tasks/AndroidMessage.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#nullable disable
2-
31
using Microsoft.Build.Framework;
42
using Microsoft.Build.Utilities;
53
using Microsoft.Android.Build.Tasks;
@@ -15,12 +13,12 @@ public class AndroidMessage : Task
1513
/// The name of the resource from Properties\Resources.resx that contains the message
1614
/// </summary>
1715
[Required]
18-
public string ResourceName { get; set; }
16+
public string ResourceName { get; set; } = "";
1917

2018
/// <summary>
2119
/// The string format arguments to use for any numbered format items in the resource provided by ResourceName
2220
/// </summary>
23-
public string [] FormatArguments { get; set; }
21+
public string []? FormatArguments { get; set; }
2422

2523
public override bool Execute ()
2624
{

0 commit comments

Comments
 (0)