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); }
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; }