Browse Source

Fix modifiers on default interface methods.

pull/1728/head
Daniel Grunwald 6 years ago
parent
commit
5911b13497
  1. 36
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InterfaceTests.cs
  2. 22
      ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

36
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InterfaceTests.cs

@ -16,6 +16,9 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
// We can't test this because "error CS8701: Target runtime doesn't support default interface implementation."
#undef CS80
using System; using System;
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
@ -37,9 +40,42 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
event EventHandler MyEvent; event EventHandler MyEvent;
void Method(); void Method();
#if CS80
void DefaultMethod()
{
Method();
PrivateMethod();
}
private void PrivateMethod()
{
Method();
}
internal void InternalMethod()
{
Method();
}
sealed void SealedMethod()
{
Method();
}
static void StaticMethod()
{
}
#endif
} }
public interface IA2 : IA public interface IA2 : IA
{ {
#if CS80
void IA.InternalMethod()
{
}
#endif
} }
public interface IB public interface IB
{ {

22
ICSharpCode.Decompiler/CSharp/Syntax/TypeSystemAstBuilder.cs

@ -1741,8 +1741,11 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
bool NeedsAccessibility(IMember member) bool NeedsAccessibility(IMember member)
{ {
var declaringType = member.DeclaringType; var declaringType = member.DeclaringType;
if ((declaringType != null && declaringType.Kind == TypeKind.Interface) || member.IsExplicitInterfaceImplementation) if (member.IsExplicitInterfaceImplementation)
return false; return false;
if (declaringType != null && declaringType.Kind == TypeKind.Interface) {
return member.Accessibility != Accessibility.Public;
}
switch (member.SymbolKind) { switch (member.SymbolKind) {
case SymbolKind.Constructor: case SymbolKind.Constructor:
return !member.IsStatic; return !member.IsStatic;
@ -1764,13 +1767,18 @@ namespace ICSharpCode.Decompiler.CSharp.Syntax
m |= Modifiers.Static; m |= Modifiers.Static;
} else { } else {
var declaringType = member.DeclaringType; var declaringType = member.DeclaringType;
if (member.IsAbstract && declaringType != null && declaringType.Kind != TypeKind.Interface) if (declaringType.Kind == TypeKind.Interface) {
m |= Modifiers.Abstract; if (!member.IsVirtual && !member.IsAbstract && !member.IsOverride && member.Accessibility != Accessibility.Private)
if (member.IsOverride) m |= Modifiers.Sealed;
} else {
if (member.IsAbstract)
m |= Modifiers.Abstract;
else if (member.IsVirtual && !member.IsOverride)
m |= Modifiers.Virtual;
}
if (member.IsOverride && !member.IsExplicitInterfaceImplementation)
m |= Modifiers.Override; m |= Modifiers.Override;
if (member.IsVirtual && !member.IsAbstract && !member.IsOverride && declaringType.Kind != TypeKind.Interface) if (member.IsSealed && !member.IsExplicitInterfaceImplementation)
m |= Modifiers.Virtual;
if (member.IsSealed)
m |= Modifiers.Sealed; m |= Modifiers.Sealed;
if (member is IMethod method && method.ThisIsRefReadOnly && method.DeclaringTypeDefinition?.IsReadOnly == false) if (member is IMethod method && method.ThisIsRefReadOnly && method.DeclaringTypeDefinition?.IsReadOnly == false)
m |= Modifiers.Readonly; m |= Modifiers.Readonly;

Loading…
Cancel
Save