From b86b243a4b9829a966df0e4777950db15bcaf16d Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Mon, 13 Jan 2025 20:57:28 +0000 Subject: [PATCH 1/4] Fix Analyser to work with global types --- src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs index 8ef42ff4bdd..c9e8f7b5c1b 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs @@ -17,6 +17,7 @@ public async Task DNAA0001DoesNotShow () [Test] [TestCase ("JniHandleOwnership")] [TestCase ("Android.Runtime.JniHandleOwnership")] + [TestCase ("global::Android.Runtime.JniHandleOwnership")] public async Task DNAA0001DoesNotShowForExistingCode (string type) { var test = $@" From b9384a8d8cc311113f6d31e71433791c8c3541ac Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 14 Jan 2025 09:07:21 +0000 Subject: [PATCH 2/4] Handle namespaces correctly --- .../Analyzers/CustomApplicationAnalyzer.cs | 8 ++++++-- src/Microsoft.Android.Sdk.Analysis/Utilities/Utilities.cs | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs b/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs index 0e728114047..0802276bea4 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs @@ -55,8 +55,12 @@ private static void AnalyzeClass (SyntaxNodeAnalysisContext context) if (parameters [0].Type.ToString () != "IntPtr") 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"); + var 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/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 From 02d0666ade2c258096428755cac8e16692267321 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 14 Jan 2025 13:06:44 +0000 Subject: [PATCH 3/4] Add Alias for Android.Runtime to test --- src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs index c9e8f7b5c1b..200710ee86a 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs @@ -18,12 +18,14 @@ public async Task DNAA0001DoesNotShow () [TestCase ("JniHandleOwnership")] [TestCase ("Android.Runtime.JniHandleOwnership")] [TestCase ("global::Android.Runtime.JniHandleOwnership")] + [TestCase ("AR.JniHandleOwnership")] public async Task DNAA0001DoesNotShowForExistingCode (string type) { var test = $@" using System; using Android.App; using Android.Runtime; +using AR = Android.Runtime; namespace ConsoleApplication1 {{ public class Foo : Application From 7aaf343b875dbf11a8b793819515d38c16e4cc89 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 14 Jan 2025 15:05:55 +0000 Subject: [PATCH 4/4] Update to handle different IntPtr types --- .../Analyzers/CustomApplicationAnalyzer.cs | 9 +++++++-- .../Tests/DNAA0001Tests.cs | 12 ++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs b/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs index 0802276bea4..ee7749ddee5 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Analyzers/CustomApplicationAnalyzer.cs @@ -52,10 +52,15 @@ 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 switch { + type = parameters [1].Type switch { IdentifierNameSyntax identifierNameSyntax => identifierNameSyntax.Identifier.Text, QualifiedNameSyntax qualifiedNameSyntax => qualifiedNameSyntax.Right.Identifier.Text, _ => parameters [1].Type.ToString () diff --git a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs index 200710ee86a..02337740c54 100644 --- a/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs +++ b/src/Microsoft.Android.Sdk.Analysis/Tests/DNAA0001Tests.cs @@ -15,11 +15,11 @@ public async Task DNAA0001DoesNotShow () } [Test] - [TestCase ("JniHandleOwnership")] - [TestCase ("Android.Runtime.JniHandleOwnership")] - [TestCase ("global::Android.Runtime.JniHandleOwnership")] - [TestCase ("AR.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; @@ -30,7 +30,7 @@ namespace ConsoleApplication1 {{ public class Foo : Application {{ - public Foo(IntPtr javaReference, {type} transfer) : base(javaReference, transfer) + public Foo({handle} javaReference, {type} transfer) : base(javaReference, transfer) {{ }} }}