Skip to content

Commit 0ea58f2

Browse files
CopilotCyrusNajmabadijcouv
authored
Fix SyntaxFactory.Identifier to throw ArgumentNullException instead of NullReferenceException (#80699)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: CyrusNajmabadi <4564579+CyrusNajmabadi@users.noreply.github.com> Co-authored-by: Cyrus Najmabadi <cyrus.najmabadi@gmail.com> Co-authored-by: jcouv <12466233+jcouv@users.noreply.github.com>
1 parent a6c772c commit 0ea58f2

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/Compilers/CSharp/Portable/Syntax/SyntaxFactory.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,11 @@ public static SyntaxToken MissingToken(SyntaxTriviaList leading, SyntaxKind kind
294294
/// <param name="text">The raw text of the identifier name, including any escapes or leading '@' character.</param>
295295
public static SyntaxToken Identifier(string text)
296296
{
297+
if (text == null)
298+
{
299+
throw new ArgumentNullException(nameof(text));
300+
}
301+
297302
return new SyntaxToken(Syntax.InternalSyntax.SyntaxFactory.Identifier(ElasticMarker.UnderlyingNode, text, ElasticMarker.UnderlyingNode));
298303
}
299304

@@ -306,6 +311,11 @@ public static SyntaxToken Identifier(string text)
306311
/// <param name="trailing">A list of trivia immediately following the token.</param>
307312
public static SyntaxToken Identifier(SyntaxTriviaList leading, string text, SyntaxTriviaList trailing)
308313
{
314+
if (text == null)
315+
{
316+
throw new ArgumentNullException(nameof(text));
317+
}
318+
309319
return new SyntaxToken(Syntax.InternalSyntax.SyntaxFactory.Identifier(leading.Node, text, trailing.Node));
310320
}
311321

@@ -319,6 +329,16 @@ public static SyntaxToken Identifier(SyntaxTriviaList leading, string text, Synt
319329
/// <param name="trailing">A list of trivia immediately following the token.</param>
320330
public static SyntaxToken VerbatimIdentifier(SyntaxTriviaList leading, string text, string valueText, SyntaxTriviaList trailing)
321331
{
332+
if (text == null)
333+
{
334+
throw new ArgumentNullException(nameof(text));
335+
}
336+
337+
if (valueText == null)
338+
{
339+
throw new ArgumentNullException(nameof(valueText));
340+
}
341+
322342
if (text.StartsWith("@", StringComparison.Ordinal))
323343
{
324344
throw new ArgumentException("text should not start with an @ character.");
@@ -340,6 +360,16 @@ public static SyntaxToken VerbatimIdentifier(SyntaxTriviaList leading, string te
340360
/// <returns></returns>
341361
public static SyntaxToken Identifier(SyntaxTriviaList leading, SyntaxKind contextualKind, string text, string valueText, SyntaxTriviaList trailing)
342362
{
363+
if (text == null)
364+
{
365+
throw new ArgumentNullException(nameof(text));
366+
}
367+
368+
if (valueText == null)
369+
{
370+
throw new ArgumentNullException(nameof(valueText));
371+
}
372+
343373
return new SyntaxToken(InternalSyntax.SyntaxFactory.Identifier(contextualKind, leading.Node, text, valueText, trailing.Node));
344374
}
345375

src/Compilers/CSharp/Test/Syntax/Syntax/SyntaxFactoryTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,5 +714,21 @@ public void TestParseMethodsKeepParseOptionsInTheTree()
714714
var typeName = SyntaxFactory.ParseTypeName("", options: parseOptions);
715715
Assert.Same(parseOptions, typeName.SyntaxTree.Options);
716716
}
717+
718+
[Fact, WorkItem("https://github.com/dotnet/roslyn/issues/17637")]
719+
public void Identifier_Null_ThrowsArgumentNullException()
720+
{
721+
Assert.Throws<ArgumentNullException>(() => SyntaxFactory.Identifier(text: null));
722+
Assert.Throws<ArgumentNullException>(() =>
723+
SyntaxFactory.Identifier(SyntaxFactory.TriviaList(), text: null, SyntaxFactory.TriviaList()));
724+
Assert.Throws<ArgumentNullException>(() =>
725+
SyntaxFactory.Identifier(SyntaxFactory.TriviaList(), SyntaxKind.IdentifierName, text: null, valueText: "value", SyntaxFactory.TriviaList()));
726+
Assert.Throws<ArgumentNullException>(() =>
727+
SyntaxFactory.Identifier(SyntaxFactory.TriviaList(), SyntaxKind.IdentifierName, text: "text", valueText: null, SyntaxFactory.TriviaList()));
728+
Assert.Throws<ArgumentNullException>(() =>
729+
SyntaxFactory.VerbatimIdentifier(SyntaxFactory.TriviaList(), text: null, valueText: "value", SyntaxFactory.TriviaList()));
730+
Assert.Throws<ArgumentNullException>(() =>
731+
SyntaxFactory.VerbatimIdentifier(SyntaxFactory.TriviaList(), text: "text", valueText: null, SyntaxFactory.TriviaList()));
732+
}
717733
}
718734
}

0 commit comments

Comments
 (0)