C#: Refactoring expression and statement population.

This commit is contained in:
Calum Grant
2019-08-09 16:52:53 +01:00
parent e41e8d6547
commit 486c192dda
110 changed files with 602 additions and 437 deletions

View File

@@ -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()
{