Example #1
0
            /// <summary>
            /// Проверить, что переменная используется как аргумент в выражении.
            /// </summary>
            /// <param name="context">Контекст переменной.</param>
            private static bool IsVariableUsedAsArgument(IsblParser.VariableContext context)
            {
                // Считаем, что переменная используется в логическом выражении, если
                // она используется не только как операнд
                // (то есть используется вместе с оператором или другим выражением).
                var parent = context.Parent;

                while (parent != null)
                {
                    if (parent is IsblParser.ExpressionContext expression)
                    {
                        if (expression.ChildCount > 1)
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        if (!(parent is IsblParser.OperandContext))
                        {
                            return(false);
                        }
                    }
                    parent = parent.Parent;
                }
                return(false);
            }
Example #2
0
            public override void EnterVariable([NotNull] IsblParser.VariableContext context)
            {
                if (!IsTrueFalseConstant(context.GetText()))
                {
                    return;
                }

                if (IsVariableUsedAsArgument(context))
                {
                    Entries.Add(context);
                }
            }
Example #3
0
            /// <summary>
            /// Вход в переменную.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterVariable([NotNull] IsblParser.VariableContext context)
            {
                var variableName = context.GetText();

                // Проверить, что переменная не константа
                if (!globalContext.IsUserVariable(this.document, variableName))
                {
                    return;
                }

                // Проверяем что переменная не левый операнд предложения означивания.
                if (context.Parent is IsblParser.AssignStatementContext assignStatement)
                {
                    var leftOperand = assignStatement.GetChild(0) as IsblParser.VariableContext;
                    var eq          = assignStatement.GetChild(1) as TerminalNodeImpl;
                    if (leftOperand == context && eq != null && eq.Symbol.Type == IsblParser.EQ)
                    {
                        return;
                    }
                }

                // Проверяем что переменная не левый операнд предложения объявления.
                if (context.Parent is IsblParser.DeclareVariableStatementContext declareStatement)
                {
                    var leftOperand = declareStatement.GetChild(0) as IsblParser.VariableContext;
                    if (leftOperand == context)
                    {
                        return;
                    }
                }

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

                if (variableDefinition == null)
                {
                    return;
                }

                variableDefinition.IsUsed = true;
            }
            /// <summary>
            /// Вход в переменную.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterVariable([NotNull] IsblParser.VariableContext context)
            {
                var variableName = context.GetText();

                // Проверить, что переменная не константа
                if (!globalContext.IsUserVariable(this.document, variableName))
                {
                    return;
                }

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

                if (variableDefinition == null)
                {
                    this.NotAssignedVariables.Add(context);
                }
                else if (variableDefinition.StatementBlock == null)
                {
                    this.UncertainVariables.Add(context);
                }
            }
Example #5
0
            /// <summary>
            /// Вход в переменную.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterVariable([NotNull] IsblParser.VariableContext context)
            {
                var variableName = context.GetText();

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

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

                if (variableDefinition == null)
                {
                    return;
                }

                if (variableDefinition.VariableContext != context)
                {
                    variableDefinition.IsEverUsed = true;
                }
            }