/// <summary>
/// Gets the symbol from the cache or adds new entry in the cache if symbol wasn't previously found.
/// </summary>
/// <param name="symbol">The symbol.</param>
internal Symbol GetSymbol(IDiaSymbol symbol)
{
if (symbol == null)
{
return(null);
}
Symbol s;
uint symbolId = symbol.symIndexId;
if (!symbolById.TryGetValue(symbolId, out s))
{
s = new Symbol(this, symbol);
lock (this)
{
Symbol previousSymbol = null;
symbolById.TryAdd(symbolId, s);
if (s.Tag != SymTagEnum.SymTagExe)
{
if (!symbolByName.TryGetValue(s.Name, out previousSymbol))
{
symbolByName.TryAdd(s.Name, s);
}
else
{
previousSymbol.LinkSymbols(s);
}
}
}
s.InitializeCache();
}
return(s);
}