Skip to content

Commit

Permalink
Merge pull request #101 from brandhuf/feature-expose-static
Browse files Browse the repository at this point in the history
Expose IsStatic property on members
  • Loading branch information
fgather authored Aug 25, 2021
2 parents f80e6a3 + 0c8140a commit 0b0c955
Show file tree
Hide file tree
Showing 15 changed files with 107 additions and 13 deletions.
6 changes: 4 additions & 2 deletions ArchUnitNET/Domain/FieldMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@ public class FieldMember : IMember, ITypeInstance<IType>
private readonly ITypeInstance<IType> _typeInstance;

public FieldMember(IType declaringType, string name, string fullName, Visibility visibility,
ITypeInstance<IType> typeInstance, bool isCompilerGenerated)
ITypeInstance<IType> typeInstance, bool isCompilerGenerated, bool? isStatic)
{
DeclaringType = declaringType;
Name = name;
FullName = fullName;
Visibility = visibility;
IsCompilerGenerated = isCompilerGenerated;
_typeInstance = typeInstance;
IsStatic = isStatic;
}

public Visibility Visibility { get; }
Expand All @@ -32,10 +33,11 @@ public FieldMember(IType declaringType, string name, string fullName, Visibility
public string FullName { get; }

public bool IsCompilerGenerated { get; }
public bool? IsStatic { get; }
public bool IsGeneric => false;
public List<GenericParameter> GenericParameters => new List<GenericParameter>();
public IEnumerable<Attribute> Attributes => AttributeInstances.Select(instance => instance.Type);
public List<AttributeInstance> AttributeInstances { get; } = new List<AttributeInstance>();
public List<AttributeInstance> AttributeInstances { get; } = new List<AttributeInstance>();
public List<IMemberTypeDependency> MemberDependencies { get; } = new List<IMemberTypeDependency>();
public List<IMemberTypeDependency> MemberBackwardsDependencies { get; } = new List<IMemberTypeDependency>();
public List<ITypeDependency> Dependencies => MemberDependencies.Cast<ITypeDependency>().ToList();
Expand Down
1 change: 1 addition & 0 deletions ArchUnitNET/Domain/IMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ public interface IMember : ICanBeAnalyzed
IType DeclaringType { get; }
List<IMemberTypeDependency> MemberDependencies { get; }
List<IMemberTypeDependency> MemberBackwardsDependencies { get; }
bool? IsStatic { get; }
}
}
6 changes: 4 additions & 2 deletions ArchUnitNET/Domain/MethodMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class MethodMember : IMember

public MethodMember(string name, string fullName, IType declaringType, Visibility visibility,
ITypeInstance<IType> returnType, bool isVirtual, MethodForm methodForm, bool isGeneric, bool isStub,
bool isCompilerGenerated, bool? isIterator)
bool isCompilerGenerated, bool? isIterator, bool? isStatic)
{
Name = name;
FullName = fullName;
Expand All @@ -29,6 +29,7 @@ public MethodMember(string name, string fullName, IType declaringType, Visibilit
IsStub = isStub;
IsCompilerGenerated = isCompilerGenerated;
IsIterator = isIterator;
IsStatic = isStatic;
}

public bool IsVirtual { get; }
Expand All @@ -41,10 +42,11 @@ public MethodMember(string name, string fullName, IType declaringType, Visibilit
public bool IsCompilerGenerated { get; }
public bool? IsIterator { get; }
public bool IsGeneric { get; }
public bool? IsStatic { get; }
public List<GenericParameter> GenericParameters { get; } = new List<GenericParameter>();
public Visibility Visibility { get; }
public IEnumerable<Attribute> Attributes => AttributeInstances.Select(instance => instance.Type);
public List<AttributeInstance> AttributeInstances { get; } = new List<AttributeInstance>();
public List<AttributeInstance> AttributeInstances { get; } = new List<AttributeInstance>();
public List<IMemberTypeDependency> MemberDependencies { get; } = new List<IMemberTypeDependency>();
public List<IMemberTypeDependency> MemberBackwardsDependencies { get; } = new List<IMemberTypeDependency>();
public List<ITypeDependency> Dependencies => MemberDependencies.Cast<ITypeDependency>().ToList();
Expand Down
6 changes: 4 additions & 2 deletions ArchUnitNET/Domain/PropertyMember.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ public class PropertyMember : IMember, ITypeInstance<IType>
private readonly ITypeInstance<IType> _typeInstance;

public PropertyMember(IType declaringType, string name, string fullName, ITypeInstance<IType> type,
bool isCompilerGenerated)
bool isCompilerGenerated, bool? isStatic)
{
Name = name;
FullName = fullName;
_typeInstance = type;
DeclaringType = declaringType;
IsCompilerGenerated = isCompilerGenerated;
PropertyTypeDependency = new PropertyTypeDependency(this);
IsStatic = isStatic;
}

public bool IsVirtual { get; internal set; }
Expand All @@ -42,14 +43,15 @@ public PropertyMember(IType declaringType, string name, string fullName, ITypeIn
public bool IsCompilerGenerated { get; }

public bool IsGeneric => false;
public bool? IsStatic { get; }
public List<GenericParameter> GenericParameters => new List<GenericParameter>();

public Visibility Visibility => GetterVisibility < SetterVisibility ? GetterVisibility : SetterVisibility;
public string Name { get; }
public string FullName { get; }
public IType DeclaringType { get; }
public IEnumerable<Attribute> Attributes => AttributeInstances.Select(instance => instance.Type);
public List<AttributeInstance> AttributeInstances { get; } = new List<AttributeInstance>();
public List<AttributeInstance> AttributeInstances { get; } = new List<AttributeInstance>();

public List<IMemberTypeDependency> MemberDependencies
{
Expand Down
12 changes: 12 additions & 0 deletions ArchUnitNET/Fluent/Syntax/Elements/Members/GivenMembersThat.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ public TGivenRuleTypeConjunction AreDeclaredIn(IEnumerable<Type> types)
return Create<TGivenRuleTypeConjunction, TRuleType>(_ruleCreator);
}

public TGivenRuleTypeConjunction AreStatic()
{
_ruleCreator.AddPredicate(MemberPredicatesDefinition<TRuleType>.AreStatic());
return Create<TGivenRuleTypeConjunction, TRuleType>(_ruleCreator);
}

//Negations


Expand Down Expand Up @@ -112,5 +118,11 @@ public TGivenRuleTypeConjunction AreNotDeclaredIn(IEnumerable<Type> types)
_ruleCreator.AddPredicate(MemberPredicatesDefinition<TRuleType>.AreNotDeclaredIn(types));
return Create<TGivenRuleTypeConjunction, TRuleType>(_ruleCreator);
}

public TGivenRuleTypeConjunction AreNotStatic()
{
_ruleCreator.AddPredicate(MemberPredicatesDefinition<TRuleType>.AreNotStatic());
return Create<TGivenRuleTypeConjunction, TRuleType>(_ruleCreator);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public interface IMemberConditions<out TReturnType, out TRuleType> : IObjectCond
TReturnType BeDeclaredIn(IObjectProvider<IType> types);
TReturnType BeDeclaredIn(IEnumerable<IType> types);
TReturnType BeDeclaredIn(IEnumerable<Type> types);
TReturnType BeStatic();


//Negations
Expand All @@ -31,5 +32,6 @@ public interface IMemberConditions<out TReturnType, out TRuleType> : IObjectCond
TReturnType NotBeDeclaredIn(IObjectProvider<IType> types);
TReturnType NotBeDeclaredIn(IEnumerable<IType> types);
TReturnType NotBeDeclaredIn(IEnumerable<Type> types);
TReturnType NotBeStatic();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public interface
TRuleTypeConjunction AreDeclaredIn(IObjectProvider<IType> types);
TRuleTypeConjunction AreDeclaredIn(IEnumerable<IType> types);
TRuleTypeConjunction AreDeclaredIn(IEnumerable<Type> types);
TRuleTypeConjunction AreStatic();

//Negations

Expand All @@ -32,5 +33,6 @@ public interface
TRuleTypeConjunction AreNotDeclaredIn(IObjectProvider<IType> types);
TRuleTypeConjunction AreNotDeclaredIn(IEnumerable<IType> types);
TRuleTypeConjunction AreNotDeclaredIn(IEnumerable<Type> types);
TRuleTypeConjunction AreNotStatic();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,12 @@ IEnumerable<ConditionResult> Condition(IEnumerable<TRuleType> methods, Architect
return new ArchitectureCondition<TRuleType>(Condition, description);
}

public static ICondition<TRuleType> BeStatic()
{
return new SimpleCondition<TRuleType>(member => !member.IsStatic.HasValue || member.IsStatic.Value,
"be static", "is not static");
}


//Relation Conditions

Expand Down Expand Up @@ -321,6 +327,12 @@ IEnumerable<ConditionResult> Condition(IEnumerable<TRuleType> methods, Architect
return new ArchitectureCondition<TRuleType>(Condition, description);
}

public static ICondition<TRuleType> NotBeStatic()
{
return new SimpleCondition<TRuleType>(member => !member.IsStatic.HasValue || !member.IsStatic.Value,
"not be static", "is static");
}


//Relation Condition Negations

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,11 @@ IEnumerable<T> Condition(IEnumerable<T> members, Architecture architecture)
return new ArchitecturePredicate<T>(Condition, description);
}

public static IPredicate<T> AreStatic()
{
return new SimplePredicate<T>(member => member.IsStatic.HasValue && member.IsStatic.Value, "are static");
}


//Negations

Expand Down Expand Up @@ -260,5 +265,11 @@ IEnumerable<T> Condition(IEnumerable<T> members, Architecture architecture)

return new ArchitecturePredicate<T>(Condition, description);
}

public static IPredicate<T> AreNotStatic()
{
return new SimplePredicate<T>(member => member.IsStatic.HasValue && !member.IsStatic.Value,
"are not static");
}
}
}
12 changes: 12 additions & 0 deletions ArchUnitNET/Fluent/Syntax/Elements/Members/MembersShould.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ public TRuleTypeShouldConjunction BeDeclaredIn(IEnumerable<Type> types)
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}

public TRuleTypeShouldConjunction BeStatic()
{
_ruleCreator.AddCondition(MemberConditionsDefinition<TRuleType>.BeStatic());
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}

//Relation Conditions

public ShouldRelateToTypesThat<TRuleTypeShouldConjunction, IType, TRuleType> BeDeclaredInTypesThat()
Expand Down Expand Up @@ -126,6 +132,12 @@ public TRuleTypeShouldConjunction NotBeDeclaredIn(IEnumerable<Type> types)
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}

public TRuleTypeShouldConjunction NotBeStatic()
{
_ruleCreator.AddCondition(MemberConditionsDefinition<TRuleType>.NotBeStatic());
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}

//Relation Condition Negations

public ShouldRelateToTypesThat<TRuleTypeShouldConjunction, IType, TRuleType> NotBeDeclaredInTypesThat()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,12 @@ public TRuleTypeShouldConjunction AreDeclaredIn(IEnumerable<Type> types)
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}

public TRuleTypeShouldConjunction AreStatic()
{
_ruleCreator.ContinueComplexCondition(MemberPredicatesDefinition<TReferenceType>.AreStatic());
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}


//Negations

Expand Down Expand Up @@ -119,5 +125,11 @@ public TRuleTypeShouldConjunction AreNotDeclaredIn(IEnumerable<Type> types)
_ruleCreator.ContinueComplexCondition(MemberPredicatesDefinition<TReferenceType>.AreNotDeclaredIn(types));
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}

public TRuleTypeShouldConjunction AreNotStatic()
{
_ruleCreator.ContinueComplexCondition(MemberPredicatesDefinition<TReferenceType>.AreNotStatic());
return Create<TRuleTypeShouldConjunction, TRuleType>(_ruleCreator);
}
}
}
6 changes: 4 additions & 2 deletions ArchUnitNET/Loader/LoadTasks/AddMembers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ private IMember CreateFieldMember([NotNull] FieldDefinition fieldDefinition)
var isCompilerGenerated = fieldDefinition.IsCompilerGenerated();

return new FieldMember(_type, fieldDefinition.Name, fieldDefinition.FullName, visibility, fieldType,
isCompilerGenerated);
isCompilerGenerated, fieldDefinition.IsStatic);
}

[NotNull]
Expand All @@ -63,9 +63,11 @@ private IMember CreatePropertyMember(PropertyDefinition propertyDefinition)
var typeReference = propertyDefinition.PropertyType;
var propertyType = _typeFactory.GetOrCreateStubTypeInstanceFromTypeReference(typeReference);
var isCompilerGenerated = propertyDefinition.IsCompilerGenerated();
var isStatic = (propertyDefinition.SetMethod != null && propertyDefinition.SetMethod.IsStatic) ||
(propertyDefinition.GetMethod != null && propertyDefinition.GetMethod.IsStatic);

return new PropertyMember(_type, propertyDefinition.Name, propertyDefinition.FullName, propertyType,
isCompilerGenerated);
isCompilerGenerated, isStatic);
}

private static Visibility GetVisibilityFromFieldDefinition([NotNull] FieldDefinition fieldDefinition)
Expand Down
14 changes: 11 additions & 3 deletions ArchUnitNET/Loader/TypeFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ private ITypeInstance<IType> CreateTypeFromTypeReference(TypeReference typeRefer
var arrayType = typeDefinition.Fields.First(field => field.Name == "FixedElementField").FieldType;
var arrayTypeInstance = GetOrCreateStubTypeInstanceFromTypeReference(arrayType);
var dimensions = new List<int> {1};

switch (arrayTypeInstance.Type)
{
case Interface intf:
Expand Down Expand Up @@ -256,6 +256,7 @@ private MethodMemberInstance CreateMethodMemberFromMethodReference(
Visibility visibility;
bool isStub;
bool? isIterator;
bool? isStatic;

MethodDefinition methodDefinition;
try
Expand All @@ -272,18 +273,20 @@ private MethodMemberInstance CreateMethodMemberFromMethodReference(
visibility = Public;
methodForm = methodReference.HasConstructorName() ? MethodForm.Constructor : MethodForm.Normal;
isIterator = null;
isStatic = null;
isStub = true;
}
else
{
visibility = methodDefinition.GetVisibility();
methodForm = methodDefinition.GetMethodForm();
isIterator = methodDefinition.IsIterator();
isStatic = methodDefinition.IsStatic;
isStub = false;
}

var methodMember = new MethodMember(name, fullName, typeInstance.Type, visibility, returnType,
false, methodForm, isGeneric, isStub, isCompilerGenerated, isIterator);
false, methodForm, isGeneric, isStub, isCompilerGenerated, isIterator, isStatic);

var parameters = methodReference.GetParameters(this).ToList();
methodMember.ParameterInstances.AddRange(parameters);
Expand All @@ -302,9 +305,14 @@ internal FieldMember CreateStubFieldMemberFromFieldReference([NotNull] IType typ
var typeReference = fieldReference.FieldType;
var fieldType = GetOrCreateStubTypeInstanceFromTypeReference(typeReference);
var isCompilerGenerated = fieldReference.IsCompilerGenerated();
bool? isStatic = null;
if (fieldReference is FieldDefinition fieldDefinition)
{
isStatic = fieldDefinition.IsStatic;
}

return new FieldMember(type, fieldReference.Name, fieldReference.FullName, Public, fieldType,
isCompilerGenerated);
isCompilerGenerated, isStatic);
}

public IEnumerable<GenericParameter> GetGenericParameters(IGenericParameterProvider genericParameterProvider)
Expand Down
4 changes: 2 additions & 2 deletions ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
using System.Reflection;
using System.Text;
using ArchUnitNET.Domain;
using ArchUnitNET.Loader;
using static ArchUnitNET.Domain.Visibility;
using Assembly = ArchUnitNET.Domain.Assembly;
using Type = ArchUnitNET.Loader.Type;
Expand Down Expand Up @@ -120,6 +119,7 @@ public static MethodMember CreateStubMethodMember(this MethodBase methodBase)
var declaringType = methodBase.DeclaringType.CreateStubClass();
var parameters = methodBase.CreateStubParameters().Select(parameter => new TypeInstance<IType>(parameter));
var methodForm = methodBase.GetStubMethodForm();
var isStatic = methodBase.IsStatic;

var isGeneric = methodBase.IsGenericMethod;

Expand All @@ -141,7 +141,7 @@ public static MethodMember CreateStubMethodMember(this MethodBase methodBase)
}

var methodMember = new MethodMember(methodBase.BuildMockMethodName(), fullName, declaringType, visibility,
returnTypeInstance, methodBase.IsVirtual, methodForm, isGeneric, false, false,false);
returnTypeInstance, methodBase.IsVirtual, methodForm, isGeneric, false, false, false, isStatic);

methodMember.ParameterInstances.AddRange(parameters);
return methodMember;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,5 +160,19 @@ public void DeclaredInTest()
Assert.True(allMembersAreNotDeclaredInEmptyTypeMultiple2.HasNoViolations(Architecture));
Assert.True(allMembersAreNotDeclaredInEmptyTypeMultiplePattern.HasNoViolations(Architecture));
}

[Fact]
public void IsStaticTest()
{
var correctIsStatic = Members().That().AreStatic().Should().BeStatic();
var correctIsStatic2 = Members().That().AreNotStatic().Should().NotBeStatic();
var wrongStatic = Members().That().AreStatic().Should().NotBeStatic();
var wrongStatic2 = Members().That().AreNotStatic().Should().BeStatic();

Assert.True(correctIsStatic.HasNoViolations(Architecture));
Assert.True(correctIsStatic2.HasNoViolations(Architecture));
Assert.False(wrongStatic.HasNoViolations(Architecture));
Assert.False(wrongStatic2.HasNoViolations(Architecture));
}
}
}

0 comments on commit 0b0c955

Please sign in to comment.