diff --git a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs index f13f81da2..caa417936 100644 --- a/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Android.Runtime/RegisterAttribute.cs @@ -1,3 +1,5 @@ +#nullable enable + using System; using Mono.Cecil; @@ -10,9 +12,9 @@ namespace Android.Runtime { #endif // !JCW_ONLY_TYPE_NAMES sealed class RegisterAttribute : Attribute, Java.Interop.IJniNameProviderAttribute { - string connector; + string? connector; string name; - string signature; + string? signature; public RegisterAttribute (string name) { @@ -26,22 +28,22 @@ public RegisterAttribute (string name, string signature, string connector) this.signature = signature; } #if HAVE_CECIL - public RegisterAttribute (string name, CustomAttribute originAttribute) + public RegisterAttribute (string name, CustomAttribute? originAttribute) : this (name) { OriginAttribute = originAttribute; } - public RegisterAttribute (string name, string signature, string connector, CustomAttribute originAttribute) + public RegisterAttribute (string name, string signature, string connector, CustomAttribute? originAttribute) : this (name, signature, connector) { OriginAttribute = originAttribute; } - public CustomAttribute OriginAttribute { get; } + public CustomAttribute? OriginAttribute { get; } #endif // HAVE_CECIL - public string Connector { + public string? Connector { get { return connector; } set { connector = value; } } @@ -51,7 +53,7 @@ public string Name { set { name = value; } } - public string Signature { + public string? Signature { get { return signature; } set { signature = value; } } diff --git a/src/Java.Interop.NamingCustomAttributes/Java.Interop/ExportAttribute.cs b/src/Java.Interop.NamingCustomAttributes/Java.Interop/ExportAttribute.cs index 1c1192504..c2ef7ce00 100644 --- a/src/Java.Interop.NamingCustomAttributes/Java.Interop/ExportAttribute.cs +++ b/src/Java.Interop.NamingCustomAttributes/Java.Interop/ExportAttribute.cs @@ -1,3 +1,5 @@ +#nullable enable + using System; namespace Java.Interop { @@ -15,15 +17,15 @@ public ExportAttribute () { } - public ExportAttribute (string name) + public ExportAttribute (string? name) { Name = name; } - public string Name {get; private set;} - public string SuperArgumentsString {get; set;} - public Type [] Throws {get; set;} - internal string [] ThrownNames {get; set;} // msbuild internal use + public string? Name {get; private set;} + public string? SuperArgumentsString {get; set;} + public Type []? Throws {get; set;} + internal string []? ThrownNames {get; set;} // msbuild internal use } } diff --git a/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs b/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs index 52c5e7697..4f9419799 100644 --- a/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs +++ b/src/Java.Interop.Tools.Diagnostics/Java.Interop.Tools.Diagnostics/Diagnostic.cs @@ -148,7 +148,7 @@ namespace Java.Interop.Tools.Diagnostics { // public static class Diagnostic { - public static void Error (int code, SequencePoint location, string message, params object[] args) + public static void Error (int code, SequencePoint? location, string message, params object[] args) { throw new XamarinAndroidException (code, message, args) { Location = location, diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj index 3eace1272..9d85e7344 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers.csproj @@ -4,6 +4,7 @@ netstandard2.0 false 8.0 + enable true true ..\..\product.snk diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs index ef5c09cb4..daf4e6dd0 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/IdentifierValidator.cs @@ -31,9 +31,9 @@ public static class IdentifierValidator // We use [^ ...] to detect any character that is NOT a match. static Regex validIdentifier = new Regex ($"[^{Identifier}]", RegexOptions.Compiled); - public static string CreateValidIdentifier (string identifier, bool useEncodedReplacements = false) + public static string CreateValidIdentifier (string? identifier, bool useEncodedReplacements = false) { - if (string.IsNullOrWhiteSpace (identifier)) return string.Empty; + if (identifier == null || string.IsNullOrWhiteSpace (identifier)) return string.Empty; var normalizedIdentifier = identifier.Normalize (); diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs index 06b0bba39..94459f290 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs @@ -27,17 +27,18 @@ public enum JavaPeerStyle { public abstract class JavaCallableMethodClassifier { - public abstract bool ShouldBeDynamicallyRegistered (TypeDefinition topType, MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute registerAttribute); + public abstract bool ShouldBeDynamicallyRegistered (TypeDefinition topType, MethodDefinition registeredMethod, MethodDefinition implementedMethod, CustomAttribute? registerAttribute); } public class JavaCallableWrapperGenerator { class JavaFieldInfo { - public JavaFieldInfo (MethodDefinition method, string fieldName, IMetadataResolver resolver) + public JavaFieldInfo (MethodDefinition method, string fieldName, IMetadataResolver? resolver) { this.FieldName = fieldName; InitializerName = method.Name; - TypeName = JavaNativeTypeManager.ReturnTypeFromSignature (GetJniSignature (method, resolver)).Type; + TypeName = JavaNativeTypeManager.ReturnTypeFromSignature (GetJniSignature (method, resolver))?.Type + ?? throw new ArgumentException ($"Could not get JNI signature for method `{method.Name}`", nameof (method)); IsStatic = method.IsStatic; Access = method.Attributes & MethodAttributes.MemberAccessMask; Annotations = GetAnnotationsString ("\t", method.CustomAttributes); @@ -63,39 +64,36 @@ public string GetJavaAccess () List exported_fields = new List (); List methods = new List (); List ctors = new List (); - List children; + List? children; readonly IMetadataResolver cache; - readonly JavaCallableMethodClassifier methodClassifier; + readonly JavaCallableMethodClassifier? methodClassifier; [Obsolete ("Use the TypeDefinitionCache overload for better performance.")] public JavaCallableWrapperGenerator (TypeDefinition type, Action log) : this (type, log, resolver: null, methodClassifier: null) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache) - : this (type, log, (IMetadataResolver) cache, methodClassifier: null) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache? cache) + : this (type, log, (IMetadataResolver?) cache, methodClassifier: null) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache cache, JavaCallableMethodClassifier methodClassifier) - : this (type, log, (IMetadataResolver) cache, methodClassifier) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, TypeDefinitionCache? cache, JavaCallableMethodClassifier? methodClassifier) + : this (type, log, (IMetadataResolver?) cache, methodClassifier) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver? resolver) : this (type, log, resolver, methodClassifier: null) { } - public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver resolver, JavaCallableMethodClassifier methodClassifier) + public JavaCallableWrapperGenerator (TypeDefinition type, Action log, IMetadataResolver? resolver, JavaCallableMethodClassifier? methodClassifier) : this (type, null, log, resolver, methodClassifier) { - if (type.HasNestedTypes) { - children = new List (); - AddNestedTypes (type); - } + AddNestedTypes (type); } - public string ApplicationJavaClass { get; set; } + public string? ApplicationJavaClass { get; set; } public JavaPeerStyle CodeGenerationTarget { get; set; } public bool GenerateOnCreateOverrides { get; set; } @@ -112,7 +110,7 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action - public string MonoRuntimeInitialization { get; set; } + public string? MonoRuntimeInitialization { get; set; } public string Name { get { return name; } @@ -120,19 +118,22 @@ public string Name { void AddNestedTypes (TypeDefinition type) { + if (!type.HasNestedTypes) { + return; + } + children = children ?? new List (); foreach (TypeDefinition nt in type.NestedTypes) { if (!nt.IsSubclassOf ("Java.Lang.Object", cache)) continue; if (!JavaNativeTypeManager.IsNonStaticInnerClass (nt, cache)) continue; children.Add (new JavaCallableWrapperGenerator (nt, JavaNativeTypeManager.ToJniName (type, cache), log, cache)); - if (nt.HasNestedTypes) - AddNestedTypes (nt); + AddNestedTypes (nt); } HasExport |= children.Any (t => t.HasExport); } - JavaCallableWrapperGenerator (TypeDefinition type, string outerType, Action log, IMetadataResolver resolver, JavaCallableMethodClassifier methodClassifier = null) + JavaCallableWrapperGenerator (TypeDefinition type, string? outerType, Action log, IMetadataResolver? resolver, JavaCallableMethodClassifier? methodClassifier = null) { this.methodClassifier = methodClassifier; this.type = type; @@ -142,10 +143,12 @@ void AddNestedTypes (TypeDefinition type) if (type.IsEnum || type.IsInterface || type.IsValueType) Diagnostic.Error (4200, LookupSource (type), Localization.Resources.JavaCallableWrappers_XA4200, type.FullName); - string jniName = JavaNativeTypeManager.ToJniName (type, resolver); - if (jniName == null) + string jniName = JavaNativeTypeManager.ToJniName (type, this.cache); + if (jniName == null) { Diagnostic.Error (4201, LookupSource (type), Localization.Resources.JavaCallableWrappers_XA4201, type.FullName); - if (!string.IsNullOrEmpty (outerType)) { + throw new InvalidOperationException ("--nrt:jniName-- Should not be reached"); + } + if (outerType != null && !string.IsNullOrEmpty (outerType)) { string p; jniName = jniName.Substring (outerType.Length + 1); ExtractJavaNames (outerType, out p, out outerType); @@ -182,8 +185,8 @@ void AddNestedTypes (TypeDefinition type) r.FullName); return d; }) - .Where (d => GetTypeRegistrationAttributes (d).Any ()) - .SelectMany (d => d.Methods) + .Where (d => d != null && GetTypeRegistrationAttributes (d).Any ()) + .SelectMany (d => d!.Methods) .Where (m => !m.IsStatic)) { AddMethod (imethod, imethod); } @@ -235,7 +238,7 @@ static void ExtractJavaNames (string jniName, out string package, out string typ } } - static SequencePoint LookupSource (MethodDefinition method) + static SequencePoint? LookupSource (MethodDefinition method) { if (!method.HasBody) return null; @@ -249,9 +252,9 @@ static SequencePoint LookupSource (MethodDefinition method) return null; } - static SequencePoint LookupSource (TypeDefinition type) + static SequencePoint? LookupSource (TypeDefinition type) { - SequencePoint candidate = null; + SequencePoint? candidate = null; foreach (var method in type.Methods) { if (!method.HasBody) continue; @@ -272,14 +275,14 @@ static SequencePoint LookupSource (TypeDefinition type) return candidate; } - void AddConstructors (TypeDefinition type, string outerType, List baseCtors, List curCtors, bool onlyRegisteredOrExportedCtors) + void AddConstructors (TypeDefinition type, string? outerType, List? baseCtors, List curCtors, bool onlyRegisteredOrExportedCtors) { foreach (MethodDefinition ctor in type.Methods.Where (m => m.IsConstructor && !m.IsStatic)) if (!GetExportAttributes (ctor).Any ()) AddConstructor (ctor, type, outerType, baseCtors, curCtors, onlyRegisteredOrExportedCtors, false); } - void AddConstructor (MethodDefinition ctor, TypeDefinition type, string outerType, List baseCtors, List curCtors, bool onlyRegisteredOrExportedCtors, bool skipParameterCheck) + void AddConstructor (MethodDefinition ctor, TypeDefinition type, string? outerType, List? baseCtors, List curCtors, bool onlyRegisteredOrExportedCtors, bool skipParameterCheck) { string managedParameters = GetManagedParameters (ctor, outerType); if (!skipParameterCheck && (managedParameters == null || ctors.Any (c => c.ManagedParameters == managedParameters))) { @@ -308,7 +311,7 @@ void AddConstructor (MethodDefinition ctor, TypeDefinition type, string outerTyp if (onlyRegisteredOrExportedCtors) return; - string jniSignature = GetJniSignature (ctor, cache); + string? jniSignature = GetJniSignature (ctor, cache); if (jniSignature == null) return; @@ -316,6 +319,10 @@ void AddConstructor (MethodDefinition ctor, TypeDefinition type, string outerTyp if (ctors.Any (c => c.JniSignature == jniSignature)) return; + if (baseCtors == null) { + throw new InvalidOperationException ("`baseCtors` should not be null!"); + } + if (baseCtors.Any (m => m.Parameters.AreParametersCompatibleWith (ctor.Parameters, cache))) { ctors.Add (new Signature (".ctor", jniSignature, "", managedParameters, outerType, null)); curCtors.Add (ctor); @@ -328,7 +335,7 @@ void AddConstructor (MethodDefinition ctor, TypeDefinition type, string outerTyp } } - MethodDefinition GetBaseRegisteredMethod (MethodDefinition method) + MethodDefinition? GetBaseRegisteredMethod (MethodDefinition method) { MethodDefinition bmethod; while ((bmethod = method.GetBaseDefinition (cache)) != method) { @@ -342,10 +349,10 @@ MethodDefinition GetBaseRegisteredMethod (MethodDefinition method) return null; } - internal static RegisterAttribute ToRegisterAttribute (CustomAttribute attr) + internal static RegisterAttribute? ToRegisterAttribute (CustomAttribute attr) { // attr.Resolve (); - RegisterAttribute r = null; + RegisterAttribute? r = null; if (attr.ConstructorArguments.Count == 1) r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value, attr); else if (attr.ConstructorArguments.Count == 3) @@ -361,10 +368,10 @@ internal static RegisterAttribute ToRegisterAttribute (CustomAttribute attr) return r; } - internal static RegisterAttribute RegisterFromJniTypeSignatureAttribute (CustomAttribute attr) + internal static RegisterAttribute? RegisterFromJniTypeSignatureAttribute (CustomAttribute attr) { // attr.Resolve (); - RegisterAttribute r = null; + RegisterAttribute? r = null; if (attr.ConstructorArguments.Count == 1) r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value, attr); if (r != null) { @@ -378,10 +385,10 @@ internal static RegisterAttribute RegisterFromJniTypeSignatureAttribute (CustomA return r; } - internal static RegisterAttribute RegisterFromJniMethodSignatureAttribute (CustomAttribute attr) + internal static RegisterAttribute? RegisterFromJniMethodSignatureAttribute (CustomAttribute attr) { // attr.Resolve (); - RegisterAttribute r = null; + RegisterAttribute? r = null; if (attr.ConstructorArguments.Count == 2) r = new RegisterAttribute ((string) attr.ConstructorArguments [0].Value, (string) attr.ConstructorArguments [1].Value, @@ -396,7 +403,11 @@ ExportAttribute ToExportAttribute (CustomAttribute attr, IMemberDefinition decla if (attr.Properties.Count == 0) return new ExportAttribute (name); var typeArgs = (CustomAttributeArgument []) attr.Properties.FirstOrDefault (p => p.Name == "Throws").Argument.Value; - var thrown = typeArgs != null && typeArgs.Any () ? (from caa in typeArgs select JavaNativeTypeManager.Parse (GetJniTypeName ((TypeReference)caa.Value, cache)).Type).ToArray () : null; + var thrown = typeArgs != null && typeArgs.Any () + ? (from caa in typeArgs select JavaNativeTypeManager.Parse (GetJniTypeName ((TypeReference)caa.Value, cache))?.Type) + .Where (v => v != null) + .ToArray () + : null; var superArgs = (string) attr.Properties.FirstOrDefault (p => p.Name == "SuperArgumentsString").Argument.Value; return new ExportAttribute (name) {ThrownNames = thrown, SuperArgumentsString = superArgs}; } @@ -412,7 +423,11 @@ internal static IEnumerable GetTypeRegistrationAttributes (Mo yield return a; } foreach (var c in p.GetCustomAttributes ("Java.Interop.JniTypeSignatureAttribute")) { - yield return RegisterFromJniTypeSignatureAttribute (c); + var r = RegisterFromJniTypeSignatureAttribute (c); + if (r == null) { + continue; + } + yield return r; } } @@ -422,7 +437,11 @@ static IEnumerable GetMethodRegistrationAttributes (Mono.Ceci yield return a; } foreach (var c in p.GetCustomAttributes ("Java.Interop.JniMethodSignatureAttribute")) { - yield return RegisterFromJniMethodSignatureAttribute (c); + var r = RegisterFromJniMethodSignatureAttribute (c); + if (r == null) { + continue; + } + yield return r; } } @@ -436,13 +455,16 @@ static IEnumerable GetExportFieldAttributes (Mono.Cecil.IC return GetAttributes (p, a => ToExportFieldAttribute (a)); } - static IEnumerable GetAttributes (Mono.Cecil.ICustomAttributeProvider p, Func selector) + static IEnumerable GetAttributes (Mono.Cecil.ICustomAttributeProvider p, Func selector) + where TAttribute : class { return p.GetCustomAttributes (typeof (TAttribute)) - .Select (selector); + .Select (selector) + .Where (v => v != null) + .Select (v => v!); } - void AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedMethod) + void AddMethod (MethodDefinition? registeredMethod, MethodDefinition implementedMethod) { if (registeredMethod != null) foreach (RegisterAttribute attr in GetMethodRegistrationAttributes (registeredMethod)) { @@ -478,7 +500,7 @@ void AddMethod (MethodDefinition registeredMethod, MethodDefinition implementedM } } - string GetManagedParameters (MethodDefinition ctor, string outerType) + string GetManagedParameters (MethodDefinition ctor, string? outerType) { StringBuilder sb = new StringBuilder (); foreach (ParameterDefinition pdef in ctor.Parameters) { @@ -633,7 +655,7 @@ void GenerateHeader (TextWriter sw) sw.WriteLine ("public " + (type.IsAbstract ? "abstract " : "") + "class " + name); string extendsType = GetJavaTypeName (type.BaseType, cache); - if (extendsType == "android.app.Application" && !string.IsNullOrEmpty (ApplicationJavaClass)) + if (extendsType == "android.app.Application" && ApplicationJavaClass != null && !string.IsNullOrEmpty (ApplicationJavaClass)) extendsType = ApplicationJavaClass; sw.WriteLine ("\textends " + extendsType); sw.WriteLine ("\timplements"); @@ -727,7 +749,7 @@ void GenerateRegisterType (TextWriter sw, JavaCallableWrapperGenerator self, str sw.WriteLine ("\t\t\t\"\";"); if (CannotRegisterInStaticConstructor (self.type)) return; - string format = null; + string? format = null; switch (CodeGenerationTarget) { case JavaPeerStyle.JavaInterop1: format = "com.xamarin.java_interop.ManagedPeer.registerNativeMembers ({1}.class, \"{0}\", {2});"; @@ -762,9 +784,11 @@ static string GetJavaAccess (MethodAttributes access) static string GetJavaTypeName (TypeReference r, IMetadataResolver cache) { TypeDefinition d = r.Resolve (); - string jniName = JavaNativeTypeManager.ToJniName (d, cache); - if (jniName == null) + string? jniName = JavaNativeTypeManager.ToJniName (d, cache); + if (jniName == null) { Diagnostic.Error (4201, Localization.Resources.JavaCallableWrappers_XA4201, r.FullName); + throw new InvalidOperationException ("--nrt:jniName-- Should not be reached"); + } return jniName.Replace ('/', '.').Replace ('$', '.'); } @@ -777,7 +801,7 @@ class Signature { public Signature (MethodDefinition method, RegisterAttribute register, bool shouldBeDynamicallyRegistered = true) : this (method, register, null, null, shouldBeDynamicallyRegistered) {} - public Signature (MethodDefinition method, RegisterAttribute register, string managedParameters, string outerType, bool shouldBeDynamicallyRegistered = true) + public Signature (MethodDefinition method, RegisterAttribute register, string? managedParameters, string? outerType, bool shouldBeDynamicallyRegistered = true) : this (register.Name, register.Signature, register.Connector, managedParameters, outerType, null) { Annotations = JavaCallableWrapperGenerator.GetAnnotationsString ("\t", method.CustomAttributes); @@ -795,7 +819,7 @@ public Signature (MethodDefinition method, ExportAttribute export, IMetadataReso Annotations = JavaCallableWrapperGenerator.GetAnnotationsString ("\t", method.CustomAttributes); } - public Signature (MethodDefinition method, ExportFieldAttribute exportField, IMetadataResolver cache) + public Signature (MethodDefinition method, ExportFieldAttribute exportField, IMetadataResolver? cache) : this (method.Name, GetJniSignature (method, cache), "__export__", null, null, null) { if (method.HasParameters) @@ -809,17 +833,17 @@ public Signature (MethodDefinition method, ExportFieldAttribute exportField, IMe // annotations are processed within JavaFieldInfo, not the initializer method. So we don't generate them here. } - public Signature (string name, string signature, string connector, string managedParameters, string outerType, string superCall) + public Signature (string name, string? signature, string? connector, string? managedParameters, string? outerType, string? superCall) { ManagedParameters = managedParameters; - JniSignature = signature; - Method = "n_" + name + ":" + signature + ":" + connector; + JniSignature = signature ?? throw new ArgumentNullException ("`connector` cannot be null.", nameof (connector)); + Method = "n_" + name + ":" + JniSignature + ":" + connector; Name = name; - var jnisig = signature; + var jnisig = JniSignature; int closer = jnisig.IndexOf (')'); string ret = jnisig.Substring (closer + 1); - retval = JavaNativeTypeManager.Parse (ret).Type; + retval = JavaNativeTypeManager.Parse (ret)?.Type; string jniparms = jnisig.Substring (1, closer - 1); if (string.IsNullOrEmpty (jniparms) && string.IsNullOrEmpty (superCall)) return; @@ -834,7 +858,7 @@ public Signature (string name, string signature, string connector, string manage outerType = null; continue; } - string parmType = jti.Type; + string? parmType = jti.Type; if (!first) { parms.Append (", "); scall.Append (", "); @@ -851,42 +875,42 @@ public Signature (string name, string signature, string connector, string manage this.ActivateCall = acall.ToString (); } - string call; - public string SuperCall { + string? call; + public string? SuperCall { get { return call; } } - public string ActivateCall {get; private set;} + public string? ActivateCall {get; private set;} public readonly string Name; - public readonly string JavaNameOverride; + public readonly string? JavaNameOverride; public string JavaName { get { return JavaNameOverride ?? Name; } } - string parms; - public string Params { + string? parms; + public string? Params { get { return parms; } } - string retval; - public string Retval { + string? retval; + public string? Retval { get { return retval; } } - public string ThrowsDeclaration { + public string? ThrowsDeclaration { get { return ThrownTypeNames?.Length > 0 ? " throws " + String.Join (", ", ThrownTypeNames) : null; } } - public readonly string JavaAccess; - public readonly string ManagedParameters; + public readonly string? JavaAccess; + public readonly string? ManagedParameters; public readonly string JniSignature; public readonly string Method; public readonly bool IsExport; public readonly bool IsStatic; public readonly bool IsDynamicallyRegistered = true; - public readonly string [] ThrownTypeNames; - public readonly string Annotations; + public readonly string []? ThrownTypeNames; + public readonly string? Annotations; } void GenerateConstructor (Signature ctor, TextWriter sw) @@ -905,7 +929,7 @@ void GenerateConstructor (Signature ctor, TextWriter sw) sw.WriteLine ("\t\tandroid.util.Log.i(\"MonoDroid-Timing\", \"{0}..ctor({1}): time: \"+java.lang.System.currentTimeMillis());", name, ctor.Params); #endif if (!CannotRegisterInStaticConstructor (type)) { - string format = null; + string? format = null; switch (CodeGenerationTarget) { case JavaPeerStyle.JavaInterop1: format = "com.xamarin.java_interop.ManagedPeer.construct (this, \"{0}\", \"{1}\", new java.lang.Object[] {{ {2} }});"; diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaTypeScanner.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaTypeScanner.cs index 474616dd4..77cab0cb4 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaTypeScanner.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaTypeScanner.cs @@ -23,12 +23,12 @@ public JavaTypeScanner (Action logger) : this (logger, resolver: null) { } - public JavaTypeScanner (Action logger, TypeDefinitionCache cache) - : this (logger, (IMetadataResolver) cache) + public JavaTypeScanner (Action logger, TypeDefinitionCache? cache) + : this (logger, (IMetadataResolver?) cache) { } - public JavaTypeScanner (Action logger, IMetadataResolver resolver) + public JavaTypeScanner (Action logger, IMetadataResolver? resolver) { if (logger == null) throw new ArgumentNullException (nameof (logger)); @@ -80,10 +80,10 @@ void AddJavaTypes (List javaTypes, TypeDefinition type) public static bool ShouldSkipJavaCallableWrapperGeneration (TypeDefinition type) => ShouldSkipJavaCallableWrapperGeneration (type, resolver: null); - public static bool ShouldSkipJavaCallableWrapperGeneration (TypeDefinition type, TypeDefinitionCache cache) => - ShouldSkipJavaCallableWrapperGeneration (type, (IMetadataResolver) cache); + public static bool ShouldSkipJavaCallableWrapperGeneration (TypeDefinition type, TypeDefinitionCache? cache) => + ShouldSkipJavaCallableWrapperGeneration (type, (IMetadataResolver?) cache); - public static bool ShouldSkipJavaCallableWrapperGeneration (TypeDefinition type, IMetadataResolver resolver) + public static bool ShouldSkipJavaCallableWrapperGeneration (TypeDefinition type, IMetadataResolver? resolver) { if (JavaNativeTypeManager.IsNonStaticInnerClass (type, resolver)) return true; @@ -102,10 +102,10 @@ public static List GetJavaTypes (IEnumerable assemblies, GetJavaTypes (assemblies, resolver, log, metadataResolver: null); // Returns all types for which we need to generate Java delegate types. - public static List GetJavaTypes (IEnumerable assemblies, IAssemblyResolver resolver, Action log, TypeDefinitionCache cache) => - GetJavaTypes (assemblies, resolver, log, (IMetadataResolver) cache); + public static List GetJavaTypes (IEnumerable assemblies, IAssemblyResolver resolver, Action log, TypeDefinitionCache? cache) => + GetJavaTypes (assemblies, resolver, log, (IMetadataResolver?) cache); - public static List GetJavaTypes (IEnumerable assemblies, IAssemblyResolver resolver, Action log, IMetadataResolver metadataResolver) + public static List GetJavaTypes (IEnumerable assemblies, IAssemblyResolver resolver, Action log, IMetadataResolver? metadataResolver) { Action l = (level, value) => log ("{0}", new string [] { value }); return new JavaTypeScanner (l, metadataResolver).GetJavaTypes (assemblies, resolver); diff --git a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs index 2f7afd86e..76b19632d 100644 --- a/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs +++ b/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/TypeNameMapGenerator.cs @@ -59,8 +59,7 @@ public class TypeNameMapGenerator : IDisposable { Action Log; List Types; - DirectoryAssemblyResolver Resolver; - JavaTypeScanner Scanner; + DirectoryAssemblyResolver? Resolver; readonly IMetadataResolver Cache; [Obsolete ("Use TypeNameMapGenerator(IEnumerable, Action, TypeDefinitionCache)")] @@ -76,12 +75,12 @@ public TypeNameMapGenerator (IEnumerable assemblies, Action assemblies, Action logger, TypeDefinitionCache cache) - : this (assemblies, logger, (IMetadataResolver) cache) + public TypeNameMapGenerator (IEnumerable assemblies, Action logger, TypeDefinitionCache? cache) + : this (assemblies, logger, (IMetadataResolver?) cache) { } - public TypeNameMapGenerator (IEnumerable assemblies, Action logger, IMetadataResolver resolver) + public TypeNameMapGenerator (IEnumerable assemblies, Action logger, IMetadataResolver? resolver) { if (assemblies == null) throw new ArgumentNullException ("assemblies"); @@ -105,10 +104,10 @@ public TypeNameMapGenerator (IEnumerable assemblies, Action, Action, TypeDefinitionCache)")] @@ -124,12 +123,12 @@ public TypeNameMapGenerator (IEnumerable types, Action types, Action logger, TypeDefinitionCache cache) - : this (types, logger, (IMetadataResolver) cache) + public TypeNameMapGenerator (IEnumerable types, Action logger, TypeDefinitionCache? cache) + : this (types, logger, (IMetadataResolver?) cache) { } - public TypeNameMapGenerator (IEnumerable types, Action logger, IMetadataResolver resolver) + public TypeNameMapGenerator (IEnumerable types, Action logger, IMetadataResolver? resolver) { if (types == null) throw new ArgumentNullException ("types"); diff --git a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs index e050be67a..38fd95ee6 100644 --- a/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs +++ b/src/Java.Interop.Tools.TypeNameMappings/Java.Interop.Tools.TypeNameMappings/JavaNativeTypeManager.cs @@ -36,7 +36,11 @@ enum PackageNamingPolicy { #endif class JniTypeName { - public string? Type { get; internal set; } + string? type; + public string Type { + get => type ?? throw new InvalidOperationException ("`Type` must be set before accessing it!"); + internal set => type = value; + } public bool IsKeyword { get; internal set; } } @@ -50,7 +54,7 @@ static class JavaNativeTypeManager { public static string? ApplicationJavaClass { get; set; } - public static JniTypeName Parse (string jniType) + public static JniTypeName? Parse (string? jniType) { int _ = 0; return ExtractType (jniType, ref _); @@ -68,8 +72,12 @@ public static IEnumerable FromSignature (string signature) yield return t; } - public static JniTypeName ReturnTypeFromSignature (string signature) + [return: NotNullIfNotNull ("signature")] + public static JniTypeName? ReturnTypeFromSignature (string? signature) { + if (signature == null) { + return null; + } int idx = signature.LastIndexOf (')') + 1; return ExtractType (signature, ref idx); } diff --git a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csproj b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csproj index c9fea1f8e..4bddfed55 100644 --- a/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csproj +++ b/tests/Java.Interop.Tools.JavaCallableWrappers-Tests/Java.Interop.Tools.JavaCallableWrappers-Tests.csproj @@ -3,6 +3,7 @@ net472;$(DotNetTargetFramework) false + 8.0 $(DefineConstants);HAVE_CECIL;JCW_ONLY_TYPE_NAMES diff --git a/tools/jnimarshalmethod-gen/Xamarin.Android.Tools.JniMarshalMethodGenerator.csproj b/tools/jnimarshalmethod-gen/Xamarin.Android.Tools.JniMarshalMethodGenerator.csproj index 83d83de3e..0d7b26b7d 100644 --- a/tools/jnimarshalmethod-gen/Xamarin.Android.Tools.JniMarshalMethodGenerator.csproj +++ b/tools/jnimarshalmethod-gen/Xamarin.Android.Tools.JniMarshalMethodGenerator.csproj @@ -3,6 +3,7 @@ net472 Exe + 8.0 jnimarshalmethod-gen