PageRenderTime 119ms CodeModel.GetById 33ms app.highlight 72ms RepoModel.GetById 1ms app.codeStats 1ms

/Src/Compilers/CSharp/Test/Semantic/Semantics/QueryTests.cs

https://github.com/EkardNT/Roslyn
C# | 2050 lines | 1855 code | 152 blank | 43 comment | 16 complexity | 482eaf29310b38b84269bda730a13cbc MD5 | raw file

Large files files are truncated, but you can click here to view the full file

   1// Copyright (c) Microsoft Open Technologies, Inc.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.
   2
   3using System;
   4using System.IO;
   5using System.Linq;
   6using Microsoft.CodeAnalysis.CSharp.Symbols;
   7using Microsoft.CodeAnalysis.CSharp.Syntax;
   8using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
   9using Roslyn.Test.Utilities;
  10using Xunit;
  11
  12namespace Microsoft.CodeAnalysis.CSharp.UnitTests
  13{
  14    public partial class QueryTests : CompilingTestBase
  15    {
  16        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
  17        [Fact]
  18        public void DegenerateQueryExpression()
  19        {
  20            var csSource = LINQ + @"
  21class Query
  22{
  23    public static void Main(string[] args)
  24    {
  25        List1<int> c = new List1<int>(1, 2, 3, 4, 5, 6, 7);
  26        List1<int> r = from i in c select i;
  27        if (ReferenceEquals(c, r)) throw new Exception();
  28        // List1<int> r = c.Select(i => i);
  29        Console.WriteLine(r);
  30    }
  31}";
  32            CompileAndVerify(csSource, expectedOutput: "[1, 2, 3, 4, 5, 6, 7]");
  33        }
  34
  35        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
  36        [Fact]
  37        public void QueryContinuation()
  38        {
  39            var csSource = LINQ + @"
  40class Query
  41{
  42    public static void Main(string[] args)
  43    {
  44        List1<int> c = new List1<int>(1, 2, 3, 4, 5, 6, 7);
  45        List1<int> r = from i in c select i into q select q;
  46        if (ReferenceEquals(c, r)) throw new Exception();
  47        // List1<int> r = c.Select(i => i);
  48        Console.WriteLine(r);
  49    }
  50}";
  51            CompileAndVerify(csSource, expectedOutput: "[1, 2, 3, 4, 5, 6, 7]");
  52        }
  53
  54        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
  55        [Fact]
  56        public void Select()
  57        {
  58            var csSource = LINQ + @"
  59class Query
  60{
  61    public static void Main(string[] args)
  62    {
  63        List1<int> c = new List1<int>(1, 2, 3, 4, 5, 6, 7);
  64        List1<int> r = from i in c select i+1;
  65        Console.WriteLine(r);
  66    }
  67}";
  68            CompileAndVerify(csSource, expectedOutput: "[2, 3, 4, 5, 6, 7, 8]");
  69        }
  70
  71        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
  72        [Fact]
  73        public void GroupBy01()
  74        {
  75            var csSource = LINQ + @"
  76class Query
  77{
  78    public static void Main(string[] args)
  79    {
  80        List1<int> c = new List1<int>(1, 2, 3, 4, 5, 6, 7);
  81        var r = from i in c group i by i % 2;
  82        Console.WriteLine(r);
  83    }
  84}";
  85            CompileAndVerify(csSource, expectedOutput: "[1:[1, 3, 5, 7], 0:[2, 4, 6]]");
  86        }
  87
  88        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
  89        [Fact]
  90        public void GroupBy02()
  91        {
  92            var csSource = LINQ + @"
  93class Query
  94{
  95    public static void Main(string[] args)
  96    {
  97        List1<int> c = new List1<int>(1, 2, 3, 4, 5, 6, 7);
  98        var r = from i in c group 10+i by i % 2;
  99        Console.WriteLine(r);
 100    }
 101}";
 102            CompileAndVerify(csSource, expectedOutput: "[1:[11, 13, 15, 17], 0:[12, 14, 16]]");
 103        }
 104
 105        [Fact]
 106        public void Cast()
 107        {
 108            var csSource = LINQ + @"
 109class Query
 110{
 111    public static void Main(string[] args)
 112    {
 113        List1<object> c = new List1<object>(1, 2, 3, 4, 5, 6, 7);
 114        List1<int> r = from int i in c select i;
 115        Console.WriteLine(r);
 116    }
 117}";
 118            CompileAndVerify(csSource, expectedOutput: "[1, 2, 3, 4, 5, 6, 7]");
 119        }
 120
 121        [Fact]
 122        public void Where()
 123        {
 124            var csSource = LINQ + @"
 125class Query
 126{
 127    public static void Main(string[] args)
 128    {
 129        List1<object> c = new List1<object>(1, 2, 3, 4, 5, 6, 7);
 130        List1<int> r = from int i in c where i < 5 select i;
 131        Console.WriteLine(r);
 132    }
 133}";
 134            CompileAndVerify(csSource, expectedOutput: "[1, 2, 3, 4]");
 135        }
 136
 137        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 138        [Fact]
 139        public void FromJoinSelect()
 140        {
 141            var csSource = LINQ + @"
 142class Query
 143{
 144    public static void Main(string[] args)
 145    {
 146        List1<int> c1 = new List1<int>(1, 2, 3, 4, 5, 7);
 147        List1<int> c2 = new List1<int>(10, 30, 40, 50, 60, 70);
 148        List1<int> r = from x1 in c1
 149                      join x2 in c2 on x1 equals x2/10
 150                      select x1+x2;
 151        Console.WriteLine(r);
 152    }
 153}";
 154            CompileAndVerify(csSource, expectedOutput: "[11, 33, 44, 55, 77]");
 155        }
 156
 157        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 158        [Fact]
 159        public void OrderBy()
 160        {
 161            var csSource = LINQ + @"
 162class Query
 163{
 164    public static void Main(string[] args)
 165    {
 166        List1<int> c = new List1<int>(28, 51, 27, 84, 27, 27, 72, 64, 55, 46, 39);
 167        var r =
 168            from i in c
 169            orderby i/10 descending, i%10
 170            select i;
 171        Console.WriteLine(r);
 172    }
 173}";
 174            CompileAndVerify(csSource, expectedOutput: "[84, 72, 64, 51, 55, 46, 39, 27, 27, 27, 28]");
 175        }
 176
 177        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 178        [Fact]
 179        public void GroupJoin()
 180        {
 181            var csSource = LINQ + @"
 182class Query
 183{
 184    public static void Main(string[] args)
 185    {
 186        List1<int> c1 = new List1<int>(1, 2, 3, 4, 5, 7);
 187        List1<int> c2 = new List1<int>(12, 34, 42, 51, 52, 66, 75);
 188        List1<string> r =
 189            from x1 in c1
 190            join x2 in c2 on x1 equals x2 / 10 into g
 191            select x1 + "":"" + g.ToString();
 192        Console.WriteLine(r);
 193    }
 194}";
 195            CompileAndVerify(csSource, expectedOutput: "[1:[12], 2:[], 3:[34], 4:[42], 5:[51, 52], 7:[75]]");
 196        }
 197
 198        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 199        [Fact]
 200        public void SelectMany01()
 201        {
 202            var csSource = LINQ + @"
 203class Query
 204{
 205    public static void Main(string[] args)
 206    {
 207        List1<int> c1 = new List1<int>(1, 2, 3);
 208        List1<int> c2 = new List1<int>(10, 20, 30);
 209        List1<int> r = from x in c1 from y in c2 select x + y;
 210        Console.WriteLine(r);
 211    }
 212}";
 213            CompileAndVerify(csSource, expectedOutput: "[11, 21, 31, 12, 22, 32, 13, 23, 33]");
 214        }
 215
 216        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 217        [Fact]
 218        public void SelectMany02()
 219        {
 220            var csSource = LINQ + @"
 221class Query
 222{
 223    public static void Main(string[] args)
 224    {
 225        List1<int> c1 = new List1<int>(1, 2, 3);
 226        List1<int> c2 = new List1<int>(10, 20, 30);
 227        List1<int> r = from x in c1 from int y in c2 select x + y;
 228        Console.WriteLine(r);
 229    }
 230}";
 231            CompileAndVerify(csSource, expectedOutput: "[11, 21, 31, 12, 22, 32, 13, 23, 33]");
 232        }
 233
 234        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 235        [Fact]
 236        public void Let01()
 237        {
 238            var csSource = LINQ + @"
 239class Query
 240{
 241    public static void Main(string[] args)
 242    {
 243        List1<int> c1 = new List1<int>(1, 2, 3);
 244        List1<int> r1 =
 245            from int x in c1
 246            let g = x * 10
 247            let z = g + x*100
 248            select x + z;
 249        System.Console.WriteLine(r1);
 250    }
 251}";
 252            CompileAndVerify(csSource, expectedOutput: "[111, 222, 333]");
 253        }
 254
 255        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 256        [Fact]
 257        public void TransparentIdentifiers_FromLet()
 258        {
 259            var csSource = @"
 260using C = List1<int>;" + LINQ + @"
 261class Query
 262{
 263    public static void Main(string[] args)
 264    {
 265        C c1 = new C(1, 2, 3);
 266        C c2 = new C(10, 20, 30);
 267        C c3 = new C(100, 200, 300);
 268        C r1 =
 269            from int x in c1
 270            from int y in c2
 271            from int z in c3
 272            let g = x + y + z
 273            where (x + y / 10 + z / 100) < 6
 274            select g;
 275       Console.WriteLine(r1);
 276    }
 277}";
 278            CompileAndVerify(csSource, expectedOutput: "[111, 211, 311, 121, 221, 131, 112, 212, 122, 113]");
 279        }
 280
 281        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 282        [Fact]
 283        public void TransparentIdentifiers_Join01()
 284        {
 285            var csSource = @"
 286using C = List1<int>;" + LINQ + @"
 287class Query
 288{
 289    public static void Main(string[] args)
 290    {
 291        C c1 = new C(1, 2, 3);
 292        C c2 = new C(10, 20, 30);
 293        C r1 =
 294            from int x in c1
 295            join y in c2 on x equals y/10
 296            let z = x+y
 297            select z;
 298        Console.WriteLine(r1);
 299    }
 300}";
 301            CompileAndVerify(csSource, expectedOutput: "[11, 22, 33]");
 302        }
 303
 304        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 305        [Fact]
 306        public void TransparentIdentifiers_Join02()
 307        {
 308            var csSource = LINQ + @"
 309class Query
 310{
 311    public static void Main(string[] args)
 312    {
 313        List1<int> c1 = new List1<int>(1, 2, 3, 4, 5, 7);
 314        List1<int> c2 = new List1<int>(12, 34, 42, 51, 52, 66, 75);
 315        List1<string> r1 = from x1 in c1
 316                      join x2 in c2 on x1 equals x2 / 10 into g
 317                      where x1 < 7
 318                      select x1 + "":"" + g.ToString();
 319        Console.WriteLine(r1);
 320    }
 321}";
 322            CompileAndVerify(csSource, expectedOutput: "[1:[12], 2:[], 3:[34], 4:[42], 5:[51, 52]]");
 323        }
 324
 325        [Fact]
 326        public void CodegenBug()
 327        {
 328            var csSource = LINQ + @"
 329class Query
 330{
 331    public static void Main(string[] args)
 332    {
 333        List1<int> c1 = new List1<int>(1, 2, 3, 4, 5, 7);
 334        List1<int> c2 = new List1<int>(12, 34, 42, 51, 52, 66, 75);
 335
 336        List1<Tuple<int, List1<int>>> r1 =
 337            c1
 338            .GroupJoin(c2, x1 => x1, x2 => x2 / 10, (x1, g) => new Tuple<int, List1<int>>(x1, g))
 339            ;
 340
 341        Func1<Tuple<int, List1<int>>, bool> condition = (Tuple<int, List1<int>> TR1) => TR1.Item1 < 7;
 342        List1<Tuple<int, List1<int>>> r2 =
 343            r1
 344            .Where(condition)
 345            ;
 346        Func1<Tuple<int, List1<int>>, string> map = (Tuple<int, List1<int>> TR1) => TR1.Item1.ToString() + "":"" + TR1.Item2.ToString();
 347
 348        List1<string> r3 =
 349            r2
 350            .Select(map)
 351            ;
 352        string r4 = r3.ToString();
 353        Console.WriteLine(r4);
 354        return;
 355    }
 356}";
 357            CompileAndVerify(csSource, expectedOutput: "[1:[12], 2:[], 3:[34], 4:[42], 5:[51, 52]]");
 358        }
 359
 360        [Fact]
 361        public void RangeVariables01()
 362        {
 363            var csSource = @"
 364using C = List1<int>;" + LINQ + @"
 365class Query
 366{
 367    public static void Main(string[] args)
 368    {
 369        C c1 = new C(1, 2, 3);
 370        C c2 = new C(10, 20, 30);
 371        C c3 = new C(100, 200, 300);
 372        C r1 =
 373            from int x in c1
 374            from int y in c2
 375            from int z in c3
 376            select x + y + z;
 377       Console.WriteLine(r1);
 378    }
 379}";
 380            var compilation = CreateCompilationWithMscorlib(csSource);
 381            compilation.VerifyDiagnostics();
 382            var tree = compilation.SyntaxTrees[0];
 383            var model = compilation.GetSemanticModel(tree);
 384            var classC = tree.GetCompilationUnitRoot().ChildNodes().OfType<TypeDeclarationSyntax>().Where(t => t.Identifier.ValueText == "Query").Single();
 385            dynamic methodM = (MethodDeclarationSyntax)classC.Members[0];
 386            QueryExpressionSyntax q = methodM.Body.Statements[3].Declaration.Variables[0].Initializer.Value;
 387
 388            var info0 = model.GetQueryClauseInfo(q.FromClause);
 389            var x = model.GetDeclaredSymbol(q.FromClause);
 390            Assert.Equal(SymbolKind.RangeVariable, x.Kind);
 391            Assert.Equal("x", x.Name);
 392            Assert.Equal("Cast", info0.CastInfo.Symbol.Name);
 393            Assert.NotEqual(MethodKind.ReducedExtension, ((IMethodSymbol)info0.CastInfo.Symbol).MethodKind);
 394            Assert.Null(info0.OperationInfo.Symbol);
 395
 396            var info1 = model.GetQueryClauseInfo(q.Body.Clauses[0]);
 397            var y = model.GetDeclaredSymbol(q.Body.Clauses[0]);
 398            Assert.Equal(SymbolKind.RangeVariable, y.Kind);
 399            Assert.Equal("y", y.Name);
 400            Assert.Equal("Cast", info1.CastInfo.Symbol.Name);
 401            Assert.Equal("SelectMany", info1.OperationInfo.Symbol.Name);
 402            Assert.NotEqual(MethodKind.ReducedExtension, ((IMethodSymbol)info1.OperationInfo.Symbol).MethodKind);
 403
 404            var info2 = model.GetQueryClauseInfo(q.Body.Clauses[1]);
 405            var z = model.GetDeclaredSymbol(q.Body.Clauses[1]);
 406            Assert.Equal(SymbolKind.RangeVariable, z.Kind);
 407            Assert.Equal("z", z.Name);
 408            Assert.Equal("Cast", info2.CastInfo.Symbol.Name);
 409            Assert.Equal("SelectMany", info2.OperationInfo.Symbol.Name);
 410
 411            var info3 = model.GetSemanticInfoSummary(q.Body.SelectOrGroup);
 412            Assert.NotNull(info3);
 413            // what about info3's contents ???
 414
 415            var xPyPz = (q.Body.SelectOrGroup as SelectClauseSyntax).Expression as BinaryExpressionSyntax;
 416            var xPy = xPyPz.Left as BinaryExpressionSyntax;
 417            Assert.Equal(x, model.GetSemanticInfoSummary(xPy.Left).Symbol);
 418            Assert.Equal(y, model.GetSemanticInfoSummary(xPy.Right).Symbol);
 419            Assert.Equal(z, model.GetSemanticInfoSummary(xPyPz.Right).Symbol);
 420        }
 421
 422        [Fact]
 423        public void RangeVariables02()
 424        {
 425            var csSource = @"
 426using System;
 427using System.Linq;
 428class Query
 429{
 430    public static void Main(string[] args)
 431    {
 432        var c1 = new int[] {1, 2, 3};
 433        var c2 = new int[] {10, 20, 30};
 434        var c3 = new int[] {100, 200, 300};
 435        var r1 =
 436            from int x in c1
 437            from int y in c2
 438            from int z in c3
 439            select x + y + z;
 440       Console.WriteLine(r1);
 441    }
 442}";
 443            var compilation = CreateCompilationWithMscorlib(csSource, new[] { LinqAssemblyRef });
 444            foreach (var dd in compilation.GetDiagnostics()) Console.WriteLine(dd);
 445            compilation.VerifyDiagnostics();
 446            var tree = compilation.SyntaxTrees[0];
 447            var model = compilation.GetSemanticModel(tree);
 448            var classC = tree.GetCompilationUnitRoot().ChildNodes().OfType<TypeDeclarationSyntax>().Where(t => t.Identifier.ValueText == "Query").Single();
 449            dynamic methodM = (MethodDeclarationSyntax)classC.Members[0];
 450            QueryExpressionSyntax q = methodM.Body.Statements[3].Declaration.Variables[0].Initializer.Value;
 451
 452            var info0 = model.GetQueryClauseInfo(q.FromClause);
 453            var x = model.GetDeclaredSymbol(q.FromClause);
 454            Assert.Equal(SymbolKind.RangeVariable, x.Kind);
 455            Assert.Equal("x", x.Name);
 456            Assert.Equal("Cast", info0.CastInfo.Symbol.Name);
 457            Assert.Equal(MethodKind.ReducedExtension, ((IMethodSymbol)info0.CastInfo.Symbol).MethodKind);
 458            Assert.Null(info0.OperationInfo.Symbol);
 459
 460            var info1 = model.GetQueryClauseInfo(q.Body.Clauses[0]);
 461            var y = model.GetDeclaredSymbol(q.Body.Clauses[0]);
 462            Assert.Equal(SymbolKind.RangeVariable, y.Kind);
 463            Assert.Equal("y", y.Name);
 464            Assert.Equal("Cast", info1.CastInfo.Symbol.Name);
 465            Assert.Equal("SelectMany", info1.OperationInfo.Symbol.Name);
 466            Assert.Equal(MethodKind.ReducedExtension, ((IMethodSymbol)info1.OperationInfo.Symbol).MethodKind);
 467
 468            var info2 = model.GetQueryClauseInfo(q.Body.Clauses[1]);
 469            var z = model.GetDeclaredSymbol(q.Body.Clauses[1]);
 470            Assert.Equal(SymbolKind.RangeVariable, z.Kind);
 471            Assert.Equal("z", z.Name);
 472            Assert.Equal("Cast", info2.CastInfo.Symbol.Name);
 473            Assert.Equal("SelectMany", info2.OperationInfo.Symbol.Name);
 474
 475            var info3 = model.GetSemanticInfoSummary(q.Body.SelectOrGroup);
 476            Assert.NotNull(info3);
 477            // what about info3's contents ???
 478
 479            var xPyPz = (q.Body.SelectOrGroup as SelectClauseSyntax).Expression as BinaryExpressionSyntax;
 480            var xPy = xPyPz.Left as BinaryExpressionSyntax;
 481            Assert.Equal(x, model.GetSemanticInfoSummary(xPy.Left).Symbol);
 482            Assert.Equal(y, model.GetSemanticInfoSummary(xPy.Right).Symbol);
 483            Assert.Equal(z, model.GetSemanticInfoSummary(xPyPz.Right).Symbol);
 484        }
 485
 486        [Fact]
 487        public void TestGetSemanticInfo01()
 488        {
 489            var csSource = @"
 490using C = List1<int>;" + LINQ + @"
 491class Query
 492{
 493    public static void Main(string[] args)
 494    {
 495        C c1 = new C(1, 2, 3);
 496        C c2 = new C(10, 20, 30);
 497        C r1 =
 498            from int x in c1
 499            from int y in c2
 500            select x + y;
 501       Console.WriteLine(r1);
 502    }
 503}";
 504            var compilation = CreateCompilationWithMscorlib(csSource);
 505            compilation.VerifyDiagnostics();
 506            var tree = compilation.SyntaxTrees[0];
 507            var model = compilation.GetSemanticModel(tree);
 508            var classC = tree.GetCompilationUnitRoot().ChildNodes().OfType<TypeDeclarationSyntax>().Where(t => t.Identifier.ValueText == "Query").Single();
 509            dynamic methodM = (MethodDeclarationSyntax)classC.Members[0];
 510            QueryExpressionSyntax q = methodM.Body.Statements[2].Declaration.Variables[0].Initializer.Value;
 511
 512            var info0 = model.GetQueryClauseInfo(q.FromClause);
 513            Assert.Equal("Cast", info0.CastInfo.Symbol.Name);
 514            Assert.Null(info0.OperationInfo.Symbol);
 515            Assert.Equal("x", model.GetDeclaredSymbol(q.FromClause).Name);
 516
 517            var info1 = model.GetQueryClauseInfo(q.Body.Clauses[0]);
 518            Assert.Equal("Cast", info1.CastInfo.Symbol.Name);
 519            Assert.Equal("SelectMany", info1.OperationInfo.Symbol.Name);
 520            Assert.Equal("y", model.GetDeclaredSymbol(q.Body.Clauses[0]).Name);
 521
 522            var info2 = model.GetSemanticInfoSummary(q.Body.SelectOrGroup);
 523            // what about info2's contents?
 524        }
 525
 526        [Fact]
 527        public void TestGetSemanticInfo02()
 528        {
 529            var csSource = LINQ + @"
 530class Query
 531{
 532    public static void Main(string[] args)
 533    {
 534        List1<int> c = new List1<int>(28, 51, 27, 84, 27, 27, 72, 64, 55, 46, 39);
 535        var r =
 536            from i in c
 537            orderby i/10 descending, i%10
 538            select i;
 539        Console.WriteLine(r);
 540    }
 541}";
 542            var compilation = CreateCompilationWithMscorlib(csSource);
 543            compilation.VerifyDiagnostics();
 544            var tree = compilation.SyntaxTrees[0];
 545            var model = compilation.GetSemanticModel(tree);
 546            var classC = tree.GetCompilationUnitRoot().ChildNodes().OfType<TypeDeclarationSyntax>().Where(t => t.Identifier.ValueText == "Query").Single();
 547            dynamic methodM = (MethodDeclarationSyntax)classC.Members[0];
 548            QueryExpressionSyntax q = methodM.Body.Statements[1].Declaration.Variables[0].Initializer.Value;
 549
 550            var info0 = model.GetQueryClauseInfo(q.FromClause);
 551            Assert.Null(info0.CastInfo.Symbol);
 552            Assert.Null(info0.OperationInfo.Symbol);
 553            Assert.Equal("i", model.GetDeclaredSymbol(q.FromClause).Name);
 554            var i = model.GetDeclaredSymbol(q.FromClause);
 555
 556            var info1 = model.GetQueryClauseInfo(q.Body.Clauses[0]);
 557            Assert.Null(info1.CastInfo.Symbol);
 558            Assert.Null(info1.OperationInfo.Symbol);
 559            Assert.Null(model.GetDeclaredSymbol(q.Body.Clauses[0]));
 560
 561            var order = q.Body.Clauses[0] as OrderByClauseSyntax;
 562            var oinfo0 = model.GetSemanticInfoSummary(order.Orderings[0]);
 563            Assert.Equal("OrderByDescending", oinfo0.Symbol.Name);
 564
 565            var oinfo1 = model.GetSemanticInfoSummary(order.Orderings[1]);
 566            Assert.Equal("ThenBy", oinfo1.Symbol.Name);
 567        }
 568
 569        [WorkItem(541774, "DevDiv")]
 570        [Fact]
 571        public void MultipleFromClauseIdentifierInExprNotInContext()
 572        {
 573            var csSource = @"
 574class Program
 575{
 576    static void Main(string[] args)
 577    {
 578        var q2 = from n1 in nums 
 579                 from n2 in nums
 580                 select n1;
 581    }
 582}";
 583            CreateCompilationWithMscorlibAndSystemCore(csSource, parseOptions: TestOptions.Regular).VerifyDiagnostics(
 584            // (6,29): error CS0103: The name 'nums' does not exist in the current context
 585                Diagnostic(ErrorCode.ERR_NameNotInContext, "nums").WithArguments("nums")
 586                );
 587        }
 588
 589        [WorkItem(541906, "DevDiv")]
 590        [Fact]
 591        public void NullLiteralFollowingJoinInQuery()
 592        {
 593            var csSource = @"
 594using System.Linq;
 595
 596class Program
 597{
 598    static void Main(string[] args)
 599    {
 600        var query = from int i in new int[]{ 1 } join null on true equals true select i; //CS1031
 601    }
 602}";
 603            CreateCompilationWithMscorlibAndSystemCore(csSource, parseOptions: TestOptions.Regular).VerifyDiagnostics(
 604                // (8,55): error CS1031: Type expected
 605                //         var query = from int i in new int[]{ 1 } join null on true equals true select i; //CS1031
 606                Diagnostic(ErrorCode.ERR_TypeExpected, "null"),
 607                // (8,55): error CS1001: Identifier expected
 608                //         var query = from int i in new int[]{ 1 } join null on true equals true select i; //CS1031
 609                Diagnostic(ErrorCode.ERR_IdentifierExpected, "null"),
 610                // (8,55): error CS1003: Syntax error, 'in' expected
 611                //         var query = from int i in new int[]{ 1 } join null on true equals true select i; //CS1031
 612                Diagnostic(ErrorCode.ERR_SyntaxError, "null").WithArguments("in", "null")
 613                );
 614        }
 615
 616        [WorkItem(541779, "DevDiv")]
 617        [Fact]
 618        public void MultipleFromClauseQueryExpr()
 619        {
 620            var csSource = @"
 621using System;
 622using System.Linq;
 623
 624class Program
 625{
 626    static void Main(string[] args)
 627    {
 628        var nums = new int[] { 3, 4 };
 629
 630        var q2 = from int n1 in nums 
 631                 from int n2 in nums
 632                 select n1;
 633
 634        string serializer = String.Empty;
 635        foreach (var q in q2)
 636        {
 637            serializer = serializer + q + "" "";
 638        }
 639        System.Console.Write(serializer.Trim());
 640    }
 641}";
 642
 643            CompileAndVerify(csSource, additionalRefs: new[] { LinqAssemblyRef }, expectedOutput: "3 3 4 4");
 644        }
 645
 646        [WorkItem(541782, "DevDiv")]
 647        [Fact]
 648        public void FromSelectQueryExprOnArraysWithTypeImplicit()
 649        {
 650            var csSource = @"
 651using System;
 652using System.Linq;
 653
 654class Program
 655{
 656    static void Main(string[] args)
 657    {
 658        var nums = new int[] { 3, 4 };
 659
 660        var q2 = from n1 in nums select n1;
 661
 662        string serializer = String.Empty;
 663        foreach (var q in q2)
 664        {
 665            serializer = serializer + q + "" "";
 666        }
 667        System.Console.Write(serializer.Trim());
 668    }
 669}";
 670            CompileAndVerify(csSource, additionalRefs: new[] { LinqAssemblyRef }, expectedOutput: "3 4");
 671        }
 672
 673
 674        [WorkItem(541788, "DevDiv")]
 675        [Fact]
 676        public void JoinClauseTest()
 677        {
 678            var csSource = @"
 679using System;
 680using System.Linq;
 681
 682class Program
 683{
 684    static void Main()
 685    {
 686        var q2 =
 687           from a in Enumerable.Range(1, 13)
 688           join b in Enumerable.Range(1, 13) on 4 * a equals b
 689           select a;
 690
 691        string serializer = String.Empty;
 692        foreach (var q in q2)
 693        {
 694            serializer = serializer + q + "" "";
 695        }
 696        System.Console.Write(serializer.Trim());
 697    }
 698}";
 699
 700            CompileAndVerify(csSource, additionalRefs: new[] { LinqAssemblyRef }, expectedOutput: "1 2 3");
 701        }
 702
 703        [WorkItem(541789, "DevDiv")]
 704        [WorkItem(9229, "DevDiv_Projects/Roslyn")]
 705        [Fact]
 706        public void WhereClauseTest()
 707        {
 708            var csSource = @"
 709using System;
 710using System.Linq;
 711
 712class Program
 713{
 714    static void Main()
 715    {
 716        var nums = new int[] { 1, 2, 3, 4 };
 717
 718        var q2 = from x in nums
 719                where (x > 2)
 720                select x;
 721
 722        string serializer = String.Empty;
 723        foreach (var q in q2)
 724        {
 725            serializer = serializer + q + "" "";
 726        }
 727        System.Console.Write(serializer.Trim());
 728    }
 729}";
 730
 731            CompileAndVerify(csSource, additionalRefs: new[] { LinqAssemblyRef }, expectedOutput: "3 4");
 732        }
 733
 734        [WorkItem(541942, "DevDiv")]
 735        [Fact]
 736        public void WhereDefinedInType()
 737        {
 738            var csSource = @"
 739using System;
 740
 741class Y
 742{
 743    public int Where(Func<int, bool> predicate)
 744    {
 745        return 45;
 746    }
 747}
 748
 749class P
 750{
 751    static void Main()
 752    {
 753        var src = new Y();
 754        var query = from x in src
 755                where x > 0
 756                select x;
 757
 758        Console.Write(query);
 759    }
 760}";
 761
 762            CompileAndVerify(csSource, additionalRefs: new[] { LinqAssemblyRef }, expectedOutput: "45");
 763        }
 764
 765        [Fact]
 766        public void GetInfoForSelectExpression01()
 767        {
 768            string sourceCode = @"
 769using System;
 770using System.Linq;
 771public class Test2
 772{
 773    public static void Main()
 774    {
 775        var nums = new int[] { 1, 2, 3, 4 };
 776
 777        var q2 = from x in nums
 778                 select x;
 779    }
 780}";
 781            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 782            var tree = compilation.SyntaxTrees[0];
 783            var semanticModel = compilation.GetSemanticModel(tree);
 784
 785            SelectClauseSyntax selectClause = (SelectClauseSyntax)tree.GetCompilationUnitRoot().FindToken(sourceCode.IndexOf("select")).Parent;
 786            var info = semanticModel.GetSemanticInfoSummary(selectClause.Expression);
 787            Assert.Equal(SpecialType.System_Int32, info.Type.SpecialType);
 788            Assert.Equal(SymbolKind.RangeVariable, info.Symbol.Kind);
 789            var info2 = semanticModel.GetSemanticInfoSummary(selectClause);
 790            var m = (MethodSymbol)info2.Symbol;
 791            Assert.Equal("Select", m.ReducedFrom.Name);
 792        }
 793
 794        [Fact]
 795        public void GetInfoForSelectExpression02()
 796        {
 797            string sourceCode = @"
 798using System;
 799using System.Linq;
 800public class Test2
 801{
 802    public static void Main()
 803    {
 804        var nums = new int[] { 1, 2, 3, 4 };
 805
 806        var q2 = from x in nums
 807                 select x into w
 808                 select w;
 809    }
 810}";
 811            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 812            var tree = compilation.SyntaxTrees[0];
 813            var semanticModel = compilation.GetSemanticModel(tree);
 814
 815            SelectClauseSyntax selectClause = (SelectClauseSyntax)tree.GetCompilationUnitRoot().FindToken(sourceCode.IndexOf("select w")).Parent;
 816            var info = semanticModel.GetSemanticInfoSummary(selectClause.Expression);
 817            Assert.Equal(SpecialType.System_Int32, info.Type.SpecialType);
 818            Assert.Equal(SymbolKind.RangeVariable, info.Symbol.Kind);
 819        }
 820
 821        [Fact]
 822        public void GetInfoForSelectExpression03()
 823        {
 824            string sourceCode = @"
 825using System.Linq;
 826public class Test2
 827{
 828    public static void Main()
 829    {
 830        var nums = new int[] { 1, 2, 3, 4 };
 831
 832        var q2 = from x in nums
 833                 select x+1 into w
 834                 select w+1;
 835    }
 836}";
 837            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 838            var tree = compilation.SyntaxTrees[0];
 839            compilation.VerifyDiagnostics();
 840            var semanticModel = compilation.GetSemanticModel(tree);
 841
 842            var e = (IdentifierNameSyntax)tree.GetCompilationUnitRoot().FindToken(sourceCode.IndexOf("x+1")).Parent;
 843            var info = semanticModel.GetSemanticInfoSummary(e);
 844            Assert.Equal(SpecialType.System_Int32, info.Type.SpecialType);
 845            Assert.Equal(SymbolKind.RangeVariable, info.Symbol.Kind);
 846            Assert.Equal("x", info.Symbol.Name);
 847
 848            e = (IdentifierNameSyntax)tree.GetCompilationUnitRoot().FindToken(sourceCode.IndexOf("w+1")).Parent;
 849            info = semanticModel.GetSemanticInfoSummary(e);
 850            Assert.Equal(SpecialType.System_Int32, info.Type.SpecialType);
 851            Assert.Equal(SymbolKind.RangeVariable, info.Symbol.Kind);
 852            Assert.Equal("w", info.Symbol.Name);
 853
 854            var e2 = e.Parent as ExpressionSyntax; // w+1
 855            var info2 = semanticModel.GetSemanticInfoSummary(e2);
 856            Assert.Equal(SpecialType.System_Int32, info2.Type.SpecialType);
 857            Assert.Equal("System.Int32 System.Int32.op_Addition(System.Int32 left, System.Int32 right)", info2.Symbol.ToTestDisplayString());
 858        }
 859
 860        [WorkItem(541806, "DevDiv")]
 861        [Fact]
 862        public void GetDeclaredSymbolForQueryContinuation()
 863        {
 864            string sourceCode = @"
 865public class Test2
 866{
 867    public static void Main()
 868    {
 869        var nums = new int[] { 1, 2, 3, 4 };
 870
 871        var q2 = from x in nums
 872                 select x into w
 873                 select w;
 874    }
 875}";
 876            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 877            var tree = compilation.SyntaxTrees[0];
 878            var semanticModel = compilation.GetSemanticModel(tree);
 879
 880            var queryContinuation = tree.GetRoot().FindToken(sourceCode.IndexOf("into w")).Parent;
 881            var symbol = semanticModel.GetDeclaredSymbol(queryContinuation);
 882            
 883            Assert.NotNull(symbol);
 884            Assert.Equal("w", symbol.Name);
 885            Assert.Equal(SymbolKind.RangeVariable, symbol.Kind);
 886        }
 887
 888        [WorkItem(541899, "DevDiv")]
 889        [Fact]
 890        public void ComputeQueryVariableType()
 891        {
 892            string sourceCode = @"
 893using System.Linq;
 894public class Test2
 895{
 896    public static void Main()
 897    {
 898        var nums = new int[] { 1, 2, 3, 4 };
 899
 900        var q2 = from x in nums
 901                 select 5;
 902    }
 903}";
 904            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 905            var tree = compilation.SyntaxTrees[0];
 906            var semanticModel = compilation.GetSemanticModel(tree);
 907            var selectExpression = tree.GetCompilationUnitRoot().FindToken(sourceCode.IndexOf("5"));
 908            var info = semanticModel.GetSpeculativeTypeInfo(selectExpression.SpanStart, SyntaxFactory.ParseExpression("x"), SpeculativeBindingOption.BindAsExpression);
 909            Assert.Equal(SpecialType.System_Int32, info.Type.SpecialType);
 910        }
 911
 912        [WorkItem(541893, "DevDiv")]
 913        [Fact]
 914        public void GetDeclaredSymbolForJoinIntoClause()
 915        {
 916            string sourceCode = @"
 917using System;
 918using System.Linq;
 919
 920static class Test
 921{
 922    static void Main()
 923    {
 924        var qie = from x3 in new int[] { 0 }
 925                      join x7 in (new int[] { 0 }) on 5 equals 5 into x8
 926                      select x8;
 927    }
 928}";
 929            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 930            var tree = compilation.SyntaxTrees[0];
 931            var semanticModel = compilation.GetSemanticModel(tree);
 932
 933            var joinInto = tree.GetRoot().FindToken(sourceCode.IndexOf("into x8")).Parent;
 934            var symbol = semanticModel.GetDeclaredSymbol(joinInto);
 935
 936            Assert.NotNull(symbol);
 937            Assert.Equal("x8", symbol.Name);
 938            Assert.Equal(SymbolKind.RangeVariable, symbol.Kind);
 939            Assert.Equal("? x8", symbol.ToTestDisplayString());
 940        }
 941
 942        [WorkItem(541982, "DevDiv")]
 943        [WorkItem(543494, "DevDiv")]
 944        [Fact()]
 945        public void GetDeclaredSymbolAddAccessorDeclIncompleteQuery()
 946        {
 947            string sourceCode = @"
 948using System;
 949using System.Linq;
 950
 951public class QueryExpressionTest
 952{
 953    public static void Main()
 954    {
 955        var expr1 = new[] { 1, 2, 3, 4, 5 };
 956
 957        var query1 = from  event in expr1 select event;
 958        var query2 = from int
 959    }
 960}";
 961            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 962            var tree = compilation.SyntaxTrees[0];
 963            var semanticModel = compilation.GetSemanticModel(tree);
 964
 965            var unknownAccessorDecls = tree.GetCompilationUnitRoot().DescendantNodes().OfType<AccessorDeclarationSyntax>();
 966            var symbols = unknownAccessorDecls.Select(decl => semanticModel.GetDeclaredSymbol(decl));
 967
 968            Assert.True(symbols.All(s => ReferenceEquals(s, null)));
 969        }
 970
 971        [WorkItem(542235, "DevDiv")]
 972        [Fact]
 973        public void TwoFromClauseFollowedBySelectClause()
 974        {
 975            string sourceCode = @"
 976using System.Linq;
 977
 978class Test
 979{
 980    public static void Main()
 981    {
 982
 983        var q2 = from num1 in new int[] { 4, 5 }
 984                 from num2 in new int[] { 4, 5 }
 985                 select num1;
 986    }
 987}";
 988            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
 989            var tree = compilation.SyntaxTrees[0];
 990            var semanticModel = compilation.GetSemanticModel(tree);
 991
 992            var selectClause = tree.GetCompilationUnitRoot().DescendantNodes().Where(n => n.IsKind(SyntaxKind.SelectClause)).Single() as SelectClauseSyntax;
 993            var fromClause1 = tree.GetCompilationUnitRoot().DescendantNodes().Where(n => (n.IsKind(SyntaxKind.FromClause)) && (n.ToString().Contains("num1"))).Single() as FromClauseSyntax;
 994            var fromClause2 = tree.GetCompilationUnitRoot().DescendantNodes().Where(n => (n.IsKind(SyntaxKind.FromClause)) && (n.ToString().Contains("num2"))).Single() as FromClauseSyntax;
 995
 996            var symbolInfoForSelect = semanticModel.GetSemanticInfoSummary(selectClause);
 997            var queryInfoForFrom1 = semanticModel.GetQueryClauseInfo(fromClause1);
 998            var queryInfoForFrom2 = semanticModel.GetQueryClauseInfo(fromClause2);
 999
1000            Assert.Null(queryInfoForFrom1.CastInfo.Symbol);
1001            Assert.Null(queryInfoForFrom1.OperationInfo.Symbol);
1002
1003            Assert.Null(queryInfoForFrom2.CastInfo.Symbol);
1004            Assert.Equal("SelectMany", queryInfoForFrom2.OperationInfo.Symbol.Name);
1005
1006            Assert.Null(symbolInfoForSelect.Symbol);
1007            Assert.Empty(symbolInfoForSelect.CandidateSymbols);
1008            Assert.Equal(CandidateReason.None, symbolInfoForSelect.CandidateReason);
1009        }
1010
1011        [WorkItem(528747, "DevDiv")]
1012        [Fact]
1013        public void SemanticInfoForOrderingClauses()
1014        {
1015            string sourceCode = @"
1016using System;
1017using System.Linq;
1018
1019public class QueryExpressionTest
1020{
1021    public static void Main()
1022    {
1023        var q1 =
1024            from x in new int[] { 4, 5 }
1025            orderby
1026                x descending,
1027                x.ToString() ascending,
1028                x descending
1029            select x;
1030    }
1031}";
1032            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1033            var tree = compilation.SyntaxTrees[0];
1034            var model = compilation.GetSemanticModel(tree);
1035            int count = 0;
1036            string[] names = { "OrderByDescending", "ThenBy", "ThenByDescending" };
1037            foreach (var ordering in tree.GetCompilationUnitRoot().DescendantNodes().OfType<OrderingSyntax>())
1038            {
1039                var symbolInfo = model.GetSemanticInfoSummary(ordering);
1040                Assert.Equal(names[count++], symbolInfo.Symbol.Name);
1041            }
1042            Assert.Equal(3, count);
1043        }
1044
1045        [WorkItem(542266, "DevDiv")]
1046        [Fact]
1047        public void FromOrderBySelectQueryTranslation()
1048        {
1049            string sourceCode = @"
1050using System;
1051using System.Collections;
1052using System.Collections.Generic;
1053
1054public interface IOrderedEnumerable<TElement> : IEnumerable<TElement>,
1055    IEnumerable
1056{
1057}
1058
1059public static class Extensions
1060{
1061    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
1062    this IEnumerable<TSource> source,
1063    Func<TSource, TKey> keySelector)
1064
1065    {
1066        return null;
1067    }
1068
1069    public static IEnumerable<TResult> Select<TSource, TResult>(
1070    this IEnumerable<TSource> source,
1071    Func<TSource, TResult> selector)
1072
1073    {
1074        return null;
1075    }
1076}
1077
1078class Program
1079{
1080    static void Main(string[] args)
1081    {        
1082
1083        var q1 = from num in new int[] { 4, 5 }
1084                 orderby num
1085                 select num;
1086    }
1087}";
1088            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1089            var tree = compilation.SyntaxTrees[0];
1090            var semanticModel = compilation.GetSemanticModel(tree);
1091
1092            var selectClause = tree.GetCompilationUnitRoot().DescendantNodes().Where(n => n.IsKind(SyntaxKind.SelectClause)).Single() as SelectClauseSyntax;
1093            var symbolInfoForSelect = semanticModel.GetSemanticInfoSummary(selectClause);
1094
1095            Assert.Null(symbolInfoForSelect.Symbol);
1096        }
1097
1098        [WorkItem(528756, "DevDiv")]
1099        [Fact]
1100        public void FromWhereSelectTranslation()
1101        {
1102            string sourceCode = @"
1103using System;
1104using System.Collections.Generic;
1105
1106public static class Extensions
1107{
1108
1109    public static IEnumerable<TSource> Where<TSource>(
1110    this IEnumerable<TSource> source,
1111    Func<TSource, bool> predicate)
1112    {
1113        return null;
1114    }
1115}
1116
1117class Program
1118{
1119    static void Main(string[] args)
1120    {
1121
1122        var q1 = from num in System.Linq.Enumerable.Range(4, 5).Where(n => n > 10)
1123                 select num;
1124    }
1125}";
1126            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1127            var tree = compilation.SyntaxTrees[0];
1128            var semanticModel = compilation.GetSemanticModel(tree);
1129
1130            semanticModel.GetDiagnostics().Verify(
1131                // (21,30): error CS1935: Could not find an implementation of the query pattern for source type 'System.Collections.Generic.IEnumerable<int>'.  'Select' not found.  Are you missing a reference to 'System.Core.dll' or a using directive for 'System.Linq'?
1132                //         var q1 = from num in System.Linq.Enumerable.Range(4, 5).Where(n => n > 10)
1133                Diagnostic(ErrorCode.ERR_QueryNoProviderStandard, "System.Linq.Enumerable.Range(4, 5).Where(n => n > 10)").WithArguments("System.Collections.Generic.IEnumerable<int>", "Select"));
1134        }
1135
1136        [WorkItem(528760, "DevDiv")]
1137        [Fact]
1138        public void FromJoinSelectTranslation()
1139        {
1140            string sourceCode = @"
1141using System.Linq;
1142
1143class Program
1144{
1145    static void Main(string[] args)
1146    {
1147        var q1 = from num in new int[] { 4, 5 }
1148                 join x1 in new int[] { 4, 5 } on num equals x1
1149                 select x1 + 5;
1150    }
1151}";
1152            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1153            var tree = compilation.SyntaxTrees[0];
1154            var semanticModel = compilation.GetSemanticModel(tree);
1155
1156            var selectClause = tree.GetCompilationUnitRoot().DescendantNodes().Where(n => n.IsKind(SyntaxKind.SelectClause)).Single() as SelectClauseSyntax;
1157            var symbolInfoForSelect = semanticModel.GetSemanticInfoSummary(selectClause);
1158
1159            Assert.Null(symbolInfoForSelect.Symbol);
1160        }
1161
1162        [WorkItem(528761, "DevDiv")]
1163        [WorkItem(544585, "DevDiv")]
1164        [Fact]
1165        public void OrderingSyntaxWithOverloadResolutionFailure()
1166        {
1167            string sourceCode = @"
1168using System.Linq;
1169
1170class Program
1171{
1172    static void Main(string[] args)
1173    {
1174        int[] numbers = new int[] { 4, 5 };
1175
1176        var q1 = from num in numbers.Single()
1177                 orderby (x1) => x1.ToString()
1178                 select num;
1179    }
1180}";
1181
1182            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1183            compilation.VerifyDiagnostics(
1184                // (10,30): error CS1936: Could not find an implementation of the query pattern for source type 'int'.  'OrderBy' not found.
1185                //         var q1 = from num in numbers.Single()
1186                Diagnostic(ErrorCode.ERR_QueryNoProvider, "numbers.Single()").WithArguments("int", "OrderBy")
1187                );
1188            var tree = compilation.SyntaxTrees[0];
1189            var semanticModel = compilation.GetSemanticModel(tree);
1190
1191            var orderingClause = tree.GetCompilationUnitRoot().DescendantNodes().Where(n => n.IsKind(SyntaxKind.AscendingOrdering)).Single() as OrderingSyntax;
1192            var symbolInfoForOrdering = semanticModel.GetSemanticInfoSummary(orderingClause);
1193
1194            Assert.Null(symbolInfoForOrdering.Symbol);
1195        }
1196
1197        [WorkItem(542292, "DevDiv")]
1198        [Fact]
1199        public void EmitIncompleteQueryWithSyntaxErrors()
1200        {
1201            string sourceCode = @"
1202using System.Linq;
1203
1204class Program
1205{
1206    static int Main()
1207    {
1208        int [] foo = new int [] {1};
1209        var q = from x in foo
1210                select x + 1 into z
1211                    select z.T
1212";
1213            using (var output = new MemoryStream())
1214            {
1215                Assert.False(CreateCompilationWithMscorlibAndSystemCore(sourceCode).Emit(output).Success);
1216            }
1217        }
1218
1219        [WorkItem(542294, "DevDiv")]
1220        [Fact]
1221        public void EmitQueryWithBindErrors()
1222        {
1223            string sourceCode = @"
1224using System.Linq;
1225class Program
1226{
1227    static void Main()
1228    {
1229        int[] nums = { 0, 1, 2, 3, 4, 5 };
1230        var query = from num in nums
1231                    let num = 3 // CS1930
1232                    select num; 
1233    }
1234}";
1235            using (var output = new MemoryStream())
1236            {
1237                Assert.False(CreateCompilationWithMscorlibAndSystemCore(sourceCode).Emit(output).Success);
1238            }
1239        }
1240
1241        [WorkItem(542372, "DevDiv")]
1242        [Fact]
1243        public void BindToIncompleteSelectManyDecl()
1244        {
1245            string sourceCode = @"
1246class P
1247{
1248    static C<X> M2<X>(X x)
1249    {
1250        return new C<X>(x);
1251    }
1252
1253    static void Main()
1254    {
1255        C<int> e1 = new C<int>(1);
1256
1257        var q = from x1 in M2<int>(x1)
1258                from x2 in e1
1259                select x1;
1260    }
1261}
1262
1263class C<T>
1264{
1265    public C<V> SelectMany";
1266
1267            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1268            var tree = compilation.SyntaxTrees[0];
1269            var semanticModel = compilation.GetSemanticModel(tree);
1270
1271            var diags = semanticModel.GetDiagnostics();
1272
1273            Assert.NotEmpty(diags);
1274        }
1275
1276        [WorkItem(542419, "DevDiv")]
1277        [Fact]
1278        public void BindIdentifierInWhereErrorTolerance()
1279        {
1280            string sourceCode = @"
1281using System;
1282using System.Collections.Generic;
1283using System.Linq;
1284
1285class Program
1286{
1287    static void Main(string[] args)
1288    {
1289        var r = args.Where(b => b < > );
1290        var q = from a in args
1291                where a <> 
1292    }
1293}";
1294
1295            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1296            var tree = compilation.SyntaxTrees[0];
1297            var semanticModel = compilation.GetSemanticModel(tree);
1298            var diags = semanticModel.GetDiagnostics();
1299            Assert.NotEmpty(diags);
1300        }
1301
1302        [WorkItem(542460, "DevDiv")]
1303        [Fact]
1304        public void QueryWithMultipleParseErrorsAndInteractiveParseOption()
1305        {
1306            string sourceCode = @"
1307using System;
1308using System.Linq;
1309
1310public class QueryExpressionTest
1311{
1312    public static void Main()
1313    {
1314        var expr1 = new int[] { 1, 2, 3, 4, 5 };
1315
1316        var query2 = from int namespace in expr1 select namespace;
1317        var query25 = from i in expr1 let namespace = expr1 select i;
1318    }
1319}";
1320
1321            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode, parseOptions: TestOptions.Interactive);
1322            var tree = compilation.SyntaxTrees[0];
1323            var semanticModel = compilation.GetSemanticModel(tree);
1324            var queryExpr = tree.GetCompilationUnitRoot().DescendantNodes().OfType<QueryExpressionSyntax>().Where(x => x.ToFullString() == "from i in expr1 let ").Single();
1325            var symbolInfo = semanticModel.GetSemanticInfoSummary(queryExpr);
1326
1327            Assert.Null(symbolInfo.Symbol);
1328        }
1329
1330        [WorkItem(542496, "DevDiv")]
1331        [Fact]
1332        public void QueryExpressionInFieldInitReferencingAnotherFieldWithInteractiveParseOption()
1333        {
1334            string sourceCode = @"
1335using System.Linq;
1336using System.Collections;
1337
1338class P
1339{
1340    double one = 1;
1341
1342    public IEnumerable e = 
1343               from x in new int[] { 1, 2, 3 }
1344               select x + one;
1345}";
1346
1347            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode, parseOptions: TestOptions.Interactive);
1348            var tree = compilation.SyntaxTrees[0];
1349            var semanticModel = compilation.GetSemanticModel(tree);
1350            var queryExpr = tree.GetCompilationUnitRoot().DescendantNodes().OfType<QueryExpressionSyntax>().Single();
1351            var symbolInfo = semanticModel.GetSemanticInfoSummary(queryExpr);
1352
1353            Assert.Null(symbolInfo.Symbol);
1354        }
1355
1356        [WorkItem(542559, "DevDiv")]
1357        [Fact]
1358        public void StaticTypeInFromClause()
1359        {
1360            string sourceCode = @"
1361using System;
1362using System.Linq;
1363
1364class C
1365{
1366    static void Main()
1367    {
1368        var q2 = string.Empty.Cast<GC>().Select(x => x);
1369        var q1 = from GC x in string.Empty select x;
1370    }
1371}";
1372            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1373            compilation.VerifyDiagnostics(
1374                // (9,36): error CS0718: 'System.GC': static types cannot be used as type arguments
1375                //         var q2 = string.Empty.Cast<GC>().Select(x => x);
1376                Diagnostic(ErrorCode.ERR_GenericArgIsStaticClass, "GC").WithArguments("System.GC").WithLocation(9,36),
1377                // (10,23): error CS0718: 'System.GC': static types cannot be used as type arguments
1378                //         var q1 = from GC x in string.Empty select x;
1379                Diagnostic(ErrorCode.ERR_GenericArgIsStaticClass, "GC").WithArguments("System.GC").WithLocation(10,23)
1380                );
1381        }
1382
1383        [WorkItem(542560, "DevDiv")]
1384        [Fact]
1385        public void MethodGroupInFromClause()
1386        {
1387            string sourceCode = @"
1388class Program
1389{
1390    static void Main()
1391    {
1392        var q1 = from y in Main select y;
1393        var q2 = Main.Select(y => y);
1394    }
1395}";
1396            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1397            compilation.VerifyDiagnostics(
1398                // (6,28): error CS0119: 'Program.Main()' is a method, which is not valid in the given context
1399                //         var q1 = from y in Main select y;
1400                Diagnostic(ErrorCode.ERR_BadSKunknown, "Main").WithArguments("Program.Main()", "method").WithLocation(6,28),
1401                // (7,18): error CS0119: 'Program.Main()' is a method, which is not valid in the given context
1402                //         var q2 = Main.Select(y => y);
1403                Diagnostic(ErrorCode.ERR_BadSKunknown, "Main").WithArguments("Program.Main()", "method").WithLocation(7,18)
1404                );
1405        }
1406
1407        [WorkItem(542558, "DevDiv")]
1408        [Fact]
1409        public void SelectFromType01()
1410        {
1411            string sourceCode = @"using System;
1412using System.Collections.Generic;
1413 
1414class C
1415{
1416    static void Main()
1417    {
1418        var q = from x in C select x;
1419    }
1420
1421    static IEnumerable<T> Select<T>(Func<int, T> f) { return null; }
1422}";
1423            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1424            compilation.VerifyDiagnostics();
1425            var tree = compilation.SyntaxTrees[0];
1426            var model = compilation.GetSemanticModel(tree);
1427            var classC = tree.GetCompilationUnitRoot().ChildNodes().OfType<TypeDeclarationSyntax>().Where(t => t.Identifier.ValueText == "C").Single();
1428            dynamic main = (MethodDeclarationSyntax)classC.Members[0];
1429            QueryExpressionSyntax q = main.Body.Statements[0].Declaration.Variables[0].Initializer.Value;
1430            var info0 = model.GetQueryClauseInfo(q.FromClause);
1431            var x = model.GetDeclaredSymbol(q.FromClause);
1432            Assert.Equal(SymbolKind.RangeVariable, x.Kind);
1433            Assert.Equal("x", x.Name);
1434            Assert.Equal(null, info0.CastInfo.Symbol);
1435            Assert.Null(info0.OperationInfo.Symbol);
1436            var infoSelect = model.GetSemanticInfoSummary(q.Body.SelectOrGroup);
1437            Assert.Equal("Select", infoSelect.Symbol.Name);
1438        }
1439
1440        [WorkItem(542558, "DevDiv")]
1441        [Fact]
1442        public void SelectFromType02()
1443        {
1444            string sourceCode = @"using System;
1445using System.Collections.Generic;
1446 
1447class C
1448{
1449    static void Main()
1450    {
1451        var q = from x in C select x;
1452    }
1453
1454    static Func<Func<int, object>, IEnumerable<object>> Select = null;
1455}";
1456            var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
1457            compilation.VerifyDiagnostics();
1458            var tree = compilation.SyntaxTrees[0];
1459            var model = compilation.GetSemanticModel(tree);
1460            var classC = tree.GetCompilationUnitRoot().ChildNodes().OfType<TypeDeclarationSyntax>().Where(t => t.Identifier.ValueText == "C").Single();
1461            dynamic main = (MethodDeclarationSyntax)classC.Members[0];
1462            QueryExpressionSyntax q = main.Body.Statements[0].Declaration.Variables[0].Initializer.Value;
1463            var info0 = model.GetQueryClauseInfo(q.FromClause);
1464            var x = model.GetDeclaredSymbol(q.FromClause);
1465            Assert.Equal(SymbolKind.RangeVariable, x.Kind);
1466            Assert.Equal("x", x.Name);
1467            Assert.Equal(null, info0.CastInfo.Symbol);
1468            Assert.Null(info0.OperationInfo.Symbol);
1469            var infoSelect = model.GetSemanticInfoSummary(q.Body.SelectOrGroup);
1470            Assert.Equal("Invoke", infoSelect.Symbol.Name);
1471        }
1472
1473        [WorkItem(542624, "DevDiv")]
1474        [Fact]
1475        public void QueryColorColor()
1476        {
1477            string sourceCode = @"
1478using System;
1479using System.Collections.Generic;
1480
1481class Color
1482{
1483    public static IEnumerable<T> Sele

Large files files are truncated, but you can click here to view the full file