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

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

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

Loading…
Cancel
Save