diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/DictionaryExtensions.cs b/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/DictionaryExtensions.cs new file mode 100644 index 000000000..43ab0f827 --- /dev/null +++ b/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/DictionaryExtensions.cs @@ -0,0 +1,21 @@ +// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved. +// Licensed under the MIT License. See LICENSE in the project root for license information. + +namespace StyleCop.Analyzers.Helpers +{ + using System.Collections.Generic; + + internal static class DictionaryExtensions + { + public static TValue GetValueOrDefault(this Dictionary dictionary, TKey key, TValue defaultValue) + where TKey : notnull + { + if (!dictionary.TryGetValue(key, out var value)) + { + value = defaultValue; + } + + return value; + } + } +} diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1201ElementsMustAppearInTheCorrectOrder.cs b/StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1201ElementsMustAppearInTheCorrectOrder.cs index 8d09f5105..7000709c8 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1201ElementsMustAppearInTheCorrectOrder.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1201ElementsMustAppearInTheCorrectOrder.cs @@ -296,7 +296,11 @@ private static void HandleMemberList(SyntaxNodeAnalysisContext context, Immutabl if (index > nextIndex) { - context.ReportDiagnostic(Diagnostic.Create(Descriptor, NamedTypeHelpers.GetNameOrIdentifierLocation(members[i + 1]), MemberNames[nextElementSyntaxKind], MemberNames[elementSyntaxKind])); + // [Issue #3160] Added hardening here to make sure that this won't crash when working with invalid code. + var nextElementMemberName = MemberNames.GetValueOrDefault(nextElementSyntaxKind, ""); + var elementMemberName = MemberNames.GetValueOrDefault(elementSyntaxKind, ""); + + context.ReportDiagnostic(Diagnostic.Create(Descriptor, NamedTypeHelpers.GetNameOrIdentifierLocation(members[i + 1]), nextElementMemberName, elementMemberName)); } } }