Skip to content

Commit 533fc7a

Browse files
authored
Merge pull request #7532 from michaelnebel/csharp/file-scoped-namespace
C#: Make support for file scoped namespace declarations.
2 parents a5ccd6a + 23b8444 commit 533fc7a

File tree

5 files changed

+40
-9
lines changed

5 files changed

+40
-9
lines changed

csharp/extractor/Semmle.Extraction.CSharp/Entities/NamespaceDeclaration.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88

99
namespace Semmle.Extraction.CSharp.Entities
1010
{
11-
internal class NamespaceDeclaration : CachedEntity<NamespaceDeclarationSyntax>
11+
internal class NamespaceDeclaration : CachedEntity<BaseNamespaceDeclarationSyntax>
1212
{
1313
private readonly NamespaceDeclaration parent;
14-
private readonly NamespaceDeclarationSyntax node;
14+
private readonly BaseNamespaceDeclarationSyntax node;
1515

16-
public NamespaceDeclaration(Context cx, NamespaceDeclarationSyntax node, NamespaceDeclaration parent)
16+
public NamespaceDeclaration(Context cx, BaseNamespaceDeclarationSyntax node, NamespaceDeclaration parent)
1717
: base(cx, node)
1818
{
1919
this.node = node;
@@ -46,17 +46,17 @@ public override void Populate(TextWriter trapFile)
4646
}
4747
}
4848

49-
public static NamespaceDeclaration Create(Context cx, NamespaceDeclarationSyntax decl, NamespaceDeclaration parent)
49+
public static NamespaceDeclaration Create(Context cx, BaseNamespaceDeclarationSyntax decl, NamespaceDeclaration parent)
5050
{
5151
var init = (decl, parent);
5252
return NamespaceDeclarationFactory.Instance.CreateEntity(cx, decl, init);
5353
}
5454

55-
private class NamespaceDeclarationFactory : CachedEntityFactory<(NamespaceDeclarationSyntax decl, NamespaceDeclaration parent), NamespaceDeclaration>
55+
private class NamespaceDeclarationFactory : CachedEntityFactory<(BaseNamespaceDeclarationSyntax decl, NamespaceDeclaration parent), NamespaceDeclaration>
5656
{
5757
public static readonly NamespaceDeclarationFactory Instance = new NamespaceDeclarationFactory();
5858

59-
public override NamespaceDeclaration Create(Context cx, (NamespaceDeclarationSyntax decl, NamespaceDeclaration parent) init) =>
59+
public override NamespaceDeclaration Create(Context cx, (BaseNamespaceDeclarationSyntax decl, NamespaceDeclaration parent) init) =>
6060
new NamespaceDeclaration(cx, init.decl, init.parent);
6161
}
6262

csharp/extractor/Semmle.Extraction.CSharp/Populators/TypeOrNamespaceVisitor.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@ public override void VisitUsingDirective(UsingDirectiveSyntax usingDirective)
1616
new UsingDirective(Cx, usingDirective, (NamespaceDeclaration)Parent);
1717
}
1818

19-
public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
20-
{
19+
private void CreateNamespaceDeclaration(BaseNamespaceDeclarationSyntax node) =>
2120
NamespaceDeclaration.Create(Cx, node, (NamespaceDeclaration)Parent);
22-
}
21+
22+
public override void VisitNamespaceDeclaration(NamespaceDeclarationSyntax node) =>
23+
CreateNamespaceDeclaration(node);
24+
25+
public override void VisitFileScopedNamespaceDeclaration(FileScopedNamespaceDeclarationSyntax node) =>
26+
CreateNamespaceDeclaration(node);
2327
}
2428
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace MyFileScopedNamespace;
2+
3+
public class MyFileScopedNamespaceClass
4+
{
5+
private readonly object myField = new object();
6+
public object MyProp { get; set; }
7+
public void MyMethod() { }
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fileScopedNamespace
2+
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:3:14:3:39 | MyFileScopedNamespaceClass |
3+
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:5:29:5:35 | myField |
4+
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:6:19:6:24 | MyProp |
5+
| FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace | FileScopedNamespace.cs:7:17:7:24 | MyMethod |
6+
namespaceDeclaration
7+
| FileScopedNamespace.cs:1:11:1:31 | namespace ... { ... } | FileScopedNamespace.cs:1:11:1:31 | MyFileScopedNamespace |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import csharp
2+
3+
query predicate fileScopedNamespace(Namespace n, Member m) {
4+
n.hasQualifiedName("MyFileScopedNamespace") and
5+
exists(Class c |
6+
c.getNamespace() = n and
7+
c.hasMember(m) and
8+
m.getLocation().toString().matches("%FileScopedNamespace.cs%")
9+
)
10+
}
11+
12+
query predicate namespaceDeclaration(NamespaceDeclaration nd, Namespace n) { n = nd.getNamespace() }

0 commit comments

Comments
 (0)