Skip to content
Merged
Show file tree
Hide file tree
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
31 changes: 31 additions & 0 deletions src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApi.XmlModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,37 @@ public override string ToString ()
}
}


class ManagedType : JavaType
{
static JavaPackage dummy_system_package, dummy_system_io_package;
static JavaType system_object, system_exception, system_io_stream;

static ManagedType ()
{
dummy_system_package = new JavaPackage (null) { Name = "System" };
system_object = new ManagedType (dummy_system_package) { Name = "Object" };
system_exception = new ManagedType (dummy_system_package) { Name = "Exception" };
dummy_system_package.Types.Add (system_object);
dummy_system_package.Types.Add (system_exception);
dummy_system_io_package = new JavaPackage (null) { Name = "System.IO" };
system_io_stream = new ManagedType (dummy_system_package) { Name = "Stream" };
dummy_system_io_package.Types.Add (system_io_stream);
}

public static IEnumerable<JavaPackage> DummyManagedPackages {
get {
yield return dummy_system_package;
yield return dummy_system_io_package;
}
}

public ManagedType (JavaPackage package) : base (package)
{
}
}


public partial class JavaImplements
{
public string Name { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static void MarkBaseMethod (this JavaClass cls, JavaMethod method)
{
JavaClass k = cls;
while (true) {
k = k.ResolvedExtends != null ? (JavaClass) k.ResolvedExtends.ReferencedType : null;
k = k.ResolvedExtends != null ? k.ResolvedExtends.ReferencedType as JavaClass : null;
if (k == null)
break;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,12 @@ public static JavaType FindNonGenericType (this JavaApi api, string name)
var ret = api.Packages
.SelectMany (p => p.Types)
.FirstOrDefault (t => name.StartsWith (t.Parent.Name, StringComparison.Ordinal) && name == t.Parent.Name + '.' + t.Name);
if (ret == null)
ret = ManagedType.DummyManagedPackages
.SelectMany (p => p.Types)
.FirstOrDefault (t => t.FullName == name);
if (ret == null)
throw new JavaTypeResolutionException (string.Format ("Type '{0}' was not found.", name));

return ret;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.IO;
using System.Linq;
using System.Xml;
using NUnit.Framework;

namespace Xamarin.Android.Tools.ApiXmlAdjuster.Tests
Expand Down Expand Up @@ -29,6 +31,32 @@ public void InstantiatedGenericArgumentName ()
Assert.AreEqual (method.Parameters.First (), method.Parameters.Last (), "There should be only one parameter.");
Assert.AreEqual ("T", para.InstantiatedGenericArgumentName, "InstantiatedGenericArgumentName mismatch");
}

[Test]
public void AncestralOverrides ()
{
string xml = @"<api>
<package name='XXX'>
<class abstract='true' deprecated='not deprecated' extends='android.app.ExpandableListActivity' extends-generic-aware='android.app.ExpandableListActivity' final='false' name='SherlockExpandableListActivity' static='false' visibility='public'>
<method abstract='false' deprecated='not deprecated' final='false' name='addContentView' native='false' return='void' static='false' synchronized='false' visibility='public'>
<parameter name = 'view' type='android.view.View'>
</parameter>
<parameter name = 'params' type='android.view.ViewGroup.LayoutParams'>
</parameter>
</method>
</class>
</package>
</api>";
var xapi = JavaApiTestHelper.GetLoadedApi ();
using (var xr = XmlReader.Create (new StringReader (xml)))
xapi.Load (xr, false);
xapi.Resolve ();
xapi.CreateGenericInheritanceMapping ();
xapi.MarkOverrides ();
var t = xapi.Packages.First (_ => _.Name == "XXX").Types.First (_ => _.Name == "SherlockExpandableListActivity");
var m = t.Members.OfType<JavaMethod> ().First (_ => _.Name == "addContentView");
Assert.IsNotNull (m.BaseMethod, "base method not found");
}
}
}

3 changes: 1 addition & 2 deletions tools/generator/Ctor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ public ManagedCtor (GenBase declaringType, MethodDefinition m)
// the type of the containing class must be inserted as the first
// argument
if (IsNonStaticNestedType)
Parameters.AddFirst (Parameter.FromManagedType (m.DeclaringType.DeclaringType));

Parameters.AddFirst (Parameter.FromManagedType (m.DeclaringType.DeclaringType, DeclaringType.JavaName));
var regatt = m.CustomAttributes.FirstOrDefault (a => a.AttributeType.FullName == "Android.Runtime.RegisterAttribute");
is_acw = regatt != null;
foreach (var p in support.GetParameters (regatt))
Expand Down
2 changes: 1 addition & 1 deletion tools/generator/Field.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public override string Visibility {

protected override Parameter SetterParameter {
get {
var p = Parameter.FromManagedType (f.FieldType.Resolve ());
var p = Parameter.FromManagedType (f.FieldType.Resolve (), null);
p.Name = "value";
return p;
}
Expand Down
19 changes: 11 additions & 8 deletions tools/generator/JavaApiDllLoaderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ public static void LoadReferences (this JavaApi api, GenBase [] gens)
if (gen is InterfaceGen) {
var iface = new JavaInterface (pkg);
pkg.Types.Add (iface);
iface.Load (gen);
iface.Load ((InterfaceGen) gen);
} else if (gen is ClassGen) {
var kls = new JavaClass (pkg);
pkg.Types.Add (kls);
kls.Load (gen);
kls.Load ((ClassGen) gen);
}
else
throw new InvalidOperationException ();
Expand Down Expand Up @@ -75,11 +75,11 @@ static void Load (this JavaInterface iface, InterfaceGen gen)
((JavaType) iface).Load (gen);
}

static string ExpandTypeParameters (GenericParameterDefinitionList tps)
static string ExpandTypeParameters (ISymbol [] tps)
{
if (tps == null)
return null;
return '<' + string.Join (", ", tps.Select (_ => _.Name)) + '>';
return '<' + string.Join (", ", tps.Select (_ => _.JavaName)) + '>';
}

static void Load (this JavaClass kls, ClassGen gen)
Expand All @@ -88,10 +88,13 @@ static void Load (this JavaClass kls, ClassGen gen)

kls.Abstract = gen.IsAbstract;
kls.Final = gen.IsFinal;
if (gen.BaseGen != null) {
kls.Extends = gen.BaseGen.JavaSimpleName;
kls.ExtendsGeneric = gen.BaseGen.JavaSimpleName + ExpandTypeParameters (gen.BaseGen.TypeParameters);
kls.ExtendedJniExtends = gen.BaseGen.JniName;
var baseGen = gen.BaseType != null ? SymbolTable.Lookup (gen.BaseType) : null;

if (baseGen != null) {
kls.Extends = baseGen.JavaName;
var gs = baseGen as GenericSymbol;
kls.ExtendsGeneric = gs != null ? gs.JavaName + ExpandTypeParameters (gs.TypeParams) : baseGen.JavaName;
kls.ExtendedJniExtends = baseGen.JniName;
}
foreach (var c in gen.Ctors) {
var ctor = new JavaConstructor (kls);
Expand Down
4 changes: 2 additions & 2 deletions tools/generator/Parameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,9 @@ public static Parameter FromManagedParameter (ParameterDefinition p, string jnit
return new Parameter (SymbolTable.MangleName (p.Name), jnitype ?? p.ParameterType.FullNameCorrected (), null, isEnumType, rawtype);
}

public static Parameter FromManagedType (TypeDefinition t)
public static Parameter FromManagedType (TypeDefinition t, string javaType)
{
return new Parameter ("__self", t.FullName, null, false);
return new Parameter ("__self", javaType ?? t.FullName, t.FullName, false);
}
#endif
}
Expand Down