mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Merge pull request #7532 from michaelnebel/csharp/file-scoped-namespace
C#: Make support for file scoped namespace declarations.
This commit is contained in:
@@ -8,12 +8,12 @@ using System.Linq;
|
||||
|
||||
namespace Semmle.Extraction.CSharp.Entities
|
||||
{
|
||||
internal class NamespaceDeclaration : CachedEntity<NamespaceDeclarationSyntax>
|
||||
internal class NamespaceDeclaration : CachedEntity<BaseNamespaceDeclarationSyntax>
|
||||
{
|
||||
private readonly NamespaceDeclaration parent;
|
||||
private readonly NamespaceDeclarationSyntax node;
|
||||
private readonly BaseNamespaceDeclarationSyntax node;
|
||||
|
||||
public NamespaceDeclaration(Context cx, NamespaceDeclarationSyntax node, NamespaceDeclaration parent)
|
||||
public NamespaceDeclaration(Context cx, BaseNamespaceDeclarationSyntax node, NamespaceDeclaration parent)
|
||||
: base(cx, node)
|
||||
{
|
||||
this.node = node;
|
||||
@@ -46,17 +46,17 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
}
|
||||
}
|
||||
|
||||
public static NamespaceDeclaration Create(Context cx, NamespaceDeclarationSyntax decl, NamespaceDeclaration parent)
|
||||
public static NamespaceDeclaration Create(Context cx, BaseNamespaceDeclarationSyntax decl, NamespaceDeclaration parent)
|
||||
{
|
||||
var init = (decl, parent);
|
||||
return NamespaceDeclarationFactory.Instance.CreateEntity(cx, decl, init);
|
||||
}
|
||||
|
||||
private class NamespaceDeclarationFactory : CachedEntityFactory<(NamespaceDeclarationSyntax decl, NamespaceDeclaration parent), NamespaceDeclaration>
|
||||
private class NamespaceDeclarationFactory : CachedEntityFactory<(BaseNamespaceDeclarationSyntax decl, NamespaceDeclaration parent), NamespaceDeclaration>
|
||||
{
|
||||
public static readonly NamespaceDeclarationFactory Instance = new NamespaceDeclarationFactory();
|
||||
|
||||
public override NamespaceDeclaration Create(Context cx, (NamespaceDeclarationSyntax decl, NamespaceDeclaration parent) init) =>
|
||||
public override NamespaceDeclaration Create(Context cx, (BaseNamespaceDeclarationSyntax decl, NamespaceDeclaration parent) init) =>
|
||||
new NamespaceDeclaration(cx, init.decl, init.parent);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,13 @@ namespace Semmle.Extraction.CSharp.Populators
|
||||
new UsingDirective(Cx, usingDirective, (NamespaceDeclaration)Parent);
|
||||
}
|
||||
|
||||
public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
|
||||
{
|
||||
private void CreateNamespaceDeclaration(BaseNamespaceDeclarationSyntax node) =>
|
||||
NamespaceDeclaration.Create(Cx, node, (NamespaceDeclaration)Parent);
|
||||
}
|
||||
|
||||
public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node) =>
|
||||
CreateNamespaceDeclaration(node);
|
||||
|
||||
public override void VisitFileScopedNamespaceDeclaration(FileScopedNamespaceDeclarationSyntax node) =>
|
||||
CreateNamespaceDeclaration(node);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace MyFileScopedNamespace;
|
||||
|
||||
public class MyFileScopedNamespaceClass
|
||||
{
|
||||
private readonly object myField = new object();
|
||||
public object MyProp { get; set; }
|
||||
public void MyMethod() { }
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileScopedNamespace
|
||||
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:3:14:3:39 | MyFileScopedNamespaceClass |
|
||||
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:5:29:5:35 | myField |
|
||||
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:6:19:6:24 | MyProp |
|
||||
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:7:17:7:24 | MyMethod |
|
||||
namespaceDeclaration
|
||||
| FileScopedNamespace.cs:1:11:1:31 | namespace ... { ... } | FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace |
|
||||
12
csharp/ql/test/library-tests/csharp10/fileScopedNamespace.ql
Normal file
12
csharp/ql/test/library-tests/csharp10/fileScopedNamespace.ql
Normal file
@@ -0,0 +1,12 @@
|
||||
import csharp
|
||||
|
||||
query predicate fileScopedNamespace(Namespace n, Member m) {
|
||||
n.hasQualifiedName("MyFileScopedNamespace") and
|
||||
exists(Class c |
|
||||
c.getNamespace() = n and
|
||||
c.hasMember(m) and
|
||||
m.getLocation().toString().matches("%FileScopedNamespace.cs%")
|
||||
)
|
||||
}
|
||||
|
||||
query predicate namespaceDeclaration(NamespaceDeclaration nd, Namespace n) { n = nd.getNamespace() }
|
||||
Reference in New Issue
Block a user