@@ -1852,6 +1852,146 @@ async Task TestMethod()
18521852 await CSVerify . VerifyAnalyzerAsync ( test ) ;
18531853 }
18541854
1855+ [ Fact ]
1856+ public async Task ReportWarningWhenCompletedTaskAttributeOnNonReadonlyField ( )
1857+ {
1858+ var test = @"
1859+ using System.Threading.Tasks;
1860+
1861+ namespace Microsoft.VisualStudio.Threading
1862+ {
1863+ [System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Method | System.AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
1864+ internal sealed class CompletedTaskAttribute : System.Attribute
1865+ {
1866+ }
1867+ }
1868+
1869+ class Tests
1870+ {
1871+ [Microsoft.VisualStudio.Threading.CompletedTask]
1872+ private static Task MyTask = Task.CompletedTask; // Not readonly
1873+
1874+ async Task GetTask()
1875+ {
1876+ await [|MyTask|];
1877+ }
1878+ }
1879+ " ;
1880+ await CSVerify . VerifyAnalyzerAsync ( test ) ;
1881+ }
1882+
1883+ [ Fact ]
1884+ public async Task ReportWarningWhenCompletedTaskAttributeOnPropertyWithPublicSetter ( )
1885+ {
1886+ var test = @"
1887+ using System.Threading.Tasks;
1888+
1889+ namespace Microsoft.VisualStudio.Threading
1890+ {
1891+ [System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Method | System.AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
1892+ internal sealed class CompletedTaskAttribute : System.Attribute
1893+ {
1894+ }
1895+ }
1896+
1897+ class Tests
1898+ {
1899+ [Microsoft.VisualStudio.Threading.CompletedTask]
1900+ public static Task MyTask { get; set; } = Task.CompletedTask; // Public setter
1901+
1902+ async Task GetTask()
1903+ {
1904+ await [|MyTask|];
1905+ }
1906+ }
1907+ " ;
1908+ await CSVerify . VerifyAnalyzerAsync ( test ) ;
1909+ }
1910+
1911+ [ Fact ]
1912+ public async Task ReportWarningWhenCompletedTaskAttributeOnPropertyWithInternalSetter ( )
1913+ {
1914+ var test = @"
1915+ using System.Threading.Tasks;
1916+
1917+ namespace Microsoft.VisualStudio.Threading
1918+ {
1919+ [System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Method | System.AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
1920+ internal sealed class CompletedTaskAttribute : System.Attribute
1921+ {
1922+ }
1923+ }
1924+
1925+ class Tests
1926+ {
1927+ [Microsoft.VisualStudio.Threading.CompletedTask]
1928+ public static Task MyTask { get; internal set; } = Task.CompletedTask; // Internal setter
1929+
1930+ async Task GetTask()
1931+ {
1932+ await [|MyTask|];
1933+ }
1934+ }
1935+ " ;
1936+ await CSVerify . VerifyAnalyzerAsync ( test ) ;
1937+ }
1938+
1939+ [ Fact ]
1940+ public async Task DoNotReportWarningWhenCompletedTaskAttributeOnPropertyWithPrivateSetter ( )
1941+ {
1942+ var test = @"
1943+ using System.Threading.Tasks;
1944+
1945+ namespace Microsoft.VisualStudio.Threading
1946+ {
1947+ [System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Method | System.AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
1948+ internal sealed class CompletedTaskAttribute : System.Attribute
1949+ {
1950+ }
1951+ }
1952+
1953+ class Tests
1954+ {
1955+ [Microsoft.VisualStudio.Threading.CompletedTask]
1956+ public static Task MyTask { get; private set; } = Task.CompletedTask; // Private setter is OK
1957+
1958+ async Task GetTask()
1959+ {
1960+ await MyTask;
1961+ }
1962+ }
1963+ " ;
1964+ await CSVerify . VerifyAnalyzerAsync ( test ) ;
1965+ }
1966+
1967+ [ Fact ]
1968+ public async Task DoNotReportWarningWhenCompletedTaskAttributeOnPropertyWithGetterOnly ( )
1969+ {
1970+ var test = @"
1971+ using System.Threading.Tasks;
1972+
1973+ namespace Microsoft.VisualStudio.Threading
1974+ {
1975+ [System.AttributeUsage(System.AttributeTargets.Property | System.AttributeTargets.Method | System.AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
1976+ internal sealed class CompletedTaskAttribute : System.Attribute
1977+ {
1978+ }
1979+ }
1980+
1981+ class Tests
1982+ {
1983+ [Microsoft.VisualStudio.Threading.CompletedTask]
1984+ public static Task MyTask { get; } = Task.CompletedTask; // Getter-only is OK
1985+
1986+ async Task GetTask()
1987+ {
1988+ await MyTask;
1989+ }
1990+ }
1991+ " ;
1992+ await CSVerify . VerifyAnalyzerAsync ( test ) ;
1993+ }
1994+
18551995 private DiagnosticResult CreateDiagnostic ( int line , int column , int length ) =>
18561996 CSVerify . Diagnostic ( ) . WithSpan ( line , column , line , column + length ) ;
18571997}
0 commit comments