/// <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)); }
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); } }
public void AddPosition(ePackageElementDefinitionType packageElementDefinitionType, PieceOfCode posCode) { Position.Add(packageElementDefinitionType, posCode); }