mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
C#: Refactoring expression and statement population.
This commit is contained in:
@@ -4,52 +4,61 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||
using Semmle.Extraction.CSharp.Populators;
|
||||
using Semmle.Extraction.Entities;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Semmle.Extraction.CSharp.Entities
|
||||
{
|
||||
class UsingDirective : FreshEntity
|
||||
{
|
||||
readonly UsingDirectiveSyntax node;
|
||||
readonly UsingDirectiveSyntax Node;
|
||||
readonly NamespaceDeclaration Parent;
|
||||
|
||||
public UsingDirective(Context cx, UsingDirectiveSyntax usingDirective, NamespaceDeclaration parent)
|
||||
: base(cx)
|
||||
{
|
||||
node = usingDirective;
|
||||
var info = cx.GetModel(node).GetSymbolInfo(usingDirective.Name);
|
||||
var trapFile = cx.TrapWriter.Writer;
|
||||
Node = usingDirective;
|
||||
Parent = parent;
|
||||
TryPopulate();
|
||||
}
|
||||
|
||||
if (usingDirective.StaticKeyword.Kind() == SyntaxKind.None)
|
||||
protected override void Populate(TextWriter trapFile)
|
||||
{
|
||||
var info = cx.GetModel(Node).GetSymbolInfo(Node.Name);
|
||||
|
||||
if (Node.StaticKeyword.Kind() == SyntaxKind.None)
|
||||
{
|
||||
// A normal using
|
||||
var namespaceSymbol = info.Symbol as INamespaceSymbol;
|
||||
|
||||
if (namespaceSymbol == null)
|
||||
{
|
||||
cx.Extractor.MissingNamespace(usingDirective.Name.ToFullString());
|
||||
cx.ModelError(usingDirective, "Namespace not found");
|
||||
cx.Extractor.MissingNamespace(Node.Name.ToFullString());
|
||||
cx.ModelError(Node, "Namespace not found");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
var ns = Namespace.Create(cx, namespaceSymbol);
|
||||
cx.Emit(Tuples.using_namespace_directives(this, ns));
|
||||
cx.Emit(Tuples.using_directive_location(this, cx.Create(ReportingLocation)));
|
||||
trapFile.Emit(Tuples.using_namespace_directives(this, ns));
|
||||
trapFile.Emit(Tuples.using_directive_location(this, cx.Create(ReportingLocation)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// A "using static"
|
||||
Type m = Type.Create(cx, (ITypeSymbol)info.Symbol);
|
||||
cx.Emit(Tuples.using_static_directives(this, m.TypeRef));
|
||||
cx.Emit(Tuples.using_directive_location(this, cx.Create(ReportingLocation)));
|
||||
trapFile.Emit(Tuples.using_static_directives(this, m.TypeRef));
|
||||
trapFile.Emit(Tuples.using_directive_location(this, cx.Create(ReportingLocation)));
|
||||
}
|
||||
|
||||
if (parent != null)
|
||||
if (Parent != null)
|
||||
{
|
||||
cx.Emit(Tuples.parent_namespace_declaration(this, parent));
|
||||
trapFile.Emit(Tuples.parent_namespace_declaration(this, Parent));
|
||||
}
|
||||
}
|
||||
|
||||
public sealed override Microsoft.CodeAnalysis.Location ReportingLocation => node.GetLocation();
|
||||
public sealed override Microsoft.CodeAnalysis.Location ReportingLocation => Node.GetLocation();
|
||||
|
||||
public IEnumerable<Tuple> GetTuples()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user