提交 9c2c3382 编写于 作者: C Cyrus Najmabadi

Fix xml attribute name classification

上级 2349c133
......@@ -5518,5 +5518,60 @@ class C
Punctuation.Semicolon,
Punctuation.CloseCurly);
}
[Fact, WorkItem(48094, "https://github.com/dotnet/roslyn/issues/48094")]
public async Task TestXmlAttributeNameSpan1()
{
var source = @"/// <param name=""value""></param>";
using var workspace = CreateWorkspace(source, options: null, TestHost.InProcess);
var document = workspace.CurrentSolution.Projects.First().Documents.First();
var classifications = await GetSyntacticClassificationsAsync(document, new TextSpan(0, source.Length));
Assert.Equal(new[]
{
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(0, 3)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentText, new TextSpan(3, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(4, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentName, new TextSpan(5, 5)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentAttributeName, new TextSpan(11, 4)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(15, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentAttributeQuotes, new TextSpan(16, 1)),
new ClassifiedSpan(ClassificationTypeNames.Identifier, new TextSpan(17, 5)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentAttributeQuotes, new TextSpan(22, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(23, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(24, 2)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentName, new TextSpan(26, 5)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(31, 1))
}, classifications);
}
[Fact, WorkItem(48094, "https://github.com/dotnet/roslyn/issues/48094")]
public async Task TestXmlAttributeNameSpan2()
{
var source = @"
/// <param
/// name=""value""></param>";
using var workspace = CreateWorkspace(source, options: null, TestHost.InProcess);
var document = workspace.CurrentSolution.Projects.First().Documents.First();
var classifications = await GetSyntacticClassificationsAsync(document, new TextSpan(0, source.Length));
Assert.Equal(new[]
{
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(2, 3)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentText, new TextSpan(5, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(6, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentName, new TextSpan(7, 5)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(14, 3)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentAttributeName, new TextSpan(18, 4)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(22, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentAttributeQuotes, new TextSpan(23, 1)),
new ClassifiedSpan(ClassificationTypeNames.Identifier, new TextSpan(24, 5)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentAttributeQuotes, new TextSpan(29, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(30, 1)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(31, 2)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentName, new TextSpan(33, 5)),
new ClassifiedSpan(ClassificationTypeNames.XmlDocCommentDelimiter, new TextSpan(38, 1))
}, classifications);
}
}
}
......@@ -200,28 +200,32 @@ private void ClassifyXmlTextToken(SyntaxToken token)
private void ClassifyXmlName(XmlNameSyntax node)
{
string classificationType;
if (node.Parent is XmlAttributeSyntax)
var classificationType = node.Parent switch
{
classificationType = ClassificationTypeNames.XmlDocCommentAttributeName;
}
else if (node.Parent is XmlProcessingInstructionSyntax)
{
classificationType = ClassificationTypeNames.XmlDocCommentProcessingInstruction;
}
else
{
classificationType = ClassificationTypeNames.XmlDocCommentName;
}
XmlAttributeSyntax => ClassificationTypeNames.XmlDocCommentAttributeName,
XmlProcessingInstructionSyntax => ClassificationTypeNames.XmlDocCommentProcessingInstruction,
_ => ClassificationTypeNames.XmlDocCommentName,
};
var prefix = node.Prefix;
if (prefix != null)
{
AddXmlClassification(prefix.Prefix, classificationType);
AddXmlClassification(prefix.ColonToken, classificationType);
AddXmlNameTokenClassification(prefix.Prefix, classificationType);
AddXmlNameTokenClassification(prefix.ColonToken, classificationType);
}
AddXmlClassification(node.LocalName, classificationType);
AddXmlNameTokenClassification(node.LocalName, classificationType);
}
private void AddXmlNameTokenClassification(SyntaxToken token, string classificationType)
{
if (token.HasLeadingTrivia)
ClassifyXmlTrivia(token.LeadingTrivia, whitespaceClassificationType: null);
AddClassification(token, classificationType);
if (token.HasTrailingTrivia)
ClassifyXmlTrivia(token.TrailingTrivia, whitespaceClassificationType: null);
}
private void ClassifyXmlElement(XmlElementSyntax node)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册