Skip to content

Commit 3b8c467

Browse files
authored
[Xamarin.Android.Tools.AndroidSdk] Fix NRT warnings (#206)
Fix NRT warnings that are showing up in CI build logs, e.g. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs(179,34): warning CS8604: Possible null reference argument for parameter 'attribute' in 'int? AndroidAppManifest.ParseSdkVersion(XAttribute attribute)'. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs(250,22): warning CS8600: Converting null literal or possible null value to non-nullable type. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs(252,6): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs(34,15): warning CS8601: Possible null reference assignment. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs(35,8): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs(38,18): warning CS8601: Possible null reference assignment. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs(198,11): warning CS8603: Possible null reference return. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs(74,18): warning CS8600: Converting null literal or possible null value to non-nullable type. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs(74,27): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs(75,24): warning CS8604: Possible null reference argument for parameter 'element' in 'XElement.explicit operator int(XElement element)'. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs(76,18): warning CS8600: Converting null literal or possible null value to non-nullable type. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs(78,25): warning CS8604: Possible null reference argument for parameter 'element' in 'XElement.explicit operator bool(XElement element)'. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs(80,38): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs(403,23): warning CS8600: Converting null literal or possible null value to non-nullable type. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs(406,12): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs(52,10): warning CS8618: Non-nullable property 'JarPath' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs(52,10): warning CS8618: Non-nullable property 'JavacPath' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs(52,10): warning CS8618: Non-nullable property 'JavaPath' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs(64,26): warning CS8601: Possible null reference assignment. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs(23,29): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs(129,20): warning CS8602: Dereference of a possibly null reference. …/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs(49,21): warning CS8602: Dereference of a possibly null reference. Fix these warnings. Rework the `JdkInfo` constructor so that the C# compiler can determine that `JarPath`, `JavacPath`, and `JavaPath` aren't `null`. Change the return type of `AndroidSdkUnix.GetUnixConfigFile()` and parameter type of `AndroidSdkUnix.SaveConfig()` to be `XElement` instead of `XDocument`, to remove warnings about `XDocument.Root` possibly being `null`.
1 parent 7ef8ec5 commit 3b8c467

File tree

6 files changed

+54
-40
lines changed

6 files changed

+54
-40
lines changed

src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,20 @@ public class AndroidAppManifest
3131
throw new ArgumentNullException (nameof (doc));
3232
this.versions = versions;
3333
this.doc = doc;
34-
manifest = doc.Root;
35-
if (manifest.Name != "manifest")
34+
35+
if (doc.Root is null || doc.Root.Name != "manifest")
3636
throw new ArgumentException ("App manifest does not have 'manifest' root element", nameof (doc));
3737

38-
application = manifest.Element ("application");
39-
if (application == null)
38+
manifest = doc.Root;
39+
40+
if (manifest.Element ("application") is XElement app)
41+
application = app;
42+
else
4043
manifest.Add (application = new XElement ("application"));
4144

42-
usesSdk = manifest.Element ("uses-sdk");
43-
if (usesSdk == null)
45+
if (manifest.Element ("uses-sdk") is XElement uses)
46+
usesSdk = uses;
47+
else
4448
manifest.Add (usesSdk = new XElement ("uses-sdk"));
4549
}
4650

@@ -185,7 +189,7 @@ public int? TargetSdkVersion {
185189
set { usesSdk.SetAttributeValue (aNS + "targetSdkVersion", value == null ? null : value.ToString ()); }
186190
}
187191

188-
int? ParseSdkVersion (XAttribute attribute)
192+
int? ParseSdkVersion (XAttribute? attribute)
189193
{
190194
var version = (string?) attribute;
191195
if (version == null || string.IsNullOrEmpty (version))
@@ -247,9 +251,9 @@ void AddAndroidPermissions (IEnumerable<string> permissions)
247251
lastPerm = el;
248252
}
249253
} else {
250-
var parentNode = (XNode) manifest.Element ("application") ?? manifest.LastNode;
254+
var parentNode = (XNode?) manifest.Element ("application") ?? manifest.LastNode;
251255
foreach (var el in newElements)
252-
parentNode.AddBeforeSelf (el);
256+
parentNode!.AddBeforeSelf (el);
253257
}
254258
}
255259

src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public static void DetectAndSetPreferredJavaSdkPathToLatest (Action<TraceLevel,
193193
sdk.SetPreferredJavaSdkPath (latestJdk.HomePath);
194194
}
195195

196-
public string TryGetCommandLineToolsPath ()
196+
public string? TryGetCommandLineToolsPath ()
197197
{
198198
return GetCommandLineToolsPaths ("latest").FirstOrDefault ();
199199
}

src/Xamarin.Android.Tools.AndroidSdk/AndroidVersion.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ public static AndroidVersion Load (string uri)
7171
// </AndroidApiInfo>
7272
static AndroidVersion Load (XDocument doc)
7373
{
74-
var id = (string) doc.Root.Element ("Id");
75-
var level = (int) doc.Root.Element ("Level");
76-
var name = (string) doc.Root.Element ("Name");
77-
var version = (string) doc.Root.Element ("Version");
78-
var stable = (bool) doc.Root.Element ("Stable");
74+
var id = (string?) doc.Root?.Element ("Id") ?? throw new InvalidOperationException ("Missing Id element");
75+
var level = (int?) doc.Root?.Element ("Level") ?? throw new InvalidOperationException ("Missing Level element");
76+
var name = (string?) doc.Root?.Element ("Name") ?? throw new InvalidOperationException ("Missing Name element");
77+
var version = (string?) doc.Root?.Element ("Version") ?? throw new InvalidOperationException ("Missing Version element");
78+
var stable = (bool?) doc.Root?.Element ("Stable") ?? throw new InvalidOperationException ("Missing Stable element");
7979

8080
return new AndroidVersion (level, version.TrimStart ('v'), name, id, stable);
8181
}

src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,15 @@ public JdkInfo (string homePath, string? locator = null, Action<TraceLevel, stri
6161
this.logger = logger ?? AndroidSdkInfo.DefaultConsoleLogger;
6262

6363
var binPath = Path.Combine (HomePath, "bin");
64-
JarPath = ProcessUtils.FindExecutablesInDirectory (binPath, "jar").FirstOrDefault ();
65-
JavaPath = ProcessUtils.FindExecutablesInDirectory (binPath, "java").FirstOrDefault ();
66-
JavacPath = ProcessUtils.FindExecutablesInDirectory (binPath, "javac").FirstOrDefault ();
64+
JarPath = RequireExecutableInDirectory (binPath, "jar");
65+
JavaPath = RequireExecutableInDirectory (binPath, "java");
66+
JavacPath = RequireExecutableInDirectory (binPath, "javac");
6767

6868
string? jdkJvmPath = GetJdkJvmPath ();
6969

70-
ValidateFile ("jar", JarPath);
71-
ValidateFile ("java", JavaPath);
72-
ValidateFile ("javac", JavacPath);
7370
ValidateFile ("jvm", jdkJvmPath);
7471

75-
JdkJvmPath = jdkJvmPath!;
72+
JdkJvmPath = jdkJvmPath;
7673

7774
var includes = new List<string> ();
7875
var jdkInclude = Path.Combine (HomePath, "include");
@@ -153,12 +150,21 @@ static IEnumerable<string> FindLibrariesInDirectory (string dir, string libraryN
153150
return Directory.EnumerateFiles (dir, library, SearchOption.AllDirectories);
154151
}
155152

156-
void ValidateFile (string name, string? path)
153+
void ValidateFile (string name, [NotNull]string? path)
157154
{
158155
if (path == null || !File.Exists (path))
159156
throw new ArgumentException ($"Could not find required file `{name}` within `{HomePath}`; is this a valid JDK?", "homePath");
160157
}
161158

159+
string RequireExecutableInDirectory (string binPath, string fileName)
160+
{
161+
var file = ProcessUtils.FindExecutablesInDirectory (binPath, fileName).FirstOrDefault ();
162+
163+
ValidateFile (fileName, file);
164+
165+
return file;
166+
}
167+
162168
static Regex NonDigitMatcher = new Regex (@"[^\d]", RegexOptions.Compiled | RegexOptions.CultureInvariant);
163169

164170
Version? GetJavaVersion ()
@@ -400,12 +406,12 @@ static IEnumerable<string> GetLibexecJdkPaths (Action<TraceLevel, string> logger
400406
yield break;
401407
}
402408
foreach (var info in plist.Elements ("array").Elements ("dict")) {
403-
var JVMHomePath = (XNode) info.Elements ("key").FirstOrDefault (e => e.Value == "JVMHomePath");
409+
var JVMHomePath = (XNode?) info.Elements ("key").FirstOrDefault (e => e.Value == "JVMHomePath");
404410
if (JVMHomePath == null)
405411
continue;
406-
while (JVMHomePath.NextNode.NodeType != XmlNodeType.Element)
407-
JVMHomePath = JVMHomePath.NextNode;
408-
var strElement = (XElement) JVMHomePath.NextNode;
412+
while (JVMHomePath.NextNode!.NodeType != XmlNodeType.Element)
413+
JVMHomePath = JVMHomePath.NextNode!;
414+
var strElement = (XElement) JVMHomePath.NextNode!;
409415
var path = strElement.Value;
410416
yield return path;
411417
}

src/Xamarin.Android.Tools.AndroidSdk/Jdks/JdkLocations.MacOS.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ static IEnumerable<JdkInfo> GetUnixPreferredJdks (Action<TraceLevel, string> log
2020
static IEnumerable<string> GetUnixConfiguredJdkPaths (Action<TraceLevel, string> logger)
2121
{
2222
var config = AndroidSdkUnix.GetUnixConfigFile (logger);
23-
foreach (var java_sdk in config.Root.Elements ("java-sdk")) {
23+
24+
foreach (var java_sdk in config.Elements ("java-sdk")) {
2425
var path = (string?) java_sdk.Attribute ("path");
2526
if (path != null && !string.IsNullOrEmpty (path)) {
2627
yield return path;

src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public override string NdkHostPlatform64Bit {
4646
public override string? PreferedAndroidSdkPath {
4747
get {
4848
var config_file = GetUnixConfigFile (Logger);
49-
var androidEl = config_file.Root.Element ("android-sdk");
49+
var androidEl = config_file.Element ("android-sdk");
5050

5151
if (androidEl != null) {
5252
var path = (string?)androidEl.Attribute ("path");
@@ -61,7 +61,7 @@ public override string? PreferedAndroidSdkPath {
6161
public override string? PreferedAndroidNdkPath {
6262
get {
6363
var config_file = GetUnixConfigFile (Logger);
64-
var androidEl = config_file.Root.Element ("android-ndk");
64+
var androidEl = config_file.Element ("android-ndk");
6565

6666
if (androidEl != null) {
6767
var path = (string?)androidEl.Attribute ("path");
@@ -76,7 +76,7 @@ public override string? PreferedAndroidNdkPath {
7676
public override string? PreferedJavaSdkPath {
7777
get {
7878
var config_file = GetUnixConfigFile (Logger);
79-
var javaEl = config_file.Root.Element ("java-sdk");
79+
var javaEl = config_file.Element ("java-sdk");
8080

8181
if (javaEl != null) {
8282
var path = (string?)javaEl.Attribute ("path");
@@ -126,11 +126,12 @@ public override void SetPreferredAndroidSdkPath (string? path)
126126
path = NullIfEmpty (path);
127127

128128
var doc = GetUnixConfigFile (Logger);
129-
var androidEl = doc.Root.Element ("android-sdk");
129+
130+
var androidEl = doc.Element ("android-sdk");
130131

131132
if (androidEl == null) {
132133
androidEl = new XElement ("android-sdk");
133-
doc.Root.Add (androidEl);
134+
doc.Add (androidEl);
134135
}
135136

136137
androidEl.SetAttributeValue ("path", path);
@@ -142,11 +143,12 @@ public override void SetPreferredJavaSdkPath (string? path)
142143
path = NullIfEmpty (path);
143144

144145
var doc = GetUnixConfigFile (Logger);
145-
var javaEl = doc.Root.Element ("java-sdk");
146+
147+
var javaEl = doc.Element ("java-sdk");
146148

147149
if (javaEl == null) {
148150
javaEl = new XElement ("java-sdk");
149-
doc.Root.Add (javaEl);
151+
doc.Add (javaEl);
150152
}
151153

152154
javaEl.SetAttributeValue ("path", path);
@@ -158,18 +160,19 @@ public override void SetPreferredAndroidNdkPath (string? path)
158160
path = NullIfEmpty (path);
159161

160162
var doc = GetUnixConfigFile (Logger);
161-
var androidEl = doc.Root.Element ("android-ndk");
163+
164+
var androidEl = doc.Element ("android-ndk");
162165

163166
if (androidEl == null) {
164167
androidEl = new XElement ("android-ndk");
165-
doc.Root.Add (androidEl);
168+
doc.Add (androidEl);
166169
}
167170

168171
androidEl.SetAttributeValue ("path", path);
169172
SaveConfig (doc);
170173
}
171174

172-
void SaveConfig (XDocument doc)
175+
void SaveConfig (XElement doc)
173176
{
174177
string cfg = UnixConfigPath;
175178
List <string>? created = null;
@@ -229,7 +232,7 @@ private static string UnixConfigPath {
229232
}
230233
}
231234

232-
internal static XDocument GetUnixConfigFile (Action<TraceLevel, string> logger)
235+
internal static XElement GetUnixConfigFile (Action<TraceLevel, string> logger)
233236
{
234237
var file = UnixConfigPath;
235238
XDocument? doc = null;
@@ -254,7 +257,7 @@ internal static XDocument GetUnixConfigFile (Action<TraceLevel, string> logger)
254257
if (doc == null || doc.Root == null) {
255258
doc = new XDocument (new XElement ("monodroid"));
256259
}
257-
return doc;
260+
return doc.Root!;
258261
}
259262

260263
void FixOwnership (List<string>? paths)

0 commit comments

Comments
 (0)