Пример #1
0
        public ParsedPackagePart GetPackageBody(string filePath)
        {
            IParseTree         tree        = Analyzer.RunUpperCase(filePath);
            PackageBodyVisitor visitor     = new PackageBodyVisitor();
            ParsedPackagePart  packageBody = visitor.Visit(tree);

            return(packageBody);
        }
Пример #2
0
        public Package(ParsedPackagePart spec, ParsedPackagePart body, RepositoryPackage repositoryPackage)
        {
            elements = new List <PackageElement>();
            this.repositoryPackage = repositoryPackage;

            SetObject(body, ePackageElementDefinitionType.BodyFull, repositoryPackage.BodyRepFullPath);
            SetObject(spec, ePackageElementDefinitionType.Spec, repositoryPackage.SpecRepFullPath);

            UpdateBeginLine();
        }
Пример #3
0
        private void SetObject(ParsedPackagePart part, ePackageElementDefinitionType positionType, string filepath)
        {
            var objs = part.Objects;

            for (int i = 0; i < objs.Count; i++)
            {
                var obj      = objs[i];
                var NamePart = obj.NameIdentifierPart;
                var ObjName  = DBRep.Instance().GetWordInFile(filepath, NamePart.LineBeg, NamePart.ColumnBeg, NamePart.ColumnEnd);

                var element = new PackageElement(ObjName, obj.GetType().GetCustomAttribute <PackageElementTypeAttribute>().ElementType);
                element.AddPosition(positionType, obj.Position());

                if (obj is ParsedProcedure objMethod)
                {
                    if (positionType == ePackageElementDefinitionType.BodyFull)
                    {
                        // Фиксируем часть спецификации в теле
                        if (objMethod.DeclarationPart != null)
                        {
                            element.AddPosition(ePackageElementDefinitionType.BodyDeclaration, objMethod.DeclarationPart);
                        }

                        // Определяем FriendlyName для параметров и фиксируем их
                        var baseParamList = objMethod.Parameters.ToList();
                        for (int j = 0; j < baseParamList.Count; j++)
                        {
                            var parameter = baseParamList[j];
                            parameter.Name = DBRep.Instance().GetWordInFile(repositoryPackage.BodyRepFullPath, parameter.NamePart.LineBeg, parameter.NamePart.ColumnBeg, parameter.NamePart.ColumnEnd);
                            element.Parametres.Add(parameter);
                        }

                        element.Links.AddRange(objMethod.Elements);
                    }
                    else if (positionType == ePackageElementDefinitionType.Spec)
                    {
                        try
                        {
                            /* Метод в спецификации должен иметь пару в теле пакета.
                             * Ищем уже добавленный метод в теле. Добавляем к нему позицию спецификации
                             */
                            elements.First(x => x.Equals(objMethod)).AddPosition(ePackageElementDefinitionType.Spec, objMethod.Position());
                        }
                        catch (InvalidOperationException ex)
                        {
                            // Sequence contains no matching element
                            if (ex.HResult == -2146233079)
                            {
                                var ErrorMsg = $"В спецификации для метода {objMethod.Name} не найдена пара в теле пакета";
                                Func <IEnumerable <ParsedParameter>, string> printParam = (x) => string.Join(", ", x.Select(x => $"{x.Name} {x.plType}"));
                                Seri.Log.Error(ErrorMsg);
                                Seri.Log.Error($"Метод в спецификации: {objMethod.Name}, параметры: {printParam(objMethod.Parameters)}");
                                foreach (var item in elements.Where(x => x.Name.ToUpper() == objMethod.Name.ToUpper()))
                                {
                                    Seri.Log.Error($"Метод в теле: {item.Name}, параметры: {printParam(item.Parametres)}");
                                }
                                throw new Exception(ErrorMsg);
                            }
                            else
                            {
                                throw ex;
                            }
                        }
                        continue;
                    }
                }

                elements.Add(element);
            }
        }