Browse Source

[CodeAction] Added ConvertAsToCastAction and ConvertCastToAsAction

newNRvisualizers
Mansheng Yang 13 years ago
parent
commit
b5843ad190
  1. 2
      ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
  2. 42
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertAsToCastAction.cs
  3. 46
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertCastToAsAction.cs
  4. 58
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertAsToCastTests.cs
  5. 84
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertCastToAsTests.cs
  6. 2
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

2
ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj

@ -241,6 +241,8 @@ @@ -241,6 +241,8 @@
<Compile Include="Parser\mcs\typespec.cs" />
<Compile Include="Parser\mcs\visit.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Refactoring\CodeActions\ConvertAsToCastAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertCastToAsAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertIfToSwitchAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertSwitchToIfAction.cs" />
<Compile Include="Refactoring\CodeIssues\ExplicitConversionInForEachIssue.cs" />

42
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertAsToCastAction.cs

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
//
// ConvertAsToCastAction.cs
//
// Author:
// Mansheng Yang <lightyang0@gmail.com>
//
// Copyright (c) 2012 Mansheng Yang <lightyang0@gmail.com>
//
// 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
{
/// <summary>
/// Converts an 'as' expression to a cast expression
/// </summary>
[ContextAction("Convert 'as' to cast.", Description = "Convert 'as' to cast.")]
public class ConvertAsToCastAction : SpecializedCodeAction <AsExpression>
{
protected override CodeAction GetAction (RefactoringContext context, AsExpression node)
{
return new CodeAction (context.TranslateString ("Convert 'as' to cast"),
script => script.Replace (node, new CastExpression (node.Type.Clone (), node.Expression.Clone ())));
}
}
}

46
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertCastToAsAction.cs

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
//
// ConvertCastToAsAction.cs
//
// Author:
// Mansheng Yang <lightyang0@gmail.com>
//
// Copyright (c) 2012 Mansheng Yang <lightyang0@gmail.com>
//
// 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
{
/// <summary>
/// Converts a cast expression to an 'as' expression
/// </summary>
[ContextAction ("Convert cast to 'as'.", Description = "Convert cast to 'as'.")]
public class ConvertCastToAsAction : SpecializedCodeAction<CastExpression>
{
protected override CodeAction GetAction (RefactoringContext context, CastExpression node)
{
// only works on reference and nullable types
var type = context.ResolveType (node.Type);
if ((!(type.IsReferenceType ?? true)) && type.FullName != "System.Nullable")
return null;
return new CodeAction (context.TranslateString ("Convert cast to 'as'"),
script => script.Replace (node, new AsExpression (node.Expression.Clone (), node.Type.Clone ())));
}
}
}

58
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertAsToCastTests.cs

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
//
// ConvertAsToCastTests.cs
//
// Author:
// Mansheng Yang <lightyang0@gmail.com>
//
// Copyright (c) 2012 Mansheng Yang <lightyang0@gmail.com>
//
// 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 System;
using NUnit.Framework;
using ICSharpCode.NRefactory.CSharp.Refactoring;
namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
[TestFixture]
public class ConvertAsToCastTests : ContextActionTestBase
{
[Test]
public void Test()
{
Test<ConvertAsToCastAction> (@"
using System;
class TestClass
{
void Test (object a)
{
var b = a $as Exception;
}
}", @"
using System;
class TestClass
{
void Test (object a)
{
var b = (Exception)a;
}
}");
}
}
}

84
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertCastToAsTests.cs

@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
//
// ConvertCastToAsTest.cs
//
// Author:
// Mansheng Yang <lightyang0@gmail.com>
//
// Copyright (c) 2012 Mansheng Yang <lightyang0@gmail.com>
//
// 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 NUnit.Framework;
using ICSharpCode.NRefactory.CSharp.Refactoring;
namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
[TestFixture]
public class ConvertCastToAsTests : ContextActionTestBase
{
void TestType(string type)
{
string input = @"
using System;
class TestClass
{
void Test (object a)
{
var b = (" + type + @")$a;
}
}";
string output = @"
using System;
class TestClass
{
void Test (object a)
{
var b = a as " + type + @";
}
}";
Test<ConvertCastToAsAction> (input, output);
}
[Test]
public void Test()
{
TestType ("Exception");
}
[Test]
public void TestNullable()
{
TestType ("int?");
}
[Test]
public void TestNonReferenceType()
{
TestWrongContext<ConvertCastToAsAction> (@"
using System;
class TestClass
{
void Test (object a)
{
var b = (int)$a;
}
}");
}
}
}

2
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -81,6 +81,8 @@ @@ -81,6 +81,8 @@
</Compile>
<Compile Include="CSharp\Analysis\DefiniteAssignmentTests.cs" />
<Compile Include="CSharp\AstStructureTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertAsToCastTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertCastToAsTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertIfToSwtichTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertSwitchToIfTests.cs" />
<Compile Include="CSharp\CodeIssues\ExplicitConversionInForEachIssueTests.cs" />

Loading…
Cancel
Save