127 lines
6.1 KiB
C#
127 lines
6.1 KiB
C#
using System.Collections.Immutable;
|
|
using System.Threading;
|
|
using Microsoft.CodeAnalysis.PooledObjects;
|
|
using Microsoft.CodeAnalysis.Syntax;
|
|
using Microsoft.CodeAnalysis.Text;
|
|
using Roslyn.Utilities;
|
|
|
|
namespace Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
|
|
internal class CSharpPragmaWarningStateMap : AbstractWarningStateMap<PragmaWarningState>
|
|
{
|
|
public CSharpPragmaWarningStateMap(SyntaxTree syntaxTree)
|
|
: base(syntaxTree)
|
|
{
|
|
}
|
|
|
|
protected override WarningStateMapEntry<PragmaWarningState>[] CreateWarningStateMapEntries(SyntaxTree syntaxTree)
|
|
{
|
|
ArrayBuilder<DirectiveTriviaSyntax> instance = ArrayBuilder<DirectiveTriviaSyntax>.GetInstance();
|
|
GetAllPragmaWarningDirectives(syntaxTree, instance);
|
|
WarningStateMapEntry<PragmaWarningState>[] result = CreatePragmaWarningStateEntries(instance);
|
|
instance.Free();
|
|
return result;
|
|
}
|
|
|
|
private static void GetAllPragmaWarningDirectives(SyntaxTree syntaxTree, ArrayBuilder<DirectiveTriviaSyntax> directiveList)
|
|
{
|
|
//IL_0041: 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_0052: 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)
|
|
foreach (DirectiveTriviaSyntax directive in syntaxTree.GetRoot(default(CancellationToken)).GetDirectives())
|
|
{
|
|
if (!directive.IsActive || directive.Kind() != SyntaxKind.PragmaWarningDirectiveTrivia)
|
|
{
|
|
continue;
|
|
}
|
|
PragmaWarningDirectiveTriviaSyntax pragmaWarningDirectiveTriviaSyntax = (PragmaWarningDirectiveTriviaSyntax)directive;
|
|
SyntaxToken val = pragmaWarningDirectiveTriviaSyntax.DisableOrRestoreKeyword;
|
|
if (!((SyntaxToken)(ref val)).IsMissing)
|
|
{
|
|
val = pragmaWarningDirectiveTriviaSyntax.WarningKeyword;
|
|
if (!((SyntaxToken)(ref val)).IsMissing)
|
|
{
|
|
directiveList.Add((DirectiveTriviaSyntax)pragmaWarningDirectiveTriviaSyntax);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static WarningStateMapEntry<PragmaWarningState>[] CreatePragmaWarningStateEntries(ArrayBuilder<DirectiveTriviaSyntax> directiveList)
|
|
{
|
|
//IL_0024: 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_0044: 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_015b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0192: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_00f7: 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_012d: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
|
|
WarningStateMapEntry<PragmaWarningState>[] array = new WarningStateMapEntry<PragmaWarningState>[directiveList.Count + 1];
|
|
int num = 0;
|
|
ImmutableDictionary<string, PragmaWarningState> immutableDictionary = ImmutableDictionary.Create<string, PragmaWarningState>();
|
|
PragmaWarningState pragmaWarningState = PragmaWarningState.Default;
|
|
WarningStateMapEntry<PragmaWarningState> val = default(WarningStateMapEntry<PragmaWarningState>);
|
|
val._002Ector(0, PragmaWarningState.Default, immutableDictionary);
|
|
array[num] = val;
|
|
while (num < directiveList.Count)
|
|
{
|
|
DirectiveTriviaSyntax directiveTriviaSyntax = directiveList[num];
|
|
PragmaWarningDirectiveTriviaSyntax pragmaWarningDirectiveTriviaSyntax = (PragmaWarningDirectiveTriviaSyntax)directiveTriviaSyntax;
|
|
SyntaxKind syntaxKind = pragmaWarningDirectiveTriviaSyntax.DisableOrRestoreKeyword.Kind();
|
|
PragmaWarningState pragmaWarningState2 = syntaxKind switch
|
|
{
|
|
SyntaxKind.DisableKeyword => PragmaWarningState.Disabled,
|
|
SyntaxKind.RestoreKeyword => PragmaWarningState.Default,
|
|
SyntaxKind.EnableKeyword => PragmaWarningState.Enabled,
|
|
_ => throw ExceptionUtilities.UnexpectedValue((object)syntaxKind),
|
|
};
|
|
if (pragmaWarningDirectiveTriviaSyntax.ErrorCodes.Count == 0)
|
|
{
|
|
pragmaWarningState = pragmaWarningState2;
|
|
immutableDictionary = ImmutableDictionary.Create<string, PragmaWarningState>();
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < pragmaWarningDirectiveTriviaSyntax.ErrorCodes.Count; i++)
|
|
{
|
|
ExpressionSyntax expressionSyntax = pragmaWarningDirectiveTriviaSyntax.ErrorCodes[i];
|
|
if (!((SyntaxNode)expressionSyntax).IsMissing && !((SyntaxNode)expressionSyntax).ContainsDiagnostics)
|
|
{
|
|
string text = string.Empty;
|
|
if (expressionSyntax.Kind() == SyntaxKind.NumericLiteralExpression)
|
|
{
|
|
SyntaxToken token = ((LiteralExpressionSyntax)expressionSyntax).Token;
|
|
text = ((CommonMessageProvider)MessageProvider.Instance).GetIdForErrorCode((int)((SyntaxToken)(ref token)).Value);
|
|
}
|
|
else if (expressionSyntax.Kind() == SyntaxKind.IdentifierName)
|
|
{
|
|
SyntaxToken identifier = ((IdentifierNameSyntax)expressionSyntax).Identifier;
|
|
text = ((SyntaxToken)(ref identifier)).ValueText;
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(text))
|
|
{
|
|
immutableDictionary = immutableDictionary.SetItem(text, pragmaWarningState2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
TextSpan sourceSpan = ((SyntaxNode)directiveTriviaSyntax).Location.SourceSpan;
|
|
val._002Ector(((TextSpan)(ref sourceSpan)).End, pragmaWarningState, immutableDictionary);
|
|
num++;
|
|
array[num] = val;
|
|
}
|
|
return array;
|
|
}
|
|
}
|