Ejemplo n.º 1
0
        /// <summary>
        /// Returns binder that binds usings and aliases
        /// </summary>
        /// <param name="unit">
        /// Specify <see cref="NamespaceDeclarationSyntax"/> imports in the corresponding namespace, or
        /// <see cref="CompilationUnitSyntax"/> for top-level imports.
        /// </param>
        /// <param name="inUsing">True if the binder will be used to bind a using directive.</param>
        internal Binder GetImportsBinder(CSharpSyntaxNode unit, bool inUsing = false)
        {
            switch (unit.Kind())
            {
            case SyntaxKind.NamespaceDeclaration:
            {
                BinderFactoryVisitor visitor = _binderFactoryVisitorPool.Allocate();
                visitor.Initialize(0, null, null);
                Binder result = visitor.VisitNamespaceDeclaration((NamespaceDeclarationSyntax)unit, unit.SpanStart, inBody: true, inUsing: inUsing);
                _binderFactoryVisitorPool.Free(visitor);
                return(result);
            }

            case SyntaxKind.CompilationUnit:
                // imports are bound by the Script class binder:
            {
                BinderFactoryVisitor visitor = _binderFactoryVisitorPool.Allocate();
                visitor.Initialize(0, null, null);
                Binder result = visitor.VisitCompilationUnit((CompilationUnitSyntax)unit, inUsing: inUsing, inScript: InScript);
                _binderFactoryVisitorPool.Free(visitor);
                return(result);
            }

            default:
                return(null);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Returns binder that binds usings and aliases
        /// </summary>
        /// <param name="unit">
        /// Specify <see cref="NamespaceDeclarationSyntax"/> imports in the corresponding namespace, or
        /// <see cref="CompilationUnitSyntax"/> for top-level imports.
        /// </param>
        internal InContainerBinder GetImportsBinder(CSharpSyntaxNode unit)
        {
            switch (unit.Kind)
            {
            case SyntaxKind.NamespaceDeclaration:
            {
                BinderFactoryVisitor visitor = binderFactoryVisitorPool.Allocate();
                visitor.Position = 0;
                var result = visitor.VisitNamespaceDeclaration((NamespaceDeclarationSyntax)unit, unit.SpanStart, inBody: true, inUsing: false);
                binderFactoryVisitorPool.Free(visitor);
                return(result);
            }

            case SyntaxKind.CompilationUnit:
                // imports are bound by the Script class binder:
            {
                BinderFactoryVisitor visitor = binderFactoryVisitorPool.Allocate();
                visitor.Position = 0;
                var result = visitor.VisitCompilationUnit((CompilationUnitSyntax)unit, inUsing: false, inScript: InScript);
                binderFactoryVisitorPool.Free(visitor);
                return(result);
            }

            default:
                return(null);
            }
        }
Ejemplo n.º 3
0
    public Binder GetBinder(SourceNode node, ISymbol?containingSymbol = null)
    {
        var visitor = new BinderFactoryVisitor(this, containingSymbol);
        var binder  = visitor.Visit(node);

        return(binder);
    }
Ejemplo n.º 4
0
        internal Binder GetInRecordBodyBinder(RecordDeclarationSyntax typeDecl)
        {
            BinderFactoryVisitor visitor = _binderFactoryVisitorPool.Allocate();

            visitor.Initialize(position: typeDecl.SpanStart, memberDeclarationOpt: null, memberOpt: null);
            Binder resultBinder = visitor.VisitTypeDeclarationCore(typeDecl, NodeUsage.NamedTypeBodyOrTypeParameters);

            _binderFactoryVisitorPool.Free(visitor);

            return(resultBinder);
        }
Ejemplo n.º 5
0
        internal Binder GetBinder(SyntaxNode node, int position, CSharpSyntaxNode memberDeclarationOpt = null, Symbol memberOpt = null)
        {
            Debug.Assert(node != null);

            BinderFactoryVisitor visitor = _binderFactoryVisitorPool.Allocate();

            visitor.Initialize(position, memberDeclarationOpt, memberOpt);
            Binder result = visitor.Visit(node);

            _binderFactoryVisitorPool.Free(visitor);

            return(result);
        }
Ejemplo n.º 6
0
        internal Binder GetBinder(CSharpSyntaxNode node, int position)
        {
            Debug.Assert(node != null);

            Binder result = null;

            BinderFactoryVisitor visitor = binderFactoryVisitorPool.Allocate();

            visitor.Position = position;
            result           = node.Accept(visitor);
            binderFactoryVisitorPool.Free(visitor);

            return(result);
        }
Ejemplo n.º 7
0
        internal InMethodBinder GetRecordConstructorInMethodBinder(SynthesizedRecordConstructor constructor)
        {
            RecordDeclarationSyntax typeDecl = constructor.GetSyntax();

            var extraInfo = NodeUsage.ConstructorBodyOrInitializer;
            var key       = BinderFactoryVisitor.CreateBinderCacheKey(typeDecl, extraInfo);

            if (!_binderCache.TryGetValue(key, out Binder resultBinder))
            {
                // Ctors cannot be generic
                Debug.Assert(constructor.Arity == 0, "Generic Ctor, What to do?");
                resultBinder = new InMethodBinder(constructor, GetInRecordBodyBinder(typeDecl));

                _binderCache.TryAdd(key, resultBinder);
            }

            return((InMethodBinder)resultBinder);
        }
Ejemplo n.º 8
0
        internal InteractiveUsingsBinder GetInteractiveUsingsBinder()
        {
            Debug.Assert(compilation.IsSubmission);

            BinderFactoryVisitor visitor = binderFactoryVisitorPool.Allocate();

            visitor.Position = 0;

            Binder binder = visitor.VisitCompilationUnit(syntaxTree.GetCompilationUnitRoot(), inUsing: false, inScript: true);

            binderFactoryVisitorPool.Free(visitor);

            if (compilation.HostObjectType != null)
            {
                binder = binder.Next;
                Debug.Assert(binder is HostObjectModelBinder);
            }

            Debug.Assert(binder.Next is InContainerBinder);

            return((InteractiveUsingsBinder)binder.Next.Next);
        }