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 _)); }
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)); }
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); }
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)); }