private bool IsPubliclyVisible(MetadataReader referenceMetadata, EventDefinition eventDefinition, bool checkDeclaringType = false) { EventAccessors eventAccessors = eventDefinition.GetAccessors(); if (!eventAccessors.Adder.IsNil) { MethodDefinition adderMethodDefinition = referenceMetadata.GetMethodDefinition(eventAccessors.Adder); if (IsPubliclyVisible(referenceMetadata, adderMethodDefinition, checkDeclaringType)) return true; } if (!eventAccessors.Remover.IsNil) { MethodDefinition removerMethodDefinition = referenceMetadata.GetMethodDefinition(eventAccessors.Remover); if (IsPubliclyVisible(referenceMetadata, removerMethodDefinition, checkDeclaringType)) return true; } if (!eventAccessors.Raiser.IsNil) { MethodDefinition raiserMethodDefinition = referenceMetadata.GetMethodDefinition(eventAccessors.Raiser); if (IsPubliclyVisible(referenceMetadata, raiserMethodDefinition, checkDeclaringType)) return true; } return false; }
private Event HandleEvent(Cts.Ecma.EcmaModule module, Ecma.EventDefinitionHandle eventHandle) { Ecma.MetadataReader reader = module.MetadataReader; Ecma.EventDefinition eventDef = reader.GetEventDefinition(eventHandle); Ecma.EventAccessors acc = eventDef.GetAccessors(); Cts.MethodDesc adderMethod = acc.Adder.IsNil ? null : module.GetMethod(acc.Adder); Cts.MethodDesc raiserMethod = acc.Raiser.IsNil ? null : module.GetMethod(acc.Raiser); Cts.MethodDesc removerMethod = acc.Remover.IsNil ? null : module.GetMethod(acc.Remover); bool adderHasMetadata = adderMethod != null && _policy.GeneratesMetadata(adderMethod); bool raiserHasMetadata = raiserMethod != null && _policy.GeneratesMetadata(raiserMethod); bool removerHasMetadata = removerMethod != null && _policy.GeneratesMetadata(removerMethod); // Policy: If none of the accessors has metadata, event doesn't have metadata if (!adderHasMetadata && !raiserHasMetadata && !removerHasMetadata) { return(null); } Event result = new Event { Name = HandleString(reader.GetString(eventDef.Name)), Flags = eventDef.Attributes, Type = HandleType(module.GetType(eventDef.Type)), }; if (adderHasMetadata) { result.MethodSemantics.Add(new MethodSemantics { Attributes = MethodSemanticsAttributes.AddOn, Method = HandleMethodDefinition(adderMethod), }); } if (raiserHasMetadata) { result.MethodSemantics.Add(new MethodSemantics { Attributes = MethodSemanticsAttributes.Fire, Method = HandleMethodDefinition(raiserMethod), }); } if (removerHasMetadata) { result.MethodSemantics.Add(new MethodSemantics { Attributes = MethodSemanticsAttributes.RemoveOn, Method = HandleMethodDefinition(removerMethod), }); } Ecma.CustomAttributeHandleCollection customAttributes = eventDef.GetCustomAttributes(); if (customAttributes.Count > 0) { result.CustomAttributes = HandleCustomAttributes(module, customAttributes); } return(result); }
private string GetMetadataName(MetadataReader metadataReader, EventDefinition eventDefinition, TypeDefinition declaringTypeDefinition) { string typeName = GetMetadataName(metadataReader, declaringTypeDefinition); string eventName = metadataReader.GetString(eventDefinition.Name); return string.Format("{0}.{1}", typeName, eventName); }