private bool IsReportable(VariableDeclarationSyntax variableDeclaration, SemanticModel semanticModel) { bool result; TypeSyntax variableTypeName = variableDeclaration.Type; if (variableTypeName.IsVar) { // Implicitly-typed variables cannot have multiple declarators. Short circuit if it does. bool hasMultipleVariables = variableDeclaration.Variables.Skip(1).Any(); if(hasMultipleVariables == false) { // Special case: Ensure that 'var' isn't actually an alias to another type. (e.g. using var = System.String). IAliasSymbol aliasInfo = semanticModel.GetAliasInfo(variableTypeName); if (aliasInfo == null) { // Retrieve the type inferred for var. ITypeSymbol type = semanticModel.GetTypeInfo(variableTypeName).ConvertedType; // Special case: Ensure that 'var' isn't actually a type named 'var'. if (type.Name.Equals("var", StringComparison.Ordinal) == false) { // Special case: Ensure that the type is not an anonymous type. if (type.IsAnonymousType == false) { // Special case: Ensure that it's not a 'new' expression. if (variableDeclaration.Variables.First().Initializer.Value.IsKind(SyntaxKind.ObjectCreationExpression)) { result = false; } else { result = true; } } else { result = false; } } else { result = false; } } else { result = false; } } else { result = false; } } else { result = false; } return result; }
/// <summary> /// Determines whether the specified TypeSyntax is actually 'var'. /// </summary> public static bool IsTypeInferred(this TypeSyntax typeSyntax, SemanticModel semanticModel) { if (!typeSyntax.IsVar) { return false; } if (semanticModel.GetAliasInfo(typeSyntax) != null) { return false; } var type = semanticModel.GetTypeInfo(typeSyntax).Type; if (type == null) { return false; } if (type.Name == "var") { return false; } return true; }
/// <summary> /// If "nameSyntax" resolves to an alias name, return the IAliasSymbol corresponding /// to A. Otherwise return null. /// </summary> /// <param name="semanticModel"></param> /// <param name="nameSyntax">Name to get alias info for.</param> /// <param name="cancellationToken">A cancellation token that can be used to cancel the /// process of obtaining the alias information.</param> public static IAliasSymbol?GetAliasInfo( this SemanticModel semanticModel, SyntaxNode nameSyntax, CancellationToken cancellationToken = default(CancellationToken) ) { return(semanticModel.GetAliasInfo(nameSyntax, cancellationToken)); }