Example #1
0
        public void GroupMethodsByDeclaringType()
        {
            string program = @"
class Base {
	public virtual void Method() {}
}
class Middle : Base {
	public void Method(int p) {}
}
class Derived : Middle {
	public override void Method() {}
}";

            Parse(program);
            ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(new TopLevelTypeName("Derived"));
            var             rr      = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList <IType> .Instance, true) as MethodGroupResolveResult;

            Assert.AreEqual(2, rr.MethodsGroupedByDeclaringType.Count());

            var baseGroup = rr.MethodsGroupedByDeclaringType.ElementAt(0);

            Assert.AreEqual("Base", baseGroup.DeclaringType.ReflectionName);
            Assert.AreEqual(1, baseGroup.Count);
            Assert.AreEqual("Derived.Method", baseGroup[0].FullName);

            var middleGroup = rr.MethodsGroupedByDeclaringType.ElementAt(1);

            Assert.AreEqual("Middle", middleGroup.DeclaringType.ReflectionName);
            Assert.AreEqual(1, middleGroup.Count);
            Assert.AreEqual("Middle.Method", middleGroup[0].FullName);
        }
Example #2
0
        public void GenericMethod()
        {
            string program = @"
            class Base {
            public virtual void Method<T>(T a) {}
            }
            class Derived : Base {
            public override void Method<S>(S a) {}
            }";
            var parsedFile = Parse(program);
            ITypeDefinition derived = compilation.MainAssembly.GetTypeDefinition(parsedFile.TopLevelTypeDefinitions[1]);
            var rr = lookup.Lookup(new ResolveResult(derived), "Method", EmptyList<IType>.Instance, true) as MethodGroupResolveResult;
            Assert.AreEqual(1, rr.MethodsGroupedByDeclaringType.Count());

            var baseGroup = rr.MethodsGroupedByDeclaringType.ElementAt(0);
            Assert.AreEqual("Base", baseGroup.DeclaringType.ReflectionName);
            Assert.AreEqual(1, baseGroup.Count);
            Assert.AreEqual("Derived.Method", baseGroup[0].FullName);
            Assert.AreEqual("``0", baseGroup[0].Parameters[0].Type.ReflectionName);
        }
		ResolveResult ResolveAttributeValue(IMember propertyOrEvent, AXmlAttribute attribute, CancellationToken cancellationToken)
		{
			IUnresolvedTypeDefinition typeDefinition = parseInfo.UnresolvedFile.TypeDefinition;
			if (typeDefinition != null) {
				IType type = typeDefinition.Resolve(new SimpleTypeResolveContext(compilation.MainAssembly));
				if (propertyOrEvent is IEvent) {
					var memberLookup = new MemberLookup(type.GetDefinition(), compilation.MainAssembly);
					var rr = memberLookup.Lookup(new ThisResolveResult(type), attribute.Value, EmptyList<IType>.Instance, false);
					if (rr is MethodGroupResolveResult) {
						Conversion conversion = CSharpConversions.Get(compilation).ImplicitConversion(rr, propertyOrEvent.ReturnType);
						IMethod method = conversion.Method;
						if (method == null)
							method = ((MethodGroupResolveResult)rr).Methods.FirstOrDefault();
						if (method != null)
							return new MemberResolveResult(null, method);
					}
					return rr;
				}
				if (propertyOrEvent.Name == "Name") {
					IField field = type.GetFields(f => f.Name == attribute.Value).FirstOrDefault();
					if (field != null)
						return new MemberResolveResult(null, field);
				}
				if (propertyOrEvent.ReturnType.Kind == TypeKind.Enum) {
					IField field = propertyOrEvent.ReturnType.GetFields(f => f.Name == attribute.Value).FirstOrDefault();
					if (field != null)
						return new MemberResolveResult(null, field);
				}
				// TODO might be a markup extension
				return new UnknownMemberResolveResult(type, attribute.Value, EmptyList<IType>.Instance);
			}
			return ErrorResolveResult.UnknownError;
		}