345 lines
14 KiB
C#
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);
|
||
|
|
}
|