Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 2 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 @@ -26,7 +26,7 @@ public static TypeReference GetBindablePropertyType(this FieldReference bpRef, I
md.IsStatic &&
md.IsPublic &&
md.Parameters.Count == 1 &&
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReferenceCached(typeof(BindableObject))), module).SingleOrDefault()?.Item1;
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReference(("Xamarin.Forms.Core", "Xamarin.Forms", "BindableObject"))), module).SingleOrDefault()?.Item1;
if (getter == null)
throw new XamlParseException($"Missing a public static Get{bpName} or a public instance property getter for the attached property \"{bpRef.DeclaringType}.{bpRef.Name}\"", iXmlLineInfo);
return getter.ResolveGenericReturnType(declaringTypeRef, module);
Expand All @@ -43,7 +43,7 @@ public static TypeReference GetBindablePropertyTypeConverter(this FieldReference
md.IsStatic &&
md.IsPublic &&
md.Parameters.Count == 1 &&
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReferenceCached(typeof(BindableObject))), module).SingleOrDefault()?.Item1;
md.Parameters[0].ParameterType.InheritsFromOrImplements(module.ImportReference(("Xamarin.Forms.Core", "Xamarin.Forms", "BindableObject"))), module).SingleOrDefault()?.Item1;

var attributes = new List<CustomAttribute>();
if (property != null && property.HasCustomAttributes)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
if (IsNullOrEmpty(value))
throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Binding)}", node);

var bindingCtor = module.ImportReferenceCached(typeof(Binding)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 6);
var bindingCtorRef = module.ImportReference(bindingCtor);

var bindingCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Binding"), paramCount: 6);
yield return Instruction.Create(OpCodes.Ldstr, value);
yield return Instruction.Create(OpCodes.Ldc_I4, (int)BindingMode.Default);
yield return Instruction.Create(OpCodes.Ldnull);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ IEnumerable<Instruction> GenerateIL(double x, double y, double w, double h, Modu
yield return Instruction.Create(OpCodes.Ldc_R8, w);
yield return Instruction.Create(OpCodes.Ldc_R8, h);

var rectangleCtor = module.ImportReferenceCached(typeof(Rectangle)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 4);
var rectangleCtorRef = module.ImportReference(rectangleCtor);
var rectangleCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), paramCount: 4);
yield return Instruction.Create(OpCodes.Newobj, rectangleCtorRef);
}
}
Expand Down
24 changes: 14 additions & 10 deletions Xamarin.Forms.Build.Tasks/CompiledConverters/ColorTypeConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,29 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
yield return Instruction.Create(OpCodes.Ldc_R8, color.G);
yield return Instruction.Create(OpCodes.Ldc_R8, color.B);
yield return Instruction.Create(OpCodes.Ldc_R8, color.A);
var colorCtor = module.ImportReferenceCached(typeof(Color)).ResolveCached().Methods.FirstOrDefault(
md => md.IsConstructor && md.Parameters.Count == 4 &&
md.Parameters.All(p => p.ParameterType.FullName == "System.Double"));
var colorCtorRef = module.ImportReference(colorCtor);

var colorCtorRef = module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
paramCount: 4,
predicate: md => md.Parameters.All(p => p.ParameterType.FullName == "System.Double"));
yield return Instruction.Create(OpCodes.Newobj, colorCtorRef);
yield break;
}
var parts = value.Split('.');
if (parts.Length == 1 || (parts.Length == 2 && parts [0] == "Color")) {
var color = parts [parts.Length - 1];

var field = module.ImportReferenceCached(typeof(Color)).ResolveCached().Fields.SingleOrDefault(fd => fd.Name == color && fd.IsStatic);
if (field != null) {
yield return Instruction.Create(OpCodes.Ldsfld, module.ImportReference(field));
var fieldReference = module.ImportFieldReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
color,
fd => fd.IsStatic);
if (fieldReference != null) {
yield return Instruction.Create(OpCodes.Ldsfld, fieldReference);
yield break;
}
var propertyGetter = module.ImportReferenceCached(typeof(Color)).ResolveCached().Properties.SingleOrDefault(pd => pd.Name == color && pd.GetMethod.IsStatic)?.GetMethod;
if (propertyGetter != null) {
yield return Instruction.Create(OpCodes.Call, module.ImportReference(propertyGetter));
var propertyGetterReference = module.ImportPropertyGetterReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Color"),
color,
pd => pd.GetMethod.IsStatic);
if (propertyGetterReference != null) {
yield return Instruction.Create(OpCodes.Call, propertyGetterReference);
yield break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Constraint)}", node);

yield return Instruction.Create(OpCodes.Ldc_R8, size);

var constantDef = module.ImportReferenceCached(typeof(Constraint)).ResolveCached().Methods.FirstOrDefault(md => md.IsStatic && md.Name == "Constant");
var constantRef = module.ImportReference(constantDef);
yield return Instruction.Create(OpCodes.Call, constantRef);
var constantReference = module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Constraint"),
methodName: "Constant",
paramCount: 1,
predicate: md => md.IsStatic);
yield return Instruction.Create(OpCodes.Call, constantReference);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
if (parts.Length == 1 || (parts.Length == 2 && parts [0] == "LayoutOptions")) {
var options = parts [parts.Length - 1];

var field = module.ImportReferenceCached(typeof(LayoutOptions)).ResolveCached().Fields.SingleOrDefault(fd => fd.Name == options && fd.IsStatic);
if (field != null) {
yield return Instruction.Create(OpCodes.Ldsfld, module.ImportReference(field));
var fieldReference = module.ImportFieldReference(("Xamarin.Forms.Core", "Xamarin.Forms", "LayoutOptions"),
fieldName: options,
predicate: fd => fd.IsStatic);
if (fieldReference != null) {
yield return Instruction.Create(OpCodes.Ldsfld, fieldReference);
yield break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,20 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
}
var parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToList();

var listCtor = module.ImportReferenceCached(typeof(List<>)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 1 && md.Parameters[0].ParameterType.FullName == "System.Int32");
var listCtorRef = module.ImportReference(listCtor);
listCtorRef = module.ImportReference(listCtorRef.ResolveGenericParameters(module.ImportReferenceCached(typeof(List<string>)), module));

var adder = module.ImportReferenceCached(typeof(ICollection<>)).ResolveCached().Methods.FirstOrDefault(md => md.Name == "Add" && md.Parameters.Count == 1);
var adderRef = module.ImportReference(adder);
adderRef = module.ImportReference(adderRef.ResolveGenericParameters(module.ImportReferenceCached(typeof(ICollection<string>)), module));
var add = module.ImportMethodReference(("mscorlib", "System.Collections.Generic", "ICollection`1"),
methodName: "Add",
paramCount: 1,
classArguments: new[] { ("mscorlib", "System", "String") });

yield return Instruction.Create(OpCodes.Ldc_I4, parts.Count);
yield return Instruction.Create(OpCodes.Newobj, listCtorRef);

yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("System.Collections", "System.Collections.Generic", "List`1"),
paramCount: 1,
predicate: md => md.Parameters[0].ParameterType.FullName == "System.Int32",
classArguments: new[] { ("mscorlib", "System", "String") }));
foreach (var part in parts) {
yield return Instruction.Create(OpCodes.Dup);
yield return Instruction.Create(OpCodes.Ldstr, part);
yield return Instruction.Create(OpCodes.Callvirt, adderRef);
yield return Instruction.Create(OpCodes.Callvirt, add);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,34 +44,26 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex

//keep the Uri for later
yield return Create(Dup);
var uriVarDef = new VariableDefinition(module.ImportReferenceCached(typeof(Uri)));
var uriVarDef = new VariableDefinition(module.ImportReference(("System", "System", "Uri")));
body.Variables.Add(uriVarDef);
yield return Create(Stloc, uriVarDef);

yield return Create(Ldstr, resourcePath); //resourcePath

var getTypeFromHandle = module.ImportReferenceCached(typeof(Type).GetMethod("GetTypeFromHandle", new[] { typeof(RuntimeTypeHandle) }));
var getTypeInfo = module.ImportReferenceCached(typeof(System.Reflection.IntrospectionExtensions).GetMethod("GetTypeInfo", new Type[] { typeof(Type) }));
var getAssembly = module.ImportReferenceCached(typeof(System.Reflection.TypeInfo).GetProperty("Assembly").GetMethod);
yield return Create(Ldtoken, module.ImportReference(((ILRootNode)rootNode).TypeReference));
yield return Create(Call, module.ImportReference(getTypeFromHandle));
yield return Create(Call, module.ImportReference(getTypeInfo));
yield return Create(Callvirt, module.ImportReference(getAssembly)); //assembly
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", paramCount: 1, predicate: md => md.IsStatic));
yield return Create(Callvirt, module.ImportPropertyGetterReference(("mscorlib", "System.Reflection", "TypeInfo"), propertyName: "Assembly", flatten: true));

foreach (var instruction in node.PushXmlLineInfo(context))
yield return instruction; //lineinfo

var setAndLoadSource = module.ImportReferenceCached(typeof(ResourceDictionary).GetMethod("SetAndLoadSource"));
yield return Create(Callvirt, module.ImportReference(setAndLoadSource));

yield return Create(Callvirt, module.ImportMethodReference(("Xamarin.Forms.Core", "Xamarin.Forms", "ResourceDictionary"), methodName: "SetAndLoadSource", paramCount: 4));
//ldloc the stored uri as return value
yield return Create(Ldloc, uriVarDef);
}

internal static string GetPathForType(ModuleDefinition module, TypeReference type)
{
foreach (var ca in type.Module.GetCustomAttributes()) {
if (!TypeRefComparer.Default.Equals(ca.AttributeType, module.ImportReferenceCached(typeof(XamlResourceIdAttribute))))
if (!TypeRefComparer.Default.Equals(ca.AttributeType, module.ImportReference(("Xamarin.Forms.Core", "Xamarin.Forms.Xaml", "XamlResourceIdAttribute"))))
continue;
if (!TypeRefComparer.Default.Equals(ca.ConstructorArguments[2].Value as TypeReference, type))
continue;
Expand All @@ -80,4 +72,4 @@ internal static string GetPathForType(ModuleDefinition module, TypeReference typ
return null;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,7 @@ IEnumerable<Instruction> GenerateIL(double x, double y, double w, double h, Modu
yield return Instruction.Create(OpCodes.Ldc_R8, w);
yield return Instruction.Create(OpCodes.Ldc_R8, h);

var rectangleCtor = module.ImportReferenceCached(typeof(Rectangle)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 4);
var rectangleCtorRef = module.ImportReference(rectangleCtor);
yield return Instruction.Create(OpCodes.Newobj, rectangleCtorRef);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Rectangle"), paramCount: 4));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,8 @@ IEnumerable<Instruction> GenerateIL(ModuleDefinition module, params double[] arg
{
foreach (var d in args)
yield return Instruction.Create(OpCodes.Ldc_R8, d);
var thicknessCtor = module.ImportReferenceCached(typeof(Thickness)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == args.Length);
var thicknessCtorRef = module.ImportReference(thicknessCtor);
yield return Instruction.Create(OpCodes.Newobj, thicknessCtorRef);
yield return Instruction.Create(OpCodes.Newobj, module.ImportCtorReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Thickness"),
paramCount: args.Length));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
if (typeRef == null)
goto error;

var getTypeFromHandle = module.ImportReferenceCached(typeof(Type).GetMethod("GetTypeFromHandle", new[] { typeof(RuntimeTypeHandle) }));
yield return Instruction.Create(OpCodes.Ldtoken, module.ImportReference(typeRef));
yield return Instruction.Create(OpCodes.Call, module.ImportReference(getTypeFromHandle));
yield return Instruction.Create(OpCodes.Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic));

yield break;

error:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ public IEnumerable<Instruction> ConvertFromString(string value, ILContext contex
yield break;
}

var uriCtor = module.ImportReferenceCached(typeof(Uri)).ResolveCached().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 2 && md.Parameters[1].ParameterType.FullName == "System.UriKind");
var uriCtorRef = module.ImportReference(uriCtor);

var uriCtorRef = module.ImportCtorReference(("System", "System", "Uri"),
paramCount: 2,
predicate: md => md.Parameters[1].ParameterType.FullName == "System.UriKind");
yield return Create(Ldstr, value);
yield return Create(Ldc_I4_0); //UriKind.RelativeOrAbsolute
yield return Create(Newobj, uriCtorRef);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class TypeExtension : ICompiledMarkupExtension
{
public IEnumerable<Instruction> ProvideValue(IElementNode node, ModuleDefinition module, ILContext context, out TypeReference memberRef)
{
memberRef = module.ImportReferenceCached(typeof(Type));
memberRef = module.ImportReference(("mscorlib", "System", "Type"));
INode typeNameNode;

var name = new XmlName("", "TypeName");
Expand All @@ -34,10 +34,10 @@ public IEnumerable<Instruction> ProvideValue(IElementNode node, ModuleDefinition

context.TypeExtensions[node] = typeref;

var getTypeFromHandle = module.ImportReferenceCached(typeof(Type).GetMethod("GetTypeFromHandle", new[] { typeof(RuntimeTypeHandle) }));
return new List<Instruction> {
Instruction.Create(OpCodes.Ldtoken, module.ImportReference(typeref)),
Instruction.Create(OpCodes.Call, module.ImportReference(getTypeFromHandle))
Instruction.Create(OpCodes.Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", paramCount: 1, predicate: md => md.IsStatic)),

};
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefr

var value = ((string)((ValueNode)valueNode).Value);

TypeReference _;
var setValueRef = module.ImportReference(module.ImportReferenceCached(typeof(Setter)).GetProperty(p => p.Name == "Value", out _).SetMethod);

//push the setter
yield return Instruction.Create(OpCodes.Ldloc, vardefref.VariableDefinition);

Expand All @@ -45,7 +42,7 @@ public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefr
yield return instruction;

//set the value
yield return Instruction.Create(OpCodes.Callvirt, setValueRef);
yield return Instruction.Create(OpCodes.Callvirt, module.ImportPropertySetterReference(("Xamarin.Forms.Core", "Xamarin.Forms", "Setter"), propertyName: "Value"));
}

static bool SetterValueIsCollection(FieldReference bindablePropertyReference, ModuleDefinition module, BaseNode node, ILContext context)
Expand Down
Loading