예제 #1
0
        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"));
            }
        }
예제 #2
0
        /// <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"));
            }
        }
예제 #3
0
        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
                );
        }