public void TestTypeNames() { var text1 = @" namespace NA.NB { partial class A<T> { partial class B { int F; } } } "; var text2 = @" namespace NA { namespace NB { partial class C<T> { partial class D { void G() {}; } } } } "; var tree1 = SyntaxFactory.ParseSyntaxTree(text1); var tree2 = SyntaxFactory.ParseSyntaxTree(text2); Assert.NotNull(tree1); Assert.NotNull(tree2); var decl1 = Lazy(DeclarationTreeBuilder.ForTree(tree1, new CSharpCompilationOptions(OutputKind.ConsoleApplication).ScriptClassName, isSubmission: false)); var decl2 = Lazy(DeclarationTreeBuilder.ForTree(tree2, new CSharpCompilationOptions(OutputKind.ConsoleApplication).ScriptClassName, isSubmission: false)); var table = DeclarationTable.Empty; table = table.AddRootDeclaration(decl1); Assert.True(table.TypeNames.OrderBy(s => s).SequenceEqual(new[] { "A", "B" })); table = table.AddRootDeclaration(decl2); Assert.True(table.TypeNames.OrderBy(s => s).SequenceEqual(new[] { "A", "B", "C", "D" })); table = table.RemoveRootDeclaration(decl2); Assert.True(table.TypeNames.OrderBy(s => s).SequenceEqual(new[] { "A", "B" })); table = table.AddRootDeclaration(decl2); Assert.True(table.TypeNames.OrderBy(s => s).SequenceEqual(new[] { "A", "B", "C", "D" })); table = table.RemoveRootDeclaration(decl1); Assert.True(table.TypeNames.OrderBy(s => s).SequenceEqual(new[] { "C", "D" })); table = table.RemoveRootDeclaration(decl2); Assert.True(table.TypeNames.IsEmpty()); }
public void TestSimpleDeclarations() { var text1 = @" namespace NA.NB { partial class C<T> { partial class D { int F; } } class C { } } "; var text2 = @" namespace NA { namespace NB { partial class C<T> { partial class D { void G() {}; } } } } "; var tree1 = SyntaxFactory.ParseSyntaxTree(text1); var tree2 = SyntaxFactory.ParseSyntaxTree(text2); Assert.NotNull(tree1); Assert.NotNull(tree2); var decl1 = DeclarationTreeBuilder.ForTree(tree1, new CSharpCompilationOptions(OutputKind.ConsoleApplication).ScriptClassName, isSubmission: false); var decl2 = DeclarationTreeBuilder.ForTree(tree2, new CSharpCompilationOptions(OutputKind.ConsoleApplication).ScriptClassName, isSubmission: false); Assert.NotNull(decl1); Assert.NotNull(decl2); Assert.Equal(string.Empty, decl1.Name); Assert.Equal(string.Empty, decl2.Name); Assert.Equal(1, decl1.Children.Length); Assert.Equal(1, decl2.Children.Length); var na1 = decl1.Children.Single(); var na2 = decl2.Children.Single(); Assert.NotNull(na1); Assert.NotNull(na2); Assert.Equal(DeclarationKind.Namespace, na1.Kind); Assert.Equal(DeclarationKind.Namespace, na2.Kind); Assert.Equal("NA", na1.Name); Assert.Equal("NA", na2.Name); Assert.Equal(1, na1.Children.Length); Assert.Equal(1, na2.Children.Length); var nb1 = na1.Children.Single(); var nb2 = na2.Children.Single(); Assert.NotNull(nb1); Assert.NotNull(nb2); Assert.Equal(DeclarationKind.Namespace, nb1.Kind); Assert.Equal(DeclarationKind.Namespace, nb2.Kind); Assert.Equal("NB", nb1.Name); Assert.Equal("NB", nb2.Name); Assert.Equal(2, nb1.Children.Length); Assert.Equal(1, nb2.Children.Length); var ct1 = (SingleTypeDeclaration)nb1.Children.First(); var ct2 = (SingleTypeDeclaration)nb2.Children.Single(); Assert.Equal(DeclarationKind.Class, ct1.Kind); Assert.Equal(DeclarationKind.Class, ct2.Kind); Assert.NotNull(ct1); Assert.NotNull(ct2); Assert.Equal("C", ct1.Name); Assert.Equal("C", ct2.Name); Assert.Equal(1, ct1.Arity); Assert.Equal(1, ct2.Arity); Assert.Equal(1, ct1.Children.Length); Assert.Equal(1, ct2.Children.Length); var c1 = (SingleTypeDeclaration)nb1.Children.Skip(1).Single(); Assert.NotNull(c1); Assert.Equal(DeclarationKind.Class, c1.Kind); Assert.Equal("C", c1.Name); Assert.Equal(0, c1.Arity); var d1 = ct1.Children.Single(); var d2 = ct2.Children.Single(); Assert.NotNull(d1); Assert.NotNull(d2); Assert.Equal(DeclarationKind.Class, d1.Kind); Assert.Equal(DeclarationKind.Class, d2.Kind); Assert.Equal("D", d1.Name); Assert.Equal("D", d2.Name); Assert.Equal(0, d1.Arity); Assert.Equal(0, d2.Arity); Assert.Equal(0, d1.Children.Length); Assert.Equal(0, d2.Children.Length); var table = DeclarationTable.Empty; Assert.Empty(table.AllRootNamespacesUnordered()); var mr = table.MergedRoot; Assert.NotNull(mr); Assert.True(table.TypeNames.IsEmpty()); table = table.AddRootDeclaration(Lazy(decl1)); Assert.Equal(decl1, table.AllRootNamespacesUnordered().Single()); Assert.True(table.TypeNames.OrderBy(s => s).SequenceEqual(new[] { "C", "D" })); mr = table.MergedRoot; Assert.Equal(DeclarationKind.Namespace, mr.Kind); Assert.Equal(string.Empty, mr.Name); var na = mr.Children.Single(); Assert.Equal(DeclarationKind.Namespace, na.Kind); Assert.Equal("NA", na.Name); var nb = na.Children.Single(); Assert.Equal(DeclarationKind.Namespace, nb.Kind); Assert.Equal("NB", nb.Name); var ct = nb.Children.OfType <MergedTypeDeclaration>().Single(x => x.Arity == 1); Assert.Equal(1, ct.Arity); Assert.Equal(DeclarationKind.Class, ct.Kind); Assert.Equal("C", ct.Name); var c = nb.Children.OfType <MergedTypeDeclaration>().Single(x => x.Arity == 0); Assert.Equal(0, c.Arity); Assert.Equal(DeclarationKind.Class, c.Kind); Assert.Equal("C", c.Name); var d = ct.Children.Single(); Assert.Equal(0, d.Arity); Assert.Equal(DeclarationKind.Class, d.Kind); Assert.Equal("D", d.Name); table = table.AddRootDeclaration(Lazy(decl2)); Assert.True(table.TypeNames.Distinct().OrderBy(s => s).SequenceEqual(new[] { "C", "D" })); Assert.Equal(2, table.AllRootNamespacesUnordered().Intersect(new[] { decl1, decl2 }).Count()); mr = table.MergedRoot; Assert.Equal(DeclarationKind.Namespace, mr.Kind); Assert.Equal(string.Empty, mr.Name); na = mr.Children.Single(); Assert.Equal(DeclarationKind.Namespace, na.Kind); Assert.Equal("NA", na.Name); nb = na.Children.Single(); Assert.Equal(DeclarationKind.Namespace, nb.Kind); Assert.Equal("NB", nb.Name); ct = nb.Children.OfType <MergedTypeDeclaration>().Single(x => x.Arity == 1); Assert.Equal(1, ct.Arity); Assert.Equal(DeclarationKind.Class, ct.Kind); Assert.Equal("C", ct.Name); c = nb.Children.OfType <MergedTypeDeclaration>().Single(x => x.Arity == 0); Assert.Equal(0, c.Arity); Assert.Equal(DeclarationKind.Class, c.Kind); Assert.Equal("C", c.Name); d = ct.Children.Single(); Assert.Equal(0, d.Arity); Assert.Equal(DeclarationKind.Class, d.Kind); Assert.Equal("D", d.Name); }