예제 #1
0
        /// <summary>
        /// Получить косок текста для определенных элементов
        /// </summary>
        /// <param name="names">Имена элементов</param>
        /// <param name="codeDefinitionPart">Участок откуда забираем код</param>
        /// <returns></returns>
        private string GetTextPart(IEnumerable <string> names, ePackageElementDefinitionType codeDefinitionPart)
        {
            bool?hasSpec = null, hasBody = null;

            switch (codeDefinitionPart)
            {
            case ePackageElementDefinitionType.Spec: hasSpec = true; break;

            case ePackageElementDefinitionType.BodyFull: hasBody = true; break;

            /* BodyDeclaration - Участок метода в теле пакета, который сгодится для спецификации
             * (т.е. текст функции/процедуры в теле пакета до IS/AS)
             * Эти участки подлежат копированию при отсутствии объявлении метода в исходной спецификации
             */
            case ePackageElementDefinitionType.BodyDeclaration: hasSpec = false; break;

            default: break;
            }

            var CodeParts = _package.elements
                            .Where(x => names.Contains(x.Name) &&
                                   x.HasSpec == (hasSpec ?? x.HasSpec) &&
                                   x.HasBody == (hasBody ?? x.HasBody))
                            .Select(x => x.Position[codeDefinitionPart]).ToArray();

            var repositoryObjectType = codeDefinitionPart == ePackageElementDefinitionType.Spec ? eRepositoryObjectType.Package_Spec : eRepositoryObjectType.Package_Body;

            return(GetTextPart(CodeParts, repositoryObjectType, codeDefinitionPart == ePackageElementDefinitionType.BodyDeclaration));
        }
예제 #2
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);
            }
        }
예제 #3
0
 public void AddPosition(ePackageElementDefinitionType packageElementDefinitionType, PieceOfCode posCode)
 {
     Position.Add(packageElementDefinitionType, posCode);
 }