/// <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); }
public override void EnterVariable([NotNull] IsblParser.VariableContext context) { if (!IsTrueFalseConstant(context.GetText())) { return; } if (IsVariableUsedAsArgument(context)) { Entries.Add(context); } }
/// <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); } }
/// <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; } }