/// <summary> /// Get the symbol for a well-known member. The use of this method to get a well-known member /// that does not exist will result in an exception of type MissingPredefinedMember being thrown /// containing an appropriate diagnostic for the caller to report. /// </summary> /// <param name="wm">The desired well-known member</param> /// <param name="isOptional">If true, the method may return null for a missing member without an exception</param> /// <returns>A symbol for the well-known member, or null if it is missing and isOptions == true</returns> public Symbol WellKnownMember(WellKnownMember wm, bool isOptional = false) { Symbol wellKnownMember = Binder.GetWellKnownTypeMember(Compilation, wm, Diagnostics, syntax: Syntax, isOptional: true); if (wellKnownMember == null && !isOptional) { RuntimeMembers.MemberDescriptor memberDescriptor = WellKnownMembers.GetDescriptor(wm); WellKnownType containingType = (WellKnownType)memberDescriptor.DeclaringTypeId; var diagnostic = new CSDiagnostic(new CSDiagnosticInfo(ErrorCode.ERR_MissingPredefinedMember, containingType.GetMetadataName(), memberDescriptor.Name), Syntax.Location); throw new MissingPredefinedMember(diagnostic); } return(wellKnownMember); }
/// <summary> /// Get the symbol for a special member. The use of this method to get a special member /// that does not exist will result in an exception of type MissingPredefinedMember being thrown /// containing an appropriate diagnostic for the caller to report. /// </summary> /// <param name="sm">The desired special member</param> /// <returns>A symbol for the special member.</returns> public Symbol SpecialMember(SpecialMember sm) { Symbol specialMember = Compilation.GetSpecialTypeMember(sm); if (specialMember == null) { RuntimeMembers.MemberDescriptor memberDescriptor = SpecialMembers.GetDescriptor(sm); SpecialType containingType = (SpecialType)memberDescriptor.DeclaringTypeId; var diagnostic = new CSDiagnostic(new CSDiagnosticInfo(ErrorCode.ERR_MissingPredefinedMember, containingType.GetMetadataName(), memberDescriptor.Name), Syntax.Location); throw new MissingPredefinedMember(diagnostic); } Binder.ReportUseSiteDiagnostics(specialMember, Diagnostics, Syntax); return(specialMember); }