diff --git a/Tools/ANXStatusComparer/Data/ConstructorElement.cs b/Tools/ANXStatusComparer/Data/ConstructorElement.cs index 1926dfca..15d74c89 100644 --- a/Tools/ANXStatusComparer/Data/ConstructorElement.cs +++ b/Tools/ANXStatusComparer/Data/ConstructorElement.cs @@ -65,6 +65,7 @@ namespace ANXStatusComparer.Data Handle = method; } + #region IsCorrect public override bool IsCorrect(BaseObjectElement otherElement) { ConstructorElement other = otherElement as ConstructorElement; @@ -80,6 +81,78 @@ namespace ANXStatusComparer.Data isCorrect = false; } + ParameterInfo[] parameters = Handle.GetParameters(); + ParameterInfo[] otherParameters = other.Handle.GetParameters(); + if (parameters.Length != otherParameters.Length) + { + isCorrect = false; + } + else + { + for (int index = 0; index < parameters.Length; index++) + { + ParameterInfo thisParam = parameters[index]; + ParameterInfo otherParam = otherParameters[index]; + if (thisParam.IsIn != otherParam.IsIn) + { + isCorrect = false; + } + if (thisParam.IsOptional != otherParam.IsOptional) + { + isCorrect = false; + } + if (thisParam.IsOut != otherParam.IsOut) + { + isCorrect = false; + } + + #region Check custom attributes + object[] thisAttributes = thisParam.GetCustomAttributes(false); + object[] otherAttributes = otherParam.GetCustomAttributes(false); + Dictionary thisAttribDict = new Dictionary(); + Dictionary otherAttribDict = new Dictionary(); + if (thisAttributes.Length != otherAttributes.Length) + { + isCorrect = false; + } + else + { + for (int attribIndex = 0; attribIndex < thisAttributes.Length; attribIndex++) + { + Type thisType = thisAttributes[attribIndex].GetType(); + if (thisAttribDict.ContainsKey(thisType) == false) + { + thisAttribDict.Add(thisType, 0); + } + thisAttribDict[thisType]++; + + Type otherType = otherAttributes[attribIndex].GetType(); + if (otherAttribDict.ContainsKey(otherType) == false) + { + otherAttribDict.Add(otherType, 0); + } + otherAttribDict[otherType]++; + } + } + + foreach (Type thisType in thisAttribDict.Keys) + { + if (otherAttribDict.ContainsKey(thisType) == false) + { + isCorrect = false; + break; + } + + if (thisAttribDict[thisType] != otherAttribDict[thisType]) + { + isCorrect = false; + break; + } + } + #endregion + } + } + if (Handle.IsFamily != other.Handle.IsFamily) { isCorrect = false; @@ -87,12 +160,43 @@ namespace ANXStatusComparer.Data return isCorrect; } + #endregion public override string GetDescription() { - return (Handle.IsPublic ? "PUBLIC " : "") + + string result = (Handle.IsPublic ? "PUBLIC " : "") + (Handle.IsFamily ? "PROTECTED " : "") + Handle.ToString(); + + #region Add attributes + ParameterInfo[] parameters = Handle.GetParameters(); + result += " (Attributes: "; + for (int index = 0; index < parameters.Length; index++) + { + ParameterInfo thisParam = parameters[index]; + object[] attributes = thisParam.GetCustomAttributes(false); + if (attributes.Length == 0) + { + continue; + } + + result += thisParam.Position + ": "; + + foreach (object attrib in attributes) + { + result += "[" + attrib.GetType().Name + "] "; + } + + result += ", "; + } + result += ")"; + if (result.EndsWith(" (Attributes: )")) + { + result = result.Substring(0, result.Length - 14); + } + #endregion + + return result; } } } diff --git a/Tools/ANXStatusComparer/Data/MethodElement.cs b/Tools/ANXStatusComparer/Data/MethodElement.cs index af80c0d7..9692225f 100644 --- a/Tools/ANXStatusComparer/Data/MethodElement.cs +++ b/Tools/ANXStatusComparer/Data/MethodElement.cs @@ -65,6 +65,7 @@ namespace ANXStatusComparer.Data Handle = method; } + #region IsCorrect public override bool IsCorrect(BaseObjectElement otherElement) { MethodElement other = otherElement as MethodElement; @@ -80,6 +81,79 @@ namespace ANXStatusComparer.Data isCorrect = false; } + + ParameterInfo[] parameters = Handle.GetParameters(); + ParameterInfo[] otherParameters = other.Handle.GetParameters(); + if (parameters.Length != otherParameters.Length) + { + isCorrect = false; + } + else + { + for (int index = 0; index < parameters.Length; index++) + { + ParameterInfo thisParam = parameters[index]; + ParameterInfo otherParam = otherParameters[index]; + if (thisParam.IsIn != otherParam.IsIn) + { + isCorrect = false; + } + if (thisParam.IsOptional != otherParam.IsOptional) + { + isCorrect = false; + } + if (thisParam.IsOut != otherParam.IsOut) + { + isCorrect = false; + } + + #region Check custom attributes + object[] thisAttributes = thisParam.GetCustomAttributes(false); + object[] otherAttributes = otherParam.GetCustomAttributes(false); + Dictionary thisAttribDict = new Dictionary(); + Dictionary otherAttribDict = new Dictionary(); + if (thisAttributes.Length != otherAttributes.Length) + { + isCorrect = false; + } + else + { + for (int attribIndex = 0; attribIndex < thisAttributes.Length; attribIndex++) + { + Type thisType = thisAttributes[attribIndex].GetType(); + if (thisAttribDict.ContainsKey(thisType) == false) + { + thisAttribDict.Add(thisType, 0); + } + thisAttribDict[thisType]++; + + Type otherType = otherAttributes[attribIndex].GetType(); + if (otherAttribDict.ContainsKey(otherType) == false) + { + otherAttribDict.Add(otherType, 0); + } + otherAttribDict[otherType]++; + } + } + + foreach (Type thisType in thisAttribDict.Keys) + { + if (otherAttribDict.ContainsKey(thisType) == false) + { + isCorrect = false; + break; + } + + if (thisAttribDict[thisType] != otherAttribDict[thisType]) + { + isCorrect = false; + break; + } + } + #endregion + } + } + if (Handle.IsFamily != other.Handle.IsFamily) { isCorrect = false; @@ -87,12 +161,43 @@ namespace ANXStatusComparer.Data return isCorrect; } + #endregion public override string GetDescription() { - return (Handle.IsPublic ? "PUBLIC " : "") + + string result = (Handle.IsPublic ? "PUBLIC " : "") + (Handle.IsFamily ? "PROTECTED " : "") + Handle.ToString(); + + #region Add attributes + ParameterInfo[] parameters = Handle.GetParameters(); + result += " (Attributes: "; + for (int index = 0; index < parameters.Length; index++) + { + ParameterInfo thisParam = parameters[index]; + object[] attributes = thisParam.GetCustomAttributes(false); + if (attributes.Length == 0) + { + continue; + } + + result += thisParam.Position + ": "; + + foreach (object attrib in attributes) + { + result += "[" + attrib.GetType().Name + "] "; + } + + result += ", "; + } + result += ")"; + if (result.EndsWith(" (Attributes: )")) + { + result = result.Substring(0, result.Length - 14); + } + #endregion + + return result; } } }