Exemple #1
0
        private static IMethodSymbol FindSetPropertyMethod(this INamedTypeSymbol classSymbol, CommonCompilation compilation)
        {
            // Find SetProperty<T>(ref T, T, string) method.
            var setPropertyMethod = classSymbol
                                    .GetMembers("SetProperty")
                                    .OfType <IMethodSymbol>()
                                    .FirstOrDefault(m => m.Parameters.Count == 3 && m.TypeParameters.Count == 1);

            if (setPropertyMethod != null)
            {
                var parameters    = setPropertyMethod.Parameters;
                var typeParameter = setPropertyMethod.TypeParameters[0];
                var stringType    = compilation.GetSpecialType(SpecialType.System_String);

                if (setPropertyMethod.ReturnsVoid &&
                    parameters[0].RefKind == RefKind.Ref &&
                    parameters[0].Type.Equals(typeParameter) &&
                    parameters[1].Type.Equals(typeParameter) &&
                    parameters[2].Type.Equals(stringType))
                {
                    return(setPropertyMethod);
                }
            }

            return(null);
        }
Exemple #2
0
        internal static IMethodSymbol GenerateSetPropertyMethod(CommonCompilation compilation)
        {
            var body = Syntax.ParseStatement(
                @"if (!System.Collections.Generic.EqualityComparer<T>.Default.Equals(field, value))
{
    field = value;

    var handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new System.ComponentModel.PropertyChangedEventArgs(name));
    }
}");

            body = body.WithAdditionalAnnotations(CodeAnnotations.Simplify);

            var stringType = compilation.GetSpecialType(SpecialType.System_String);
            var voidType   = compilation.GetSpecialType(SpecialType.System_Void);

            var typeParameter = SymbolFactory.CreateTypeParameter("T");

            var parameter1 = SymbolFactory.CreateParameter(
                attributes: null,
                refKind: RefKind.Ref,
                isParams: false,
                type: typeParameter,
                name: "field");

            var parameter2 = SymbolFactory.CreateParameter(typeParameter, "value");
            var parameter3 = SymbolFactory.CreateParameter(stringType, "name");

            return(SymbolFactory.CreateMethod(
                       attributes: null,
                       accessibility: CommonAccessibility.Private,
                       modifiers: new SymbolModifiers(),
                       returnType: voidType,
                       explicitInterfaceSymbolOpt: null,
                       name: "SetProperty",
                       typeParameters: new[] { typeParameter },
                       parameters: new[] { parameter1, parameter2, parameter3 },
                       statements: new[] { body }));
        }
Exemple #3
0
        internal static IMethodSymbol GenerateSetPropertyMethod(CommonCompilation compilation)
        {
            var body = Syntax.ParseStatement(
                @"if (!System.Collections.Generic.EqualityComparer<T>.Default.Equals(field, value))
            {
            field = value;

            var handler = PropertyChanged;
            if (handler != null)
            {
            handler(this, new System.ComponentModel.PropertyChangedEventArgs(name));
            }
            }");

            body = body.WithAdditionalAnnotations(CodeAnnotations.Simplify);

            var stringType = compilation.GetSpecialType(SpecialType.System_String);
            var voidType = compilation.GetSpecialType(SpecialType.System_Void);

            var typeParameter = SymbolFactory.CreateTypeParameter("T");

            var parameter1 = SymbolFactory.CreateParameter(
                attributes: null,
                refKind: RefKind.Ref,
                isParams: false,
                type: typeParameter,
                name: "field");

            var parameter2 = SymbolFactory.CreateParameter(typeParameter, "value");
            var parameter3 = SymbolFactory.CreateParameter(stringType, "name");

            return SymbolFactory.CreateMethod(
                attributes: null,
                accessibility: CommonAccessibility.Private,
                modifiers: new SymbolModifiers(),
                returnType: voidType,
                explicitInterfaceSymbolOpt: null,
                name: "SetProperty",
                typeParameters: new[] { typeParameter },
                parameters: new[] { parameter1, parameter2, parameter3 },
                statements: new[] { body });
        }
Exemple #4
0
        private static IMethodSymbol FindSetPropertyMethod(this INamedTypeSymbol classSymbol, CommonCompilation compilation)
        {
            // Find SetProperty<T>(ref T, T, string) method.
            var setPropertyMethod = classSymbol
                .GetMembers("SetProperty")
                .OfType<IMethodSymbol>()
                .FirstOrDefault(m => m.Parameters.Count == 3 && m.TypeParameters.Count == 1);

            if (setPropertyMethod != null)
            {
                var parameters = setPropertyMethod.Parameters;
                var typeParameter = setPropertyMethod.TypeParameters[0];
                var stringType = compilation.GetSpecialType(SpecialType.System_String);

                if (setPropertyMethod.ReturnsVoid &&
                    parameters[0].RefKind == RefKind.Ref &&
                    parameters[0].Type.Equals(typeParameter) &&
                    parameters[1].Type.Equals(typeParameter) &&
                    parameters[2].Type.Equals(stringType))
                {
                    return setPropertyMethod;
                }
            }

            return null;
        }