diff --git a/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs b/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs index 0e728114047..ee7749ddee5 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs @@ -52,11 +52,20 @@ private static void AnalyzeClass (SyntaxNodeAnalysisContext context) var parameters = constructor.ParameterList.Parameters; if (parameters.Count != 2) continue; - if (parameters [0].Type.ToString () != "IntPtr") + var type = parameters [0].Type switch { + IdentifierNameSyntax identifierNameSyntax => identifierNameSyntax.Identifier.Text, + QualifiedNameSyntax qualifiedNameSyntax => qualifiedNameSyntax.Right.Identifier.Text, + _ => parameters [0].Type.ToString () + }; + if (type != "IntPtr" && type != "nint") continue; var ns = Utilities.GetNamespaceForParameterType (parameters [1], context.SemanticModel); - var type = parameters [1].Type.ToString(); - var isJniHandle = (ns == "Android.Runtime") && (type == "JniHandleOwnership") || (type == "Android.Runtime.JniHandleOwnership"); + type = parameters [1].Type switch { + IdentifierNameSyntax identifierNameSyntax => identifierNameSyntax.Identifier.Text, + QualifiedNameSyntax qualifiedNameSyntax => qualifiedNameSyntax.Right.Identifier.Text, + _ => parameters [1].Type.ToString () + }; + var isJniHandle = (ns == "Android.Runtime") && (type == "JniHandleOwnership"); if (!isJniHandle) continue; foundActivationConstructor = true; diff --git a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs index 8ef42ff4bdd..02337740c54 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs @@ -15,19 +15,22 @@ public async Task DNAA0001DoesNotShow () } [Test] - [TestCase ("JniHandleOwnership")] - [TestCase ("Android.Runtime.JniHandleOwnership")] - public async Task DNAA0001DoesNotShowForExistingCode (string type) + [TestCase ("IntPtr", "JniHandleOwnership")] + [TestCase ("nint", "Android.Runtime.JniHandleOwnership")] + [TestCase ("global::System.IntPtr", "global::Android.Runtime.JniHandleOwnership")] + [TestCase ("System.IntPtr", "AR.JniHandleOwnership")] + public async Task DNAA0001DoesNotShowForExistingCode (string handle, string type) { var test = $@" using System; using Android.App; using Android.Runtime; +using AR = Android.Runtime; namespace ConsoleApplication1 {{ public class Foo : Application {{ - public Foo(IntPtr javaReference, {type} transfer) : base(javaReference, transfer) + public Foo({handle} javaReference, {type} transfer) : base(javaReference, transfer) {{ }} }} diff --git a/src/Microsoft.Android.Sdk.Analysis/Utilities/Utilities.cs b/src/Microsoft.Android.Sdk.Analysis/Utilities/Utilities.cs index 541e3445bd2..ad9616f0535 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Utilities/Utilities.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Utilities/Utilities.cs @@ -45,7 +45,7 @@ internal static string GetNamespaceForParameterType (ParameterSyntax parameterSy } // Get the symbol for the type of the parameter - var typeSymbol = semanticModel.GetSymbolInfo (parameterSyntax.Type).Symbol as ITypeSymbol; + var typeSymbol = semanticModel.GetTypeInfo (parameterSyntax.Type).Type; if (typeSymbol == null) { return null; // Unable to resolve the symbol