private static bool TryGetBuilderMember <TSymbol>( SyntheticBoundNodeFactory F, WellKnownMember?member, NamedTypeSymbol builderType, bool customBuilder, out TSymbol symbol ) where TSymbol : Symbol { if (!member.HasValue) { symbol = null; return(true); } WellKnownMember memberValue = member.Value; if (customBuilder) { var descriptor = WellKnownMembers.GetDescriptor(memberValue); var sym = CSharpCompilation.GetRuntimeMember( builderType.OriginalDefinition, descriptor, F.Compilation.WellKnownMemberSignatureComparer, accessWithinOpt: null ); if ((object)sym != null) { sym = sym.SymbolAsMember(builderType); } symbol = sym as TSymbol; } else { symbol = F.WellKnownMember(memberValue, isOptional: true) as TSymbol; if ((object)symbol != null) { symbol = (TSymbol)symbol.SymbolAsMember(builderType); } } if ((object)symbol == null) { var descriptor = WellKnownMembers.GetDescriptor(memberValue); var diagnostic = new CSDiagnostic( new CSDiagnosticInfo( ErrorCode.ERR_MissingPredefinedMember, ( customBuilder ? (object)builderType : descriptor.DeclaringTypeMetadataName ), descriptor.Name ), F.Syntax.Location ); F.Diagnostics.Add(diagnostic); return(false); } return(true); }
private static bool TryCreate( SyntheticBoundNodeFactory F, bool customBuilder, NamedTypeSymbol builderType, TypeSymbol resultType, MethodSymbol createBuilderMethod, PropertySymbol taskProperty, WellKnownMember?setException, WellKnownMember setResult, WellKnownMember awaitOnCompleted, WellKnownMember awaitUnsafeOnCompleted, WellKnownMember start, WellKnownMember?setStateMachine, out AsyncMethodBuilderMemberCollection collection) { MethodSymbol setExceptionMethod; MethodSymbol setResultMethod; MethodSymbol awaitOnCompletedMethod; MethodSymbol awaitUnsafeOnCompletedMethod; MethodSymbol startMethod; MethodSymbol setStateMachineMethod; if (TryGetBuilderMember(F, setException, builderType, customBuilder, out setExceptionMethod) && TryGetBuilderMember(F, setResult, builderType, customBuilder, out setResultMethod) && TryGetBuilderMember(F, awaitOnCompleted, builderType, customBuilder, out awaitOnCompletedMethod) && TryGetBuilderMember(F, awaitUnsafeOnCompleted, builderType, customBuilder, out awaitUnsafeOnCompletedMethod) && TryGetBuilderMember(F, start, builderType, customBuilder, out startMethod) && TryGetBuilderMember(F, setStateMachine, builderType, customBuilder, out setStateMachineMethod)) { collection = new AsyncMethodBuilderMemberCollection( builderType, resultType, createBuilderMethod, setExceptionMethod, setResultMethod, awaitOnCompletedMethod, awaitUnsafeOnCompletedMethod, startMethod, setStateMachineMethod, taskProperty, checkGenericMethodConstraints: customBuilder); return(true); } collection = default(AsyncMethodBuilderMemberCollection); return(false); }
private bool CheckIfAttributeShouldBeEmbedded(DiagnosticBag diagnosticsOpt, Location locationOpt, WellKnownType attributeType, WellKnownMember attributeCtor, WellKnownMember?secondAttributeCtor = null) { var userDefinedAttribute = GetWellKnownType(attributeType); if (userDefinedAttribute is MissingMetadataTypeSymbol) { if (Options.OutputKind == OutputKind.NetModule) { if (diagnosticsOpt != null) { var errorReported = Binder.ReportUseSiteDiagnostics(userDefinedAttribute, diagnosticsOpt, locationOpt); Debug.Assert(errorReported); } } else { return(true); } } else if (diagnosticsOpt != null) { // This should produce diagnostics if the member is missing or bad var member = Binder.GetWellKnownTypeMember(this, attributeCtor, diagnosticsOpt, locationOpt); if (member != null && secondAttributeCtor != null) { Binder.GetWellKnownTypeMember(this, secondAttributeCtor.Value, diagnosticsOpt, locationOpt); } } return(false); }