diff --git a/src/libraries/System.CodeDom/src/Microsoft/CSharp/CSharpCodeGenerator.cs b/src/libraries/System.CodeDom/src/Microsoft/CSharp/CSharpCodeGenerator.cs
index 1f84d8bc56e9c..0d7bc48f361b8 100644
--- a/src/libraries/System.CodeDom/src/Microsoft/CSharp/CSharpCodeGenerator.cs
+++ b/src/libraries/System.CodeDom/src/Microsoft/CSharp/CSharpCodeGenerator.cs
@@ -518,6 +518,11 @@ private void GenerateNamespace(CodeNamespace e)
private void GenerateStatement(CodeStatement e)
{
+ if (e == null)
+ {
+ throw new ArgumentNullException(nameof(e));
+ }
+
if (e.StartDirectives.Count > 0)
{
GenerateDirectives(e.StartDirectives);
@@ -683,15 +688,7 @@ private void GeneratePrimitiveExpression(CodePrimitiveExpression e)
Output.Write(((ulong)e.Value).ToString(CultureInfo.InvariantCulture));
Output.Write("ul");
}
- else
- {
- GeneratePrimitiveExpressionBase(e);
- }
- }
-
- private void GeneratePrimitiveExpressionBase(CodePrimitiveExpression e)
- {
- if (e.Value == null)
+ else if (e.Value == null)
{
Output.Write(NullToken);
}
@@ -699,10 +696,6 @@ private void GeneratePrimitiveExpressionBase(CodePrimitiveExpression e)
{
Output.Write(QuoteSnippetString((string)e.Value));
}
- else if (e.Value is char)
- {
- Output.Write("'" + e.Value.ToString() + "'");
- }
else if (e.Value is byte)
{
Output.Write(((byte)e.Value).ToString(CultureInfo.InvariantCulture));
@@ -744,7 +737,7 @@ private void GeneratePrimitiveExpressionBase(CodePrimitiveExpression e)
}
else
{
- throw new ArgumentException(SR.Format(SR.InvalidPrimitiveType, e.Value.GetType()));
+ throw new ArgumentException(SR.Format(SR.InvalidPrimitiveType, e.Value.GetType()), nameof(e));
}
}
@@ -929,8 +922,8 @@ private void GenerateConditionStatement(CodeConditionStatement e)
GenerateStatements(e.TrueStatements);
Indent--;
- CodeStatementCollection falseStatemetns = e.FalseStatements;
- if (falseStatemetns.Count > 0)
+ CodeStatementCollection falseStatements = e.FalseStatements;
+ if (falseStatements.Count > 0)
{
Output.Write('}');
if (_options.ElseOnClosing)
@@ -2557,7 +2550,11 @@ private void GenerateNamespaceImport(CodeNamespaceImport e)
private void GenerateAttributes(CodeAttributeDeclarationCollection attributes, string prefix, bool inLine)
{
- if (attributes.Count == 0) return;
+ if (attributes.Count == 0)
+ {
+ return;
+ }
+
bool paramArray = false;
foreach (CodeAttributeDeclaration current in attributes)
{
@@ -2666,12 +2663,17 @@ public void ValidateIdentifier(string value)
{
if (!IsValidIdentifier(value))
{
- throw new ArgumentException(SR.Format(SR.InvalidIdentifier, value));
+ throw new ArgumentException(SR.Format(SR.InvalidIdentifier, value), nameof(value));
}
}
public string CreateValidIdentifier(string name)
{
+ if (name == null)
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+
if (CSharpHelpers.IsPrefixTwoUnderscore(name))
{
name = "_" + name;
@@ -2687,6 +2689,11 @@ public string CreateValidIdentifier(string name)
public string CreateEscapedIdentifier(string name)
{
+ if (name == null)
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+
return CSharpHelpers.CreateEscapedIdentifier(name);
}
diff --git a/src/libraries/System.CodeDom/src/Microsoft/VisualBasic/VBCodeGenerator.cs b/src/libraries/System.CodeDom/src/Microsoft/VisualBasic/VBCodeGenerator.cs
index 59559a85c6f46..028476723aedb 100644
--- a/src/libraries/System.CodeDom/src/Microsoft/VisualBasic/VBCodeGenerator.cs
+++ b/src/libraries/System.CodeDom/src/Microsoft/VisualBasic/VBCodeGenerator.cs
@@ -1271,8 +1271,8 @@ protected override void GenerateConditionStatement(CodeConditionStatement e)
GenerateVBStatements(e.TrueStatements);
Indent--;
- CodeStatementCollection falseStatemetns = e.FalseStatements;
- if (falseStatemetns.Count > 0)
+ CodeStatementCollection falseStatements = e.FalseStatements;
+ if (falseStatements.Count > 0)
{
Output.Write("Else");
Output.WriteLine();
diff --git a/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/CodeValidator.cs b/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/CodeValidator.cs
index 8e8f4d689d611..cd806bc7f5cee 100644
--- a/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/CodeValidator.cs
+++ b/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/CodeValidator.cs
@@ -547,8 +547,8 @@ private void ValidateConditionStatement(CodeConditionStatement e)
ValidateExpression(e.Condition);
ValidateStatements(e.TrueStatements);
- CodeStatementCollection falseStatemetns = e.FalseStatements;
- if (falseStatemetns.Count > 0)
+ CodeStatementCollection falseStatements = e.FalseStatements;
+ if (falseStatements.Count > 0)
{
ValidateStatements(e.FalseStatements);
}
diff --git a/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/ExposedTabStringIndentedTextWriter.cs b/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/ExposedTabStringIndentedTextWriter.cs
index f442c7a00b38e..a6b310ce43a87 100644
--- a/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/ExposedTabStringIndentedTextWriter.cs
+++ b/src/libraries/System.CodeDom/src/System/CodeDom/Compiler/ExposedTabStringIndentedTextWriter.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.IO;
namespace System.CodeDom.Compiler
@@ -9,7 +10,8 @@ internal sealed class ExposedTabStringIndentedTextWriter : IndentedTextWriter
{
public ExposedTabStringIndentedTextWriter(TextWriter writer, string tabString) : base(writer, tabString)
{
- TabString = tabString ?? IndentedTextWriter.DefaultTabString;
+ Debug.Assert(tabString != null, "CodeGeneratorOptions can never have a null TabString");
+ TabString = tabString;
}
internal void InternalOutputTabs()
@@ -46,14 +48,16 @@ internal string IndentationString
switch (_indent)
{
- case 0: _s = string.Empty; break;
case 1: _s = tabString; break;
case 2: _s = tabString + tabString; break;
case 3: _s = tabString + tabString + tabString; break;
case 4: _s = tabString + tabString + tabString + tabString; break;
default:
var args = new string[_indent];
- for (int i = 0; i < args.Length; i++) args[i] = tabString;
+ for (int i = 0; i < args.Length; i++)
+ {
+ args[i] = tabString;
+ }
return string.Concat(args);
}
}
diff --git a/src/libraries/System.CodeDom/tests/System.CodeDom.Tests.csproj b/src/libraries/System.CodeDom/tests/System.CodeDom.Tests.csproj
index f90d915dffa5f..1b5b0969316f4 100644
--- a/src/libraries/System.CodeDom/tests/System.CodeDom.Tests.csproj
+++ b/src/libraries/System.CodeDom/tests/System.CodeDom.Tests.csproj
@@ -29,6 +29,7 @@
+
diff --git a/src/libraries/System.CodeDom/tests/System/CodeDom/Compiler/CSharpCodeGeneratorTests.cs b/src/libraries/System.CodeDom/tests/System/CodeDom/Compiler/CSharpCodeGeneratorTests.cs
new file mode 100644
index 0000000000000..b7818f6f9cde0
--- /dev/null
+++ b/src/libraries/System.CodeDom/tests/System/CodeDom/Compiler/CSharpCodeGeneratorTests.cs
@@ -0,0 +1,2728 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using Xunit;
+
+namespace System.CodeDom.Compiler.Tests
+{
+ public class CSharpCodeGeneratorTests
+ {
+ private static IEnumerable Identifier_TestData()
+ {
+ yield return "as";
+ yield return "do";
+ yield return "if";
+ yield return "in";
+ yield return "is";
+ yield return "for";
+ yield return "int";
+ yield return "new";
+ yield return "out";
+ yield return "ref";
+ yield return "try";
+ yield return "base";
+ yield return "byte";
+ yield return "bool";
+ yield return "case";
+ yield return "char";
+ yield return "else";
+ yield return "enum";
+ yield return "goto";
+ yield return "lock";
+ yield return "long";
+ yield return "null";
+ yield return "this";
+ yield return "true";
+ yield return "uint";
+ yield return "void";
+ yield return "break";
+ yield return "catch";
+ yield return "class";
+ yield return "const";
+ yield return "event";
+ yield return "false";
+ yield return "fixed";
+ yield return "float";
+ yield return "sbyte";
+ yield return "short";
+ yield return "throw";
+ yield return "ulong";
+ yield return "using";
+ yield return "where";
+ yield return "while";
+ yield return "yield";
+ yield return "double";
+ yield return "extern";
+ yield return "object";
+ yield return "params";
+ yield return "public";
+ yield return "return";
+ yield return "sealed";
+ yield return "sizeof";
+ yield return "static";
+ yield return "string";
+ yield return "struct";
+ yield return "switch";
+ yield return "typeof";
+ yield return "unsafe";
+ yield return "ushort";
+ yield return "checked";
+ yield return "decimal";
+ yield return "default";
+ yield return "finally";
+ yield return "foreach";
+ yield return "partial";
+ yield return "private";
+ yield return "virtual";
+ yield return "abstract";
+ yield return "continue";
+ yield return "delegate";
+ yield return "explicit";
+ yield return "implicit";
+ yield return "internal";
+ yield return "operator";
+ yield return "override";
+ yield return "readonly";
+ yield return "volatile";
+ yield return "__arglist";
+ yield return "__makeref";
+ yield return "__reftype";
+ yield return "interface";
+ yield return "namespace";
+ yield return "protected";
+ yield return "unchecked";
+ yield return "__refvalue";
+ yield return "stackalloc";
+ }
+
+ public static IEnumerable