using System.Collections.Generic; using Microsoft.CodeAnalysis; namespace Ariadne.Generator { /// /// Holds the analysis of every script class one generator run has needed, so classes whose passages call each /// other are each analyzed once. /// public class ScriptRegistry { // A class that isn't a script is held as null. private readonly Dictionary scripts = new Dictionary(SymbolEqualityComparer.Default); private readonly Dictionary locals = new Dictionary(); /// /// Records a script that is still being analyzed, so a class it calls into can find it again. /// public void Register(ScriptClass script) { scripts[script.Type] = script; } /// /// Returns the script is, or null if it isn't one. A constructed generic class is the /// script of its definition. /// public ScriptClass ScriptFor(INamedTypeSymbol type, Compilation compilation) { type = type.OriginalDefinition; ScriptClass returnMe; if (!scripts.TryGetValue(type, out returnMe)) { returnMe = ScriptClass.Create(type, compilation, this); scripts[type] = returnMe; } return returnMe; } /// /// Returns the saved locals of , working them out and reporting what is wrong with /// them to the first time. /// public ScriptLocals LocalsOf(ScriptClass script, List diagnostics) { ScriptLocals returnMe; if (!locals.TryGetValue(script, out returnMe)) { returnMe = ScriptLocals.Find(script, diagnostics); locals[script] = returnMe; } return returnMe; } } }