Exemplo n.º 1
0
        private void FindPlSqlReferences(OraclePlSqlProgram program, StatementGrammarNode node)
        {
            if (node == null)
            {
                return;
            }

            var excludedIdentifiers = new HashSet <StatementGrammarNode>();

            switch (node.Id)
            {
            case NonTerminals.PlSqlRaiseStatement:
                var prefixedExceptionIdentifierNode = node[NonTerminals.PrefixedExceptionIdentifier];
                CreatePlSqlExceptionReference(program, prefixedExceptionIdentifierNode);
                break;

            case NonTerminals.PlSqlCursorForLoopStatement:
                var cursorIdentifier = node[Terminals.PlSqlIdentifier];
                var cursorScopeNode  = node[NonTerminals.PlSqlBasicLoopStatement];
                if (cursorIdentifier != null && cursorScopeNode != null)
                {
                    excludedIdentifiers.Add(cursorIdentifier);

                    var cursor =
                        new OraclePlSqlCursorVariable
                    {
                        Name           = cursorIdentifier.Token.Value.ToQuotedIdentifier(),
                        IsImplicit     = true,
                        Owner          = program,
                        DefinitionNode = cursorIdentifier,
                        ScopeNode      = cursorScopeNode
                    };

                    SetStatementModelIfFound(cursor, node[NonTerminals.CursorSource, NonTerminals.SelectStatement]);

                    program.Variables.Add(cursor);

                    var cursorReferenceIdentifier = node[NonTerminals.CursorSource, Terminals.CursorIdentifier];
                    if (cursorReferenceIdentifier != null)
                    {
                        var cursorReference =
                            new OraclePlSqlVariableReference
                        {
                            RootNode       = cursorReferenceIdentifier.ParentNode,
                            IdentifierNode = cursorReferenceIdentifier,
                            //ObjectNode = cursorIdentifierNode.ParentNode[NonTerminals.ObjectPrefix, Terminals.ObjectIdentifier],
                            //OwnerNode = cursorIdentifierNode.ParentNode[NonTerminals.SchemaPrefix, Terminals.SchemaIdentifier],
                            Container    = program,
                            PlSqlProgram = program
                        };

                        program.PlSqlVariableReferences.Add(cursorReference);
                    }
                }

                goto default;

            case NonTerminals.PlSqlForLoopStatement:
                var identifier = node[Terminals.PlSqlIdentifier];
                var scopeNode  = node[NonTerminals.PlSqlBasicLoopStatement];
                if (identifier != null && scopeNode != null)
                {
                    excludedIdentifiers.Add(identifier);

                    var variable =
                        new OraclePlSqlVariable
                    {
                        Name           = identifier.Token.Value.ToQuotedIdentifier(),
                        Owner          = program,
                        DefinitionNode = identifier,
                        DataType       = OracleDataType.BinaryIntegerType,
                        ScopeNode      = scopeNode
                    };

                    program.Variables.Add(variable);
                }

                goto default;

            default:
                var identifiers = node.GetPathFilterDescendants(NodeFilters.BreakAtPlSqlSubProgramOrSqlCommand, Terminals.Identifier, Terminals.PlSqlIdentifier, Terminals.RowIdPseudocolumn, Terminals.Level, Terminals.RowNumberPseudocolumn, Terminals.User)
                                  .Where(i => !excludedIdentifiers.Contains(i));

                ResolveColumnFunctionOrDataTypeReferencesFromIdentifiers(null, program, identifiers, StatementPlacement.None, null, null, GetFunctionCallNodes);

                var grammarSpecificFunctions = GetGrammarSpecificFunctionNodes(node);
                CreateGrammarSpecificFunctionReferences(grammarSpecificFunctions, program, null, StatementPlacement.None, null);
                break;
            }
        }
Exemplo n.º 2
0
 public static IEnumerable <StatementGrammarNode> GetDescendantsWithinSameQueryBlock(this StatementGrammarNode node, params string[] descendantNodeIds)
 {
     return(node.GetPathFilterDescendants(NodeFilters.BreakAtNestedQueryBlock, descendantNodeIds));
 }
Exemplo n.º 3
0
 private static IEnumerable <StatementGrammarNode> GetPlSqlStatements(StatementGrammarNode sourceNode)
 {
     return(sourceNode.GetPathFilterDescendants(n => !String.Equals(n.Id, NonTerminals.PlSqlSqlStatement) && !String.Equals(n.Id, NonTerminals.PlSqlStatementList) && !(String.Equals(n.Id, NonTerminals.PlSqlStatementType) && n[NonTerminals.PlSqlBlock] != null), NonTerminals.PlSqlStatementType));
 }