private MethodSymbol GetSpecialTypeMethod(SyntaxNode syntax, SpecialMember specialMember) { MethodSymbol method; if (Binder.TryGetSpecialTypeMember(_compilation, specialMember, syntax, _diagnostics, out method)) { return(method); } else { MemberDescriptor descriptor = SpecialMembers.GetDescriptor(specialMember); SpecialType type = (SpecialType)descriptor.DeclaringTypeId; TypeSymbol container = _compilation.Assembly.GetSpecialType(type); TypeSymbol returnType = new ExtendedErrorTypeSymbol(compilation: _compilation, name: descriptor.Name, errorInfo: null, arity: descriptor.Arity); return(new ErrorMethodSymbol(container, returnType, "Missing")); } }
/// <summary> /// This function provides a false sense of security, it is likely going to surprise you when the requested member is missing. /// Recommendation: Do not use, use <see cref="TryGetSpecialTypeMethod(SyntaxNode, SpecialMember, CSharpCompilation, DiagnosticBag, out MethodSymbol)"/> instead! /// If used, a unit-test with a missing member is absolutely a must have. /// </summary> private static MethodSymbol UnsafeGetSpecialTypeMethod(SyntaxNode syntax, SpecialMember specialMember, CSharpCompilation compilation, DiagnosticBag diagnostics) { MethodSymbol method; if (TryGetSpecialTypeMethod(syntax, specialMember, compilation, diagnostics, out method)) { return(method); } else { MemberDescriptor descriptor = SpecialMembers.GetDescriptor(specialMember); SpecialType type = (SpecialType)descriptor.DeclaringTypeId; TypeSymbol container = compilation.Assembly.GetSpecialType(type); TypeSymbol returnType = new ExtendedErrorTypeSymbol(compilation: compilation, name: descriptor.Name, errorInfo: null, arity: descriptor.Arity); return(new ErrorMethodSymbol(container, returnType, "Missing")); } }
internal override void LookupSymbolsInSingleBinder( LookupResult result, string name, int arity, ConsList <TypeSymbol> basesBeingResolved, LookupOptions options, Binder originalBinder, bool diagnose, ref CompoundUseSiteInfo <AssemblySymbol> useSiteInfo ) { Debug.Assert(result.IsClear); if (IsSubmissionClass) { this.LookupMembersInternal( result, _container, name, arity, basesBeingResolved, options, originalBinder, diagnose, ref useSiteInfo ); return; } var imports = GetImports(basesBeingResolved); // first lookup members of the namespace if ((options & LookupOptions.NamespaceAliasesOnly) == 0 && _container != null) { this.LookupMembersInternal( result, _container, name, arity, basesBeingResolved, options, originalBinder, diagnose, ref useSiteInfo ); if (result.IsMultiViable) { // symbols cannot conflict with using alias names if ( arity == 0 && imports.IsUsingAlias(name, originalBinder.IsSemanticModelBinder) ) { CSDiagnosticInfo diagInfo = new CSDiagnosticInfo( ErrorCode.ERR_ConflictAliasAndMember, name, _container ); var error = new ExtendedErrorTypeSymbol( (NamespaceOrTypeSymbol)null, name, arity, diagInfo, unreported: true ); result.SetFrom(LookupResult.Good(error)); // force lookup to be done w/ error symbol as result } return; } } // next try using aliases or symbols in imported namespaces imports.LookupSymbol( originalBinder, result, name, arity, basesBeingResolved, options, diagnose, ref useSiteInfo ); }