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;
}
}
}