public static bool TryGetName(this Link link, out string str) { // Защита от зацикливания if (!_linksWithNamesGatheringProcess.Add(link)) { str = "..."; return(true); } try { if (link != null) { if (link.Linker == Net.And) { str = SequenceHelpers.FormatSequence(link); return(true); } else if (link.IsGroup()) { str = LinkConverter.ToString(LinkConverter.ToList(link.Target)); return(true); } else if (link.IsChar()) { str = LinkConverter.ToChar(link).ToString(); return(true); } else if (link.TryGetSpecificName(out str)) { return(true); } if (link.Source == link || link.Linker == link || link.Target == link) { return(false); } if (link.Source.TryGetName(out string sourceName) && link.Linker.TryGetName(out string linkerName) && link.Target.TryGetName(out string targetName)) { var sb = new StringBuilder(); sb.Append(sourceName).Append(' ').Append(linkerName).Append(' ').Append(targetName); str = sb.ToString(); return(true); } } str = null; return(false); } finally { _linksWithNamesGatheringProcess.Remove(link); } }
public static bool TryGetSpecificName(this Link link, out string name) { string nameLocal = null; if (Net.Name.ReferersBySourceCount < link.ReferersBySourceCount) { Net.Name.WalkThroughReferersAsSource(referer => { if (referer.Linker == Net.ThatIsRepresentedBy) { if (Link.Exists(link, Net.Has, referer)) { nameLocal = LinkConverter.ToString(referer.Target); return(false); // Останавливаем проход } } return(true); }); } else { link.WalkThroughReferersAsSource(referer => { if (referer.Linker == Net.Has) { var nameLink = referer.Target; if (nameLink.Source == Net.Name && nameLink.Linker == Net.ThatIsRepresentedBy) { nameLocal = LinkConverter.ToString(nameLink.Target); return(false); // Останавливаем проход } } return(true); }); } name = nameLocal; return(nameLocal != null); }