159 lines
6.5 KiB
C#
159 lines
6.5 KiB
C#
using System.Collections.Generic;
|
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
using Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax;
|
|
using Microsoft.CodeAnalysis.PooledObjects;
|
|
using Microsoft.CodeAnalysis.Syntax.InternalSyntax;
|
|
using Roslyn.Utilities;
|
|
|
|
namespace Microsoft.CodeAnalysis.CSharp;
|
|
|
|
internal sealed class CSharpSyntaxHelper : AbstractSyntaxHelper
|
|
{
|
|
public static readonly ISyntaxHelper Instance = (ISyntaxHelper)(object)new CSharpSyntaxHelper();
|
|
|
|
public override bool IsCaseSensitive => true;
|
|
|
|
protected override int AttributeListKind => 8847;
|
|
|
|
private CSharpSyntaxHelper()
|
|
{
|
|
}
|
|
|
|
public override bool IsValidIdentifier(string name)
|
|
{
|
|
return SyntaxFacts.IsValidIdentifier(name);
|
|
}
|
|
|
|
public override bool IsAnyNamespaceBlock(SyntaxNode node)
|
|
{
|
|
return node is Microsoft.CodeAnalysis.CSharp.Syntax.BaseNamespaceDeclarationSyntax;
|
|
}
|
|
|
|
public override bool IsAttribute(SyntaxNode node)
|
|
{
|
|
return node is Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax;
|
|
}
|
|
|
|
public override SyntaxNode GetNameOfAttribute(SyntaxNode node)
|
|
{
|
|
return (SyntaxNode)(object)((Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax)(object)node).Name;
|
|
}
|
|
|
|
public override bool IsAttributeList(SyntaxNode node)
|
|
{
|
|
return node is Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax;
|
|
}
|
|
|
|
public override void AddAttributeTargets(SyntaxNode node, ArrayBuilder<SyntaxNode> targets)
|
|
{
|
|
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
|
CSharpSyntaxNode parent = ((Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax)(object)node).Parent;
|
|
if (parent is Microsoft.CodeAnalysis.CSharp.Syntax.FieldDeclarationSyntax fieldDeclarationSyntax)
|
|
{
|
|
targets.AddRange((IEnumerable<SyntaxNode>)(object)fieldDeclarationSyntax.Declaration.Variables);
|
|
}
|
|
else if (parent is Microsoft.CodeAnalysis.CSharp.Syntax.EventFieldDeclarationSyntax eventFieldDeclarationSyntax)
|
|
{
|
|
targets.AddRange((IEnumerable<SyntaxNode>)(object)eventFieldDeclarationSyntax.Declaration.Variables);
|
|
}
|
|
else
|
|
{
|
|
targets.Add((SyntaxNode)(object)parent);
|
|
}
|
|
}
|
|
|
|
public override SeparatedSyntaxList<SyntaxNode> GetAttributesOfAttributeList(SyntaxNode node)
|
|
{
|
|
//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)
|
|
return SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax>.op_Implicit(((Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax)(object)node).Attributes);
|
|
}
|
|
|
|
public override bool IsLambdaExpression(SyntaxNode node)
|
|
{
|
|
return node is Microsoft.CodeAnalysis.CSharp.Syntax.LambdaExpressionSyntax;
|
|
}
|
|
|
|
public override string GetUnqualifiedIdentifierOfName(SyntaxNode node)
|
|
{
|
|
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
|
|
SyntaxToken identifier = ((Microsoft.CodeAnalysis.CSharp.Syntax.NameSyntax)(object)node).GetUnqualifiedName().Identifier;
|
|
return ((SyntaxToken)(ref identifier)).ValueText;
|
|
}
|
|
|
|
public override void AddAliases(GreenNode node, ArrayBuilder<(string aliasName, string symbolName)> aliases, bool global)
|
|
{
|
|
//IL_000b: 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)
|
|
if (node is Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.CompilationUnitSyntax compilationUnitSyntax)
|
|
{
|
|
AddAliases(compilationUnitSyntax.Usings, aliases, global);
|
|
return;
|
|
}
|
|
if (node is Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.BaseNamespaceDeclarationSyntax baseNamespaceDeclarationSyntax)
|
|
{
|
|
AddAliases(baseNamespaceDeclarationSyntax.Usings, aliases, global);
|
|
return;
|
|
}
|
|
throw ExceptionUtilities.UnexpectedValue((object)node.KindText);
|
|
}
|
|
|
|
private static void AddAliases(SyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.UsingDirectiveSyntax> usings, ArrayBuilder<(string aliasName, string symbolName)> aliases, bool global)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
|
Enumerator<Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.UsingDirectiveSyntax> enumerator = usings.GetEnumerator();
|
|
while (enumerator.MoveNext())
|
|
{
|
|
Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.UsingDirectiveSyntax current = enumerator.Current;
|
|
if (current.Alias != null && global == (current.GlobalKeyword != null) && current.NamespaceOrType is Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.NameSyntax name)
|
|
{
|
|
string valueText = current.Alias.Name.Identifier.ValueText;
|
|
string valueText2 = GetUnqualifiedName(name).Identifier.ValueText;
|
|
aliases.Add((valueText, valueText2));
|
|
}
|
|
}
|
|
}
|
|
|
|
private static Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.SimpleNameSyntax GetUnqualifiedName(Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.NameSyntax name)
|
|
{
|
|
if (!(name is Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.AliasQualifiedNameSyntax aliasQualifiedNameSyntax))
|
|
{
|
|
if (!(name is Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.QualifiedNameSyntax qualifiedNameSyntax))
|
|
{
|
|
if (name is Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.SimpleNameSyntax result)
|
|
{
|
|
return result;
|
|
}
|
|
throw ExceptionUtilities.UnexpectedValue((object)((GreenNode)name).KindText);
|
|
}
|
|
return qualifiedNameSyntax.Right;
|
|
}
|
|
return aliasQualifiedNameSyntax.Name;
|
|
}
|
|
|
|
public override void AddAliases(CompilationOptions compilation, ArrayBuilder<(string aliasName, string symbolName)> aliases)
|
|
{
|
|
}
|
|
|
|
public override bool ContainsGlobalAliases(SyntaxNode root)
|
|
{
|
|
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0013: 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)
|
|
Enumerator<Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.UsingDirectiveSyntax> enumerator = ((Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.CompilationUnitSyntax)(object)root.Green).Usings.GetEnumerator();
|
|
while (enumerator.MoveNext())
|
|
{
|
|
Microsoft.CodeAnalysis.CSharp.Syntax.InternalSyntax.UsingDirectiveSyntax current = enumerator.Current;
|
|
if (current.GlobalKeyword != null && current.Alias != null)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|