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