public IEnumerable <SemverRuleResult> Inspect(ApiMemberInfo prior, ApiMemberInfo current)
        {
            if (prior == null || current == null)
            {
                yield break;
            }

            if (!(prior is ApiEventInfo priorEvent) || !(current is ApiEventInfo currentEvent))
            {
                yield break;
            }

            if (!priorEvent.GetModifiers().SequenceEqual(currentEvent.GetModifiers()))
            {
                yield return(new SemverRuleResult("Modifiers changed", "The modifiers of this event were changed", SemverChangeType.Major));
            }

            var priorTypeDetail   = priorEvent.GetEventType();
            var currentTypeDetail = currentEvent.GetEventType();

            if (priorTypeDetail.Type.Name != currentTypeDetail.Type.Name)
            {
                yield return(new SemverRuleResult("Type changed", "The type of this event was changed", SemverChangeType.Major));
            }
            else if (priorTypeDetail.ReferenceNullabilityHash != currentTypeDetail.ReferenceNullabilityHash)
            {
                yield return(new SemverRuleResult($"Nullability changed", "The reference nullability of this event was changed", SemverChangeType.Patch));
            }
        }
예제 #2
0
 public IEnumerable <SemverRuleResult> Inspect(ApiMemberInfo prior, ApiMemberInfo current)
 {
     if (prior == null && current != null)
     {
         yield return(newMemberResult);
     }
 }
 public IEnumerable <SemverRuleResult> Inspect(ApiMemberInfo prior, ApiMemberInfo current)
 {
     if (current == null && prior != null)
     {
         yield return(removedResult);
     }
 }
예제 #4
0
 public IEnumerable <SemverRuleResult> InspectRules(ApiMemberInfo prior, ApiMemberInfo current)
 {
     foreach (var rule in Rules)
     {
         foreach (var ruleResult in rule.Inspect(prior, current))
         {
             yield return(ruleResult);
         }
     }
 }
예제 #5
0
        public static ApiMemberInfo Describe(this ResolvedMethod src)
        {
            var dst  = new ApiMemberInfo();
            var msil = ClrDynamic.msil(src.EntryPoint, src.Uri, src.Method);

            dst.EntryPoint = src.EntryPoint;
            dst.ApiKind    = src.Method.KindId();
            dst.CliSig     = msil.CliSig;
            dst.DisplaySig = src.Method.DisplaySig().Format();
            dst.Token      = msil.Token;
            dst.Uri        = src.Uri.Format();
            dst.MsilCode   = msil.Code;
            return(dst);
        }
        public IEnumerable <SemverRuleResult> Inspect(ApiMemberInfo prior, ApiMemberInfo current)
        {
            if (prior == null || current == null)
            {
                yield break;
            }

            if (!(prior is ApiPropertyInfo priorProperty) || !(current is ApiPropertyInfo currentProperty))
            {
                yield break;
            }

            if (priorProperty.HasGetter && !currentProperty.HasGetter)
            {
                yield return(new SemverRuleResult("Getter removed", "The get accessor was removed from this property", SemverChangeType.Major));
            }
            else if (currentProperty.HasGetter && !priorProperty.HasGetter)
            {
                yield return(new SemverRuleResult("Getter added", "A get accessor was added to this property", SemverChangeType.Minor));
            }

            if (priorProperty.HasSetter && !currentProperty.HasSetter)
            {
                yield return(new SemverRuleResult("Setter removed", "The set accessor was removed from this property", SemverChangeType.Major));
            }
            else if (currentProperty.HasSetter && !priorProperty.HasSetter)
            {
                yield return(new SemverRuleResult("Setter added", "A set accessor was added to this property", SemverChangeType.Minor));
            }

            if (!priorProperty.GetModifiers().SequenceEqual(currentProperty.GetModifiers()))
            {
                yield return(new SemverRuleResult("Modifiers changed", "The modifiers of this property were changed", SemverChangeType.Major));
            }

            var priorTypeDetail   = priorProperty.GetPropertyType();
            var currentTypeDetail = currentProperty.GetPropertyType();

            if (priorTypeDetail.Type.Name != currentTypeDetail.Type.Name)
            {
                yield return(new SemverRuleResult("Type changed", "The type of this property was changed", SemverChangeType.Major));
            }
            else if (priorTypeDetail.ReferenceNullabilityHash != currentTypeDetail.ReferenceNullabilityHash)
            {
                yield return(new SemverRuleResult($"Nullability changed", "The reference nullability of this property was changed", SemverChangeType.Patch));
            }
        }
예제 #7
0
        public IEnumerable <SemverRuleResult> Inspect(ApiMemberInfo prior, ApiMemberInfo current)
        {
            if (prior == null || current == null)
            {
                yield break;
            }

            if (!(prior is ApiConstructorInfo priorConstructor) || !(current is ApiConstructorInfo currentConstructor))
            {
                yield break;
            }

            var modifiersEqual = priorConstructor.GetModifiers().SequenceEqual(currentConstructor.GetModifiers());

            if (!modifiersEqual)
            {
                yield return(new SemverRuleResult("Modifiers changed", "The modifiers of this constructor changed", SemverChangeType.Major));
            }

            var priorParams   = priorConstructor.GetParameters();
            var currentParams = currentConstructor.GetParameters();

            if (priorParams.Count() > currentParams.Count())
            {
                yield return(new SemverRuleResult("Parameters removed", "Parameters were removed from this constructor.", SemverChangeType.Major));
            }
            else if (priorParams.Count() < currentParams.Count())
            {
                yield return(new SemverRuleResult("Parameters added", "New parameters were added to this constructor.", SemverChangeType.Major));
            }
            else
            {
                var counter = 0;
                foreach (var(param1, param2) in priorParams.Zip(currentParams))
                {
                    counter++;
                    if (param1.Type.Name != param2.Type.Name)
                    {
                        yield return(new SemverRuleResult($"Parameter {counter} type changed", $"The type of parameter {counter} was changed.", SemverChangeType.Major));
                    }
                    else if (param1.HasDefaultValue && !param2.HasDefaultValue)
                    {
                        yield return(new SemverRuleResult($"Parameter {counter} is no longer optional", $"Parameter {counter} was changed to no longer have a default value.", SemverChangeType.Major));
                    }
                    else if (!param1.HasDefaultValue && param2.HasDefaultValue)
                    {
                        yield return(new SemverRuleResult($"Parameter {counter} is now optional", $"Parameter {counter} was changed to be optional.", SemverChangeType.Minor));
                    }
                    else if (param1.DefaultValue != param2.DefaultValue)
                    {
                        yield return(new SemverRuleResult($"Parameter {counter} default value changed", $"The default value of parameter {counter} was changed.", SemverChangeType.Minor));
                    }
                    else if (param1.ReferenceNullabilityHash != param2.ReferenceNullabilityHash)
                    {
                        yield return(new SemverRuleResult($"Parameter {counter} nullability changed", $"The reference nullability of parameter {counter} was changed.", SemverChangeType.Patch));
                    }
                    else if (param1.Name != param2.Name)
                    {
                        yield return(new SemverRuleResult($"Parameter {counter} name changed", $"The name of parameter {counter} was changed.", SemverChangeType.Minor));
                    }
                }
            }
        }
예제 #8
0
        public IEnumerable <SemverRuleResult> Inspect(ApiMemberInfo prior, ApiMemberInfo current)
        {
            if (prior == null || current == null)
            {
                yield break;
            }

            if (!(prior is ApiTypeInfo priorType) || !(current is ApiTypeInfo currentType))
            {
                yield break;
            }

            var modifiersEqual = priorType.GetModifiers().SequenceEqual(currentType.GetModifiers());

            if (!modifiersEqual)
            {
                yield return(new SemverRuleResult("Modifiers changed", "The modifiers of this type were changed", SemverChangeType.Major));
            }

            if (!priorType.GetInterfaces().SequenceEqual(currentType.GetInterfaces()))
            {
                if (modifiersEqual && currentType.GetModifiers().Contains("sealed"))
                {
                    yield return(new SemverRuleResult("Interfaces changed on a sealed class", "The implemented interfaces of this sealed type were changed", SemverChangeType.Patch));
                }
                else
                {
                    yield return(new SemverRuleResult("Interfaces changed", "The implemented interfaces of this type were changed", SemverChangeType.Major));
                }
            }

            if (!priorType.GetBaseType()?.Equals(currentType.GetBaseType()) ?? false)
            {
                yield return(new SemverRuleResult("Base type changed", "The base type for this derived type was changed.", SemverChangeType.Major));
            }

            var priorArgs   = priorType.GetGenericArgs();
            var currentArgs = currentType.GetGenericArgs();

            if (priorArgs.Count() > currentArgs.Count())
            {
                yield return(new SemverRuleResult("Generic arguments removed", "Generic arguments were removed from this type.", SemverChangeType.Major));
            }
            else if (priorArgs.Count() < currentArgs.Count())
            {
                yield return(new SemverRuleResult("Parameters added", "Generic arguments were added to this type.", SemverChangeType.Major));
            }
            else
            {
                var counter = 0;
                foreach (var(param1, param2) in priorArgs.Zip(currentArgs))
                {
                    counter++;
                    if (param1.Type.Name != param2.Type.Name)
                    {
                        yield return(new SemverRuleResult($"Generic argument {counter} type changed", $"The type of argument {counter} was changed.", SemverChangeType.Major));
                    }
                    else if (param1.ReferenceNullabilityHash != param2.ReferenceNullabilityHash)
                    {
                        yield return(new SemverRuleResult($"Generic argument {counter} nullability changed", $"The reference nullability of argument {counter} was changed.", SemverChangeType.Patch));
                    }
                }
            }

            var priorConstraints   = priorType.GetConstraints();
            var currentConstraints = currentType.GetConstraints();

            if (!priorConstraints.SequenceEqual(currentConstraints))
            {
                yield return(new SemverRuleResult("Constraints changed", "The generic argument constraints for this type were changed", SemverChangeType.Major));
            }
        }