protected sealed override void MethodChecks(DiagnosticBag diagnostics) { Debug.Assert(_lazyParameters.IsDefault != _lazyReturnType.HasType); // CONSIDER: currently, we're copying the custom modifiers of the event overridden // by this method's associated event (by using the associated event's type, which is // copied from the overridden event). It would be more correct to copy them from // the specific accessor that this method is overriding (as in SourceMemberMethodSymbol). if (_lazyReturnType.IsDefault) { CSharpCompilation compilation = this.DeclaringCompilation; Debug.Assert(compilation != null); // NOTE: LazyMethodChecks calls us within a lock, so we use regular assignments, // rather than Interlocked.CompareExchange. if (_event.IsWindowsRuntimeEvent) { TypeSymbol eventTokenType = compilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_WindowsRuntime_EventRegistrationToken); Binder.ReportUseSiteDiagnostics(eventTokenType, diagnostics, this.Location); if (this.MethodKind == MethodKind.EventAdd) { // EventRegistrationToken add_E(EventDelegate d); // Leave the returns void bit in this.flags false. _lazyReturnType = TypeWithAnnotations.Create(eventTokenType); var parameter = new SynthesizedAccessorValueParameterSymbol(this, _event.TypeWithAnnotations, 0); _lazyParameters = ImmutableArray.Create <ParameterSymbol>(parameter); } else { Debug.Assert(this.MethodKind == MethodKind.EventRemove); // void remove_E(EventRegistrationToken t); TypeSymbol voidType = compilation.GetSpecialType(SpecialType.System_Void); Binder.ReportUseSiteDiagnostics(voidType, diagnostics, this.Location); _lazyReturnType = TypeWithAnnotations.Create(voidType); this.SetReturnsVoid(returnsVoid: true); var parameter = new SynthesizedAccessorValueParameterSymbol(this, TypeWithAnnotations.Create(eventTokenType), 0); _lazyParameters = ImmutableArray.Create <ParameterSymbol>(parameter); } } else { // void add_E(EventDelegate d); // void remove_E(EventDelegate d); TypeSymbol voidType = compilation.GetSpecialType(SpecialType.System_Void); Binder.ReportUseSiteDiagnostics(voidType, diagnostics, this.Location); _lazyReturnType = TypeWithAnnotations.Create(voidType); this.SetReturnsVoid(returnsVoid: true); var parameter = new SynthesizedAccessorValueParameterSymbol(this, _event.TypeWithAnnotations, 0); _lazyParameters = ImmutableArray.Create <ParameterSymbol>(parameter); } } }
protected sealed override void MethodChecks(DiagnosticBag diagnostics) { Debug.Assert(this.lazyParameters.IsDefault == ((object)this.lazyReturnType == null)); // CONSIDER: currently, we're copying the custom modifiers of the event overridden // by this method's associated event (by using the associated event's type, which is // copied from the overridden event). It would be more correct to copy them from // the specific accessor that this method is overriding (as in SourceMemberMethodSymbol). if ((object)this.lazyReturnType == null) { Debug.Assert((this.flags & MakeReturnsVoidFlags(returnsVoid: true)) == 0, "Default should be false so we never have to clear the bit."); CSharpCompilation compilation = this.DeclaringCompilation; Debug.Assert(compilation != null); // NOTE: LazyMethodChecks calls us within a lock, so we use regular assignments, // rather than Interlocked.CompareExchange. if ([email protected]) { TypeSymbol eventTokenType = compilation.GetWellKnownType(WellKnownType.System_Runtime_InteropServices_WindowsRuntime_EventRegistrationToken); Binder.ReportUseSiteDiagnostics(eventTokenType, diagnostics, this.Location); if (this.MethodKind == MethodKind.EventAdd) { // EventRegistrationToken add_E(EventDelegate d); // Leave the returns void bit in this.flags false. this.lazyReturnType = eventTokenType; var parameter = new SynthesizedAccessorValueParameterSymbol(this, [email protected], 0, ImmutableArray<CustomModifier>.Empty); this.lazyParameters = ImmutableArray.Create<ParameterSymbol>(parameter); } else { Debug.Assert(this.MethodKind == MethodKind.EventRemove); // void remove_E(EventRegistrationToken t); TypeSymbol voidType = compilation.GetSpecialType(SpecialType.System_Void); Binder.ReportUseSiteDiagnostics(voidType, diagnostics, this.Location); this.lazyReturnType = voidType; this.flags |= MakeReturnsVoidFlags(returnsVoid: true); var parameter = new SynthesizedAccessorValueParameterSymbol(this, eventTokenType, 0, ImmutableArray<CustomModifier>.Empty); this.lazyParameters = ImmutableArray.Create<ParameterSymbol>(parameter); } } else { // void add_E(EventDelegate d); // void remove_E(EventDelegate d); TypeSymbol voidType = compilation.GetSpecialType(SpecialType.System_Void); Binder.ReportUseSiteDiagnostics(voidType, diagnostics, this.Location); this.lazyReturnType = voidType; this.flags |= MakeReturnsVoidFlags(returnsVoid: true); var parameter = new SynthesizedAccessorValueParameterSymbol(this, [email protected], 0, ImmutableArray<CustomModifier>.Empty); this.lazyParameters = ImmutableArray.Create<ParameterSymbol>(parameter); } } }