From 5307b168ebbdab0049e9ab3f5cf7051ceb3bb730 Mon Sep 17 00:00:00 2001 From: Mansheng Yang Date: Mon, 23 Jul 2012 00:20:10 +0800 Subject: [PATCH] [CodeAction] Added JoinStringAction --- .../ICSharpCode.NRefactory.CSharp.csproj | 1 + .../CodeActions/JoinStringAction.cs | 53 ++++++++++++ .../CSharp/CodeActions/JoinStringTests.cs | 85 +++++++++++++++++++ .../ICSharpCode.NRefactory.Tests.csproj | 1 + 4 files changed, 140 insertions(+) create mode 100644 ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/JoinStringAction.cs create mode 100644 ICSharpCode.NRefactory.Tests/CSharp/CodeActions/JoinStringTests.cs diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 7e5bd99701..8ca1c542e0 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -253,6 +253,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/JoinStringAction.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/JoinStringAction.cs new file mode 100644 index 0000000000..132a74c4be --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/JoinStringAction.cs @@ -0,0 +1,53 @@ +// +// JoinStringAction.cs +// +// Author: +// Mansheng Yang +// +// Copyright (c) 2012 Mansheng Yang +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +namespace ICSharpCode.NRefactory.CSharp.Refactoring +{ + [ContextAction ("Join string literal", Description = "Join string literals.")] + public class JoinStringAction : SpecializedCodeAction + { + protected override CodeAction GetAction (RefactoringContext context, BinaryOperatorExpression node) + { + var left = node.Left as PrimitiveExpression; + var right = node.Right as PrimitiveExpression; + + if (node.Operator != BinaryOperatorType.Add || left == null || right == null || + !(left.Value is string) || !(right.Value is string) || !node.OperatorToken.Contains(context.Location)) + return null; + + var isLeftVerbatim = left.LiteralValue.StartsWith ("@"); + var isRightVerbatime = right.LiteralValue.StartsWith ("@"); + if (isLeftVerbatim != isRightVerbatime) + return null; + + return new CodeAction (context.TranslateString ("Join strings"), script => { + var start = context.GetOffset (left.EndLocation) - 1; + var end = context.GetOffset (right.StartLocation) + (isLeftVerbatim ? 2 : 1); + script.RemoveText (start, end - start); + }); + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/JoinStringTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/JoinStringTests.cs new file mode 100644 index 0000000000..fb4738bbc2 --- /dev/null +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeActions/JoinStringTests.cs @@ -0,0 +1,85 @@ +// +// JoinStringTests.cs +// +// Author: +// Mansheng Yang +// +// Copyright (c) 2012 Mansheng Yang +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using ICSharpCode.NRefactory.CSharp.Refactoring; +using NUnit.Framework; + +namespace ICSharpCode.NRefactory.CSharp.CodeActions +{ + [TestFixture] + public class JoinStringTests : ContextActionTestBase + { + public void Test (string input, string output) + { + Test (@" +class TestClass +{ + string TestMethod () + { + return " + input + @"; + } +}", @" +class TestClass +{ + string TestMethod () + { + return " + output + @"; + } +}"); + } + + [Test] + public void TestRegularString () + { + Test ("\"a\" $+ \"a\"", "\"aa\""); + } + + [Test] + public void TestVerbatimString () + { + Test ("@\"a\" $+ @\"a\"", "@\"aa\""); + } + + public void TestWrongContext (string input) + { + TestWrongContext (@" +class TestClass +{ + string TestMethod () + { + return " + input + @"; + } +}"); + } + + [Test] + public void TestWrongContext () + { + TestWrongContext ("@\"a\" $+ \"a\""); + TestWrongContext ("\"a\" $+ @\"a\""); + } + } +} diff --git a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj index 35469a7158..708d780f5d 100644 --- a/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj +++ b/ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj @@ -94,6 +94,7 @@ +