예제 #1
0
            public override void EnterAssignStatement([NotNull] IsblParser.AssignStatementContext context)
            {
                var variableContext = context.GetChild(0) as IsblParser.VariableContext;

                if (variableContext == null)
                {
                    return;
                }

                var eq = context.GetChild(1) as TerminalNodeImpl;

                if (eq == null ||
                    (eq.Symbol.Type != IsblParser.EQ &&
                     eq.Symbol.Type != IsblParser.COLON))
                {
                    return;
                }

                var variableName = variableContext.GetText();

                if (IsAssignedFromCreateCachedReferenceFunctionCall(context))
                {
                    this.cachedReferenceVariableNames.Add(variableName);
                }
                else
                {
                    this.cachedReferenceVariableNames.Remove(variableName);
                }
            }
예제 #2
0
            /// <summary>
            /// Выход из предложения означивания.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void ExitAssignStatement([NotNull] IsblParser.AssignStatementContext context)
            {
                // Первый потомок переменная.
                var variableContext = context.GetChild(0) as IsblParser.VariableContext;

                if (variableContext == null)
                {
                    return;
                }

                // Второй потомок знак точка.
                var eq = context.GetChild(1) as TerminalNodeImpl;

                if (eq == null || eq.Symbol.Type != IsblParser.EQ)
                {
                    return;
                }

                // Проверяем что это не константа.
                var variableName = variableContext.GetText();

                if (!globalContext.IsUserVariable(this.document, variableName))
                {
                    return;
                }

                // Помечаем предыдущую переменную на этом же уровне как переопределенную.
                var parentStatementBlock = GetParentStatementBlock(context);
                var variableDefinition   = this.variableDefinitions
                                           .LastOrDefault(d =>
                                                          d.VariableName.Equals(variableName, StringComparison.OrdinalIgnoreCase) &&
                                                          d.StatementBlock == parentStatementBlock);

                if (variableDefinition != null)
                {
                    variableDefinition.IsRedefined = true;
                }

                // Добавляем новую переменную в список.
                variableDefinition = new VariableDefinition
                {
                    VariableName     = variableName,
                    VariableContext  = variableContext,
                    StatementBlock   = parentStatementBlock,
                    AssignExpression = context.expression().GetText()
                };
                this.variableDefinitions.Add(variableDefinition);
            }
예제 #3
0
            /// <summary>
            /// Вход в предложение означивания.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterAssignStatement([NotNull] IsblParser.AssignStatementContext context)
            {
                // Первый потомок переменная.
                var variableContext = context.GetChild(0) as IsblParser.VariableContext;

                if (variableContext == null)
                {
                    return;
                }

                // Второй потомок знак равенства или двоеточие.
                var eq = context.GetChild(1) as TerminalNodeImpl;

                if (eq == null ||
                    (eq.Symbol.Type != IsblParser.EQ &&
                     eq.Symbol.Type != IsblParser.COLON))
                {
                    return;
                }

                var variableName = variableContext.GetText();

                if (!globalContext.IsUserVariable(this.document, variableName))
                {
                    return;
                }

                var variableDefinition = this.variableDefinitions
                                         .FirstOrDefault(d => d.VariableName.Equals(variableName, StringComparison.OrdinalIgnoreCase));

                if (variableDefinition == null)
                {
                    variableDefinition = new VariableDefinition
                    {
                        VariableName    = variableName,
                        IsEverUsed      = false,
                        VariableContext = variableContext
                    };
                    this.variableDefinitions.Add(variableDefinition);
                }
                else
                {
                    variableDefinition.VariableContext = variableContext;
                }
            }
예제 #4
0
            private static bool IsAssignedFromCreateCachedReferenceFunctionCall(IsblParser.AssignStatementContext context)
            {
                if (context.expression()?.operand()?.ChildCount != 1)
                {
                    return(false);
                }

                var function = context.expression().operand().GetChild(0) as IsblParser.FunctionContext;

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

                var functionName = function.identifier().GetText();

                return(functionName.Equals("CreateCachedReference", StringComparison.OrdinalIgnoreCase) ||
                       functionName.Equals("СоздатьКэшированныйСправочник", StringComparison.OrdinalIgnoreCase));
            }
예제 #5
0
            /// <summary>
            /// Вход в предложение означивания.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterAssignStatement([NotNull] IsblParser.AssignStatementContext context)
            {
                // Первый потомок переменная.
                var variable = context.GetChild(0) as IsblParser.VariableContext;

                if (variable == null)
                {
                    return;
                }

                // Второй потомок знак равенства или двоеточие.
                var eq = context.GetChild(1) as TerminalNodeImpl;

                if (eq == null ||
                    (eq.Symbol.Type != IsblParser.EQ &&
                     eq.Symbol.Type != IsblParser.COLON))
                {
                    return;
                }

                var variableName       = variable.GetText();
                var variableDefinition = this.variableDefinitions
                                         .FirstOrDefault(d => d.VariableName.Equals(variableName, StringComparison.OrdinalIgnoreCase));

                if (variableDefinition == null)
                {
                    variableDefinition = new VariableDefiniton
                    {
                        VariableName    = variableName,
                        IsReinitialized = false,
                        StatementBlock  = GetParentStatementBlock(context)
                    };
                    this.variableDefinitions.Add(variableDefinition);
                }
                else if (variableDefinition.StatementBlock == null)
                {
                    variableDefinition.IsReinitialized = true;
                    variableDefinition.StatementBlock  = GetParentStatementBlock(context);
                }
            }
예제 #6
0
            /// <summary>
            /// Вход в предложение означивания.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterAssignStatement([NotNull] IsblParser.AssignStatementContext context)
            {
                var childCount = context.ChildCount;
                var builder    = new StringBuilder();

                for (var i = 0; i < childCount; i++)
                {
                    var child = context.GetChild(i);
                    if (IsEqual(child))
                    {
                        break;
                    }
                    builder.Append(child.GetText());
                }

                var leftExpression  = builder.ToString();
                var rightExpression = context.expression().GetText();

                if (mainContext.Application.IsExistPredefinedVariable(context.variable().GetText()))
                {
                    leftExpression  = leftExpression.Trim('!');
                    rightExpression = rightExpression.Trim('!');
                }

                if (leftExpression.Equals(rightExpression, StringComparison.OrdinalIgnoreCase))
                {
                    if (context.typedefinition() == null)
                    {
                        var invCallContexts = context.invocationCall();

                        var numberOfInvCalls = invCallContexts.Length;
                        if (numberOfInvCalls > 1)
                        {
                            var requisites = invCallContexts[numberOfInvCalls - 2].identifier().GetText();
                            var value      = invCallContexts[numberOfInvCalls - 1].identifier().GetText();

                            if (!requisites.Equals("requisites", StringComparison.OrdinalIgnoreCase) ||
                                !(value.Equals("value", StringComparison.OrdinalIgnoreCase) || value.StartsWith("as", StringComparison.OrdinalIgnoreCase)) ||
                                invCallContexts[numberOfInvCalls - 1].parameterList() != null)
                            {
                                this.ContextsWithError.Add(context);
                            }
                        }
                        else
                        {
                            if (numberOfInvCalls == 1)
                            {
                                var name = context.variable().GetText().Trim('!');
                                if ((!name.Equals("object", StringComparison.OrdinalIgnoreCase) &&
                                     !name.Equals("sender", StringComparison.OrdinalIgnoreCase)) ||
                                    invCallContexts[0].parameterList() != null)
                                {
                                    this.ContextsWithError.Add(context);
                                }
                            }
                            else
                            {
                                this.ContextsWithError.Add(context);
                            }
                        }
                    }
                    else
                    {
                        this.ContextsWithError.Add(context);
                    }
                }
            }