Skip to content

Commit e402e46

Browse files
committed
tmp
1 parent 39d8ea9 commit e402e46

File tree

3 files changed

+937
-428
lines changed

3 files changed

+937
-428
lines changed

_old.cs

Lines changed: 397 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,397 @@
1+
2+
//internal static SyntaxList<SyntaxNode> _(IDocsAPI api, SyntaxList<XmlNodeSyntax> originalXmls, SyntaxTrivia? indentationTrivia, bool skipRemarks)
3+
//{
4+
// List<SyntaxNode> updated = new();
5+
6+
// if (TryGetOrCreateXmlRows(originalXmls, SummaryTag, api.Summary, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> summaryNodes, out _))
7+
// {
8+
// updated.AddRange(summaryNodes);
9+
// }
10+
11+
// if (TryGetOrCreateXmlRows(originalXmls, ValueTag, api.Value, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> valueNodes, out _))
12+
// {
13+
// updated.AddRange(valueNodes);
14+
// }
15+
16+
// foreach (DocsTypeParam typeParam in api.TypeParams)
17+
// {
18+
// if (TryGetOrCreateXmlRows(originalXmls, TypeParamTag, typeParam.Value, attributeValue: typeParam.Name, indentationTrivia, out List<XmlNodeSyntax> typeParamNodes, out _))
19+
// {
20+
// updated.AddRange(typeParamNodes);
21+
// }
22+
// }
23+
24+
// foreach (DocsParam param in api.Params)
25+
// {
26+
// if (TryGetOrCreateXmlRows(originalXmls, ParamTag, param.Value, attributeValue: param.Name, indentationTrivia, out List<XmlNodeSyntax> paramNodes, out _))
27+
// {
28+
// updated.AddRange(paramNodes);
29+
// }
30+
// }
31+
32+
// if (TryGetOrCreateXmlRows(originalXmls, ReturnsTag, api.Returns, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> returnsNodes, out _))
33+
// {
34+
// updated.AddRange(returnsNodes);
35+
// }
36+
37+
// foreach (DocsException exception in api.Exceptions)
38+
// {
39+
// if (TryGetOrCreateXmlRows(originalXmls, ExceptionTag, exception.Value, attributeValue: exception.Cref[2..], indentationTrivia, out List<XmlNodeSyntax> exceptionNodes, out _))
40+
// {
41+
// updated.AddRange(exceptionNodes);
42+
// }
43+
// }
44+
45+
// if (TryGetOrCreateXmlRows(originalXmls, RemarksTag, api.Remarks, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> remarksNodes, out bool isBackported) &&
46+
// (!isBackported || (isBackported && !skipRemarks)))
47+
// {
48+
// updated.AddRange(remarksNodes);
49+
// }
50+
51+
// return new SyntaxList<SyntaxNode>(updated);
52+
//}
53+
54+
55+
56+
//private static bool TryGetOrCreateXmlRows(SyntaxList<XmlNodeSyntax> originalXmls, string tagName,
57+
// string apiDocsText, string? attributeValue, SyntaxTrivia? indentationTrivia, out List<XmlNodeSyntax> rows, out bool isBackported)
58+
//{
59+
// rows = [];
60+
61+
// if (apiDocsText.IsDocsEmpty())
62+
// {
63+
// isBackported = false;
64+
65+
// // Not yet documented in api docs, so try to see if it was already documented in triple slash
66+
// XmlNodeSyntax? xmlNode = originalXmls.FirstOrDefault(xmlNode => DoesNodeHaveTag(xmlNode, tagName));
67+
68+
// if (xmlNode != null)
69+
// {
70+
// rows.Add(xmlNode);
71+
// return true;
72+
// }
73+
74+
// // We don't want to add an empty xml item. We want don't want to add one in this case, it needs
75+
// // to be missing on purpose so the developer sees the build error and adds it manually.
76+
77+
// return false;
78+
// }
79+
80+
// isBackported = true;
81+
82+
// List<XmlNodeSyntax> nodes = new();
83+
84+
// bool first = true;
85+
// foreach (string line in apiDocsText.Split(_NewLineSeparators, _NewLineSplitOptions))
86+
// {
87+
// // Overwrite the current triple slash with the text that comes from api docs
88+
// SyntaxToken textLiteral = SyntaxFactory.XmlTextLiteral(
89+
// leading: SyntaxFactory.TriviaList(),
90+
// text: line,
91+
// value: line,
92+
// trailing: SyntaxFactory.TriviaList());
93+
94+
// XmlTextSyntax xmlText = SyntaxFactory.XmlText().WithTextTokens(SyntaxFactory.TokenList(textLiteral));
95+
96+
// if (first)
97+
// {
98+
// nodes.Add(xmlText);
99+
// first = false;
100+
// }
101+
// else
102+
// {
103+
// IEnumerable<XmlNodeSyntax> content = GetXmlRow(xmlText, indentationTrivia);
104+
// nodes.AddRange(content);
105+
// }
106+
// }
107+
108+
// rows.AddRange(GetXmlRow(CreateXmlNode(tagName, nodes.ToArray(), attributeValue), indentationTrivia));
109+
110+
// return true;
111+
//}
112+
113+
//private static IEnumerable<XmlNodeSyntax> GetXmlRow(XmlNodeSyntax item, SyntaxTrivia? indentationTrivia)
114+
//{
115+
// yield return GetIndentationNode(indentationTrivia);
116+
// yield return GetTripleSlashNode();
117+
// yield return item;
118+
// yield return GetNewLineNode();
119+
//}
120+
121+
//private static XmlTextSyntax GetTripleSlashNode()
122+
//{
123+
// SyntaxToken token = SyntaxFactory.XmlTextLiteral(
124+
// leading: SyntaxFactory.TriviaList(SyntaxFactory.DocumentationCommentExterior(TripleSlash)),
125+
// text: Space,
126+
// value: Space,
127+
// trailing: SyntaxFactory.TriviaList());
128+
129+
// return SyntaxFactory.XmlText().WithTextTokens(SyntaxFactory.TokenList(token));
130+
//}
131+
132+
//private static XmlTextSyntax GetIndentationNode(SyntaxTrivia? indentationTrivia)
133+
//{
134+
// List<SyntaxTrivia> triviaList = new();
135+
136+
// if (indentationTrivia != null)
137+
// {
138+
// triviaList.Add(indentationTrivia.Value);
139+
// }
140+
141+
// SyntaxToken token = SyntaxFactory.XmlTextLiteral(
142+
// leading: SyntaxFactory.TriviaList(triviaList),
143+
// text: string.Empty,
144+
// value: string.Empty,
145+
// trailing: SyntaxFactory.TriviaList());
146+
147+
// return SyntaxFactory.XmlText().WithTextTokens(SyntaxFactory.TokenList(token));
148+
149+
//}
150+
151+
//private static XmlTextSyntax GetNewLineNode()
152+
//{
153+
// List<SyntaxToken> tokens = new()
154+
// {
155+
// SyntaxFactory.XmlTextNewLine(
156+
// leading: SyntaxFactory.TriviaList(),
157+
// text: NewLine,
158+
// value: NewLine,
159+
// trailing: SyntaxFactory.TriviaList())
160+
// };
161+
162+
// return SyntaxFactory.XmlText().WithTextTokens(SyntaxFactory.TokenList(tokens));
163+
//}
164+
165+
//private static XmlElementSyntax CreateXmlNode(string tagName, XmlNodeSyntax[] content, string? attributeValue = null)
166+
//{
167+
// XmlElementSyntax result;
168+
169+
// switch (tagName)
170+
// {
171+
// case SummaryTag:
172+
// result = SyntaxFactory.XmlSummaryElement(content);
173+
// break;
174+
175+
// case ReturnsTag:
176+
// result = SyntaxFactory.XmlReturnsElement(content);
177+
// break;
178+
179+
// case ParamTag:
180+
// Debug.Assert(!string.IsNullOrWhiteSpace(attributeValue));
181+
// result = SyntaxFactory.XmlParamElement(attributeValue, content);
182+
// break;
183+
184+
// case ValueTag:
185+
// result = SyntaxFactory.XmlValueElement(content);
186+
// break;
187+
188+
// case ExceptionTag:
189+
// Debug.Assert(!string.IsNullOrWhiteSpace(attributeValue));
190+
// // Workaround because I can't figure out how to make a CrefSyntax object
191+
// result = GetXmlAttributedElement(content, ExceptionTag, CrefAttributeName, attributeValue);
192+
// break;
193+
194+
// case TypeParamTag:
195+
// Debug.Assert(!string.IsNullOrWhiteSpace(attributeValue));
196+
// // Workaround because I couldn't find a SyntaxFactor for TypeParam like we have for Param
197+
// result = GetXmlAttributedElement(content, TypeParamTag, NameAttributeName, attributeValue);
198+
// break;
199+
200+
// case RemarksTag:
201+
// result = SyntaxFactory.XmlRemarksElement(content);
202+
// break;
203+
204+
// default:
205+
// throw new NotSupportedException();
206+
// }
207+
208+
// return result;
209+
//}
210+
211+
//private static XmlElementSyntax GetXmlAttributedElement(IEnumerable<XmlNodeSyntax> content, string tagName, string attributeName, string attributeValue)
212+
//{
213+
// Debug.Assert(!string.IsNullOrWhiteSpace(tagName));
214+
// Debug.Assert(!string.IsNullOrWhiteSpace(attributeName));
215+
// Debug.Assert(!string.IsNullOrWhiteSpace(attributeValue));
216+
217+
// XmlElementStartTagSyntax startTag = SyntaxFactory.XmlElementStartTag(SyntaxFactory.XmlName(SyntaxFactory.Identifier(tagName)));
218+
219+
// SyntaxToken xmlAttributeName = SyntaxFactory.Identifier(
220+
// leading: SyntaxFactory.TriviaList(SyntaxFactory.Space),
221+
// text: attributeName,
222+
// trailing: SyntaxFactory.TriviaList());
223+
224+
// XmlNameAttributeSyntax xmlAttribute = SyntaxFactory.XmlNameAttribute(
225+
// name: SyntaxFactory.XmlName(xmlAttributeName),
226+
// startQuoteToken: SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken),
227+
// identifier: SyntaxFactory.IdentifierName(attributeValue),
228+
// endQuoteToken: SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken));
229+
230+
// SyntaxList<XmlAttributeSyntax> startTagAttributes = SyntaxFactory.SingletonList<XmlAttributeSyntax>(xmlAttribute);
231+
232+
// startTag = startTag.WithAttributes(startTagAttributes);
233+
234+
// XmlElementEndTagSyntax endTag = SyntaxFactory.XmlElementEndTag(SyntaxFactory.XmlName(SyntaxFactory.Identifier(tagName)));
235+
236+
// return SyntaxFactory.XmlElement(startTag, SyntaxFactory.List(content), endTag);
237+
//}
238+
239+
private static bool DoesNodeHaveTag(SyntaxNode xmlNode, string tagName)
240+
{
241+
if (tagName == ExceptionTag)
242+
{
243+
// Temporary workaround to avoid overwriting all existing triple slash exceptions
244+
return false;
245+
}
246+
return xmlNode.Kind() is SyntaxKind.XmlElement &&
247+
xmlNode is XmlElementSyntax xmlElement &&
248+
xmlElement.StartTag.Name.LocalName.ValueText == tagName;
249+
}
250+
251+
252+
private SyntaxTriviaList _GetOrCreateXmlNodes(IDocsAPI api, SyntaxList<XmlNodeSyntax>? originalXmls, SyntaxTrivia? indentationTrivia, bool skipRemarks)
253+
{
254+
_ = api; _ = content; _ = skipRemarks;
255+
256+
SyntaxList<XmlNodeSyntax> list = SyntaxFactory.List<XmlNodeSyntax>(
257+
[
258+
GetTripleSlashTextSyntaxNode(indentationTrivia, withLeadingNewLine: false),
259+
260+
SyntaxFactory.XmlSummaryElement(
261+
SyntaxFactory.SingletonList<XmlNodeSyntax>(
262+
GetTripleSlashTextSyntaxNode(indentationTrivia, originalXmls))),
263+
264+
265+
GetTripleSlashTextSyntaxNode(indentationTrivia),
266+
267+
268+
SyntaxFactory.XmlParamElement("myParameter", SyntaxFactory.SingletonList<XmlNodeSyntax>(
269+
SyntaxFactory.XmlText()
270+
.WithTextTokens(
271+
SyntaxFactory.TokenList(
272+
SyntaxFactory.XmlTextLiteral(
273+
SyntaxFactory.TriviaList(),
274+
"MyParameter",
275+
"MyParameter",
276+
SyntaxFactory.TriviaList()))))),
277+
278+
279+
280+
GetNewLineTextSyntaxNode()
281+
]);
282+
283+
SyntaxTriviaList documentationTrivia = SyntaxFactory.TriviaList(SyntaxFactory.Trivia(SyntaxFactory.DocumentationCommentTrivia(SyntaxKind.SingleLineDocumentationCommentTrivia, list)));
284+
285+
return documentationTrivia;
286+
}
287+
288+
internal SyntaxList<SyntaxNode> _(IDocsAPI api, SyntaxList<XmlNodeSyntax> originalXmls, SyntaxTrivia? indentationTrivia, bool skipRemarks)
289+
{
290+
SyntaxList<XmlNodeSyntax> updated = new();
291+
292+
if (TryGetOrCreateXmlRows(originalXmls, SummaryTag, api.Summary, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> summaryNodes, out _))
293+
{
294+
updated.AddRange(summaryNodes);
295+
}
296+
297+
if (TryGetOrCreateXmlRows(originalXmls, ValueTag, api.Value, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> valueNodes, out _))
298+
{
299+
updated.AddRange(valueNodes);
300+
}
301+
302+
foreach (DocsTypeParam typeParam in api.TypeParams)
303+
{
304+
if (TryGetOrCreateXmlRows(originalXmls, TypeParamTag, typeParam.Value, attributeValue: typeParam.Name, indentationTrivia, out List<XmlNodeSyntax> typeParamNodes, out _))
305+
{
306+
updated.AddRange(typeParamNodes);
307+
}
308+
}
309+
310+
foreach (DocsParam param in api.Params)
311+
{
312+
if (TryGetOrCreateXmlRows(originalXmls, ParamTag, param.Value, attributeValue: param.Name, indentationTrivia, out List<XmlNodeSyntax> paramNodes, out _))
313+
{
314+
updated.AddRange(paramNodes);
315+
}
316+
}
317+
318+
if (TryGetOrCreateXmlRows(originalXmls, ReturnsTag, api.Returns, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> returnsNodes, out _))
319+
{
320+
updated.AddRange(returnsNodes);
321+
}
322+
323+
foreach (DocsException exception in api.Exceptions)
324+
{
325+
if (TryGetOrCreateXmlRows(originalXmls, ExceptionTag, exception.Value, attributeValue: exception.Cref[2..], indentationTrivia, out List<XmlNodeSyntax> exceptionNodes, out _))
326+
{
327+
updated.AddRange(exceptionNodes);
328+
}
329+
}
330+
331+
if (TryGetOrCreateXmlRows(originalXmls, RemarksTag, api.Remarks, attributeValue: null, indentationTrivia, out List<XmlNodeSyntax> remarksNodes, out bool isBackported) &&
332+
(!isBackported || (isBackported && !skipRemarks)))
333+
{
334+
updated.AddRange(remarksNodes);
335+
}
336+
337+
SyntaxTriviaList documentationTrivia = SyntaxFactory.TriviaList(SyntaxFactory.Trivia(SyntaxFactory.DocumentationCommentTrivia(SyntaxKind.SingleLineDocumentationCommentTrivia, updated)));
338+
339+
return documentationTrivia;
340+
}
341+
342+
private static bool TryGetOrCreateXmlRows(SyntaxList<XmlNodeSyntax> originalXmls, string tagName,
343+
string apiDocsText, string? attributeValue, SyntaxTrivia? indentationTrivia, out List<XmlNodeSyntax> rows, out bool isBackported)
344+
{
345+
rows = [];
346+
347+
if (apiDocsText.IsDocsEmpty())
348+
{
349+
isBackported = false;
350+
351+
// Not yet documented in api docs, so try to see if it was already documented in triple slash
352+
XmlNodeSyntax? xmlNode = originalXmls.FirstOrDefault(xmlNode => DoesNodeHaveTag(xmlNode, tagName));
353+
354+
if (xmlNode != null)
355+
{
356+
rows.Add(xmlNode);
357+
return true;
358+
}
359+
360+
// We don't want to add an empty xml item. We want don't want to add one in this case, it needs
361+
// to be missing on purpose so the developer sees the build error and adds it manually.
362+
363+
return false;
364+
}
365+
366+
isBackported = true;
367+
368+
List<XmlNodeSyntax> nodes = new();
369+
370+
bool first = true;
371+
foreach (string line in apiDocsText.Split(_NewLineSeparators, _NewLineSplitOptions))
372+
{
373+
// Overwrite the current triple slash with the text that comes from api docs
374+
SyntaxToken textLiteral = SyntaxFactory.XmlTextLiteral(
375+
leading: SyntaxFactory.TriviaList(),
376+
text: line,
377+
value: line,
378+
trailing: SyntaxFactory.TriviaList());
379+
380+
XmlTextSyntax xmlText = SyntaxFactory.XmlText().WithTextTokens(SyntaxFactory.TokenList(textLiteral));
381+
382+
if (first)
383+
{
384+
nodes.Add(xmlText);
385+
first = false;
386+
}
387+
else
388+
{
389+
IEnumerable<XmlNodeSyntax> content = GetXmlRow(xmlText, indentationTrivia);
390+
nodes.AddRange(content);
391+
}
392+
}
393+
394+
rows.AddRange(GetXmlRow(CreateXmlNode(tagName, nodes.ToArray(), attributeValue), indentationTrivia));
395+
396+
return true;
397+
}

0 commit comments

Comments
 (0)