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); }
private bool IsInferredPredefinedType(SyntaxNode declarationStatement, SemanticModel semanticModel, CancellationToken cancellationToken) { TypeSyntax typeSyntax = GetTypeSyntaxFromDeclaration(declarationStatement); return(typeSyntax != null ? typeSyntax.IsTypeInferred(semanticModel) && semanticModel.GetTypeInfo(typeSyntax).Type?.IsSpecialType() == true : false); }
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.Parent is ForEachStatementSyntax foreachStatment) { var foreachStatementInfo = semanticModel.GetForEachStatementInfo(foreachStatment); if (foreachStatementInfo.ElementConversion.IsIdentityOrImplicitReference()) { issueSpan = candidateIssueSpan; return(true); } } issueSpan = default(TextSpan); return(false); }
internal override bool TryAnalyzeVariableDeclaration( TypeSyntax typeName, SemanticModel semanticModel, OptionSet optionSet, CancellationToken cancellationToken) { // var (x, y) = e; // foreach (var (x, y) in e) ... if (typeName.IsParentKind(SyntaxKind.DeclarationExpression)) { var parent = (DeclarationExpressionSyntax)typeName.Parent; if (parent.Designation.IsKind(SyntaxKind.ParenthesizedVariableDesignation)) { return(true); } } // 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.Value, semanticModel, optionSet, cancellationToken)) { return(false); } } else if (typeName.Parent.IsKind(SyntaxKind.ForEachStatement)) { var foreachStatement = (ForEachStatementSyntax)typeName.Parent; if (!AssignmentSupportsStylePreference( foreachStatement.Identifier, typeName, foreachStatement.Expression, semanticModel, optionSet, cancellationToken)) { return(false); } } return(true); }