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>
        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.º 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>
        /// <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.º 3
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);
        }