536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
69 lines
2.1 KiB
C#
69 lines
2.1 KiB
C#
//---------------------------------------------------------------------
|
|
// <copyright file="SymbolTable.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//
|
|
// @owner Microsoft
|
|
// @backupOwner Microsoft
|
|
//---------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Data.SqlClient;
|
|
using System.Data.Metadata.Edm;
|
|
using System.Data.Common.CommandTrees;
|
|
|
|
namespace System.Data.SqlClient.SqlGen
|
|
{
|
|
/// <summary>
|
|
/// The symbol table is quite primitive - it is a stack with a new entry for
|
|
/// each scope. Lookups search from the top of the stack to the bottom, until
|
|
/// an entry is found.
|
|
///
|
|
/// The symbols are of the following kinds
|
|
/// <list type="bullet">
|
|
/// <item><see cref="Symbol"/> represents tables (extents/nested selects/unnests)</item>
|
|
/// <item><see cref="JoinSymbol"/> represents Join nodes</item>
|
|
/// <item><see cref="Symbol"/> columns.</item>
|
|
/// </list>
|
|
///
|
|
/// Symbols represent names <see cref="SqlGenerator.Visit(DbVariableReferenceExpression)"/> to be resolved,
|
|
/// or things to be renamed.
|
|
/// </summary>
|
|
internal sealed class SymbolTable
|
|
{
|
|
private List<Dictionary<string, Symbol>> symbols = new List<Dictionary<string, Symbol>>();
|
|
|
|
internal void EnterScope()
|
|
{
|
|
symbols.Add(new Dictionary<string, Symbol>(StringComparer.OrdinalIgnoreCase));
|
|
}
|
|
|
|
internal void ExitScope()
|
|
{
|
|
symbols.RemoveAt(symbols.Count - 1);
|
|
}
|
|
|
|
internal void Add(string name, Symbol value)
|
|
{
|
|
symbols[symbols.Count - 1][name] = value;
|
|
}
|
|
|
|
internal Symbol Lookup(string name)
|
|
{
|
|
for (int i = symbols.Count - 1; i >= 0; --i)
|
|
{
|
|
if (symbols[i].ContainsKey(name))
|
|
{
|
|
return symbols[i][name];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|