Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 03c9073

Browse files
[XamlC] no longer use any reflection-base ImportReference
reflection-base ImportReference -- we were using MethodBase and Type -- are importing the types present in the reflection context, at the time of compilation. As the compilation happens on netstandard2.0, and our assembly can now be netstandard1.0 again, those imported types are failing to be resolved. this changes always import references based on the assembly, or the assembly references. it might, or might not, give us another speed bump.
1 parent 8821301 commit 03c9073

25 files changed

+548
-554
lines changed

Xamarin.Forms.Build.Tasks/BindablePropertyReferenceExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static TypeReference GetBindablePropertyType(this FieldReference bpRef, I
2626
md.IsStatic &&
2727
md.IsPublic &&
2828
md.Parameters.Count == 1 &&
29-
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReferenceCached(typeof(BindableObject))), module).SingleOrDefault()?.Item1;
29+
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReference(("Xamarin.Forms.Core", "Xamarin.Forms", "BindableObject"))), module).SingleOrDefault()?.Item1;
3030
if (getter == null)
3131
throw new XamlParseException($"Missing a public static Get{bpName} or a public instance property getter for the attached property \"{bpRef.DeclaringType}.{bpRef.Name}\"", iXmlLineInfo);
3232
return getter.ResolveGenericReturnType(declaringTypeRef, module);
@@ -43,7 +43,7 @@ public static TypeReference GetBindablePropertyTypeConverter(this FieldReference
4343
md.IsStatic &&
4444
md.IsPublic &&
4545
md.Parameters.Count == 1 &&
46-
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReferenceCached(typeof(BindableObject))), module).SingleOrDefault()?.Item1;
46+
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReference(("Xamarin.Forms.Core", "Xamarin.Forms", "BindableObject"))), module).SingleOrDefault()?.Item1;
4747

4848
var attributes = new List<CustomAttribute>();
4949
if (property != null && property.HasCustomAttributes)

Xamarin.Forms.Build.Tasks/CompiledConverters/BindingTypeConverter.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
2020
if (IsNullOrEmpty(value))
2121
throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Binding)}", node);
2222

23-
var bindingCtor = module.ImportReferenceCached(typeof(Binding)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 6);
24-
var bindingCtorRef = module.ImportReference(bindingCtor);
25-
23+
var bindingCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Binding"), paramCount: 6);
2624
yield return Instruction.Create(OpCodes.Ldstr, value);
2725
yield return Instruction.Create(OpCodes.Ldc_I4, (int)BindingMode.Default);
2826
yield return Instruction.Create(OpCodes.Ldnull);

Xamarin.Forms.Build.Tasks/CompiledConverters/BoundsTypeConverter.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ IEnumerable<Instruction> GenerateIL(double x, double y, double w, double h, Modu
6868
yield return Instruction.Create(OpCodes.Ldc_R8, w);
6969
yield return Instruction.Create(OpCodes.Ldc_R8, h);
7070

71-
var rectangleCtor = module.ImportReferenceCached(typeof(Rectangle)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 4);
72-
var rectangleCtorRef = module.ImportReference(rectangleCtor);
71+
var rectangleCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), paramCount: 4);
7372
yield return Instruction.Create(OpCodes.Newobj, rectangleCtorRef);
7473
}
7574
}

Xamarin.Forms.Build.Tasks/CompiledConverters/ColorTypeConverter.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,29 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
2828
yield return Instruction.Create(OpCodes.Ldc_R8, color.G);
2929
yield return Instruction.Create(OpCodes.Ldc_R8, color.B);
3030
yield return Instruction.Create(OpCodes.Ldc_R8, color.A);
31-
var colorCtor = module.ImportReferenceCached(typeof(Color)).ResolveCached().Methods.FirstOrDefault(
32-
md => md.IsConstructor && md.Parameters.Count == 4 &&
33-
md.Parameters.All(p => p.ParameterType.FullName == "System.Double"));
34-
var colorCtorRef = module.ImportReference(colorCtor);
31+
32+
var colorCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
33+
paramCount: 4,
34+
predicate: md => md.Parameters.All(p => p.ParameterType.FullName == "System.Double"));
3535
yield return Instruction.Create(OpCodes.Newobj, colorCtorRef);
3636
yield break;
3737
}
3838
var parts = value.Split('.');
3939
if (parts.Length == 1 || (parts.Length == 2 && parts [0] == "Color")) {
4040
var color = parts [parts.Length - 1];
4141

42-
var field = module.ImportReferenceCached(typeof(Color)).ResolveCached().Fields.SingleOrDefault(fd => fd.Name == color && fd.IsStatic);
43-
if (field != null) {
44-
yield return Instruction.Create(OpCodes.Ldsfld, module.ImportReference(field));
42+
var fieldReference = module.ImportFieldReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
43+
color,
44+
fd => fd.IsStatic);
45+
if (fieldReference != null) {
46+
yield return Instruction.Create(OpCodes.Ldsfld, fieldReference);
4547
yield break;
4648
}
47-
var propertyGetter = module.ImportReferenceCached(typeof(Color)).ResolveCached().Properties.SingleOrDefault(pd => pd.Name == color && pd.GetMethod.IsStatic)?.GetMethod;
48-
if (propertyGetter != null) {
49-
yield return Instruction.Create(OpCodes.Call, module.ImportReference(propertyGetter));
49+
var propertyGetterReference = module.ImportPropertyGetterReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
50+
color,
51+
pd => pd.GetMethod.IsStatic);
52+
if (propertyGetterReference != null) {
53+
yield return Instruction.Create(OpCodes.Call, propertyGetterReference);
5054
yield break;
5155
}
5256
}

Xamarin.Forms.Build.Tasks/CompiledConverters/ConstraintTypeConverter.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
2222
throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Constraint)}", node);
2323

2424
yield return Instruction.Create(OpCodes.Ldc_R8, size);
25-
26-
var constantDef = module.ImportReferenceCached(typeof(Constraint)).ResolveCached().Methods.FirstOrDefault(md => md.IsStatic && md.Name == "Constant");
27-
var constantRef = module.ImportReference(constantDef);
28-
yield return Instruction.Create(OpCodes.Call, constantRef);
25+
var constantReference = module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Constraint"),
26+
methodName: "Constant",
27+
paramCount: 1,
28+
predicate: md => md.IsStatic);
29+
yield return Instruction.Create(OpCodes.Call, constantReference);
2930
}
3031
}
3132
}

Xamarin.Forms.Build.Tasks/CompiledConverters/LayoutOptionsConverter.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
2626
if (parts.Length == 1 || (parts.Length == 2 && parts [0] == "LayoutOptions")) {
2727
var options = parts [parts.Length - 1];
2828

29-
var field = module.ImportReferenceCached(typeof(LayoutOptions)).ResolveCached().Fields.SingleOrDefault(fd => fd.Name == options && fd.IsStatic);
30-
if (field != null) {
31-
yield return Instruction.Create(OpCodes.Ldsfld, module.ImportReference(field));
29+
var fieldReference = module.ImportFieldReference(("Xamarin.Forms.Core", "Xamarin.Forms", "LayoutOptions"),
30+
fieldName: options,
31+
predicate: fd => fd.IsStatic);
32+
if (fieldReference != null) {
33+
yield return Instruction.Create(OpCodes.Ldsfld, fieldReference);
3234
yield break;
3335
}
3436
}

Xamarin.Forms.Build.Tasks/CompiledConverters/ListStringTypeConverter.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,20 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
2222
}
2323
var parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToList();
2424

25-
var listCtor = module.ImportReferenceCached(typeof(List<>)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 1 && md.Parameters[0].ParameterType.FullName == "System.Int32");
26-
var listCtorRef = module.ImportReference(listCtor);
27-
listCtorRef = module.ImportReference(listCtorRef.ResolveGenericParameters(module.ImportReferenceCached(typeof(List<string>)), module));
28-
29-
var adder = module.ImportReferenceCached(typeof(ICollection<>)).ResolveCached().Methods.FirstOrDefault(md => md.Name == "Add" && md.Parameters.Count == 1);
30-
var adderRef = module.ImportReference(adder);
31-
adderRef = module.ImportReference(adderRef.ResolveGenericParameters(module.ImportReferenceCached(typeof(ICollection<string>)), module));
25+
var add = module.ImportMethodReference(("mscorlib", "System.Collections.Generic", "ICollection`1"),
26+
methodName: "Add",
27+
paramCount: 1,
28+
classArguments: new[] { ("mscorlib", "System", "String") });
3229

3330
yield return Instruction.Create(OpCodes.Ldc_I4, parts.Count);
34-
yield return Instruction.Create(OpCodes.Newobj, listCtorRef);
35-
31+
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("mscorlib", "System.Collections.Generic", "List`1"),
32+
paramCount: 1,
33+
predicate: md => md.Parameters[0].ParameterType.FullName == "System.Int32",
34+
classArguments: new[] { ("mscorlib", "System", "String") }));
3635
foreach (var part in parts) {
3736
yield return Instruction.Create(OpCodes.Dup);
3837
yield return Instruction.Create(OpCodes.Ldstr, part);
39-
yield return Instruction.Create(OpCodes.Callvirt, adderRef);
38+
yield return Instruction.Create(OpCodes.Callvirt, add);
4039
}
4140
}
4241
}

Xamarin.Forms.Build.Tasks/CompiledConverters/RDSourceTypeConverter.cs

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,34 +44,26 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
4444

4545
//keep the Uri for later
4646
yield return Create(Dup);
47-
var uriVarDef = new VariableDefinition(module.ImportReferenceCached(typeof(Uri)));
47+
var uriVarDef = new VariableDefinition(module.ImportReference(("System", "System", "Uri")));
4848
body.Variables.Add(uriVarDef);
4949
yield return Create(Stloc, uriVarDef);
50-
5150
yield return Create(Ldstr, resourcePath); //resourcePath
52-
53-
var getTypeFromHandle = module.ImportReferenceCached(typeof(Type).GetMethod("GetTypeFromHandle", new[] { typeof(RuntimeTypeHandle) }));
54-
var getTypeInfo = module.ImportReferenceCached(typeof(System.Reflection.IntrospectionExtensions).GetMethod("GetTypeInfo", new Type[] { typeof(Type) }));
55-
var getAssembly = module.ImportReferenceCached(typeof(System.Reflection.TypeInfo).GetProperty("Assembly").GetMethod);
5651
yield return Create(Ldtoken, module.ImportReference(((ILRootNode)rootNode).TypeReference));
57-
yield return Create(Call, module.ImportReference(getTypeFromHandle));
58-
yield return Create(Call, module.ImportReference(getTypeInfo));
59-
yield return Create(Callvirt, module.ImportReference(getAssembly)); //assembly
52+
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic));
53+
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", paramCount: 1, predicate: md => md.IsStatic));
54+
yield return Create(Callvirt, module.ImportPropertyGetterReference(("mscorlib", "System.Reflection", "TypeInfo"), propertyName: "Assembly", flatten: true));
6055

6156
foreach (var instruction in node.PushXmlLineInfo(context))
6257
yield return instruction; //lineinfo
63-
64-
var setAndLoadSource = module.ImportReferenceCached(typeof(ResourceDictionary).GetMethod("SetAndLoadSource"));
65-
yield return Create(Callvirt, module.ImportReference(setAndLoadSource));
66-
58+
yield return Create(Callvirt, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "ResourceDictionary"), methodName: "SetAndLoadSource", paramCount: 4));
6759
//ldloc the stored uri as return value
6860
yield return Create(Ldloc, uriVarDef);
6961
}
7062

7163
internal static string GetPathForType(ModuleDefinition module, TypeReference type)
7264
{
7365
foreach (var ca in type.Module.GetCustomAttributes()) {
74-
if (!TypeRefComparer.Default.Equals(ca.AttributeType, module.ImportReferenceCached(typeof(XamlResourceIdAttribute))))
66+
if (!TypeRefComparer.Default.Equals(ca.AttributeType, module.ImportReference(("Xamarin.Forms.Core", "Xamarin.Forms.Xaml", "XamlResourceIdAttribute"))))
7567
continue;
7668
if (!TypeRefComparer.Default.Equals(ca.ConstructorArguments[2].Value as TypeReference, type))
7769
continue;
@@ -80,4 +72,4 @@ internal static string GetPathForType(ModuleDefinition module, TypeReference typ
8072
return null;
8173
}
8274
}
83-
}
75+
}

Xamarin.Forms.Build.Tasks/CompiledConverters/RectangleTypeConverter.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ IEnumerable<Instruction> GenerateIL(double x, double y, double w, double h, Modu
4343
yield return Instruction.Create(OpCodes.Ldc_R8, w);
4444
yield return Instruction.Create(OpCodes.Ldc_R8, h);
4545

46-
var rectangleCtor = module.ImportReferenceCached(typeof(Rectangle)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 4);
47-
var rectangleCtorRef = module.ImportReference(rectangleCtor);
48-
yield return Instruction.Create(OpCodes.Newobj, rectangleCtorRef);
46+
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), paramCount: 4));
4947
}
5048
}
5149
}

Xamarin.Forms.Build.Tasks/CompiledConverters/ThicknessTypeConverter.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@ IEnumerable<Instruction> GenerateIL(ModuleDefinition module, params double[] arg
4545
{
4646
foreach (var d in args)
4747
yield return Instruction.Create(OpCodes.Ldc_R8, d);
48-
var thicknessCtor = module.ImportReferenceCached(typeof(Thickness)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == args.Length);
49-
var thicknessCtorRef = module.ImportReference(thicknessCtor);
50-
yield return Instruction.Create(OpCodes.Newobj, thicknessCtorRef);
48+
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Thickness"),
49+
paramCount: args.Length));
5150
}
5251
}
5352

0 commit comments

Comments
 (0)