-
Notifications
You must be signed in to change notification settings - Fork 569
Expand file tree
/
Copy pathTrimmableTypeMapTypeManager.cs
More file actions
73 lines (63 loc) · 2.41 KB
/
TrimmableTypeMapTypeManager.cs
File metadata and controls
73 lines (63 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Java.Interop;
namespace Microsoft.Android.Runtime;
/// <summary>
/// Type manager for the trimmable typemap path. Delegates type lookups
/// to <see cref="TrimmableTypeMap"/>.
/// </summary>
class TrimmableTypeMapTypeManager : JniRuntime.JniTypeManager
{
protected override IEnumerable<Type> GetTypesForSimpleReference (string jniSimpleReference)
{
foreach (var t in base.GetTypesForSimpleReference (jniSimpleReference)) {
yield return t;
}
if (TrimmableTypeMap.Instance.TryGetTargetType (jniSimpleReference, out var type)) {
yield return type;
}
}
protected override IEnumerable<string> GetSimpleReferences (Type type)
{
if (TrimmableTypeMap.Instance.TryGetJniNameForManagedType (type, out var jniName)) {
yield return jniName;
yield break;
}
foreach (var r in base.GetSimpleReferences (type)) {
yield return r;
}
// Walk the base type chain for managed-only subclasses (e.g., JavaProxyThrowable
// extends Java.Lang.Error but has no [Register] attribute itself).
for (var baseType = type.BaseType; baseType is not null; baseType = baseType.BaseType) {
if (TrimmableTypeMap.Instance.TryGetJniNameForManagedType (baseType, out var baseJniName)) {
yield return baseJniName;
yield break;
}
}
}
[return: DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
protected override Type? GetInvokerTypeCore (
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
Type type)
{
var invokerType = TrimmableTypeMap.Instance.GetInvokerType (type);
if (invokerType != null) {
return invokerType;
}
return base.GetInvokerTypeCore (type);
}
public override void RegisterNativeMembers (
JniType nativeClass,
[DynamicallyAccessedMembers (DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.NonPublicNestedTypes)]
Type type,
ReadOnlySpan<char> methods)
{
throw new UnreachableException (
$"RegisterNativeMembers should not be called in the trimmable typemap path. " +
$"Native methods for '{type.FullName}' should be registered by JCW static initializer blocks.");
}
}