Merge pull request #7532 from michaelnebel/csharp/file-scoped-namespace

C#: Make support for file scoped namespace declarations.
This commit is contained in:
Michael Nebel
2022-01-10 09:02:18 +01:00
committed by GitHub
5 changed files with 40 additions and 9 deletions

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,8 @@
namespace MyFileScopedNamespace;
public class MyFileScopedNamespaceClass
{
private readonly object myField = new object();
public object MyProp { get; set; }
public void MyMethod() { }
}

View File

@@ -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 |

View 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() }