public ParsedPackagePart GetPackageBody(string filePath) { IParseTree tree = Analyzer.RunUpperCase(filePath); PackageBodyVisitor visitor = new PackageBodyVisitor(); ParsedPackagePart packageBody = visitor.Visit(tree); return(packageBody); }
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(); }
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); } }