Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,36 @@ public enum JavaPeerStyle {
JavaInterop1,
}

public class OverriddenMethodDescriptor
{
static readonly char[] methodDescSplitChars = new char[] { ':' };

public string JavaPackageName { get; }
public string NativeName { get; }
public string JniSignature { get; }
public string Connector { get; }
public string ManagedTypeName { get; }

public OverriddenMethodDescriptor (string javaPackageName, string methodDescription)
{
JavaPackageName = javaPackageName;
string[] parts = methodDescription.Split (methodDescSplitChars, 4);

if (parts.Length < 2) {
throw new InvalidOperationException ($"Unexpected format for method description. Expected at least 2 parts, got {parts.Length} from: '{methodDescription}'");
}

NativeName = parts[0];
JniSignature = parts[1];
if (parts.Length > 2) {
Connector = parts[2];
if (parts.Length > 3) {
ManagedTypeName = parts[3];
}
}
}
}

public class JavaCallableWrapperGenerator {

class JavaFieldInfo {
Expand Down Expand Up @@ -59,6 +89,7 @@ public string GetJavaAccess ()
List<Signature> methods = new List<Signature> ();
List<Signature> ctors = new List<Signature> ();
List<JavaCallableWrapperGenerator> children;
List<OverriddenMethodDescriptor> overriddenMethodDescriptors;
readonly IMetadataResolver cache;

[Obsolete ("Use the TypeDefinitionCache overload for better performance.")]
Expand All @@ -80,6 +111,7 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action<string, object[
}
}

public IList<OverriddenMethodDescriptor> OverriddenMethodDescriptors => overriddenMethodDescriptors;
public string ApplicationJavaClass { get; set; }
public JavaPeerStyle CodeGenerationTarget { get; set; }

Expand All @@ -89,7 +121,7 @@ public JavaCallableWrapperGenerator (TypeDefinition type, Action<string, object[

/// <summary>
/// The Java source code to be included in Instrumentation.onCreate
///
///
/// Originally came from MonoRuntimeProvider.java delimited by:
/// // Mono Runtime Initialization {{{
/// // }}}
Expand Down Expand Up @@ -497,6 +529,7 @@ string GetManagedParameters (MethodDefinition ctor, string outerType)

public void Generate (TextWriter writer)
{
overriddenMethodDescriptors = new List<OverriddenMethodDescriptor> ();
if (!string.IsNullOrEmpty (package)) {
writer.WriteLine ("package " + package + ";");
writer.WriteLine ();
Expand Down Expand Up @@ -530,6 +563,17 @@ public void Generate (TextWriter writer)
}

GenerateFooter (writer);

string javaTypeName = $"{package}.{name}";
AddOverridenMethods (methods);
AddOverridenMethods (ctors);

void AddOverridenMethods (List<Signature> list)
{
foreach (Signature sig in list) {
overriddenMethodDescriptors.Add (new OverriddenMethodDescriptor (javaTypeName, sig.Method));
}
}
}

public void Generate (string outputPath)
Expand Down Expand Up @@ -958,5 +1002,3 @@ public string GetDestinationPath (string outputPath)
}
}
}