Skip to content

Commit 4b812ee

Browse files
Add JCW-specific scanner properties and resolver methods
Add BaseJavaName, ImplementedInterfaceJavaNames properties to JavaPeerInfo, and ResolveBaseJavaName, ResolveImplementedInterfaceJavaNames, ResolveInterfaceJniName methods to JavaPeerScanner — moved from PR #10808. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 4a494e4 commit 4b812ee

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerInfo.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ sealed record JavaPeerInfo
4343
/// </summary>
4444
public required string AssemblyName { get; init; }
4545

46+
/// <summary>
47+
/// JNI name of the base Java type, e.g., "android/app/Activity" for a type
48+
/// that extends Activity. Null for java/lang/Object or types without a Java base.
49+
/// Needed by JCW Java source generation ("extends" clause).
50+
/// </summary>
51+
public string? BaseJavaName { get; init; }
52+
53+
/// <summary>
54+
/// JNI names of Java interfaces this type implements, e.g., ["android/view/View$OnClickListener"].
55+
/// Needed by JCW Java source generation ("implements" clause).
56+
/// </summary>
57+
public IReadOnlyList<string> ImplementedInterfaceJavaNames { get; init; } = Array.Empty<string> ();
58+
4659
public bool IsInterface { get; init; }
4760
public bool IsAbstract { get; init; }
4861

src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,12 @@ void ScanAssembly (AssemblyIndex index, Dictionary<string, JavaPeerInfo> results
197197
var isUnconditional = attrInfo is not null;
198198
string? invokerTypeName = null;
199199

200+
// Resolve base Java type name
201+
var baseJavaName = ResolveBaseJavaName (typeDef, index, results);
202+
203+
// Resolve implemented Java interface names
204+
var implementedInterfaces = ResolveImplementedInterfaceJavaNames (typeDef, index);
205+
200206
// Collect marshal methods (including constructors) in a single pass over methods
201207
var marshalMethods = CollectMarshalMethods (typeDef, index);
202208

@@ -215,6 +221,8 @@ void ScanAssembly (AssemblyIndex index, Dictionary<string, JavaPeerInfo> results
215221
ManagedTypeNamespace = ExtractNamespace (fullName),
216222
ManagedTypeShortName = ExtractShortName (fullName),
217223
AssemblyName = index.AssemblyName,
224+
BaseJavaName = baseJavaName,
225+
ImplementedInterfaceJavaNames = implementedInterfaces,
218226
IsInterface = isInterface,
219227
IsAbstract = isAbstract,
220228
DoNotGenerateAcw = doNotGenerateAcw,
@@ -283,6 +291,51 @@ static void AddMarshalMethod (List<MarshalMethodInfo> methods, RegisterInfo regi
283291
});
284292
}
285293

294+
string? ResolveBaseJavaName (TypeDefinition typeDef, AssemblyIndex index, Dictionary<string, JavaPeerInfo> results)
295+
{
296+
var baseInfo = GetBaseTypeInfo (typeDef, index);
297+
if (baseInfo is null) {
298+
return null;
299+
}
300+
301+
var (baseTypeName, baseAssemblyName) = baseInfo.Value;
302+
303+
// First try [Register] attribute
304+
var registerJniName = ResolveRegisterJniName (baseTypeName, baseAssemblyName);
305+
if (registerJniName is not null) {
306+
return registerJniName;
307+
}
308+
309+
// Fall back to already-scanned results (component-attributed or CRC64-computed peers)
310+
if (results.TryGetValue (baseTypeName, out var basePeer)) {
311+
return basePeer.JavaName;
312+
}
313+
314+
return null;
315+
}
316+
317+
List<string> ResolveImplementedInterfaceJavaNames (TypeDefinition typeDef, AssemblyIndex index)
318+
{
319+
var result = new List<string> ();
320+
var interfaceImpls = typeDef.GetInterfaceImplementations ();
321+
322+
foreach (var implHandle in interfaceImpls) {
323+
var impl = index.Reader.GetInterfaceImplementation (implHandle);
324+
var ifaceJniName = ResolveInterfaceJniName (impl.Interface, index);
325+
if (ifaceJniName is not null) {
326+
result.Add (ifaceJniName);
327+
}
328+
}
329+
330+
return result;
331+
}
332+
333+
string? ResolveInterfaceJniName (EntityHandle interfaceHandle, AssemblyIndex index)
334+
{
335+
var resolved = ResolveEntityHandle (interfaceHandle, index);
336+
return resolved is not null ? ResolveRegisterJniName (resolved.Value.typeName, resolved.Value.assemblyName) : null;
337+
}
338+
286339
static bool TryGetMethodRegisterInfo (MethodDefinition methodDef, AssemblyIndex index, out RegisterInfo? registerInfo, out ExportInfo? exportInfo)
287340
{
288341
exportInfo = null;

0 commit comments

Comments
 (0)