private void ResolveReachabilityAnnotation( CodeFile file, IParameterNameSyntax syntax, FixedSet <BindingSymbol> symbols) { switch (syntax) { default: throw ExhaustiveMatch.Failed(syntax); case INamedParameterNameSyntax syn: { var referencedSymbol = symbols.OfType <VariableSymbol>().SingleOrDefault(s => s.Name == syn.Name); syn.ReferencedSymbol.Fulfill(referencedSymbol); if (referencedSymbol is null) { diagnostics.Add(NameBindingError.CouldNotBindParameterName(file, syn.Span)); } } break; case ISelfParameterNameSyntax syn: { var referencedSymbol = symbols.OfType <SelfParameterSymbol>().SingleOrDefault(); syn.ReferencedSymbol.Fulfill(referencedSymbol); if (referencedSymbol is null) { diagnostics.Add(NameBindingError.CouldNotBindParameterName(file, syn.Span)); } } break; } }
private void Build(FixedSet <IEntityDeclarationSyntax> entities) { // Process all classes first because they may be referenced by functions etc. foreach (var @class in entities.OfType <IClassDeclarationSyntax>()) { BuildClassSymbol(@class); } // Now resolve all other symbols (class declarations will already have symbols and won't be processed again) foreach (var entity in entities) { BuildEntitySymbol(entity); } }