Files
2026-08-27 10:56:38 -06:00

345 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Syntax;
public abstract class DirectiveTriviaSyntax : StructuredTriviaSyntax
{
private static readonly Func<SyntaxToken, bool> s_hasDirectivesFunction = (SyntaxToken t) => ((SyntaxToken)(ref t)).ContainsDirectives;
public SyntaxToken DirectiveNameToken => (SyntaxToken)(Kind() switch
{
SyntaxKind.IfDirectiveTrivia => ((IfDirectiveTriviaSyntax)this).IfKeyword,
SyntaxKind.ElifDirectiveTrivia => ((ElifDirectiveTriviaSyntax)this).ElifKeyword,
SyntaxKind.ElseDirectiveTrivia => ((ElseDirectiveTriviaSyntax)this).ElseKeyword,
SyntaxKind.EndIfDirectiveTrivia => ((EndIfDirectiveTriviaSyntax)this).EndIfKeyword,
SyntaxKind.RegionDirectiveTrivia => ((RegionDirectiveTriviaSyntax)this).RegionKeyword,
SyntaxKind.EndRegionDirectiveTrivia => ((EndRegionDirectiveTriviaSyntax)this).EndRegionKeyword,
SyntaxKind.ErrorDirectiveTrivia => ((ErrorDirectiveTriviaSyntax)this).ErrorKeyword,
SyntaxKind.WarningDirectiveTrivia => ((WarningDirectiveTriviaSyntax)this).WarningKeyword,
SyntaxKind.BadDirectiveTrivia => ((BadDirectiveTriviaSyntax)this).Identifier,
SyntaxKind.DefineDirectiveTrivia => ((DefineDirectiveTriviaSyntax)this).DefineKeyword,
SyntaxKind.UndefDirectiveTrivia => ((UndefDirectiveTriviaSyntax)this).UndefKeyword,
SyntaxKind.LineDirectiveTrivia => ((LineDirectiveTriviaSyntax)this).LineKeyword,
SyntaxKind.LineSpanDirectiveTrivia => ((LineSpanDirectiveTriviaSyntax)this).LineKeyword,
SyntaxKind.PragmaWarningDirectiveTrivia => ((PragmaWarningDirectiveTriviaSyntax)this).PragmaKeyword,
SyntaxKind.PragmaChecksumDirectiveTrivia => ((PragmaChecksumDirectiveTriviaSyntax)this).PragmaKeyword,
SyntaxKind.ReferenceDirectiveTrivia => ((ReferenceDirectiveTriviaSyntax)this).ReferenceKeyword,
SyntaxKind.LoadDirectiveTrivia => ((LoadDirectiveTriviaSyntax)this).LoadKeyword,
SyntaxKind.ShebangDirectiveTrivia => ((ShebangDirectiveTriviaSyntax)this).ExclamationToken,
SyntaxKind.NullableDirectiveTrivia => ((NullableDirectiveTriviaSyntax)this).NullableKeyword,
_ => throw ExceptionUtilities.UnexpectedValue((object)Kind()),
});
public abstract SyntaxToken HashToken { get; }
public abstract SyntaxToken EndOfDirectiveToken { get; }
public abstract bool IsActive { get; }
public DirectiveTriviaSyntax? GetNextDirective(Func<DirectiveTriviaSyntax, bool>? predicate = null)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: 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_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_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
SyntaxTrivia parentTrivia = ((SyntaxNode)this).ParentTrivia;
SyntaxToken token = ((SyntaxTrivia)(ref parentTrivia)).Token;
bool flag = false;
while (token.Kind() != SyntaxKind.None)
{
SyntaxTriviaList leadingTrivia = ((SyntaxToken)(ref token)).LeadingTrivia;
Enumerator enumerator = ((SyntaxTriviaList)(ref leadingTrivia)).GetEnumerator();
while (((Enumerator)(ref enumerator)).MoveNext())
{
SyntaxTrivia current = ((Enumerator)(ref enumerator)).Current;
if (!((SyntaxTrivia)(ref current)).IsDirective)
{
continue;
}
DirectiveTriviaSyntax directiveTriviaSyntax = (DirectiveTriviaSyntax)(object)((SyntaxTrivia)(ref current)).GetStructure();
if (flag)
{
if (predicate == null || predicate(directiveTriviaSyntax))
{
return directiveTriviaSyntax;
}
}
else if (((SyntaxTrivia)(ref current)).UnderlyingNode == ((SyntaxNode)this).Green && ((SyntaxTrivia)(ref current)).SpanStart == ((SyntaxNode)this).SpanStart && directiveTriviaSyntax == this)
{
flag = true;
}
}
token = ((SyntaxToken)(ref token)).GetNextToken(s_hasDirectivesFunction, (Func<SyntaxTrivia, bool>)null);
}
return null;
}
public DirectiveTriviaSyntax? GetPreviousDirective(Func<DirectiveTriviaSyntax, bool>? predicate = null)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: 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_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
SyntaxTrivia parentTrivia = ((SyntaxNode)this).ParentTrivia;
SyntaxToken token = ((SyntaxTrivia)(ref parentTrivia)).Token;
bool flag = false;
while (token.Kind() != SyntaxKind.None)
{
SyntaxTriviaList leadingTrivia = ((SyntaxToken)(ref token)).LeadingTrivia;
Reversed val = ((SyntaxTriviaList)(ref leadingTrivia)).Reverse();
Enumerator enumerator = ((Reversed)(ref val)).GetEnumerator();
while (((Enumerator)(ref enumerator)).MoveNext())
{
SyntaxTrivia current = ((Enumerator)(ref enumerator)).Current;
if (!((SyntaxTrivia)(ref current)).IsDirective)
{
continue;
}
DirectiveTriviaSyntax directiveTriviaSyntax = (DirectiveTriviaSyntax)(object)((SyntaxTrivia)(ref current)).GetStructure();
if (flag)
{
if (predicate == null || predicate(directiveTriviaSyntax))
{
return directiveTriviaSyntax;
}
}
else if (((SyntaxTrivia)(ref current)).UnderlyingNode == ((SyntaxNode)this).Green && ((SyntaxTrivia)(ref current)).SpanStart == ((SyntaxNode)this).SpanStart && directiveTriviaSyntax == this)
{
flag = true;
}
}
token = ((SyntaxToken)(ref token)).GetPreviousToken(s_hasDirectivesFunction, (Func<SyntaxTrivia, bool>)null);
}
return null;
}
public List<DirectiveTriviaSyntax> GetRelatedDirectives()
{
List<DirectiveTriviaSyntax> list = new List<DirectiveTriviaSyntax>();
GetRelatedDirectives(list);
return list;
}
private void GetRelatedDirectives(List<DirectiveTriviaSyntax> list)
{
list.Clear();
for (DirectiveTriviaSyntax previousRelatedDirective = GetPreviousRelatedDirective(); previousRelatedDirective != null; previousRelatedDirective = previousRelatedDirective.GetPreviousRelatedDirective())
{
list.Add(previousRelatedDirective);
}
list.Reverse();
list.Add(this);
for (DirectiveTriviaSyntax nextRelatedDirective = GetNextRelatedDirective(); nextRelatedDirective != null; nextRelatedDirective = nextRelatedDirective.GetNextRelatedDirective())
{
list.Add(nextRelatedDirective);
}
}
private DirectiveTriviaSyntax? GetNextRelatedDirective()
{
DirectiveTriviaSyntax directiveTriviaSyntax = this;
switch (directiveTriviaSyntax.Kind())
{
case SyntaxKind.IfDirectiveTrivia:
while (directiveTriviaSyntax != null)
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind - 8549 <= (SyntaxKind)2)
{
return directiveTriviaSyntax;
}
directiveTriviaSyntax = directiveTriviaSyntax.GetNextPossiblyRelatedDirective();
}
break;
case SyntaxKind.ElifDirectiveTrivia:
for (directiveTriviaSyntax = directiveTriviaSyntax.GetNextPossiblyRelatedDirective(); directiveTriviaSyntax != null; directiveTriviaSyntax = directiveTriviaSyntax.GetNextPossiblyRelatedDirective())
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind - 8549 <= (SyntaxKind)2)
{
return directiveTriviaSyntax;
}
}
break;
case SyntaxKind.ElseDirectiveTrivia:
while (directiveTriviaSyntax != null)
{
if (directiveTriviaSyntax.Kind() == SyntaxKind.EndIfDirectiveTrivia)
{
return directiveTriviaSyntax;
}
directiveTriviaSyntax = directiveTriviaSyntax.GetNextPossiblyRelatedDirective();
}
break;
case SyntaxKind.RegionDirectiveTrivia:
while (directiveTriviaSyntax != null)
{
if (directiveTriviaSyntax.Kind() == SyntaxKind.EndRegionDirectiveTrivia)
{
return directiveTriviaSyntax;
}
directiveTriviaSyntax = directiveTriviaSyntax.GetNextPossiblyRelatedDirective();
}
break;
}
return null;
}
private DirectiveTriviaSyntax? GetNextPossiblyRelatedDirective()
{
DirectiveTriviaSyntax directiveTriviaSyntax = this;
while (directiveTriviaSyntax != null)
{
directiveTriviaSyntax = directiveTriviaSyntax.GetNextDirective();
if (directiveTriviaSyntax != null)
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind == SyntaxKind.IfDirectiveTrivia)
{
while (directiveTriviaSyntax != null && directiveTriviaSyntax.Kind() != SyntaxKind.EndIfDirectiveTrivia)
{
directiveTriviaSyntax = directiveTriviaSyntax.GetNextRelatedDirective();
}
continue;
}
if (syntaxKind == SyntaxKind.RegionDirectiveTrivia)
{
while (directiveTriviaSyntax != null && directiveTriviaSyntax.Kind() != SyntaxKind.EndRegionDirectiveTrivia)
{
directiveTriviaSyntax = directiveTriviaSyntax.GetNextRelatedDirective();
}
continue;
}
}
return directiveTriviaSyntax;
}
return null;
}
private DirectiveTriviaSyntax? GetPreviousRelatedDirective()
{
DirectiveTriviaSyntax directiveTriviaSyntax = this;
switch (directiveTriviaSyntax.Kind())
{
case SyntaxKind.EndIfDirectiveTrivia:
while (directiveTriviaSyntax != null)
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind - 8548 <= (SyntaxKind)2)
{
return directiveTriviaSyntax;
}
directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousPossiblyRelatedDirective();
}
break;
case SyntaxKind.ElifDirectiveTrivia:
for (directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousPossiblyRelatedDirective(); directiveTriviaSyntax != null; directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousPossiblyRelatedDirective())
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind - 8548 <= SyntaxKind.List)
{
return directiveTriviaSyntax;
}
}
break;
case SyntaxKind.ElseDirectiveTrivia:
while (directiveTriviaSyntax != null)
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind - 8548 <= SyntaxKind.List)
{
return directiveTriviaSyntax;
}
directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousPossiblyRelatedDirective();
}
break;
case SyntaxKind.EndRegionDirectiveTrivia:
while (directiveTriviaSyntax != null)
{
if (directiveTriviaSyntax.Kind() == SyntaxKind.RegionDirectiveTrivia)
{
return directiveTriviaSyntax;
}
directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousPossiblyRelatedDirective();
}
break;
}
return null;
}
private DirectiveTriviaSyntax? GetPreviousPossiblyRelatedDirective()
{
DirectiveTriviaSyntax directiveTriviaSyntax = this;
while (directiveTriviaSyntax != null)
{
directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousDirective();
if (directiveTriviaSyntax != null)
{
SyntaxKind syntaxKind = directiveTriviaSyntax.Kind();
if (syntaxKind == SyntaxKind.EndIfDirectiveTrivia)
{
while (directiveTriviaSyntax != null && directiveTriviaSyntax.Kind() != SyntaxKind.IfDirectiveTrivia)
{
directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousRelatedDirective();
}
continue;
}
if (syntaxKind == SyntaxKind.EndRegionDirectiveTrivia)
{
while (directiveTriviaSyntax != null && directiveTriviaSyntax.Kind() != SyntaxKind.RegionDirectiveTrivia)
{
directiveTriviaSyntax = directiveTriviaSyntax.GetPreviousRelatedDirective();
}
continue;
}
}
return directiveTriviaSyntax;
}
return null;
}
internal DirectiveTriviaSyntax(Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.CSharpSyntaxNode green, SyntaxNode? parent, int position)
: base(green, parent, position)
{
}
public DirectiveTriviaSyntax WithHashToken(SyntaxToken hashToken)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return WithHashTokenCore(hashToken);
}
internal abstract DirectiveTriviaSyntax WithHashTokenCore(SyntaxToken hashToken);
public DirectiveTriviaSyntax WithEndOfDirectiveToken(SyntaxToken endOfDirectiveToken)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return WithEndOfDirectiveTokenCore(endOfDirectiveToken);
}
internal abstract DirectiveTriviaSyntax WithEndOfDirectiveTokenCore(SyntaxToken endOfDirectiveToken);
}