private async Task<Document> MakeConstAsync(Document document, LocalDeclarationStatementSyntax localDeclaration, CancellationToken cancellationToken) { var firstToken = localDeclaration.GetFirstToken(); var leadingTrivia = firstToken.LeadingTrivia; var trimmedLocal = localDeclaration.ReplaceToken(firstToken, firstToken.WithLeadingTrivia(SyntaxTriviaList.Empty)); var constToken = SyntaxFactory.Token(leadingTrivia, SyntaxKind.ConstKeyword, SyntaxFactory.TriviaList(SyntaxFactory.ElasticMarker)); var newModifiers = trimmedLocal.Modifiers.Insert(0, constToken); var variableDeclaration = localDeclaration.Declaration; var variableTypeName = variableDeclaration.Type; if (variableTypeName.IsVar) { var semanticModel = await document.GetSemanticModelAsync(cancellationToken); var aliasInfo = semanticModel.GetAliasInfo(variableTypeName); if (aliasInfo == null) { var type = semanticModel.GetTypeInfo(variableTypeName).ConvertedType; if (type.Name != "var") { var typeName = SyntaxFactory.ParseTypeName(type.ToDisplayString()) .WithLeadingTrivia(variableTypeName.GetLeadingTrivia()) .WithTrailingTrivia(variableTypeName.GetTrailingTrivia()); var simplifiedTypeName = typeName.WithAdditionalAnnotations(Simplifier.Annotation); variableDeclaration = variableDeclaration.WithType(simplifiedTypeName); } } } var newLocal = trimmedLocal.WithModifiers(newModifiers) .WithDeclaration(variableDeclaration); var formattedLocal = newLocal.WithAdditionalAnnotations(Formatter.Annotation); var root = await document.GetSyntaxRootAsync(cancellationToken); var newRoot = root.ReplaceNode(localDeclaration, formattedLocal); return document.WithSyntaxRoot(newRoot); }
private async Task<Document> MakeConstAsync(Document document, LocalDeclarationStatementSyntax localDeclaration, CancellationToken cancellationToken) { // Remove the leading trivia from the local declaration. var firstToken = localDeclaration.GetFirstToken(); var leadingTrivia = firstToken.LeadingTrivia; var trimmedLocal = localDeclaration.ReplaceToken( firstToken, firstToken.WithLeadingTrivia(SyntaxTriviaList.Empty)); // Create a const token with the leading trivia. var constToken = SyntaxFactory.Token(leadingTrivia, SyntaxKind.ConstKeyword, SyntaxFactory.TriviaList(SyntaxFactory.ElasticMarker)); // Insert the const token into the modifiers list, creating a new modifiers list. var newModifiers = trimmedLocal.Modifiers.Insert(0, constToken); // If the type of declaration is 'var', create a new type name for the // type inferred for 'var'. var variableDeclaration = localDeclaration.Declaration; var variableTypeName = variableDeclaration.Type; if (variableTypeName.IsVar) { var semanticModel = await document.GetSemanticModelAsync(cancellationToken); // Special case: Ensure that 'var' isn't actually an alias to another type // (e.g. using var = System.String). var aliasInfo = semanticModel.GetAliasInfo(variableTypeName); if (aliasInfo == null) { // Retrieve the type inferred for var. var type = semanticModel.GetTypeInfo(variableTypeName).ConvertedType; // Special case: Ensure that 'var' isn't actually a type named 'var'. if (type.Name != "var") { // Create a new TypeSyntax for the inferred type. Be careful // to keep any leading and trailing trivia from the var keyword. var typeName = SyntaxFactory.ParseTypeName(type.ToDisplayString()) .WithLeadingTrivia(variableTypeName.GetLeadingTrivia()) .WithTrailingTrivia(variableTypeName.GetTrailingTrivia()); // Add an annotation to simplify the type name. var simplifiedTypeName = typeName.WithAdditionalAnnotations(Simplifier.Annotation); // Replace the type in the variable declaration. variableDeclaration = variableDeclaration.WithType(simplifiedTypeName); } } } // Produce the new local declaration. var newLocal = trimmedLocal.WithModifiers(newModifiers) .WithDeclaration(variableDeclaration); // Add an annotation to format the new local declaration. var formattedLocal = newLocal.WithAdditionalAnnotations(Formatter.Annotation); // Replace the old local declaration with the new local declaration. var root = await document.GetSyntaxRootAsync(cancellationToken); var newRoot = root.ReplaceNode(localDeclaration, formattedLocal); // Return document with transformed tree. return document.WithSyntaxRoot(newRoot); }