public async Task RequiresUIThreadTransitive() { var test = @" using System; using Microsoft.VisualStudio.Shell.Interop; class Test { void F() { VerifyOnUIThread(); IVsSolution sln = null; sln.SetProperty(1000, null); } void G() { F(); } void H() { G(); } int MainThreadGetter { get { H(); return 0; } set { } } int MainThreadSetter { get => 0; set => H(); } int CallMainThreadGetter_get() => MainThreadGetter; // Flagged int CallMainThreadGetter_get2() => this.MainThreadGetter; // Flagged int CallMainThreadGetter_get3() => ((Test)this).MainThreadGetter; // Flagged int CallMainThreadGetter_set() => MainThreadGetter = 1; int CallMainThreadGetter_set2() => this.MainThreadGetter = 1; int CallMainThreadSetter_get() => MainThreadSetter; int CallMainThreadSetter_get2() => this.MainThreadSetter; int CallMainThreadSetter_set() => MainThreadSetter = 1; // Flagged int CallMainThreadSetter_set2() => this.MainThreadSetter = 1; // Flagged int CallMainThreadSetter_set3() => ((Test)this).MainThreadSetter = 1; // Flagged // None of these should produce diagnostics since we're not invoking the members. string NameOfFoo1() => nameof(MainThreadGetter); string NameOfFoo2() => nameof(MainThreadSetter); string NameOfThisFoo1() => nameof(this.MainThreadGetter); string NameOfThisFoo2() => nameof(this.MainThreadSetter); string NameOfH() => nameof(H); Action GAsDelegate() => this.G; void VerifyOnUIThread() { } } "; var expected = new DiagnosticResult[] { Verify.Diagnostic(DescriptorSync).WithSpan(13, 9, 13, 10).WithArguments("Test.F", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(17, 9, 17, 10).WithArguments("Test.G", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(22, 13, 22, 14).WithArguments("Test.H", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(32, 16, 32, 17).WithArguments("Test.H", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(35, 39, 35, 55).WithArguments("Test.get_MainThreadGetter", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(36, 40, 36, 61).WithArguments("Test.get_MainThreadGetter", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(37, 40, 37, 69).WithArguments("Test.get_MainThreadGetter", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(43, 39, 43, 55).WithArguments("Test.set_MainThreadSetter", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(44, 40, 44, 61).WithArguments("Test.set_MainThreadSetter", "Test.VerifyOnUIThread"), Verify.Diagnostic(DescriptorSync).WithSpan(45, 40, 45, 69).WithArguments("Test.set_MainThreadSetter", "Test.VerifyOnUIThread"), }; await Verify.VerifyAnalyzerAsync(test, expected); }