提交 60e77e90 编写于 作者: N Neal Gafter

Merge pull request #2688 from dpaoliello/Issue2569

Fix Issue #2569 DirectiveTriviaSyntax.GetRelatedDirectives assumes there can only be one #elif
......@@ -164,10 +164,13 @@ private DirectiveTriviaSyntax GetNextRelatedDirective()
break;
case SyntaxKind.ElifDirectiveTrivia:
d = d.GetNextPossiblyRelatedDirective();
while (d != null)
{
switch (d.Kind())
{
case SyntaxKind.ElifDirectiveTrivia:
case SyntaxKind.ElseDirectiveTrivia:
case SyntaxKind.EndIfDirectiveTrivia:
return d;
......@@ -261,11 +264,15 @@ private DirectiveTriviaSyntax GetPreviousRelatedDirective()
break;
case SyntaxKind.ElifDirectiveTrivia:
d = d.GetPreviousPossiblyRelatedDirective();
while (d != null)
{
if (d.Kind() == SyntaxKind.IfDirectiveTrivia)
switch (d.Kind())
{
return d;
case SyntaxKind.IfDirectiveTrivia:
case SyntaxKind.ElifDirectiveTrivia:
return d;
}
d = d.GetPreviousPossiblyRelatedDirective();
......
......@@ -1217,6 +1217,8 @@ public void TestGetDirectivesRelatedToIf()
class A { }
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1229,11 +1231,12 @@ class C { }
Assert.Equal(SyntaxKind.IfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
}
[Fact]
......@@ -1245,6 +1248,8 @@ public void TestGetDirectivesRelatedToIfElements()
class A { }
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1257,18 +1262,19 @@ class C { }
Assert.Equal(SyntaxKind.IfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
// get directives related to elif
var related2 = related[1].GetRelatedDirectives();
Assert.True(related.SequenceEqual(related2));
// get directives realted to else
var related3 = related[2].GetRelatedDirectives();
var related3 = related[3].GetRelatedDirectives();
Assert.True(related.SequenceEqual(related3));
}
......@@ -1281,6 +1287,8 @@ public void TestGetDirectivesRelatedToEndIf()
class A { }
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1290,11 +1298,12 @@ class C { }
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
}
[Fact]
......@@ -1309,6 +1318,8 @@ class A1 { }
#endif
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1321,11 +1332,12 @@ class C { }
Assert.Equal(SyntaxKind.IfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
}
[Fact]
......@@ -1340,6 +1352,8 @@ class A1 { }
#endregion
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1352,11 +1366,12 @@ class C { }
Assert.Equal(SyntaxKind.IfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
}
[Fact]
......@@ -1371,6 +1386,8 @@ class A1 { }
#endif
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1380,11 +1397,12 @@ class C { }
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
}
[Fact]
......@@ -1398,6 +1416,8 @@ class A { }
#endregion
#elif BAR
class B { }
#elif BAZ
class B { }
#else
class C { }
#endif
......@@ -1407,11 +1427,12 @@ class C { }
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, d.Kind());
var related = d.GetRelatedDirectives();
Assert.NotNull(related);
Assert.Equal(4, related.Count);
Assert.Equal(5, related.Count);
Assert.Equal(SyntaxKind.IfDirectiveTrivia, related[0].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[1].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.ElifDirectiveTrivia, related[2].Kind());
Assert.Equal(SyntaxKind.ElseDirectiveTrivia, related[3].Kind());
Assert.Equal(SyntaxKind.EndIfDirectiveTrivia, related[4].Kind());
}
[Fact]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册