Files
T

1186 lines
49 KiB
C#
Raw Normal View History

2026-08-27 10:56:38 -06:00
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Syntax.InternalSyntax;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax;
internal class DocumentationCommentParser : SyntaxParser
{
private enum SkipResult
{
Continue,
Abort
}
private readonly SyntaxListPool _pool = new SyntaxListPool();
private bool _isDelimited;
private readonly HashSet<string> _attributesSeen = new HashSet<string>();
private bool IsEndOfCrefAttribute
{
get
{
switch (base.CurrentToken.Kind)
{
case SyntaxKind.SingleQuoteToken:
return (base.Mode & LexerMode.XmlCrefQuote) == LexerMode.XmlCrefQuote;
case SyntaxKind.DoubleQuoteToken:
return (base.Mode & LexerMode.XmlCrefDoubleQuote) == LexerMode.XmlCrefDoubleQuote;
case SyntaxKind.EndOfDocumentationCommentToken:
case SyntaxKind.EndOfFileToken:
return true;
case SyntaxKind.BadToken:
if (!(base.CurrentToken.Text == SyntaxFacts.GetText(SyntaxKind.LessThanToken)))
{
return IsNonAsciiQuotationMark(base.CurrentToken);
}
return true;
default:
return false;
}
}
}
private bool InCref
{
get
{
LexerMode lexerMode = base.Mode & (LexerMode.XmlCrefQuote | LexerMode.XmlCrefDoubleQuote);
if (lexerMode == LexerMode.XmlCrefQuote || lexerMode == LexerMode.XmlCrefDoubleQuote)
{
return true;
}
return false;
}
}
private bool IsEndOfNameAttribute
{
get
{
switch (base.CurrentToken.Kind)
{
case SyntaxKind.SingleQuoteToken:
return (base.Mode & LexerMode.XmlNameQuote) == LexerMode.XmlNameQuote;
case SyntaxKind.DoubleQuoteToken:
return (base.Mode & LexerMode.XmlNameDoubleQuote) == LexerMode.XmlNameDoubleQuote;
case SyntaxKind.EndOfDocumentationCommentToken:
case SyntaxKind.EndOfFileToken:
return true;
case SyntaxKind.BadToken:
if (!(base.CurrentToken.Text == SyntaxFacts.GetText(SyntaxKind.LessThanToken)))
{
return IsNonAsciiQuotationMark(base.CurrentToken);
}
return true;
default:
return false;
}
}
}
internal DocumentationCommentParser(Lexer lexer, LexerMode modeflags)
: base(lexer, LexerMode.XmlDocComment | modeflags, null, null, allowModeReset: true)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
_isDelimited = (modeflags & LexerMode.XmlDocCommentStyleDelimited) != 0;
}
internal void ReInitialize(LexerMode modeflags)
{
ReInitialize();
base.Mode = LexerMode.XmlDocComment | modeflags;
_isDelimited = (modeflags & LexerMode.XmlDocCommentStyleDelimited) != 0;
}
private LexerMode SetMode(LexerMode mode)
{
LexerMode mode2 = base.Mode;
base.Mode = mode | (mode2 & (LexerMode.MaskXmlDocCommentLocation | LexerMode.MaskXmlDocCommentStyle));
return mode2;
}
private void ResetMode(LexerMode mode)
{
base.Mode = mode;
}
public DocumentationCommentTriviaSyntax ParseDocumentationComment(out bool isTerminated)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
SyntaxListBuilder<XmlNodeSyntax> val = _pool.Allocate<XmlNodeSyntax>();
try
{
ParseXmlNodes(val);
if (base.CurrentToken.Kind != SyntaxKind.EndOfDocumentationCommentToken)
{
ParseRemainder(val);
}
SyntaxToken syntaxToken = EatToken(SyntaxKind.EndOfDocumentationCommentToken);
isTerminated = !_isDelimited || (syntaxToken.LeadingTrivia.Count > 0 && ((object)syntaxToken.LeadingTrivia[syntaxToken.LeadingTrivia.Count - 1]).ToString() == "*/");
return SyntaxFactory.DocumentationCommentTrivia(_isDelimited ? SyntaxKind.MultiLineDocumentationCommentTrivia : SyntaxKind.SingleLineDocumentationCommentTrivia, val.ToList(), syntaxToken);
}
finally
{
_pool.Free(SyntaxListBuilder<XmlNodeSyntax>.op_Implicit(val));
}
}
public void ParseRemainder(SyntaxListBuilder<XmlNodeSyntax> nodes)
{
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
bool flag = base.CurrentToken.Kind == SyntaxKind.LessThanSlashToken;
LexerMode mode = SetMode(LexerMode.XmlCDataSectionText);
SyntaxListBuilder val = _pool.Allocate();
try
{
while (base.CurrentToken.Kind != SyntaxKind.EndOfDocumentationCommentToken)
{
SyntaxToken syntaxToken = EatToken();
val.Add((GreenNode)(object)syntaxToken);
}
XmlTextSyntax node = SyntaxFactory.XmlText(SyntaxList<SyntaxToken>.op_Implicit(val.ToList()));
XmlParseErrorCode code = (flag ? XmlParseErrorCode.XML_EndTagNotExpected : XmlParseErrorCode.XML_ExpectedEndOfXml);
node = WithAdditionalDiagnostics(node, new XmlSyntaxDiagnosticInfo(0, 1, code));
nodes.Add((XmlNodeSyntax)node);
}
finally
{
_pool.Free(val);
}
ResetMode(mode);
}
private void ParseXmlNodes(SyntaxListBuilder<XmlNodeSyntax> nodes)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
while (true)
{
XmlNodeSyntax xmlNodeSyntax = ParseXmlNode();
if (xmlNodeSyntax == null)
{
break;
}
nodes.Add(xmlNodeSyntax);
}
}
private XmlNodeSyntax ParseXmlNode()
{
switch (base.CurrentToken.Kind)
{
case SyntaxKind.XmlEntityLiteralToken:
case SyntaxKind.XmlTextLiteralToken:
case SyntaxKind.XmlTextLiteralNewLineToken:
return ParseXmlText();
case SyntaxKind.LessThanToken:
return ParseXmlElement();
case SyntaxKind.XmlCommentStartToken:
return ParseXmlComment();
case SyntaxKind.XmlCDataStartToken:
return ParseXmlCDataSection();
case SyntaxKind.XmlProcessingInstructionStartToken:
return ParseXmlProcessingInstruction();
case SyntaxKind.EndOfDocumentationCommentToken:
return null;
default:
return null;
}
}
private bool IsXmlNodeStartOrStop()
{
switch (base.CurrentToken.Kind)
{
case SyntaxKind.LessThanToken:
case SyntaxKind.GreaterThanToken:
case SyntaxKind.SlashGreaterThanToken:
case SyntaxKind.LessThanSlashToken:
case SyntaxKind.XmlCommentStartToken:
case SyntaxKind.XmlCDataStartToken:
case SyntaxKind.XmlProcessingInstructionStartToken:
case SyntaxKind.EndOfDocumentationCommentToken:
return true;
default:
return false;
}
}
private XmlNodeSyntax ParseXmlText()
{
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
SyntaxListBuilder val = _pool.Allocate();
while (base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken || base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken || base.CurrentToken.Kind == SyntaxKind.XmlEntityLiteralToken)
{
val.Add((GreenNode)(object)EatToken());
}
SyntaxList<GreenNode> val2 = val.ToList();
_pool.Free(val);
return SyntaxFactory.XmlText(SyntaxList<SyntaxToken>.op_Implicit(val2));
}
private XmlNodeSyntax ParseXmlElement()
{
//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
//IL_0255: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_023e: Unknown result type (might be due to invalid IL or missing references)
//IL_023f: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
SyntaxToken syntaxToken = EatToken(SyntaxKind.LessThanToken);
LexerMode mode = SetMode(LexerMode.XmlElementTag);
XmlNameSyntax elementName = ParseXmlName();
if (((GreenNode)syntaxToken).GetTrailingTriviaWidth() > 0 || ((GreenNode)elementName).GetLeadingTriviaWidth() > 0)
{
elementName = WithXmlParseError(elementName, XmlParseErrorCode.XML_InvalidWhitespace);
}
SyntaxListBuilder<XmlAttributeSyntax> val = _pool.Allocate<XmlAttributeSyntax>();
try
{
ParseXmlAttributes(ref elementName, val);
if (base.CurrentToken.Kind == SyntaxKind.GreaterThanToken)
{
XmlElementStartTagSyntax startTag = SyntaxFactory.XmlElementStartTag(syntaxToken, elementName, SyntaxListBuilder<XmlAttributeSyntax>.op_Implicit(val), EatToken());
SetMode(LexerMode.XmlDocComment);
SyntaxListBuilder<XmlNodeSyntax> val2 = _pool.Allocate<XmlNodeSyntax>();
try
{
ParseXmlNodes(val2);
SyntaxToken syntaxToken2 = EatToken(SyntaxKind.LessThanSlashToken, reportError: false);
XmlNameSyntax startNode;
SyntaxToken greaterThanToken;
if (((GreenNode)syntaxToken2).IsMissing)
{
ResetMode(mode);
syntaxToken2 = WithXmlParseError(syntaxToken2, XmlParseErrorCode.XML_EndTagExpected, ((object)elementName).ToString());
startNode = SyntaxFactory.XmlName(null, SyntaxFactory.MissingToken(SyntaxKind.IdentifierToken));
greaterThanToken = SyntaxFactory.MissingToken(SyntaxKind.GreaterThanToken);
}
else
{
SetMode(LexerMode.XmlElementTag);
startNode = ParseXmlName();
if (((GreenNode)syntaxToken2).GetTrailingTriviaWidth() > 0 || ((GreenNode)startNode).GetLeadingTriviaWidth() > 0)
{
startNode = WithXmlParseError(startNode, XmlParseErrorCode.XML_InvalidWhitespace);
}
if (!((GreenNode)startNode).IsMissing && !MatchingXmlNames(elementName, startNode))
{
startNode = WithXmlParseError(startNode, XmlParseErrorCode.XML_ElementTypeMatch, ((object)startNode).ToString(), ((object)elementName).ToString());
}
if (base.CurrentToken.Kind != SyntaxKind.GreaterThanToken)
{
SkipBadTokens(ref startNode, null, (DocumentationCommentParser p) => p.CurrentToken.Kind != SyntaxKind.GreaterThanToken, (DocumentationCommentParser p) => p.IsXmlNodeStartOrStop(), XmlParseErrorCode.XML_InvalidToken);
}
greaterThanToken = EatToken(SyntaxKind.GreaterThanToken);
}
XmlElementEndTagSyntax endTag = SyntaxFactory.XmlElementEndTag(syntaxToken2, startNode, greaterThanToken);
ResetMode(mode);
return SyntaxFactory.XmlElement(startTag, val2.ToList(), endTag);
}
finally
{
_pool.Free(SyntaxListBuilder<XmlNodeSyntax>.op_Implicit(val2));
}
}
SyntaxToken syntaxToken3 = EatToken(SyntaxKind.SlashGreaterThanToken, reportError: false);
if (((GreenNode)syntaxToken3).IsMissing && !((GreenNode)elementName).IsMissing)
{
syntaxToken3 = WithXmlParseError(syntaxToken3, XmlParseErrorCode.XML_ExpectedEndOfTag, ((object)elementName).ToString());
}
ResetMode(mode);
return SyntaxFactory.XmlEmptyElement(syntaxToken, elementName, SyntaxListBuilder<XmlAttributeSyntax>.op_Implicit(val), syntaxToken3);
}
finally
{
_pool.Free(SyntaxListBuilder<XmlAttributeSyntax>.op_Implicit(val));
}
}
private static bool MatchingXmlNames(XmlNameSyntax name, XmlNameSyntax endName)
{
if (name == endName)
{
return true;
}
if (!((GreenNode)name).HasLeadingTrivia && !((GreenNode)endName).HasTrailingTrivia && ((GreenNode)name).IsEquivalentTo((GreenNode)(object)endName))
{
return true;
}
return ((object)name).ToString() == ((object)endName).ToString();
}
private void ParseXmlAttributes(ref XmlNameSyntax elementName, SyntaxListBuilder<XmlAttributeSyntax> attrs)
{
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
_attributesSeen.Clear();
while (true)
{
if (base.CurrentToken.Kind == SyntaxKind.IdentifierToken)
{
XmlAttributeSyntax xmlAttributeSyntax = ParseXmlAttribute(elementName);
string text = ((object)xmlAttributeSyntax.Name).ToString();
if (!_attributesSeen.Add(text))
{
xmlAttributeSyntax = WithXmlParseError(xmlAttributeSyntax, XmlParseErrorCode.XML_DuplicateAttribute, text);
}
attrs.Add(xmlAttributeSyntax);
}
else if (SkipBadTokens(ref elementName, SyntaxListBuilder<XmlAttributeSyntax>.op_Implicit(attrs), (DocumentationCommentParser p) => p.CurrentToken.Kind != SyntaxKind.IdentifierName, (DocumentationCommentParser p) => p.CurrentToken.Kind == SyntaxKind.GreaterThanToken || p.CurrentToken.Kind == SyntaxKind.SlashGreaterThanToken || p.CurrentToken.Kind == SyntaxKind.LessThanToken || p.CurrentToken.Kind == SyntaxKind.LessThanSlashToken || p.CurrentToken.Kind == SyntaxKind.EndOfDocumentationCommentToken || p.CurrentToken.Kind == SyntaxKind.EndOfFileToken, XmlParseErrorCode.XML_InvalidToken) == SkipResult.Abort)
{
break;
}
}
}
private SkipResult SkipBadTokens<T>(ref T startNode, SyntaxListBuilder list, Func<DocumentationCommentParser, bool> isNotExpectedFunction, Func<DocumentationCommentParser, bool> abortFunction, XmlParseErrorCode error) where T : CSharpSyntaxNode
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
SyntaxListBuilder<SyntaxToken> val = default(SyntaxListBuilder<SyntaxToken>);
bool flag = false;
try
{
SkipResult result = SkipResult.Continue;
while (isNotExpectedFunction(this))
{
if (abortFunction(this))
{
result = SkipResult.Abort;
break;
}
if (val.IsNull)
{
val = _pool.Allocate<SyntaxToken>();
}
SyntaxToken syntaxToken = EatToken();
if (!flag)
{
syntaxToken = WithXmlParseError(syntaxToken, error, ((object)syntaxToken).ToString());
flag = true;
}
val.Add(syntaxToken);
}
if (!val.IsNull && val.Count > 0)
{
if (list == null || list.Count == 0)
{
startNode = AddTrailingSkippedSyntax(startNode, val.ToListNode());
}
else
{
list[list.Count - 1] = (GreenNode)(object)AddTrailingSkippedSyntax((CSharpSyntaxNode)(object)list[list.Count - 1], val.ToListNode());
}
return result;
}
return SkipResult.Abort;
}
finally
{
if (!val.IsNull)
{
_pool.Free(SyntaxListBuilder<SyntaxToken>.op_Implicit(val));
}
}
}
private XmlAttributeSyntax ParseXmlAttribute(XmlNameSyntax elementName)
{
//IL_0129: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
XmlNameSyntax xmlNameSyntax = ParseXmlName();
if (((GreenNode)xmlNameSyntax).GetLeadingTriviaWidth() == 0)
{
xmlNameSyntax = WithXmlParseError(xmlNameSyntax, XmlParseErrorCode.XML_WhitespaceMissing);
}
SyntaxToken syntaxToken = EatToken(SyntaxKind.EqualsToken, reportError: false);
if (((GreenNode)syntaxToken).IsMissing)
{
syntaxToken = WithXmlParseError(syntaxToken, XmlParseErrorCode.XML_MissingEqualsAttribute);
SyntaxKind kind = base.CurrentToken.Kind;
if (kind - 8213 > SyntaxKind.List)
{
return SyntaxFactory.XmlTextAttribute(xmlNameSyntax, syntaxToken, SyntaxFactory.MissingToken(SyntaxKind.DoubleQuoteToken), default(SyntaxList<SyntaxToken>), SyntaxFactory.MissingToken(SyntaxKind.DoubleQuoteToken));
}
}
string valueText = xmlNameSyntax.LocalName.ValueText;
bool flag = xmlNameSyntax.Prefix == null;
SyntaxToken startQuote;
SyntaxToken endQuote;
if (flag && DocumentationCommentXmlNames.AttributeEquals(valueText, "cref") && !IsVerbatimCref())
{
ParseCrefAttribute(out startQuote, out var cref, out endQuote);
return SyntaxFactory.XmlCrefAttribute(xmlNameSyntax, syntaxToken, startQuote, cref, endQuote);
}
if (flag && DocumentationCommentXmlNames.AttributeEquals(valueText, "name") && XmlElementSupportsNameAttribute(elementName))
{
ParseNameAttribute(out startQuote, out var identifier, out endQuote);
return SyntaxFactory.XmlNameAttribute(xmlNameSyntax, syntaxToken, startQuote, identifier, endQuote);
}
SyntaxListBuilder<SyntaxToken> val = _pool.Allocate<SyntaxToken>();
try
{
ParseXmlAttributeText(out startQuote, val, out endQuote);
return SyntaxFactory.XmlTextAttribute(xmlNameSyntax, syntaxToken, startQuote, SyntaxListBuilder<SyntaxToken>.op_Implicit(val), endQuote);
}
finally
{
_pool.Free(SyntaxListBuilder<SyntaxToken>.op_Implicit(val));
}
}
private static bool XmlElementSupportsNameAttribute(XmlNameSyntax elementName)
{
if (elementName.Prefix != null)
{
return false;
}
string valueText = elementName.LocalName.ValueText;
if (!DocumentationCommentXmlNames.ElementEquals(valueText, "param", false) && !DocumentationCommentXmlNames.ElementEquals(valueText, "paramref", false) && !DocumentationCommentXmlNames.ElementEquals(valueText, "typeparam", false))
{
return DocumentationCommentXmlNames.ElementEquals(valueText, "typeparamref", false);
}
return true;
}
private bool IsVerbatimCref()
{
bool result = false;
ResetPoint point = GetResetPoint();
SyntaxToken syntaxToken = EatToken((base.CurrentToken.Kind == SyntaxKind.SingleQuoteToken) ? SyntaxKind.SingleQuoteToken : SyntaxKind.DoubleQuoteToken);
SetMode(LexerMode.XmlCharacter);
SyntaxToken currentToken = base.CurrentToken;
if ((currentToken.Kind == SyntaxKind.XmlTextLiteralToken || currentToken.Kind == SyntaxKind.XmlEntityLiteralToken) && currentToken.ValueText != SyntaxFacts.GetText(syntaxToken.Kind) && currentToken.ValueText != ":")
{
EatToken();
currentToken = base.CurrentToken;
if ((currentToken.Kind == SyntaxKind.XmlTextLiteralToken || currentToken.Kind == SyntaxKind.XmlEntityLiteralToken) && currentToken.ValueText == ":")
{
result = true;
}
}
Reset(ref point);
Release(ref point);
return result;
}
private void ParseCrefAttribute(out SyntaxToken startQuote, out CrefSyntax cref, out SyntaxToken endQuote)
{
startQuote = ParseXmlAttributeStartQuote();
SyntaxKind kind = startQuote.Kind;
LexerMode mode = SetMode((kind == SyntaxKind.SingleQuoteToken) ? LexerMode.XmlCrefQuote : LexerMode.XmlCrefDoubleQuote);
cref = ParseCrefAttributeValue();
ResetMode(mode);
endQuote = ParseXmlAttributeEndQuote(kind);
}
private void ParseNameAttribute(out SyntaxToken startQuote, out IdentifierNameSyntax identifier, out SyntaxToken endQuote)
{
startQuote = ParseXmlAttributeStartQuote();
SyntaxKind kind = startQuote.Kind;
LexerMode mode = SetMode((kind == SyntaxKind.SingleQuoteToken) ? LexerMode.XmlNameQuote : LexerMode.XmlNameDoubleQuote);
identifier = ParseNameAttributeValue();
ResetMode(mode);
endQuote = ParseXmlAttributeEndQuote(kind);
}
private void ParseXmlAttributeText(out SyntaxToken startQuote, SyntaxListBuilder<SyntaxToken> textTokens, out SyntaxToken endQuote)
{
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
startQuote = ParseXmlAttributeStartQuote();
SyntaxKind kind = startQuote.Kind;
if (((GreenNode)startQuote).IsMissing && ((GreenNode)startQuote).FullWidth == 0)
{
endQuote = SyntaxFactory.MissingToken(kind);
return;
}
LexerMode mode = SetMode((kind == SyntaxKind.SingleQuoteToken) ? LexerMode.XmlAttributeTextQuote : LexerMode.XmlAttributeTextDoubleQuote);
while (base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken || base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken || base.CurrentToken.Kind == SyntaxKind.XmlEntityLiteralToken || base.CurrentToken.Kind == SyntaxKind.LessThanToken)
{
SyntaxToken syntaxToken = EatToken();
if (syntaxToken.Kind == SyntaxKind.LessThanToken)
{
syntaxToken = WithXmlParseError(syntaxToken, XmlParseErrorCode.XML_LessThanInAttributeValue);
}
textTokens.Add(syntaxToken);
}
ResetMode(mode);
endQuote = ParseXmlAttributeEndQuote(kind);
}
private SyntaxToken ParseXmlAttributeStartQuote()
{
if (IsNonAsciiQuotationMark(base.CurrentToken))
{
return SkipNonAsciiQuotationMark();
}
SyntaxKind kind = ((base.CurrentToken.Kind == SyntaxKind.SingleQuoteToken) ? SyntaxKind.SingleQuoteToken : SyntaxKind.DoubleQuoteToken);
SyntaxToken syntaxToken = EatToken(kind, reportError: false);
if (((GreenNode)syntaxToken).IsMissing)
{
syntaxToken = WithXmlParseError(syntaxToken, XmlParseErrorCode.XML_StringLiteralNoStartQuote);
}
return syntaxToken;
}
private SyntaxToken ParseXmlAttributeEndQuote(SyntaxKind quoteKind)
{
if (IsNonAsciiQuotationMark(base.CurrentToken))
{
return SkipNonAsciiQuotationMark();
}
SyntaxToken syntaxToken = EatToken(quoteKind, reportError: false);
if (((GreenNode)syntaxToken).IsMissing)
{
syntaxToken = WithXmlParseError(syntaxToken, XmlParseErrorCode.XML_StringLiteralNoEndQuote);
}
return syntaxToken;
}
private SyntaxToken SkipNonAsciiQuotationMark()
{
SyntaxToken node = SyntaxFactory.MissingToken(SyntaxKind.DoubleQuoteToken);
node = AddTrailingSkippedSyntax(node, (GreenNode)(object)EatToken());
return WithXmlParseError(node, XmlParseErrorCode.XML_StringLiteralNonAsciiQuote);
}
private static bool IsNonAsciiQuotationMark(SyntaxToken token)
{
if (token.Text.Length == 1)
{
return SyntaxFacts.IsNonAsciiQuotationMark(token.Text[0]);
}
return false;
}
private XmlNameSyntax ParseXmlName()
{
SyntaxToken syntaxToken = EatToken(SyntaxKind.IdentifierToken);
XmlPrefixSyntax prefix = null;
if (base.CurrentToken.Kind == SyntaxKind.ColonToken)
{
SyntaxToken syntaxToken2 = EatToken();
int trailingTriviaWidth = ((GreenNode)syntaxToken).GetTrailingTriviaWidth();
int leadingTriviaWidth = ((GreenNode)syntaxToken2).GetLeadingTriviaWidth();
if (trailingTriviaWidth > 0 || leadingTriviaWidth > 0)
{
int offset = -trailingTriviaWidth;
int width = trailingTriviaWidth + leadingTriviaWidth;
syntaxToken2 = WithAdditionalDiagnostics(syntaxToken2, new XmlSyntaxDiagnosticInfo(offset, width, XmlParseErrorCode.XML_InvalidWhitespace));
}
prefix = SyntaxFactory.XmlPrefix(syntaxToken, syntaxToken2);
syntaxToken = EatToken(SyntaxKind.IdentifierToken);
int trailingTriviaWidth2 = ((GreenNode)syntaxToken2).GetTrailingTriviaWidth();
int leadingTriviaWidth2 = ((GreenNode)syntaxToken).GetLeadingTriviaWidth();
if (trailingTriviaWidth2 > 0 || leadingTriviaWidth2 > 0)
{
int offset2 = -trailingTriviaWidth2;
int width2 = trailingTriviaWidth2 + leadingTriviaWidth2;
syntaxToken = WithAdditionalDiagnostics(syntaxToken, new XmlSyntaxDiagnosticInfo(offset2, width2, XmlParseErrorCode.XML_InvalidWhitespace));
}
}
return SyntaxFactory.XmlName(prefix, syntaxToken);
}
private XmlCommentSyntax ParseXmlComment()
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
SyntaxToken lessThanExclamationMinusMinusToken = EatToken(SyntaxKind.XmlCommentStartToken);
LexerMode mode = SetMode(LexerMode.XmlCommentText);
SyntaxListBuilder<SyntaxToken> val = _pool.Allocate<SyntaxToken>();
while (base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken || base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken || base.CurrentToken.Kind == SyntaxKind.MinusMinusToken)
{
SyntaxToken syntaxToken = EatToken();
if (syntaxToken.Kind == SyntaxKind.MinusMinusToken)
{
syntaxToken = WithXmlParseError(syntaxToken, XmlParseErrorCode.XML_IncorrectComment);
}
val.Add(syntaxToken);
}
SyntaxList<SyntaxToken> textTokens = val.ToList();
_pool.Free(SyntaxListBuilder<SyntaxToken>.op_Implicit(val));
SyntaxToken minusMinusGreaterThanToken = EatToken(SyntaxKind.XmlCommentEndToken);
ResetMode(mode);
return SyntaxFactory.XmlComment(lessThanExclamationMinusMinusToken, textTokens, minusMinusGreaterThanToken);
}
private XmlCDataSectionSyntax ParseXmlCDataSection()
{
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
SyntaxToken startCDataToken = EatToken(SyntaxKind.XmlCDataStartToken);
LexerMode mode = SetMode(LexerMode.XmlCDataSectionText);
SyntaxListBuilder<SyntaxToken> val = default(SyntaxListBuilder<SyntaxToken>);
val._002Ector(10);
while (base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken || base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken)
{
val.Add(EatToken());
}
SyntaxToken endCDataToken = EatToken(SyntaxKind.XmlCDataEndToken);
ResetMode(mode);
return SyntaxFactory.XmlCDataSection(startCDataToken, SyntaxListBuilder<SyntaxToken>.op_Implicit(val), endCDataToken);
}
private XmlProcessingInstructionSyntax ParseXmlProcessingInstruction()
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
SyntaxToken startProcessingInstructionToken = EatToken(SyntaxKind.XmlProcessingInstructionStartToken);
LexerMode mode = SetMode(LexerMode.XmlElementTag);
XmlNameSyntax name = ParseXmlName();
SetMode(LexerMode.XmlProcessingInstructionText);
SyntaxListBuilder<SyntaxToken> val = default(SyntaxListBuilder<SyntaxToken>);
val._002Ector(10);
while (base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralToken || base.CurrentToken.Kind == SyntaxKind.XmlTextLiteralNewLineToken)
{
SyntaxToken syntaxToken = EatToken();
val.Add(syntaxToken);
}
SyntaxToken endProcessingInstructionToken = EatToken(SyntaxKind.XmlProcessingInstructionEndToken);
ResetMode(mode);
return SyntaxFactory.XmlProcessingInstruction(startProcessingInstructionToken, name, SyntaxListBuilder<SyntaxToken>.op_Implicit(val), endProcessingInstructionToken);
}
protected override SyntaxDiagnosticInfo GetExpectedTokenError(SyntaxKind expected, SyntaxKind actual, int offset, int length)
{
if (InCref)
{
SyntaxDiagnosticInfo expectedTokenError = base.GetExpectedTokenError(expected, actual, offset, length);
return new SyntaxDiagnosticInfo(expectedTokenError.Offset, expectedTokenError.Width, ErrorCode.WRN_ErrorOverride, expectedTokenError, ((DiagnosticInfo)expectedTokenError).Code);
}
if (expected == SyntaxKind.IdentifierToken)
{
return new XmlSyntaxDiagnosticInfo(offset, length, XmlParseErrorCode.XML_ExpectedIdentifier);
}
return new XmlSyntaxDiagnosticInfo(offset, length, XmlParseErrorCode.XML_InvalidToken, SyntaxFacts.GetText(actual));
}
protected override SyntaxDiagnosticInfo GetExpectedTokenError(SyntaxKind expected, SyntaxKind actual)
{
if (InCref)
{
GetDiagnosticSpanForMissingToken(out var offset, out var width);
return GetExpectedTokenError(expected, actual, offset, width);
}
if (expected == SyntaxKind.IdentifierToken)
{
return new XmlSyntaxDiagnosticInfo(XmlParseErrorCode.XML_ExpectedIdentifier);
}
return new XmlSyntaxDiagnosticInfo(XmlParseErrorCode.XML_InvalidToken, SyntaxFacts.GetText(actual));
}
private TNode WithXmlParseError<TNode>(TNode node, XmlParseErrorCode code) where TNode : CSharpSyntaxNode
{
return WithAdditionalDiagnostics(node, new XmlSyntaxDiagnosticInfo(0, ((GreenNode)node).Width, code));
}
private TNode WithXmlParseError<TNode>(TNode node, XmlParseErrorCode code, params string[] args) where TNode : CSharpSyntaxNode
{
DiagnosticInfo[] array = new DiagnosticInfo[1];
array[0] = new XmlSyntaxDiagnosticInfo(0, ((GreenNode)node).Width, code, args);
return WithAdditionalDiagnostics(node, (DiagnosticInfo[])(object)array);
}
private SyntaxToken WithXmlParseError(SyntaxToken node, XmlParseErrorCode code, params string[] args)
{
DiagnosticInfo[] array = new DiagnosticInfo[1];
array[0] = new XmlSyntaxDiagnosticInfo(0, ((GreenNode)node).Width, code, args);
return WithAdditionalDiagnostics(node, (DiagnosticInfo[])(object)array);
}
protected override TNode WithAdditionalDiagnostics<TNode>(TNode node, params DiagnosticInfo[] diagnostics)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Invalid comparison between Unknown and I4
if ((int)((ParseOptions)base.Options).DocumentationMode < 2)
{
return node;
}
return base.WithAdditionalDiagnostics(node, diagnostics);
}
private CrefSyntax ParseCrefAttributeValue()
{
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
TypeSyntax typeSyntax = ParseCrefType(typeArgumentsMustBeIdentifiers: true, checkForMember: true);
CrefSyntax crefSyntax;
if (typeSyntax == null)
{
crefSyntax = ParseMemberCref();
}
else if (IsEndOfCrefAttribute)
{
crefSyntax = SyntaxFactory.TypeCref(typeSyntax);
}
else if (typeSyntax.Kind != SyntaxKind.QualifiedName && base.CurrentToken.Kind == SyntaxKind.OpenParenToken)
{
CrefParameterListSyntax parameters = ParseCrefParameterList();
crefSyntax = SyntaxFactory.NameMemberCref(typeSyntax, parameters);
}
else
{
SyntaxToken dotToken = EatToken(SyntaxKind.DotToken);
MemberCrefSyntax member = ParseMemberCref();
crefSyntax = SyntaxFactory.QualifiedCref(typeSyntax, dotToken, member);
}
bool flag = !IsEndOfCrefAttribute || ((GreenNode)crefSyntax).ContainsDiagnostics;
if (!IsEndOfCrefAttribute)
{
SyntaxListBuilder<SyntaxToken> val = _pool.Allocate<SyntaxToken>();
while (!IsEndOfCrefAttribute)
{
val.Add(EatToken());
}
crefSyntax = AddTrailingSkippedSyntax(crefSyntax, val.ToListNode());
_pool.Free(SyntaxListBuilder<SyntaxToken>.op_Implicit(val));
}
if (flag)
{
crefSyntax = AddError(crefSyntax, ErrorCode.WRN_BadXMLRefSyntax, ((GreenNode)crefSyntax).ToFullString());
}
return crefSyntax;
}
private MemberCrefSyntax ParseMemberCref()
{
switch (base.CurrentToken.Kind)
{
case SyntaxKind.ThisKeyword:
return ParseIndexerMemberCref();
case SyntaxKind.OperatorKeyword:
return ParseOperatorMemberCref();
case SyntaxKind.ExplicitKeyword:
case SyntaxKind.ImplicitKeyword:
return ParseConversionOperatorMemberCref();
default:
return ParseNameMemberCref();
}
}
private NameMemberCrefSyntax ParseNameMemberCref()
{
SimpleNameSyntax name = ParseCrefName(typeArgumentsMustBeIdentifiers: true);
CrefParameterListSyntax parameters = ParseCrefParameterList();
return SyntaxFactory.NameMemberCref(name, parameters);
}
private IndexerMemberCrefSyntax ParseIndexerMemberCref()
{
SyntaxToken thisKeyword = EatToken();
CrefBracketedParameterListSyntax parameters = ParseBracketedCrefParameterList();
return SyntaxFactory.IndexerMemberCref(thisKeyword, parameters);
}
private OperatorMemberCrefSyntax ParseOperatorMemberCref()
{
SyntaxToken operatorKeyword = EatToken();
SyntaxToken checkedKeyword = TryEatCheckedKeyword(isConversion: false, ref operatorKeyword);
SyntaxToken syntaxToken;
if (SyntaxFacts.IsAnyOverloadableOperator(base.CurrentToken.Kind))
{
syntaxToken = EatToken();
}
else
{
syntaxToken = SyntaxFactory.MissingToken(SyntaxKind.PlusToken);
GetDiagnosticSpanForMissingToken(out var offset, out var width);
if (SyntaxFacts.IsUnaryOperatorDeclarationToken(base.CurrentToken.Kind) || SyntaxFacts.IsBinaryExpressionOperatorToken(base.CurrentToken.Kind))
{
syntaxToken = AddTrailingSkippedSyntax(syntaxToken, (GreenNode)(object)EatToken());
}
SyntaxDiagnosticInfo syntaxDiagnosticInfo = new SyntaxDiagnosticInfo(offset, width, ErrorCode.ERR_OvlOperatorExpected);
SyntaxDiagnosticInfo syntaxDiagnosticInfo2 = new SyntaxDiagnosticInfo(offset, width, ErrorCode.WRN_ErrorOverride, syntaxDiagnosticInfo, ((DiagnosticInfo)syntaxDiagnosticInfo).Code);
syntaxToken = WithAdditionalDiagnostics(syntaxToken, syntaxDiagnosticInfo2);
}
if (syntaxToken.Kind == SyntaxKind.GreaterThanToken && ((GreenNode)syntaxToken).GetTrailingTriviaWidth() == 0 && ((GreenNode)base.CurrentToken).GetLeadingTriviaWidth() == 0)
{
if (base.CurrentToken.Kind == SyntaxKind.GreaterThanToken)
{
SyntaxToken syntaxToken2 = EatToken();
bool flag = ((GreenNode)syntaxToken2).GetTrailingTriviaWidth() == 0 && ((GreenNode)base.CurrentToken).GetLeadingTriviaWidth() == 0;
if (flag)
{
SyntaxKind kind = base.CurrentToken.Kind;
bool flag2 = ((kind == SyntaxKind.GreaterThanToken || kind == SyntaxKind.GreaterThanEqualsToken) ? true : false);
flag = flag2;
}
if (flag)
{
SyntaxToken syntaxToken3 = EatToken();
if (syntaxToken3.Kind == SyntaxKind.GreaterThanToken)
{
syntaxToken = SyntaxFactory.Token(syntaxToken.GetLeadingTrivia(), SyntaxKind.GreaterThanGreaterThanGreaterThanToken, syntaxToken.Text + syntaxToken2.Text + syntaxToken3.Text, syntaxToken.ValueText + syntaxToken2.ValueText + syntaxToken3.ValueText, syntaxToken3.GetTrailingTrivia());
syntaxToken = CheckFeatureAvailability(syntaxToken, MessageID.IDS_FeatureUnsignedRightShift, forceWarning: true);
}
else
{
SyntaxToken syntaxToken4 = SyntaxFactory.Token(syntaxToken.GetLeadingTrivia(), SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken, syntaxToken.Text + syntaxToken2.Text + syntaxToken3.Text, syntaxToken.ValueText + syntaxToken2.ValueText + syntaxToken3.ValueText, syntaxToken3.GetTrailingTrivia());
syntaxToken = SyntaxFactory.MissingToken(SyntaxKind.PlusToken);
syntaxToken = AddTrailingSkippedSyntax(syntaxToken, (GreenNode)(object)syntaxToken4);
int width2 = ((GreenNode)syntaxToken4).Width;
SyntaxDiagnosticInfo syntaxDiagnosticInfo3 = new SyntaxDiagnosticInfo(0, width2, ErrorCode.ERR_OvlOperatorExpected);
SyntaxDiagnosticInfo syntaxDiagnosticInfo4 = new SyntaxDiagnosticInfo(0, width2, ErrorCode.WRN_ErrorOverride, syntaxDiagnosticInfo3, ((DiagnosticInfo)syntaxDiagnosticInfo3).Code);
syntaxToken = WithAdditionalDiagnostics(syntaxToken, syntaxDiagnosticInfo4);
}
}
else
{
syntaxToken = SyntaxFactory.Token(syntaxToken.GetLeadingTrivia(), SyntaxKind.GreaterThanGreaterThanToken, syntaxToken.Text + syntaxToken2.Text, syntaxToken.ValueText + syntaxToken2.ValueText, syntaxToken2.GetTrailingTrivia());
}
}
else if (base.CurrentToken.Kind == SyntaxKind.EqualsToken)
{
SyntaxToken syntaxToken5 = EatToken();
syntaxToken = SyntaxFactory.Token(syntaxToken.GetLeadingTrivia(), SyntaxKind.GreaterThanEqualsToken, syntaxToken.Text + syntaxToken5.Text, syntaxToken.ValueText + syntaxToken5.ValueText, syntaxToken5.GetTrailingTrivia());
}
else if (base.CurrentToken.Kind == SyntaxKind.GreaterThanEqualsToken)
{
SyntaxToken syntaxToken6 = EatToken();
SyntaxToken syntaxToken7 = SyntaxFactory.Token(syntaxToken.GetLeadingTrivia(), SyntaxKind.GreaterThanGreaterThanEqualsToken, syntaxToken.Text + syntaxToken6.Text, syntaxToken.ValueText + syntaxToken6.ValueText, syntaxToken6.GetTrailingTrivia());
syntaxToken = SyntaxFactory.MissingToken(SyntaxKind.PlusToken);
syntaxToken = AddTrailingSkippedSyntax(syntaxToken, (GreenNode)(object)syntaxToken7);
int width3 = ((GreenNode)syntaxToken7).Width;
SyntaxDiagnosticInfo syntaxDiagnosticInfo5 = new SyntaxDiagnosticInfo(0, width3, ErrorCode.ERR_OvlOperatorExpected);
SyntaxDiagnosticInfo syntaxDiagnosticInfo6 = new SyntaxDiagnosticInfo(0, width3, ErrorCode.WRN_ErrorOverride, syntaxDiagnosticInfo5, ((DiagnosticInfo)syntaxDiagnosticInfo5).Code);
syntaxToken = WithAdditionalDiagnostics(syntaxToken, syntaxDiagnosticInfo6);
}
}
CrefParameterListSyntax parameters = ParseCrefParameterList();
return SyntaxFactory.OperatorMemberCref(operatorKeyword, checkedKeyword, syntaxToken, parameters);
}
private SyntaxToken TryEatCheckedKeyword(bool isConversion, ref SyntaxToken operatorKeyword)
{
SyntaxToken syntaxToken = tryEatCheckedOrHandleUnchecked(ref operatorKeyword);
if (syntaxToken != null && (isConversion || SyntaxFacts.IsAnyOverloadableOperator(base.CurrentToken.Kind)))
{
syntaxToken = CheckFeatureAvailability(syntaxToken, MessageID.IDS_FeatureCheckedUserDefinedOperators, forceWarning: true);
}
return syntaxToken;
SyntaxToken tryEatCheckedOrHandleUnchecked(ref SyntaxToken reference)
{
if (base.CurrentToken.Kind == SyntaxKind.UncheckedKeyword)
{
SyntaxToken skippedSyntax = AddErrorAsWarning(EatToken(), ErrorCode.ERR_MisplacedUnchecked);
reference = AddTrailingSkippedSyntax(reference, (GreenNode)(object)skippedSyntax);
return null;
}
return TryEatToken(SyntaxKind.CheckedKeyword);
}
}
private ConversionOperatorMemberCrefSyntax ParseConversionOperatorMemberCref()
{
SyntaxToken implicitOrExplicitKeyword = EatToken();
SyntaxToken operatorKeyword = EatToken(SyntaxKind.OperatorKeyword);
return SyntaxFactory.ConversionOperatorMemberCref(checkedKeyword: TryEatCheckedKeyword(isConversion: true, ref operatorKeyword), type: ParseCrefType(typeArgumentsMustBeIdentifiers: false), parameters: ParseCrefParameterList(), implicitOrExplicitKeyword: implicitOrExplicitKeyword, operatorKeyword: operatorKeyword);
}
private CrefParameterListSyntax ParseCrefParameterList()
{
return (CrefParameterListSyntax)ParseBaseCrefParameterList(useSquareBrackets: false);
}
private CrefBracketedParameterListSyntax ParseBracketedCrefParameterList()
{
return (CrefBracketedParameterListSyntax)ParseBaseCrefParameterList(useSquareBrackets: true);
}
private BaseCrefParameterListSyntax ParseBaseCrefParameterList(bool useSquareBrackets)
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
SyntaxKind syntaxKind = (useSquareBrackets ? SyntaxKind.OpenBracketToken : SyntaxKind.OpenParenToken);
SyntaxKind syntaxKind2 = (useSquareBrackets ? SyntaxKind.CloseBracketToken : SyntaxKind.CloseParenToken);
if (base.CurrentToken.Kind != syntaxKind)
{
return null;
}
SyntaxToken syntaxToken = EatToken(syntaxKind);
SeparatedSyntaxListBuilder<CrefParameterSyntax> val = _pool.AllocateSeparated<CrefParameterSyntax>();
try
{
while (base.CurrentToken.Kind == SyntaxKind.CommaToken || IsPossibleCrefParameter())
{
val.Add(ParseCrefParameter());
if (base.CurrentToken.Kind != syntaxKind2)
{
SyntaxToken syntaxToken2 = EatToken(SyntaxKind.CommaToken);
if (!((GreenNode)syntaxToken2).IsMissing || IsPossibleCrefParameter())
{
val.AddSeparator((GreenNode)(object)syntaxToken2);
}
}
}
SyntaxToken syntaxToken3 = EatToken(syntaxKind2);
return useSquareBrackets ? ((BaseCrefParameterListSyntax)SyntaxFactory.CrefBracketedParameterList(syntaxToken, SeparatedSyntaxListBuilder<CrefParameterSyntax>.op_Implicit(ref val), syntaxToken3)) : ((BaseCrefParameterListSyntax)SyntaxFactory.CrefParameterList(syntaxToken, SeparatedSyntaxListBuilder<CrefParameterSyntax>.op_Implicit(ref val), syntaxToken3));
}
finally
{
_pool.Free<CrefParameterSyntax>(ref val);
}
}
private bool IsPossibleCrefParameter()
{
SyntaxKind kind = base.CurrentToken.Kind;
if (kind - 8360 <= (SyntaxKind)2 || kind == SyntaxKind.IdentifierToken)
{
return true;
}
return SyntaxFacts.IsPredefinedType(kind);
}
private CrefParameterSyntax ParseCrefParameter()
{
SyntaxToken syntaxToken = null;
SyntaxKind kind = base.CurrentToken.Kind;
if (kind - 8360 <= (SyntaxKind)2)
{
syntaxToken = EatToken();
}
SyntaxToken readOnlyKeyword = null;
if (base.CurrentToken.Kind == SyntaxKind.ReadOnlyKeyword && syntaxToken != null)
{
if (syntaxToken.Kind != SyntaxKind.RefKeyword)
{
SyntaxToken skippedSyntax = AddErrorAsWarning(EatToken(), ErrorCode.ERR_RefReadOnlyWrongOrdering);
syntaxToken = AddTrailingSkippedSyntax(syntaxToken, (GreenNode)(object)skippedSyntax);
}
else
{
readOnlyKeyword = EatToken();
}
}
TypeSyntax type = ParseCrefType(typeArgumentsMustBeIdentifiers: false);
return SyntaxFactory.CrefParameter(syntaxToken, readOnlyKeyword, type);
}
private SimpleNameSyntax ParseCrefName(bool typeArgumentsMustBeIdentifiers)
{
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
SyntaxToken identifier = EatToken(SyntaxKind.IdentifierToken);
if (base.CurrentToken.Kind != SyntaxKind.LessThanToken)
{
return SyntaxFactory.IdentifierName(identifier);
}
SyntaxToken node = EatToken();
SeparatedSyntaxListBuilder<TypeSyntax> val = _pool.AllocateSeparated<TypeSyntax>();
try
{
while (true)
{
TypeSyntax typeSyntax = ParseCrefType(typeArgumentsMustBeIdentifiers);
if (typeArgumentsMustBeIdentifiers && typeSyntax.Kind != SyntaxKind.IdentifierName)
{
typeSyntax = AddError(typeSyntax, ErrorCode.WRN_ErrorOverride, new SyntaxDiagnosticInfo(ErrorCode.ERR_TypeParamMustBeIdentifier), $"{81:d4}");
}
val.Add(typeSyntax);
SyntaxKind kind = base.CurrentToken.Kind;
if (kind != SyntaxKind.CommaToken && kind != SyntaxKind.IdentifierToken && !SyntaxFacts.IsPredefinedType(base.CurrentToken.Kind))
{
break;
}
val.AddSeparator((GreenNode)(object)EatToken(SyntaxKind.CommaToken));
}
SyntaxToken greaterThanToken = EatToken(SyntaxKind.GreaterThanToken);
node = CheckFeatureAvailability(node, MessageID.IDS_FeatureGenerics, forceWarning: true);
return SyntaxFactory.GenericName(identifier, SyntaxFactory.TypeArgumentList(node, SeparatedSyntaxListBuilder<TypeSyntax>.op_Implicit(ref val), greaterThanToken));
}
finally
{
_pool.Free<TypeSyntax>(ref val);
}
}
private TypeSyntax ParseCrefType(bool typeArgumentsMustBeIdentifiers, bool checkForMember = false)
{
TypeSyntax typeSyntax = ParseCrefTypeHelper(typeArgumentsMustBeIdentifiers, checkForMember);
if (!typeArgumentsMustBeIdentifiers)
{
return ParseCrefTypeSuffix(typeSyntax);
}
return typeSyntax;
}
private TypeSyntax ParseCrefTypeHelper(bool typeArgumentsMustBeIdentifiers, bool checkForMember = false)
{
if (SyntaxFacts.IsPredefinedType(base.CurrentToken.Kind))
{
return SyntaxFactory.PredefinedType(EatToken());
}
NameSyntax nameSyntax;
if (base.CurrentToken.Kind == SyntaxKind.IdentifierToken && PeekToken(1).Kind == SyntaxKind.ColonColonToken)
{
SyntaxToken syntaxToken = EatToken();
if (syntaxToken.ContextualKind == SyntaxKind.GlobalKeyword)
{
syntaxToken = SyntaxParser.ConvertToKeyword(syntaxToken);
}
syntaxToken = CheckFeatureAvailability(syntaxToken, MessageID.IDS_FeatureGlobalNamespace, forceWarning: true);
SyntaxToken colonColonToken = EatToken();
SimpleNameSyntax name = ParseCrefName(typeArgumentsMustBeIdentifiers);
nameSyntax = SyntaxFactory.AliasQualifiedName(SyntaxFactory.IdentifierName(syntaxToken), colonColonToken, name);
}
else
{
ResetPoint point = GetResetPoint();
nameSyntax = ParseCrefName(typeArgumentsMustBeIdentifiers);
if (checkForMember && (((GreenNode)nameSyntax).IsMissing || base.CurrentToken.Kind != SyntaxKind.DotToken))
{
Reset(ref point);
Release(ref point);
return null;
}
Release(ref point);
}
while (base.CurrentToken.Kind == SyntaxKind.DotToken)
{
ResetPoint point2 = GetResetPoint();
SyntaxToken dotToken = EatToken();
SimpleNameSyntax simpleNameSyntax = ParseCrefName(typeArgumentsMustBeIdentifiers);
if (checkForMember && (((GreenNode)simpleNameSyntax).IsMissing || base.CurrentToken.Kind != SyntaxKind.DotToken))
{
Reset(ref point2);
Release(ref point2);
return nameSyntax;
}
Release(ref point2);
nameSyntax = SyntaxFactory.QualifiedName(nameSyntax, dotToken, simpleNameSyntax);
}
return nameSyntax;
}
private TypeSyntax ParseCrefTypeSuffix(TypeSyntax type)
{
//IL_013a: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
if (base.CurrentToken.Kind == SyntaxKind.QuestionToken)
{
type = SyntaxFactory.NullableType(type, EatToken());
}
while (base.CurrentToken.Kind == SyntaxKind.AsteriskToken)
{
type = SyntaxFactory.PointerType(type, EatToken());
}
if (base.CurrentToken.Kind == SyntaxKind.OpenBracketToken)
{
OmittedArraySizeExpressionSyntax omittedArraySizeExpressionSyntax = SyntaxFactory.OmittedArraySizeExpression(SyntaxFactory.Token(SyntaxKind.OmittedArraySizeExpressionToken));
SyntaxListBuilder<ArrayRankSpecifierSyntax> val = _pool.Allocate<ArrayRankSpecifierSyntax>();
try
{
while (base.CurrentToken.Kind == SyntaxKind.OpenBracketToken)
{
SyntaxToken openBracketToken = EatToken();
SeparatedSyntaxListBuilder<ExpressionSyntax> val2 = _pool.AllocateSeparated<ExpressionSyntax>();
try
{
while (base.CurrentToken.Kind != SyntaxKind.CloseBracketToken && base.CurrentToken.Kind == SyntaxKind.CommaToken)
{
val2.Add((ExpressionSyntax)omittedArraySizeExpressionSyntax);
val2.AddSeparator((GreenNode)(object)EatToken());
}
if ((val2.Count & 1) == 0)
{
val2.Add((ExpressionSyntax)omittedArraySizeExpressionSyntax);
}
SyntaxToken closeBracketToken = EatToken(SyntaxKind.CloseBracketToken);
val.Add(SyntaxFactory.ArrayRankSpecifier(openBracketToken, SeparatedSyntaxListBuilder<ExpressionSyntax>.op_Implicit(ref val2), closeBracketToken));
}
finally
{
_pool.Free<ExpressionSyntax>(ref val2);
}
}
type = SyntaxFactory.ArrayType(type, SyntaxListBuilder<ArrayRankSpecifierSyntax>.op_Implicit(val));
}
finally
{
_pool.Free(SyntaxListBuilder<ArrayRankSpecifierSyntax>.op_Implicit(val));
}
}
return type;
}
private IdentifierNameSyntax ParseNameAttributeValue()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
SyntaxToken syntaxToken = EatToken(SyntaxKind.IdentifierToken, reportError: false);
if (!IsEndOfNameAttribute)
{
SyntaxListBuilder<SyntaxToken> val = _pool.Allocate<SyntaxToken>();
while (!IsEndOfNameAttribute)
{
val.Add(EatToken());
}
syntaxToken = AddTrailingSkippedSyntax(syntaxToken, val.ToListNode());
_pool.Free(SyntaxListBuilder<SyntaxToken>.op_Implicit(val));
}
return SyntaxFactory.IdentifierName(syntaxToken);
}
}