Exemple #1
0
            public static void Recursive2()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    using System.ComponentModel;
    using System.Runtime.CompilerServices;

    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected bool TrySet<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {
            return this.TrySet(ref field, value, propertyName);
        }

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}");
                var compilation = CSharpCompilation.Create(
                    "test",
                    new[] { syntaxTree },
                    MetadataReferences.FromAttributes());
                var semanticModel   = compilation.GetSemanticModel(syntaxTree);
                var typeDeclaration = syntaxTree.FindClassDeclaration("ViewModelBase");
                var type            = semanticModel.GetDeclaredSymbol(typeDeclaration);

                Assert.AreEqual(false, TrySet.TryFind(type, semanticModel, CancellationToken.None, out _));
            }
Exemple #2
0
            public static void CallingCaliburnMicroPropertyChangedBase()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    public abstract class ViewModelBase : Caliburn.Micro.PropertyChangedBase
    {
        public bool TrySet<T>(ref T oldValue, T value, string propertyName = null)
        {
            return base.Set(ref oldValue, value, propertyName);
        }
    }
}");
                var compilation = CSharpCompilation.Create(
                    "test",
                    new[] { syntaxTree },
                    MetadataReferences.FromAttributes().Concat(MetadataReferences.Transitive(typeof(Caliburn.Micro.PropertyChangedBase).Assembly)));
                var semanticModel   = compilation.GetSemanticModel(syntaxTree);
                var typeDeclaration = syntaxTree.FindClassDeclaration("ViewModelBase");
                var type            = semanticModel.GetDeclaredSymbol(typeDeclaration);

                Assert.AreEqual(true, TrySet.TryFind(type, semanticModel, CancellationToken.None, out var method));
                Assert.AreEqual("TrySet", method.Name);
            }
            public static void MvvmLight()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    public class Foo : GalaSoft.MvvmLight.ViewModelBase
    {
        private int value;

        public int Value
        {
            get { return value; }
            set { this.Set(ref this.value, value); }
        }
    }
}");
                var compilation = CSharpCompilation.Create(
                    "test",
                    new[] { syntaxTree },
                    MetadataReferences.Transitive(typeof(GalaSoft.MvvmLight.ViewModelBase).Assembly));
                var semanticModel = compilation.GetSemanticModel(syntaxTree);
                var invocation    = syntaxTree.FindInvocation("Set");
                var method        = semanticModel.GetSymbolSafe(invocation, CancellationToken.None);

                Assert.AreEqual(AnalysisResult.Yes, TrySet.IsMatch(method, semanticModel, CancellationToken.None));
            }
Exemple #4
0
            public static void CustomImplementation2()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;

    /// <summary>
    /// INotifyPropertyChanged base implementation
    /// </summary>
    /// <seealso cref=""System.ComponentModel.INotifyPropertyChanged"" />
    public abstract class ObservableObject : INotifyPropertyChanged
    {
        /// <summary>
        /// Occurs when a property value changes.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Called when [property changed].
        /// </summary>
        /// <param name=""propertyName"">Name of the property.</param>
        protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        protected virtual bool TrySet<T>(ref T field, T value, Action OnChanging = null, Action OnChanged = null, [CallerMemberName]string propertyName = null)
        {
            if (EqualityComparer<T>.Default.Equals(field, value))
                return false;

            OnChanging?.Invoke();

            field = value;
            OnPropertyChanged(propertyName);

            OnChanged?.Invoke();

            return true;
        }
    }
}");
                var compilation = CSharpCompilation.Create(
                    "test",
                    new[] { syntaxTree },
                    MetadataReferences.FromAttributes());
                var semanticModel   = compilation.GetSemanticModel(syntaxTree);
                var typeDeclaration = syntaxTree.FindClassDeclaration("ObservableObject");
                var type            = semanticModel.GetDeclaredSymbol(typeDeclaration);

                Assert.AreEqual(true, TrySet.TryFind(type, semanticModel, CancellationToken.None, out var method));
                Assert.AreEqual("TrySet", method.Name);
            }
Exemple #5
0
            public static void CustomImplementation1()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;

    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected bool TrySet<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {
            if (EqualityComparer<T>.Default.Equals(field, value))
            {
                return false;
            }

            field = value;
            this.OnPropertyChanged(propertyName);
            return true;
        }

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}");
                var compilation = CSharpCompilation.Create(
                    "test",
                    new[] { syntaxTree },
                    MetadataReferences.FromAttributes());
                var semanticModel   = compilation.GetSemanticModel(syntaxTree);
                var typeDeclaration = syntaxTree.FindClassDeclaration("ViewModelBase");
                var type            = semanticModel.GetDeclaredSymbol(typeDeclaration);

                Assert.AreEqual(true, TrySet.TryFind(type, semanticModel, CancellationToken.None, out var method));
                Assert.AreEqual("TrySet", method.Name);
            }
            public static void OverridingCaliburnMicroPropertyChangedBase()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    public abstract class ViewModelBase : Caliburn.Micro.PropertyChangedBase
    {
        public override bool Set<T>(ref T oldValue, T value, string propertyName = null)
        {
            return base.Set(ref oldValue, value, propertyName);
        }
    }
}");
                var compilation = CSharpCompilation.Create(
                    "test",
                    new[] { syntaxTree },
                    MetadataReferences.FromAttributes().Concat(MetadataReferences.Transitive(typeof(Caliburn.Micro.PropertyChangedBase).Assembly)));
                var semanticModel     = compilation.GetSemanticModel(syntaxTree);
                var methodDeclaration = syntaxTree.FindMethodDeclaration("Set");
                var method            = semanticModel.GetDeclaredSymbol(methodDeclaration);

                Assert.AreEqual(AnalysisResult.Yes, TrySet.IsMatch(method, semanticModel, CancellationToken.None));
            }
            public static void Stylet()
            {
                var syntaxTree = CSharpSyntaxTree.ParseText(
                    @"
namespace N
{
    public class Foo : Stylet.PropertyChangedBase
    {
        private int value;

        public int Value
        {
            get { return value; }
            set { this.SetAndNotify(ref this.value, value); }
        }
    }
}");
                var compilation   = CSharpCompilation.Create("test", new[] { syntaxTree }, SpecialMetadataReferences.Stylet);
                var semanticModel = compilation.GetSemanticModel(syntaxTree);
                var invocation    = syntaxTree.FindInvocation("SetAndNotify");
                var method        = semanticModel.GetSymbolSafe(invocation, CancellationToken.None);

                Assert.AreEqual(AnalysisResult.Yes, TrySet.IsMatch(method, semanticModel, CancellationToken.None));
            }