/// <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); } }
/// <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); } }
public Binder GetBinder(SourceNode node, ISymbol?containingSymbol = null) { var visitor = new BinderFactoryVisitor(this, containingSymbol); var binder = visitor.Visit(node); return(binder); }
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); }
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); }
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); }
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); }
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); }