Merge pull request #6089 from tamasvajk/feature/interface-member-modifier

C#: Allow abstract modifier on interface members
This commit is contained in:
Tamás Vajk
2021-06-16 10:44:43 +02:00
committed by GitHub
4 changed files with 15 additions and 9 deletions

View File

@@ -72,15 +72,11 @@ namespace Semmle.Extraction.CSharp.Entities
public static void ExtractModifiers(Context cx, TextWriter trapFile, IEntity key, ISymbol symbol)
{
var interfaceDefinition = symbol.ContainingType is not null
&& symbol.ContainingType.Kind == SymbolKind.NamedType
&& symbol.ContainingType.TypeKind == TypeKind.Interface;
HasAccessibility(cx, trapFile, key, symbol.DeclaredAccessibility);
if (symbol.Kind == SymbolKind.ErrorType)
trapFile.has_modifiers(key, Modifier.Create(cx, Accessibility.Public));
if (symbol.IsAbstract && (symbol.Kind != SymbolKind.NamedType || ((INamedTypeSymbol)symbol).TypeKind != TypeKind.Interface) && !interfaceDefinition)
if (symbol.IsAbstract && (symbol.Kind != SymbolKind.NamedType || ((INamedTypeSymbol)symbol).TypeKind != TypeKind.Interface))
HasModifier(cx, trapFile, key, "abstract");
if (symbol.IsSealed)
@@ -94,10 +90,6 @@ namespace Semmle.Extraction.CSharp.Entities
if (symbol.IsVirtual)
HasModifier(cx, trapFile, key, "virtual");
// For some reason, method in interfaces are "virtual", not "abstract"
if (symbol.IsAbstract && interfaceDefinition)
HasModifier(cx, trapFile, key, "virtual");
if (symbol.Kind == SymbolKind.Field && ((IFieldSymbol)symbol).IsReadOnly)
HasModifier(cx, trapFile, key, "readonly");

View File

@@ -21,3 +21,6 @@
| Modifiers.cs:54:52:54:54 | set_P1 | public |
| Modifiers.cs:55:20:55:21 | P2 | public |
| Modifiers.cs:55:36:55:38 | get_P2 | public |
| Modifiers.cs:60:22:60:23 | I1 | public |
| Modifiers.cs:62:14:62:15 | M1 | public |
| Modifiers.cs:63:14:63:15 | M2 | public |

View File

@@ -56,4 +56,10 @@ namespace N
/*private*/
int P3 { /*private*/ get; /*private*/ set; }
}
public interface I1
{
void M1();
void M2() => throw null;
}
}

View File

@@ -44,3 +44,8 @@
| Modifiers.cs:57:13:57:14 | P3 | file://:0:0:0:0 | private |
| Modifiers.cs:57:30:57:32 | get_P3 | file://:0:0:0:0 | private |
| Modifiers.cs:57:47:57:49 | set_P3 | file://:0:0:0:0 | private |
| Modifiers.cs:60:22:60:23 | I1 | file://:0:0:0:0 | public |
| Modifiers.cs:62:14:62:15 | M1 | file://:0:0:0:0 | abstract |
| Modifiers.cs:62:14:62:15 | M1 | file://:0:0:0:0 | public |
| Modifiers.cs:63:14:63:15 | M2 | file://:0:0:0:0 | public |
| Modifiers.cs:63:14:63:15 | M2 | file://:0:0:0:0 | virtual |