コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: ncave/FSharp.Data.Adaptive
        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) });
コード例 #3
0
        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);
        }