예제 #1
0
        private void ProcessObj(ParserRuleContext context)
        {
            ParserRuleContext child = context.GetChild(0) as ParserRuleContext;

            if (child is PlSqlParser.Procedure_bodyContext ||
                child is PlSqlParser.Procedure_specContext ||
                child is PlSqlParser.Function_bodyContext ||
                child is PlSqlParser.Function_specContext)
            {
                var procedure = _procedureVisitor.Visit(child).SetPositionExt(child);
                _Result.Objects.Add(procedure);
            }
            else if (child is PlSqlParser.Variable_declarationContext variableContext)
            {
                var name   = variableContext.GetChild(0).GetText();
                var pltype = variableContext.GetChild(1).GetText();

                if (name == "PROCEDURE")
                {
                    var procedure = new ParsedProcedure(pltype);
                    procedure.SetPosition(variableContext);
                    _Result.Objects.Add(procedure);
                }
                else
                {
                    var variable = new ParsedVariable(name, pltype);
                    variable.SetPosition(variableContext);

                    var codePosition = new PieceOfCode();
                    codePosition.SetPosition(variableContext.GetChild(0) as ParserRuleContext);
                    variable.NameIdentifierPart = codePosition;

                    _Result.Objects.Add(variable);
                }
            }
            else if (child is PlSqlParser.Type_declarationContext typeContext)
            {
                var NameContext = typeContext.GetChild(1);
                var name        = NameContext.GetText();
                var type        = new ParsedType(name);
                type.SetPosition(typeContext);
                type.NameIdentifierPart.SetPosition(NameContext as ParserRuleContext);

                _Result.Objects.Add(type);
            }
            else if (child is PlSqlParser.Cursor_declarationContext cursorContext)
            {
                var NameContext = cursorContext.GetChild(1);
                var name        = NameContext.GetText();
                var type        = new ParsedCursor(name);
                type.SetPosition(cursorContext);
                type.NameIdentifierPart.SetPosition(NameContext as ParserRuleContext);

                _Result.Objects.Add(type);
            }
        }
예제 #2
0
        public override ParsedProcedure Visit(IParseTree tree)
        {
            var methodTypeName = (tree.GetChild(0) as TerminalNodeImpl).Symbol.Text;

            var identifierContext = tree.GetChild(1);

            if (!(identifierContext is PlSqlParser.IdentifierContext))
            {
                throw new NotImplementedException("Ожидалось имя процедуры");
            }

            if (methodTypeName == "PROCEDURE")
            {
                _Result = new ParsedProcedure(identifierContext.GetText());
            }
            else
            {
                _Result = new ParsedFunction(identifierContext.GetText());
            }

            var codePosition = new PieceOfCode();

            codePosition.SetPosition(identifierContext as ParserRuleContext);
            _Result.NameIdentifierPart = codePosition;

            int chCnt = tree.ChildCount;

            for (int i = 2; i < chCnt; i++)
            {
                if (tree.GetChild(i) is TerminalNodeImpl terminalNoeImpl)
                {
                    if (terminalNoeImpl.Symbol.Text == "IS" || terminalNoeImpl.Symbol.Text == "AS")
                    {
                        codePosition = new PieceOfCode();
                        codePosition.SetPosition(tree as ParserRuleContext);
                        var PrevChild = tree.GetChild(i - 1);
                        if (PrevChild is ParserRuleContext PrevContext)
                        {
                            codePosition.SetPosition(PrevContext);
                        }
                        else if (PrevChild is TerminalNodeImpl PrevTerminalNodeImpl)
                        {
                            codePosition.SetPosition(PrevTerminalNodeImpl);
                        }
                        _Result.DeclarationPart = codePosition;
                        break;
                    }
                }
            }

            return(base.Visit(tree));
        }
예제 #3
0
 public void AddPosition(ePackageElementDefinitionType packageElementDefinitionType, PieceOfCode posCode)
 {
     Position.Add(packageElementDefinitionType, posCode);
 }