private ExpressionSyntax BuildFieldHashCodeCall(ISymbol fieldSymbol) { ITypeSymbol fieldType = (fieldSymbol as IFieldSymbol)?.Type ?? (fieldSymbol as IPropertySymbol).Type; MemberAccessExpressionSyntax defaultComparer = DefaultEqualityComparer.AccessExpression(fieldType); MemberAccessExpressionSyntax defaultGetHashCodeMethod = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, defaultComparer, _getHashCodeName); MemberAccessExpressionSyntax fieldAccess = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(fieldSymbol.Name)); InvocationExpressionSyntax getHashCodeCall = InvocationExpression(defaultGetHashCodeMethod).AddArgumentListArguments(Argument(fieldAccess)); return(getHashCodeCall); }
static void Scratch() { DefaultEqualityComparer.SetProvider(DefaultEqualityComparer.System); var testSet = new FSharpHashSet <int>(new [] { 1, 2, 3, 4 }); var mappy = new FSharpHashMapBuilder <int, int> { { 1, 3 }, { 2, 4 } } .ToFSharpHashMap() .Add(4, 5) .Remove(2) .Alter(1, (int?o) => o) .Alter(1, (Microsoft.FSharp.Core.FSharpOption <int> o) => o) .Alter(1, o => o) .Map((k, v) => v * 3); var delta123123 = mappy.ComputeDeltaTo(FSharpHashMap.Empty <int, int>()); var(sm, dm) = mappy.ApplyDelta(delta123123); var smasdasd = FSharpHashMap.Empty <int, int>().ApplyDelta(ref delta123123); FSharpHashSet <int> test = new[] { 1, 2, 3, 4, 5 } .ToFSharpHashSet() .Map(i => i * 2) .Filter(i => i % 2 == 0) .Collect(i => FSharpHashSet.Single(i)) .Subtract(FSharpHashSet.Single(2)) .Alter(2, i => !i) .MapNullable(i => i < 10 ? (int?)i : null); var delta = test.ComputeDeltaTo(FSharpHashSet.Empty <int>()).Add(SetOperation <int> .Add(2131)); var sepp1 = test.ApplyDelta(ref delta); var(newState, realDelta) = test.ApplyDelta(delta); var changeableMap = new ChangeableHashMap <int, int>(new[] { (1, 2), (2, 3) });
private static ExpressionSyntax BuildFieldEqualityCall(ISymbol fieldSymbol) { ITypeSymbol fieldType = (fieldSymbol as IFieldSymbol)?.Type ?? (fieldSymbol as IPropertySymbol).Type; bool declaresEqualityOperator = fieldType .GetMembers() .OfType <IMethodSymbol>() .Where(m => m.MethodKind == MethodKind.BuiltinOperator || m.MethodKind == MethodKind.UserDefinedOperator) .Where(m => m.Name == "op_Equality") .Any(); // If the field type declares == operator, we can safely use it. // This provides better readability in a lot of cases. if (declaresEqualityOperator) { return(BinaryExpression ( SyntaxKind.EqualsExpression, MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(fieldSymbol.Name)), MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(_otherArg), IdentifierName(fieldSymbol.Name)) )); } // Otherwise, we have to resort to EqualityComparer<T>.Default.Equals( this._field, other._field ) MemberAccessExpressionSyntax defaultProperty = DefaultEqualityComparer.AccessExpression(fieldType); MemberAccessExpressionSyntax equalsMethod = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, defaultProperty, IdentifierName("Equals")); InvocationExpressionSyntax invocation = InvocationExpression(equalsMethod); invocation = invocation .AddArgumentListArguments ( Argument(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(fieldSymbol.Name))), Argument(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(_otherArg), IdentifierName(fieldSymbol.Name))) ); return(invocation); }