protected override bool TryAnalyzeVariableDeclaration(TypeSyntax typeName, SemanticModel semanticModel, OptionSet optionSet, CancellationToken cancellationToken, out TextSpan issueSpan) { issueSpan = default(TextSpan); // If it is currently not var, explicit typing exists, return. // this also takes care of cases where var is mapped to a named type via an alias or a class declaration. if (!typeName.IsTypeInferred(semanticModel)) { return false; } if (typeName.Parent.IsKind(SyntaxKind.VariableDeclaration) && typeName.Parent.Parent.IsKind(SyntaxKind.LocalDeclarationStatement, SyntaxKind.ForStatement, SyntaxKind.UsingStatement)) { // check assignment for variable declarations. var variable = ((VariableDeclarationSyntax)typeName.Parent).Variables.First(); if (!AssignmentSupportsStylePreference(variable.Identifier, typeName, variable.Initializer, semanticModel, optionSet, cancellationToken)) { return false; } } issueSpan = typeName.Span; return true; }
protected override bool TryAnalyzeVariableDeclaration(TypeSyntax typeName, SemanticModel semanticModel, OptionSet optionSet, CancellationToken cancellationToken, out TextSpan issueSpan) { // If it is already var, return. if (typeName.IsTypeInferred(semanticModel)) { issueSpan = default(TextSpan); return false; } var candidateReplacementNode = SyntaxFactory.IdentifierName("var"); var candidateIssueSpan = typeName.Span; // If there exists a type named var, return. var conflict = semanticModel.GetSpeculativeSymbolInfo(typeName.SpanStart, candidateReplacementNode, SpeculativeBindingOption.BindAsTypeOrNamespace).Symbol; if (conflict?.IsKind(SymbolKind.NamedType) == true) { issueSpan = default(TextSpan); return false; } if (typeName.Parent.IsKind(SyntaxKind.VariableDeclaration) && typeName.Parent.IsParentKind(SyntaxKind.LocalDeclarationStatement, SyntaxKind.ForStatement, SyntaxKind.UsingStatement)) { var variableDeclaration = (VariableDeclarationSyntax)typeName.Parent; // implicitly typed variables cannot be constants. if ((variableDeclaration.Parent as LocalDeclarationStatementSyntax)?.IsConst == true) { issueSpan = default(TextSpan); return false; } var variable = variableDeclaration.Variables.Single(); if (AssignmentSupportsStylePreference( variable.Identifier, typeName, variable.Initializer.Value, semanticModel, optionSet, cancellationToken)) { issueSpan = candidateIssueSpan; return true; } } else if (typeName.IsParentKind(SyntaxKind.ForEachStatement)) { issueSpan = candidateIssueSpan; return true; } issueSpan = default(TextSpan); return false; }