Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[msbuild] Enable nullability in a few classes. #18248

Merged
merged 3 commits into from May 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompileTaskBase.cs
Expand Up @@ -69,7 +69,7 @@ public override bool Execute ()
var aotAssemblyFiles = new List<ITaskItem> ();
var processes = new Task<Execution> [Assemblies.Length];

var environment = new Dictionary<string, string> {
var environment = new Dictionary<string, string?> {
{ "MONO_PATH", Path.GetFullPath (InputDirectory) },
};

Expand Down
Expand Up @@ -90,7 +90,7 @@ void ComputeProperties ()
File.WriteAllText (projectPath, csproj);

var arguments = new List<string> ();
var environment = default (Dictionary<string, string>);
var environment = default (Dictionary<string, string?>);

if (IsDotNet) {
executable = Environment.GetEnvironmentVariable ("DOTNET_HOST_PATH");
Expand All @@ -101,7 +101,7 @@ void ComputeProperties ()
var customHome = Environment.GetEnvironmentVariable ("DOTNET_CUSTOM_HOME");

if (!string.IsNullOrEmpty (customHome)) {
environment = new Dictionary<string, string> { { "HOME", customHome } };
environment = new Dictionary<string, string?> { { "HOME", customHome } };
}
} else {
executable = "/Library/Frameworks/Mono.framework/Commands/msbuild";
Expand Down
22 changes: 12 additions & 10 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs
Expand Up @@ -9,13 +9,15 @@
using Xamarin.Utils;
using static Xamarin.Bundler.FileCopier;

#nullable enable

namespace Xamarin.MacDev.Tasks {
// This is the same as XamarinToolTask, except that it subclasses Task instead.
public abstract class XamarinTask : Task {

public string SessionId { get; set; }
public string SessionId { get; set; } = string.Empty;

public string TargetFrameworkMoniker { get; set; }
public string TargetFrameworkMoniker { get; set; } = string.Empty;

void VerifyTargetFrameworkMoniker ()
{
Expand Down Expand Up @@ -110,15 +112,15 @@ protected string GetSdkPlatform (bool isSimulator)
return PlatformFrameworkHelper.GetSdkPlatform (Platform, isSimulator);
}

protected System.Threading.Tasks.Task<Execution> ExecuteAsync (string fileName, IList<string> arguments, string sdkDevPath = null, Dictionary<string, string> environment = null, bool mergeOutput = true, bool showErrorIfFailure = true, string workingDirectory = null)
protected System.Threading.Tasks.Task<Execution> ExecuteAsync (string fileName, IList<string> arguments, string? sdkDevPath = null, Dictionary<string, string?>? environment = null, bool mergeOutput = true, bool showErrorIfFailure = true, string? workingDirectory = null)
{
return ExecuteAsync (Log, fileName, arguments, sdkDevPath, environment, mergeOutput, showErrorIfFailure, workingDirectory);
}

internal protected static async System.Threading.Tasks.Task<Execution> ExecuteAsync (TaskLoggingHelper log, string fileName, IList<string> arguments, string sdkDevPath = null, Dictionary<string, string> environment = null, bool mergeOutput = true, bool showErrorIfFailure = true, string workingDirectory = null)
internal protected static async System.Threading.Tasks.Task<Execution> ExecuteAsync (TaskLoggingHelper log, string fileName, IList<string> arguments, string? sdkDevPath = null, Dictionary<string, string?>? environment = null, bool mergeOutput = true, bool showErrorIfFailure = true, string? workingDirectory = null)
{
// Create a new dictionary if we're given one, to make sure we don't change the caller's dictionary.
var launchEnvironment = environment is null ? new Dictionary<string, string> () : new Dictionary<string, string> (environment);
var launchEnvironment = environment is null ? new Dictionary<string, string?> () : new Dictionary<string, string?> (environment);
if (!string.IsNullOrEmpty (sdkDevPath))
launchEnvironment ["DEVELOPER_DIR"] = sdkDevPath;

Expand All @@ -127,11 +129,11 @@ internal protected static async System.Threading.Tasks.Task<Execution> ExecuteAs
log.LogMessage (rv.ExitCode == 0 ? MessageImportance.Low : MessageImportance.High, MSBStrings.M0002, fileName, rv.ExitCode);

// Show the output
var output = rv.StandardOutput.ToString ();
var output = rv.StandardOutput!.ToString ();
if (!mergeOutput) {
if (output.Length > 0)
output += Environment.NewLine;
output += rv.StandardError.ToString ();
output += rv.StandardError!.ToString ();
}
if (output.Length > 0) {
var importance = MessageImportance.Low;
Expand All @@ -141,7 +143,7 @@ internal protected static async System.Threading.Tasks.Task<Execution> ExecuteAs
}

if (showErrorIfFailure && rv.ExitCode != 0) {
var stderr = rv.StandardError.ToString ().Trim ();
var stderr = rv.StandardError!.ToString ().Trim ();
if (stderr.Length > 1024)
stderr = stderr.Substring (0, 1024);
if (string.IsNullOrEmpty (stderr)) {
Expand Down Expand Up @@ -198,12 +200,12 @@ protected void FileCopierLogCallback (int min_verbosity, string format, params o
FileCopierLogCallback (Log, min_verbosity, format, arguments);
}

protected string GetNonEmptyStringOrFallback (ITaskItem item, string metadataName, string fallbackValue, string fallbackName = null, bool required = false)
protected string GetNonEmptyStringOrFallback (ITaskItem item, string metadataName, string fallbackValue, string? fallbackName = null, bool required = false)
{
return GetNonEmptyStringOrFallback (item, metadataName, out var _, fallbackValue, fallbackName, required);
}

protected string GetNonEmptyStringOrFallback (ITaskItem item, string metadataName, out bool foundInMetadata, string fallbackValue, string fallbackName = null, bool required = false)
protected string GetNonEmptyStringOrFallback (ITaskItem item, string metadataName, out bool foundInMetadata, string fallbackValue, string? fallbackName = null, bool required = false)
{
var metadataValue = item.GetMetadata (metadataName);
if (!string.IsNullOrEmpty (metadataValue)) {
Expand Down
6 changes: 4 additions & 2 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinToolTask.cs
Expand Up @@ -6,13 +6,15 @@
using Xamarin.Localization.MSBuild;
using Xamarin.Utils;

#nullable enable

namespace Xamarin.MacDev.Tasks {
// This is the same as XamarinTask, except that it subclasses ToolTask instead.
public abstract class XamarinToolTask : ToolTask {

public string SessionId { get; set; }
public string SessionId { get; set; } = string.Empty;

public string TargetFrameworkMoniker { get; set; }
public string TargetFrameworkMoniker { get; set; } = string.Empty;

void VerifyTargetFrameworkMoniker ()
{
Expand Down
62 changes: 34 additions & 28 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs
Expand Up @@ -15,76 +15,82 @@
using Xamarin.MacDev;
using Xamarin.Utils;

#nullable enable

namespace Xamarin.MacDev.Tasks {
public abstract class XcodeCompilerToolTask : XamarinTask {
protected bool Link { get; set; }
IList<string> prefixes;
string toolExe;
IList<string>? prefixes;
string? toolExe;

#region Inputs

public string BundleIdentifier { get; set; }
public string BundleIdentifier { get; set; } = string.Empty;

[Required]
public string MinimumOSVersion { get; set; }
public string MinimumOSVersion { get; set; } = string.Empty;

[Required]
public string IntermediateOutputPath { get; set; }
public string IntermediateOutputPath { get; set; } = string.Empty;

[Required]
public string ProjectDir { get; set; }
public string ProjectDir { get; set; } = string.Empty;

[Required]
public string ResourcePrefix { get; set; }
public string ResourcePrefix { get; set; } = string.Empty;

public string SdkBinPath { get; set; }
public string SdkBinPath { get; set; } = string.Empty;

[Required]
public string SdkPlatform { get; set; }
public string SdkPlatform { get; set; } = string.Empty;

string sdkDevPath;
string? sdkDevPath;
public string SdkDevPath {
#if NET
get { return string.IsNullOrEmpty (sdkDevPath) ? "/" : sdkDevPath; }
#else
get { return (sdkDevPath is null || string.IsNullOrEmpty (sdkDevPath)) ? "/" : sdkDevPath; }
#endif
set { sdkDevPath = value; }
}

public string SdkUsrPath { get; set; }
public string SdkUsrPath { get; set; } = string.Empty;

[Required]
public string SdkVersion { get; set; }
public string SdkVersion { get; set; } = string.Empty;

public string ToolExe {
get { return toolExe ?? ToolName; }
set { toolExe = value; }
}

public string ToolPath { get; set; }
public string ToolPath { get; set; } = string.Empty;

#endregion

#region Outputs

[Output]
public ITaskItem [] BundleResources { get; set; }
public ITaskItem [] BundleResources { get; set; } = Array.Empty<ITaskItem> ();

[Output]
public ITaskItem [] OutputManifests { get; set; }
public ITaskItem [] OutputManifests { get; set; } = Array.Empty<ITaskItem> ();

#endregion

#region Inputs from the app manifest

public string CLKComplicationGroup { get; set; }
public string CLKComplicationGroup { get; set; } = string.Empty;

public string NSExtensionPointIdentifier { get; set; }
public string NSExtensionPointIdentifier { get; set; } = string.Empty;

public string UIDeviceFamily { get; set; }
public string UIDeviceFamily { get; set; } = string.Empty;

public bool WKWatchKitApp { get; set; }

public string XSAppIconAssets { get; set; }
public string XSAppIconAssets { get; set; } = string.Empty;

public string XSLaunchImageAssets { get; set; }
public string XSLaunchImageAssets { get; set; } = string.Empty;

#endregion

Expand Down Expand Up @@ -162,7 +168,7 @@ IEnumerable<string> GetTargetDevices (IPhoneDeviceType devices, bool watch, bool
yield break;
}

protected abstract void AppendCommandLineArguments (IDictionary<string, string> environment, CommandLineArgumentBuilder args, ITaskItem [] items);
protected abstract void AppendCommandLineArguments (IDictionary<string, string?> environment, CommandLineArgumentBuilder args, ITaskItem [] items);

static bool? translated;

Expand All @@ -182,7 +188,7 @@ static bool IsTranslated ()

protected int Compile (ITaskItem [] items, string output, ITaskItem manifest)
{
var environment = new Dictionary<string, string> ();
var environment = new Dictionary<string, string?> ();
var args = new CommandLineArgumentBuilder ();

if (!string.IsNullOrEmpty (SdkBinPath))
Expand Down Expand Up @@ -225,14 +231,14 @@ protected int Compile (ITaskItem [] items, string output, ITaskItem manifest)
var arguments = args.ToList ();
var rv = ExecuteAsync (tool, arguments, sdkDevPath, environment: environment, mergeOutput: false).Result;
var exitCode = rv.ExitCode;
var messages = rv.StandardOutput.ToString ();
var messages = rv.StandardOutput!.ToString ();
File.WriteAllText (manifest.ItemSpec, messages);

if (exitCode != 0) {
// Note: ibtool or actool exited with an error. Dump everything we can to help the user
// diagnose the issue and then delete the manifest log file so that rebuilding tries
// again (in case of ibtool's infamous spurious errors).
var errors = rv.StandardError.ToString ();
var errors = rv.StandardError!.ToString ();
if (errors.Length > 0)
Log.LogError (null, null, null, items [0].ItemSpec, 0, 0, 0, 0, "{0}", errors);

Expand All @@ -241,7 +247,7 @@ protected int Compile (ITaskItem [] items, string output, ITaskItem manifest)
// Note: If the log file exists and is parseable, log those warnings/errors as well...
if (File.Exists (manifest.ItemSpec)) {
try {
var plist = PDictionary.FromFile (manifest.ItemSpec);
var plist = PDictionary.FromFile (manifest.ItemSpec)!;

LogWarningsAndErrors (plist, items [0]);
} catch (Exception ex) {
Expand All @@ -257,9 +263,9 @@ protected int Compile (ITaskItem [] items, string output, ITaskItem manifest)

protected void LogWarningsAndErrors (PDictionary plist, ITaskItem file)
{
PDictionary dictionary;
PString message;
PArray array;
PDictionary? dictionary;
PString? message;
PArray? array;

if (plist.TryGetValue (string.Format ("com.apple.{0}.document.notices", ToolName), out array)) {
foreach (var item in array.OfType<PDictionary> ()) {
Expand Down
20 changes: 11 additions & 9 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeToolTaskBase.cs
Expand Up @@ -10,43 +10,45 @@

using Xamarin.MacDev;

#nullable enable

namespace Xamarin.MacDev.Tasks {
public abstract class XcodeToolTaskBase : XamarinTask {
string toolExe;
string? toolExe;

#region Inputs

[Required]
public string IntermediateOutputPath { get; set; }
public string IntermediateOutputPath { get; set; } = string.Empty;

[Required]
public string ProjectDir { get; set; }
public string ProjectDir { get; set; } = string.Empty;

[Required]
public string ResourcePrefix { get; set; }
public string ResourcePrefix { get; set; } = string.Empty;

[Required]
public string SdkBinPath { get; set; }
public string SdkBinPath { get; set; } = string.Empty;

[Required]
public string SdkDevPath { get; set; }
public string SdkDevPath { get; set; } = string.Empty;

[Required]
public string SdkUsrPath { get; set; }
public string SdkUsrPath { get; set; } = string.Empty;

public string ToolExe {
get { return toolExe ?? ToolName; }
set { toolExe = value; }
}

public string ToolPath { get; set; }
public string ToolPath { get; set; } = string.Empty;

#endregion

#region Outputs

[Output]
public ITaskItem [] BundleResources { get; set; }
public ITaskItem [] BundleResources { get; set; } = Array.Empty<ITaskItem> ();

#endregion

Expand Down