using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Microsoft.Cci; using Microsoft.CodeAnalysis.CSharp.Emit; using Microsoft.CodeAnalysis.CSharp.Emit.NoPia; using Microsoft.CodeAnalysis.CSharp.Symbols.PublicModel; using Microsoft.CodeAnalysis.Emit; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols; internal abstract class EventSymbol : Symbol, IEventDefinition, ITypeDefinitionMember, ITypeMemberReference, IReference, INamedEntity, IDefinition { IMethodReference IEventDefinition.Adder => (IMethodReference)(object)AdaptedEventSymbol.AddMethod?.GetCciAdapter(); IMethodReference IEventDefinition.Remover => (IMethodReference)(object)AdaptedEventSymbol.RemoveMethod?.GetCciAdapter(); bool IEventDefinition.IsRuntimeSpecial => AdaptedEventSymbol.HasRuntimeSpecialName; bool IEventDefinition.IsSpecialName => AdaptedEventSymbol.HasSpecialName; IMethodReference? IEventDefinition.Caller => null; ITypeDefinition ITypeDefinitionMember.ContainingTypeDefinition => (ITypeDefinition)(object)AdaptedEventSymbol.ContainingType.GetCciAdapter(); TypeMemberVisibility ITypeDefinitionMember.Visibility => PEModuleBuilder.MemberVisibility(AdaptedEventSymbol); string INamedEntity.Name => AdaptedEventSymbol.MetadataName; internal EventSymbol AdaptedEventSymbol => this; internal virtual bool HasRuntimeSpecialName => false; public new virtual EventSymbol OriginalDefinition => this; protected sealed override Symbol OriginalSymbolDefinition => OriginalDefinition; public abstract TypeWithAnnotations TypeWithAnnotations { get; } public TypeSymbol Type => TypeWithAnnotations.Type; public abstract MethodSymbol? AddMethod { get; } public abstract MethodSymbol? RemoveMethod { get; } internal bool HasAssociatedField => (object)AssociatedField != null; public virtual bool RequiresInstanceReceiver => !IsStatic; public abstract bool IsWindowsRuntimeEvent { get; } internal virtual bool IsDirectlyExcludedFromCodeCoverage => false; internal abstract bool HasSpecialName { get; } internal virtual FieldSymbol? AssociatedField => null; public EventSymbol? OverriddenEvent { get { if (IsOverride) { if (base.IsDefinition) { return (EventSymbol)OverriddenOrHiddenMembers.GetOverriddenMember(); } return (EventSymbol)OverriddenOrHiddenMembersResult.GetOverriddenMember(this, OriginalDefinition.OverriddenEvent); } return null; } } internal virtual OverriddenOrHiddenMembersResult OverriddenOrHiddenMembers => this.MakeOverriddenOrHiddenMembers(); internal bool HidesBaseEventsByName => (AddMethod ?? RemoveMethod)?.HidesBaseMethodsByName ?? false; internal virtual bool IsExplicitInterfaceImplementation => ExplicitInterfaceImplementations.Any(); public abstract ImmutableArray ExplicitInterfaceImplementations { get; } public sealed override SymbolKind Kind => (SymbolKind)5; internal abstract bool MustCallMethodsDirectly { get; } public sealed override bool HasUnsupportedMetadata { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) DiagnosticInfo diagnosticInfo = GetUseSiteInfo().DiagnosticInfo; bool flag = diagnosticInfo != null; if (flag) { int code = diagnosticInfo.Code; bool flag2 = ((code == 570 || code == 9041) ? true : false); flag = flag2; } return flag; } } IEnumerable IEventDefinition.GetAccessors(EmitContext context) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) MethodSymbol methodSymbol = AdaptedEventSymbol.AddMethod?.GetCciAdapter(); if (Extensions.ShouldInclude((ITypeDefinitionMember)(object)methodSymbol, context)) { yield return (IMethodReference)(object)methodSymbol; } MethodSymbol methodSymbol2 = AdaptedEventSymbol.RemoveMethod?.GetCciAdapter(); if (Extensions.ShouldInclude((ITypeDefinitionMember)(object)methodSymbol2, context)) { yield return (IMethodReference)(object)methodSymbol2; } } ITypeReference IEventDefinition.GetType(EmitContext context) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) return ((PEModuleBuilder)(PEModuleBuilder)(object)context.Module).Translate(AdaptedEventSymbol.Type, (SyntaxNode)(object)(CSharpSyntaxNode)(object)((EmitContext)(ref context)).SyntaxNode, context.Diagnostics); } ITypeReference ITypeMemberReference.GetContainingType(EmitContext context) { return (ITypeReference)(object)AdaptedEventSymbol.ContainingType.GetCciAdapter(); } void IReference.Dispatch(MetadataVisitor visitor) { visitor.Visit((IEventDefinition)(object)this); } IDefinition IReference.AsDefinition(EmitContext context) { return (IDefinition)(object)this; } internal new EventSymbol GetCciAdapter() { return this; } internal EventSymbol() { } public ImmutableArray GetFieldAttributes() { if ((object)AssociatedField != null) { return AssociatedField.GetAttributes(); } return ImmutableArray.Empty; } internal EventSymbol GetLeastOverriddenEvent(NamedTypeSymbol? accessingTypeOpt) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) accessingTypeOpt = accessingTypeOpt?.OriginalDefinition; EventSymbol eventSymbol = this; while (eventSymbol.IsOverride && !eventSymbol.HidesBaseEventsByName) { EventSymbol overriddenEvent = eventSymbol.OverriddenEvent; CompoundUseSiteInfo useSiteInfo = CompoundUseSiteInfo.Discarded; if ((object)overriddenEvent == null || ((object)accessingTypeOpt != null && !AccessCheck.IsSymbolAccessible(overriddenEvent, accessingTypeOpt, ref useSiteInfo))) { break; } eventSymbol = overriddenEvent; } return eventSymbol; } internal override TResult Accept(CSharpSymbolVisitor visitor, TArgument argument) { return visitor.VisitEvent(this, argument); } public override void Accept(CSharpSymbolVisitor visitor) { visitor.VisitEvent(this); } public override TResult Accept(CSharpSymbolVisitor visitor) { return visitor.VisitEvent(this); } internal EventSymbol AsMember(NamedTypeSymbol newOwner) { if (!newOwner.IsDefinition) { return new SubstitutedEventSymbol(newOwner as SubstitutedNamedTypeSymbol, this); } return this; } internal override UseSiteInfo GetUseSiteInfo() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (base.IsDefinition) { return new UseSiteInfo(base.PrimaryDependency); } return OriginalDefinition.GetUseSiteInfo(); } internal bool CalculateUseSiteDiagnostic(ref UseSiteInfo result) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (DeriveUseSiteInfoFromType(ref result, TypeWithAnnotations, AllowedRequiredModifierType.None)) { return true; } if (ContainingModule.HasUnifiedReferences) { HashSet checkedTypes = null; DiagnosticInfo result2 = result.DiagnosticInfo; if (TypeWithAnnotations.GetUnificationUseSiteDiagnosticRecursive(ref result2, this, ref checkedTypes)) { result = result.AdjustDiagnosticInfo(result2); return true; } result = result.AdjustDiagnosticInfo(result2); } return false; } protected sealed override bool IsHighestPriorityUseSiteErrorCode(int code) { if (code == 570 || code == 9041) { return true; } return false; } protected sealed override ISymbol CreateISymbol() { return (ISymbol)(object)new Microsoft.CodeAnalysis.CSharp.Symbols.PublicModel.EventSymbol(this); } public override bool Equals(Symbol? obj, TypeCompareKind compareKind) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (!(obj is EventSymbol eventSymbol)) { return false; } if ((object)this == eventSymbol) { return true; } if (TypeSymbol.Equals(ContainingType, eventSymbol.ContainingType, compareKind)) { return (object)OriginalDefinition == eventSymbol.OriginalDefinition; } return false; } public override int GetHashCode() { int num = 1; num = Hash.Combine(ContainingType, num); return Hash.Combine(Name, num); } }