コード例 #1
0
        private BoundRelation BindNamedTableReference(NamedTableReferenceSyntax node)
        {
            var symbols = LookupTable(node.TableName).ToImmutableArray();

            if (symbols.Length == 0)
            {
                Diagnostics.ReportUndeclaredTable(node);

                var errorTable = new ErrorTableSymbol(node.TableName.ValueText);
                var errorAlias = node.Alias == null
                                   ? errorTable.Name
                                   : node.Alias.Identifier.ValueText;
                var errorInstance = new TableInstanceSymbol(errorAlias, errorTable, ValueSlotFactory);
                return(new BoundTableRelation(errorInstance));
            }

            if (symbols.Length > 1)
            {
                Diagnostics.ReportAmbiguousTable(node.TableName, symbols);
            }

            var table           = symbols[0];
            var aliasIdentifier = node.Alias != null
                ? node.Alias.Identifier
                : node.TableName;

            var alias = aliasIdentifier.ValueText;

            var tableInstance = new TableInstanceSymbol(alias, table, ValueSlotFactory);

            QueryState.IntroducedTables.Add(tableInstance, aliasIdentifier);

            return(new BoundTableRelation(tableInstance));
        }
コード例 #2
0
        public TableInstanceSymbol GetDeclaredSymbol(NamedTableReferenceSyntax tableReference)
        {
            if (tableReference == null)
            {
                throw new ArgumentNullException(nameof(tableReference));
            }

            var result = _bindingResult.GetBoundNode(tableReference) as BoundTableRelation;

            return(result?.TableInstance);
        }
        private static bool IsRecursiveUsage(SemanticModel semanticModel, NamedTableReferenceSyntax tableReference)
        {
            var symbol = semanticModel.GetDeclaredSymbol(tableReference);

            if (symbol == null)
            {
                return(false);
            }

            var table = symbol.Table;

            return(tableReference.Ancestors().OfType <CommonTableExpressionSyntax>().Any(c => semanticModel.GetDeclaredSymbol(c) == table));
        }
コード例 #4
0
        private void ClassifyNamedTableReference(NamedTableReferenceSyntax node)
        {
            var tableInstanceSymbol = _semanticModel.GetDeclaredSymbol(node);

            if (tableInstanceSymbol == null)
            {
                return;
            }

            AddClassification(node.TableName, tableInstanceSymbol.Table);

            if (node.Alias != null)
            {
                AddClassification(node.Alias.Identifier, tableInstanceSymbol);
            }
        }
コード例 #5
0
 public virtual void VisitNamedTableReference(NamedTableReferenceSyntax node)
 {
     DefaultVisit(node);
 }
コード例 #6
0
        public static void ReportUndeclaredTable(this ICollection <Diagnostic> diagnostics, NamedTableReferenceSyntax namedTableReference)
        {
            var tableName = namedTableReference.TableName;

            diagnostics.Report(tableName.Span, DiagnosticId.UndeclaredTable, tableName.ValueText);
        }
コード例 #7
0
 public virtual TResult VisitNamedTableReference(NamedTableReferenceSyntax node)
 {
     return(DefaultVisit(node));
 }