Browse Source

GetHashCode and Equals for expressions

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2873 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 19 years ago
parent
commit
6132afa4f8
  1. 20
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/SimpleIdentifierExpression.cs
  2. 21
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/SimpleMemberReferenceExpression.cs
  3. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ArrayIndexerExpression.cs
  4. 14
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/EmptyExpression.cs
  5. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/LocalVariableIdentifierExpression.cs
  6. 25
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/MemberReferenceExpression.cs
  7. 25
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ParameterIdentifierExpression.cs
  8. 20
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/PrimitiveExpression.cs
  9. 14
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ThisReferenceExpression.cs
  10. 26
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Expression.cs

20
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/SimpleIdentifierExpression.cs

@ -48,5 +48,25 @@ namespace Debugger.Expressions @@ -48,5 +48,25 @@ namespace Debugger.Expressions
throw new GetValueException("Identifier " + identifier + " not found");
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (identifier != null) hashCode += 1000000007 * identifier.GetHashCode();
}
return hashCode;
}
public override bool Equals(object obj)
{
SimpleIdentifierExpression other = obj as SimpleIdentifierExpression;
if (other == null) return false;
return this.identifier == other.identifier;
}
#region
}
}

21
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Expressions/SimpleMemberReferenceExpression.cs

@ -40,5 +40,26 @@ namespace Debugger.Expressions @@ -40,5 +40,26 @@ namespace Debugger.Expressions
Value targetValue = targetObject.Evaluate(context);
return targetValue.GetMemberValue(member);
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (targetObject != null) hashCode += 1000000007 * targetObject.GetHashCode();
if (member != null) hashCode += 1000000009 * member.GetHashCode();
}
return hashCode;
}
public override bool Equals(object obj)
{
SimpleMemberReferenceExpression other = obj as SimpleMemberReferenceExpression;
if (other == null) return false;
return object.Equals(this.targetObject, other.targetObject) && this.member == other.member;
}
#endregion
}
}

23
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ArrayIndexerExpression.cs

@ -92,5 +92,28 @@ namespace Debugger.Expressions @@ -92,5 +92,28 @@ namespace Debugger.Expressions
return targetValue.GetArrayElement(indicies.ToArray());
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (targetObject != null) hashCode += 1000000007 * targetObject.GetHashCode();
if (arguments != null) hashCode += 1000000009 * GetArrayHashCode(arguments);
}
return hashCode;
}
public override bool Equals(object obj)
{
ArrayIndexerExpression other = obj as ArrayIndexerExpression;
if (other == null) return false;
return
object.Equals(this.targetObject, other.targetObject) &&
ArrayEquals(this.arguments, other.arguments);
}
#endregion
}
}

14
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/EmptyExpression.cs

@ -25,5 +25,19 @@ namespace Debugger.Expressions @@ -25,5 +25,19 @@ namespace Debugger.Expressions
{
throw new GetValueException("Empty expression");
}
#region GetHashCode and Equals
public override int GetHashCode()
{
return typeof(EmptyExpression).GetHashCode();
}
public override bool Equals(object obj)
{
return obj is EmptyExpression;
}
#endregion
}
}

23
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/LocalVariableIdentifierExpression.cs

@ -51,5 +51,28 @@ namespace Debugger.Expressions @@ -51,5 +51,28 @@ namespace Debugger.Expressions
return context.GetLocalVariableValue(symVar);
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (method != null) hashCode += 1000000007 * method.GetHashCode();
if (symVar != null) hashCode += 1000000009 * symVar.AddressField1.GetHashCode();
}
return hashCode;
}
public override bool Equals(object obj)
{
LocalVariableIdentifierExpression other = obj as LocalVariableIdentifierExpression;
if (other == null) return false;
return
object.Equals(this.method, other.method) &&
object.Equals(this.symVar.AddressField1, other.symVar.AddressField1);
}
#endregion
}
}

25
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/MemberReferenceExpression.cs

@ -102,5 +102,30 @@ namespace Debugger.Expressions @@ -102,5 +102,30 @@ namespace Debugger.Expressions
return Value.GetMemberValue(targetValue, memberInfo, argumentValues.ToArray());
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (targetObject != null) hashCode += 1000000007 * targetObject.GetHashCode();
if (memberInfo != null) hashCode += 1000000009 * memberInfo.GetHashCode();
if (arguments != null) hashCode += 1000000021 * GetArrayHashCode(arguments);
}
return hashCode;
}
public override bool Equals(object obj)
{
MemberReferenceExpression other = obj as MemberReferenceExpression;
if (other == null) return false;
return
object.Equals(this.targetObject, other.targetObject) &&
object.Equals(this.memberInfo, other.memberInfo) &&
ArrayEquals(this.arguments, other.arguments);
}
#endregion
}
}

25
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ParameterIdentifierExpression.cs

@ -54,5 +54,30 @@ namespace Debugger.Expressions @@ -54,5 +54,30 @@ namespace Debugger.Expressions
return context.GetArgumentValue(index);
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (method != null) hashCode += 1000000007 * method.GetHashCode();
hashCode += 1000000009 * index.GetHashCode();
if (name != null) hashCode += 1000000021 * name.GetHashCode();
}
return hashCode;
}
public override bool Equals(object obj)
{
ParameterIdentifierExpression other = obj as ParameterIdentifierExpression;
if (other == null) return false;
return
object.Equals(this.method, other.method) &&
this.index == other.index &&
this.name == other.name;
}
#endregion
}
}

20
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/PrimitiveExpression.cs

@ -40,5 +40,25 @@ namespace Debugger.Expressions @@ -40,5 +40,25 @@ namespace Debugger.Expressions
// TODO: Need for literal method arguments. Use Eval to create value.
throw new NotImplementedException();
}
#region GetHashCode and Equals
public override int GetHashCode()
{
int hashCode = 0;
unchecked {
if (value != null) hashCode += 1000000007 * value.GetHashCode();
}
return hashCode;
}
public override bool Equals(object obj)
{
PrimitiveExpression other = obj as PrimitiveExpression;
if (other == null) return false;
return object.Equals(this.value, other.value);
}
#endregion
}
}

14
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ThisReferenceExpression.cs

@ -24,5 +24,19 @@ namespace Debugger.Expressions @@ -24,5 +24,19 @@ namespace Debugger.Expressions
{
return context.GetThisValue();
}
#region GetHashCode and Equals
public override int GetHashCode()
{
return typeof(ThisReferenceExpression).GetHashCode();
}
public override bool Equals(object obj)
{
return obj is EmptyExpression;
}
#endregion
}
}

26
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Expression.cs

@ -51,5 +51,31 @@ namespace Debugger.Expressions @@ -51,5 +51,31 @@ namespace Debugger.Expressions
}
protected abstract Value EvaluateInternal(StackFrame context);
protected static int GetArrayHashCode<T>(T[] array)
{
int hashCode = 0;
unchecked {
if (array != null) {
foreach(T element in array) {
hashCode += element.GetHashCode();
}
}
}
return hashCode;
}
protected static bool ArrayEquals<T>(T[] a, T[] b)
{
if (a == null && b == null) return true;
if (a != null && b == null) return false;
if (a == null && b != null) return false;
// Both not null
if (a.Length != b.Length) return false;
for(int i = 0; i < a.Length; i++) {
if (!a[i].Equals(b[i])) return false;
}
return true;
}
}
}

Loading…
Cancel
Save