void CheckContstraints(IMethod omethod, ITypeParameter p1, ITypeParameter p2, ref AbiCompatibility compatibility) { if (p1.DirectBaseTypes.Count () != p2.DirectBaseTypes.Count () || p1.HasReferenceTypeConstraint != p2.HasReferenceTypeConstraint || p1.HasValueTypeConstraint != p2.HasValueTypeConstraint || p1.HasDefaultConstructorConstraint != p2.HasDefaultConstructorConstraint) { OnIncompatibilityFound (new AbiEventArgs (string.Format (TranslateString ("Type parameter constraints of method {0} have changed."), omethod.FullName))); compatibility = AbiCompatibility.Incompatible; } }
void CheckContstraints(IType otype, ITypeParameter p1, ITypeParameter p2, ref AbiCompatibility compatibility) { if (p1.DirectBaseTypes.Count() != p2.DirectBaseTypes.Count() || p1.HasReferenceTypeConstraint != p2.HasReferenceTypeConstraint || p1.HasValueTypeConstraint != p2.HasValueTypeConstraint || p1.HasDefaultConstructorConstraint != p2.HasDefaultConstructorConstraint) { OnIncompatibilityFound(new AbiEventArgs(string.Format(TranslateString("Type parameter constraints of type {0} have changed."), otype.FullName))); compatibility = AbiCompatibility.Incompatible; } }
/// <summary> /// Check the specified oldProject and newProject if they're compatible. /// </summary> /// <param name="oldProject">Old project.</param> /// <param name="newProject">New project.</param> public AbiCompatibility Check(ICompilation oldProject, ICompilation newProject) { var oldStack = new Stack <INamespace> (); var newStack = new Stack <INamespace> (); oldStack.Push(oldProject.MainAssembly.RootNamespace); newStack.Push(newProject.MainAssembly.RootNamespace); AbiCompatibility compatibility = AbiCompatibility.Equal; while (oldStack.Count > 0) { var oNs = oldStack.Pop(); var nNs = newStack.Pop(); CheckNamespace(oNs, nNs, ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) { return(AbiCompatibility.Incompatible); } foreach (var child in oNs.ChildNamespaces) { var newChild = nNs.GetChildNamespace(child.Name); if (newChild == null) { OnIncompatibilityFound(new AbiEventArgs(string.Format(TranslateString("Namespace {0} is missing."), child.FullName))); if (StopOnIncompatibility) { return(AbiCompatibility.Incompatible); } continue; } oldStack.Push(child); newStack.Push(newChild); } // check if namespaces are added if (compatibility != AbiCompatibility.Bigger) { foreach (var child in nNs.ChildNamespaces) { if (oNs.GetChildNamespace(child.Name) == null) { if (compatibility == AbiCompatibility.Equal && ContainsPublicTypes(child)) { compatibility = AbiCompatibility.Bigger; } break; } } } } return(compatibility); }
void CheckNamespace(INamespace oNs, INamespace nNs, ref AbiCompatibility compatibility) { foreach (var type in oNs.Types) { if (!type.IsPublic && !type.IsProtected) { continue; } var newType = nNs.GetTypeDefinition(type.Name, type.TypeParameterCount); if (newType == null) { OnIncompatibilityFound(new AbiEventArgs(string.Format(TranslateString("Type definition {0} is missing."), type.FullName))); compatibility = AbiCompatibility.Incompatible; if (StopOnIncompatibility) { return; } continue; } CheckTypes(type, newType, ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) { return; } } if (compatibility == AbiCompatibility.Bigger) { return; } foreach (var type in nNs.Types) { if (!type.IsPublic && !type.IsProtected) { continue; } if (oNs.GetTypeDefinition(type.Name, type.TypeParameterCount) == null) { if (compatibility == AbiCompatibility.Equal) { compatibility = AbiCompatibility.Bigger; } return; } } }
void CheckTypes(ITypeDefinition oType, ITypeDefinition nType, ref AbiCompatibility compatibility) { int oldMemberCount = 0; Predicate <IUnresolvedMember> pred = null; if (oType.Kind == TypeKind.Class || oType.Kind == TypeKind.Struct) { pred = m => (m.IsPublic || m.IsProtected) && !m.IsOverride && !m.IsSynthetic; } for (int i = 0; i < oType.TypeParameterCount; i++) { CheckContstraints(oType, oType.TypeParameters[i], nType.TypeParameters[i], ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) { return; } } foreach (var member in oType.GetMembers(pred, GetMemberOptions.IgnoreInheritedMembers)) { var newMember = nType.GetMembers(m => member.UnresolvedMember.Name == m.Name && m.IsPublic == member.IsPublic && m.IsProtected == member.IsProtected); var equalMember = newMember.FirstOrDefault(m => SignatureComparer.Ordinal.Equals(member, m)); if (equalMember == null) { compatibility = AbiCompatibility.Incompatible; if (StopOnIncompatibility) { return; } continue; } var om = member as IMethod; if (om != null) { for (int i = 0; i < om.TypeParameters.Count; i++) { CheckContstraints(om, om.TypeParameters[i], ((IMethod)equalMember).TypeParameters[i], ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) { return; } } } oldMemberCount++; } if (compatibility == AbiCompatibility.Bigger && oType.Kind != TypeKind.Interface) { return; } if (oldMemberCount != nType.GetMembers(pred, GetMemberOptions.IgnoreInheritedMembers).Count()) { if (oType.Kind == TypeKind.Interface) { OnIncompatibilityFound(new AbiEventArgs(string.Format(TranslateString("Interafce {0} has changed."), oType.FullName))); compatibility = AbiCompatibility.Incompatible; } else { if (compatibility == AbiCompatibility.Equal) { compatibility = AbiCompatibility.Bigger; } } } }
void CheckTypes(ITypeDefinition oType, ITypeDefinition nType, ref AbiCompatibility compatibility) { int oldMemberCount = 0; Predicate<IUnresolvedMember> pred = null; if (oType.Kind == TypeKind.Class || oType.Kind == TypeKind.Struct) pred = m => (m.IsPublic || m.IsProtected) && !m.IsOverride && !m.IsSynthetic; for (int i = 0; i < oType.TypeParameterCount; i++) { CheckContstraints (oType, oType.TypeParameters[i], nType.TypeParameters[i], ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) return; } foreach (var member in oType.GetMembers (pred, GetMemberOptions.IgnoreInheritedMembers)) { var newMember = nType.GetMembers (m => member.UnresolvedMember.Name == m.Name && m.IsPublic == member.IsPublic && m.IsProtected == member.IsProtected); var equalMember = newMember.FirstOrDefault (m => SignatureComparer.Ordinal.Equals (member, m)); if (equalMember == null) { compatibility = AbiCompatibility.Incompatible; if (StopOnIncompatibility) return; continue; } var om = member as IMethod; if (om != null) { for (int i = 0; i < om.TypeParameters.Count; i++) { CheckContstraints (om, om.TypeParameters[i], ((IMethod)equalMember).TypeParameters[i], ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) return; } } oldMemberCount++; } if (compatibility == AbiCompatibility.Bigger && oType.Kind != TypeKind.Interface) return; if (oldMemberCount != nType.GetMembers (pred, GetMemberOptions.IgnoreInheritedMembers).Count ()) { if (oType.Kind == TypeKind.Interface) { OnIncompatibilityFound (new AbiEventArgs (string.Format (TranslateString ("Interafce {0} has changed."), oType.FullName))); compatibility = AbiCompatibility.Incompatible; } else { if (compatibility == AbiCompatibility.Equal) compatibility = AbiCompatibility.Bigger; } } }
void CheckNamespace(INamespace oNs, INamespace nNs, ref AbiCompatibility compatibility) { foreach (var type in oNs.Types) { if (!type.IsPublic && !type.IsProtected) continue; var newType = nNs.GetTypeDefinition (type.Name, type.TypeParameterCount); if (newType == null) { OnIncompatibilityFound (new AbiEventArgs (string.Format (TranslateString ("Type definition {0} is missing."), type.FullName))); compatibility = AbiCompatibility.Incompatible; if (StopOnIncompatibility) return; continue; } CheckTypes (type, newType, ref compatibility); if (compatibility == AbiCompatibility.Incompatible && StopOnIncompatibility) return; } if (compatibility == AbiCompatibility.Bigger) return; foreach (var type in nNs.Types) { if (!type.IsPublic && !type.IsProtected) continue; if (oNs.GetTypeDefinition (type.Name, type.TypeParameterCount) == null) { if (compatibility == AbiCompatibility.Equal) compatibility = AbiCompatibility.Bigger; return; } } }