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; } }
public static IEnumerable <StatementGrammarNode> GetDescendantsWithinSameQueryBlock(this StatementGrammarNode node, params string[] descendantNodeIds) { return(node.GetPathFilterDescendants(NodeFilters.BreakAtNestedQueryBlock, descendantNodeIds)); }
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)); }