private static bool TypeParameterNamesMatch(BaseTypeDeclarationSyntax baseTypeDeclarationSyntax, TypeSyntax name) { TypeParameterListSyntax typeParameterList; if (baseTypeDeclarationSyntax.IsKind(SyntaxKind.ClassDeclaration)) { typeParameterList = (baseTypeDeclarationSyntax as ClassDeclarationSyntax)?.TypeParameterList; } else { typeParameterList = (baseTypeDeclarationSyntax as StructDeclarationSyntax)?.TypeParameterList; } var genericName = name as GenericNameSyntax; if (genericName != null) { var genericNameArgumentNames = genericName.TypeArgumentList.Arguments.Cast <SimpleNameSyntax>().Select(p => p.Identifier.ToString()); var classParameterNames = typeParameterList?.Parameters.Select(p => p.Identifier.ToString()) ?? Enumerable.Empty <string>(); // Make sure the names match up return(genericNameArgumentNames.SequenceEqual(classParameterNames)); } else { return(typeParameterList == null || !typeParameterList.Parameters.Any()); } }
internal static ImmutableArray <string> GenerateStandardText(Document document, BaseMethodDeclarationSyntax methodDeclaration, BaseTypeDeclarationSyntax typeDeclaration, CancellationToken cancellationToken) { bool isStruct = typeDeclaration.IsKind(SyntaxKind.StructDeclaration); var settings = document.Project.AnalyzerOptions.GetStyleCopSettings(methodDeclaration.SyntaxTree, cancellationToken); var culture = settings.DocumentationRules.DocumentationCultureInfo; var resourceManager = DocumentationResources.ResourceManager; if (methodDeclaration is ConstructorDeclarationSyntax) { var typeKindText = resourceManager.GetString(isStruct ? nameof(DocumentationResources.TypeTextStruct) : nameof(DocumentationResources.TypeTextClass), culture); if (methodDeclaration.Modifiers.Any(SyntaxKind.StaticKeyword)) { return(ImmutableArray.Create( string.Format(resourceManager.GetString(nameof(DocumentationResources.StaticConstructorStandardTextFirstPart), culture), typeKindText), string.Format(resourceManager.GetString(nameof(DocumentationResources.StaticConstructorStandardTextSecondPart), culture), typeKindText))); } else { // Prefer to insert the "non-private" wording for all constructors, even though both are considered // acceptable for private constructors by the diagnostic. // https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/413 return(ImmutableArray.Create( string.Format(resourceManager.GetString(nameof(DocumentationResources.NonPrivateConstructorStandardTextFirstPart), culture), typeKindText), string.Format(resourceManager.GetString(nameof(DocumentationResources.NonPrivateConstructorStandardTextSecondPart), culture), typeKindText))); } } else if (methodDeclaration is DestructorDeclarationSyntax) { return(ImmutableArray.Create( resourceManager.GetString(nameof(DocumentationResources.DestructorStandardTextFirstPart), culture), resourceManager.GetString(nameof(DocumentationResources.DestructorStandardTextSecondPart), culture))); } else { throw new InvalidOperationException("XmlElementSyntax has invalid method as its parent"); } }
private static bool TypeParameterNamesMatch(BaseTypeDeclarationSyntax baseTypeDeclarationSyntax, TypeSyntax name) { TypeParameterListSyntax typeParameterList; if (baseTypeDeclarationSyntax.IsKind(SyntaxKind.ClassDeclaration)) { typeParameterList = (baseTypeDeclarationSyntax as ClassDeclarationSyntax)?.TypeParameterList; } else { typeParameterList = (baseTypeDeclarationSyntax as StructDeclarationSyntax)?.TypeParameterList; } var genericName = name as GenericNameSyntax; if (genericName != null) { var genericNameArgumentNames = genericName.TypeArgumentList.Arguments.Cast<SimpleNameSyntax>().Select(p => p.Identifier.ToString()); var classParameterNames = typeParameterList?.Parameters.Select(p => p.Identifier.ToString()) ?? Enumerable.Empty<string>(); // Make sure the names match up return genericNameArgumentNames.SequenceEqual(classParameterNames); } else { return typeParameterList == null || !typeParameterList.Parameters.Any(); } }