private SymbolInfo LookupType(BinderContext underlying, TypeSyntax type, int arity = 0) { using (var context = new DiagnosticBufferBinderContext(underlying)) { var result = context.BindType(type, arity); var err = result as ErrorTypeSymbol; if (err == null) { return(new SymbolInfo(result, ConsList.Singleton(result), context.Commit(false))); } var info = err.ErrorInfo; var errors = context.Commit(false).ToList(); if (info != null) { errors.Add(new Diagnostic(info, context.Location(type))); } var syms = (info is CSDiagnosticInfo) ? (info as CSDiagnosticInfo).Symbols : Enumerable.Empty <Symbol>(); return(new SymbolInfo(result, syms, errors)); } }
} // type declarations are handled by ContainerDeclaration et al. // public override IEnumerable<MemberBinderContext> VisitEnumMemberDeclaration(EnumMemberDeclarationSyntax node, object arg) // public override IEnumerable<MemberBinderContext> VisitEventFieldDeclaration(EventFieldDeclarationSyntax node, object unused) // public override IEnumerable<MemberBinderContext> VisitOperatorDeclaration(OperatorDeclarationSyntax node, object unused) // public override IEnumerable<MemberBinderContext> VisitConversionOperatorDeclaration(ConversionOperatorDeclarationSyntax node, object unused) public override IEnumerable <MemberBuilder> VisitConstructorDeclaration(ConstructorDeclarationSyntax node, object unused) { return(ConsList.Singleton(new MethodMemberBuilder(container, context, node))); }