Browse Source

[CodeActions] fixed bug implemented 'protected internal abstract' members.

The 'internal' modifier is necessary in overrides if they are inside the same assembly as the abstract member.
newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
4a337b8ed1
  1. 11
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs
  2. 16
      ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
  3. 30
      ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ImplementAbstractMembersTest.cs

11
ICSharpCode.NRefactory.CSharp/Refactoring/CodeActions/ImplementInterfaceAction.cs

@ -93,6 +93,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -93,6 +93,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
var builder = context.CreateTypeSytemAstBuilder();
builder.GenerateBody = true;
builder.ShowModifiers = false;
builder.ShowAccessibility = true;
builder.ShowConstantValues = !explicitImplementation;
builder.ShowTypeParameterConstraints = !explicitImplementation;
builder.UseCustomEvents = explicitImplementation;
@ -100,11 +102,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -100,11 +102,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (explicitImplementation) {
decl.Modifiers = Modifiers.None;
decl.AddChild(builder.ConvertType(member.DeclaringType), EntityDeclaration.PrivateImplementationTypeRole);
} else if (member.DeclaringType.Kind == TypeKind.Interface) {
decl.Modifiers |= Modifiers.Public;
} else {
if (member.IsProtected) {
decl.Modifiers = Modifiers.Protected;
} else {
decl.Modifiers = Modifiers.Public;
// Remove 'internal' modifier from 'protected internal' members if the override is in a different assembly than the member
if (!member.ParentAssembly.InternalsVisibleTo(context.Compilation.MainAssembly)) {
decl.Modifiers &= ~Modifiers.Internal;
}
}
return decl;

16
ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -461,7 +461,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -461,7 +461,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
EntityDeclaration ConvertTypeDefinition(ITypeDefinition typeDefinition)
{
Modifiers modifiers = ModifierFromAccessibility(typeDefinition.Accessibility);
Modifiers modifiers = Modifiers.None;
if (this.ShowAccessibility) {
modifiers |= ModifierFromAccessibility(typeDefinition.Accessibility);
}
if (this.ShowModifiers) {
if (typeDefinition.IsStatic) {
modifiers |= Modifiers.Static;
@ -598,7 +601,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -598,7 +601,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (accessor == null)
return Accessor.Null;
Accessor decl = new Accessor();
if (accessor.Accessibility != ownerAccessibility)
if (this.ShowAccessibility && accessor.Accessibility != ownerAccessibility)
decl.Modifiers = ModifierFromAccessibility(accessor.Accessibility);
decl.Body = GenerateBodyBlock();
return decl;
@ -716,10 +719,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -716,10 +719,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
#endregion
#region Convert Modifiers
Modifiers ModifierFromAccessibility(Accessibility accessibility)
static Modifiers ModifierFromAccessibility(Accessibility accessibility)
{
if (!this.ShowAccessibility)
return Modifiers.None;
switch (accessibility) {
case Accessibility.Private:
return Modifiers.Private;
@ -740,7 +741,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -740,7 +741,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
Modifiers GetMemberModifiers(IMember member)
{
bool isInterfaceMember = member.DeclaringType.Kind == TypeKind.Interface;
Modifiers m = isInterfaceMember ? Modifiers.None : ModifierFromAccessibility(member.Accessibility);
Modifiers m = Modifiers.None;
if (this.ShowAccessibility && !isInterfaceMember) {
m |= ModifierFromAccessibility(member.Accessibility);
}
if (this.ShowModifiers) {
if (member.IsStatic) {
m |= Modifiers.Static;

30
ICSharpCode.NRefactory.Tests/CSharp/CodeActions/ImplementAbstractMembersTest.cs

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
//
//
// ImplementAbstractMembersTest.cs
//
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
@ -85,6 +85,32 @@ class Foo : Simple @@ -85,6 +85,32 @@ class Foo : Simple
");
}
[Test()]
public void TestProtectedInternalMembers()
{
Test<ImplementAbstractMembersAction>(@"abstract class Simple {
protected internal abstract string ServiceName { get; }
}
class Foo : $Simple
{
}
", @"abstract class Simple {
protected internal abstract string ServiceName { get; }
}
class Foo : Simple
{
#region implemented abstract members of Simple
protected internal override string ServiceName {
get {
throw new System.NotImplementedException ();
}
}
#endregion
}
");
}
}
}

Loading…
Cancel
Save