| 
									
										
										
										
											2016-08-03 10:59:49 +00:00
										 |  |  | //--------------------------------------------------------------------- | 
					
						
							|  |  |  | // <copyright file="SymbolTable.cs" company="Microsoft"> | 
					
						
							|  |  |  | //      Copyright (c) Microsoft Corporation.  All rights reserved. | 
					
						
							|  |  |  | // </copyright> | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2017-08-21 15:34:15 +00:00
										 |  |  | // @owner  Microsoft | 
					
						
							|  |  |  | // @backupOwner Microsoft | 
					
						
							| 
									
										
										
										
											2016-08-03 10:59:49 +00:00
										 |  |  | //--------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |