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); } }
/// <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); }
/// <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; } }
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)); }
/// <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); } }
/// <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); } } }