Пример #1
0
            /// <summary>
            /// Получить строку локализации из контекста вызова функции LoadString.
            /// </summary>
            /// <param name="loadStringFunctionContext">Контекст вызова фунции LoadString.</param>
            /// <returns>Найденная строка локализации, или null, если строку локализации определить не удаётся.</returns>
            private LocalizationString GetLocalizedString(IsblParser.FunctionContext loadStringFunctionContext)
            {
                var loadStringParamsContext = loadStringFunctionContext.parameterList();

                if (loadStringParamsContext == null)
                {
                    return(null);
                }
                var parameters = loadStringParamsContext.expression();

                if (parameters.Length < 2)
                {
                    return(null);
                }
                var name = GetStringOperandValue(parameters[0]);

                if (name == null)
                {
                    return(null);
                }
                var group = GetStringOperandValue(parameters[1]);

                if (group == null)
                {
                    return(null);
                }
                return(this.globalContext.Development.LocalizationStrings.FirstOrDefault(
                           s => s.Group.Equals(group, StringComparison.OrdinalIgnoreCase) &&
                           s.Name.Equals(name, StringComparison.OrdinalIgnoreCase)));
            }
            public override void EnterFunction([NotNull] IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if (!string.Equals(functionName, CreateExceptionFunctionName))
                {
                    return;
                }
                var functionParams = context.parameterList()?.expression();

                if (functionParams == null)
                {
                    return;
                }
                if (functionParams.Length == 0)
                {
                    return;
                }
                var exceptionClassStringValue = GetStringOperandValue(functionParams[0]);

                if (exceptionClassStringValue?.Trim() == string.Empty)
                {
                    EmptyExceptionClassParams.Add(functionParams[0]);
                }
            }
            public override void EnterFunction([NotNull] IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if (!functionName.Equals("Format", StringComparison.OrdinalIgnoreCase) &&
                    !functionName.Equals("Формат", StringComparison.OrdinalIgnoreCase) &&
                    !functionName.Equals("LoadStringFmt", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
                if (context.parameterList() == null)
                {
                    return;
                }
                var parameters = context.parameterList().expression();

                IsblParser.OperandContext argsListOperand = null;
                if (functionName.Equals("LoadStringFmt", StringComparison.OrdinalIgnoreCase))
                {
                    if (parameters.Length < 3)
                    {
                        return;
                    }
                    argsListOperand = parameters[2].operand();
                }
                else
                {
                    if (parameters.Length < 2)
                    {
                        return;
                    }
                    argsListOperand = parameters[1].operand();
                }
                if (argsListOperand?.function() == null)
                {
                    return;
                }
                var argsListFunctionName = argsListOperand.function().identifier().GetText();

                if (!argsListFunctionName.Equals("ArrayOf", StringComparison.OrdinalIgnoreCase) &&
                    !argsListFunctionName.Equals("Массив", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
                var arrayOfFunctionParams = argsListOperand.function().parameterList();

                if (arrayOfFunctionParams == null)
                {
                    return;
                }
                var arguments = arrayOfFunctionParams.expression();

                if (arguments.Length == 1)
                {
                    this.SingleArgumentEntries.Add(argsListOperand.function());
                }
            }
            /// <summary>
            /// Вход в выражение вызова функции.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterFunction(IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if (FunctionsWithInteractiveWindow.Contains(functionName))
                {
                    ContextWithFunctionErrors.Add(context);
                }
            }
            public override void EnterFunction([NotNull] IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if (!functionName.Equals("LoadString", StringComparison.OrdinalIgnoreCase) &&
                    !functionName.Equals("LoadStringFmt", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
                ProcessLoadStringFmtFunction(context);
            }
Пример #6
0
            /// <summary>
            /// Вход в выражение вызова функции.
            /// </summary>
            /// <param name="context">Контекст.</param>
            public override void EnterFunction(IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if ((functionName.Equals(CreateReferenceFunctionEn, StringComparison.OrdinalIgnoreCase) ||
                     functionName.Equals(CreateReferenceFunctionRu, StringComparison.OrdinalIgnoreCase)) &&
                    context.parameterList().expression().Any())
                {
                    // Создание справочника через функцию CreateReference().
                    var firstParam = context.parameterList().expression(0);
                    CheckReferenceInExpressionExists(firstParam);
                }
            }
Пример #7
0
            public override void EnterFunction([NotNull] IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if (functionName.Equals("Format", StringComparison.OrdinalIgnoreCase) ||
                    functionName.Equals("Формат", StringComparison.OrdinalIgnoreCase))
                {
                    ProcessFormatFunction(context);
                }
                else if (functionName.Equals("LoadStringFmt", StringComparison.OrdinalIgnoreCase))
                {
                    ProcessLoadStringFmtFunction(context);
                }
            }
Пример #8
0
            /// <summary>
            /// Обработать вызов функции LoadStringFmt.
            /// </summary>
            /// <param name="function">Контекст вызова функции.</param>
            private void ProcessLoadStringFmtFunction(IsblParser.FunctionContext function)
            {
                if (function.parameterList() == null)
                {
                    return;
                }
                var parameters = function.parameterList().expression();

                if (parameters.Length < 3)
                {
                    return;
                }
                var templateLocalizationString = this.GetLocalizedString(function);

                if (templateLocalizationString == null)
                {
                    return;
                }
                if (parameters[2].ChildCount != 1)
                {
                    return;
                }
                var argsListOperand = parameters[2].operand();

                if (argsListOperand?.function() == null)
                {
                    return;
                }
                var argsListFunctionName = argsListOperand.function().identifier().GetText();

                if (!argsListFunctionName.Equals("ArrayOf", StringComparison.OrdinalIgnoreCase) &&
                    !argsListFunctionName.Equals("Массив", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
                var arrayOfFunctionParams = argsListOperand.function().parameterList();

                if (arrayOfFunctionParams == null)
                {
                    return;
                }

                foreach (var localizationValue in templateLocalizationString.Values)
                {
                    this.CheckTemplateString(localizationValue.Value, function.parameterList().expression().First(),
                                             TemplateStringSource.LocalizationString, arrayOfFunctionParams);
                }
            }
            /// <summary>
            /// Обработать вызов функции LoadStringFmt.
            /// </summary>
            /// <param name="function">Контекст вызова функции.</param>
            private void ProcessLoadStringFmtFunction(IsblParser.FunctionContext function)
            {
                if (function.parameterList() == null)
                {
                    return;
                }
                var parameters = function.parameterList().expression();

                if (parameters.Length < 2)
                {
                    return;
                }
                var name = GetStringOperandValue(parameters[0]);

                if (name == null)
                {
                    return;
                }
                var group = GetStringOperandValue(parameters[1]);

                if (group == null)
                {
                    return;
                }
                // Пропускаем системные строки локализации.
                if (group.StartsWith("SYSRES_", StringComparison.OrdinalIgnoreCase) ||
                    group.StartsWith("DIRRES_", StringComparison.OrdinalIgnoreCase) ||
                    group.Equals("ISBSYSDEV", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
                if (!IsLocalizationStringExist(group, name))
                {
                    Entries.Add(new UsingNonExistingLocalizationStringEntry
                    {
                        Context = parameters[0],
                        LocalizationStringGroup = group,
                        LocalizationStringName  = name
                    });
                }
            }
            public override void EnterFunction([NotNull] IsblParser.FunctionContext context)
            {
                var functionName = context.identifier().GetText();

                if (RuleExceptions.Contains(functionName, StringComparer.OrdinalIgnoreCase))
                {
                    return;
                }
                if (!this.developerFunctions.TryGetValue(functionName, out Function function) &&
                    !this.systemFunctions.TryGetValue(functionName, out function))
                {
                    return;
                }
                var paramsParser = new ParameterListParser(context.parameterList());

                paramsParser.Parse();
                if (paramsParser.ParameterValues.Count > function.Arguments.Count)
                {
                    this.FunctionCalls.Add(context);
                    return;
                }
                // TODO: Сейчас билдер не считает ошибкой, если упустить обязательный параметр функции.
                // За исключением некоторых системных функций. Раскомментировать, когда (и если) поправят билдер.

                //int argIndex = 0;
                //foreach (var arg in function.Arguments
                //  .Where(a => !a.HasDefaultValue)
                //  .OrderBy(a => a.Number))
                //{
                //  if (!paramsParser.ParameterValues.Any(p => p.Index == argIndex && !p.IsEmpty))
                //  {
                //    this.FunctionCalls.Add(context);
                //    return;
                //  }
                //  argIndex++;
                //}
            }
Пример #11
0
            /// <summary>
            /// Обработать вызов функции Format.
            /// </summary>
            /// <param name="function">Контекст вызова функции.</param>
            private void ProcessFormatFunction(IsblParser.FunctionContext function)
            {
                if (function.parameterList() == null)
                {
                    return;
                }
                var parameters = function.parameterList().expression();

                if (parameters.Length != 2)
                {
                    return;
                }
                if (parameters[1].ChildCount != 1)
                {
                    return;
                }
                var argsListOperand = parameters[1].operand();

                if (argsListOperand?.function() == null)
                {
                    return;
                }
                var argsListFunctionName = argsListOperand.function().identifier().GetText();

                if (!argsListFunctionName.Equals("ArrayOf", StringComparison.OrdinalIgnoreCase) &&
                    !argsListFunctionName.Equals("Массив", StringComparison.OrdinalIgnoreCase))
                {
                    return;
                }
                var arrayOfFunctionParams = argsListOperand.function().parameterList();

                if (arrayOfFunctionParams == null)
                {
                    return;
                }
                var operand = parameters[0].operand();

                if (operand == null)
                {
                    return;
                }
                if (operand.@string() != null)
                {
                    // Шаблон - строковая константа.
                    var templateString = operand.@string().GetText();
                    this.CheckTemplateString(templateString, operand.@string(), TemplateStringSource.StringConstant, arrayOfFunctionParams);
                }
                else if (operand.function() != null &&
                         operand.function().identifier().GetText().Equals("LoadString", StringComparison.OrdinalIgnoreCase))
                {
                    // Шаблон - функция LoadString.
                    var templateLocalizationString = this.GetLocalizedString(operand.function());
                    if (templateLocalizationString == null)
                    {
                        return;
                    }
                    foreach (var localizationValue in templateLocalizationString.Values)
                    {
                        this.CheckTemplateString(localizationValue.Value, operand.function(), TemplateStringSource.LocalizationString, arrayOfFunctionParams);
                    }
                }
            }