public override void Run(IEnumerable <string> args) { string rootdir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref rootdir, ref omitlist, ref processlist, ref pattern ); CommandUtils.ThrowOnFiniteExtras(extras); foreach (string file in CommandUtils.GetFileList(processlist, omitlist, rootdir, pattern)) { bool changed = false; XDocument xdoc = new XDocument(XElement.Load(file)); XElement memberRoot = xdoc.Element("Type").Element("Members"); if (memberRoot == null || !memberRoot.Descendants().Any()) { continue; } foreach (XElement m in memberRoot.Elements("Member")) { XElement summary = m.Element("Docs").Element("summary"); if (null == summary) { continue; } if (summary.IsEmpty || (summary.Value.Length == 0 && summary.Descendants().Count() == 0)) { summary.Value = "To be added."; changed = true; continue; } IEnumerable <XElement> mistakeParams = summary.Descendants("param"); if (mistakeParams.Count() == 0) { continue; } mistakeParams.ToList().ForEach(e => e.Name = "paramref"); changed = true; } if (changed) { CommandUtils.WriteXDocument(xdoc, file); } } }
public override void Run(IEnumerable <string> args) { string filesToFixDir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref filesToFixDir, ref omitlist, ref processlist, ref pattern); // must have string filesToUseAsRefDir = ""; // should have bool doSummaries = true; bool doParameters = true; bool doReturns = true; bool doRemarks = true; bool doTypes = true; // nice to have bool dryRun = false; bool reportChanges = false; var opts = new OptionSet { { "f|fix=", (f) => filesToFixDir = f }, { "u|using=", (u) => filesToUseAsRefDir = u }, { "s|summaries", (s) => doSummaries = s != null }, { "a|params", (p) => doParameters = p != null }, { "r|retvals", (r) => doReturns = r != null }, { "m|remarks", (r) => doRemarks = r != null }, { "t|typesummaries", (t) => doTypes = t != null }, { "y|dryrun", (d) => dryRun = d != null }, { "c|reportchanges", (c) => reportChanges = c != null }, }; extras = opts.Parse(extras); CommandUtils.ThrowOnFiniteExtras(extras); if (String.IsNullOrEmpty(filesToUseAsRefDir)) { throw new ArgumentException("You must supply a parallel directory from which to source new content with '[u|using]'=."); } IEnumerable <string> filesToFix = CommandUtils.GetFileList(processlist, omitlist, filesToFixDir, pattern); HashSet <string> filesToUseAsReference = new HashSet <string>(CommandUtils.GetFileList("", "", filesToUseAsRefDir, "")); filesToFix = filesToFix.Where((f) => filesToUseAsReference.Contains(EcmaXmlHelper.GetParallelFilePathFor(f, filesToUseAsRefDir, filesToFixDir))); foreach (var f in filesToFix) { XDocument currentRefXDoc = EcmaXmlHelper.GetParallelXDocFor( EcmaXmlHelper.GetParallelFilePathFor(f, filesToUseAsRefDir, filesToFixDir), filesToUseAsReference ); if (null == currentRefXDoc) { continue; } Action <XElement> fix = (XElement e) => EcmaXmlHelper.Fix(e, EcmaXmlHelper.GetSelectorFor(e)(currentRefXDoc)); bool changed = false; XDocument currentXDocToFix = XDocument.Load(f); EventHandler <XObjectChangeEventArgs> SetTrueIfChanged = null; SetTrueIfChanged = new EventHandler <XObjectChangeEventArgs>((sender, e) => { currentXDocToFix.Changed -= SetTrueIfChanged; changed = true; }); currentXDocToFix.Changed += SetTrueIfChanged; foreach (XElement e in EcmaXmlHelper.ElementsOfInterest(currentXDocToFix)) { fix(e); } if (changed) { CommandUtils.WriteXDocument(currentXDocToFix, f); } } }
public override void Run(IEnumerable <string> args) { string rootdir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref rootdir, ref omitlist, ref processlist, ref pattern ); string message = "For internal use only."; string sigil = "To be added."; bool nocheck = false; bool nosigil = false; var opt = new OptionSet { { "m|message=", (m) => message = m }, { "s|sigil=", (s) => sigil = s }, { "no-check-browsable", (n) => nocheck = n != null }, { "no-check-TBA", (t) => nosigil = t != null } }; extras = opt.Parse(extras); CommandUtils.ThrowOnFiniteExtras(extras); Func <XElement, bool> hassigil; Func <XDocument, bool> typehassigil; Func <XElement, bool> qualifies; if (nosigil) { // Mark types and members internal, regardless of whether the summaries are filled out hassigil = (x) => true; typehassigil = (x) => true; } else { hassigil = (e) => e.Element("Docs").Element("summary").Value == sigil; typehassigil = (t) => t.Element("Type").Element("Docs").Element("summary").Value == sigil; } if (!nocheck) { qualifies = (e) => { return(e.Elements("Attributes") .Any((XElement child) => child.Elements("Attribute") .Any((XElement name) => name.Value.Contains("EditorBrowsableState.Never"))) && hassigil(e)); }; } else { qualifies = hassigil; } foreach (string file in CommandUtils.GetFileList(processlist, omitlist, rootdir, pattern)) { XDocument xdoc = new XDocument(XElement.Load(file)); // Find every member that has the internal marker and summary="To be added." (or the provided sigil) XElement memberRoot = xdoc.Element("Type").Element("Members"); if (memberRoot == null || !memberRoot.Descendants().Any()) { continue; } IEnumerable <XElement> hits = memberRoot.Elements("Member").Where(s => qualifies(s)); foreach (XElement x in hits) { x.Element("Docs").Element("summary").Value = message; } if (typehassigil(xdoc)) { xdoc.Element("Type").Element("Docs").Element("summary").Value = message; } CommandUtils.WriteXDocument(xdoc, file); } }
public override void Run(IEnumerable <string> args) { string rootdir = ""; string omitlist = ""; string processlist = ""; string pattern = ""; List <string> extras = CommandUtils.ProcessFileArgs(args, ref rootdir, ref omitlist, ref processlist, ref pattern); string obsoleteMarker = "System.Obsolete"; string sigil = "To be added."; bool skipSigil = false; string message = "Deprecated. Do not use."; var opt = new OptionSet { { "a|attribute", (x) => obsoleteMarker = x }, { "s|sigil=", (s) => sigil = s }, { "no-check-TBA", (s) => skipSigil = s != null }, { "m|message=", (m) => message = m } }; extras = opt.Parse(extras); CommandUtils.ThrowOnFiniteExtras(extras); Func <XElement, bool> sigilCheck; Func <XElement, bool> obsoleteCheck; if (skipSigil) { sigilCheck = (e) => true; } else { sigilCheck = (e) => e.Element("Docs").Element("summary").Value == sigil; } obsoleteCheck = (e) => e.Elements("Attribute").Any((arg) => arg.Elements("Attribute").Any((arg2) => arg2.Value.StartsWith(obsoleteMarker)));;; foreach (string file in CommandUtils.GetFileList(processlist, omitlist, rootdir, pattern)) { // find all the ones that have attributes that start with the provided attribute XDocument xdoc = XDocument.Load(file); XElement memberRoot = xdoc.Element("Type").Element("Members"); if (memberRoot == null || !memberRoot.Descendants().Any()) { continue; } foreach (XElement toMark in memberRoot.Elements("Member") .Where((e) => obsoleteCheck(e) && sigilCheck(e))) { toMark.Element("Docs").Element("summary").Value = message; } CommandUtils.WriteXDocument(xdoc, file); } }