Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NRT, warnings-as-errors, file-scoped-namespaces, test isolation #30

Merged
merged 2 commits into from
Nov 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project>
<PropertyGroup>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>
2 changes: 2 additions & 0 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@
<PackageIcon>icon.png</PackageIcon>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>

<Import Project="..\Directory.Build.props" />
</Project>
15 changes: 7 additions & 8 deletions src/Refasmer/Filters/AllowAll.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using System.Reflection.Metadata;

namespace JetBrains.Refasmer.Filters
namespace JetBrains.Refasmer.Filters;

public class AllowAll : IImportFilter
{
public class AllowAll : IImportFilter
{
public bool OmitNonApiMembers => false;
public bool OmitNonApiMembers => false;

public virtual bool AllowImport(TypeDefinition declaringType, MetadataReader reader) => true;
public virtual bool AllowImport( MethodDefinition method, MetadataReader reader ) => true;
public virtual bool AllowImport( FieldDefinition field, MetadataReader reader ) => true;
}
public virtual bool AllowImport(TypeDefinition declaringType, MetadataReader reader) => true;
public virtual bool AllowImport( MethodDefinition method, MetadataReader reader ) => true;
public virtual bool AllowImport( FieldDefinition field, MetadataReader reader ) => true;
}
89 changes: 44 additions & 45 deletions src/Refasmer/Filters/AllowPublic.cs
Original file line number Diff line number Diff line change
@@ -1,58 +1,57 @@
using System.Reflection;
using System.Reflection.Metadata;

namespace JetBrains.Refasmer.Filters
namespace JetBrains.Refasmer.Filters;

public class AllowPublic(bool omitNonApiMembers) : PartialTypeFilterBase(omitNonApiMembers)
{
public class AllowPublic(bool omitNonApiMembers) : PartialTypeFilterBase(omitNonApiMembers)
public override bool AllowImport(TypeDefinition type, MetadataReader reader)
{
public override bool AllowImport(TypeDefinition type, MetadataReader reader)
{
if (!base.AllowImport(type, reader)) return false;
if (!omitNonApiMembers) return true;
if (!base.AllowImport(type, reader)) return false;
if (!OmitNonApiMembers) return true;

switch (type.Attributes & TypeAttributes.VisibilityMask)
{
case TypeAttributes.Public:
return true;
case TypeAttributes.NestedPublic:
return AllowImport(reader.GetTypeDefinition(type.GetDeclaringType()), reader);
case TypeAttributes.NestedFamily:
case TypeAttributes.NestedFamORAssem:
var declaringType = reader.GetTypeDefinition(type.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0 && AllowImport(declaringType, reader);
default:
return false;
}
switch (type.Attributes & TypeAttributes.VisibilityMask)
{
case TypeAttributes.Public:
return true;
case TypeAttributes.NestedPublic:
return AllowImport(reader.GetTypeDefinition(type.GetDeclaringType()), reader);
case TypeAttributes.NestedFamily:
case TypeAttributes.NestedFamORAssem:
var declaringType = reader.GetTypeDefinition(type.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0 && AllowImport(declaringType, reader);
default:
return false;
}
}

public override bool AllowImport( MethodDefinition method, MetadataReader reader )
public override bool AllowImport( MethodDefinition method, MetadataReader reader )
{
switch (method.Attributes & MethodAttributes.MemberAccessMask)
{
switch (method.Attributes & MethodAttributes.MemberAccessMask)
{
case MethodAttributes.Public:
return true;
case MethodAttributes.Family:
case MethodAttributes.FamORAssem:
var declaringType = reader.GetTypeDefinition(method.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
case MethodAttributes.Public:
return true;
case MethodAttributes.Family:
case MethodAttributes.FamORAssem:
var declaringType = reader.GetTypeDefinition(method.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
}

public override bool AllowImport( FieldDefinition field, MetadataReader reader )
public override bool AllowImport( FieldDefinition field, MetadataReader reader )
{
switch (field.Attributes & FieldAttributes.FieldAccessMask)
{
switch (field.Attributes & FieldAttributes.FieldAccessMask)
{
case FieldAttributes.Public:
return true;
case FieldAttributes.Family:
case FieldAttributes.FamORAssem:
var declaringType = reader.GetTypeDefinition(field.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
}
}
case FieldAttributes.Public:
return true;
case FieldAttributes.Family:
case FieldAttributes.FamORAssem:
var declaringType = reader.GetTypeDefinition(field.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
}
}
113 changes: 56 additions & 57 deletions src/Refasmer/Filters/AllowPublicAndInternals.cs
Original file line number Diff line number Diff line change
@@ -1,71 +1,70 @@
using System.Reflection;
using System.Reflection.Metadata;

namespace JetBrains.Refasmer.Filters
namespace JetBrains.Refasmer.Filters;

public class AllowPublicAndInternals(bool omitNonApiMembers) : PartialTypeFilterBase(omitNonApiMembers)
{
public class AllowPublicAndInternals(bool omitNonApiMembers) : PartialTypeFilterBase(omitNonApiMembers)
public override bool AllowImport(TypeDefinition type, MetadataReader reader)
{
public override bool AllowImport(TypeDefinition type, MetadataReader reader)
{
if (!base.AllowImport(type, reader)) return false;
if (!omitNonApiMembers) return true;
if (!base.AllowImport(type, reader)) return false;
if (!OmitNonApiMembers) return true;

switch (type.Attributes & TypeAttributes.VisibilityMask)
{
case TypeAttributes.NotPublic:
return !AttributeCache.HasAttribute(reader, type.GetCustomAttributes(), FullNames.CompilerGenerated);
case TypeAttributes.Public:
return true;
case TypeAttributes.NestedPublic:
case TypeAttributes.NestedAssembly:
case TypeAttributes.NestedFamORAssem:
return AllowImport(reader.GetTypeDefinition(type.GetDeclaringType()), reader);
case TypeAttributes.NestedFamily:
case TypeAttributes.NestedFamANDAssem:
var declaringType = reader.GetTypeDefinition(type.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0 && AllowImport(declaringType, reader);
default:
return false;
}
switch (type.Attributes & TypeAttributes.VisibilityMask)
{
case TypeAttributes.NotPublic:
return !AttributeCache.HasAttribute(reader, type.GetCustomAttributes(), FullNames.CompilerGenerated);
case TypeAttributes.Public:
return true;
case TypeAttributes.NestedPublic:
case TypeAttributes.NestedAssembly:
case TypeAttributes.NestedFamORAssem:
return AllowImport(reader.GetTypeDefinition(type.GetDeclaringType()), reader);
case TypeAttributes.NestedFamily:
case TypeAttributes.NestedFamANDAssem:
var declaringType = reader.GetTypeDefinition(type.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0 && AllowImport(declaringType, reader);
default:
return false;
}
}

public override bool AllowImport( MethodDefinition method, MetadataReader reader )
public override bool AllowImport( MethodDefinition method, MetadataReader reader )
{
switch (method.Attributes & MethodAttributes.MemberAccessMask)
{
switch (method.Attributes & MethodAttributes.MemberAccessMask)
{
case MethodAttributes.Assembly:
if ((method.Attributes & MethodAttributes.SpecialName) != 0)
return true;
return !AttributeCache.HasAttribute(reader, method, FullNames.CompilerGenerated);

case MethodAttributes.Public:
case MethodAttributes.FamORAssem:
case MethodAttributes.Assembly:
if ((method.Attributes & MethodAttributes.SpecialName) != 0)
return true;
case MethodAttributes.Family:
case MethodAttributes.FamANDAssem:
var declaringType = reader.GetTypeDefinition(method.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
return !AttributeCache.HasAttribute(reader, method, FullNames.CompilerGenerated);

case MethodAttributes.Public:
case MethodAttributes.FamORAssem:
return true;
case MethodAttributes.Family:
case MethodAttributes.FamANDAssem:
var declaringType = reader.GetTypeDefinition(method.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
}

public override bool AllowImport( FieldDefinition field, MetadataReader reader )
public override bool AllowImport( FieldDefinition field, MetadataReader reader )
{
switch (field.Attributes & FieldAttributes.FieldAccessMask)
{
switch (field.Attributes & FieldAttributes.FieldAccessMask)
{
case FieldAttributes.Assembly:
return !AttributeCache.HasAttribute(reader, field, FullNames.CompilerGenerated);
case FieldAttributes.Public:
case FieldAttributes.FamORAssem:
return true;
case FieldAttributes.Family:
case FieldAttributes.FamANDAssem:
var declaringType = reader.GetTypeDefinition(field.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
}
}
case FieldAttributes.Assembly:
return !AttributeCache.HasAttribute(reader, field, FullNames.CompilerGenerated);
case FieldAttributes.Public:
case FieldAttributes.FamORAssem:
return true;
case FieldAttributes.Family:
case FieldAttributes.FamANDAssem:
var declaringType = reader.GetTypeDefinition(field.GetDeclaringType());
return (declaringType.Attributes & TypeAttributes.Sealed) == 0;
default:
return false;
}
}
}
67 changes: 33 additions & 34 deletions src/Refasmer/Filters/CachedAttributeChecker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,52 @@
using System.Linq;
using System.Reflection.Metadata;

namespace JetBrains.Refasmer.Filters
namespace JetBrains.Refasmer.Filters;

public class CachedAttributeChecker
{
public class CachedAttributeChecker
{
private readonly Dictionary<string, HashSet<EntityHandle>> _attributeConstructors = new();
private readonly Dictionary<string, HashSet<EntityHandle>> _attributeConstructors = new();

public bool HasAttribute( MetadataReader reader, TypeDefinitionHandle typeHandle, string attributeFullName ) =>
HasAttribute(reader, reader.GetTypeDefinition(typeHandle), attributeFullName);
public bool HasAttribute( MetadataReader reader, TypeDefinitionHandle typeHandle, string attributeFullName ) =>
HasAttribute(reader, reader.GetTypeDefinition(typeHandle), attributeFullName);

public bool HasAttribute( MetadataReader reader, TypeDefinition type, string attributeFullName ) =>
HasAttribute(reader, type.GetCustomAttributes(), attributeFullName);
public bool HasAttribute( MetadataReader reader, TypeDefinition type, string attributeFullName ) =>
HasAttribute(reader, type.GetCustomAttributes(), attributeFullName);

public bool HasAttribute( MetadataReader reader, MethodDefinitionHandle typeHandle, string attributeFullName ) =>
HasAttribute(reader, reader.GetMethodDefinition(typeHandle), attributeFullName);
public bool HasAttribute( MetadataReader reader, MethodDefinitionHandle typeHandle, string attributeFullName ) =>
HasAttribute(reader, reader.GetMethodDefinition(typeHandle), attributeFullName);

public bool HasAttribute( MetadataReader reader, MethodDefinition type, string attributeFullName ) =>
HasAttribute(reader, type.GetCustomAttributes(), attributeFullName);
public bool HasAttribute( MetadataReader reader, MethodDefinition type, string attributeFullName ) =>
HasAttribute(reader, type.GetCustomAttributes(), attributeFullName);

public bool HasAttribute( MetadataReader reader, FieldDefinitionHandle typeHandle, string attributeFullName ) =>
HasAttribute(reader, reader.GetFieldDefinition(typeHandle), attributeFullName);
public bool HasAttribute( MetadataReader reader, FieldDefinitionHandle typeHandle, string attributeFullName ) =>
HasAttribute(reader, reader.GetFieldDefinition(typeHandle), attributeFullName);

public bool HasAttribute( MetadataReader reader, FieldDefinition type, string attributeFullName ) =>
HasAttribute(reader, type.GetCustomAttributes(), attributeFullName);
public bool HasAttribute( MetadataReader reader, FieldDefinition type, string attributeFullName ) =>
HasAttribute(reader, type.GetCustomAttributes(), attributeFullName);

public bool HasAttribute( MetadataReader reader, CustomAttributeHandleCollection attrHandles, string attributeFullName )
public bool HasAttribute( MetadataReader reader, CustomAttributeHandleCollection attrHandles, string attributeFullName )
{
if (!_attributeConstructors.TryGetValue(attributeFullName, out var constructorSet))
{
if (!_attributeConstructors.TryGetValue(attributeFullName, out var constructorSet))
{
constructorSet = new HashSet<EntityHandle>();
_attributeConstructors[attributeFullName] = constructorSet;
}
constructorSet = new HashSet<EntityHandle>();
_attributeConstructors[attributeFullName] = constructorSet;
}

var attrs = attrHandles.Select(reader.GetCustomAttribute).ToList();
var attrs = attrHandles.Select(reader.GetCustomAttribute).ToList();

if (attrs.Any(attr => constructorSet.Contains(attr.Constructor)))
return true;
if (attrs.Any(attr => constructorSet.Contains(attr.Constructor)))
return true;

var compilerGeneratedAttr = attrs
.Where(attr => reader.GetFullname(reader.GetCustomAttrClass(attr)) == attributeFullName)
.Select(attr => (CustomAttribute?) attr)
.FirstOrDefault();
var compilerGeneratedAttr = attrs
.Where(attr => reader.GetFullname(reader.GetCustomAttrClass(attr)) == attributeFullName)
.Select(attr => (CustomAttribute?) attr)
.FirstOrDefault();

if (compilerGeneratedAttr == null)
return false;
if (compilerGeneratedAttr == null)
return false;

constructorSet.Add(compilerGeneratedAttr.Value.Constructor);
return true;
}
constructorSet.Add(compilerGeneratedAttr.Value.Constructor);
return true;
}
}
15 changes: 7 additions & 8 deletions src/Refasmer/Filters/IImportFilter.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using System.Reflection.Metadata;

namespace JetBrains.Refasmer.Filters
namespace JetBrains.Refasmer.Filters;

public interface IImportFilter
{
public interface IImportFilter
{
public bool OmitNonApiMembers { get; }
public bool OmitNonApiMembers { get; }

bool AllowImport(TypeDefinition type, MetadataReader reader);
bool AllowImport( MethodDefinition method, MetadataReader reader );
bool AllowImport( FieldDefinition field, MetadataReader reader );
}
bool AllowImport(TypeDefinition type, MetadataReader reader);
bool AllowImport( MethodDefinition method, MetadataReader reader );
bool AllowImport( FieldDefinition field, MetadataReader reader );
}
Loading
Loading