Browse Source

[CodeAction] Added ConvertExplicitToImplicitImplementationAction and ConvertImplicitToExplicitImplementationAction

newNRvisualizers
Mansheng Yang 14 years ago
parent
commit
bfa89c799a
  1. 2
      ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj
  2. 64
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertExplicitToImplicitImplementationAction.cs
  3. 60
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertImplicitToExplicitImplementationAction.cs
  4. 92
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertExplicitToImplicitImplementationTests.cs
  5. 133
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertImplicitToExplicittImplementationTests.cs
  6. 2
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

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

@ -243,7 +243,9 @@ @@ -243,7 +243,9 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Refactoring\CodeActions\ConvertAsToCastAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertCastToAsAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertExplicitToImplicitImplementationAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertIfToSwitchAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertImplicitToExplicitImplementationAction.cs" />
<Compile Include="Refactoring\CodeActions\ConvertSwitchToIfAction.cs" />
<Compile Include="Refactoring\CodeActions\CreateCustomEventImplementationAction.cs" />
<Compile Include="Refactoring\CodeActions\CreateOverloadWithoutParameterAction.cs" />

64
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertExplicitToImplicitImplementationAction.cs

@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
//
// ConvertExplicitToImplicitImplementation.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.Linq;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
[ContextAction ("Convert explicit to implict implementation",
Description = " Convert explicit implementation of an interface method to implicit implementation")]
public class ConvertExplicitToImplicitImplementationAction : SpecializedCodeAction<MethodDeclaration>
{
protected override CodeAction GetAction (RefactoringContext context, MethodDeclaration node)
{
if (node.PrivateImplementationType.IsNull)
return null;
if (!node.NameToken.Contains (context.Location) &&
!node.PrivateImplementationType.Contains(context.Location))
return null;
var method = (IMethod)((MemberResolveResult)context.Resolve (node)).Member;
var type = method.DeclaringType;
// find existing method with the same signature
if (type.GetMethods (m => m.Name == node.Name && m.TypeParameters.Count == method.TypeParameters.Count
&& !m.IsExplicitInterfaceImplementation)
.Any (m => ParameterListComparer.Instance.Equals (m.Parameters, method.Parameters)))
return null;
return new CodeAction (context.TranslateString ("Convert explict to implicit implementation"),
script =>
{
var implicitImpl = (MethodDeclaration)node.Clone ();
implicitImpl.PrivateImplementationType = AstType.Null;
script.Replace (node, implicitImpl);
});
}
}
}

60
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ConvertImplicitToExplicitImplementationAction.cs

@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
//
// ConvertImplicitToExplicitImplementationAction.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 ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
[ContextAction ("Convert implict to explicit implementation",
Description = " Convert implict implementation of an interface method to explicit implementation")]
public class ConvertImplicitToExplicitImplementationAction : SpecializedCodeAction<MethodDeclaration>
{
protected override CodeAction GetAction (RefactoringContext context, MethodDeclaration node)
{
if (!node.PrivateImplementationType.IsNull)
return null;
if (!node.NameToken.Contains (context.Location))
return null;
var method = (IMethod)((MemberResolveResult)context.Resolve (node)).Member;
if (method.ImplementedInterfaceMembers.Count != 1 || method.DeclaringType.Kind == TypeKind.Interface)
return null;
return new CodeAction (context.TranslateString ("Convert implict to explicit implementation"),
script =>
{
var explicitImpl = (MethodDeclaration)node.Clone ();
// remove visibility modifier
explicitImpl.Modifiers &= ~Modifiers.VisibilityMask;
var implementedInterface = method.ImplementedInterfaceMembers [0].DeclaringType;
explicitImpl.PrivateImplementationType = context.CreateShortType (implementedInterface);
script.Replace (node, explicitImpl);
});
}
}
}

92
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertExplicitToImplicitImplementationTests.cs

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
//
// ConvertExplicitToImplicitImplementationTests.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 ICSharpCode.NRefactory.CSharp.Refactoring;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
[TestFixture]
public class ConvertExplicitToImplicitImplementationTests : ContextActionTestBase
{
[Test]
public void Test ()
{
Test<ConvertExplicitToImplicitImplementationAction> (@"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
void $ITest.Method ()
{
}
}", @"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
void Method ()
{
}
}");
}
[Test]
public void TestExistingMethod ()
{
TestWrongContext<ConvertExplicitToImplicitImplementationAction> (@"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
void $ITest.Method ()
{
}
void Method ()
{
}
}");
}
[Test]
public void TestNonExplitiImplementation ()
{
TestWrongContext<ConvertExplicitToImplicitImplementationAction> (@"
class TestClass
{
void $Method ()
{
}
}");
}
}
}

133
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ConvertImplicitToExplicittImplementationTests.cs

@ -0,0 +1,133 @@ @@ -0,0 +1,133 @@
//
// ConvertImplicitToExplicittImplementationTests.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 ICSharpCode.NRefactory.CSharp.Refactoring;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.CodeActions
{
[TestFixture]
public class ConvertImplicitToExplicittImplementationTests : ContextActionTestBase
{
[Test]
public void Test ()
{
Test<ConvertImplicitToExplicitImplementationAction> (@"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
void $Method ()
{
}
}", @"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
void ITest.Method ()
{
}
}");
}
[Test]
public void TestMultipleInterfaces ()
{
TestWrongContext<ConvertImplicitToExplicitImplementationAction> (@"
interface ITest
{
void Method ();
}
interface ITest2
{
void Method ();
}
class TestClass : ITest, ITest2
{
void $Method ()
{
}
}");
}
[Test]
public void TestNonImplicitImplementation ()
{
TestWrongContext<ConvertImplicitToExplicitImplementationAction> (@"
class TestClass
{
void $Method ()
{
}
}");
}
[Test]
public void TestInterfaceMethod ()
{
TestWrongContext<ConvertImplicitToExplicitImplementationAction> (@"
interface ITest
{
void Method ();
}
interface ITest2 : ITest
{
void $Method ();
}");
}
[Test]
public void TestModifier ()
{
Test<ConvertImplicitToExplicitImplementationAction> (@"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
public void $Method ()
{
}
}", @"
interface ITest
{
void Method ();
}
class TestClass : ITest
{
void ITest.Method ()
{
}
}");
}
}
}

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

@ -83,7 +83,9 @@ @@ -83,7 +83,9 @@
<Compile Include="CSharp\AstStructureTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertAsToCastTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertCastToAsTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertExplicitToImplicitImplementationTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertIfToSwtichTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertImplicitToExplicittImplementationTests.cs" />
<Compile Include="CSharp\CodeActions\ConvertSwitchToIfTests.cs" />
<Compile Include="CSharp\CodeActions\CreateCustomEventImplementationTests.cs" />
<Compile Include="CSharp\CodeActions\CreateOverloadWithoutParameterTests.cs" />

Loading…
Cancel
Save