PageRenderTime 176ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 3ms

/Src/Compilers/CSharp/Test/Symbol/Compilation/SemanticModelGetSemanticInfoTests.cs

https://github.com/EkardNT/Roslyn
C# | 14316 lines | 12454 code | 1797 blank | 65 comment | 2 complexity | b50c7b40e0c17e90b05a8fb0ebd9f65c MD5 | raw 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. using System;
  3. using System.Collections.Immutable;
  4. using System.Linq;
  5. using Microsoft.CodeAnalysis.CSharp.Symbols;
  6. using Microsoft.CodeAnalysis.CSharp.Syntax;
  7. using Microsoft.CodeAnalysis.Text;
  8. using Roslyn.Test.Utilities;
  9. using Xunit;
  10. // Note: the easiest way to create new unit tests that use GetSemanticInfo
  11. // is to use the SemanticInfo unit test generate in Editor Test App.
  12. namespace Microsoft.CodeAnalysis.CSharp.UnitTests
  13. {
  14. using Utils = CompilationUtils;
  15. using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
  16. public class GetExtendedSemanticInfoTests : SemanticModelTestBase
  17. {
  18. [Fact]
  19. public void FailedOverloadResolution()
  20. {
  21. string sourceCode = @"
  22. class Program
  23. {
  24. static void Main(string[] args)
  25. {
  26. int i = 8;
  27. int j = i + q;
  28. /*<bind>*/X.f/*</bind>*/(""hello"");
  29. }
  30. }
  31. class X
  32. {
  33. public static void f() { }
  34. public static void f(int i) { }
  35. }
  36. ";
  37. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  38. Assert.Null(semanticInfo.Type);
  39. Assert.Null(semanticInfo.ConvertedType);
  40. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  41. Assert.Null(semanticInfo.Symbol);
  42. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  43. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  44. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  45. Assert.Equal("void X.f()", sortedCandidates[0].ToTestDisplayString());
  46. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  47. Assert.Equal("void X.f(System.Int32 i)", sortedCandidates[1].ToTestDisplayString());
  48. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  49. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  50. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  51. Assert.Equal("void X.f()", sortedMethodGroup[0].ToTestDisplayString());
  52. Assert.Equal("void X.f(System.Int32 i)", sortedMethodGroup[1].ToTestDisplayString());
  53. Assert.False(semanticInfo.IsCompileTimeConstant);
  54. }
  55. [Fact]
  56. public void SimpleGenericType()
  57. {
  58. string sourceCode = @"
  59. using System;
  60. class Program
  61. {
  62. /*<bind>*/K<int>/*</bind>*/ f;
  63. }
  64. class K<T>
  65. { }
  66. ";
  67. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  68. Assert.Equal("K<System.Int32>", semanticInfo.Type.ToTestDisplayString());
  69. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  70. Assert.Equal("K<System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  71. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  72. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  73. Assert.Equal("K<System.Int32>", semanticInfo.Symbol.ToTestDisplayString());
  74. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  75. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  76. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  77. Assert.False(semanticInfo.IsCompileTimeConstant);
  78. }
  79. [Fact]
  80. public void WrongArity1()
  81. {
  82. string sourceCode = @"
  83. using System;
  84. class Program
  85. {
  86. /*<bind>*/K<int, string>/*</bind>*/ f;
  87. }
  88. class K<T>
  89. { }
  90. ";
  91. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  92. Assert.Equal("K<T>", semanticInfo.Type.ToTestDisplayString());
  93. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  94. Assert.Equal("K<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  95. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  96. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  97. Assert.Null(semanticInfo.Symbol);
  98. Assert.Equal(CandidateReason.WrongArity, semanticInfo.CandidateReason);
  99. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  100. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  101. Assert.Equal("K<T>", sortedCandidates[0].ToTestDisplayString());
  102. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  103. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  104. Assert.False(semanticInfo.IsCompileTimeConstant);
  105. }
  106. [Fact]
  107. public void WrongArity2()
  108. {
  109. string sourceCode = @"
  110. using System;
  111. class Program
  112. {
  113. /*<bind>*/K/*</bind>*/ f;
  114. }
  115. class K<T>
  116. { }
  117. ";
  118. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  119. Assert.Equal("K<T>", semanticInfo.Type.ToTestDisplayString());
  120. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  121. Assert.Equal("K<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  122. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  123. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  124. Assert.Null(semanticInfo.Symbol);
  125. Assert.Equal(CandidateReason.WrongArity, semanticInfo.CandidateReason);
  126. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  127. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  128. Assert.Equal("K<T>", sortedCandidates[0].ToTestDisplayString());
  129. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  130. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  131. Assert.False(semanticInfo.IsCompileTimeConstant);
  132. }
  133. [Fact]
  134. public void WrongArity3()
  135. {
  136. string sourceCode = @"
  137. using System;
  138. class Program
  139. {
  140. static void Main()
  141. {
  142. /*<bind>*/K<int, int>/*</bind>*/.f();
  143. }
  144. }
  145. class K<T>
  146. {
  147. void f() { }
  148. }
  149. ";
  150. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  151. Assert.Equal("K<T>", semanticInfo.Type.ToTestDisplayString());
  152. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  153. Assert.Equal("K<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  154. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  155. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  156. Assert.Null(semanticInfo.Symbol);
  157. Assert.Equal(CandidateReason.WrongArity, semanticInfo.CandidateReason);
  158. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  159. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  160. Assert.Equal("K<T>", sortedCandidates[0].ToTestDisplayString());
  161. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  162. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  163. Assert.False(semanticInfo.IsCompileTimeConstant);
  164. }
  165. [Fact]
  166. public void WrongArity4()
  167. {
  168. string sourceCode = @"
  169. using System;
  170. class Program
  171. {
  172. static K Main()
  173. {
  174. /*<bind>*/K/*</bind>*/.f();
  175. }
  176. }
  177. class K<T>
  178. {
  179. void f() { }
  180. }
  181. ";
  182. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  183. Assert.Equal("K<T>", semanticInfo.Type.ToTestDisplayString());
  184. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  185. Assert.Equal("K<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  186. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  187. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  188. Assert.Null(semanticInfo.Symbol);
  189. Assert.Equal(CandidateReason.WrongArity, semanticInfo.CandidateReason);
  190. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  191. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  192. Assert.Equal("K<T>", sortedCandidates[0].ToTestDisplayString());
  193. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  194. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  195. Assert.False(semanticInfo.IsCompileTimeConstant);
  196. }
  197. [Fact]
  198. public void NotInvocable()
  199. {
  200. string sourceCode = @"
  201. using System;
  202. class Program
  203. {
  204. static void Main()
  205. {
  206. K./*<bind>*/f/*</bind>*/();
  207. }
  208. }
  209. class K
  210. {
  211. public int f;
  212. }
  213. ";
  214. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  215. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  216. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  217. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  218. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  219. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  220. Assert.Null(semanticInfo.Symbol);
  221. Assert.Equal(CandidateReason.NotInvocable, semanticInfo.CandidateReason);
  222. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  223. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  224. Assert.Equal("System.Int32 K.f", sortedCandidates[0].ToTestDisplayString());
  225. Assert.Equal(SymbolKind.Field, sortedCandidates[0].Kind);
  226. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  227. Assert.False(semanticInfo.IsCompileTimeConstant);
  228. }
  229. [Fact]
  230. public void InaccessibleField()
  231. {
  232. string sourceCode = @"
  233. class Program
  234. {
  235. static void Main()
  236. {
  237. K./*<bind>*/f/*</bind>*/ = 3;
  238. }
  239. }
  240. class K
  241. {
  242. private int f;
  243. }
  244. ";
  245. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  246. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  247. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  248. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  249. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  250. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  251. Assert.Null(semanticInfo.Symbol);
  252. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  253. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  254. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  255. Assert.Equal("System.Int32 K.f", sortedCandidates[0].ToTestDisplayString());
  256. Assert.Equal(SymbolKind.Field, sortedCandidates[0].Kind);
  257. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  258. Assert.False(semanticInfo.IsCompileTimeConstant);
  259. }
  260. [Fact]
  261. public void InaccessibleFieldAssignment()
  262. {
  263. string sourceCode =
  264. @"class A
  265. {
  266. string F;
  267. }
  268. class B
  269. {
  270. static void M(A a)
  271. {
  272. /*<bind>*/a.F/*</bind>*/ = string.Empty;
  273. }
  274. }";
  275. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  276. Assert.Equal(SpecialType.System_String, semanticInfo.Type.SpecialType);
  277. var symbol = semanticInfo.Symbol;
  278. Assert.Null(symbol);
  279. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  280. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  281. symbol = semanticInfo.CandidateSymbols[0];
  282. Assert.Equal("System.String A.F", symbol.ToTestDisplayString());
  283. Assert.Equal(SymbolKind.Field, symbol.Kind);
  284. }
  285. [WorkItem(542481, "DevDiv")]
  286. [Fact]
  287. public void InaccessibleBaseClassConstructor01()
  288. {
  289. string sourceCode = @"
  290. namespace Test
  291. {
  292. public class Base
  293. {
  294. protected Base() { }
  295. }
  296. public class Derived : Base
  297. {
  298. void M()
  299. {
  300. Base b = /*<bind>*/new Base()/*</bind>*/;
  301. }
  302. }
  303. }";
  304. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  305. Assert.Null(semanticInfo.Symbol);
  306. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  307. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  308. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  309. Assert.Equal("Test.Base..ctor()", sortedCandidates[0].ToTestDisplayString());
  310. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  311. }
  312. [WorkItem(542481, "DevDiv")]
  313. [Fact]
  314. public void InaccessibleBaseClassConstructor02()
  315. {
  316. string sourceCode = @"
  317. namespace Test
  318. {
  319. public class Base
  320. {
  321. protected Base() { }
  322. }
  323. public class Derived : Base
  324. {
  325. void M()
  326. {
  327. Base b = new /*<bind>*/Base/*</bind>*/();
  328. }
  329. }
  330. }";
  331. var semanticInfo = GetSemanticInfoForTest<NameSyntax>(sourceCode);
  332. Assert.Null(semanticInfo.Type);
  333. Assert.Null(semanticInfo.ConvertedType);
  334. Assert.Equal("Test.Base", semanticInfo.Symbol.ToTestDisplayString());
  335. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  336. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  337. Assert.Equal(0, semanticInfo.MemberGroup.Length);
  338. }
  339. [Fact]
  340. public void InaccessibleFieldMethodArg()
  341. {
  342. string sourceCode =
  343. @"class A
  344. {
  345. string F;
  346. }
  347. class B
  348. {
  349. static void M(A a)
  350. {
  351. M(/*<bind>*/a.F/*</bind>*/);
  352. }
  353. static void M(string s) { }
  354. }";
  355. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  356. Assert.Equal(SpecialType.System_String, semanticInfo.Type.SpecialType);
  357. var symbol = semanticInfo.Symbol;
  358. Assert.Null(symbol);
  359. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  360. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  361. symbol = semanticInfo.CandidateSymbols[0];
  362. Assert.Equal("System.String A.F", symbol.ToTestDisplayString());
  363. Assert.Equal(SymbolKind.Field, symbol.Kind);
  364. }
  365. [Fact]
  366. public void TypeNotAVariable()
  367. {
  368. string sourceCode = @"
  369. using System;
  370. class Program
  371. {
  372. static void Main()
  373. {
  374. /*<bind>*/K/*</bind>*/ = 12;
  375. }
  376. }
  377. class K
  378. {
  379. }
  380. ";
  381. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  382. Assert.Equal("K", semanticInfo.Type.ToTestDisplayString());
  383. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  384. Assert.Equal("K", semanticInfo.ConvertedType.ToTestDisplayString());
  385. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  386. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  387. Assert.Null(semanticInfo.Symbol);
  388. Assert.Equal(CandidateReason.NotAVariable, semanticInfo.CandidateReason);
  389. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  390. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  391. Assert.Equal("K", sortedCandidates[0].ToTestDisplayString());
  392. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  393. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  394. Assert.False(semanticInfo.IsCompileTimeConstant);
  395. }
  396. [Fact]
  397. public void InaccessibleType1()
  398. {
  399. string sourceCode = @"
  400. using System;
  401. class Program
  402. {
  403. static void Main()
  404. {
  405. /*<bind>*/K.J/*</bind>*/ = v;
  406. }
  407. }
  408. class K
  409. {
  410. protected class J { }
  411. }
  412. ";
  413. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  414. Assert.Equal("?", semanticInfo.Type.ToTestDisplayString());
  415. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  416. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  417. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  418. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  419. Assert.Null(semanticInfo.Symbol);
  420. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  421. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  422. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  423. Assert.Equal("K.J", sortedCandidates[0].ToTestDisplayString());
  424. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  425. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  426. Assert.False(semanticInfo.IsCompileTimeConstant);
  427. }
  428. [Fact]
  429. public void AmbiguousTypesBetweenUsings1()
  430. {
  431. string sourceCode = @"
  432. using System;
  433. using N1;
  434. using N2;
  435. class Program
  436. {
  437. /*<bind>*/A/*</bind>*/ field;
  438. }
  439. namespace N1
  440. {
  441. class A { }
  442. }
  443. namespace N2
  444. {
  445. class A { }
  446. }
  447. ";
  448. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  449. Assert.Equal("N1.A", semanticInfo.Type.ToTestDisplayString());
  450. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  451. Assert.Equal("N1.A", semanticInfo.ConvertedType.ToTestDisplayString());
  452. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  453. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  454. Assert.Null(semanticInfo.Symbol);
  455. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  456. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  457. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  458. Assert.Equal("N1.A", sortedCandidates[0].ToTestDisplayString());
  459. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  460. Assert.Equal("N2.A", sortedCandidates[1].ToTestDisplayString());
  461. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  462. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  463. Assert.False(semanticInfo.IsCompileTimeConstant);
  464. }
  465. [Fact]
  466. public void AmbiguousTypesBetweenUsings2()
  467. {
  468. string sourceCode = @"
  469. using System;
  470. using N1;
  471. using N2;
  472. class Program
  473. {
  474. void f()
  475. {
  476. /*<bind>*/A/*</bind>*/.g();
  477. }
  478. }
  479. namespace N1
  480. {
  481. class A { }
  482. }
  483. namespace N2
  484. {
  485. class A { }
  486. }
  487. ";
  488. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  489. Assert.Equal("N1.A", semanticInfo.Type.ToTestDisplayString());
  490. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  491. Assert.Equal("N1.A", semanticInfo.ConvertedType.ToTestDisplayString());
  492. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  493. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  494. Assert.Null(semanticInfo.Symbol);
  495. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  496. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  497. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  498. Assert.Equal("N1.A", sortedCandidates[0].ToTestDisplayString());
  499. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  500. Assert.Equal("N2.A", sortedCandidates[1].ToTestDisplayString());
  501. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  502. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  503. Assert.False(semanticInfo.IsCompileTimeConstant);
  504. }
  505. [Fact]
  506. public void AmbiguousTypesBetweenUsings3()
  507. {
  508. string sourceCode = @"
  509. using System;
  510. using N1;
  511. using N2;
  512. class Program
  513. {
  514. void f()
  515. {
  516. /*<bind>*/A<int>/*</bind>*/.g();
  517. }
  518. }
  519. namespace N1
  520. {
  521. class A<T> { }
  522. }
  523. namespace N2
  524. {
  525. class A<U> { }
  526. }
  527. ";
  528. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  529. Assert.Equal("N1.A<System.Int32>", semanticInfo.Type.ToTestDisplayString());
  530. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  531. Assert.Equal("N1.A<System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  532. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  533. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  534. Assert.Null(semanticInfo.Symbol);
  535. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  536. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  537. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  538. Assert.Equal("N1.A<T>", sortedCandidates[0].ToTestDisplayString());
  539. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  540. Assert.Equal("N2.A<U>", sortedCandidates[1].ToTestDisplayString());
  541. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  542. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  543. Assert.False(semanticInfo.IsCompileTimeConstant);
  544. }
  545. [Fact]
  546. public void AmbiguityBetweenInterfaceMembers()
  547. {
  548. string sourceCode = @"
  549. using System;
  550. using System.Collections.Generic;
  551. using System.Linq;
  552. using System.Text;
  553. interface I1
  554. {
  555. public int P { get; }
  556. }
  557. interface I2
  558. {
  559. public string P { get; }
  560. }
  561. interface I3 : I1, I2
  562. { }
  563. public class Class1
  564. {
  565. void f()
  566. {
  567. I3 x = null;
  568. int o = x./*<bind>*/P/*</bind>*/;
  569. }
  570. }
  571. ";
  572. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  573. Assert.Equal("I1.P", semanticInfo.Type.ToTestDisplayString());
  574. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  575. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  576. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  577. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  578. Assert.Null(semanticInfo.Symbol);
  579. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  580. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  581. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  582. Assert.Equal("System.Int32 I1.P { get; }", sortedCandidates[0].ToTestDisplayString());
  583. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  584. Assert.Equal("System.String I2.P { get; }", sortedCandidates[1].ToTestDisplayString());
  585. Assert.Equal(SymbolKind.Property, sortedCandidates[1].Kind);
  586. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  587. Assert.False(semanticInfo.IsCompileTimeConstant);
  588. }
  589. [Fact]
  590. public void Alias1()
  591. {
  592. string sourceCode = @"
  593. using O = System.Object;
  594. partial class A : /*<bind>*/O/*</bind>*/ {}
  595. ";
  596. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  597. Assert.Equal("System.Object", semanticInfo.Type.ToTestDisplayString());
  598. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  599. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  600. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  601. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  602. Assert.NotNull(semanticInfo.Symbol);
  603. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  604. var aliasInfo = GetAliasInfoForTest(sourceCode);
  605. Assert.NotNull(aliasInfo);
  606. Assert.Equal("O=System.Object", aliasInfo.ToTestDisplayString());
  607. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  608. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  609. Assert.False(semanticInfo.IsCompileTimeConstant);
  610. }
  611. [Fact]
  612. public void Alias2()
  613. {
  614. string sourceCode = @"
  615. using O = System.Object;
  616. partial class A {
  617. void f()
  618. {
  619. /*<bind>*/O/*</bind>*/.ReferenceEquals(null, null);
  620. }
  621. }
  622. ";
  623. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  624. var aliasInfo = GetAliasInfoForTest(sourceCode);
  625. Assert.Equal("System.Object", semanticInfo.Type.ToTestDisplayString());
  626. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  627. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  628. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  629. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  630. Assert.NotNull(semanticInfo.Symbol);
  631. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  632. Assert.Equal("O=System.Object", aliasInfo.ToTestDisplayString());
  633. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  634. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  635. Assert.False(semanticInfo.IsCompileTimeConstant);
  636. }
  637. [WorkItem(539002, "DevDiv")]
  638. [Fact]
  639. public void IncompleteGenericMethodCall()
  640. {
  641. string sourceCode = @"
  642. class Array
  643. {
  644. public static void Find<T>(T t) { }
  645. }
  646. class C
  647. {
  648. static void Main()
  649. {
  650. /*<bind>*/Array.Find<int>/*</bind>*/(
  651. }
  652. }
  653. ";
  654. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  655. Assert.Null(semanticInfo.Type);
  656. Assert.Null(semanticInfo.ConvertedType);
  657. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  658. Assert.Null(semanticInfo.Symbol);
  659. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  660. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  661. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  662. Assert.Equal("void Array.Find<System.Int32>(System.Int32 t)", sortedCandidates[0].ToTestDisplayString());
  663. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  664. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  665. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  666. Assert.Equal("void Array.Find<System.Int32>(System.Int32 t)", sortedMethodGroup[0].ToTestDisplayString());
  667. Assert.False(semanticInfo.IsCompileTimeConstant);
  668. }
  669. [Fact]
  670. public void IncompleteExtensionMethodCall()
  671. {
  672. string sourceCode =
  673. @"interface I<T> { }
  674. class A { }
  675. class B : A { }
  676. class C
  677. {
  678. static void M(A a)
  679. {
  680. /*<bind>*/a.M/*</bind>*/(
  681. }
  682. }
  683. static class S
  684. {
  685. internal static void M(this object o, int x) { }
  686. internal static void M(this A a, int x, int y) { }
  687. internal static void M(this B b) { }
  688. internal static void M(this string s) { }
  689. internal static void M<T>(this T t, object o) { }
  690. internal static void M<T>(this T[] t) { }
  691. internal static void M<T, U>(this T x, I<T> y, U z) { }
  692. }";
  693. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  694. Assert.Null(semanticInfo.Symbol);
  695. Utils.CheckSymbols(semanticInfo.MethodGroup,
  696. "void object.M(int x)",
  697. "void A.M(int x, int y)",
  698. "void A.M<A>(object o)",
  699. "void A.M<A, U>(I<A> y, U z)");
  700. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  701. "void object.M(int x)",
  702. "void A.M(int x, int y)",
  703. "void A.M<A>(object o)",
  704. "void A.M<A, U>(I<A> y, U z)");
  705. Utils.CheckReducedExtensionMethod((MethodSymbol)semanticInfo.MethodGroup[3],
  706. "void A.M<A, U>(I<A> y, U z)",
  707. "void S.M<T, U>(T x, I<T> y, U z)",
  708. "void T.M<T, U>(I<T> y, U z)",
  709. "void S.M<T, U>(T x, I<T> y, U z)");
  710. }
  711. [Fact]
  712. public void IncompleteExtensionMethodCallBadThisType()
  713. {
  714. string sourceCode =
  715. @"interface I<T> { }
  716. class B
  717. {
  718. static void M(I<A> a)
  719. {
  720. /*<bind>*/a.M/*</bind>*/(
  721. }
  722. }
  723. static class S
  724. {
  725. internal static void M(this object o) { }
  726. internal static void M<T>(this T t, object o) { }
  727. internal static void M<T>(this T[] t) { }
  728. internal static void M<T, U>(this I<T> x, I<T> y, U z) { }
  729. }";
  730. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  731. Utils.CheckSymbols(semanticInfo.MethodGroup,
  732. "void object.M()",
  733. "void I<A>.M<I<A>>(object o)",
  734. "void I<A>.M<A, U>(I<A> y, U z)");
  735. }
  736. [WorkItem(541141, "DevDiv")]
  737. [Fact]
  738. public void IncompleteGenericExtensionMethodCall()
  739. {
  740. string sourceCode =
  741. @"using System.Linq;
  742. class C
  743. {
  744. static void M(double[] a)
  745. {
  746. /*<bind>*/a.Where/*</bind>*/(
  747. }
  748. }";
  749. var compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  750. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  751. Utils.CheckSymbols(semanticInfo.MethodGroup,
  752. "IEnumerable<double> IEnumerable<double>.Where<double>(Func<double, bool> predicate)",
  753. "IEnumerable<double> IEnumerable<double>.Where<double>(Func<double, int, bool> predicate)");
  754. }
  755. [WorkItem(541349, "DevDiv")]
  756. [Fact]
  757. public void GenericExtensionMethodCallExplicitTypeArgs()
  758. {
  759. string sourceCode =
  760. @"interface I<T> { }
  761. class C
  762. {
  763. static void M(object o)
  764. {
  765. /*<bind>*/o.E<int>/*</bind>*/();
  766. }
  767. }
  768. static class S
  769. {
  770. internal static void E(this object x, object y) { }
  771. internal static void E<T>(this object o) { }
  772. internal static void E<T>(this object o, T t) { }
  773. internal static void E<T>(this I<T> t) { }
  774. internal static void E<T, U>(this I<T> t) { }
  775. }";
  776. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  777. Utils.CheckSymbol(semanticInfo.Symbol,
  778. "void object.E<int>()");
  779. Utils.CheckSymbols(semanticInfo.MethodGroup,
  780. "void object.E<int>()",
  781. "void object.E<int>(int t)");
  782. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  783. }
  784. [Fact]
  785. public void GenericExtensionMethodCallExplicitTypeArgsOfT()
  786. {
  787. string sourceCode =
  788. @"interface I<T> { }
  789. class C
  790. {
  791. static void M<T, U>(T t, U u)
  792. {
  793. /*<bind>*/t.E<T, U>/*</bind>*/(u);
  794. }
  795. }
  796. static class S
  797. {
  798. internal static void E(this object x, object y) { }
  799. internal static void E<T>(this object o) { }
  800. internal static void E<T, U>(this T t, U u) { }
  801. internal static void E<T, U>(this I<T> t, U u) { }
  802. }";
  803. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  804. Utils.CheckSymbols(semanticInfo.MethodGroup,
  805. "void T.E<T, U>(U u)");
  806. }
  807. [WorkItem(541297, "DevDiv")]
  808. [Fact]
  809. public void GenericExtensionMethodCall()
  810. {
  811. // Single applicable overload with valid argument.
  812. var semanticInfo = GetSemanticInfoForTest(
  813. @"class C
  814. {
  815. static void M(string s)
  816. {
  817. /*<bind>*/s.E(s)/*</bind>*/;
  818. }
  819. }
  820. static class S
  821. {
  822. internal static void E<T>(this T x, object y) { }
  823. internal static void E<T, U>(this T x, U y) { }
  824. }");
  825. Utils.CheckSymbol(semanticInfo.Symbol,
  826. "void string.E<string, string>(string y)");
  827. Utils.CheckSymbols(semanticInfo.MethodGroup);
  828. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  829. // Multiple applicable overloads with valid arguments.
  830. semanticInfo = GetSemanticInfoForTest(
  831. @"class C
  832. {
  833. static void M(string s, object o)
  834. {
  835. /*<bind>*/s.E(s, o)/*</bind>*/;
  836. }
  837. }
  838. static class S
  839. {
  840. internal static void E<T>(this object x, T y, object z) { }
  841. internal static void E<T, U>(this T x, object y, U z) { }
  842. }");
  843. Assert.Null(semanticInfo.Symbol);
  844. Utils.CheckSymbols(semanticInfo.MethodGroup);
  845. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  846. "void object.E<string>(string y, object z)",
  847. "void string.E<string, object>(object y, object z)");
  848. // Multiple applicable overloads with error argument.
  849. semanticInfo = GetSemanticInfoForTest(
  850. @"class C
  851. {
  852. static void M(string s)
  853. {
  854. /*<bind>*/s.E(t, s)/*</bind>*/;
  855. }
  856. }
  857. static class S
  858. {
  859. internal static void E<T>(this T x, T y, object z) { }
  860. internal static void E<T, U>(this T x, string y, U z) { }
  861. }");
  862. Assert.Null(semanticInfo.Symbol);
  863. Utils.CheckSymbols(semanticInfo.MethodGroup);
  864. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  865. "void string.E<string>(string y, object z)",
  866. "void string.E<string, string>(string y, string z)");
  867. // Multiple overloads but all inaccessible.
  868. semanticInfo = GetSemanticInfoForTest(
  869. @"class C
  870. {
  871. static void M(string s)
  872. {
  873. /*<bind>*/s.E()/*</bind>*/;
  874. }
  875. }
  876. static class S
  877. {
  878. static void E(this string x) { }
  879. static void E<T>(this T x) { }
  880. }");
  881. Assert.Null(semanticInfo.Symbol);
  882. Utils.CheckSymbols(semanticInfo.MethodGroup);
  883. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  884. "void string.E()",
  885. "void string.E<string>()"
  886. );
  887. }
  888. [Fact]
  889. public void GenericExtensionDelegateMethod()
  890. {
  891. // Single applicable overload.
  892. var semanticInfo = GetSemanticInfoForTest(
  893. @"class C
  894. {
  895. static void M(string s)
  896. {
  897. System.Action<string> a = /*<bind>*/s.E/*</bind>*/;
  898. }
  899. }
  900. static class S
  901. {
  902. internal static void E<T>(this T x, T y) { }
  903. internal static void E<T>(this object x, T y) { }
  904. }");
  905. Utils.CheckSymbol(semanticInfo.Symbol,
  906. "void string.E<string>(string y)");
  907. Utils.CheckSymbols(semanticInfo.MethodGroup,
  908. "void string.E<string>(string y)",
  909. "void object.E<T>(T y)");
  910. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  911. // Multiple applicable overloads.
  912. semanticInfo = GetSemanticInfoForTest(
  913. @"class C
  914. {
  915. static void M(string s)
  916. {
  917. System.Action<string> a = /*<bind>*/s.E/*</bind>*/;
  918. }
  919. }
  920. static class S
  921. {
  922. internal static void E<T>(this T x, T y) { }
  923. internal static void E<T, U>(this T x, U y) { }
  924. }");
  925. Assert.Null(semanticInfo.Symbol);
  926. Utils.CheckSymbols(semanticInfo.MethodGroup,
  927. "void string.E<string>(string y)",
  928. "void string.E<string, U>(U y)");
  929. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  930. "void string.E<string>(string y)",
  931. "void string.E<string, U>(U y)");
  932. }
  933. /// <summary>
  934. /// Overloads from different scopes should
  935. /// be included in method group.
  936. /// </summary>
  937. [WorkItem(541890, "DevDiv")]
  938. [Fact]
  939. public void IncompleteExtensionOverloadedDifferentScopes()
  940. {
  941. // Instance methods and extension method (implicit instance).
  942. var sourceCode =
  943. @"class C
  944. {
  945. void M()
  946. {
  947. /*<bind>*/F/*</bind>*/(
  948. }
  949. void F(int x) { }
  950. void F(object x, object y) { }
  951. }
  952. static class E
  953. {
  954. internal static void F(this object x, object y) { }
  955. }";
  956. var compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  957. var type = compilation.GlobalNamespace.GetMember<NamedTypeSymbol>("C");
  958. var tree = compilation.SyntaxTrees[0];
  959. var model = compilation.GetSemanticModel(tree);
  960. var expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  961. var symbols = model.GetMemberGroup(expr);
  962. Utils.CheckSymbols(symbols,
  963. "void C.F(int x)",
  964. "void C.F(object x, object y)");
  965. symbols = model.LookupSymbols(expr.SpanStart, container: null, name: "F", includeReducedExtensionMethods: true);
  966. Utils.CheckSymbols(symbols,
  967. "void C.F(int x)",
  968. "void C.F(object x, object y)");
  969. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  970. Utils.CheckSymbols(symbols,
  971. "void C.F(int x)",
  972. "void C.F(object x, object y)",
  973. "void object.F(object y)");
  974. // Instance methods and extension method (explicit instance).
  975. sourceCode =
  976. @"class C
  977. {
  978. void M()
  979. {
  980. /*<bind>*/this.F/*</bind>*/(
  981. }
  982. void F(int x) { }
  983. void F(object x, object y) { }
  984. }
  985. static class E
  986. {
  987. internal static void F(this object x, object y) { }
  988. }";
  989. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  990. type = compilation.GlobalNamespace.GetMember<NamedTypeSymbol>("C");
  991. tree = compilation.SyntaxTrees[0];
  992. model = compilation.GetSemanticModel(tree);
  993. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  994. symbols = model.GetMemberGroup(expr);
  995. Utils.CheckSymbols(symbols,
  996. "void C.F(int x)",
  997. "void C.F(object x, object y)",
  998. "void object.F(object y)");
  999. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1000. Utils.CheckSymbols(symbols,
  1001. "void C.F(int x)",
  1002. "void C.F(object x, object y)",
  1003. "void object.F(object y)");
  1004. // Applicable instance method and inapplicable extension method.
  1005. sourceCode =
  1006. @"class C
  1007. {
  1008. void M()
  1009. {
  1010. /*<bind>*/this.F<string>/*</bind>*/(
  1011. }
  1012. void F<T>(T t) { }
  1013. }
  1014. static class E
  1015. {
  1016. internal static void F(this object x) { }
  1017. }";
  1018. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1019. type = compilation.GlobalNamespace.GetMember<NamedTypeSymbol>("C");
  1020. tree = compilation.SyntaxTrees[0];
  1021. model = compilation.GetSemanticModel(tree);
  1022. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1023. symbols = model.GetMemberGroup(expr);
  1024. Utils.CheckSymbols(symbols,
  1025. "void C.F<string>(string t)");
  1026. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1027. Utils.CheckSymbols(symbols,
  1028. "void C.F<T>(T t)",
  1029. "void object.F()");
  1030. // Inaccessible instance method and accessible extension method.
  1031. sourceCode =
  1032. @"class A
  1033. {
  1034. void F() { }
  1035. }
  1036. class B : A
  1037. {
  1038. static void M(A a)
  1039. {
  1040. /*<bind>*/a.F/*</bind>*/(
  1041. }
  1042. }
  1043. static class E
  1044. {
  1045. internal static void F(this object x) { }
  1046. }";
  1047. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1048. type = compilation.GlobalNamespace.GetMember<NamedTypeSymbol>("A");
  1049. tree = compilation.SyntaxTrees[0];
  1050. model = compilation.GetSemanticModel(tree);
  1051. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1052. symbols = model.GetMemberGroup(expr);
  1053. Utils.CheckSymbols(symbols,
  1054. "void object.F()");
  1055. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1056. Utils.CheckSymbols(symbols,
  1057. "void object.F()");
  1058. // Inapplicable instance method and applicable extension method.
  1059. sourceCode =
  1060. @"class C
  1061. {
  1062. void M()
  1063. {
  1064. /*<bind>*/this.F<string>/*</bind>*/(
  1065. }
  1066. void F(object o) { }
  1067. }
  1068. static class E
  1069. {
  1070. internal static void F<T>(this object x) { }
  1071. }";
  1072. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1073. type = compilation.GlobalNamespace.GetMember<NamedTypeSymbol>("C");
  1074. tree = compilation.SyntaxTrees[0];
  1075. model = compilation.GetSemanticModel(tree);
  1076. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1077. symbols = model.GetMemberGroup(expr);
  1078. Utils.CheckSymbols(symbols,
  1079. "void object.F<string>()");
  1080. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1081. Utils.CheckSymbols(symbols,
  1082. "void C.F(object o)",
  1083. "void object.F<T>()");
  1084. // Viable instance and extension methods, binding to extension method.
  1085. sourceCode =
  1086. @"class C
  1087. {
  1088. void M()
  1089. {
  1090. /*<bind>*/this.F/*</bind>*/();
  1091. }
  1092. void F(object o) { }
  1093. }
  1094. static class E
  1095. {
  1096. internal static void F(this object x) { }
  1097. }";
  1098. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1099. type = compilation.GlobalNamespace.GetMember<NamedTypeSymbol>("C");
  1100. tree = compilation.SyntaxTrees[0];
  1101. model = compilation.GetSemanticModel(tree);
  1102. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1103. symbols = model.GetMemberGroup(expr);
  1104. Utils.CheckSymbols(symbols,
  1105. "void C.F(object o)",
  1106. "void object.F()");
  1107. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1108. Utils.CheckSymbols(symbols,
  1109. "void C.F(object o)",
  1110. "void object.F()");
  1111. // Applicable and inaccessible extension methods.
  1112. sourceCode =
  1113. @"class C
  1114. {
  1115. void M(string s)
  1116. {
  1117. /*<bind>*/s.F<string>/*</bind>*/(
  1118. }
  1119. }
  1120. static class E
  1121. {
  1122. internal static void F(this object x, object y) { }
  1123. internal static void F<T>(this T t) { }
  1124. }";
  1125. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1126. type = compilation.GetSpecialType(SpecialType.System_String);
  1127. tree = compilation.SyntaxTrees[0];
  1128. model = compilation.GetSemanticModel(tree);
  1129. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1130. symbols = model.GetMemberGroup(expr);
  1131. Utils.CheckSymbols(symbols,
  1132. "void string.F<string>()");
  1133. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1134. Utils.CheckSymbols(symbols,
  1135. "void object.F(object y)",
  1136. "void string.F<string>()");
  1137. // Inapplicable and inaccessible extension methods.
  1138. sourceCode =
  1139. @"class C
  1140. {
  1141. void M(string s)
  1142. {
  1143. /*<bind>*/s.F<string>/*</bind>*/(
  1144. }
  1145. }
  1146. static class E
  1147. {
  1148. internal static void F(this object x, object y) { }
  1149. private static void F<T>(this T t) { }
  1150. }";
  1151. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1152. type = compilation.GetSpecialType(SpecialType.System_String);
  1153. tree = compilation.SyntaxTrees[0];
  1154. model = compilation.GetSemanticModel(tree);
  1155. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1156. symbols = model.GetMemberGroup(expr);
  1157. Utils.CheckSymbols(symbols,
  1158. "void string.F<string>()");
  1159. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1160. Utils.CheckSymbols(symbols,
  1161. "void object.F(object y)");
  1162. // Multiple scopes.
  1163. sourceCode =
  1164. @"namespace N1
  1165. {
  1166. static class E
  1167. {
  1168. internal static void F(this object o) { }
  1169. }
  1170. }
  1171. namespace N2
  1172. {
  1173. using N1;
  1174. class C
  1175. {
  1176. static void M(C c)
  1177. {
  1178. /*<bind>*/c.F/*</bind>*/(
  1179. }
  1180. void F(int x) { }
  1181. }
  1182. static class E
  1183. {
  1184. internal static void F(this object x, object y) { }
  1185. }
  1186. }
  1187. static class E
  1188. {
  1189. internal static void F(this object x, object y, object z) { }
  1190. }";
  1191. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1192. type = compilation.GlobalNamespace.GetMember<NamespaceSymbol>("N2").GetMember<NamedTypeSymbol>("C");
  1193. tree = compilation.SyntaxTrees[0];
  1194. model = compilation.GetSemanticModel(tree);
  1195. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1196. symbols = model.GetMemberGroup(expr);
  1197. Utils.CheckSymbols(symbols,
  1198. "void C.F(int x)",
  1199. "void object.F(object y)",
  1200. "void object.F()",
  1201. "void object.F(object y, object z)");
  1202. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1203. Utils.CheckSymbols(symbols,
  1204. "void C.F(int x)",
  1205. "void object.F(object y)",
  1206. "void object.F()",
  1207. "void object.F(object y, object z)");
  1208. // Multiple scopes, no instance methods.
  1209. sourceCode =
  1210. @"namespace N
  1211. {
  1212. class C
  1213. {
  1214. static void M(C c)
  1215. {
  1216. /*<bind>*/c.F/*</bind>*/(
  1217. }
  1218. }
  1219. static class E
  1220. {
  1221. internal static void F(this object x, object y) { }
  1222. }
  1223. }
  1224. static class E
  1225. {
  1226. internal static void F(this object x, object y, object z) { }
  1227. }";
  1228. compilation = CreateCompilationWithMscorlib(references: new MetadataReference[] { SystemCoreRef }, text: sourceCode);
  1229. type = compilation.GlobalNamespace.GetMember<NamespaceSymbol>("N").GetMember<NamedTypeSymbol>("C");
  1230. tree = compilation.SyntaxTrees[0];
  1231. model = compilation.GetSemanticModel(tree);
  1232. expr = GetSyntaxNodeOfTypeForBinding<ExpressionSyntax>(GetSyntaxNodeList(tree));
  1233. symbols = model.GetMemberGroup(expr);
  1234. Utils.CheckSymbols(symbols,
  1235. "void object.F(object y)",
  1236. "void object.F(object y, object z)");
  1237. symbols = model.LookupSymbols(expr.SpanStart, container: type, name: "F", includeReducedExtensionMethods: true);
  1238. Utils.CheckSymbols(symbols,
  1239. "void object.F(object y)",
  1240. "void object.F(object y, object z)");
  1241. }
  1242. [Fact]
  1243. public void PropertyGroup()
  1244. {
  1245. var source1 =
  1246. @"Imports System
  1247. Imports System.Runtime.InteropServices
  1248. <Assembly: PrimaryInteropAssembly(0, 0)>
  1249. <Assembly: Guid(""165F752D-E9C4-4F7E-B0D0-CDFD7A36E210"")>
  1250. <ComImport()>
  1251. <Guid(""165F752D-E9C4-4F7E-B0D0-CDFD7A36E211"")>
  1252. Public Class A
  1253. Property P(Optional x As Integer = 0) As Object
  1254. Get
  1255. Return Nothing
  1256. End Get
  1257. Set
  1258. End Set
  1259. End Property
  1260. Property P(x As Integer, y As Integer) As Integer
  1261. Get
  1262. Return Nothing
  1263. End Get
  1264. Set
  1265. End Set
  1266. End Property
  1267. Property P(x As Integer, y As String) As String
  1268. Get
  1269. Return Nothing
  1270. End Get
  1271. Set
  1272. End Set
  1273. End Property
  1274. End Class";
  1275. var reference1 = BasicCompilationUtils.CompileToMetadata(source1, verify: false);
  1276. // Assignment (property group).
  1277. var source2 =
  1278. @"class B
  1279. {
  1280. static void M(A a)
  1281. {
  1282. /*<bind>*/a.P/*</bind>*/[1, null] = string.Empty;
  1283. }
  1284. }";
  1285. var compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1286. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1287. Utils.CheckSymbol(semanticInfo.Symbol, "string A.P[int x, string y]");
  1288. Utils.CheckSymbols(semanticInfo.MemberGroup,
  1289. "object A.P[int x = 0]",
  1290. "int A.P[int x, int y]",
  1291. "string A.P[int x, string y]");
  1292. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  1293. // Assignment (property access).
  1294. source2 =
  1295. @"class B
  1296. {
  1297. static void M(A a)
  1298. {
  1299. /*<bind>*/a.P[1, null]/*</bind>*/ = string.Empty;
  1300. }
  1301. }";
  1302. compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1303. semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1304. Utils.CheckSymbol(semanticInfo.Symbol, "string A.P[int x, string y]");
  1305. Utils.CheckSymbols(semanticInfo.MemberGroup);
  1306. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  1307. // Object initializer.
  1308. source2 =
  1309. @"class B
  1310. {
  1311. static A F = new A() { /*<bind>*/P/*</bind>*/ = 1 };
  1312. }";
  1313. compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1314. semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1315. Utils.CheckSymbol(semanticInfo.Symbol, "object A.P[int x = 0]");
  1316. Utils.CheckSymbols(semanticInfo.MemberGroup);
  1317. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  1318. // Incomplete reference, overload resolution failure (property group).
  1319. source2 =
  1320. @"class B
  1321. {
  1322. static void M(A a)
  1323. {
  1324. var o = /*<bind>*/a.P/*</bind>*/[1, a
  1325. }
  1326. }";
  1327. compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1328. semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1329. Assert.Null(semanticInfo.Symbol);
  1330. Utils.CheckSymbols(semanticInfo.MemberGroup,
  1331. "object A.P[int x = 0]",
  1332. "int A.P[int x, int y]",
  1333. "string A.P[int x, string y]");
  1334. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  1335. "object A.P[int x = 0]",
  1336. "int A.P[int x, int y]",
  1337. "string A.P[int x, string y]");
  1338. // Incomplete reference, overload resolution failure (property access).
  1339. source2 =
  1340. @"class B
  1341. {
  1342. static void M(A a)
  1343. {
  1344. var o = /*<bind>*/a.P[1, a/*</bind>*/
  1345. }
  1346. }";
  1347. compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1348. semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1349. Assert.Null(semanticInfo.Symbol);
  1350. Utils.CheckSymbols(semanticInfo.MemberGroup);
  1351. Utils.CheckSymbols(semanticInfo.CandidateSymbols,
  1352. "object A.P[int x = 0]",
  1353. "int A.P[int x, int y]",
  1354. "string A.P[int x, string y]");
  1355. }
  1356. [Fact]
  1357. public void PropertyGroupOverloadsOverridesHides()
  1358. {
  1359. var source1 =
  1360. @"Imports System
  1361. Imports System.Runtime.InteropServices
  1362. <Assembly: PrimaryInteropAssembly(0, 0)>
  1363. <Assembly: Guid(""165F752D-E9C4-4F7E-B0D0-CDFD7A36E210"")>
  1364. <ComImport()>
  1365. <Guid(""165F752D-E9C4-4F7E-B0D0-CDFD7A36E211"")>
  1366. Public Class A
  1367. Overridable ReadOnly Property P1(index As Object) As Object
  1368. Get
  1369. Return Nothing
  1370. End Get
  1371. End Property
  1372. ReadOnly Property P2(index As Object) As Object
  1373. Get
  1374. Return Nothing
  1375. End Get
  1376. End Property
  1377. ReadOnly Property P2(x As Object, y As Object) As Object
  1378. Get
  1379. Return Nothing
  1380. End Get
  1381. End Property
  1382. ReadOnly Property P3(index As Object) As Object
  1383. Get
  1384. Return Nothing
  1385. End Get
  1386. End Property
  1387. ReadOnly Property P3(x As Object, y As Object) As Object
  1388. Get
  1389. Return Nothing
  1390. End Get
  1391. End Property
  1392. End Class
  1393. <ComImport()>
  1394. <Guid(""165F752D-E9C4-4F7E-B0D0-CDFD7A36E212"")>
  1395. Public Class B
  1396. Inherits A
  1397. Overrides ReadOnly Property P1(index As Object) As Object
  1398. Get
  1399. Return Nothing
  1400. End Get
  1401. End Property
  1402. Shadows ReadOnly Property P2(index As String) As Object
  1403. Get
  1404. Return Nothing
  1405. End Get
  1406. End Property
  1407. End Class";
  1408. var reference1 = BasicCompilationUtils.CompileToMetadata(source1, verify: false);
  1409. // Overridden property.
  1410. var source2 =
  1411. @"class C
  1412. {
  1413. static object F(B b)
  1414. {
  1415. return /*<bind>*/b.P1/*</bind>*/[null];
  1416. }
  1417. }";
  1418. var compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1419. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1420. Utils.CheckSymbol(semanticInfo.Symbol, "object B.P1[object index]");
  1421. Utils.CheckSymbols(semanticInfo.MemberGroup, "object B.P1[object index]");
  1422. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  1423. // Hidden property.
  1424. source2 =
  1425. @"class C
  1426. {
  1427. static object F(B b)
  1428. {
  1429. return /*<bind>*/b.P2/*</bind>*/[null];
  1430. }
  1431. }";
  1432. compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1433. semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1434. Utils.CheckSymbol(semanticInfo.Symbol, "object B.P2[string index]");
  1435. Utils.CheckSymbols(semanticInfo.MemberGroup, "object B.P2[string index]");
  1436. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  1437. // Overloaded property.
  1438. source2 =
  1439. @"class C
  1440. {
  1441. static object F(B b)
  1442. {
  1443. return /*<bind>*/b.P3/*</bind>*/[null];
  1444. }
  1445. }";
  1446. compilation = CreateCompilationWithMscorlib(source2, new[] { reference1 });
  1447. semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(compilation);
  1448. Utils.CheckSymbol(semanticInfo.Symbol, "object A.P3[object index]");
  1449. Utils.CheckSymbols(semanticInfo.MemberGroup, "object A.P3[object index]", "object A.P3[object x, object y]");
  1450. Utils.CheckSymbols(semanticInfo.CandidateSymbols);
  1451. }
  1452. [WorkItem(538859, "DevDiv")]
  1453. [Fact]
  1454. public void ThisExpression()
  1455. {
  1456. string sourceCode = @"
  1457. class C
  1458. {
  1459. void M()
  1460. {
  1461. /*<bind>*/this/*</bind>*/.ToString();
  1462. }
  1463. }
  1464. ";
  1465. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1466. Assert.Equal("C", semanticInfo.Type.ToTestDisplayString());
  1467. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  1468. Assert.Equal("C", semanticInfo.ConvertedType.ToTestDisplayString());
  1469. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1470. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1471. Assert.Equal("C @this", semanticInfo.Symbol.ToTestDisplayString());
  1472. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  1473. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1474. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1475. Assert.False(semanticInfo.IsCompileTimeConstant);
  1476. }
  1477. [WorkItem(538143, "DevDiv")]
  1478. [Fact]
  1479. public void GetSemanticInfoOfNull()
  1480. {
  1481. var compilation = CreateCompilationWithMscorlib("");
  1482. var tree = compilation.SyntaxTrees[0];
  1483. var model = compilation.GetSemanticModel(tree);
  1484. Assert.Throws<ArgumentNullException>(() => model.GetSymbolInfo((ExpressionSyntax)null));
  1485. Assert.Throws<ArgumentNullException>(() => model.GetTypeInfo((ExpressionSyntax)null));
  1486. Assert.Throws<ArgumentNullException>(() => model.GetMemberGroup((ExpressionSyntax)null));
  1487. Assert.Throws<ArgumentNullException>(() => model.GetConstantValue((ExpressionSyntax)null));
  1488. Assert.Throws<ArgumentNullException>(() => model.GetSymbolInfo((ConstructorInitializerSyntax)null));
  1489. Assert.Throws<ArgumentNullException>(() => model.GetTypeInfo((ConstructorInitializerSyntax)null));
  1490. Assert.Throws<ArgumentNullException>(() => model.GetMemberGroup((ConstructorInitializerSyntax)null));
  1491. }
  1492. [WorkItem(537860, "DevDiv")]
  1493. [Fact]
  1494. public void UsingNamespaceName()
  1495. {
  1496. string sourceCode = @"
  1497. using /*<bind>*/System/*</bind>*/;
  1498. class Test
  1499. {
  1500. }
  1501. ";
  1502. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1503. Assert.Null(semanticInfo.Type);
  1504. Assert.Null(semanticInfo.ConvertedType);
  1505. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1506. Assert.Equal("System", semanticInfo.Symbol.ToTestDisplayString());
  1507. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  1508. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1509. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1510. Assert.False(semanticInfo.IsCompileTimeConstant);
  1511. }
  1512. [WorkItem(3017, "DevDiv_Projects/Roslyn")]
  1513. [Fact]
  1514. public void VariableUsedInForInit()
  1515. {
  1516. string sourceCode = @"
  1517. class Test
  1518. {
  1519. void Fill()
  1520. {
  1521. for (int i = 0; /*<bind>*/i/*</bind>*/ < 10 ; i++ )
  1522. {
  1523. }
  1524. }
  1525. }
  1526. ";
  1527. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1528. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  1529. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1530. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  1531. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1532. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1533. Assert.Equal("System.Int32 i", semanticInfo.Symbol.ToTestDisplayString());
  1534. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  1535. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1536. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1537. Assert.False(semanticInfo.IsCompileTimeConstant);
  1538. }
  1539. [WorkItem(527269, "DevDiv")]
  1540. [Fact]
  1541. public void NullLiteral()
  1542. {
  1543. string sourceCode = @"
  1544. class Test
  1545. {
  1546. public static void Main()
  1547. {
  1548. string s = /*<bind>*/null/*</bind>*/;
  1549. }
  1550. }
  1551. ";
  1552. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1553. Assert.Null(semanticInfo.Type);
  1554. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  1555. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1556. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  1557. Assert.Null(semanticInfo.Symbol);
  1558. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1559. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1560. Assert.True(semanticInfo.IsCompileTimeConstant);
  1561. Assert.Equal(null, semanticInfo.ConstantValue.Value);
  1562. }
  1563. [WorkItem(3019, "DevDiv_Projects/Roslyn")]
  1564. [Fact]
  1565. public void PostfixIncrement()
  1566. {
  1567. string sourceCode = @"
  1568. class Test
  1569. {
  1570. public static void Main()
  1571. {
  1572. int i = 10;
  1573. /*<bind>*/i++/*</bind>*/;
  1574. }
  1575. }
  1576. ";
  1577. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1578. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  1579. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1580. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  1581. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1582. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1583. Assert.Equal("System.Int32 System.Int32.op_Increment(System.Int32 value)", semanticInfo.Symbol.ToTestDisplayString());
  1584. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1585. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1586. Assert.False(semanticInfo.IsCompileTimeConstant);
  1587. }
  1588. [WorkItem(3199, "DevDiv_Projects/Roslyn")]
  1589. [Fact]
  1590. public void ConditionalOrExpr()
  1591. {
  1592. string sourceCode = @"
  1593. class Program
  1594. {
  1595. static void T1()
  1596. {
  1597. bool result = /*<bind>*/true || true/*</bind>*/;
  1598. }
  1599. }
  1600. ";
  1601. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1602. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  1603. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1604. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  1605. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1606. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1607. Assert.Null(semanticInfo.Symbol);
  1608. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1609. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1610. Assert.True(semanticInfo.IsCompileTimeConstant);
  1611. Assert.Equal(true, semanticInfo.ConstantValue);
  1612. }
  1613. [WorkItem(3222, "DevDiv_Projects/Roslyn")]
  1614. [Fact]
  1615. public void ConditionalOperExpr()
  1616. {
  1617. string sourceCode = @"
  1618. class Program
  1619. {
  1620. static void Main()
  1621. {
  1622. int i = /*<bind>*/(true ? 0 : 1)/*</bind>*/;
  1623. }
  1624. }
  1625. ";
  1626. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1627. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  1628. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1629. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  1630. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1631. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1632. Assert.Null(semanticInfo.Symbol);
  1633. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1634. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1635. Assert.True(semanticInfo.IsCompileTimeConstant);
  1636. Assert.Equal(0, semanticInfo.ConstantValue);
  1637. }
  1638. [WorkItem(3223, "DevDiv_Projects/Roslyn")]
  1639. [Fact]
  1640. public void DefaultValueExpr()
  1641. {
  1642. string sourceCode = @"
  1643. class Test
  1644. {
  1645. static void Main(string[] args)
  1646. {
  1647. int s = /*<bind>*/default(int)/*</bind>*/;
  1648. }
  1649. }
  1650. ";
  1651. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1652. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  1653. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1654. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  1655. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1656. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1657. Assert.Null(semanticInfo.Symbol);
  1658. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1659. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1660. Assert.True(semanticInfo.IsCompileTimeConstant);
  1661. Assert.Equal(0, semanticInfo.ConstantValue);
  1662. }
  1663. [WorkItem(537979, "DevDiv")]
  1664. [Fact]
  1665. public void StringConcatWithInt()
  1666. {
  1667. string sourceCode = @"
  1668. public class Test
  1669. {
  1670. public static void Main(string[] args)
  1671. {
  1672. string str = /*<bind>*/""Count value is: "" + 5/*</bind>*/ ;
  1673. }
  1674. }
  1675. ";
  1676. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1677. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  1678. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  1679. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  1680. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1681. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1682. Assert.Equal("System.String System.String.op_Addition(System.String left, System.Object right)", semanticInfo.Symbol.ToTestDisplayString());
  1683. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1684. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1685. Assert.False(semanticInfo.IsCompileTimeConstant);
  1686. }
  1687. [WorkItem(3226, "DevDiv_Projects/Roslyn")]
  1688. [Fact]
  1689. public void StringConcatWithIntAndNullableInt()
  1690. {
  1691. string sourceCode = @"
  1692. public class Test
  1693. {
  1694. public static void Main(string[] args)
  1695. {
  1696. string str = /*<bind>*/""Count value is: "" + (int?) 10 + 5/*</bind>*/;
  1697. }
  1698. }
  1699. ";
  1700. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1701. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  1702. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  1703. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  1704. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1705. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1706. Assert.Equal("System.String System.String.op_Addition(System.String left, System.Object right)", semanticInfo.Symbol.ToTestDisplayString());
  1707. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1708. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1709. Assert.False(semanticInfo.IsCompileTimeConstant);
  1710. }
  1711. [WorkItem(3234, "DevDiv_Projects/Roslyn")]
  1712. [Fact]
  1713. public void AsOper()
  1714. {
  1715. string sourceCode = @"
  1716. public class Test
  1717. {
  1718. public static void Main(string[] args)
  1719. {
  1720. object o = null;
  1721. string str = /*<bind>*/o as string/*</bind>*/;
  1722. }
  1723. }
  1724. ";
  1725. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1726. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  1727. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  1728. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  1729. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1730. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1731. Assert.Null(semanticInfo.Symbol);
  1732. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1733. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1734. Assert.False(semanticInfo.IsCompileTimeConstant);
  1735. }
  1736. [WorkItem(537983, "DevDiv")]
  1737. [Fact]
  1738. public void AddWithUIntAndInt()
  1739. {
  1740. string sourceCode = @"
  1741. public class Test
  1742. {
  1743. public static void Main(string[] args)
  1744. {
  1745. uint ui = 0;
  1746. ulong ui2 = /*<bind>*/ui + 5/*</bind>*/ ;
  1747. }
  1748. }
  1749. ";
  1750. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1751. Assert.Equal("System.UInt32", semanticInfo.Type.ToTestDisplayString());
  1752. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1753. Assert.Equal("System.UInt64", semanticInfo.ConvertedType.ToTestDisplayString());
  1754. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1755. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  1756. Assert.Equal("System.UInt32 System.UInt32.op_Addition(System.UInt32 left, System.UInt32 right)", semanticInfo.Symbol.ToTestDisplayString());
  1757. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1758. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1759. Assert.False(semanticInfo.IsCompileTimeConstant);
  1760. }
  1761. [WorkItem(527314, "DevDiv")]
  1762. [Fact()]
  1763. public void AddExprWithNullableUInt64AndInt32()
  1764. {
  1765. string sourceCode = @"
  1766. public class Test
  1767. {
  1768. public static void Main(string[] args)
  1769. {
  1770. ulong? ui = 0;
  1771. ulong? ui2 = /*<bind>*/ui + 5/*</bind>*/ ;
  1772. }
  1773. }
  1774. ";
  1775. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1776. Assert.Equal("System.UInt64?", semanticInfo.Type.ToTestDisplayString());
  1777. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1778. Assert.Equal("System.UInt64?", semanticInfo.ConvertedType.ToTestDisplayString());
  1779. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1780. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1781. Assert.Equal("ulong.operator +(ulong, ulong)", semanticInfo.Symbol.ToString());
  1782. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1783. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1784. Assert.False(semanticInfo.IsCompileTimeConstant);
  1785. }
  1786. [WorkItem(3248, "DevDiv_Projects/Roslyn")]
  1787. [Fact]
  1788. public void NegatedIsExpr()
  1789. {
  1790. string sourceCode = @"
  1791. using System;
  1792. public class Test
  1793. {
  1794. public static void Main()
  1795. {
  1796. Exception e = new Exception();
  1797. bool bl = /*<bind>*/!(e is DivideByZeroException)/*</bind>*/;
  1798. }
  1799. }
  1800. ";
  1801. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1802. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  1803. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1804. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  1805. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1806. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1807. Assert.Equal("System.Boolean System.Boolean.op_LogicalNot(System.Boolean value)", semanticInfo.Symbol.ToTestDisplayString());
  1808. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1809. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1810. Assert.False(semanticInfo.IsCompileTimeConstant);
  1811. }
  1812. [WorkItem(3249, "DevDiv_Projects/Roslyn")]
  1813. [Fact]
  1814. public void IsExpr()
  1815. {
  1816. string sourceCode = @"
  1817. using System;
  1818. public class Test
  1819. {
  1820. public static void Main()
  1821. {
  1822. Exception e = new Exception();
  1823. bool bl = /*<bind>*/ (e is DivideByZeroException) /*</bind>*/ ;
  1824. }
  1825. }
  1826. ";
  1827. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1828. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  1829. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1830. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  1831. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1832. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1833. Assert.Null(semanticInfo.Symbol);
  1834. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1835. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1836. Assert.False(semanticInfo.IsCompileTimeConstant);
  1837. }
  1838. [WorkItem(527324, "DevDiv")]
  1839. [Fact]
  1840. public void ExceptionCatchVariable()
  1841. {
  1842. string sourceCode = @"
  1843. using System;
  1844. public class Test
  1845. {
  1846. public static void Main()
  1847. {
  1848. try
  1849. {
  1850. }
  1851. catch (Exception e)
  1852. {
  1853. bool bl = (/*<bind>*/e/*</bind>*/ is DivideByZeroException) ;
  1854. }
  1855. }
  1856. }
  1857. ";
  1858. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1859. Assert.Equal("System.Exception", semanticInfo.Type.ToTestDisplayString());
  1860. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  1861. Assert.Equal("System.Exception", semanticInfo.ConvertedType.ToTestDisplayString());
  1862. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1863. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1864. Assert.Equal("System.Exception e", semanticInfo.Symbol.ToTestDisplayString());
  1865. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  1866. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1867. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1868. Assert.False(semanticInfo.IsCompileTimeConstant);
  1869. }
  1870. [WorkItem(3478, "DevDiv_Projects/Roslyn")]
  1871. [Fact]
  1872. public void GenericInvocation()
  1873. {
  1874. string sourceCode = @"
  1875. class Program {
  1876. public static void Ref<T>(T array)
  1877. {
  1878. }
  1879. static void Main()
  1880. {
  1881. /*<bind>*/Ref<object>(null)/*</bind>*/;
  1882. }
  1883. }
  1884. ";
  1885. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1886. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  1887. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  1888. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  1889. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  1890. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1891. Assert.Equal("void Program.Ref<System.Object>(System.Object array)", semanticInfo.Symbol.ToTestDisplayString());
  1892. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  1893. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1894. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1895. Assert.False(semanticInfo.IsCompileTimeConstant);
  1896. }
  1897. [WorkItem(538039, "DevDiv")]
  1898. [Fact]
  1899. public void GlobalAliasQualifiedName()
  1900. {
  1901. string sourceCode = @"
  1902. namespace N1
  1903. {
  1904. interface I1
  1905. {
  1906. void Method();
  1907. }
  1908. }
  1909. namespace N2
  1910. {
  1911. class Test : N1.I1
  1912. {
  1913. void /*<bind>*/global::N1.I1/*</bind>*/.Method()
  1914. {
  1915. }
  1916. }
  1917. }
  1918. ";
  1919. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1920. Assert.Equal("N1.I1", semanticInfo.Type.ToTestDisplayString());
  1921. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  1922. Assert.Equal("N1.I1", semanticInfo.ConvertedType.ToTestDisplayString());
  1923. Assert.Equal(TypeKind.Interface, semanticInfo.ConvertedType.TypeKind);
  1924. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1925. Assert.Equal("N1.I1", semanticInfo.Symbol.ToTestDisplayString());
  1926. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  1927. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1928. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1929. Assert.False(semanticInfo.IsCompileTimeConstant);
  1930. }
  1931. [WorkItem(527363, "DevDiv")]
  1932. [Fact]
  1933. public void ArrayInitializer()
  1934. {
  1935. string sourceCode = @"
  1936. class Test
  1937. {
  1938. static void Main()
  1939. {
  1940. int[] arr = new int[] /*<bind>*/{5}/*</bind>*/;
  1941. }
  1942. }
  1943. ";
  1944. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1945. Assert.Null(semanticInfo.Type);
  1946. Assert.Null(semanticInfo.ConvertedType);
  1947. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1948. Assert.Null(semanticInfo.Symbol);
  1949. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1950. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1951. Assert.False(semanticInfo.IsCompileTimeConstant);
  1952. }
  1953. [WorkItem(538041, "DevDiv")]
  1954. [Fact]
  1955. public void AliasQualifiedName()
  1956. {
  1957. string sourceCode = @"
  1958. using NSA = A;
  1959. namespace A
  1960. {
  1961. class Foo {}
  1962. }
  1963. namespace B
  1964. {
  1965. class Test
  1966. {
  1967. class NSA
  1968. {
  1969. }
  1970. static void Main()
  1971. {
  1972. /*<bind>*/NSA::Foo/*</bind>*/ foo = new NSA::Foo();
  1973. }
  1974. }
  1975. }
  1976. ";
  1977. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  1978. Assert.Equal("A.Foo", semanticInfo.Type.ToTestDisplayString());
  1979. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  1980. Assert.Equal("A.Foo", semanticInfo.ConvertedType.ToTestDisplayString());
  1981. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  1982. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  1983. Assert.Equal("A.Foo", semanticInfo.Symbol.ToTestDisplayString());
  1984. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  1985. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  1986. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  1987. Assert.False(semanticInfo.IsCompileTimeConstant);
  1988. }
  1989. [WorkItem(538021, "DevDiv")]
  1990. [Fact]
  1991. public void EnumToStringInvocationExpr()
  1992. {
  1993. string sourceCode = @"
  1994. using System;
  1995. enum E { Red, Blue, Green}
  1996. public class MainClass
  1997. {
  1998. public static int Main ()
  1999. {
  2000. E e = E.Red;
  2001. string s = /*<bind>*/e.ToString()/*</bind>*/;
  2002. }
  2003. }
  2004. ";
  2005. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2006. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  2007. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  2008. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  2009. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2010. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2011. Assert.Equal("System.String System.Enum.ToString()", semanticInfo.Symbol.ToTestDisplayString());
  2012. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2013. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2014. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2015. Assert.False(semanticInfo.IsCompileTimeConstant);
  2016. }
  2017. [WorkItem(538026, "DevDiv")]
  2018. [Fact]
  2019. public void ExplIfaceMethInvocationExpr()
  2020. {
  2021. string sourceCode = @"
  2022. namespace N1
  2023. {
  2024. interface I1
  2025. {
  2026. int Method();
  2027. }
  2028. }
  2029. namespace N2
  2030. {
  2031. class Test : N1.I1
  2032. {
  2033. int N1.I1.Method()
  2034. {
  2035. return 5;
  2036. }
  2037. static int Main()
  2038. {
  2039. Test t = new Test();
  2040. if (/*<bind>*/((N1.I1)t).Method()/*</bind>*/ != 5)
  2041. return 1;
  2042. return 0;
  2043. }
  2044. }
  2045. }
  2046. ";
  2047. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2048. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  2049. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2050. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  2051. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2052. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2053. Assert.Equal("System.Int32 N1.I1.Method()", semanticInfo.Symbol.ToTestDisplayString());
  2054. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2055. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2056. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2057. Assert.False(semanticInfo.IsCompileTimeConstant);
  2058. }
  2059. [WorkItem(538027, "DevDiv")]
  2060. [Fact]
  2061. public void InvocExprWithAliasIdentifierNameSameAsType()
  2062. {
  2063. string sourceCode = @"
  2064. using N1 = NFoo;
  2065. namespace NFoo
  2066. {
  2067. class Foo
  2068. {
  2069. public static void method() { }
  2070. }
  2071. }
  2072. namespace N2
  2073. {
  2074. class N1 { }
  2075. class Test
  2076. {
  2077. static void Main()
  2078. {
  2079. /*<bind>*/N1::Foo.method()/*</bind>*/;
  2080. }
  2081. }
  2082. }
  2083. ";
  2084. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2085. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  2086. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2087. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  2088. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2089. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2090. Assert.Equal("void NFoo.Foo.method()", semanticInfo.Symbol.ToTestDisplayString());
  2091. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2092. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2093. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2094. Assert.False(semanticInfo.IsCompileTimeConstant);
  2095. }
  2096. [WorkItem(3498, "DevDiv_Projects/Roslyn")]
  2097. [Fact]
  2098. public void BaseAccessMethodInvocExpr()
  2099. {
  2100. string sourceCode = @"
  2101. using System;
  2102. public class BaseClass
  2103. {
  2104. public virtual void MyMeth()
  2105. {
  2106. }
  2107. }
  2108. public class MyClass : BaseClass
  2109. {
  2110. public override void MyMeth()
  2111. {
  2112. /*<bind>*/base.MyMeth()/*</bind>*/;
  2113. }
  2114. public static void Main()
  2115. {
  2116. }
  2117. }
  2118. ";
  2119. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2120. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  2121. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2122. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  2123. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2124. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2125. Assert.Equal("void BaseClass.MyMeth()", semanticInfo.Symbol.ToTestDisplayString());
  2126. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2127. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2128. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2129. Assert.False(semanticInfo.IsCompileTimeConstant);
  2130. }
  2131. [WorkItem(538104, "DevDiv")]
  2132. [Fact]
  2133. public void OverloadResolutionForVirtualMethods()
  2134. {
  2135. string sourceCode = @"
  2136. using System;
  2137. class Program
  2138. {
  2139. static void Main()
  2140. {
  2141. D d = new D();
  2142. string s = ""hello""; long l = 1;
  2143. /*<bind>*/d.foo(ref s, l, l)/*</bind>*/;
  2144. }
  2145. }
  2146. public class B
  2147. {
  2148. // Should bind to this method.
  2149. public virtual int foo(ref string x, long y, long z)
  2150. {
  2151. Console.WriteLine(""Base: foo(ref string x, long y, long z)"");
  2152. return 0;
  2153. }
  2154. public virtual void foo(ref string x, params long[] y)
  2155. {
  2156. Console.WriteLine(""Base: foo(ref string x, params long[] y)"");
  2157. }
  2158. }
  2159. public class D: B
  2160. {
  2161. // Roslyn erroneously binds to this override.
  2162. // Roslyn binds to the correct method above if you comment out this override.
  2163. public override void foo(ref string x, params long[] y)
  2164. {
  2165. Console.WriteLine(""Derived: foo(ref string x, params long[] y)"");
  2166. }
  2167. }
  2168. ";
  2169. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2170. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  2171. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2172. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  2173. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2174. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2175. Assert.Equal("System.Int32 B.foo(ref System.String x, System.Int64 y, System.Int64 z)", semanticInfo.Symbol.ToTestDisplayString());
  2176. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2177. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2178. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2179. Assert.False(semanticInfo.IsCompileTimeConstant);
  2180. }
  2181. [WorkItem(538104, "DevDiv")]
  2182. [Fact]
  2183. public void OverloadResolutionForVirtualMethods2()
  2184. {
  2185. string sourceCode = @"
  2186. using System;
  2187. class Program
  2188. {
  2189. static void Main()
  2190. {
  2191. D d = new D();
  2192. int i = 1;
  2193. /*<bind>*/d.foo(i, i)/*</bind>*/;
  2194. }
  2195. }
  2196. public class B
  2197. {
  2198. public virtual int foo(params int[] x)
  2199. {
  2200. Console.WriteLine(""""Base: foo(params int[] x)"""");
  2201. return 0;
  2202. }
  2203. public virtual void foo(params object[] x)
  2204. {
  2205. Console.WriteLine(""""Base: foo(params object[] x)"""");
  2206. }
  2207. }
  2208. public class D: B
  2209. {
  2210. public override void foo(params object[] x)
  2211. {
  2212. Console.WriteLine(""""Derived: foo(params object[] x)"""");
  2213. }
  2214. }
  2215. ";
  2216. var semanticInfo = GetSemanticInfoForTest<InvocationExpressionSyntax>(sourceCode);
  2217. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  2218. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2219. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  2220. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2221. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2222. Assert.Equal("System.Int32 B.foo(params System.Int32[] x)", semanticInfo.Symbol.ToTestDisplayString());
  2223. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2224. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2225. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2226. Assert.False(semanticInfo.IsCompileTimeConstant);
  2227. }
  2228. [Fact]
  2229. public void ThisInStaticMethod()
  2230. {
  2231. string sourceCode = @"
  2232. using System;
  2233. class Program
  2234. {
  2235. static void Main(string[] args)
  2236. {
  2237. object o = /*<bind>*/this/*</bind>*/;
  2238. }
  2239. }
  2240. ";
  2241. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2242. Assert.Equal("Program", semanticInfo.Type.ToTestDisplayString());
  2243. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  2244. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  2245. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2246. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  2247. Assert.Null(semanticInfo.Symbol);
  2248. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  2249. Assert.Equal("Program @this", semanticInfo.CandidateSymbols[0].ToTestDisplayString());
  2250. Assert.Equal(CandidateReason.StaticInstanceMismatch, semanticInfo.CandidateReason);
  2251. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2252. Assert.False(semanticInfo.IsCompileTimeConstant);
  2253. }
  2254. [Fact]
  2255. public void Constructor1()
  2256. {
  2257. string sourceCode = @"
  2258. using System;
  2259. class Program
  2260. {
  2261. static void Main(string[] args)
  2262. {
  2263. object o = new /*<bind>*/A/*</bind>*/(4);
  2264. }
  2265. }
  2266. class A
  2267. {
  2268. public A() { }
  2269. public A(int x) { }
  2270. }
  2271. ";
  2272. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2273. Assert.Null(semanticInfo.Type);
  2274. Assert.Null(semanticInfo.ConvertedType);
  2275. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2276. Assert.Equal("A", semanticInfo.Symbol.ToTestDisplayString());
  2277. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  2278. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2279. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2280. Assert.False(semanticInfo.IsCompileTimeConstant);
  2281. }
  2282. [Fact]
  2283. public void Constructor2()
  2284. {
  2285. string sourceCode = @"
  2286. using System;
  2287. class Program
  2288. {
  2289. static void Main(string[] args)
  2290. {
  2291. object o = /*<bind>*/new A(4)/*</bind>*/;
  2292. }
  2293. }
  2294. class A
  2295. {
  2296. public A() { }
  2297. public A(int x) { }
  2298. }
  2299. ";
  2300. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2301. Assert.Equal("A", semanticInfo.Type.ToTestDisplayString());
  2302. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  2303. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  2304. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2305. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  2306. Assert.Equal("A..ctor(System.Int32 x)", semanticInfo.Symbol.ToTestDisplayString());
  2307. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2308. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2309. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  2310. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2311. Assert.Equal("A..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  2312. Assert.Equal("A..ctor(System.Int32 x)", sortedMethodGroup[1].ToTestDisplayString());
  2313. Assert.False(semanticInfo.IsCompileTimeConstant);
  2314. }
  2315. [Fact]
  2316. public void FailedOverloadResolution1()
  2317. {
  2318. string sourceCode = @"
  2319. using System;
  2320. class Program
  2321. {
  2322. static void Main(string[] args)
  2323. {
  2324. object o = null;
  2325. /*<bind>*/A.f(o)/*</bind>*/;
  2326. }
  2327. }
  2328. class A
  2329. {
  2330. public void f(int x, int y) { }
  2331. public void f(string z) { }
  2332. }
  2333. ";
  2334. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2335. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  2336. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2337. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  2338. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2339. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2340. Assert.Null(semanticInfo.Symbol);
  2341. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  2342. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  2343. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2344. Assert.Equal("void A.f(System.Int32 x, System.Int32 y)", sortedCandidates[0].ToTestDisplayString());
  2345. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2346. Assert.Equal("void A.f(System.String z)", sortedCandidates[1].ToTestDisplayString());
  2347. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  2348. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2349. Assert.False(semanticInfo.IsCompileTimeConstant);
  2350. }
  2351. [Fact]
  2352. public void FailedOverloadResolution2()
  2353. {
  2354. string sourceCode = @"
  2355. using System;
  2356. class Program
  2357. {
  2358. static void Main(string[] args)
  2359. {
  2360. object o = null;
  2361. A./*<bind>*/f/*</bind>*/(o);
  2362. }
  2363. }
  2364. class A
  2365. {
  2366. public void f(int x, int y) { }
  2367. public void f(string z) { }
  2368. }
  2369. ";
  2370. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2371. Assert.Null(semanticInfo.Type);
  2372. Assert.Null(semanticInfo.ConvertedType);
  2373. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2374. Assert.Null(semanticInfo.Symbol);
  2375. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  2376. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  2377. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2378. Assert.Equal("void A.f(System.Int32 x, System.Int32 y)", sortedCandidates[0].ToTestDisplayString());
  2379. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2380. Assert.Equal("void A.f(System.String z)", sortedCandidates[1].ToTestDisplayString());
  2381. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  2382. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  2383. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2384. Assert.Equal("void A.f(System.Int32 x, System.Int32 y)", sortedMethodGroup[0].ToTestDisplayString());
  2385. Assert.Equal("void A.f(System.String z)", sortedMethodGroup[1].ToTestDisplayString());
  2386. Assert.False(semanticInfo.IsCompileTimeConstant);
  2387. }
  2388. [WorkItem(541745, "DevDiv")]
  2389. [Fact]
  2390. public void FailedOverloadResolution3()
  2391. {
  2392. string sourceCode = @"
  2393. class C
  2394. {
  2395. public int M { get; set; }
  2396. }
  2397. static class Extensions1
  2398. {
  2399. public static int M(this C c) { return 0; }
  2400. }
  2401. static class Extensions2
  2402. {
  2403. public static int M(this C c) { return 0; }
  2404. }
  2405. class Foo
  2406. {
  2407. void M()
  2408. {
  2409. C c = new C();
  2410. /*<bind>*/c.M/*</bind>*/();
  2411. }
  2412. }
  2413. ";
  2414. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  2415. Assert.Null(semanticInfo.Type);
  2416. Assert.Null(semanticInfo.ConvertedType);
  2417. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2418. Assert.Null(semanticInfo.Symbol);
  2419. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  2420. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  2421. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2422. Assert.Equal("System.Int32 C.M()", sortedCandidates[0].ToTestDisplayString());
  2423. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2424. Assert.Equal("System.Int32 C.M()", sortedCandidates[1].ToTestDisplayString());
  2425. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  2426. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  2427. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2428. Assert.Equal("System.Int32 C.M()", sortedMethodGroup[0].ToTestDisplayString());
  2429. Assert.Equal("System.Int32 C.M()", sortedMethodGroup[1].ToTestDisplayString());
  2430. Assert.False(semanticInfo.IsCompileTimeConstant);
  2431. }
  2432. [WorkItem(542833, "DevDiv")]
  2433. [Fact]
  2434. public void FailedOverloadResolution4()
  2435. {
  2436. string sourceCode = @"
  2437. class C
  2438. {
  2439. public int M;
  2440. }
  2441. static class Extensions
  2442. {
  2443. public static int M(this C c, int i) { return 0; }
  2444. }
  2445. class Foo
  2446. {
  2447. void M()
  2448. {
  2449. C c = new C();
  2450. /*<bind>*/c.M/*</bind>*/();
  2451. }
  2452. }
  2453. ";
  2454. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  2455. Assert.Null(semanticInfo.Type);
  2456. Assert.Null(semanticInfo.ConvertedType);
  2457. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2458. Assert.Null(semanticInfo.Symbol);
  2459. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  2460. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  2461. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2462. Assert.Equal("System.Int32 C.M(System.Int32 i)", sortedCandidates[0].ToTestDisplayString());
  2463. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2464. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2465. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2466. Assert.Equal("System.Int32 C.M(System.Int32 i)", sortedMethodGroup[0].ToTestDisplayString());
  2467. Assert.False(semanticInfo.IsCompileTimeConstant);
  2468. }
  2469. [Fact]
  2470. public void SucceededOverloadResolution1()
  2471. {
  2472. string sourceCode = @"
  2473. using System;
  2474. class Program
  2475. {
  2476. static void Main(string[] args)
  2477. {
  2478. object o = null;
  2479. /*<bind>*/A.f(""hi"")/*</bind>*/;
  2480. }
  2481. }
  2482. class A
  2483. {
  2484. public static void f(int x, int y) { }
  2485. public static int f(string z) { return 3; }
  2486. }
  2487. ";
  2488. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2489. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  2490. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2491. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  2492. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2493. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2494. Assert.Equal("System.Int32 A.f(System.String z)", semanticInfo.Symbol.ToTestDisplayString());
  2495. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2496. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2497. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2498. Assert.False(semanticInfo.IsCompileTimeConstant);
  2499. }
  2500. [Fact]
  2501. public void SuceededOverloadResolution2()
  2502. {
  2503. string sourceCode = @"
  2504. using System;
  2505. class Program
  2506. {
  2507. static void Main(string[] args)
  2508. {
  2509. object o = null;
  2510. A./*<bind>*/f/*</bind>*/(""hi"");
  2511. }
  2512. }
  2513. class A
  2514. {
  2515. public static void f(int x, int y) { }
  2516. public static int f(string z) { return 3; }
  2517. }
  2518. ";
  2519. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2520. Assert.Null(semanticInfo.Type);
  2521. Assert.Null(semanticInfo.ConvertedType);
  2522. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2523. Assert.Equal("System.Int32 A.f(System.String z)", semanticInfo.Symbol.ToTestDisplayString());
  2524. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2525. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2526. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  2527. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2528. Assert.Equal("System.Int32 A.f(System.String z)", sortedMethodGroup[0].ToTestDisplayString());
  2529. Assert.Equal("void A.f(System.Int32 x, System.Int32 y)", sortedMethodGroup[1].ToTestDisplayString());
  2530. Assert.False(semanticInfo.IsCompileTimeConstant);
  2531. }
  2532. [WorkItem(541878, "DevDiv")]
  2533. [Fact]
  2534. public void TestCandidateReasonForInaccessibleMethod()
  2535. {
  2536. string sourceCode = @"
  2537. class Test
  2538. {
  2539. class NestedTest
  2540. {
  2541. static void Method1()
  2542. {
  2543. }
  2544. }
  2545. static void Main()
  2546. {
  2547. /*<bind>*/NestedTest.Method1()/*</bind>*/;
  2548. }
  2549. }
  2550. ";
  2551. var semanticInfo = GetSemanticInfoForTest<InvocationExpressionSyntax>(sourceCode);
  2552. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  2553. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2554. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  2555. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2556. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2557. Assert.Null(semanticInfo.Symbol);
  2558. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  2559. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  2560. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2561. Assert.Equal("void Test.NestedTest.Method1()", sortedCandidates[0].ToTestDisplayString());
  2562. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2563. }
  2564. [WorkItem(541879, "DevDiv")]
  2565. [Fact]
  2566. public void InaccessibleTypeInObjectCreationExpression()
  2567. {
  2568. string sourceCode = @"
  2569. class Test
  2570. {
  2571. class NestedTest
  2572. {
  2573. class NestedNestedTest
  2574. {
  2575. }
  2576. }
  2577. static void Main()
  2578. {
  2579. var nnt = /*<bind>*/new NestedTest.NestedNestedTest()/*</bind>*/;
  2580. }
  2581. }
  2582. ";
  2583. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  2584. Assert.Equal("Test.NestedTest.NestedNestedTest", semanticInfo.Type.ToTestDisplayString());
  2585. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  2586. Assert.Equal("Test.NestedTest.NestedNestedTest", semanticInfo.ConvertedType.ToTestDisplayString());
  2587. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2588. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2589. Assert.Null(semanticInfo.Symbol);
  2590. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  2591. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  2592. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2593. Assert.Equal("Test.NestedTest.NestedNestedTest..ctor()", sortedCandidates[0].ToTestDisplayString());
  2594. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2595. }
  2596. [WorkItem(541883, "DevDiv")]
  2597. [Fact]
  2598. public void InheritedMemberHiding()
  2599. {
  2600. string sourceCode = @"
  2601. public class A
  2602. {
  2603. public static int m() { return 1; }
  2604. }
  2605. public class B : A
  2606. {
  2607. public static int m() { return 5; }
  2608. public static void Main1()
  2609. {
  2610. /*<bind>*/m/*</bind>*/(10);
  2611. }
  2612. }
  2613. ";
  2614. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  2615. Assert.Null(semanticInfo.Type);
  2616. Assert.Null(semanticInfo.ConvertedType);
  2617. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2618. Assert.Null(semanticInfo.Symbol);
  2619. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  2620. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  2621. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2622. Assert.Equal("System.Int32 B.m()", sortedCandidates[0].ToTestDisplayString());
  2623. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  2624. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2625. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2626. Assert.Equal("System.Int32 B.m()", sortedMethodGroup[0].ToTestDisplayString());
  2627. }
  2628. [WorkItem(538106, "DevDiv")]
  2629. [Fact]
  2630. public void UsingAliasNameSystemInvocExpr()
  2631. {
  2632. string sourceCode = @"
  2633. using System = MySystem.IO.StreamReader;
  2634. namespace N1
  2635. {
  2636. using NullStreamReader = System::NullStreamReader;
  2637. class Test
  2638. {
  2639. static int Main()
  2640. {
  2641. NullStreamReader nr = new NullStreamReader();
  2642. /*<bind>*/nr.ReadLine()/*</bind>*/;
  2643. return 0;
  2644. }
  2645. }
  2646. }
  2647. namespace MySystem
  2648. {
  2649. namespace IO
  2650. {
  2651. namespace StreamReader
  2652. {
  2653. public class NullStreamReader
  2654. {
  2655. public string ReadLine() { return null; }
  2656. }
  2657. }
  2658. }
  2659. }
  2660. ";
  2661. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2662. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  2663. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  2664. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  2665. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2666. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2667. Assert.Equal("System.String MySystem.IO.StreamReader.NullStreamReader.ReadLine()", semanticInfo.Symbol.ToTestDisplayString());
  2668. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2669. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2670. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2671. Assert.False(semanticInfo.IsCompileTimeConstant);
  2672. }
  2673. [WorkItem(538109, "DevDiv")]
  2674. [Fact]
  2675. public void InterfaceMethodImplInvocExpr()
  2676. {
  2677. string sourceCode = @"
  2678. interface ISomething
  2679. {
  2680. string ToString();
  2681. }
  2682. class A : ISomething
  2683. {
  2684. string ISomething.ToString()
  2685. {
  2686. return null;
  2687. }
  2688. }
  2689. class Test
  2690. {
  2691. static void Main()
  2692. {
  2693. ISomething isome = new A();
  2694. /*<bind>*/isome.ToString()/*</bind>*/;
  2695. }
  2696. }
  2697. ";
  2698. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2699. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  2700. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  2701. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  2702. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2703. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2704. Assert.Equal("System.String ISomething.ToString()", semanticInfo.Symbol.ToTestDisplayString());
  2705. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2706. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2707. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2708. Assert.False(semanticInfo.IsCompileTimeConstant);
  2709. }
  2710. [WorkItem(538112, "DevDiv")]
  2711. [Fact]
  2712. public void MemberAccessMethodWithNew()
  2713. {
  2714. string sourceCode = @"
  2715. public class MyBase
  2716. {
  2717. public void MyMeth()
  2718. {
  2719. }
  2720. }
  2721. public class MyClass : MyBase
  2722. {
  2723. new public void MyMeth()
  2724. {
  2725. }
  2726. public static void Main()
  2727. {
  2728. MyClass test = new MyClass();
  2729. /*<bind>*/test.MyMeth/*</bind>*/();
  2730. }
  2731. }
  2732. ";
  2733. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2734. Assert.Null(semanticInfo.Type);
  2735. Assert.Null(semanticInfo.ConvertedType);
  2736. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2737. Assert.Equal("void MyClass.MyMeth()", semanticInfo.Symbol.ToTestDisplayString());
  2738. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2739. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2740. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2741. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2742. Assert.Equal("void MyClass.MyMeth()", sortedMethodGroup[0].ToTestDisplayString());
  2743. Assert.False(semanticInfo.IsCompileTimeConstant);
  2744. }
  2745. [WorkItem(527386, "DevDiv")]
  2746. [Fact]
  2747. public void MethodGroupWithStaticInstanceSameName()
  2748. {
  2749. string sourceCode = @"
  2750. class D
  2751. {
  2752. public static void M2(int x, int y)
  2753. {
  2754. }
  2755. public void M2(int x)
  2756. {
  2757. }
  2758. }
  2759. class C
  2760. {
  2761. public static void Main()
  2762. {
  2763. D d = new D();
  2764. /*<bind>*/d.M2/*</bind>*/(5);
  2765. }
  2766. }
  2767. ";
  2768. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2769. Assert.Null(semanticInfo.Type);
  2770. Assert.Null(semanticInfo.ConvertedType);
  2771. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2772. Assert.Equal("void D.M2(System.Int32 x)", semanticInfo.Symbol.ToTestDisplayString());
  2773. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2774. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2775. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  2776. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2777. Assert.Equal("void D.M2(System.Int32 x)", sortedMethodGroup[0].ToTestDisplayString());
  2778. Assert.Equal("void D.M2(System.Int32 x, System.Int32 y)", sortedMethodGroup[1].ToTestDisplayString());
  2779. Assert.False(semanticInfo.IsCompileTimeConstant);
  2780. }
  2781. [WorkItem(538123, "DevDiv")]
  2782. [Fact]
  2783. public void VirtualOverriddenMember()
  2784. {
  2785. string sourceCode = @"
  2786. public class C1
  2787. {
  2788. public virtual void M1()
  2789. {
  2790. }
  2791. }
  2792. public class C2:C1
  2793. {
  2794. public override void M1()
  2795. {
  2796. }
  2797. }
  2798. public class Test
  2799. {
  2800. static void Main()
  2801. {
  2802. C2 c2 = new C2();
  2803. /*<bind>*/c2.M1/*</bind>*/();
  2804. }
  2805. }
  2806. ";
  2807. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2808. Assert.Null(semanticInfo.Type);
  2809. Assert.Null(semanticInfo.ConvertedType);
  2810. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2811. Assert.Equal("void C2.M1()", semanticInfo.Symbol.ToTestDisplayString());
  2812. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2813. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2814. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2815. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2816. Assert.Equal("void C2.M1()", sortedMethodGroup[0].ToTestDisplayString());
  2817. Assert.False(semanticInfo.IsCompileTimeConstant);
  2818. }
  2819. [WorkItem(538125, "DevDiv")]
  2820. [Fact]
  2821. public void AbstractOverriddenMember()
  2822. {
  2823. string sourceCode = @"
  2824. public abstract class AbsClass
  2825. {
  2826. public abstract void Test();
  2827. }
  2828. public class TestClass : AbsClass
  2829. {
  2830. public override void Test() { }
  2831. public static void Main()
  2832. {
  2833. TestClass tc = new TestClass();
  2834. /*<bind>*/tc.Test/*</bind>*/();
  2835. }
  2836. }
  2837. ";
  2838. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2839. Assert.Null(semanticInfo.Type);
  2840. Assert.Null(semanticInfo.ConvertedType);
  2841. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2842. Assert.Equal("void TestClass.Test()", semanticInfo.Symbol.ToTestDisplayString());
  2843. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2844. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2845. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2846. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2847. Assert.Equal("void TestClass.Test()", sortedMethodGroup[0].ToTestDisplayString());
  2848. Assert.False(semanticInfo.IsCompileTimeConstant);
  2849. }
  2850. [Fact]
  2851. public void DiamondInheritanceMember()
  2852. {
  2853. string sourceCode = @"
  2854. public interface IB { void M(); }
  2855. public interface IM1 : IB {}
  2856. public interface IM2 : IB {}
  2857. public interface ID : IM1, IM2 {}
  2858. public class Program
  2859. {
  2860. public static void Main()
  2861. {
  2862. ID id = null;
  2863. /*<bind>*/id.M/*</bind>*/();
  2864. }
  2865. }
  2866. ";
  2867. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2868. // We must ensure that the method is only found once, even though there are two paths to it.
  2869. Assert.Null(semanticInfo.Type);
  2870. Assert.Null(semanticInfo.ConvertedType);
  2871. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2872. Assert.Equal("void IB.M()", semanticInfo.Symbol.ToTestDisplayString());
  2873. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2874. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2875. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2876. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2877. Assert.Equal("void IB.M()", sortedMethodGroup[0].ToTestDisplayString());
  2878. Assert.False(semanticInfo.IsCompileTimeConstant);
  2879. }
  2880. [Fact]
  2881. public void InconsistentlyHiddenMember()
  2882. {
  2883. string sourceCode = @"
  2884. public interface IB { void M(); }
  2885. public interface IL : IB {}
  2886. public interface IR : IB { new void M(); }
  2887. public interface ID : IR, IL {}
  2888. public class Program
  2889. {
  2890. public static void Main()
  2891. {
  2892. ID id = null;
  2893. /*<bind>*/id.M/*</bind>*/();
  2894. }
  2895. }
  2896. ";
  2897. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2898. // Even though there is a "path" from ID to IB.M via IL on which IB.M is not hidden,
  2899. // it is still hidden because *any possible hiding* hides the method.
  2900. Assert.Null(semanticInfo.Type);
  2901. Assert.Null(semanticInfo.ConvertedType);
  2902. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2903. Assert.Equal("void IR.M()", semanticInfo.Symbol.ToTestDisplayString());
  2904. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2905. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2906. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  2907. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  2908. Assert.Equal("void IR.M()", sortedMethodGroup[0].ToTestDisplayString());
  2909. Assert.False(semanticInfo.IsCompileTimeConstant);
  2910. }
  2911. [WorkItem(538138, "DevDiv")]
  2912. [Fact]
  2913. public void ParenExprWithMethodInvocExpr()
  2914. {
  2915. string sourceCode = @"
  2916. class Test
  2917. {
  2918. public static int Meth1()
  2919. {
  2920. return 9;
  2921. }
  2922. public static void Main()
  2923. {
  2924. int var1 = /*<bind>*/(Meth1())/*</bind>*/;
  2925. }
  2926. }
  2927. ";
  2928. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2929. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  2930. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2931. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  2932. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2933. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2934. Assert.Equal("System.Int32 Test.Meth1()", semanticInfo.Symbol.ToTestDisplayString());
  2935. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  2936. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2937. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2938. Assert.False(semanticInfo.IsCompileTimeConstant);
  2939. }
  2940. [WorkItem(527397, "DevDiv")]
  2941. [Fact()]
  2942. public void ExplicitIdentityCastExpr()
  2943. {
  2944. string sourceCode = @"
  2945. class Test
  2946. {
  2947. public static void Main()
  2948. {
  2949. int i = 10;
  2950. object j = /*<bind>*/(int)i/*</bind>*/;
  2951. }
  2952. }
  2953. ";
  2954. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2955. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  2956. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2957. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  2958. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  2959. Assert.Equal(ConversionKind.Boxing, semanticInfo.ImplicitConversion.Kind);
  2960. Assert.Null(semanticInfo.Symbol);
  2961. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  2962. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2963. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2964. Assert.False(semanticInfo.IsCompileTimeConstant);
  2965. }
  2966. [WorkItem(3652, "DevDiv_Projects/Roslyn")]
  2967. [WorkItem(529056, "DevDiv")]
  2968. [WorkItem(543619, "DevDiv")]
  2969. [Fact()]
  2970. public void OutOfBoundsConstCastToByte()
  2971. {
  2972. string sourceCode = @"
  2973. class Test
  2974. {
  2975. public static void Main()
  2976. {
  2977. byte j = unchecked(/*<bind>*/(byte)-123/*</bind>*/);
  2978. }
  2979. }
  2980. ";
  2981. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  2982. Assert.Equal("System.Byte", semanticInfo.Type.ToTestDisplayString());
  2983. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  2984. Assert.Equal("System.Byte", semanticInfo.ConvertedType.ToTestDisplayString());
  2985. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  2986. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  2987. Assert.Null(semanticInfo.Symbol);
  2988. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  2989. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  2990. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  2991. Assert.True(semanticInfo.IsCompileTimeConstant);
  2992. Assert.Equal((byte)133, semanticInfo.ConstantValue);
  2993. }
  2994. [WorkItem(538160, "DevDiv")]
  2995. [Fact]
  2996. public void InsideCollectionsNamespace()
  2997. {
  2998. string sourceCode = @"
  2999. using System;
  3000. namespace Collections
  3001. {
  3002. public class Test
  3003. {
  3004. public static /*<bind>*/void/*</bind>*/ Main()
  3005. {
  3006. }
  3007. }
  3008. }
  3009. ";
  3010. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3011. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  3012. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3013. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  3014. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3015. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3016. Assert.Equal("System.Void", semanticInfo.Symbol.ToTestDisplayString());
  3017. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3018. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3019. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3020. Assert.False(semanticInfo.IsCompileTimeConstant);
  3021. }
  3022. [WorkItem(538161, "DevDiv")]
  3023. [Fact]
  3024. public void ErrorTypeNameSameAsVariable()
  3025. {
  3026. string sourceCode = @"
  3027. public class A
  3028. {
  3029. public static void RunTest()
  3030. {
  3031. /*<bind>*/B/*</bind>*/ B = new B();
  3032. }
  3033. }
  3034. ";
  3035. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3036. Assert.Equal("B", semanticInfo.Type.ToTestDisplayString());
  3037. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3038. Assert.Equal("B", semanticInfo.ConvertedType.ToTestDisplayString());
  3039. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3040. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3041. Assert.Null(semanticInfo.Symbol);
  3042. Assert.Equal(CandidateReason.NotATypeOrNamespace, semanticInfo.CandidateReason);
  3043. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  3044. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  3045. Assert.Equal("B B", sortedCandidates[0].ToTestDisplayString());
  3046. Assert.Equal(SymbolKind.Local, sortedCandidates[0].Kind);
  3047. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3048. Assert.False(semanticInfo.IsCompileTimeConstant);
  3049. }
  3050. [WorkItem(537117, "DevDiv")]
  3051. [WorkItem(537127, "DevDiv")]
  3052. [Fact]
  3053. public void SystemNamespace()
  3054. {
  3055. string sourceCode = @"
  3056. namespace System
  3057. {
  3058. class A
  3059. {
  3060. /*<bind>*/System/*</bind>*/.Exception c;
  3061. }
  3062. }
  3063. ";
  3064. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3065. Assert.Null(semanticInfo.Type);
  3066. Assert.Null(semanticInfo.ConvertedType);
  3067. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3068. Assert.Equal("System", semanticInfo.Symbol.ToTestDisplayString());
  3069. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  3070. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3071. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3072. Assert.False(semanticInfo.IsCompileTimeConstant);
  3073. }
  3074. [WorkItem(537118, "DevDiv")]
  3075. [Fact]
  3076. public void SystemNamespace2()
  3077. {
  3078. string sourceCode = @"
  3079. namespace N1
  3080. {
  3081. namespace N2
  3082. {
  3083. public class A1 { }
  3084. }
  3085. public class A2
  3086. {
  3087. /*<bind>*/N1.N2.A1/*</bind>*/ a;
  3088. }
  3089. }
  3090. ";
  3091. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3092. Assert.Equal("N1.N2.A1", semanticInfo.Type.ToTestDisplayString());
  3093. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3094. Assert.Equal("N1.N2.A1", semanticInfo.ConvertedType.ToTestDisplayString());
  3095. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3096. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3097. Assert.Equal("N1.N2.A1", semanticInfo.Symbol.ToTestDisplayString());
  3098. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3099. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3100. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3101. Assert.False(semanticInfo.IsCompileTimeConstant);
  3102. }
  3103. [WorkItem(537119, "DevDiv")]
  3104. [Fact]
  3105. public void SystemNamespace3()
  3106. {
  3107. string sourceCode = @"
  3108. class H<T>
  3109. {
  3110. }
  3111. class A
  3112. {
  3113. }
  3114. namespace N1
  3115. {
  3116. public class A1
  3117. {
  3118. /*<bind>*/H<A>/*</bind>*/ a;
  3119. }
  3120. }
  3121. ";
  3122. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3123. Assert.Equal("H<A>", semanticInfo.Type.ToTestDisplayString());
  3124. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3125. Assert.Equal("H<A>", semanticInfo.ConvertedType.ToTestDisplayString());
  3126. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3127. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3128. Assert.Equal("H<A>", semanticInfo.Symbol.ToTestDisplayString());
  3129. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3130. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3131. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3132. Assert.False(semanticInfo.IsCompileTimeConstant);
  3133. }
  3134. [WorkItem(537124, "DevDiv")]
  3135. [Fact]
  3136. public void SystemNamespace4()
  3137. {
  3138. string sourceCode = @"
  3139. using System;
  3140. class H<T>
  3141. {
  3142. }
  3143. class H<T1, T2>
  3144. {
  3145. }
  3146. class A
  3147. {
  3148. }
  3149. namespace N1
  3150. {
  3151. public class A1
  3152. {
  3153. /*<bind>*/H<H<A>, H<A>>/*</bind>*/ a;
  3154. }
  3155. }
  3156. ";
  3157. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3158. Assert.Equal("H<H<A>, H<A>>", semanticInfo.Type.ToTestDisplayString());
  3159. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3160. Assert.Equal("H<H<A>, H<A>>", semanticInfo.ConvertedType.ToTestDisplayString());
  3161. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3162. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3163. Assert.Equal("H<H<A>, H<A>>", semanticInfo.Symbol.ToTestDisplayString());
  3164. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3165. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3166. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3167. Assert.False(semanticInfo.IsCompileTimeConstant);
  3168. }
  3169. [WorkItem(537160, "DevDiv")]
  3170. [Fact]
  3171. public void SystemNamespace5()
  3172. {
  3173. string sourceCode = @"
  3174. namespace N1
  3175. {
  3176. namespace N2
  3177. {
  3178. public class A2
  3179. {
  3180. public class A1 { }
  3181. /*<bind>*/N1.N2.A2.A1/*</bind>*/ a;
  3182. }
  3183. }
  3184. }
  3185. ";
  3186. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3187. Assert.Equal("N1.N2.A2.A1", semanticInfo.Type.ToTestDisplayString());
  3188. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3189. Assert.Equal("N1.N2.A2.A1", semanticInfo.ConvertedType.ToTestDisplayString());
  3190. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3191. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3192. Assert.Equal("N1.N2.A2.A1", semanticInfo.Symbol.ToTestDisplayString());
  3193. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3194. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3195. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3196. Assert.False(semanticInfo.IsCompileTimeConstant);
  3197. }
  3198. [WorkItem(537161, "DevDiv")]
  3199. [Fact]
  3200. public void SystemNamespace6()
  3201. {
  3202. string sourceCode = @"
  3203. namespace N1
  3204. {
  3205. class NC1
  3206. {
  3207. public class A1 { }
  3208. }
  3209. public class A2
  3210. {
  3211. /*<bind>*/N1.NC1.A1/*</bind>*/ a;
  3212. }
  3213. }
  3214. ";
  3215. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3216. Assert.Equal("N1.NC1.A1", semanticInfo.Type.ToTestDisplayString());
  3217. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3218. Assert.Equal("N1.NC1.A1", semanticInfo.ConvertedType.ToTestDisplayString());
  3219. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3220. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3221. Assert.Equal("N1.NC1.A1", semanticInfo.Symbol.ToTestDisplayString());
  3222. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3223. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3224. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3225. Assert.False(semanticInfo.IsCompileTimeConstant);
  3226. }
  3227. [WorkItem(537340, "DevDiv")]
  3228. [Fact]
  3229. public void LeftOfDottedTypeName()
  3230. {
  3231. string sourceCode = @"
  3232. class Main
  3233. {
  3234. A./*<bind>*/B/*</bind>*/ x; // this refers to the B within A.
  3235. }
  3236. class A {
  3237. public class B {}
  3238. }
  3239. class B {}
  3240. ";
  3241. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3242. Assert.Equal("A.B", semanticInfo.Type.ToTestDisplayString());
  3243. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3244. Assert.Equal("A.B", semanticInfo.ConvertedType.ToTestDisplayString());
  3245. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3246. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3247. Assert.Equal("A.B", semanticInfo.Symbol.ToTestDisplayString());
  3248. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3249. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3250. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3251. Assert.False(semanticInfo.IsCompileTimeConstant);
  3252. }
  3253. [WorkItem(537592, "DevDiv")]
  3254. [Fact]
  3255. public void Parameters()
  3256. {
  3257. string sourceCode = @"
  3258. class C
  3259. {
  3260. void M(DateTime dt)
  3261. {
  3262. /*<bind>*/dt/*</bind>*/.ToString();
  3263. }
  3264. }
  3265. ";
  3266. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3267. Assert.Equal("DateTime", semanticInfo.Type.ToTestDisplayString());
  3268. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3269. Assert.Equal("DateTime", semanticInfo.ConvertedType.ToTestDisplayString());
  3270. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3271. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3272. Assert.Equal("DateTime dt", semanticInfo.Symbol.ToTestDisplayString());
  3273. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  3274. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3275. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3276. Assert.False(semanticInfo.IsCompileTimeConstant);
  3277. }
  3278. // TODO: This should probably have a candidate symbol!
  3279. [WorkItem(527212, "DevDiv")]
  3280. [Fact]
  3281. public void FieldMemberOfConstructedType()
  3282. {
  3283. string sourceCode = @"
  3284. class C<T> {
  3285. public T Field;
  3286. }
  3287. class D {
  3288. void M() {
  3289. new C<int>./*<bind>*/Field/*</bind>*/.ToString();
  3290. }
  3291. }
  3292. ";
  3293. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3294. Assert.Equal("C<System.Int32>.Field", semanticInfo.Type.ToTestDisplayString());
  3295. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3296. Assert.Equal("C<System.Int32>.Field", semanticInfo.ConvertedType.ToTestDisplayString());
  3297. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3298. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3299. Assert.Null(semanticInfo.Symbol);
  3300. // Should bind to "field" with a candidateReason (not a typeornamespace>)Skip:
  3301. Assert.NotEqual(CandidateReason.None, semanticInfo.CandidateReason);
  3302. Assert.NotEqual(0, semanticInfo.CandidateSymbols.Length);
  3303. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3304. Assert.False(semanticInfo.IsCompileTimeConstant);
  3305. }
  3306. [WorkItem(537593, "DevDiv")]
  3307. [Fact]
  3308. public void Constructor()
  3309. {
  3310. string sourceCode = @"
  3311. class C
  3312. {
  3313. public C() { /*<bind>*/new C()/*</bind>*/.ToString(); }
  3314. }
  3315. ";
  3316. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3317. Assert.Equal("C", semanticInfo.Type.ToTestDisplayString());
  3318. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3319. Assert.Equal("C", semanticInfo.ConvertedType.ToTestDisplayString());
  3320. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3321. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3322. Assert.Equal("C..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  3323. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  3324. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3325. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  3326. Assert.Equal("C..ctor()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  3327. Assert.False(semanticInfo.IsCompileTimeConstant);
  3328. }
  3329. [WorkItem(538046, "DevDiv")]
  3330. [Fact]
  3331. public void TypeNameInTypeThatMatchesNamespace()
  3332. {
  3333. string sourceCode = @"
  3334. namespace T
  3335. {
  3336. class T
  3337. {
  3338. void M()
  3339. {
  3340. /*<bind>*/T/*</bind>*/.T T = new T.T();
  3341. }
  3342. }
  3343. }
  3344. ";
  3345. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3346. Assert.Equal("T.T", semanticInfo.Type.ToTestDisplayString());
  3347. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3348. Assert.Equal("T.T", semanticInfo.ConvertedType.ToTestDisplayString());
  3349. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3350. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3351. Assert.Equal("T.T", semanticInfo.Symbol.ToTestDisplayString());
  3352. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3353. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3354. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3355. Assert.False(semanticInfo.IsCompileTimeConstant);
  3356. }
  3357. [WorkItem(538267, "DevDiv")]
  3358. [Fact]
  3359. public void RHSExpressionInTryParent()
  3360. {
  3361. string sourceCode = @"
  3362. using System;
  3363. public class Test
  3364. {
  3365. static int Main()
  3366. {
  3367. try
  3368. {
  3369. object obj = /*<bind>*/null/*</bind>*/;
  3370. }
  3371. catch {}
  3372. return 0;
  3373. }
  3374. }
  3375. ";
  3376. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3377. Assert.Null(semanticInfo.Type);
  3378. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  3379. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3380. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  3381. Assert.Null(semanticInfo.Symbol);
  3382. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3383. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3384. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3385. Assert.True(semanticInfo.IsCompileTimeConstant);
  3386. Assert.Equal(null, semanticInfo.ConstantValue.Value);
  3387. }
  3388. [WorkItem(538215, "DevDiv")]
  3389. [Fact]
  3390. public void GenericArgumentInBase1()
  3391. {
  3392. string sourceCode = @"
  3393. public class X
  3394. {
  3395. public interface Z { }
  3396. }
  3397. class A<T>
  3398. {
  3399. public class X { }
  3400. }
  3401. class B : A<B.Y./*<bind>*/Z/*</bind>*/>
  3402. {
  3403. public class Y : X { }
  3404. }
  3405. ";
  3406. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3407. Assert.Equal("B.Y.Z", semanticInfo.Type.ToTestDisplayString());
  3408. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3409. Assert.Equal("B.Y.Z", semanticInfo.ConvertedType.ToTestDisplayString());
  3410. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3411. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3412. Assert.Null(semanticInfo.Symbol);
  3413. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3414. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3415. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3416. Assert.False(semanticInfo.IsCompileTimeConstant);
  3417. }
  3418. [WorkItem(538215, "DevDiv")]
  3419. [Fact]
  3420. public void GenericArgumentInBase2()
  3421. {
  3422. string sourceCode = @"
  3423. public class X
  3424. {
  3425. public interface Z { }
  3426. }
  3427. class A<T>
  3428. {
  3429. public class X { }
  3430. }
  3431. class B : /*<bind>*/A<B.Y.Z>/*</bind>*/
  3432. {
  3433. public class Y : X { }
  3434. }
  3435. ";
  3436. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3437. Assert.Equal("A<B.Y.Z>", semanticInfo.Type.ToTestDisplayString());
  3438. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3439. Assert.Equal("A<B.Y.Z>", semanticInfo.ConvertedType.ToTestDisplayString());
  3440. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3441. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3442. Assert.Equal("A<B.Y.Z>", semanticInfo.Symbol.ToTestDisplayString());
  3443. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  3444. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3445. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3446. Assert.False(semanticInfo.IsCompileTimeConstant);
  3447. }
  3448. [WorkItem(538097, "DevDiv")]
  3449. [Fact]
  3450. public void InvokedLocal1()
  3451. {
  3452. string sourceCode = @"
  3453. class C
  3454. {
  3455. static void Foo()
  3456. {
  3457. int x = 10;
  3458. /*<bind>*/x/*</bind>*/();
  3459. }
  3460. }
  3461. ";
  3462. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3463. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  3464. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3465. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  3466. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3467. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3468. Assert.Equal("System.Int32 x", semanticInfo.Symbol.ToTestDisplayString());
  3469. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  3470. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3471. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3472. Assert.False(semanticInfo.IsCompileTimeConstant);
  3473. }
  3474. [WorkItem(538318, "DevDiv")]
  3475. [Fact]
  3476. public void TooManyConstructorArgs()
  3477. {
  3478. string sourceCode = @"
  3479. class C
  3480. {
  3481. C() {}
  3482. void M()
  3483. {
  3484. /*<bind>*/new C(null
  3485. /*</bind>*/ }
  3486. }
  3487. ";
  3488. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3489. Assert.Equal("C", semanticInfo.Type.ToTestDisplayString());
  3490. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3491. Assert.Equal("C", semanticInfo.ConvertedType.ToTestDisplayString());
  3492. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3493. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3494. Assert.Null(semanticInfo.Symbol);
  3495. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  3496. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  3497. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  3498. Assert.Equal("C..ctor()", sortedCandidates[0].ToTestDisplayString());
  3499. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  3500. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  3501. Assert.Equal("C..ctor()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  3502. Assert.False(semanticInfo.IsCompileTimeConstant);
  3503. }
  3504. [WorkItem(538185, "DevDiv")]
  3505. [Fact]
  3506. public void NamespaceAndFieldSameName1()
  3507. {
  3508. string sourceCode = @"
  3509. class C
  3510. {
  3511. void M()
  3512. {
  3513. /*<bind>*/System/*</bind>*/.String x = F();
  3514. }
  3515. string F()
  3516. {
  3517. return null;
  3518. }
  3519. public int System;
  3520. }
  3521. ";
  3522. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3523. Assert.Null(semanticInfo.Type);
  3524. Assert.Null(semanticInfo.ConvertedType);
  3525. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3526. Assert.Equal("System", semanticInfo.Symbol.ToTestDisplayString());
  3527. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  3528. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3529. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3530. Assert.False(semanticInfo.IsCompileTimeConstant);
  3531. }
  3532. [Fact]
  3533. public void PEProperty()
  3534. {
  3535. string sourceCode = @"
  3536. class C
  3537. {
  3538. void M(string s)
  3539. {
  3540. /*<bind>*/s.Length/*</bind>*/;
  3541. }
  3542. }
  3543. ";
  3544. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3545. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  3546. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3547. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  3548. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3549. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3550. Assert.Equal("System.Int32 System.String.Length { get; }", semanticInfo.Symbol.ToTestDisplayString());
  3551. Assert.Equal(SymbolKind.Property, semanticInfo.Symbol.Kind);
  3552. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3553. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3554. Assert.False(semanticInfo.IsCompileTimeConstant);
  3555. }
  3556. [Fact]
  3557. public void NotPresentGenericType1()
  3558. {
  3559. string sourceCode = @"
  3560. class Class { void Test() { /*<bind>*/List<int>/*</bind>*/ l; } }
  3561. ";
  3562. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3563. Assert.Equal("List<System.Int32>", semanticInfo.Type.ToTestDisplayString());
  3564. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3565. Assert.Equal("List<System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  3566. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3567. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3568. Assert.Null(semanticInfo.Symbol);
  3569. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3570. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3571. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3572. Assert.False(semanticInfo.IsCompileTimeConstant);
  3573. }
  3574. [Fact]
  3575. public void NotPresentGenericType2()
  3576. {
  3577. string sourceCode = @"
  3578. class Class {
  3579. /*<bind>*/List<int>/*</bind>*/ Test() { return null;}
  3580. }
  3581. ";
  3582. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3583. Assert.Equal("List<System.Int32>", semanticInfo.Type.ToTestDisplayString());
  3584. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3585. Assert.Equal("List<System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  3586. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3587. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3588. Assert.Null(semanticInfo.Symbol);
  3589. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3590. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3591. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3592. Assert.False(semanticInfo.IsCompileTimeConstant);
  3593. }
  3594. [Fact]
  3595. public void BadArityConstructorCall()
  3596. {
  3597. string sourceCode = @"
  3598. class C<T1>
  3599. {
  3600. public void Test()
  3601. {
  3602. C c = new /*<bind>*/C/*</bind>*/();
  3603. }
  3604. }
  3605. ";
  3606. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  3607. Assert.Null(semanticInfo.Type);
  3608. Assert.Null(semanticInfo.ConvertedType);
  3609. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3610. Assert.Null(semanticInfo.Symbol);
  3611. Assert.Equal(CandidateReason.WrongArity, semanticInfo.CandidateReason);
  3612. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  3613. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  3614. Assert.Equal("C<T1>", sortedCandidates[0].ToTestDisplayString());
  3615. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  3616. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3617. Assert.False(semanticInfo.IsCompileTimeConstant);
  3618. }
  3619. [Fact]
  3620. public void BadArityConstructorCall2()
  3621. {
  3622. string sourceCode = @"
  3623. class C<T1>
  3624. {
  3625. public void Test()
  3626. {
  3627. C c = /*<bind>*/new C()/*</bind>*/;
  3628. }
  3629. }
  3630. ";
  3631. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  3632. Assert.Equal("C<T1>", semanticInfo.Type.ToTestDisplayString());
  3633. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3634. Assert.Equal("C<T1>", semanticInfo.ConvertedType.ToTestDisplayString());
  3635. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3636. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3637. Assert.Equal("C<T1>..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  3638. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3639. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3640. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  3641. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  3642. Assert.Equal("C<T1>..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  3643. Assert.False(semanticInfo.IsCompileTimeConstant);
  3644. }
  3645. [Fact]
  3646. public void UnresolvedBaseConstructor()
  3647. {
  3648. string sourceCode = @"
  3649. class C : B {
  3650. public C(int i) /*<bind>*/: base(i)/*</bind>*/ { }
  3651. public C(string j, string k) : base() { }
  3652. }
  3653. class B {
  3654. public B(string a, string b) { }
  3655. public B() { }
  3656. int i;
  3657. }
  3658. ";
  3659. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  3660. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  3661. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3662. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  3663. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3664. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3665. Assert.Null(semanticInfo.Symbol);
  3666. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  3667. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  3668. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  3669. Assert.Equal("B..ctor()", sortedCandidates[0].ToTestDisplayString());
  3670. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  3671. Assert.Equal("B..ctor(System.String a, System.String b)", sortedCandidates[1].ToTestDisplayString());
  3672. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  3673. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3674. Assert.False(semanticInfo.IsCompileTimeConstant);
  3675. }
  3676. [Fact]
  3677. public void BoundBaseConstructor()
  3678. {
  3679. string sourceCode = @"
  3680. class C : B {
  3681. public C(int i) /*<bind>*/: base(""hi"", ""hello"")/*</bind>*/ { }
  3682. public C(string j, string k) : base() { }
  3683. }
  3684. class B
  3685. {
  3686. public B(string a, string b) { }
  3687. public B() { }
  3688. int i;
  3689. }
  3690. ";
  3691. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  3692. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  3693. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3694. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  3695. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3696. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3697. Assert.Equal("B..ctor(System.String a, System.String b)", semanticInfo.Symbol.ToTestDisplayString());
  3698. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  3699. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3700. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3701. Assert.False(semanticInfo.IsCompileTimeConstant);
  3702. }
  3703. [WorkItem(540998, "DevDiv")]
  3704. [Fact]
  3705. public void DeclarationWithinSwitchStatement()
  3706. {
  3707. string sourceCode =
  3708. @"class C
  3709. {
  3710. static void M(int i)
  3711. {
  3712. switch (i)
  3713. {
  3714. case 0:
  3715. string name = /*<bind>*/null/*</bind>*/;
  3716. if (name != null)
  3717. {
  3718. }
  3719. break;
  3720. }
  3721. }
  3722. }";
  3723. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  3724. Assert.NotNull(semanticInfo);
  3725. }
  3726. [WorkItem(537573, "DevDiv")]
  3727. [Fact]
  3728. public void UndeclaredTypeAndCheckContainingSymbol()
  3729. {
  3730. string sourceCode = @"
  3731. class C1
  3732. {
  3733. void M()
  3734. {
  3735. /*<bind>*/F/*</bind>*/ f;
  3736. }
  3737. }
  3738. ";
  3739. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3740. Assert.Equal("F", semanticInfo.Type.ToTestDisplayString());
  3741. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  3742. Assert.Equal("F", semanticInfo.ConvertedType.ToTestDisplayString());
  3743. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  3744. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3745. Assert.Null(semanticInfo.Symbol);
  3746. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3747. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3748. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3749. Assert.False(semanticInfo.IsCompileTimeConstant);
  3750. Assert.Equal(SymbolKind.Namespace, semanticInfo.Type.ContainingSymbol.Kind);
  3751. Assert.True(((NamespaceSymbol)semanticInfo.Type.ContainingSymbol).IsGlobalNamespace);
  3752. }
  3753. [WorkItem(538538, "DevDiv")]
  3754. [Fact]
  3755. public void AliasQualifier()
  3756. {
  3757. string sourceCode = @"
  3758. using X = A;
  3759. namespace A.B { }
  3760. namespace N
  3761. {
  3762. using /*<bind>*/X/*</bind>*/::B;
  3763. class X { }
  3764. }
  3765. ";
  3766. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3767. Assert.Null(semanticInfo.Type);
  3768. Assert.Null(semanticInfo.ConvertedType);
  3769. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3770. Assert.NotNull(semanticInfo.Symbol);
  3771. Assert.Equal("A", semanticInfo.Symbol.ToTestDisplayString());
  3772. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  3773. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3774. var aliasInfo = GetAliasInfoForTest(sourceCode);
  3775. Assert.NotNull(aliasInfo);
  3776. Assert.Equal("X=A", aliasInfo.ToTestDisplayString());
  3777. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  3778. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3779. Assert.False(semanticInfo.IsCompileTimeConstant);
  3780. }
  3781. [Fact]
  3782. public void AliasQualifier2()
  3783. {
  3784. string sourceCode = @"
  3785. using S = System.String;
  3786. {
  3787. class X
  3788. {
  3789. void Foo()
  3790. {
  3791. string x;
  3792. x = /*<bind>*/S/*</bind>*/.Empty;
  3793. }
  3794. }
  3795. }
  3796. ";
  3797. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3798. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  3799. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3800. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  3801. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3802. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3803. Assert.NotNull(semanticInfo.Symbol);
  3804. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3805. var aliasInfo = GetAliasInfoForTest(sourceCode);
  3806. Assert.Equal("S=System.String", aliasInfo.ToTestDisplayString());
  3807. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  3808. Assert.Equal("String", aliasInfo.Target.Name);
  3809. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3810. Assert.False(semanticInfo.IsCompileTimeConstant);
  3811. }
  3812. [Fact]
  3813. public void PropertyAccessor()
  3814. {
  3815. string sourceCode = @"
  3816. class C
  3817. {
  3818. private object p = null;
  3819. internal object P { set { p = /*<bind>*/value/*</bind>*/; } }
  3820. }
  3821. ";
  3822. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3823. Assert.Equal("System.Object", semanticInfo.Type.ToTestDisplayString());
  3824. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  3825. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  3826. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  3827. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3828. Assert.Equal("System.Object value", semanticInfo.Symbol.ToTestDisplayString());
  3829. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  3830. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3831. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3832. Assert.False(semanticInfo.IsCompileTimeConstant);
  3833. }
  3834. [Fact]
  3835. public void IndexerAccessorValue()
  3836. {
  3837. string sourceCode =
  3838. @"class C
  3839. {
  3840. string[] values = new string[10];
  3841. internal string this[int i]
  3842. {
  3843. get { return values[i]; }
  3844. set { values[i] = /*<bind>*/value/*</bind>*/; }
  3845. }
  3846. }";
  3847. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3848. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  3849. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  3850. Assert.Equal("System.String value", semanticInfo.Symbol.ToTestDisplayString());
  3851. }
  3852. [Fact]
  3853. public void IndexerAccessorParameter()
  3854. {
  3855. string sourceCode =
  3856. @"class C
  3857. {
  3858. string[] values = new string[10];
  3859. internal string this[short i]
  3860. {
  3861. get { return values[/*<bind>*/i/*</bind>*/]; }
  3862. }
  3863. }";
  3864. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3865. Assert.Equal("System.Int16", semanticInfo.Type.ToTestDisplayString());
  3866. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  3867. Assert.Equal("System.Int16 i", semanticInfo.Symbol.ToTestDisplayString());
  3868. }
  3869. [Fact]
  3870. public void IndexerAccessNamedParameter()
  3871. {
  3872. string sourceCode =
  3873. @"class C
  3874. {
  3875. string[] values = new string[10];
  3876. internal string this[short i]
  3877. {
  3878. get { return values[i]; }
  3879. }
  3880. void Method()
  3881. {
  3882. string s = this[/*<bind>*/i/*</bind>*/: 0];
  3883. }
  3884. }";
  3885. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3886. Assert.NotNull(semanticInfo);
  3887. Assert.Null(semanticInfo.Type);
  3888. Assert.Null(semanticInfo.ConvertedType);
  3889. var symbol = semanticInfo.Symbol;
  3890. Assert.Equal(SymbolKind.Parameter, symbol.Kind);
  3891. Assert.True(symbol.ContainingSymbol.Kind == SymbolKind.Property && ((IPropertySymbol)symbol.ContainingSymbol).IsIndexer);
  3892. Assert.Equal("System.Int16 i", symbol.ToTestDisplayString());
  3893. }
  3894. [Fact]
  3895. public void LocalConstant()
  3896. {
  3897. string sourceCode = @"
  3898. class C
  3899. {
  3900. static void M()
  3901. {
  3902. const int i = 1;
  3903. const int j = i + 1;
  3904. const int k = /*<bind>*/j/*</bind>*/ - 2;
  3905. }
  3906. }
  3907. ";
  3908. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3909. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  3910. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3911. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  3912. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3913. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3914. Assert.Equal("System.Int32 j", semanticInfo.Symbol.ToTestDisplayString());
  3915. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  3916. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3917. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3918. Assert.True(semanticInfo.IsCompileTimeConstant);
  3919. Assert.Equal(2, semanticInfo.ConstantValue);
  3920. var symbol = (LocalSymbol)semanticInfo.Symbol;
  3921. Assert.True(symbol.HasConstantValue);
  3922. Assert.Equal(2, symbol.ConstantValue);
  3923. }
  3924. [Fact]
  3925. public void FieldConstant()
  3926. {
  3927. string sourceCode = @"
  3928. class C
  3929. {
  3930. const int i = 1;
  3931. const int j = i + 1;
  3932. static void M()
  3933. {
  3934. const int k = /*<bind>*/j/*</bind>*/ - 2;
  3935. }
  3936. }
  3937. ";
  3938. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  3939. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  3940. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3941. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  3942. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3943. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3944. Assert.Equal("System.Int32 C.j", semanticInfo.Symbol.ToTestDisplayString());
  3945. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  3946. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3947. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3948. Assert.True(semanticInfo.IsCompileTimeConstant);
  3949. Assert.Equal(2, semanticInfo.ConstantValue);
  3950. var symbol = (FieldSymbol)semanticInfo.Symbol;
  3951. Assert.Equal("j", symbol.Name);
  3952. Assert.True(symbol.HasConstantValue);
  3953. Assert.Equal(2, symbol.ConstantValue);
  3954. }
  3955. [Fact]
  3956. public void FieldInitializer()
  3957. {
  3958. string sourceCode = @"
  3959. class C
  3960. {
  3961. int F = /*<bind>*/G() + 1/*</bind>*/;
  3962. static int G()
  3963. {
  3964. return 1;
  3965. }
  3966. }
  3967. ";
  3968. var semanticInfo = GetSemanticInfoForTest<BinaryExpressionSyntax>(sourceCode);
  3969. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  3970. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  3971. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  3972. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  3973. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3974. Assert.Equal("System.Int32 System.Int32.op_Addition(System.Int32 left, System.Int32 right)", semanticInfo.Symbol.ToTestDisplayString());
  3975. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  3976. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  3977. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  3978. Assert.False(semanticInfo.IsCompileTimeConstant);
  3979. }
  3980. [Fact]
  3981. public void EnumConstant()
  3982. {
  3983. string sourceCode = @"
  3984. enum E { A, B, C, D = B }
  3985. class C
  3986. {
  3987. static void M(E e)
  3988. {
  3989. M(/*<bind>*/E.C/*</bind>*/);
  3990. }
  3991. }
  3992. ";
  3993. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  3994. Assert.Equal("E", semanticInfo.Type.ToTestDisplayString());
  3995. Assert.Equal(TypeKind.Enum, semanticInfo.Type.TypeKind);
  3996. Assert.Equal("E", semanticInfo.ConvertedType.ToTestDisplayString());
  3997. Assert.Equal(TypeKind.Enum, semanticInfo.ConvertedType.TypeKind);
  3998. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  3999. Assert.Equal("E.C", semanticInfo.Symbol.ToTestDisplayString());
  4000. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4001. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4002. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4003. Assert.True(semanticInfo.IsCompileTimeConstant);
  4004. Assert.Equal(2, semanticInfo.ConstantValue);
  4005. var symbol = (SourceEnumConstantSymbol)semanticInfo.Symbol;
  4006. Assert.Equal("C", symbol.Name);
  4007. Assert.True(symbol.HasConstantValue);
  4008. Assert.Equal(2, symbol.ConstantValue);
  4009. }
  4010. [Fact]
  4011. public void BadEnumConstant()
  4012. {
  4013. string sourceCode = @"
  4014. enum E { W = Z, X, Y }
  4015. class C
  4016. {
  4017. static void M(E e)
  4018. {
  4019. M(/*<bind>*/E.Y/*</bind>*/);
  4020. }
  4021. }
  4022. ";
  4023. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  4024. Assert.Equal("E", semanticInfo.Type.ToTestDisplayString());
  4025. Assert.Equal(TypeKind.Enum, semanticInfo.Type.TypeKind);
  4026. Assert.Equal("E", semanticInfo.ConvertedType.ToTestDisplayString());
  4027. Assert.Equal(TypeKind.Enum, semanticInfo.ConvertedType.TypeKind);
  4028. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4029. Assert.Equal("E.Y", semanticInfo.Symbol.ToTestDisplayString());
  4030. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4031. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4032. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4033. Assert.False(semanticInfo.IsCompileTimeConstant);
  4034. var symbol = (SourceEnumConstantSymbol)semanticInfo.Symbol;
  4035. Assert.Equal("Y", symbol.Name);
  4036. Assert.False(symbol.HasConstantValue);
  4037. }
  4038. [Fact]
  4039. public void CircularEnumConstant01()
  4040. {
  4041. string sourceCode = @"
  4042. enum E { A = B, B }
  4043. class C
  4044. {
  4045. static void M(E e)
  4046. {
  4047. M(/*<bind>*/E.B/*</bind>*/);
  4048. }
  4049. }
  4050. ";
  4051. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  4052. Assert.Equal("E", semanticInfo.Type.ToTestDisplayString());
  4053. Assert.Equal(TypeKind.Enum, semanticInfo.Type.TypeKind);
  4054. Assert.Equal("E", semanticInfo.ConvertedType.ToTestDisplayString());
  4055. Assert.Equal(TypeKind.Enum, semanticInfo.ConvertedType.TypeKind);
  4056. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4057. Assert.Equal("E.B", semanticInfo.Symbol.ToTestDisplayString());
  4058. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4059. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4060. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4061. Assert.False(semanticInfo.IsCompileTimeConstant);
  4062. var symbol = (SourceEnumConstantSymbol)semanticInfo.Symbol;
  4063. Assert.Equal("B", symbol.Name);
  4064. Assert.False(symbol.HasConstantValue);
  4065. }
  4066. [Fact]
  4067. public void CircularEnumConstant02()
  4068. {
  4069. string sourceCode = @"
  4070. enum E { A = 10, B = C, C, D }
  4071. class C
  4072. {
  4073. static void M(E e)
  4074. {
  4075. M(/*<bind>*/E.D/*</bind>*/);
  4076. }
  4077. }
  4078. ";
  4079. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  4080. Assert.Equal("E", semanticInfo.Type.ToTestDisplayString());
  4081. Assert.Equal(TypeKind.Enum, semanticInfo.Type.TypeKind);
  4082. Assert.Equal("E", semanticInfo.ConvertedType.ToTestDisplayString());
  4083. Assert.Equal(TypeKind.Enum, semanticInfo.ConvertedType.TypeKind);
  4084. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4085. Assert.Equal("E.D", semanticInfo.Symbol.ToTestDisplayString());
  4086. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4087. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4088. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4089. Assert.False(semanticInfo.IsCompileTimeConstant);
  4090. var symbol = (SourceEnumConstantSymbol)semanticInfo.Symbol;
  4091. Assert.Equal("D", symbol.Name);
  4092. Assert.False(symbol.HasConstantValue);
  4093. }
  4094. [Fact]
  4095. public void EnumInitializer()
  4096. {
  4097. string sourceCode = @"
  4098. enum E { A, B = 3 }
  4099. enum F { C, D = 1 + /*<bind>*/E.B/*</bind>*/ }
  4100. ";
  4101. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  4102. Assert.Equal("E", semanticInfo.Type.ToTestDisplayString());
  4103. Assert.Equal(TypeKind.Enum, semanticInfo.Type.TypeKind);
  4104. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  4105. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4106. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  4107. Assert.Equal("E.B", semanticInfo.Symbol.ToTestDisplayString());
  4108. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4109. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4110. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4111. Assert.True(semanticInfo.IsCompileTimeConstant);
  4112. Assert.Equal(3, semanticInfo.ConstantValue);
  4113. var symbol = (SourceEnumConstantSymbol)semanticInfo.Symbol;
  4114. Assert.Equal("B", symbol.Name);
  4115. Assert.True(symbol.HasConstantValue);
  4116. Assert.Equal(3, symbol.ConstantValue);
  4117. }
  4118. [Fact]
  4119. public void ParameterOfExplicitInterfaceImplementation()
  4120. {
  4121. string sourceCode = @"
  4122. class Class : System.IFormattable
  4123. {
  4124. string System.IFormattable.ToString(string format, System.IFormatProvider formatProvider)
  4125. {
  4126. return /*<bind>*/format/*</bind>*/;
  4127. }
  4128. }
  4129. ";
  4130. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4131. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  4132. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4133. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  4134. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4135. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4136. Assert.Equal("System.String format", semanticInfo.Symbol.ToTestDisplayString());
  4137. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  4138. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4139. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4140. Assert.False(semanticInfo.IsCompileTimeConstant);
  4141. }
  4142. [Fact]
  4143. public void BaseConstructorInitializer()
  4144. {
  4145. string sourceCode = @"
  4146. class Class
  4147. {
  4148. Class(int x) : this(/*<bind>*/x/*</bind>*/ , x) { }
  4149. Class(int x, int y) { }
  4150. }
  4151. ";
  4152. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4153. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4154. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4155. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  4156. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4157. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4158. Assert.Equal("System.Int32 x", semanticInfo.Symbol.ToTestDisplayString());
  4159. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  4160. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4161. Assert.Equal(MethodKind.Constructor, ((MethodSymbol)semanticInfo.Symbol.ContainingSymbol).MethodKind);
  4162. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4163. Assert.False(semanticInfo.IsCompileTimeConstant);
  4164. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.ContainingSymbol.Kind);
  4165. Assert.Equal(MethodKind.Constructor, ((MethodSymbol)semanticInfo.Symbol.ContainingSymbol).MethodKind);
  4166. }
  4167. [WorkItem(541011, "DevDiv")]
  4168. [WorkItem(527831, "DevDiv")]
  4169. [WorkItem(538794, "DevDiv")]
  4170. [Fact]
  4171. public void InaccessibleMethodGroup()
  4172. {
  4173. string sourceCode = @"
  4174. class C
  4175. {
  4176. private static void M(long i) { }
  4177. private static void M(int i) { }
  4178. }
  4179. class D
  4180. {
  4181. void Foo()
  4182. {
  4183. C./*<bind>*/M/*</bind>*/(1);
  4184. }
  4185. }
  4186. ";
  4187. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4188. Assert.Null(semanticInfo.Type);
  4189. Assert.Null(semanticInfo.ConvertedType);
  4190. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4191. Assert.Null(semanticInfo.Symbol);
  4192. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  4193. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  4194. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4195. Assert.Equal("void C.M(System.Int32 i)", sortedCandidates[0].ToTestDisplayString());
  4196. Assert.Equal("void C.M(System.Int64 i)", sortedCandidates[1].ToTestDisplayString());
  4197. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  4198. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  4199. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  4200. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4201. Assert.Equal("void C.M(System.Int32 i)", sortedMethodGroup[0].ToTestDisplayString());
  4202. Assert.Equal("void C.M(System.Int64 i)", sortedMethodGroup[1].ToTestDisplayString());
  4203. Assert.False(semanticInfo.IsCompileTimeConstant);
  4204. }
  4205. [WorkItem(542782, "DevDiv")]
  4206. [Fact]
  4207. public void InaccessibleMethodGroup_Constructors_ObjectCreationExpressionSyntax()
  4208. {
  4209. string sourceCode = @"
  4210. using System;
  4211. class Program
  4212. {
  4213. public static void Main(string[] args)
  4214. {
  4215. var x = /*<bind>*/new Class1(3, 7)/*</bind>*/;
  4216. }
  4217. }
  4218. class Class1
  4219. {
  4220. protected Class1() { }
  4221. protected Class1(int x) { }
  4222. private Class1(int a, long b) { }
  4223. }
  4224. ";
  4225. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  4226. Assert.Equal("Class1", semanticInfo.Type.ToTestDisplayString());
  4227. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4228. Assert.Equal("Class1", semanticInfo.ConvertedType.ToTestDisplayString());
  4229. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4230. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4231. Assert.Null(semanticInfo.Symbol);
  4232. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  4233. Assert.Equal(3, semanticInfo.CandidateSymbols.Length);
  4234. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4235. Assert.Equal("Class1..ctor()", sortedCandidates[0].ToTestDisplayString());
  4236. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  4237. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedCandidates[1].ToTestDisplayString());
  4238. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  4239. Assert.Equal("Class1..ctor(System.Int32 x)", sortedCandidates[2].ToTestDisplayString());
  4240. Assert.Equal(SymbolKind.Method, sortedCandidates[2].Kind);
  4241. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  4242. sortedCandidates = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4243. Assert.Equal("Class1..ctor()", sortedCandidates[0].ToTestDisplayString());
  4244. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  4245. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedCandidates[1].ToTestDisplayString());
  4246. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  4247. Assert.Equal("Class1..ctor(System.Int32 x)", sortedCandidates[2].ToTestDisplayString());
  4248. Assert.Equal(SymbolKind.Method, sortedCandidates[2].Kind);
  4249. Assert.False(semanticInfo.IsCompileTimeConstant);
  4250. }
  4251. [WorkItem(542782, "DevDiv")]
  4252. [Fact]
  4253. public void InaccessibleMethodGroup_Constructors_IdentifierNameSyntax()
  4254. {
  4255. string sourceCode = @"
  4256. using System;
  4257. class Program
  4258. {
  4259. public static void Main(string[] args)
  4260. {
  4261. var x = new /*<bind>*/Class1/*</bind>*/(3, 7);
  4262. }
  4263. }
  4264. class Class1
  4265. {
  4266. protected Class1() { }
  4267. protected Class1(int x) { }
  4268. private Class1(int a, long b) { }
  4269. }
  4270. ";
  4271. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4272. Assert.Null(semanticInfo.Type);
  4273. Assert.Null(semanticInfo.ConvertedType);
  4274. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4275. Assert.Equal("Class1", semanticInfo.Symbol.ToTestDisplayString());
  4276. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4277. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4278. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4279. Assert.False(semanticInfo.IsCompileTimeConstant);
  4280. }
  4281. [WorkItem(542782, "DevDiv")]
  4282. [Fact]
  4283. public void InaccessibleMethodGroup_AttributeSyntax()
  4284. {
  4285. string sourceCode = @"
  4286. using System;
  4287. class Program
  4288. {
  4289. [/*<bind>*/Class1(3, 7)/*</bind>*/]
  4290. public static void Main(string[] args)
  4291. {
  4292. }
  4293. }
  4294. class Class1 : Attribute
  4295. {
  4296. protected Class1() { }
  4297. protected Class1(int x) { }
  4298. private Class1(int a, long b) { }
  4299. }
  4300. ";
  4301. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  4302. Assert.Equal("Class1", semanticInfo.Type.ToTestDisplayString());
  4303. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4304. Assert.Equal("Class1", semanticInfo.ConvertedType.ToTestDisplayString());
  4305. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4306. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4307. Assert.Null(semanticInfo.Symbol);
  4308. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  4309. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  4310. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4311. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedCandidates[0].ToTestDisplayString());
  4312. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  4313. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  4314. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4315. Assert.Equal("Class1..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  4316. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedMethodGroup[1].ToTestDisplayString());
  4317. Assert.Equal("Class1..ctor(System.Int32 x)", sortedMethodGroup[2].ToTestDisplayString());
  4318. Assert.False(semanticInfo.IsCompileTimeConstant);
  4319. }
  4320. [WorkItem(542782, "DevDiv")]
  4321. [Fact]
  4322. public void InaccessibleMethodGroup_Attribute_IdentifierNameSyntax()
  4323. {
  4324. string sourceCode = @"
  4325. using System;
  4326. class Program
  4327. {
  4328. [/*<bind>*/Class1/*</bind>*/(3, 7)]
  4329. public static void Main(string[] args)
  4330. {
  4331. }
  4332. }
  4333. class Class1 : Attribute
  4334. {
  4335. protected Class1() { }
  4336. protected Class1(int x) { }
  4337. private Class1(int a, long b) { }
  4338. }
  4339. ";
  4340. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4341. Assert.Equal("Class1", semanticInfo.Type.ToTestDisplayString());
  4342. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4343. Assert.Equal("Class1", semanticInfo.ConvertedType.ToTestDisplayString());
  4344. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4345. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4346. Assert.Null(semanticInfo.Symbol);
  4347. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  4348. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  4349. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4350. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedCandidates[0].ToTestDisplayString());
  4351. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  4352. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  4353. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4354. Assert.Equal("Class1..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  4355. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedMethodGroup[1].ToTestDisplayString());
  4356. Assert.Equal("Class1..ctor(System.Int32 x)", sortedMethodGroup[2].ToTestDisplayString());
  4357. Assert.False(semanticInfo.IsCompileTimeConstant);
  4358. }
  4359. [WorkItem(542782, "DevDiv")]
  4360. [Fact]
  4361. public void InaccesibleConstructorsFiltered_ObjectCreationExpressionSyntax()
  4362. {
  4363. string sourceCode = @"
  4364. using System;
  4365. class Program
  4366. {
  4367. public static void Main(string[] args)
  4368. {
  4369. var x = /*<bind>*/new Class1(3, 7)/*</bind>*/;
  4370. }
  4371. }
  4372. class Class1
  4373. {
  4374. protected Class1() { }
  4375. public Class1(int x) { }
  4376. public Class1(int a, long b) { }
  4377. }
  4378. ";
  4379. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  4380. Assert.Equal("Class1", semanticInfo.Type.ToTestDisplayString());
  4381. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4382. Assert.Equal("Class1", semanticInfo.ConvertedType.ToTestDisplayString());
  4383. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4384. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4385. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", semanticInfo.Symbol.ToTestDisplayString());
  4386. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  4387. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4388. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  4389. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4390. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedMethodGroup[0].ToTestDisplayString());
  4391. Assert.Equal("Class1..ctor(System.Int32 x)", sortedMethodGroup[1].ToTestDisplayString());
  4392. Assert.False(semanticInfo.IsCompileTimeConstant);
  4393. }
  4394. [WorkItem(542782, "DevDiv")]
  4395. [Fact]
  4396. public void InaccesibleConstructorsFiltered_IdentifierNameSyntax()
  4397. {
  4398. string sourceCode = @"
  4399. using System;
  4400. class Program
  4401. {
  4402. public static void Main(string[] args)
  4403. {
  4404. var x = new /*<bind>*/Class1/*</bind>*/(3, 7);
  4405. }
  4406. }
  4407. class Class1
  4408. {
  4409. protected Class1() { }
  4410. public Class1(int x) { }
  4411. public Class1(int a, long b) { }
  4412. }
  4413. ";
  4414. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4415. Assert.Null(semanticInfo.Type);
  4416. Assert.Null(semanticInfo.ConvertedType);
  4417. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4418. Assert.Equal("Class1", semanticInfo.Symbol.ToTestDisplayString());
  4419. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  4420. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4421. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4422. Assert.False(semanticInfo.IsCompileTimeConstant);
  4423. }
  4424. [WorkItem(542782, "DevDiv")]
  4425. [Fact]
  4426. public void InaccesibleConstructorsFiltered_AttributeSyntax()
  4427. {
  4428. string sourceCode = @"
  4429. using System;
  4430. class Program
  4431. {
  4432. [/*<bind>*/Class1(3, 7)/*</bind>*/]
  4433. public static void Main(string[] args)
  4434. {
  4435. }
  4436. }
  4437. class Class1 : Attribute
  4438. {
  4439. protected Class1() { }
  4440. public Class1(int x) { }
  4441. public Class1(int a, long b) { }
  4442. }
  4443. ";
  4444. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  4445. Assert.Equal("Class1", semanticInfo.Type.ToTestDisplayString());
  4446. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4447. Assert.Equal("Class1", semanticInfo.ConvertedType.ToTestDisplayString());
  4448. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4449. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4450. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", semanticInfo.Symbol.ToTestDisplayString());
  4451. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  4452. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4453. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  4454. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4455. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedMethodGroup[0].ToTestDisplayString());
  4456. Assert.Equal("Class1..ctor(System.Int32 x)", sortedMethodGroup[1].ToTestDisplayString());
  4457. Assert.False(semanticInfo.IsCompileTimeConstant);
  4458. }
  4459. [WorkItem(542782, "DevDiv")]
  4460. [Fact]
  4461. public void InaccesibleConstructorsFiltered_Attribute_IdentifierNameSyntax()
  4462. {
  4463. string sourceCode = @"
  4464. using System;
  4465. class Program
  4466. {
  4467. [/*<bind>*/Class1/*</bind>*/(3, 7)]
  4468. public static void Main(string[] args)
  4469. {
  4470. }
  4471. }
  4472. class Class1 : Attribute
  4473. {
  4474. protected Class1() { }
  4475. public Class1(int x) { }
  4476. public Class1(int a, long b) { }
  4477. }
  4478. ";
  4479. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4480. Assert.Equal("Class1", semanticInfo.Type.ToTestDisplayString());
  4481. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4482. Assert.Equal("Class1", semanticInfo.ConvertedType.ToTestDisplayString());
  4483. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4484. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4485. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", semanticInfo.Symbol.ToTestDisplayString());
  4486. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  4487. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4488. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  4489. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4490. Assert.Equal("Class1..ctor(System.Int32 a, System.Int64 b)", sortedMethodGroup[0].ToTestDisplayString());
  4491. Assert.Equal("Class1..ctor(System.Int32 x)", sortedMethodGroup[1].ToTestDisplayString());
  4492. Assert.False(semanticInfo.IsCompileTimeConstant);
  4493. }
  4494. [WorkItem(528754, "DevDiv")]
  4495. [Fact]
  4496. public void SyntaxErrorInReceiver()
  4497. {
  4498. string sourceCode = @"
  4499. public delegate int D(int x);
  4500. public class C
  4501. {
  4502. public C(int i) { }
  4503. public void M(D d) { }
  4504. }
  4505. class Main
  4506. {
  4507. void Foo(int a)
  4508. {
  4509. new C(a.).M(x => /*<bind>*/x/*</bind>*/);
  4510. }
  4511. }";
  4512. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4513. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  4514. }
  4515. [WorkItem(528754, "DevDiv")]
  4516. [Fact]
  4517. public void SyntaxErrorInReceiverWithExtension()
  4518. {
  4519. string sourceCode = @"
  4520. public delegate int D(int x);
  4521. public static class CExtensions
  4522. {
  4523. public static void M(this C c, D d) { }
  4524. }
  4525. public class C
  4526. {
  4527. public C(int i) { }
  4528. }
  4529. class Main
  4530. {
  4531. void Foo(int a)
  4532. {
  4533. new C(a.).M(x => /*<bind>*/x/*</bind>*/);
  4534. }
  4535. }";
  4536. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4537. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  4538. }
  4539. [WorkItem(541011, "DevDiv")]
  4540. [Fact]
  4541. public void NonStaticInstanceMismatchMethodGroup()
  4542. {
  4543. string sourceCode = @"
  4544. class C
  4545. {
  4546. public static int P { get; set; }
  4547. }
  4548. class D
  4549. {
  4550. void Foo()
  4551. {
  4552. C./*<bind>*/set_P/*</bind>*/(1);
  4553. }
  4554. }
  4555. ";
  4556. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4557. Assert.Null(semanticInfo.Type);
  4558. Assert.Null(semanticInfo.ConvertedType);
  4559. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4560. Assert.Null(semanticInfo.Symbol);
  4561. Assert.Equal(CandidateReason.NotReferencable, semanticInfo.CandidateReason);
  4562. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  4563. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4564. Assert.Equal("void C.P.set", sortedCandidates[0].ToTestDisplayString());
  4565. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  4566. Assert.Equal(MethodKind.PropertySet, ((MethodSymbol)sortedCandidates[0]).MethodKind);
  4567. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  4568. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4569. Assert.Equal("void C.P.set", sortedMethodGroup[0].ToTestDisplayString());
  4570. Assert.False(semanticInfo.IsCompileTimeConstant);
  4571. }
  4572. [WorkItem(540360, "DevDiv")]
  4573. [Fact]
  4574. public void DuplicateTypeName()
  4575. {
  4576. string sourceCode = @"
  4577. struct C { }
  4578. class C
  4579. {
  4580. public static void M() { }
  4581. }
  4582. enum C { A, B }
  4583. class D
  4584. {
  4585. static void Main()
  4586. {
  4587. /*<bind>*/C/*</bind>*/.M();
  4588. }
  4589. }
  4590. ";
  4591. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4592. Assert.Equal("C", semanticInfo.Type.ToTestDisplayString());
  4593. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  4594. Assert.Equal("C", semanticInfo.ConvertedType.ToTestDisplayString());
  4595. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  4596. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4597. Assert.Null(semanticInfo.Symbol);
  4598. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  4599. Assert.Equal(3, semanticInfo.CandidateSymbols.Length);
  4600. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  4601. Assert.Equal("C", sortedCandidates[0].ToTestDisplayString());
  4602. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  4603. Assert.Equal("C", sortedCandidates[1].ToTestDisplayString());
  4604. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  4605. Assert.Equal("C", sortedCandidates[2].ToTestDisplayString());
  4606. Assert.Equal(SymbolKind.NamedType, sortedCandidates[2].Kind);
  4607. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4608. Assert.False(semanticInfo.IsCompileTimeConstant);
  4609. }
  4610. [Fact]
  4611. public void IfCondition()
  4612. {
  4613. string sourceCode = @"
  4614. class C
  4615. {
  4616. void M(int x)
  4617. {
  4618. if (/*<bind>*/x == 10/*</bind>*/) {}
  4619. }
  4620. }
  4621. ";
  4622. var semanticInfo = GetSemanticInfoForTest<BinaryExpressionSyntax>(sourceCode);
  4623. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  4624. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4625. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  4626. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4627. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4628. Assert.Equal("System.Boolean System.Int32.op_Equality(System.Int32 left, System.Int32 right)", semanticInfo.Symbol.ToTestDisplayString());
  4629. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4630. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4631. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4632. Assert.False(semanticInfo.IsCompileTimeConstant);
  4633. }
  4634. [Fact]
  4635. public void ForCondition()
  4636. {
  4637. string sourceCode = @"
  4638. class C
  4639. {
  4640. void M(int x)
  4641. {
  4642. for (int i = 0; /*<bind>*/i < 10/*</bind>*/; i = i + 1) { }
  4643. }
  4644. }
  4645. ";
  4646. var semanticInfo = GetSemanticInfoForTest<BinaryExpressionSyntax>(sourceCode);
  4647. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  4648. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4649. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  4650. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4651. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4652. Assert.Equal("System.Boolean System.Int32.op_LessThan(System.Int32 left, System.Int32 right)", semanticInfo.Symbol.ToTestDisplayString());
  4653. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4654. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4655. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4656. Assert.False(semanticInfo.IsCompileTimeConstant);
  4657. }
  4658. [WorkItem(539925, "DevDiv")]
  4659. [Fact]
  4660. public void LocalIsFromSource()
  4661. {
  4662. string sourceCode = @"
  4663. class C
  4664. {
  4665. void M()
  4666. {
  4667. int x = 1;
  4668. int y = /*<bind>*/x/*</bind>*/;
  4669. }
  4670. }
  4671. ";
  4672. var compilation = CreateCompilationWithMscorlib(sourceCode);
  4673. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(compilation);
  4674. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4675. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4676. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  4677. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4678. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4679. Assert.Equal("System.Int32 x", semanticInfo.Symbol.ToTestDisplayString());
  4680. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  4681. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4682. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4683. Assert.False(semanticInfo.IsCompileTimeConstant);
  4684. Assert.True(((Symbol)semanticInfo.Symbol).IsFromCompilation(compilation));
  4685. }
  4686. [WorkItem(540541, "DevDiv")]
  4687. [Fact]
  4688. public void InEnumElementInitializer()
  4689. {
  4690. string sourceCode = @"
  4691. class C
  4692. {
  4693. public const int x = 1;
  4694. }
  4695. enum E
  4696. {
  4697. q = /*<bind>*/C.x/*</bind>*/,
  4698. }
  4699. ";
  4700. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  4701. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4702. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4703. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  4704. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4705. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4706. Assert.Equal("System.Int32 C.x", semanticInfo.Symbol.ToTestDisplayString());
  4707. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4708. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4709. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4710. Assert.True(semanticInfo.IsCompileTimeConstant);
  4711. Assert.Equal(1, semanticInfo.ConstantValue);
  4712. }
  4713. [WorkItem(540541, "DevDiv")]
  4714. [Fact]
  4715. public void InEnumOfByteElementInitializer()
  4716. {
  4717. string sourceCode = @"
  4718. class C
  4719. {
  4720. public const int x = 1;
  4721. }
  4722. enum E : byte
  4723. {
  4724. q = /*<bind>*/C.x/*</bind>*/,
  4725. }
  4726. ";
  4727. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  4728. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4729. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4730. Assert.Equal("System.Byte", semanticInfo.ConvertedType.ToTestDisplayString());
  4731. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4732. Assert.Equal(ConversionKind.ImplicitConstant, semanticInfo.ImplicitConversion.Kind);
  4733. Assert.Equal("System.Int32 C.x", semanticInfo.Symbol.ToTestDisplayString());
  4734. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  4735. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4736. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4737. Assert.True(semanticInfo.IsCompileTimeConstant);
  4738. Assert.Equal(1, semanticInfo.ConstantValue);
  4739. }
  4740. [WorkItem(540672, "DevDiv")]
  4741. [Fact]
  4742. public void LambdaExprWithErrorTypeInObjectCreationExpression()
  4743. {
  4744. var text = @"
  4745. class Program
  4746. {
  4747. static int Main()
  4748. {
  4749. var d = /*<bind>*/() => { if (true) return new X(); else return new Y(); }/*</bind>*/;
  4750. }
  4751. }
  4752. ";
  4753. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(text);
  4754. Assert.NotNull(semanticInfo);
  4755. Assert.Null(semanticInfo.Type);
  4756. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  4757. }
  4758. [Fact]
  4759. public void LambdaExpression()
  4760. {
  4761. string sourceCode = @"
  4762. using System;
  4763. public class TestClass
  4764. {
  4765. public static void Main()
  4766. {
  4767. Func<string, int> f = /*<bind>*/str => 10/*</bind>*/ ;
  4768. }
  4769. }
  4770. ";
  4771. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  4772. Assert.Null(semanticInfo.Type);
  4773. Assert.Equal("System.Func<System.String, System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  4774. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  4775. Assert.Equal(ConversionKind.AnonymousFunction, semanticInfo.ImplicitConversion.Kind);
  4776. Assert.Equal("lambda expression", semanticInfo.Symbol.ToTestDisplayString());
  4777. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  4778. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4779. MethodSymbol lambdaSym = (MethodSymbol)(semanticInfo.Symbol);
  4780. Assert.Equal(1, lambdaSym.Parameters.Length);
  4781. Assert.Equal("str", lambdaSym.Parameters[0].Name);
  4782. Assert.Equal("System.String", lambdaSym.Parameters[0].Type.ToTestDisplayString());
  4783. Assert.Equal("System.Int32", lambdaSym.ReturnType.ToTestDisplayString());
  4784. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4785. Assert.False(semanticInfo.IsCompileTimeConstant);
  4786. }
  4787. [Fact]
  4788. public void UnboundLambdaExpression()
  4789. {
  4790. string sourceCode = @"
  4791. using System;
  4792. public class TestClass
  4793. {
  4794. public static void Main()
  4795. {
  4796. object f = /*<bind>*/str => 10/*</bind>*/;
  4797. }
  4798. }
  4799. ";
  4800. var semanticInfo = GetSemanticInfoForTest<SimpleLambdaExpressionSyntax>(sourceCode);
  4801. Assert.Null(semanticInfo.Type);
  4802. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  4803. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4804. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  4805. Assert.Equal("lambda expression", semanticInfo.Symbol.ToTestDisplayString());
  4806. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  4807. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4808. MethodSymbol lambdaSym = (MethodSymbol)(semanticInfo.Symbol);
  4809. Assert.Equal(1, lambdaSym.Parameters.Length);
  4810. Assert.Equal("str", lambdaSym.Parameters[0].Name);
  4811. Assert.Equal(TypeKind.Error, lambdaSym.Parameters[0].Type.TypeKind);
  4812. Assert.Equal("System.Int32", lambdaSym.ReturnType.ToTestDisplayString());
  4813. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4814. Assert.False(semanticInfo.IsCompileTimeConstant);
  4815. }
  4816. [WorkItem(540650, "DevDiv")]
  4817. [Fact]
  4818. public void TypeOfExpression()
  4819. {
  4820. string sourceCode = @"
  4821. class C
  4822. {
  4823. static void Main()
  4824. {
  4825. System.Console.WriteLine(/*<bind>*/typeof(C)/*</bind>*/);
  4826. }
  4827. }
  4828. ";
  4829. var semanticInfo = GetSemanticInfoForTest<TypeOfExpressionSyntax>(sourceCode);
  4830. Assert.Equal("System.Type", semanticInfo.Type.ToTestDisplayString());
  4831. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  4832. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  4833. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  4834. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  4835. Assert.Null(semanticInfo.Symbol);
  4836. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4837. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4838. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4839. Assert.False(semanticInfo.IsCompileTimeConstant);
  4840. }
  4841. [WorkItem(540759, "DevDiv")]
  4842. [Fact]
  4843. public void DeclarationEmbeddedStatement_If()
  4844. {
  4845. string sourceCode = @"
  4846. class Program
  4847. {
  4848. static void Main(string[] args)
  4849. {
  4850. bool c = true;
  4851. if (c)
  4852. int j = /*<bind>*/43/*</bind>*/;
  4853. }
  4854. }
  4855. ";
  4856. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  4857. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4858. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4859. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  4860. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4861. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4862. Assert.Null(semanticInfo.Symbol);
  4863. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4864. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4865. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4866. Assert.True(semanticInfo.IsCompileTimeConstant);
  4867. Assert.Equal(43, semanticInfo.ConstantValue);
  4868. }
  4869. [WorkItem(540759, "DevDiv")]
  4870. [Fact]
  4871. public void LabeledEmbeddedStatement_For()
  4872. {
  4873. string sourceCode = @"
  4874. class Program
  4875. {
  4876. static void Main(string[] args)
  4877. {
  4878. bool c = true;
  4879. for (; c; c = !c)
  4880. label: /*<bind>*/c/*</bind>*/ = false;
  4881. }
  4882. }
  4883. ";
  4884. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4885. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  4886. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4887. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  4888. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4889. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4890. Assert.Equal("System.Boolean c", semanticInfo.Symbol.ToTestDisplayString());
  4891. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  4892. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4893. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4894. Assert.False(semanticInfo.IsCompileTimeConstant);
  4895. }
  4896. [WorkItem(540759, "DevDiv")]
  4897. [Fact]
  4898. public void DeclarationEmbeddedStatement_While()
  4899. {
  4900. string sourceCode = @"
  4901. class Program
  4902. {
  4903. static void Main(string[] args)
  4904. {
  4905. bool c = true;
  4906. while (c)
  4907. int j = /*<bind>*/43/*</bind>*/;
  4908. }
  4909. }
  4910. ";
  4911. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  4912. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4913. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4914. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  4915. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4916. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4917. Assert.Null(semanticInfo.Symbol);
  4918. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4919. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4920. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4921. Assert.True(semanticInfo.IsCompileTimeConstant);
  4922. Assert.Equal(43, semanticInfo.ConstantValue);
  4923. }
  4924. [WorkItem(540759, "DevDiv")]
  4925. [Fact]
  4926. public void LabeledEmbeddedStatement_ForEach()
  4927. {
  4928. string sourceCode = @"
  4929. class Program
  4930. {
  4931. static void Main(string[] args)
  4932. {
  4933. bool c = true;
  4934. foreach (string s in args)
  4935. label: /*<bind>*/c/*</bind>*/ = false;
  4936. }
  4937. }
  4938. ";
  4939. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4940. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  4941. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4942. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  4943. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4944. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  4945. Assert.Equal("System.Boolean c", semanticInfo.Symbol.ToTestDisplayString());
  4946. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  4947. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4948. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4949. Assert.False(semanticInfo.IsCompileTimeConstant);
  4950. }
  4951. [WorkItem(540759, "DevDiv")]
  4952. [Fact]
  4953. public void DeclarationEmbeddedStatement_Else()
  4954. {
  4955. string sourceCode = @"
  4956. class Program
  4957. {
  4958. static void Main(string[] args)
  4959. {
  4960. bool c = true;
  4961. if (c);
  4962. else
  4963. long j = /*<bind>*/43/*</bind>*/;
  4964. }
  4965. }
  4966. ";
  4967. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  4968. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  4969. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4970. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  4971. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  4972. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  4973. Assert.Null(semanticInfo.Symbol);
  4974. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  4975. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  4976. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  4977. Assert.True(semanticInfo.IsCompileTimeConstant);
  4978. Assert.Equal(43, semanticInfo.ConstantValue);
  4979. }
  4980. [WorkItem(540759, "DevDiv")]
  4981. [Fact]
  4982. public void LabeledEmbeddedStatement_Do()
  4983. {
  4984. string sourceCode = @"
  4985. class Program
  4986. {
  4987. static void Main(string[] args)
  4988. {
  4989. bool c = true;
  4990. do
  4991. label: /*<bind>*/c/*</bind>*/ = false;
  4992. while(c);
  4993. }
  4994. }
  4995. ";
  4996. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  4997. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  4998. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  4999. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  5000. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5001. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5002. Assert.Equal("System.Boolean c", semanticInfo.Symbol.ToTestDisplayString());
  5003. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  5004. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5005. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5006. Assert.False(semanticInfo.IsCompileTimeConstant);
  5007. }
  5008. [WorkItem(540759, "DevDiv")]
  5009. [Fact]
  5010. public void DeclarationEmbeddedStatement_Using()
  5011. {
  5012. string sourceCode = @"
  5013. class Program
  5014. {
  5015. static void Main(string[] args)
  5016. {
  5017. bool c = true;
  5018. using(null)
  5019. long j = /*<bind>*/43/*</bind>*/;
  5020. }
  5021. }
  5022. ";
  5023. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  5024. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  5025. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5026. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  5027. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5028. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  5029. Assert.Null(semanticInfo.Symbol);
  5030. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5031. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5032. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5033. Assert.True(semanticInfo.IsCompileTimeConstant);
  5034. Assert.Equal(43, semanticInfo.ConstantValue);
  5035. }
  5036. [WorkItem(540759, "DevDiv")]
  5037. [Fact]
  5038. public void LabeledEmbeddedStatement_Lock()
  5039. {
  5040. string sourceCode = @"
  5041. class Program
  5042. {
  5043. static void Main(string[] args)
  5044. {
  5045. bool c = true;
  5046. lock(this)
  5047. label: /*<bind>*/c/*</bind>*/ = false;
  5048. }
  5049. }
  5050. ";
  5051. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5052. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  5053. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5054. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  5055. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5056. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5057. Assert.Equal("System.Boolean c", semanticInfo.Symbol.ToTestDisplayString());
  5058. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  5059. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5060. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5061. Assert.False(semanticInfo.IsCompileTimeConstant);
  5062. }
  5063. [WorkItem(540759, "DevDiv")]
  5064. [Fact]
  5065. public void DeclarationEmbeddedStatement_Fixed()
  5066. {
  5067. string sourceCode = @"
  5068. unsafe class Program
  5069. {
  5070. static void Main(string[] args)
  5071. {
  5072. bool c = true;
  5073. fixed (bool* p = &c)
  5074. int j = /*<bind>*/43/*</bind>*/;
  5075. }
  5076. }
  5077. ";
  5078. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  5079. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  5080. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5081. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  5082. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5083. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5084. Assert.Null(semanticInfo.Symbol);
  5085. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5086. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5087. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5088. Assert.True(semanticInfo.IsCompileTimeConstant);
  5089. Assert.Equal(43, semanticInfo.ConstantValue);
  5090. }
  5091. [WorkItem(539255, "DevDiv")]
  5092. [Fact]
  5093. public void BindLiteralCastToDouble()
  5094. {
  5095. string sourceCode = @"
  5096. class MyClass
  5097. {
  5098. double dbl = /*<bind>*/1/*</bind>*/ ;
  5099. }
  5100. ";
  5101. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  5102. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  5103. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5104. Assert.Equal("System.Double", semanticInfo.ConvertedType.ToTestDisplayString());
  5105. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5106. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  5107. Assert.Null(semanticInfo.Symbol);
  5108. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5109. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5110. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5111. Assert.True(semanticInfo.IsCompileTimeConstant);
  5112. Assert.Equal(1, semanticInfo.ConstantValue);
  5113. }
  5114. [WorkItem(540803, "DevDiv")]
  5115. [Fact]
  5116. public void BindDefaultOfVoidExpr()
  5117. {
  5118. string sourceCode = @"
  5119. class C
  5120. {
  5121. void M()
  5122. {
  5123. return /*<bind>*/default(void)/*</bind>*/;
  5124. }
  5125. }
  5126. ";
  5127. var semanticInfo = GetSemanticInfoForTest<DefaultExpressionSyntax>(sourceCode);
  5128. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  5129. Assert.Equal(SpecialType.System_Void, semanticInfo.Type.SpecialType);
  5130. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5131. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  5132. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5133. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5134. Assert.Null(semanticInfo.Symbol);
  5135. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5136. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5137. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5138. Assert.False(semanticInfo.IsCompileTimeConstant);
  5139. }
  5140. [Fact]
  5141. public void GetSemanticInfoForBaseConstructorInitializer()
  5142. {
  5143. string sourceCode = @"
  5144. class C
  5145. {
  5146. C() /*<bind>*/: base()/*</bind>*/ { }
  5147. }
  5148. ";
  5149. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  5150. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  5151. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5152. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  5153. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5154. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5155. Assert.Equal("System.Object..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  5156. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5157. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5158. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5159. Assert.False(semanticInfo.IsCompileTimeConstant);
  5160. }
  5161. [Fact]
  5162. public void GetSemanticInfoForThisConstructorInitializer()
  5163. {
  5164. string sourceCode = @"
  5165. class C
  5166. {
  5167. C() /*<bind>*/: this(1)/*</bind>*/ { }
  5168. C(int x) { }
  5169. }
  5170. ";
  5171. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  5172. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  5173. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5174. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  5175. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5176. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5177. Assert.Equal("C..ctor(System.Int32 x)", semanticInfo.Symbol.ToTestDisplayString());
  5178. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5179. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5180. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5181. Assert.False(semanticInfo.IsCompileTimeConstant);
  5182. }
  5183. [WorkItem(540862, "DevDiv")]
  5184. [Fact]
  5185. public void ThisStaticConstructorInitializer()
  5186. {
  5187. string sourceCode = @"
  5188. class MyClass
  5189. {
  5190. static MyClass()
  5191. /*<bind>*/: this()/*</bind>*/
  5192. {
  5193. intI = 2;
  5194. }
  5195. public MyClass() { }
  5196. static int intI = 1;
  5197. }
  5198. ";
  5199. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  5200. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  5201. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5202. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  5203. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5204. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5205. Assert.Equal("MyClass..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  5206. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5207. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5208. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5209. Assert.False(semanticInfo.IsCompileTimeConstant);
  5210. }
  5211. [WorkItem(541037, "DevDiv")]
  5212. [Fact]
  5213. public void IncompleteForEachWithArrayCreationExpr()
  5214. {
  5215. string sourceCode = @"
  5216. class Program
  5217. {
  5218. static void Main(string[] args)
  5219. {
  5220. foreach (var f in new int[] { /*<bind>*/5/*</bind>*/
  5221. {
  5222. Console.WriteLine(f);
  5223. }
  5224. }
  5225. }
  5226. ";
  5227. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  5228. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  5229. Assert.True(semanticInfo.IsCompileTimeConstant);
  5230. Assert.Equal(5, (int)semanticInfo.ConstantValue.Value);
  5231. }
  5232. [WorkItem(541037, "DevDiv")]
  5233. [Fact]
  5234. public void EmptyStatementInForEach()
  5235. {
  5236. string sourceCode = @"
  5237. class Program
  5238. {
  5239. static void Main(string[] args)
  5240. {
  5241. foreach (var a in /*<bind>*/args/*</bind>*/);
  5242. }
  5243. }
  5244. ";
  5245. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  5246. Assert.Equal(SpecialType.System_String, ((ArrayTypeSymbol)semanticInfo.Type).ElementType.SpecialType);
  5247. // CONSIDER: we could conceivable use the foreach collection type (vs the type of the collection expr).
  5248. Assert.Equal(SpecialType.System_Collections_IEnumerable, semanticInfo.ConvertedType.SpecialType);
  5249. Assert.Equal("args", semanticInfo.Symbol.Name);
  5250. }
  5251. [WorkItem(540922, "DevDiv")]
  5252. [WorkItem(541030, "DevDiv")]
  5253. [Fact]
  5254. public void ImplicitlyTypedForEachIterationVariable()
  5255. {
  5256. string sourceCode = @"
  5257. class Program
  5258. {
  5259. static void Main(string[] args)
  5260. {
  5261. foreach (/*<bind>*/var/*</bind>*/ a in args);
  5262. }
  5263. }
  5264. ";
  5265. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  5266. Assert.Equal(SpecialType.System_String, semanticInfo.Type.SpecialType);
  5267. var symbol = semanticInfo.Symbol;
  5268. Assert.Equal(SymbolKind.NamedType, symbol.Kind);
  5269. Assert.Equal(SpecialType.System_String, ((TypeSymbol)symbol).SpecialType);
  5270. }
  5271. [Fact]
  5272. public void ForEachCollectionConvertedType()
  5273. {
  5274. // Arrays don't actually use IEnumerable, but that's the spec'd behavior.
  5275. CheckForEachCollectionConvertedType("int[]", "System.Int32[]", "System.Collections.IEnumerable");
  5276. CheckForEachCollectionConvertedType("int[,]", "System.Int32[,]", "System.Collections.IEnumerable");
  5277. // Strings don't actually use string.GetEnumerator, but that's the spec'd behavior.
  5278. CheckForEachCollectionConvertedType("string", "System.String", "System.String");
  5279. // Special case for dynamic
  5280. CheckForEachCollectionConvertedType("dynamic", "dynamic", "System.Collections.IEnumerable");
  5281. // Pattern-based, not interface-based
  5282. CheckForEachCollectionConvertedType("System.Collections.Generic.List<int>", "System.Collections.Generic.List<System.Int32>", "System.Collections.Generic.List<System.Int32>");
  5283. // Interface-based
  5284. CheckForEachCollectionConvertedType("Enumerable", "Enumerable", "System.Collections.IEnumerable"); // helper method knows definition of this type
  5285. // Interface
  5286. CheckForEachCollectionConvertedType("System.Collections.Generic.IEnumerable<int>", "System.Collections.Generic.IEnumerable<System.Int32>", "System.Collections.Generic.IEnumerable<System.Int32>");
  5287. // Interface
  5288. CheckForEachCollectionConvertedType("NotAType", "NotAType", "NotAType"); // name not in scope
  5289. }
  5290. private void CheckForEachCollectionConvertedType(string sourceType, string typeDisplayString, string convertedTypeDisplayString)
  5291. {
  5292. string template = @"
  5293. public class Enumerable : System.Collections.IEnumerable
  5294. {{
  5295. System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  5296. {{
  5297. return null;
  5298. }}
  5299. }}
  5300. class Program
  5301. {{
  5302. void M({0} collection)
  5303. {{
  5304. foreach (var v in /*<bind>*/collection/*</bind>*/);
  5305. }}
  5306. }}
  5307. ";
  5308. var semanticInfo = GetSemanticInfoForTest(string.Format(template, sourceType));
  5309. Assert.Equal(typeDisplayString, semanticInfo.Type.ToTestDisplayString());
  5310. Assert.Equal(convertedTypeDisplayString, semanticInfo.ConvertedType.ToTestDisplayString());
  5311. }
  5312. [Fact]
  5313. public void InaccessibleParameter()
  5314. {
  5315. string sourceCode = @"
  5316. using System;
  5317. class Outer
  5318. {
  5319. class Inner
  5320. {
  5321. }
  5322. }
  5323. class Program
  5324. {
  5325. public static void f(Outer.Inner a) { /*<bind>*/a/*</bind>*/ = 4; }
  5326. }
  5327. ";
  5328. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5329. Assert.Equal("Outer.Inner", semanticInfo.Type.ToTestDisplayString());
  5330. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5331. Assert.Equal("Outer.Inner", semanticInfo.ConvertedType.ToTestDisplayString());
  5332. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5333. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5334. Assert.Equal("Outer.Inner a", semanticInfo.Symbol.ToTestDisplayString());
  5335. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  5336. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5337. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5338. Assert.False(semanticInfo.IsCompileTimeConstant);
  5339. // Parameter's type is an error type, because Outer.Inner is inaccessible.
  5340. ParameterSymbol param = (ParameterSymbol)semanticInfo.Symbol;
  5341. Assert.Equal(TypeKind.Error, param.Type.TypeKind);
  5342. // It's type is not equal to the SemanticInfo type, because that is
  5343. // not an error type.
  5344. Assert.NotEqual(semanticInfo.Type, param.Type);
  5345. }
  5346. [Fact]
  5347. public void StructConstructor()
  5348. {
  5349. string sourceCode = @"
  5350. struct Struct{
  5351. public static void Main()
  5352. {
  5353. Struct s = /*<bind>*/new Struct()/*</bind>*/;
  5354. }
  5355. }
  5356. ";
  5357. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  5358. Assert.Equal("Struct", semanticInfo.Type.ToTestDisplayString());
  5359. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5360. Assert.Equal("Struct", semanticInfo.ConvertedType.ToTestDisplayString());
  5361. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5362. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5363. var symbol = semanticInfo.Symbol;
  5364. Assert.NotNull(symbol);
  5365. Assert.Equal(SymbolKind.Method, symbol.Kind);
  5366. Assert.Equal(MethodKind.Constructor, ((MethodSymbol)symbol).MethodKind);
  5367. Assert.True(symbol.IsImplicitlyDeclared);
  5368. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5369. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5370. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  5371. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5372. Assert.Equal("Struct..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  5373. Assert.False(semanticInfo.IsCompileTimeConstant);
  5374. }
  5375. [Fact]
  5376. public void MethodGroupAsArgOfInvalidConstructorCall()
  5377. {
  5378. string sourceCode = @"
  5379. using System;
  5380. class Class { string M(int i) { new T(/*<bind>*/M/*</bind>*/); } }
  5381. ";
  5382. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5383. Assert.Null(semanticInfo.Type);
  5384. Assert.Null(semanticInfo.ConvertedType);
  5385. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5386. Assert.Null(semanticInfo.Symbol);
  5387. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  5388. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  5389. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5390. Assert.Equal("System.String Class.M(System.Int32 i)", sortedCandidates[0].ToTestDisplayString());
  5391. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  5392. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  5393. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5394. Assert.Equal("System.String Class.M(System.Int32 i)", sortedMethodGroup[0].ToTestDisplayString());
  5395. Assert.False(semanticInfo.IsCompileTimeConstant);
  5396. }
  5397. [Fact]
  5398. public void MethodGroupInReturnStatement()
  5399. {
  5400. string sourceCode = @"
  5401. class C
  5402. {
  5403. public delegate int Func(int i);
  5404. public Func Foo()
  5405. {
  5406. return /*<bind>*/Foo/*</bind>*/;
  5407. }
  5408. private int Foo(int i)
  5409. {
  5410. return i;
  5411. }
  5412. }
  5413. ";
  5414. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5415. Assert.Null(semanticInfo.Type);
  5416. Assert.Equal("C.Func", semanticInfo.ConvertedType.ToTestDisplayString());
  5417. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  5418. Assert.Equal(ConversionKind.MethodGroup, semanticInfo.ImplicitConversion.Kind);
  5419. Assert.Equal("C.Foo(int)", semanticInfo.ImplicitConversion.Method.ToString());
  5420. Assert.Equal("System.Int32 C.Foo(System.Int32 i)", semanticInfo.Symbol.ToTestDisplayString());
  5421. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5422. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5423. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  5424. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5425. Assert.Equal("C.Func C.Foo()", sortedMethodGroup[0].ToTestDisplayString());
  5426. Assert.Equal("System.Int32 C.Foo(System.Int32 i)", sortedMethodGroup[1].ToTestDisplayString());
  5427. Assert.False(semanticInfo.IsCompileTimeConstant);
  5428. }
  5429. [Fact]
  5430. public void DelegateConversionExtensionMethodNoReceiver()
  5431. {
  5432. string sourceCode =
  5433. @"class C
  5434. {
  5435. static System.Action<object> F()
  5436. {
  5437. return /*<bind>*/S.E/*</bind>*/;
  5438. }
  5439. }
  5440. static class S
  5441. {
  5442. internal static void E(this object o) { }
  5443. }";
  5444. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  5445. Assert.NotNull(semanticInfo);
  5446. Assert.Equal("System.Action<System.Object>", semanticInfo.ConvertedType.ToTestDisplayString());
  5447. Assert.Equal("void S.E(this System.Object o)", semanticInfo.Symbol.ToTestDisplayString());
  5448. Assert.Equal(ConversionKind.MethodGroup, semanticInfo.ImplicitConversion.Kind);
  5449. Assert.False(semanticInfo.ImplicitConversion.IsExtensionMethod);
  5450. }
  5451. [Fact]
  5452. public void DelegateConversionExtensionMethod()
  5453. {
  5454. string sourceCode =
  5455. @"class C
  5456. {
  5457. static System.Action F(object o)
  5458. {
  5459. return /*<bind>*/o.E/*</bind>*/;
  5460. }
  5461. }
  5462. static class S
  5463. {
  5464. internal static void E(this object o) { }
  5465. }";
  5466. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  5467. Assert.NotNull(semanticInfo);
  5468. Assert.Equal("System.Action", semanticInfo.ConvertedType.ToTestDisplayString());
  5469. Assert.Equal("void System.Object.E()", semanticInfo.Symbol.ToTestDisplayString());
  5470. Assert.Equal(ConversionKind.MethodGroup, semanticInfo.ImplicitConversion.Kind);
  5471. Assert.True(semanticInfo.ImplicitConversion.IsExtensionMethod);
  5472. }
  5473. [Fact]
  5474. public void InferredVarType()
  5475. {
  5476. string sourceCode = @"
  5477. using System;
  5478. using System.Collections.Generic;
  5479. using System.Linq;
  5480. class Program
  5481. {
  5482. static void Main(string[] args)
  5483. {
  5484. var x = ""hello"";
  5485. /*<bind>*/var/*</bind>*/ y = x;
  5486. }
  5487. }
  5488. ";
  5489. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5490. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  5491. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5492. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  5493. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5494. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5495. Assert.Equal("System.String", semanticInfo.Symbol.ToTestDisplayString());
  5496. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  5497. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5498. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5499. Assert.False(semanticInfo.IsCompileTimeConstant);
  5500. }
  5501. [Fact]
  5502. public void InferredVarTypeWithNamespaceInScope()
  5503. {
  5504. string sourceCode = @"
  5505. using System;
  5506. using System.Collections.Generic;
  5507. using System.Linq;
  5508. namespace var { }
  5509. class Program
  5510. {
  5511. static void Main(string[] args)
  5512. {
  5513. var x = ""hello"";
  5514. /*<bind>*/var/*</bind>*/ y = x;
  5515. }
  5516. }
  5517. ";
  5518. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5519. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  5520. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5521. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  5522. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5523. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5524. Assert.Equal("System.String", semanticInfo.Symbol.ToTestDisplayString());
  5525. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  5526. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5527. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5528. Assert.False(semanticInfo.IsCompileTimeConstant);
  5529. }
  5530. [Fact]
  5531. public void NonInferredVarType()
  5532. {
  5533. string sourceCode = @"
  5534. using System;
  5535. using System.Collections.Generic;
  5536. using System.Linq;
  5537. namespace N1
  5538. {
  5539. class var { }
  5540. class Program
  5541. {
  5542. static void Main(string[] args)
  5543. {
  5544. /*<bind>*/var/*</bind>*/ x = ""hello"";
  5545. }
  5546. }
  5547. }
  5548. ";
  5549. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5550. Assert.Equal("N1.var", semanticInfo.Type.ToTestDisplayString());
  5551. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5552. Assert.Equal("N1.var", semanticInfo.ConvertedType.ToTestDisplayString());
  5553. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5554. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5555. Assert.Equal("N1.var", semanticInfo.Symbol.ToTestDisplayString());
  5556. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  5557. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5558. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5559. Assert.False(semanticInfo.IsCompileTimeConstant);
  5560. }
  5561. [WorkItem(541207, "DevDiv")]
  5562. [Fact]
  5563. public void UndeclaredVarInThrowExpr()
  5564. {
  5565. string sourceCode = @"
  5566. class Test
  5567. {
  5568. static void Main()
  5569. {
  5570. throw /*<bind>*/d1.Get/*</bind>*/;
  5571. }
  5572. }
  5573. ";
  5574. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  5575. Assert.NotNull(semanticInfo);
  5576. }
  5577. [Fact]
  5578. public void FailedConstructorCall()
  5579. {
  5580. string sourceCode = @"
  5581. using System;
  5582. using System.Collections.Generic;
  5583. using System.Linq;
  5584. class C { }
  5585. class Program
  5586. {
  5587. static void Main(string[] args)
  5588. {
  5589. C c = new /*<bind>*/C/*</bind>*/(17);
  5590. }
  5591. }
  5592. ";
  5593. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5594. Assert.Null(semanticInfo.Type);
  5595. Assert.Null(semanticInfo.ConvertedType);
  5596. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5597. Assert.Equal("C", semanticInfo.Symbol.ToTestDisplayString());
  5598. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5599. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5600. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5601. Assert.False(semanticInfo.IsCompileTimeConstant);
  5602. }
  5603. [Fact]
  5604. public void FailedConstructorCall2()
  5605. {
  5606. string sourceCode = @"
  5607. using System;
  5608. using System.Collections.Generic;
  5609. using System.Linq;
  5610. class C { }
  5611. class Program
  5612. {
  5613. static void Main(string[] args)
  5614. {
  5615. C c = /*<bind>*/new C(17)/*</bind>*/;
  5616. }
  5617. }
  5618. ";
  5619. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  5620. Assert.Equal("C", semanticInfo.Type.ToTestDisplayString());
  5621. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5622. Assert.Equal("C", semanticInfo.ConvertedType.ToTestDisplayString());
  5623. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5624. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5625. Assert.Null(semanticInfo.Symbol);
  5626. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  5627. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  5628. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5629. Assert.Equal("C..ctor()", sortedCandidates[0].ToTestDisplayString());
  5630. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  5631. Assert.Equal(1, semanticInfo.MemberGroup.Length);
  5632. Assert.Equal("C..ctor()", semanticInfo.MemberGroup[0].ToTestDisplayString());
  5633. Assert.False(semanticInfo.IsCompileTimeConstant);
  5634. }
  5635. [WorkItem(541332, "DevDiv")]
  5636. [Fact]
  5637. public void ImplicitConversionCastExpression()
  5638. {
  5639. string sourceCode = @"
  5640. using System;
  5641. enum E { a, b }
  5642. class Program
  5643. {
  5644. static int Main()
  5645. {
  5646. int ret = /*<bind>*/(int) E.b/*</bind>*/;
  5647. return ret - 1;
  5648. }
  5649. }
  5650. ";
  5651. var semanticInfo = GetSemanticInfoForTest<CastExpressionSyntax>(sourceCode);
  5652. Assert.Equal("int", semanticInfo.Type.ToString());
  5653. Assert.Equal("int", semanticInfo.ConvertedType.ToString());
  5654. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5655. Assert.True(semanticInfo.IsCompileTimeConstant);
  5656. }
  5657. [WorkItem(541333, "DevDiv")]
  5658. [Fact]
  5659. public void ImplicitConversionAnonymousMethod()
  5660. {
  5661. string sourceCode = @"
  5662. using System;
  5663. delegate int D();
  5664. class Program
  5665. {
  5666. static int Main()
  5667. {
  5668. D d = /*<bind>*/delegate() { return int.MaxValue; }/*</bind>*/;
  5669. return 0;
  5670. }
  5671. }
  5672. ";
  5673. var semanticInfo = GetSemanticInfoForTest<AnonymousMethodExpressionSyntax>(sourceCode);
  5674. Assert.Null(semanticInfo.Type);
  5675. Assert.Equal("D", semanticInfo.ConvertedType.ToString());
  5676. Assert.Equal(ConversionKind.AnonymousFunction, semanticInfo.ImplicitConversion.Kind);
  5677. Assert.False(semanticInfo.IsCompileTimeConstant);
  5678. sourceCode = @"
  5679. using System;
  5680. delegate int D();
  5681. class Program
  5682. {
  5683. static int Main()
  5684. {
  5685. D d = /*<bind>*/() => { return int.MaxValue; }/*</bind>*/;
  5686. return 0;
  5687. }
  5688. }
  5689. ";
  5690. semanticInfo = GetSemanticInfoForTest<ParenthesizedLambdaExpressionSyntax>(sourceCode);
  5691. Assert.Null(semanticInfo.Type);
  5692. Assert.Equal("D", semanticInfo.ConvertedType.ToString());
  5693. Assert.Equal(ConversionKind.AnonymousFunction, semanticInfo.ImplicitConversion.Kind);
  5694. Assert.False(semanticInfo.IsCompileTimeConstant);
  5695. }
  5696. [WorkItem(528476, "DevDiv")]
  5697. [Fact]
  5698. public void BindingInitializerToTargetType()
  5699. {
  5700. string sourceCode = @"
  5701. using System;
  5702. class Program
  5703. {
  5704. static int Main()
  5705. {
  5706. int[] ret = new int[] /*<bind>*/ { 0, 1, 2 } /*</bind>*/;
  5707. return ret[0];
  5708. }
  5709. }
  5710. ";
  5711. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  5712. Assert.Null(semanticInfo.Type);
  5713. //Assert.Equal("int[]", semanticInfo.Type.ToString());
  5714. //Assert.Equal("int[]", semanticInfo.ConvertedType.ToString());
  5715. //Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5716. //Assert.True(semanticInfo.IsCompileTimeConstant);
  5717. }
  5718. [Fact]
  5719. public void BindShortMethodArgument()
  5720. {
  5721. string sourceCode = @"
  5722. using System;
  5723. using System.Collections.Generic;
  5724. using System.Linq;
  5725. class Program
  5726. {
  5727. static void foo(short s)
  5728. {
  5729. }
  5730. static void Main(string[] args)
  5731. {
  5732. foo(/*<bind>*/123/*</bind>*/);
  5733. }
  5734. }
  5735. ";
  5736. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  5737. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  5738. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5739. Assert.Equal("System.Int16", semanticInfo.ConvertedType.ToTestDisplayString());
  5740. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5741. Assert.Equal(ConversionKind.ImplicitConstant, semanticInfo.ImplicitConversion.Kind);
  5742. Assert.Null(semanticInfo.Symbol);
  5743. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5744. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5745. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5746. Assert.True(semanticInfo.IsCompileTimeConstant);
  5747. Assert.Equal(123, semanticInfo.ConstantValue);
  5748. }
  5749. [WorkItem(541400, "DevDiv")]
  5750. [Fact]
  5751. public void BindingAttributeParameter()
  5752. {
  5753. string sourceCode = @"
  5754. using System;
  5755. public class MeAttribute : Attribute
  5756. {
  5757. public MeAttribute(short p)
  5758. {
  5759. }
  5760. }
  5761. [Me(/*<bind>*/123/*</bind>*/)]
  5762. public class C
  5763. {
  5764. }
  5765. ";
  5766. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  5767. Assert.NotNull(semanticInfo.Type);
  5768. Assert.Equal("int", semanticInfo.Type.ToString());
  5769. Assert.Equal("short", semanticInfo.ConvertedType.ToString());
  5770. Assert.Equal(ConversionKind.ImplicitConstant, semanticInfo.ImplicitConversion.Kind);
  5771. Assert.True(semanticInfo.IsCompileTimeConstant);
  5772. }
  5773. [Fact]
  5774. public void BindAttributeFieldNamedArgumentOnMethod()
  5775. {
  5776. string sourceCode = @"
  5777. using System;
  5778. using System.Collections.Generic;
  5779. using System.Linq;
  5780. [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
  5781. class TestAttribute : Attribute
  5782. {
  5783. public TestAttribute() { }
  5784. public string F;
  5785. }
  5786. class C1
  5787. {
  5788. [Test(/*<bind>*/F/*</bind>*/=""method"")]
  5789. int f() { return 0; }
  5790. }
  5791. ";
  5792. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5793. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  5794. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5795. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  5796. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5797. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5798. Assert.Equal("System.String TestAttribute.F", semanticInfo.Symbol.ToTestDisplayString());
  5799. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  5800. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5801. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5802. Assert.False(semanticInfo.IsCompileTimeConstant);
  5803. }
  5804. [Fact]
  5805. public void BindAttributePropertyNamedArgumentOnMethod()
  5806. {
  5807. string sourceCode = @"
  5808. using System;
  5809. using System.Collections.Generic;
  5810. using System.Linq;
  5811. [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
  5812. class TestAttribute : Attribute
  5813. {
  5814. public TestAttribute() { }
  5815. public TestAttribute(int i) { }
  5816. public string F;
  5817. public double P { get; set; }
  5818. }
  5819. class C1
  5820. {
  5821. [Test(/*<bind>*/P/*</bind>*/=3.14)]
  5822. int f() { return 0; }
  5823. }
  5824. ";
  5825. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5826. Assert.Equal("System.Double", semanticInfo.Type.ToTestDisplayString());
  5827. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5828. Assert.Equal("System.Double", semanticInfo.ConvertedType.ToTestDisplayString());
  5829. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5830. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5831. Assert.Equal("System.Double TestAttribute.P { get; set; }", semanticInfo.Symbol.ToTestDisplayString());
  5832. Assert.Equal(SymbolKind.Property, semanticInfo.Symbol.Kind);
  5833. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5834. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5835. Assert.False(semanticInfo.IsCompileTimeConstant);
  5836. }
  5837. [Fact]
  5838. public void TestAttributeNamedArgumentValueOnMethod()
  5839. {
  5840. string sourceCode = @"
  5841. using System;
  5842. using System.Collections.Generic;
  5843. using System.Linq;
  5844. [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
  5845. class TestAttribute : Attribute
  5846. {
  5847. public TestAttribute() { }
  5848. public TestAttribute(int i) { }
  5849. public string F;
  5850. public double P { get; set; }
  5851. }
  5852. class C1
  5853. {
  5854. [Test(P=/*<bind>*/1/*</bind>*/)]
  5855. int f() { return 0; }
  5856. }
  5857. ";
  5858. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  5859. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  5860. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5861. Assert.Equal("System.Double", semanticInfo.ConvertedType.ToTestDisplayString());
  5862. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5863. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  5864. Assert.Null(semanticInfo.Symbol);
  5865. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  5866. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5867. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5868. Assert.True(semanticInfo.IsCompileTimeConstant);
  5869. Assert.Equal(1, semanticInfo.ConstantValue);
  5870. }
  5871. [WorkItem(540775, "DevDiv")]
  5872. [Fact]
  5873. public void LambdaExprPrecededByAnIncompleteUsingStmt()
  5874. {
  5875. var code = @"
  5876. using System;
  5877. class Program
  5878. {
  5879. static void Main(string[] args)
  5880. {
  5881. using
  5882. Func<int, int> Dele = /*<bind>*/ x => { return x; } /*</bind>*/;
  5883. }
  5884. }
  5885. ";
  5886. var semanticInfo = GetSemanticInfoForTest<SimpleLambdaExpressionSyntax>(code);
  5887. Assert.NotNull(semanticInfo);
  5888. Assert.Null(semanticInfo.Type);
  5889. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5890. }
  5891. [WorkItem(540785, "DevDiv")]
  5892. [Fact]
  5893. public void NestedLambdaExprPrecededByAnIncompleteNamespaceStmt()
  5894. {
  5895. var code = @"
  5896. using System;
  5897. class Program
  5898. {
  5899. static void Main(string[] args)
  5900. {
  5901. namespace
  5902. Func<int, int> f1 = (x) =>
  5903. {
  5904. Func<int, int> f2 = /*<bind>*/ (y) => { return y; } /*</bind>*/;
  5905. return x;
  5906. }
  5907. ;
  5908. }
  5909. }
  5910. ";
  5911. var semanticInfo = GetSemanticInfoForTest<ParenthesizedLambdaExpressionSyntax>(code);
  5912. Assert.NotNull(semanticInfo);
  5913. Assert.Null(semanticInfo.Type);
  5914. Assert.Equal("System.Func<System.Int32, System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  5915. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5916. }
  5917. [Fact]
  5918. public void DefaultStructConstructor()
  5919. {
  5920. string sourceCode = @"
  5921. using System;
  5922. struct Struct{
  5923. public static void Main()
  5924. {
  5925. Struct s = new /*<bind>*/Struct/*</bind>*/();
  5926. }
  5927. }
  5928. ";
  5929. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5930. Assert.Null(semanticInfo.Type);
  5931. Assert.Null(semanticInfo.ConvertedType);
  5932. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5933. Assert.Equal("Struct", semanticInfo.Symbol.ToTestDisplayString());
  5934. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  5935. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5936. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  5937. Assert.False(semanticInfo.IsCompileTimeConstant);
  5938. }
  5939. [Fact]
  5940. public void DefaultStructConstructor2()
  5941. {
  5942. string sourceCode = @"
  5943. using System;
  5944. struct Struct{
  5945. public static void Main()
  5946. {
  5947. Struct s = /*<bind>*/new Struct()/*</bind>*/;
  5948. }
  5949. }
  5950. ";
  5951. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  5952. Assert.Equal("Struct", semanticInfo.Type.ToTestDisplayString());
  5953. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  5954. Assert.Equal("Struct", semanticInfo.ConvertedType.ToTestDisplayString());
  5955. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  5956. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5957. Assert.Equal("Struct..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  5958. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5959. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5960. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  5961. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5962. Assert.Equal("Struct..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  5963. Assert.False(semanticInfo.IsCompileTimeConstant);
  5964. }
  5965. [WorkItem(541451, "DevDiv")]
  5966. [Fact]
  5967. public void BindAttributeInstanceWithoutAttributeSuffix()
  5968. {
  5969. string sourceCode = @"
  5970. [assembly: /*<bind>*/My/*</bind>*/]
  5971. class MyAttribute : System.Attribute { }
  5972. ";
  5973. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  5974. Assert.Equal("MyAttribute", semanticInfo.Type.ToTestDisplayString());
  5975. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  5976. Assert.Equal("MyAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  5977. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  5978. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  5979. Assert.Equal("MyAttribute..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  5980. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  5981. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  5982. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  5983. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  5984. Assert.Equal("MyAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  5985. Assert.False(semanticInfo.IsCompileTimeConstant);
  5986. }
  5987. [WorkItem(541451, "DevDiv")]
  5988. [Fact]
  5989. public void BindQualifiedAttributeInstanceWithoutAttributeSuffix()
  5990. {
  5991. string sourceCode = @"
  5992. [assembly: /*<bind>*/N1.My/*</bind>*/]
  5993. namespace N1
  5994. {
  5995. class MyAttribute : System.Attribute { }
  5996. }
  5997. ";
  5998. var semanticInfo = GetSemanticInfoForTest<QualifiedNameSyntax>(sourceCode);
  5999. Assert.Equal("N1.MyAttribute", semanticInfo.Type.ToTestDisplayString());
  6000. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  6001. Assert.Equal("N1.MyAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  6002. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  6003. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6004. Assert.Equal("N1.MyAttribute..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  6005. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  6006. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6007. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  6008. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  6009. Assert.Equal("N1.MyAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  6010. Assert.False(semanticInfo.IsCompileTimeConstant);
  6011. }
  6012. [WorkItem(540770, "DevDiv")]
  6013. [Fact]
  6014. public void IncompleteDelegateCastExpression()
  6015. {
  6016. string sourceCode = @"
  6017. delegate void D();
  6018. class MyClass
  6019. {
  6020. public static int Main()
  6021. {
  6022. D d;
  6023. d = /*<bind>*/(D) delegate /*</bind>*/
  6024. ";
  6025. var semanticInfo = GetSemanticInfoForTest<CastExpressionSyntax>(sourceCode);
  6026. Assert.Equal("D", semanticInfo.Type.ToTestDisplayString());
  6027. Assert.Equal(TypeKind.Delegate, semanticInfo.Type.TypeKind);
  6028. Assert.Equal("D", semanticInfo.ConvertedType.ToTestDisplayString());
  6029. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  6030. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6031. Assert.Null(semanticInfo.Symbol);
  6032. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6033. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6034. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6035. Assert.False(semanticInfo.IsCompileTimeConstant);
  6036. }
  6037. [WorkItem(7177, "DevDiv_Projects/Roslyn")]
  6038. [Fact]
  6039. public void IncompleteGenericDelegateDecl()
  6040. {
  6041. string sourceCode = @"
  6042. using System;
  6043. class Program
  6044. {
  6045. static void Main(string[] args)
  6046. {
  6047. /*<bind>*/Func<int, int> ()/*</bind>*/
  6048. }
  6049. }
  6050. ";
  6051. var semanticInfo = GetSemanticInfoForTest<InvocationExpressionSyntax>(sourceCode);
  6052. Assert.Equal("?", semanticInfo.Type.ToTestDisplayString());
  6053. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  6054. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  6055. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  6056. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6057. Assert.Null(semanticInfo.Symbol);
  6058. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6059. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6060. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6061. Assert.False(semanticInfo.IsCompileTimeConstant);
  6062. }
  6063. [WorkItem(541120, "DevDiv")]
  6064. [Fact]
  6065. public void DelegateCreationArguments()
  6066. {
  6067. string sourceCode = @"
  6068. class Program
  6069. {
  6070. int foo(int i) { return i;}
  6071. static void Main(string[] args)
  6072. {
  6073. var r = /*<bind>*/new System.Func<int, int>((arg)=> { return 1;}, foo)/*</bind>*/;
  6074. }
  6075. }
  6076. ";
  6077. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  6078. Assert.Equal("System.Func<System.Int32, System.Int32>", semanticInfo.Type.ToTestDisplayString());
  6079. Assert.Equal(TypeKind.Delegate, semanticInfo.Type.TypeKind);
  6080. Assert.Equal("System.Func<System.Int32, System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  6081. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  6082. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6083. Assert.Null(semanticInfo.Symbol);
  6084. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6085. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6086. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6087. Assert.False(semanticInfo.IsCompileTimeConstant);
  6088. }
  6089. [Fact]
  6090. public void DelegateCreationArguments2()
  6091. {
  6092. string sourceCode = @"
  6093. class Program
  6094. {
  6095. int foo(int i) { return i;}
  6096. static void Main(string[] args)
  6097. {
  6098. var r = new /*<bind>*/System.Func<int, int>/*</bind>*/((arg)=> { return 1;}, foo);
  6099. }
  6100. }
  6101. ";
  6102. var semanticInfo = GetSemanticInfoForTest<TypeSyntax>(sourceCode);
  6103. Assert.Null(semanticInfo.Type);
  6104. Assert.Null(semanticInfo.ConvertedType);
  6105. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6106. Assert.Equal("System.Func<System.Int32, System.Int32>", semanticInfo.Symbol.ToTestDisplayString());
  6107. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6108. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6109. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6110. Assert.False(semanticInfo.IsCompileTimeConstant);
  6111. }
  6112. [Fact]
  6113. public void BaseConstructorInitializer2()
  6114. {
  6115. string sourceCode = @"
  6116. class C
  6117. {
  6118. C() /*<bind>*/: base()/*</bind>*/ { }
  6119. }
  6120. ";
  6121. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  6122. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  6123. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6124. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  6125. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  6126. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6127. Assert.Equal("System.Object..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  6128. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  6129. Assert.Equal(MethodKind.Constructor, ((MethodSymbol)semanticInfo.Symbol).MethodKind);
  6130. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6131. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6132. Assert.False(semanticInfo.IsCompileTimeConstant);
  6133. }
  6134. [Fact]
  6135. public void ThisConstructorInitializer2()
  6136. {
  6137. string sourceCode = @"
  6138. class C
  6139. {
  6140. C() /*<bind>*/: this(1)/*</bind>*/ { }
  6141. C(int x) { }
  6142. }
  6143. ";
  6144. var semanticInfo = GetSemanticInfoForTest<ConstructorInitializerSyntax>(sourceCode);
  6145. Assert.Equal("System.Void", semanticInfo.Type.ToTestDisplayString());
  6146. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6147. Assert.Equal("System.Void", semanticInfo.ConvertedType.ToTestDisplayString());
  6148. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  6149. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6150. Assert.Equal("C..ctor(System.Int32 x)", semanticInfo.Symbol.ToTestDisplayString());
  6151. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  6152. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6153. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6154. Assert.False(semanticInfo.IsCompileTimeConstant);
  6155. }
  6156. [WorkItem(539255, "DevDiv")]
  6157. [Fact]
  6158. public void TypeInParentOnFieldInitializer()
  6159. {
  6160. string sourceCode = @"
  6161. class MyClass
  6162. {
  6163. double dbl = /*<bind>*/1/*</bind>*/;
  6164. }
  6165. ";
  6166. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  6167. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  6168. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6169. Assert.Equal("System.Double", semanticInfo.ConvertedType.ToTestDisplayString());
  6170. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  6171. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  6172. Assert.Null(semanticInfo.Symbol);
  6173. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6174. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6175. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6176. Assert.True(semanticInfo.IsCompileTimeConstant);
  6177. Assert.Equal(1, semanticInfo.ConstantValue);
  6178. }
  6179. [Fact]
  6180. public void ExplicitIdentityConversion()
  6181. {
  6182. string sourceCode = @"
  6183. using System;
  6184. using System.Collections.Generic;
  6185. using System.Linq;
  6186. class Program
  6187. {
  6188. static void Main(string[] args)
  6189. {
  6190. int y = 12;
  6191. long x = /*<bind>*/(int)y/*</bind>*/;
  6192. }
  6193. }
  6194. ";
  6195. var semanticInfo = GetSemanticInfoForTest<CastExpressionSyntax>(sourceCode);
  6196. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  6197. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6198. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  6199. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  6200. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  6201. Assert.False(semanticInfo.IsCompileTimeConstant);
  6202. }
  6203. [WorkItem(541588, "DevDiv")]
  6204. [Fact]
  6205. public void ImplicitConversionElementsInArrayInit()
  6206. {
  6207. string sourceCode = @"
  6208. class MyClass
  6209. {
  6210. long[] l1 = {/*<bind>*/4L/*</bind>*/, 5L };
  6211. }
  6212. ";
  6213. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  6214. Assert.Equal("System.Int64", semanticInfo.Type.ToTestDisplayString());
  6215. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6216. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  6217. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  6218. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6219. Assert.Null(semanticInfo.Symbol);
  6220. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6221. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6222. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6223. Assert.True(semanticInfo.IsCompileTimeConstant);
  6224. Assert.Equal(4L, semanticInfo.ConstantValue);
  6225. }
  6226. [WorkItem(116)]
  6227. [Fact]
  6228. public void ImplicitConversionArrayInitializer_01()
  6229. {
  6230. string sourceCode = @"
  6231. class MyClass
  6232. {
  6233. int[] arr = /*<bind>*/{ 1, 2, 3 }/*</bind>*/;
  6234. }
  6235. ";
  6236. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  6237. Assert.Null(semanticInfo.Type);
  6238. Assert.Equal("System.Int32[]", semanticInfo.ConvertedType.ToTestDisplayString());
  6239. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6240. Assert.Null(semanticInfo.Symbol);
  6241. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6242. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6243. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6244. Assert.False(semanticInfo.IsCompileTimeConstant);
  6245. }
  6246. [WorkItem(116)]
  6247. [Fact]
  6248. public void ImplicitConversionArrayInitializer_02()
  6249. {
  6250. string sourceCode = @"
  6251. class MyClass
  6252. {
  6253. void Test()
  6254. {
  6255. int[] arr = /*<bind>*/{ 1, 2, 3 }/*</bind>*/;
  6256. }
  6257. }
  6258. ";
  6259. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  6260. Assert.Null(semanticInfo.Type);
  6261. Assert.Equal("System.Int32[]", semanticInfo.ConvertedType.ToTestDisplayString());
  6262. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6263. Assert.Null(semanticInfo.Symbol);
  6264. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6265. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6266. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6267. Assert.False(semanticInfo.IsCompileTimeConstant);
  6268. }
  6269. [WorkItem(541595, "DevDiv")]
  6270. [Fact]
  6271. public void ImplicitConversionExprReturnedByLambda()
  6272. {
  6273. string sourceCode = @"
  6274. using System;
  6275. class MyClass
  6276. {
  6277. Func<long> f1 = () => /*<bind>*/4/*</bind>*/;
  6278. }
  6279. ";
  6280. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  6281. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  6282. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6283. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  6284. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  6285. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  6286. Assert.False(semanticInfo.ImplicitConversion.IsIdentity);
  6287. Assert.True(semanticInfo.ImplicitConversion.IsImplicit);
  6288. Assert.True(semanticInfo.ImplicitConversion.IsNumeric);
  6289. Assert.Null(semanticInfo.Symbol);
  6290. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6291. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6292. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6293. Assert.True(semanticInfo.IsCompileTimeConstant);
  6294. Assert.Equal(4, semanticInfo.ConstantValue);
  6295. }
  6296. [WorkItem(541040, "DevDiv")]
  6297. [WorkItem(528551, "DevDiv")]
  6298. [Fact]
  6299. public void InaccessibleNestedType()
  6300. {
  6301. string sourceCode = @"
  6302. using System;
  6303. internal class EClass
  6304. {
  6305. private enum EEK { a, b, c, d };
  6306. }
  6307. class Test
  6308. {
  6309. public void M(EClass.EEK e)
  6310. {
  6311. b = /*<bind>*/ e /*</bind>*/;
  6312. }
  6313. EClass.EEK b = EClass.EEK.a;
  6314. }
  6315. ";
  6316. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  6317. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6318. Assert.Equal(SymbolKind.NamedType, semanticInfo.Type.Kind);
  6319. Assert.Equal(TypeKind.Enum, semanticInfo.Type.TypeKind);
  6320. Assert.NotNull(semanticInfo.Symbol);
  6321. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6322. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6323. Assert.Equal(semanticInfo.Type, semanticInfo.ConvertedType);
  6324. Assert.False(semanticInfo.IsCompileTimeConstant);
  6325. }
  6326. [Fact]
  6327. public void NamedParameter1()
  6328. {
  6329. string sourceCode = @"
  6330. using System;
  6331. class Program
  6332. {
  6333. public void f(int x, int y, int z) { }
  6334. public void f(string y, string z) { }
  6335. public void foo()
  6336. {
  6337. f(3, /*<bind>*/z/*</bind>*/: 4, y: 9);
  6338. }
  6339. }
  6340. ";
  6341. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6342. Assert.Null(semanticInfo.Type);
  6343. Assert.Null(semanticInfo.ConvertedType);
  6344. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6345. Assert.Equal("System.Int32 z", semanticInfo.Symbol.ToTestDisplayString());
  6346. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  6347. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6348. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6349. Assert.False(semanticInfo.IsCompileTimeConstant);
  6350. }
  6351. [Fact]
  6352. public void NamedParameter2()
  6353. {
  6354. string sourceCode = @"
  6355. using System;
  6356. class Program
  6357. {
  6358. public void f(int x, int y, int z) { }
  6359. public void f(string y, string z, int q) { }
  6360. public void f(string q, int w, int b) { }
  6361. public void foo()
  6362. {
  6363. f(3, /*<bind>*/z/*</bind>*/: ""foo"", y: 9);
  6364. }
  6365. }
  6366. ";
  6367. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6368. Assert.Null(semanticInfo.Type);
  6369. Assert.Null(semanticInfo.ConvertedType);
  6370. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6371. Assert.Null(semanticInfo.Symbol);
  6372. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  6373. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  6374. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  6375. Assert.Equal("System.Int32 z", sortedCandidates[0].ToTestDisplayString());
  6376. Assert.Equal(SymbolKind.Parameter, sortedCandidates[0].Kind);
  6377. Assert.Equal("System.String z", sortedCandidates[1].ToTestDisplayString());
  6378. Assert.Equal(SymbolKind.Parameter, sortedCandidates[1].Kind);
  6379. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6380. Assert.False(semanticInfo.IsCompileTimeConstant);
  6381. }
  6382. [Fact]
  6383. public void NamedParameter3()
  6384. {
  6385. string sourceCode = @"
  6386. using System;
  6387. class Program
  6388. {
  6389. public void f(int x, int y, int z) { }
  6390. public void f(string y, string z, int q) { }
  6391. public void f(string q, int w, int b) { }
  6392. public void foo()
  6393. {
  6394. f(3, z: ""foo"", /*<bind>*/yagga/*</bind>*/: 9);
  6395. }
  6396. }
  6397. ";
  6398. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6399. Assert.Null(semanticInfo.Type);
  6400. Assert.Null(semanticInfo.ConvertedType);
  6401. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6402. Assert.Null(semanticInfo.Symbol);
  6403. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6404. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6405. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6406. Assert.False(semanticInfo.IsCompileTimeConstant);
  6407. }
  6408. [Fact]
  6409. public void NamedParameter4()
  6410. {
  6411. string sourceCode = @"
  6412. using System;
  6413. namespace ClassLibrary44
  6414. {
  6415. [MyAttr(/*<bind>*/x/*</bind>*/:1)]
  6416. public class Class1
  6417. {
  6418. }
  6419. public class MyAttr: Attribute
  6420. {
  6421. public MyAttr(int x)
  6422. {}
  6423. }
  6424. }
  6425. ";
  6426. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6427. Assert.Null(semanticInfo.Type);
  6428. Assert.Null(semanticInfo.ConvertedType);
  6429. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6430. Assert.Equal("System.Int32 x", semanticInfo.Symbol.ToTestDisplayString());
  6431. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  6432. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6433. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6434. Assert.False(semanticInfo.IsCompileTimeConstant);
  6435. }
  6436. [WorkItem(541623, "DevDiv")]
  6437. [Fact]
  6438. public void ImplicitReferenceConvExtensionMethodReceiver()
  6439. {
  6440. string sourceCode =
  6441. @"public static class Extend
  6442. {
  6443. public static string TestExt(this object o1)
  6444. {
  6445. return o1.ToString();
  6446. }
  6447. }
  6448. class Program
  6449. {
  6450. static void Main(string[] args)
  6451. {
  6452. string str1 = ""Test"";
  6453. var e1 = /*<bind>*/str1/*</bind>*/.TestExt();
  6454. }
  6455. }
  6456. ";
  6457. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6458. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  6459. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  6460. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  6461. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  6462. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  6463. Assert.True(semanticInfo.ImplicitConversion.IsReference);
  6464. Assert.Equal("System.String str1", semanticInfo.Symbol.ToTestDisplayString());
  6465. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  6466. }
  6467. [WorkItem(541623, "DevDiv")]
  6468. [Fact]
  6469. public void ImplicitBoxingConvExtensionMethodReceiver()
  6470. {
  6471. string sourceCode =
  6472. @"struct S { }
  6473. static class C
  6474. {
  6475. static void M(S s)
  6476. {
  6477. /*<bind>*/s/*</bind>*/.F();
  6478. }
  6479. static void F(this object o)
  6480. {
  6481. }
  6482. }";
  6483. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6484. Assert.Equal("S", semanticInfo.Type.ToTestDisplayString());
  6485. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  6486. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  6487. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  6488. Assert.Equal(ConversionKind.Boxing, semanticInfo.ImplicitConversion.Kind);
  6489. Assert.True(semanticInfo.ImplicitConversion.IsBoxing);
  6490. Assert.Equal("S s", semanticInfo.Symbol.ToTestDisplayString());
  6491. Assert.Equal(SymbolKind.Parameter, semanticInfo.Symbol.Kind);
  6492. }
  6493. [Fact]
  6494. public void AttributeSyntaxBinding()
  6495. {
  6496. string sourceCode = @"
  6497. using System;
  6498. [/*<bind>*/MyAttr(1)/*</bind>*/]
  6499. public class Class1
  6500. {
  6501. }
  6502. public class MyAttr: Attribute
  6503. {
  6504. public MyAttr(int x)
  6505. {}
  6506. }
  6507. ";
  6508. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  6509. // Should bind to constructor.
  6510. Assert.NotNull(semanticInfo.Symbol);
  6511. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  6512. }
  6513. [WorkItem(541653, "DevDiv")]
  6514. [Fact()]
  6515. public void MemberAccessOnErrorType()
  6516. {
  6517. string sourceCode = @"
  6518. public class Test2
  6519. {
  6520. public static void Main()
  6521. {
  6522. string x1 = A./*<bind>*/M/*</bind>*/.C.D.E;
  6523. }
  6524. }
  6525. ";
  6526. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6527. Assert.NotNull(semanticInfo.Type);
  6528. Assert.Equal(SymbolKind.ErrorType, semanticInfo.Type.Kind);
  6529. }
  6530. [WorkItem(541653, "DevDiv")]
  6531. [Fact()]
  6532. public void MemberAccessOnErrorType2()
  6533. {
  6534. string sourceCode = @"
  6535. public class Test2
  6536. {
  6537. public static void Main()
  6538. {
  6539. string x1 = A./*<bind>*/M/*</bind>*/;
  6540. }
  6541. }
  6542. ";
  6543. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6544. Assert.NotNull(semanticInfo.Type);
  6545. Assert.Equal(SymbolKind.ErrorType, semanticInfo.Type.Kind);
  6546. }
  6547. [WorkItem(541764, "DevDiv")]
  6548. [Fact]
  6549. public void DelegateCreation1()
  6550. {
  6551. string sourceCode = @"
  6552. class C
  6553. {
  6554. delegate void MyDelegate();
  6555. public void F()
  6556. {
  6557. MyDelegate MD1 = new /*<bind>*/MyDelegate/*</bind>*/(this.F);
  6558. MyDelegate MD2 = MD1 + MD1;
  6559. MyDelegate MD3 = new MyDelegate(MD1);
  6560. }
  6561. }
  6562. ";
  6563. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6564. Assert.Null(semanticInfo.Type);
  6565. Assert.Null(semanticInfo.ConvertedType);
  6566. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6567. Assert.Equal("C.MyDelegate", semanticInfo.Symbol.ToTestDisplayString());
  6568. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  6569. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6570. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6571. Assert.False(semanticInfo.IsCompileTimeConstant);
  6572. }
  6573. [Fact]
  6574. public void DelegateCreation1_2()
  6575. {
  6576. string sourceCode = @"
  6577. class C
  6578. {
  6579. delegate void MyDelegate();
  6580. public void F()
  6581. {
  6582. MyDelegate MD1 = /*<bind>*/new MyDelegate(this.F)/*</bind>*/;
  6583. MyDelegate MD2 = MD1 + MD1;
  6584. MyDelegate MD3 = new MyDelegate(MD1);
  6585. }
  6586. }
  6587. ";
  6588. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  6589. Assert.Equal("C.MyDelegate", semanticInfo.Type.ToTestDisplayString());
  6590. Assert.Equal(TypeKind.Delegate, semanticInfo.Type.TypeKind);
  6591. Assert.Equal("C.MyDelegate", semanticInfo.ConvertedType.ToTestDisplayString());
  6592. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  6593. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6594. Assert.Null(semanticInfo.Symbol);
  6595. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6596. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6597. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6598. Assert.False(semanticInfo.IsCompileTimeConstant);
  6599. }
  6600. [WorkItem(541764, "DevDiv")]
  6601. [Fact]
  6602. public void DelegateCreation2()
  6603. {
  6604. string sourceCode = @"
  6605. class C
  6606. {
  6607. delegate void MyDelegate();
  6608. public void F()
  6609. {
  6610. MyDelegate MD1 = new MyDelegate(this.F);
  6611. MyDelegate MD2 = MD1 + MD1;
  6612. MyDelegate MD3 = new /*<bind>*/MyDelegate/*</bind>*/(MD1);
  6613. }
  6614. }
  6615. ";
  6616. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6617. Assert.Null(semanticInfo.Type);
  6618. Assert.Null(semanticInfo.ConvertedType);
  6619. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6620. Assert.Equal("C.MyDelegate", semanticInfo.Symbol.ToTestDisplayString());
  6621. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  6622. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6623. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6624. Assert.False(semanticInfo.IsCompileTimeConstant);
  6625. }
  6626. [WorkItem(541764, "DevDiv")]
  6627. [Fact]
  6628. public void DelegateCreation2_2()
  6629. {
  6630. string sourceCode = @"
  6631. class C
  6632. {
  6633. delegate void MyDelegate();
  6634. public void F()
  6635. {
  6636. MyDelegate MD1 = new MyDelegate(this.F);
  6637. MyDelegate MD2 = MD1 + MD1;
  6638. MyDelegate MD3 = /*<bind>*/new MyDelegate(MD1)/*</bind>*/;
  6639. }
  6640. }
  6641. ";
  6642. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  6643. Assert.Equal("C.MyDelegate", semanticInfo.Type.ToTestDisplayString());
  6644. Assert.Equal(TypeKind.Delegate, semanticInfo.Type.TypeKind);
  6645. Assert.Equal("C.MyDelegate", semanticInfo.ConvertedType.ToTestDisplayString());
  6646. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  6647. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6648. Assert.Null(semanticInfo.Symbol);
  6649. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6650. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6651. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6652. Assert.False(semanticInfo.IsCompileTimeConstant);
  6653. }
  6654. [Fact]
  6655. public void DelegateSignatureMismatch1()
  6656. {
  6657. string sourceCode = @"
  6658. using System;
  6659. using System.Collections.Generic;
  6660. using System.Linq;
  6661. class Program
  6662. {
  6663. static int f() { return 1; }
  6664. static void Main(string[] args)
  6665. {
  6666. Action a = new /*<bind>*/Action/*</bind>*/(f);
  6667. }
  6668. }
  6669. ";
  6670. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6671. Assert.Null(semanticInfo.Type);
  6672. Assert.Null(semanticInfo.ConvertedType);
  6673. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6674. Assert.Equal("System.Action", semanticInfo.Symbol.ToTestDisplayString());
  6675. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6676. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6677. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6678. Assert.False(semanticInfo.IsCompileTimeConstant);
  6679. }
  6680. [Fact]
  6681. public void DelegateSignatureMismatch2()
  6682. {
  6683. string sourceCode = @"
  6684. using System;
  6685. using System.Collections.Generic;
  6686. using System.Linq;
  6687. class Program
  6688. {
  6689. static int f() { return 1; }
  6690. static void Main(string[] args)
  6691. {
  6692. Action a = /*<bind>*/new Action(f)/*</bind>*/;
  6693. }
  6694. }
  6695. ";
  6696. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  6697. Assert.Equal("System.Action", semanticInfo.Type.ToTestDisplayString());
  6698. Assert.Equal(TypeKind.Delegate, semanticInfo.Type.TypeKind);
  6699. Assert.Equal("System.Action", semanticInfo.ConvertedType.ToTestDisplayString());
  6700. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  6701. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6702. Assert.Null(semanticInfo.Symbol);
  6703. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  6704. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  6705. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  6706. Assert.False(semanticInfo.IsCompileTimeConstant);
  6707. }
  6708. [Fact]
  6709. public void DelegateSignatureMismatch3()
  6710. {
  6711. string sourceCode = @"
  6712. using System;
  6713. using System.Collections.Generic;
  6714. using System.Linq;
  6715. class Program
  6716. {
  6717. static int f() { return 1; }
  6718. static void Main(string[] args)
  6719. {
  6720. Action a = new Action(/*<bind>*/f/*</bind>*/);
  6721. }
  6722. }
  6723. ";
  6724. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6725. Assert.Null(semanticInfo.Type);
  6726. Assert.Null(semanticInfo.ConvertedType);
  6727. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6728. Assert.Null(semanticInfo.Symbol);
  6729. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  6730. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  6731. Assert.Equal("System.Int32 Program.f()", semanticInfo.CandidateSymbols[0].ToTestDisplayString());
  6732. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  6733. Assert.Equal("System.Int32 Program.f()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  6734. Assert.False(semanticInfo.IsCompileTimeConstant);
  6735. }
  6736. [WorkItem(541802, "DevDiv")]
  6737. [Fact]
  6738. public void IncompleteLetClause()
  6739. {
  6740. string sourceCode = @"
  6741. public class Test2
  6742. {
  6743. public static void Main()
  6744. {
  6745. var nums = new int[] { 1, 2, 3, 4 };
  6746. /*<bind>*/var/*</bind>*/ q2 = from x in nums
  6747. let z = x.
  6748. }
  6749. }
  6750. ";
  6751. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6752. Assert.NotNull(semanticInfo.Type);
  6753. Assert.Equal(SymbolKind.ErrorType, semanticInfo.Type.Kind);
  6754. }
  6755. [WorkItem(541895, "DevDiv")]
  6756. [Fact]
  6757. public void QueryErrorBaseKeywordAsSelectExpression()
  6758. {
  6759. string sourceCode = @"
  6760. using System;
  6761. using System.Linq;
  6762. public class QueryExpressionTest
  6763. {
  6764. public static void Main()
  6765. {
  6766. var expr1 = new int[] { 1 };
  6767. /*<bind>*/var/*</bind>*/ query2 = from int b in expr1 select base;
  6768. }
  6769. }
  6770. ";
  6771. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6772. Assert.NotNull(semanticInfo.Type);
  6773. Assert.Equal(SymbolKind.ErrorType, semanticInfo.Type.Kind);
  6774. }
  6775. [WorkItem(541805, "DevDiv")]
  6776. [Fact]
  6777. public void InToIdentifierQueryContinuation()
  6778. {
  6779. string sourceCode = @"
  6780. using System;
  6781. using System.Linq;
  6782. public class Test2
  6783. {
  6784. public static void Main()
  6785. {
  6786. var nums = new int[] { 1, 2, 3, 4 };
  6787. var q2 = from x in nums
  6788. select x into w
  6789. select /*<bind>*/w/*</bind>*/;
  6790. }
  6791. }
  6792. ";
  6793. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6794. Assert.NotNull(semanticInfo.Type);
  6795. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  6796. }
  6797. [WorkItem(541833, "DevDiv")]
  6798. [Fact]
  6799. public void InOptimizedAwaySelectClause()
  6800. {
  6801. string sourceCode = @"
  6802. using System;
  6803. using System.Linq;
  6804. public class Test2
  6805. {
  6806. public static void Main()
  6807. {
  6808. var nums = new int[] { 1, 2, 3, 4 };
  6809. var q2 = from x in nums
  6810. where x > 1
  6811. select /*<bind>*/x/*</bind>*/;
  6812. }
  6813. }
  6814. ";
  6815. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6816. Assert.NotNull(semanticInfo.Type);
  6817. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  6818. }
  6819. [Fact]
  6820. public void InFromClause()
  6821. {
  6822. string sourceCode = @"
  6823. using System;
  6824. using System.Linq;
  6825. class C
  6826. {
  6827. void M()
  6828. {
  6829. int rolf = 732;
  6830. int roark = -9;
  6831. var replicator = from r in new List<int> { 1, 2, 9, rolf, /*<bind>*/roark/*</bind>*/ } select r * 2;
  6832. }
  6833. }
  6834. ";
  6835. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6836. Assert.NotNull(semanticInfo.Type);
  6837. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  6838. }
  6839. [WorkItem(541911, "DevDiv")]
  6840. [Fact]
  6841. public void QueryErrorGroupJoinFromClause()
  6842. {
  6843. string sourceCode = @"
  6844. class Test
  6845. {
  6846. static void Main()
  6847. {
  6848. /*<bind>*/var/*</bind>*/ q =
  6849. from Foo i in i
  6850. from Foo<int> j in j
  6851. group i by i
  6852. join Foo
  6853. }
  6854. }
  6855. ";
  6856. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6857. Assert.NotNull(semanticInfo.Type);
  6858. Assert.Equal(SymbolKind.ErrorType, semanticInfo.Type.Kind);
  6859. }
  6860. [WorkItem(541920, "DevDiv")]
  6861. [Fact]
  6862. public void SymbolInfoForMissingSelectClauseNode()
  6863. {
  6864. string sourceCode = @"
  6865. using System;
  6866. using System.Collections.Generic;
  6867. using System.Linq;
  6868. class Program
  6869. {
  6870. static void Main(string[] args)
  6871. {
  6872. string[] strings = { };
  6873. var query = from s in strings
  6874. let word = s.Split(' ')
  6875. from w in w
  6876. }
  6877. }
  6878. ";
  6879. var compilation = CreateCompilationWithMscorlibAndSystemCore(sourceCode);
  6880. var tree = compilation.SyntaxTrees.Single();
  6881. var semanticModel = compilation.GetSemanticModel(tree);
  6882. var selectClauseNode = tree.FindNodeOrTokenByKind(SyntaxKind.SelectClause).AsNode() as SelectClauseSyntax;
  6883. var symbolInfo = semanticModel.GetSymbolInfo(selectClauseNode);
  6884. Assert.NotNull(symbolInfo);
  6885. Assert.Null(symbolInfo.Symbol);
  6886. }
  6887. [WorkItem(541940, "DevDiv")]
  6888. [Fact]
  6889. public void IdentifierInSelectNotInContext()
  6890. {
  6891. string sourceCode = @"
  6892. using System;
  6893. using System.Collections.Generic;
  6894. using System.Linq;
  6895. class Program
  6896. {
  6897. static void Main(string[] args)
  6898. {
  6899. string[] strings = { };
  6900. var query = from ch in strings
  6901. group ch by ch
  6902. into chGroup
  6903. where chGroup.Count() >= 2
  6904. select /*<bind>*/ x1 /*</bind>*/;
  6905. }
  6906. }
  6907. ";
  6908. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6909. Assert.NotNull(semanticInfo.Type);
  6910. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  6911. }
  6912. [Fact]
  6913. public void WhereDefinedInType()
  6914. {
  6915. var csSource = @"
  6916. using System;
  6917. class Y
  6918. {
  6919. public int Where(Func<int, bool> predicate)
  6920. {
  6921. return 45;
  6922. }
  6923. }
  6924. class P
  6925. {
  6926. static void Main()
  6927. {
  6928. var src = new Y();
  6929. var query = from x in src
  6930. where x > 0
  6931. select /*<bind>*/ x /*</bind>*/;
  6932. }
  6933. }
  6934. ";
  6935. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(csSource);
  6936. Assert.Equal("x", semanticInfo.Symbol.Name);
  6937. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  6938. }
  6939. [WorkItem(541830, "DevDiv")]
  6940. [Fact]
  6941. public void AttributeUsageError()
  6942. {
  6943. string sourceCode = @"
  6944. using System;
  6945. [/*<bind>*/AttributeUsage/*</bind>*/()]
  6946. class MyAtt : Attribute
  6947. {}
  6948. ";
  6949. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  6950. Assert.NotNull(semanticInfo.Type);
  6951. Assert.Equal("AttributeUsageAttribute", semanticInfo.Type.Name);
  6952. }
  6953. [WorkItem(541832, "DevDiv")]
  6954. [Fact]
  6955. public void OpenGenericTypeInAttribute()
  6956. {
  6957. string sourceCode = @"
  6958. class Gen<T> {}
  6959. [/*<bind>*/Gen<T>/*</bind>*/]
  6960. public class Test
  6961. {
  6962. }
  6963. ";
  6964. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  6965. Assert.Equal("Gen<T>", semanticInfo.Type.ToTestDisplayString());
  6966. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  6967. Assert.Equal("Gen<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  6968. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  6969. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6970. Assert.Null(semanticInfo.Symbol);
  6971. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  6972. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  6973. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  6974. Assert.Equal("Gen<T>..ctor()", sortedCandidates[0].ToTestDisplayString());
  6975. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  6976. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  6977. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  6978. Assert.Equal("Gen<T>..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  6979. Assert.False(semanticInfo.IsCompileTimeConstant);
  6980. }
  6981. [WorkItem(541832, "DevDiv")]
  6982. [Fact]
  6983. public void OpenGenericTypeInAttribute02()
  6984. {
  6985. string sourceCode = @"
  6986. class Foo {}
  6987. [/*<bind>*/Foo/*</bind>*/]
  6988. public class Test
  6989. {
  6990. }
  6991. ";
  6992. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  6993. Assert.Equal("Foo", semanticInfo.Type.ToTestDisplayString());
  6994. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  6995. Assert.Equal("Foo", semanticInfo.ConvertedType.ToTestDisplayString());
  6996. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  6997. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  6998. Assert.Null(semanticInfo.Symbol);
  6999. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  7000. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  7001. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7002. Assert.Equal("Foo..ctor()", sortedCandidates[0].ToTestDisplayString());
  7003. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  7004. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  7005. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7006. Assert.Equal("Foo..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  7007. Assert.False(semanticInfo.IsCompileTimeConstant);
  7008. }
  7009. [WorkItem(541896, "DevDiv")]
  7010. [Fact]
  7011. public void IncompleteEmptyAttributeSyntax01()
  7012. {
  7013. string sourceCode = @"
  7014. public class CSEvent {
  7015. [
  7016. ";
  7017. var compilation = CreateCompilationWithMscorlib(sourceCode);
  7018. var tree = compilation.SyntaxTrees.Single();
  7019. var semanticModel = compilation.GetSemanticModel(tree);
  7020. var attributeNode = tree.FindNodeOrTokenByKind(SyntaxKind.Attribute).AsNode() as AttributeSyntax;
  7021. var semanticInfo = semanticModel.GetSemanticInfoSummary(attributeNode);
  7022. Assert.NotNull(semanticInfo);
  7023. Assert.Null(semanticInfo.Symbol);
  7024. Assert.Null(semanticInfo.Type);
  7025. }
  7026. /// <summary>
  7027. /// Same as above but with a token after the incomplete
  7028. /// attribute so the attribute is not at the end of file.
  7029. /// </summary>
  7030. [WorkItem(541896, "DevDiv")]
  7031. [Fact]
  7032. public void IncompleteEmptyAttributeSyntax02()
  7033. {
  7034. string sourceCode = @"
  7035. public class CSEvent {
  7036. [
  7037. }";
  7038. var compilation = CreateCompilationWithMscorlib(sourceCode);
  7039. var tree = compilation.SyntaxTrees.Single();
  7040. var semanticModel = compilation.GetSemanticModel(tree);
  7041. var attributeNode = tree.FindNodeOrTokenByKind(SyntaxKind.Attribute).AsNode() as AttributeSyntax;
  7042. var semanticInfo = semanticModel.GetSemanticInfoSummary(attributeNode);
  7043. Assert.NotNull(semanticInfo);
  7044. Assert.Null(semanticInfo.Symbol);
  7045. Assert.Null(semanticInfo.Type);
  7046. }
  7047. [WorkItem(541857, "DevDiv")]
  7048. [Fact]
  7049. public void EventWithInitializerInInterface()
  7050. {
  7051. string sourceCode = @"
  7052. public delegate void MyDelegate();
  7053. interface test
  7054. {
  7055. event MyDelegate e = /*<bind>*/new MyDelegate(Test.Main)/*</bind>*/;
  7056. }
  7057. class Test
  7058. {
  7059. static void Main() { }
  7060. }
  7061. ";
  7062. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  7063. Assert.Equal("MyDelegate", semanticInfo.Type.ToTestDisplayString());
  7064. }
  7065. [Fact]
  7066. public void SwitchExpression_Constant01()
  7067. {
  7068. string sourceCode = @"
  7069. using System;
  7070. public class Test
  7071. {
  7072. public static int Main(string[] args)
  7073. {
  7074. int ret = 1;
  7075. switch (/*<bind>*/true/*</bind>*/)
  7076. {
  7077. default:
  7078. ret = 0;
  7079. break;
  7080. }
  7081. Console.Write(ret);
  7082. return (ret);
  7083. }
  7084. }
  7085. ";
  7086. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  7087. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  7088. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  7089. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  7090. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  7091. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7092. Assert.Null(semanticInfo.Symbol);
  7093. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  7094. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7095. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7096. Assert.True(semanticInfo.IsCompileTimeConstant);
  7097. Assert.Equal(true, semanticInfo.ConstantValue);
  7098. }
  7099. [Fact]
  7100. public void SwitchExpression_Constant02()
  7101. {
  7102. string sourceCode = @"
  7103. using System;
  7104. public class Test
  7105. {
  7106. public static int Main(string[] args)
  7107. {
  7108. int ret = 1;
  7109. const string s = null;
  7110. switch (/*<bind>*/s/*</bind>*/)
  7111. {
  7112. case null:
  7113. ret = 0;
  7114. break;
  7115. }
  7116. Console.Write(ret);
  7117. return (ret);
  7118. }
  7119. }
  7120. ";
  7121. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7122. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  7123. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  7124. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  7125. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7126. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7127. Assert.Equal("System.String s", semanticInfo.Symbol.ToTestDisplayString());
  7128. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  7129. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7130. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7131. Assert.True(semanticInfo.IsCompileTimeConstant);
  7132. Assert.Equal(null, semanticInfo.ConstantValue.Value);
  7133. }
  7134. [Fact]
  7135. public void SwitchExpression_NotConstant()
  7136. {
  7137. string sourceCode = @"
  7138. using System;
  7139. public class Test
  7140. {
  7141. public static int Main(string[] args)
  7142. {
  7143. int ret = 1;
  7144. string s = null;
  7145. switch (/*<bind>*/s/*</bind>*/)
  7146. {
  7147. case null:
  7148. ret = 0;
  7149. break;
  7150. }
  7151. Console.Write(ret);
  7152. return (ret);
  7153. }
  7154. }
  7155. ";
  7156. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7157. Assert.Equal("System.String", semanticInfo.Type.ToTestDisplayString());
  7158. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  7159. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  7160. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7161. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7162. Assert.Equal("System.String s", semanticInfo.Symbol.ToTestDisplayString());
  7163. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  7164. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7165. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7166. Assert.False(semanticInfo.IsCompileTimeConstant);
  7167. }
  7168. [Fact]
  7169. public void SwitchExpression_Invalid_Lambda()
  7170. {
  7171. string sourceCode = @"
  7172. using System;
  7173. public class Test
  7174. {
  7175. public static int Main(string[] args)
  7176. {
  7177. int ret = 1;
  7178. switch (/*<bind>*/()=>3/*</bind>*/)
  7179. {
  7180. default:
  7181. ret = 0;
  7182. break;
  7183. }
  7184. Console.Write(ret);
  7185. return (ret);
  7186. }
  7187. }
  7188. ";
  7189. var semanticInfo = GetSemanticInfoForTest<ParenthesizedLambdaExpressionSyntax>(sourceCode);
  7190. Assert.Null(semanticInfo.Type);
  7191. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  7192. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  7193. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7194. Assert.Equal("lambda expression", semanticInfo.Symbol.ToTestDisplayString());
  7195. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  7196. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7197. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7198. Assert.False(semanticInfo.IsCompileTimeConstant);
  7199. }
  7200. [Fact]
  7201. public void SwitchExpression_Invalid_MethodGroup()
  7202. {
  7203. string sourceCode = @"
  7204. using System;
  7205. public class Test
  7206. {
  7207. public static int M() {return 0; }
  7208. public static int Main(string[] args)
  7209. {
  7210. int ret = 1;
  7211. switch (/*<bind>*/M/*</bind>*/)
  7212. {
  7213. default:
  7214. ret = 0;
  7215. break;
  7216. }
  7217. Console.Write(ret);
  7218. return (ret);
  7219. }
  7220. }
  7221. ";
  7222. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7223. Assert.Null(semanticInfo.Type);
  7224. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  7225. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  7226. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7227. Assert.Null(semanticInfo.Symbol);
  7228. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  7229. Assert.Equal("System.Int32 Test.M()", semanticInfo.CandidateSymbols.Single().ToTestDisplayString());
  7230. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  7231. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7232. Assert.Equal("System.Int32 Test.M()", sortedMethodGroup[0].ToTestDisplayString());
  7233. Assert.False(semanticInfo.IsCompileTimeConstant);
  7234. }
  7235. [Fact]
  7236. public void SwitchExpression_Invalid_GoverningType()
  7237. {
  7238. string sourceCode = @"
  7239. using System;
  7240. public class Test
  7241. {
  7242. public static int Main(string[] args)
  7243. {
  7244. int ret = 1;
  7245. switch (/*<bind>*/2.2/*</bind>*/)
  7246. {
  7247. default:
  7248. ret = 0;
  7249. break;
  7250. }
  7251. Console.Write(ret);
  7252. return (ret);
  7253. }
  7254. }
  7255. ";
  7256. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  7257. Assert.Equal("System.Double", semanticInfo.Type.ToTestDisplayString());
  7258. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  7259. Assert.Equal("Double", semanticInfo.ConvertedType.ToTestDisplayString());
  7260. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  7261. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7262. Assert.Null(semanticInfo.Symbol);
  7263. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  7264. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7265. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7266. Assert.True(semanticInfo.IsCompileTimeConstant);
  7267. Assert.Equal(2.2, semanticInfo.ConstantValue);
  7268. }
  7269. [Fact]
  7270. public void SwitchCaseLabelExpression_Null()
  7271. {
  7272. string sourceCode = @"
  7273. using System;
  7274. public class Test
  7275. {
  7276. public static int Main(string[] args)
  7277. {
  7278. int ret = 1;
  7279. const string s = null;
  7280. switch (s)
  7281. {
  7282. case /*<bind>*/null/*</bind>*/:
  7283. ret = 0;
  7284. break;
  7285. }
  7286. Console.Write(ret);
  7287. return (ret);
  7288. }
  7289. }
  7290. ";
  7291. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  7292. Assert.Null(semanticInfo.Type);
  7293. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  7294. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7295. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  7296. Assert.Null(semanticInfo.Symbol);
  7297. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  7298. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7299. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7300. Assert.True(semanticInfo.IsCompileTimeConstant);
  7301. Assert.Equal(null, semanticInfo.ConstantValue.Value);
  7302. }
  7303. [Fact]
  7304. public void SwitchCaseLabelExpression_Constant01()
  7305. {
  7306. string sourceCode = @"
  7307. using System;
  7308. public class Test
  7309. {
  7310. public static int Main(string[] args)
  7311. {
  7312. int ret = 1;
  7313. switch (true)
  7314. {
  7315. case /*<bind>*/true/*</bind>*/:
  7316. ret = 0;
  7317. break;
  7318. }
  7319. Console.Write(ret);
  7320. return (ret);
  7321. }
  7322. }
  7323. ";
  7324. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  7325. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  7326. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  7327. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  7328. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  7329. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7330. Assert.Null(semanticInfo.Symbol);
  7331. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  7332. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7333. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7334. Assert.True(semanticInfo.IsCompileTimeConstant);
  7335. Assert.Equal(true, semanticInfo.ConstantValue);
  7336. }
  7337. [Fact]
  7338. public void SwitchCaseLabelExpression_Constant02()
  7339. {
  7340. string sourceCode = @"
  7341. using System;
  7342. public class Test
  7343. {
  7344. public static int Main(string[] args)
  7345. {
  7346. int ret = 1;
  7347. const bool x = true;
  7348. switch (true)
  7349. {
  7350. case /*<bind>*/x/*</bind>*/:
  7351. ret = 0;
  7352. break;
  7353. }
  7354. Console.Write(ret);
  7355. return (ret);
  7356. }
  7357. }
  7358. ";
  7359. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7360. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  7361. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  7362. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  7363. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  7364. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7365. Assert.Equal("System.Boolean x", semanticInfo.Symbol.ToTestDisplayString());
  7366. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  7367. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7368. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7369. Assert.True(semanticInfo.IsCompileTimeConstant);
  7370. Assert.Equal(true, semanticInfo.ConstantValue);
  7371. }
  7372. [Fact]
  7373. public void SwitchCaseLabelExpression_NotConstant()
  7374. {
  7375. string sourceCode = @"
  7376. using System;
  7377. public class Test
  7378. {
  7379. public static int Main(string[] args)
  7380. {
  7381. int ret = 1;
  7382. bool x = true;
  7383. switch (true)
  7384. {
  7385. case /*<bind>*/x/*</bind>*/:
  7386. ret = 0;
  7387. break;
  7388. }
  7389. Console.Write(ret);
  7390. return (ret);
  7391. }
  7392. }
  7393. ";
  7394. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7395. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  7396. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  7397. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  7398. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  7399. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7400. Assert.Equal("System.Boolean x", semanticInfo.Symbol.ToTestDisplayString());
  7401. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  7402. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7403. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7404. Assert.False(semanticInfo.IsCompileTimeConstant);
  7405. }
  7406. [Fact]
  7407. public void SwitchCaseLabelExpression_CastExpression()
  7408. {
  7409. string sourceCode = @"
  7410. using System;
  7411. public class Test
  7412. {
  7413. public static int Main(string[] args)
  7414. {
  7415. int ret = 1;
  7416. switch (ret)
  7417. {
  7418. case /*<bind>*/(int)'a'/*</bind>*/:
  7419. ret = 0;
  7420. break;
  7421. }
  7422. Console.Write(ret);
  7423. return (ret);
  7424. }
  7425. }
  7426. ";
  7427. var semanticInfo = GetSemanticInfoForTest<CastExpressionSyntax>(sourceCode);
  7428. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  7429. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  7430. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  7431. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  7432. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7433. Assert.Null(semanticInfo.Symbol);
  7434. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  7435. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7436. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7437. Assert.True(semanticInfo.IsCompileTimeConstant);
  7438. Assert.Equal(97, semanticInfo.ConstantValue);
  7439. }
  7440. [Fact]
  7441. public void SwitchCaseLabelExpression_Invalid_Lambda()
  7442. {
  7443. string sourceCode = @"
  7444. using System;
  7445. public class Test
  7446. {
  7447. public static int Main(string[] args)
  7448. {
  7449. int ret = 1;
  7450. string s = null;
  7451. switch (s)
  7452. {
  7453. case /*<bind>*/()=>3/*</bind>*/:
  7454. ret = 0;
  7455. break;
  7456. }
  7457. Console.Write(ret);
  7458. return (ret);
  7459. }
  7460. }
  7461. ";
  7462. var semanticInfo = GetSemanticInfoForTest<ParenthesizedLambdaExpressionSyntax>(sourceCode);
  7463. Assert.Null(semanticInfo.Type);
  7464. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  7465. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7466. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  7467. Assert.Equal("lambda expression", semanticInfo.Symbol.ToTestDisplayString());
  7468. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  7469. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7470. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7471. Assert.False(semanticInfo.IsCompileTimeConstant);
  7472. }
  7473. [Fact]
  7474. public void SwitchCaseLabelExpression_Invalid_LambdaWithSyntaxError()
  7475. {
  7476. string sourceCode = @"
  7477. using System;
  7478. public class Test
  7479. {
  7480. static int M() { return 0;}
  7481. public static int Main(string[] args)
  7482. {
  7483. int ret = 1;
  7484. string s = null;
  7485. switch (s)
  7486. {
  7487. case /*<bind>*/()=>/*</bind>*/:
  7488. ret = 0;
  7489. break;
  7490. }
  7491. Console.Write(ret);
  7492. return (ret);
  7493. }
  7494. }
  7495. ";
  7496. var semanticInfo = GetSemanticInfoForTest<ParenthesizedLambdaExpressionSyntax>(sourceCode);
  7497. Assert.Null(semanticInfo.Type);
  7498. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  7499. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7500. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  7501. Assert.Equal("lambda expression", semanticInfo.Symbol.ToTestDisplayString());
  7502. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  7503. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  7504. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7505. Assert.False(semanticInfo.IsCompileTimeConstant);
  7506. }
  7507. [Fact]
  7508. public void SwitchCaseLabelExpression_Invalid_MethodGroup()
  7509. {
  7510. string sourceCode = @"
  7511. using System;
  7512. public class Test
  7513. {
  7514. static int M() { return 0;}
  7515. public static int Main(string[] args)
  7516. {
  7517. int ret = 1;
  7518. string s = null;
  7519. switch (s)
  7520. {
  7521. case /*<bind>*/M/*</bind>*/:
  7522. ret = 0;
  7523. break;
  7524. }
  7525. Console.Write(ret);
  7526. return (ret);
  7527. }
  7528. }
  7529. ";
  7530. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7531. Assert.Null(semanticInfo.Type);
  7532. Assert.Equal("System.String", semanticInfo.ConvertedType.ToTestDisplayString());
  7533. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7534. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  7535. Assert.Null(semanticInfo.Symbol);
  7536. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  7537. Assert.Equal("System.Int32 Test.M()", semanticInfo.CandidateSymbols.Single().ToTestDisplayString());
  7538. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  7539. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7540. Assert.Equal("System.Int32 Test.M()", sortedMethodGroup[0].ToTestDisplayString());
  7541. Assert.False(semanticInfo.IsCompileTimeConstant);
  7542. }
  7543. [WorkItem(541932, "DevDiv")]
  7544. [Fact]
  7545. public void IndexingExpression()
  7546. {
  7547. string sourceCode = @"
  7548. class Test
  7549. {
  7550. static void Main()
  7551. {
  7552. string str = ""Test"";
  7553. char ch = str[/*<bind>*/ 0 /*</bind>*/];
  7554. }
  7555. }
  7556. ";
  7557. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  7558. Assert.True(semanticInfo.IsCompileTimeConstant);
  7559. Assert.Equal(0, semanticInfo.ConstantValue);
  7560. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  7561. }
  7562. [Fact]
  7563. public void InaccessibleInTypeof()
  7564. {
  7565. string sourceCode = @"
  7566. using System;
  7567. using System.Collections.Generic;
  7568. using System.Linq;
  7569. class A
  7570. {
  7571. class B { }
  7572. }
  7573. class Program
  7574. {
  7575. static void Main(string[] args)
  7576. {
  7577. object o = typeof(/*<bind>*/A.B/*</bind>*/);
  7578. }
  7579. }
  7580. ";
  7581. var semanticInfo = GetSemanticInfoForTest<QualifiedNameSyntax>(sourceCode);
  7582. Assert.Equal("A.B", semanticInfo.Type.ToTestDisplayString());
  7583. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  7584. Assert.Equal("A.B", semanticInfo.ConvertedType.ToTestDisplayString());
  7585. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7586. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7587. Assert.Null(semanticInfo.Symbol);
  7588. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  7589. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  7590. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7591. Assert.Equal("A.B", sortedCandidates[0].ToTestDisplayString());
  7592. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  7593. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7594. Assert.False(semanticInfo.IsCompileTimeConstant);
  7595. }
  7596. [Fact]
  7597. public void AttributeWithUnboundGenericType01()
  7598. {
  7599. var sourceCode =
  7600. @"using System;
  7601. class A : Attribute
  7602. {
  7603. public A(object o) { }
  7604. }
  7605. [A(typeof(/*<bind>*/B<>/*</bind>*/))]
  7606. class B<T>
  7607. {
  7608. public class C
  7609. {
  7610. }
  7611. }";
  7612. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7613. var type = semanticInfo.Type;
  7614. Assert.True((type as NamedTypeSymbol).IsUnboundGenericType);
  7615. Assert.False((type as NamedTypeSymbol).IsErrorType());
  7616. }
  7617. [Fact]
  7618. public void AttributeWithUnboundGenericType02()
  7619. {
  7620. var sourceCode =
  7621. @"using System;
  7622. class A : Attribute
  7623. {
  7624. public A(object o) { }
  7625. }
  7626. [A(typeof(/*<bind>*/B<>.C/*</bind>*/))]
  7627. class B<T>
  7628. {
  7629. public class C
  7630. {
  7631. }
  7632. }";
  7633. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7634. var type = semanticInfo.Type;
  7635. Assert.True((type as NamedTypeSymbol).IsUnboundGenericType);
  7636. Assert.False((type as NamedTypeSymbol).IsErrorType());
  7637. }
  7638. [Fact]
  7639. public void AttributeWithUnboundGenericType03()
  7640. {
  7641. var sourceCode =
  7642. @"using System;
  7643. class A : Attribute
  7644. {
  7645. public A(object o) { }
  7646. }
  7647. [A(typeof(/*<bind>*/D/*</bind>*/.C<>))]
  7648. class B<T>
  7649. {
  7650. public class C<U>
  7651. {
  7652. }
  7653. }
  7654. class D : B<int>
  7655. {
  7656. }";
  7657. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7658. var type = semanticInfo.Type;
  7659. Assert.False((type as NamedTypeSymbol).IsUnboundGenericType);
  7660. Assert.False((type as NamedTypeSymbol).IsErrorType());
  7661. }
  7662. [Fact]
  7663. public void AttributeWithUnboundGenericType04()
  7664. {
  7665. var sourceCode =
  7666. @"using System;
  7667. class A : Attribute
  7668. {
  7669. public A(object o) { }
  7670. }
  7671. [A(typeof(/*<bind>*/B<>/*</bind>*/.C<>))]
  7672. class B<T>
  7673. {
  7674. public class C<U>
  7675. {
  7676. }
  7677. }";
  7678. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7679. var type = semanticInfo.Type;
  7680. Assert.Equal("B", type.Name);
  7681. Assert.True((type as NamedTypeSymbol).IsUnboundGenericType);
  7682. Assert.False((type as NamedTypeSymbol).IsErrorType());
  7683. }
  7684. [WorkItem(542430, "DevDiv")]
  7685. [Fact]
  7686. public void UnboundTypeInvariants()
  7687. {
  7688. var sourceCode =
  7689. @"using System;
  7690. public class A<T>
  7691. {
  7692. int x;
  7693. public class B<U>
  7694. {
  7695. int y;
  7696. }
  7697. }
  7698. class Program
  7699. {
  7700. public static void Main(string[] args)
  7701. {
  7702. Console.WriteLine(typeof(/*<bind>*/A<>.B<>/*</bind>*/));
  7703. }
  7704. }";
  7705. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7706. var type = (NamedTypeSymbol)semanticInfo.Type;
  7707. Assert.Equal("B", type.Name);
  7708. Assert.True(type.IsUnboundGenericType);
  7709. Assert.False(type.IsErrorType());
  7710. Assert.True(type.TypeArguments[0].IsErrorType());
  7711. var constructedFrom = type.ConstructedFrom;
  7712. Assert.Equal(constructedFrom, constructedFrom.ConstructedFrom);
  7713. Assert.Equal(constructedFrom, constructedFrom.TypeParameters[0].ContainingSymbol);
  7714. Assert.Equal(constructedFrom.TypeArguments[0], constructedFrom.TypeParameters[0]);
  7715. Assert.Equal(type.ContainingSymbol, constructedFrom.ContainingSymbol);
  7716. Assert.Equal(type.TypeParameters[0], constructedFrom.TypeParameters[0]);
  7717. Assert.False(constructedFrom.TypeArguments[0].IsErrorType());
  7718. Assert.NotEqual(type, constructedFrom);
  7719. Assert.False(constructedFrom.IsUnboundGenericType);
  7720. var a = type.ContainingType;
  7721. Assert.Equal(constructedFrom, a.GetTypeMembers("B").Single());
  7722. Assert.NotEqual(type.TypeParameters[0], type.OriginalDefinition.TypeParameters[0]); // alpha renamed
  7723. Assert.Null(type.BaseType);
  7724. Assert.Empty(type.Interfaces);
  7725. Assert.NotNull(constructedFrom.BaseType);
  7726. Assert.Empty(type.GetMembers());
  7727. Assert.NotEmpty(constructedFrom.GetMembers());
  7728. Assert.True(a.IsUnboundGenericType);
  7729. Assert.False(a.ConstructedFrom.IsUnboundGenericType);
  7730. Assert.Equal(1, a.GetMembers().Length);
  7731. }
  7732. [WorkItem(528659, "DevDiv")]
  7733. [Fact]
  7734. public void AliasTypeName()
  7735. {
  7736. string sourceCode = @"
  7737. using A = System.String;
  7738. class Test
  7739. {
  7740. static void Main()
  7741. {
  7742. /*<bind>*/A/*</bind>*/ a = null;
  7743. }
  7744. }
  7745. ";
  7746. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7747. var aliasInfo = GetAliasInfoForTest(sourceCode);
  7748. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  7749. Assert.Equal("System.String", semanticInfo.Symbol.ToTestDisplayString());
  7750. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  7751. Assert.Equal("A", aliasInfo.Name);
  7752. Assert.Equal("A=System.String", aliasInfo.ToTestDisplayString());
  7753. }
  7754. [WorkItem(542000, "DevDiv")]
  7755. [Fact]
  7756. public void AmbigAttributeBindWithoutAttributeSuffix()
  7757. {
  7758. string sourceCode = @"
  7759. namespace Blue
  7760. {
  7761. public class DescriptionAttribute : System.Attribute
  7762. {
  7763. public DescriptionAttribute(string name) { }
  7764. }
  7765. }
  7766. namespace Red
  7767. {
  7768. public class DescriptionAttribute : System.Attribute
  7769. {
  7770. public DescriptionAttribute(string name) { }
  7771. }
  7772. }
  7773. namespace Green
  7774. {
  7775. using Blue;
  7776. using Red;
  7777. public class Test
  7778. {
  7779. [/*<bind>*/Description/*</bind>*/(null)]
  7780. static void Main()
  7781. {
  7782. }
  7783. }
  7784. }
  7785. ";
  7786. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7787. Assert.Equal("Blue.DescriptionAttribute", semanticInfo.Type.ToTestDisplayString());
  7788. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  7789. Assert.Equal("Blue.DescriptionAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  7790. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  7791. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7792. Assert.Null(semanticInfo.Symbol);
  7793. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  7794. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  7795. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7796. Assert.Equal("Blue.DescriptionAttribute", sortedCandidates[0].ToTestDisplayString());
  7797. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  7798. Assert.Equal("Red.DescriptionAttribute", sortedCandidates[1].ToTestDisplayString());
  7799. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  7800. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7801. Assert.False(semanticInfo.IsCompileTimeConstant);
  7802. }
  7803. [WorkItem(528669, "DevDiv")]
  7804. [Fact]
  7805. public void AmbigAttributeBind1()
  7806. {
  7807. string sourceCode = @"
  7808. namespace Blue
  7809. {
  7810. public class DescriptionAttribute : System.Attribute
  7811. {
  7812. public DescriptionAttribute(string name) { }
  7813. }
  7814. }
  7815. namespace Red
  7816. {
  7817. public class DescriptionAttribute : System.Attribute
  7818. {
  7819. public DescriptionAttribute(string name) { }
  7820. }
  7821. }
  7822. namespace Green
  7823. {
  7824. using Blue;
  7825. using Red;
  7826. public class Test
  7827. {
  7828. [/*<bind>*/DescriptionAttribute/*</bind>*/(null)]
  7829. static void Main()
  7830. {
  7831. }
  7832. }
  7833. }
  7834. ";
  7835. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7836. Assert.Equal("Blue.DescriptionAttribute", semanticInfo.Type.ToTestDisplayString());
  7837. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  7838. Assert.Equal("Blue.DescriptionAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  7839. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  7840. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7841. Assert.Null(semanticInfo.Symbol);
  7842. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  7843. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  7844. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7845. Assert.Equal("Blue.DescriptionAttribute", sortedCandidates[0].ToTestDisplayString());
  7846. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  7847. Assert.Equal("Red.DescriptionAttribute", sortedCandidates[1].ToTestDisplayString());
  7848. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  7849. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7850. Assert.False(semanticInfo.IsCompileTimeConstant);
  7851. }
  7852. [WorkItem(542205, "DevDiv")]
  7853. [Fact]
  7854. public void IncompleteAttributeSymbolInfo()
  7855. {
  7856. string sourceCode = @"
  7857. using System;
  7858. class Program
  7859. {
  7860. [/*<bind>*/ObsoleteAttribute(x/*</bind>*/
  7861. static void Main(string[] args)
  7862. {
  7863. }
  7864. }
  7865. ";
  7866. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  7867. Assert.Null(semanticInfo.Symbol);
  7868. Assert.Equal("System.ObsoleteAttribute", semanticInfo.Type.ToTestDisplayString());
  7869. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  7870. Assert.Equal("System.ObsoleteAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  7871. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  7872. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  7873. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  7874. Assert.Equal(3, semanticInfo.CandidateSymbols.Length);
  7875. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7876. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedCandidates[0].ToTestDisplayString());
  7877. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  7878. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedCandidates[1].ToTestDisplayString());
  7879. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  7880. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedCandidates[2].ToTestDisplayString());
  7881. Assert.Equal(SymbolKind.Method, sortedCandidates[2].Kind);
  7882. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  7883. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7884. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  7885. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedMethodGroup[1].ToTestDisplayString());
  7886. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedMethodGroup[2].ToTestDisplayString());
  7887. Assert.False(semanticInfo.IsCompileTimeConstant);
  7888. }
  7889. [WorkItem(541968, "DevDiv")]
  7890. [Fact]
  7891. public void ConstantFieldInitializerExpression()
  7892. {
  7893. var sourceCode = @"
  7894. using System;
  7895. public class Aa
  7896. {
  7897. const int myLength = /*<bind>*/5/*</bind>*/;
  7898. }
  7899. ";
  7900. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7901. Assert.Equal(5, semanticInfo.ConstantValue);
  7902. }
  7903. [WorkItem(541968, "DevDiv")]
  7904. [Fact]
  7905. public void CircularConstantFieldInitializerExpression()
  7906. {
  7907. var sourceCode = @"
  7908. public class C
  7909. {
  7910. const int x = /*<bind>*/x/*</bind>*/;
  7911. }
  7912. ";
  7913. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  7914. Assert.False(semanticInfo.IsCompileTimeConstant);
  7915. }
  7916. [WorkItem(542017, "DevDiv")]
  7917. [Fact]
  7918. public void AmbigAttributeBind2()
  7919. {
  7920. string sourceCode = @"
  7921. using System;
  7922. [AttributeUsage(AttributeTargets.All)]
  7923. public class X : Attribute
  7924. {
  7925. }
  7926. [AttributeUsage(AttributeTargets.All)]
  7927. public class XAttribute : Attribute
  7928. {
  7929. }
  7930. [/*<bind>*/X/*</bind>*/]
  7931. class Class1
  7932. {
  7933. }
  7934. ";
  7935. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  7936. Assert.Null(semanticInfo.Symbol);
  7937. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  7938. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  7939. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7940. Assert.Equal("X", sortedCandidates[0].ToTestDisplayString());
  7941. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  7942. Assert.Equal("XAttribute", sortedCandidates[1].ToTestDisplayString());
  7943. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  7944. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7945. }
  7946. [WorkItem(542018, "DevDiv")]
  7947. [Fact]
  7948. public void AmbigAttributeBind3()
  7949. {
  7950. string sourceCode = @"
  7951. using System;
  7952. [AttributeUsage(AttributeTargets.All)]
  7953. public class X : Attribute
  7954. {
  7955. }
  7956. [AttributeUsage(AttributeTargets.All)]
  7957. public class XAttribute : Attribute
  7958. {
  7959. }
  7960. [/*<bind>*/X/*</bind>*/]
  7961. class Class1
  7962. {
  7963. }
  7964. ";
  7965. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  7966. Assert.Null(semanticInfo.Symbol);
  7967. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  7968. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  7969. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  7970. Assert.Equal("X", sortedCandidates[0].ToTestDisplayString());
  7971. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  7972. Assert.Equal("XAttribute", sortedCandidates[1].ToTestDisplayString());
  7973. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  7974. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  7975. }
  7976. [Fact]
  7977. public void AmbigAttributeBind4()
  7978. {
  7979. string sourceCode = @"
  7980. namespace ValidWithSuffix
  7981. {
  7982. public class DescriptionAttribute : System.Attribute
  7983. {
  7984. public DescriptionAttribute(string name) { }
  7985. }
  7986. }
  7987. namespace ValidWithoutSuffix
  7988. {
  7989. public class Description : System.Attribute
  7990. {
  7991. public Description(string name) { }
  7992. }
  7993. }
  7994. namespace TestNamespace_01
  7995. {
  7996. using ValidWithSuffix;
  7997. using ValidWithoutSuffix;
  7998. [/*<bind>*/Description/*</bind>*/(null)]
  7999. public class Test { }
  8000. }
  8001. ";
  8002. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8003. Assert.Equal("ValidWithoutSuffix.Description", semanticInfo.Type.ToTestDisplayString());
  8004. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  8005. Assert.Equal("ValidWithoutSuffix.Description", semanticInfo.ConvertedType.ToTestDisplayString());
  8006. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  8007. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8008. Assert.Null(semanticInfo.Symbol);
  8009. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8010. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8011. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8012. Assert.Equal("ValidWithoutSuffix.Description", sortedCandidates[0].ToTestDisplayString());
  8013. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8014. Assert.Equal("ValidWithSuffix.DescriptionAttribute", sortedCandidates[1].ToTestDisplayString());
  8015. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8016. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8017. Assert.False(semanticInfo.IsCompileTimeConstant);
  8018. }
  8019. [Fact]
  8020. public void AmbigAttributeBind5()
  8021. {
  8022. string sourceCode = @"
  8023. namespace ValidWithSuffix
  8024. {
  8025. public class DescriptionAttribute : System.Attribute
  8026. {
  8027. public DescriptionAttribute(string name) { }
  8028. }
  8029. }
  8030. namespace ValidWithSuffix_And_ValidWithoutSuffix
  8031. {
  8032. public class DescriptionAttribute : System.Attribute
  8033. {
  8034. public DescriptionAttribute(string name) { }
  8035. }
  8036. public class Description : System.Attribute
  8037. {
  8038. public Description(string name) { }
  8039. }
  8040. }
  8041. namespace TestNamespace_02
  8042. {
  8043. using ValidWithSuffix;
  8044. using ValidWithSuffix_And_ValidWithoutSuffix;
  8045. [/*<bind>*/Description/*</bind>*/(null)]
  8046. public class Test { }
  8047. }
  8048. ";
  8049. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8050. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description", semanticInfo.Type.ToTestDisplayString());
  8051. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8052. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description", semanticInfo.ConvertedType.ToTestDisplayString());
  8053. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8054. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8055. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description.Description(string)", semanticInfo.Symbol.ToDisplayString());
  8056. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  8057. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8058. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8059. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description.Description(string)", semanticInfo.MethodGroup[0].ToDisplayString());
  8060. Assert.False(semanticInfo.IsCompileTimeConstant);
  8061. }
  8062. [Fact]
  8063. public void AmbigAttributeBind6()
  8064. {
  8065. string sourceCode = @"
  8066. namespace ValidWithoutSuffix
  8067. {
  8068. public class Description : System.Attribute
  8069. {
  8070. public Description(string name) { }
  8071. }
  8072. }
  8073. namespace ValidWithSuffix_And_ValidWithoutSuffix
  8074. {
  8075. public class DescriptionAttribute : System.Attribute
  8076. {
  8077. public DescriptionAttribute(string name) { }
  8078. }
  8079. public class Description : System.Attribute
  8080. {
  8081. public Description(string name) { }
  8082. }
  8083. }
  8084. namespace TestNamespace_03
  8085. {
  8086. using ValidWithoutSuffix;
  8087. using ValidWithSuffix_And_ValidWithoutSuffix;
  8088. [/*<bind>*/Description/*</bind>*/(null)]
  8089. public class Test { }
  8090. }
  8091. ";
  8092. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8093. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.DescriptionAttribute", semanticInfo.Type.ToTestDisplayString());
  8094. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8095. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.DescriptionAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  8096. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8097. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8098. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.DescriptionAttribute.DescriptionAttribute(string)", semanticInfo.Symbol.ToDisplayString());
  8099. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  8100. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8101. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8102. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.DescriptionAttribute.DescriptionAttribute(string)", semanticInfo.MethodGroup[0].ToDisplayString());
  8103. Assert.False(semanticInfo.IsCompileTimeConstant);
  8104. }
  8105. [Fact]
  8106. public void AmbigAttributeBind7()
  8107. {
  8108. string sourceCode = @"
  8109. namespace ValidWithSuffix
  8110. {
  8111. public class DescriptionAttribute : System.Attribute
  8112. {
  8113. public DescriptionAttribute(string name) { }
  8114. }
  8115. }
  8116. namespace ValidWithoutSuffix
  8117. {
  8118. public class Description : System.Attribute
  8119. {
  8120. public Description(string name) { }
  8121. }
  8122. }
  8123. namespace ValidWithSuffix_And_ValidWithoutSuffix
  8124. {
  8125. public class DescriptionAttribute : System.Attribute
  8126. {
  8127. public DescriptionAttribute(string name) { }
  8128. }
  8129. public class Description : System.Attribute
  8130. {
  8131. public Description(string name) { }
  8132. }
  8133. }
  8134. namespace TestNamespace_04
  8135. {
  8136. using ValidWithSuffix;
  8137. using ValidWithoutSuffix;
  8138. using ValidWithSuffix_And_ValidWithoutSuffix;
  8139. [/*<bind>*/Description/*</bind>*/(null)]
  8140. public class Test { }
  8141. }
  8142. ";
  8143. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8144. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description", semanticInfo.Type.ToTestDisplayString());
  8145. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  8146. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description", semanticInfo.ConvertedType.ToTestDisplayString());
  8147. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  8148. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8149. Assert.Null(semanticInfo.Symbol);
  8150. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8151. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8152. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8153. Assert.Equal("ValidWithoutSuffix.Description", sortedCandidates[0].ToTestDisplayString());
  8154. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8155. Assert.Equal("ValidWithSuffix_And_ValidWithoutSuffix.Description", sortedCandidates[1].ToTestDisplayString());
  8156. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8157. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8158. Assert.False(semanticInfo.IsCompileTimeConstant);
  8159. }
  8160. [Fact]
  8161. public void AmbigAttributeBind8()
  8162. {
  8163. string sourceCode = @"
  8164. namespace InvalidWithSuffix
  8165. {
  8166. public class DescriptionAttribute
  8167. {
  8168. public DescriptionAttribute(string name) { }
  8169. }
  8170. }
  8171. namespace InvalidWithoutSuffix
  8172. {
  8173. public class Description
  8174. {
  8175. public Description(string name) { }
  8176. }
  8177. }
  8178. namespace TestNamespace_05
  8179. {
  8180. using InvalidWithSuffix;
  8181. using InvalidWithoutSuffix;
  8182. [/*<bind>*/Description/*</bind>*/(null)]
  8183. public class Test { }
  8184. }
  8185. ";
  8186. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8187. Assert.Equal("InvalidWithoutSuffix.Description", semanticInfo.Type.ToTestDisplayString());
  8188. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8189. Assert.Equal("InvalidWithoutSuffix.Description", semanticInfo.ConvertedType.ToTestDisplayString());
  8190. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8191. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8192. Assert.Null(semanticInfo.Symbol);
  8193. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  8194. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8195. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8196. Assert.Equal("InvalidWithoutSuffix.Description..ctor(System.String name)", sortedCandidates[0].ToTestDisplayString());
  8197. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  8198. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8199. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8200. Assert.Equal("InvalidWithoutSuffix.Description..ctor(System.String name)", sortedMethodGroup[0].ToTestDisplayString());
  8201. Assert.False(semanticInfo.IsCompileTimeConstant);
  8202. }
  8203. [Fact]
  8204. public void AmbigAttributeBind9()
  8205. {
  8206. string sourceCode = @"
  8207. namespace InvalidWithoutSuffix
  8208. {
  8209. public class Description
  8210. {
  8211. public Description(string name) { }
  8212. }
  8213. }
  8214. namespace InvalidWithSuffix_And_InvalidWithoutSuffix
  8215. {
  8216. public class DescriptionAttribute
  8217. {
  8218. public DescriptionAttribute(string name) { }
  8219. }
  8220. public class Description
  8221. {
  8222. public Description(string name) { }
  8223. }
  8224. }
  8225. namespace TestNamespace_07
  8226. {
  8227. using InvalidWithoutSuffix;
  8228. using InvalidWithSuffix_And_InvalidWithoutSuffix;
  8229. [/*<bind>*/Description/*</bind>*/(null)]
  8230. public class Test { }
  8231. }
  8232. ";
  8233. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8234. Assert.Equal("InvalidWithSuffix_And_InvalidWithoutSuffix.Description", semanticInfo.Type.ToTestDisplayString());
  8235. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  8236. Assert.Equal("InvalidWithSuffix_And_InvalidWithoutSuffix.Description", semanticInfo.ConvertedType.ToTestDisplayString());
  8237. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  8238. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8239. Assert.Null(semanticInfo.Symbol);
  8240. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8241. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8242. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8243. Assert.Equal("InvalidWithoutSuffix.Description", sortedCandidates[0].ToTestDisplayString());
  8244. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8245. Assert.Equal("InvalidWithSuffix_And_InvalidWithoutSuffix.Description", sortedCandidates[1].ToTestDisplayString());
  8246. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8247. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8248. Assert.False(semanticInfo.IsCompileTimeConstant);
  8249. }
  8250. [WorkItem(542979, "DevDiv")]
  8251. [Fact()]
  8252. public void AliasAttributeName()
  8253. {
  8254. string sourceCode = @"
  8255. using A = A1;
  8256. class A1 : System.Attribute { }
  8257. [/*<bind>*/A/*</bind>*/] class C { }
  8258. ";
  8259. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  8260. Assert.Equal("A1", semanticInfo.Type.ToTestDisplayString());
  8261. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8262. Assert.Equal("A1", semanticInfo.ConvertedType.ToTestDisplayString());
  8263. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8264. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8265. Assert.Equal("A1..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  8266. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  8267. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8268. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8269. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8270. Assert.Equal("A1..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8271. Assert.False(semanticInfo.IsCompileTimeConstant);
  8272. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8273. Assert.NotNull(aliasInfo);
  8274. Assert.Equal("A=A1", aliasInfo.ToTestDisplayString());
  8275. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  8276. }
  8277. [WorkItem(542979, "DevDiv")]
  8278. [Fact()]
  8279. public void AliasAttributeName_02_AttributeSyntax()
  8280. {
  8281. string sourceCode = @"
  8282. using FooAttribute = System.ObsoleteAttribute;
  8283. [/*<bind>*/Foo/*</bind>*/]
  8284. class C { }
  8285. ";
  8286. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  8287. Assert.Equal("System.ObsoleteAttribute", semanticInfo.Type.ToTestDisplayString());
  8288. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8289. Assert.Equal("System.ObsoleteAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  8290. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8291. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8292. Assert.Equal("System.ObsoleteAttribute..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  8293. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  8294. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8295. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  8296. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8297. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8298. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedMethodGroup[1].ToTestDisplayString());
  8299. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedMethodGroup[2].ToTestDisplayString());
  8300. Assert.False(semanticInfo.IsCompileTimeConstant);
  8301. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8302. Assert.NotNull(aliasInfo);
  8303. Assert.Equal("FooAttribute=System.ObsoleteAttribute", aliasInfo.ToTestDisplayString());
  8304. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  8305. }
  8306. [WorkItem(542979, "DevDiv")]
  8307. [Fact]
  8308. public void AliasAttributeName_02_IdentifierNameSyntax()
  8309. {
  8310. string sourceCode = @"
  8311. using FooAttribute = System.ObsoleteAttribute;
  8312. [/*<bind>*/Foo/*</bind>*/]
  8313. class C { }
  8314. ";
  8315. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8316. Assert.Equal("System.ObsoleteAttribute", semanticInfo.Type.ToTestDisplayString());
  8317. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8318. Assert.Equal("System.ObsoleteAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  8319. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8320. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8321. Assert.Equal("System.ObsoleteAttribute..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  8322. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  8323. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8324. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  8325. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8326. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8327. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedMethodGroup[1].ToTestDisplayString());
  8328. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedMethodGroup[2].ToTestDisplayString());
  8329. Assert.False(semanticInfo.IsCompileTimeConstant);
  8330. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8331. Assert.NotNull(aliasInfo);
  8332. Assert.Equal("FooAttribute=System.ObsoleteAttribute", aliasInfo.ToTestDisplayString());
  8333. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  8334. }
  8335. [WorkItem(542979, "DevDiv")]
  8336. [Fact]
  8337. public void AliasAttributeName_03_AttributeSyntax()
  8338. {
  8339. string sourceCode = @"
  8340. using FooAttribute = System.ObsoleteAttribute;
  8341. [/*<bind>*/FooAttribute/*</bind>*/]
  8342. class C { }
  8343. ";
  8344. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  8345. Assert.Equal("System.ObsoleteAttribute", semanticInfo.Type.ToTestDisplayString());
  8346. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8347. Assert.Equal("System.ObsoleteAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  8348. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8349. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8350. Assert.Equal("System.ObsoleteAttribute..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  8351. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  8352. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8353. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  8354. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8355. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8356. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedMethodGroup[1].ToTestDisplayString());
  8357. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedMethodGroup[2].ToTestDisplayString());
  8358. Assert.False(semanticInfo.IsCompileTimeConstant);
  8359. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8360. Assert.NotNull(aliasInfo);
  8361. Assert.Equal("FooAttribute=System.ObsoleteAttribute", aliasInfo.ToTestDisplayString());
  8362. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  8363. }
  8364. [WorkItem(542979, "DevDiv")]
  8365. [Fact]
  8366. public void AliasAttributeName_03_IdentifierNameSyntax()
  8367. {
  8368. string sourceCode = @"
  8369. using FooAttribute = System.ObsoleteAttribute;
  8370. [/*<bind>*/FooAttribute/*</bind>*/]
  8371. class C { }
  8372. ";
  8373. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8374. Assert.Equal("System.ObsoleteAttribute", semanticInfo.Type.ToTestDisplayString());
  8375. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8376. Assert.Equal("System.ObsoleteAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  8377. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8378. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8379. Assert.Equal("System.ObsoleteAttribute..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  8380. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  8381. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8382. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  8383. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8384. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8385. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedMethodGroup[1].ToTestDisplayString());
  8386. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedMethodGroup[2].ToTestDisplayString());
  8387. Assert.False(semanticInfo.IsCompileTimeConstant);
  8388. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8389. Assert.NotNull(aliasInfo);
  8390. Assert.Equal("FooAttribute=System.ObsoleteAttribute", aliasInfo.ToTestDisplayString());
  8391. Assert.Equal(SymbolKind.Alias, aliasInfo.Kind);
  8392. }
  8393. [WorkItem(542979, "DevDiv")]
  8394. [Fact()]
  8395. public void AliasQualifiedAttributeName_01()
  8396. {
  8397. string sourceCode = @"
  8398. class AttributeClass : System.Attribute
  8399. {
  8400. class NonAttributeClass { }
  8401. }
  8402. namespace N
  8403. {
  8404. [global::/*<bind>*/AttributeClass/*</bind>*/.NonAttributeClass()]
  8405. class C { }
  8406. class AttributeClass : System.Attribute { }
  8407. }
  8408. ";
  8409. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8410. Assert.Equal("AttributeClass", semanticInfo.Type.ToTestDisplayString());
  8411. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8412. Assert.Equal("AttributeClass", semanticInfo.ConvertedType.ToTestDisplayString());
  8413. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8414. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8415. Assert.Equal("AttributeClass", semanticInfo.Symbol.ToTestDisplayString());
  8416. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  8417. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8418. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8419. Assert.False(semanticInfo.IsCompileTimeConstant);
  8420. Assert.False(SyntaxFacts.IsAttributeName(((SourceNamedTypeSymbol)semanticInfo.Symbol).SyntaxReferences.First().GetSyntax()),
  8421. "IsAttributeName can be true only for alias name being qualified");
  8422. }
  8423. [Fact]
  8424. public void AliasQualifiedAttributeName_02()
  8425. {
  8426. string sourceCode = @"
  8427. class AttributeClass : System.Attribute
  8428. {
  8429. class NonAttributeClass { }
  8430. }
  8431. namespace N
  8432. {
  8433. [/*<bind>*/global::AttributeClass/*</bind>*/.NonAttributeClass()]
  8434. class C { }
  8435. class AttributeClass : System.Attribute { }
  8436. }
  8437. ";
  8438. var semanticInfo = GetSemanticInfoForTest<AliasQualifiedNameSyntax>(sourceCode);
  8439. Assert.Equal("AttributeClass", semanticInfo.Type.ToTestDisplayString());
  8440. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8441. Assert.Equal("AttributeClass", semanticInfo.ConvertedType.ToTestDisplayString());
  8442. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8443. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8444. Assert.Equal("AttributeClass", semanticInfo.Symbol.ToTestDisplayString());
  8445. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  8446. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  8447. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8448. Assert.False(semanticInfo.IsCompileTimeConstant);
  8449. Assert.False(SyntaxFacts.IsAttributeName(((SourceNamedTypeSymbol)semanticInfo.Symbol).SyntaxReferences.First().GetSyntax()),
  8450. "IsAttributeName can be true only for alias name being qualified");
  8451. }
  8452. [Fact]
  8453. public void AliasQualifiedAttributeName_03()
  8454. {
  8455. string sourceCode = @"
  8456. class AttributeClass : System.Attribute
  8457. {
  8458. class NonAttributeClass { }
  8459. }
  8460. namespace N
  8461. {
  8462. [global::AttributeClass./*<bind>*/NonAttributeClass/*</bind>*/()]
  8463. class C { }
  8464. class AttributeClass : System.Attribute { }
  8465. }
  8466. ";
  8467. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8468. Assert.Equal("AttributeClass.NonAttributeClass", semanticInfo.Type.ToTestDisplayString());
  8469. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8470. Assert.Equal("AttributeClass.NonAttributeClass", semanticInfo.ConvertedType.ToTestDisplayString());
  8471. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8472. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8473. Assert.Null(semanticInfo.Symbol);
  8474. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  8475. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8476. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8477. Assert.Equal("AttributeClass.NonAttributeClass..ctor()", sortedCandidates[0].ToTestDisplayString());
  8478. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  8479. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8480. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8481. Assert.Equal("AttributeClass.NonAttributeClass..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8482. Assert.False(semanticInfo.IsCompileTimeConstant);
  8483. }
  8484. [Fact]
  8485. public void AliasQualifiedAttributeName_04()
  8486. {
  8487. string sourceCode = @"
  8488. class AttributeClass : System.Attribute
  8489. {
  8490. class NonAttributeClass { }
  8491. }
  8492. namespace N
  8493. {
  8494. [/*<bind>*/global::AttributeClass.NonAttributeClass/*</bind>*/()]
  8495. class C { }
  8496. class AttributeClass : System.Attribute { }
  8497. }
  8498. ";
  8499. var semanticInfo = GetSemanticInfoForTest<QualifiedNameSyntax>(sourceCode);
  8500. Assert.Equal("AttributeClass.NonAttributeClass", semanticInfo.Type.ToTestDisplayString());
  8501. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8502. Assert.Equal("AttributeClass.NonAttributeClass", semanticInfo.ConvertedType.ToTestDisplayString());
  8503. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8504. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8505. Assert.Null(semanticInfo.Symbol);
  8506. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  8507. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8508. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8509. Assert.Equal("AttributeClass.NonAttributeClass..ctor()", sortedCandidates[0].ToTestDisplayString());
  8510. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  8511. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8512. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8513. Assert.Equal("AttributeClass.NonAttributeClass..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8514. Assert.False(semanticInfo.IsCompileTimeConstant);
  8515. }
  8516. [Fact]
  8517. public void AliasAttributeName_NonAttributeAlias()
  8518. {
  8519. string sourceCode = @"
  8520. using FooAttribute = C;
  8521. [/*<bind>*/FooAttribute/*</bind>*/]
  8522. class C { }
  8523. ";
  8524. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  8525. Assert.Equal("C", semanticInfo.Type.ToTestDisplayString());
  8526. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8527. Assert.Equal("C", semanticInfo.ConvertedType.ToTestDisplayString());
  8528. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8529. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8530. Assert.Null(semanticInfo.Symbol);
  8531. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  8532. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8533. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8534. Assert.Equal("C..ctor()", sortedCandidates[0].ToTestDisplayString());
  8535. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  8536. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8537. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8538. Assert.Equal("C..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8539. Assert.False(semanticInfo.IsCompileTimeConstant);
  8540. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8541. Assert.Null(aliasInfo);
  8542. }
  8543. [Fact]
  8544. public void AliasAttributeName_NonAttributeAlias_GenericType()
  8545. {
  8546. string sourceCode = @"
  8547. using FooAttribute = Gen<int>;
  8548. [/*<bind>*/FooAttribute/*</bind>*/]
  8549. class C { }
  8550. class Gen<T> { }
  8551. ";
  8552. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8553. Assert.Equal("Gen<System.Int32>", semanticInfo.Type.ToTestDisplayString());
  8554. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8555. Assert.Equal("Gen<System.Int32>", semanticInfo.ConvertedType.ToTestDisplayString());
  8556. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8557. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8558. Assert.Null(semanticInfo.Symbol);
  8559. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  8560. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8561. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8562. Assert.Equal("Gen<System.Int32>..ctor()", sortedCandidates[0].ToTestDisplayString());
  8563. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  8564. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  8565. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8566. Assert.Equal("Gen<System.Int32>..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  8567. Assert.False(semanticInfo.IsCompileTimeConstant);
  8568. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8569. Assert.Null(aliasInfo);
  8570. }
  8571. [Fact]
  8572. public void AmbigAliasAttributeName()
  8573. {
  8574. string sourceCode = @"
  8575. using A = A1;
  8576. using AAttribute = A2;
  8577. class A1 : System.Attribute { }
  8578. class A2 : System.Attribute { }
  8579. [/*<bind>*/A/*</bind>*/] class C { }
  8580. ";
  8581. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  8582. Assert.Equal("A", semanticInfo.Type.ToTestDisplayString());
  8583. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  8584. Assert.Equal("A", semanticInfo.ConvertedType.ToTestDisplayString());
  8585. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  8586. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8587. Assert.Null(semanticInfo.Symbol);
  8588. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8589. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8590. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8591. Assert.Equal("A1", sortedCandidates[0].ToTestDisplayString());
  8592. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8593. Assert.Equal("A2", sortedCandidates[1].ToTestDisplayString());
  8594. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8595. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8596. Assert.False(semanticInfo.IsCompileTimeConstant);
  8597. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8598. Assert.Null(aliasInfo);
  8599. }
  8600. [Fact]
  8601. public void AmbigAliasAttributeName_02()
  8602. {
  8603. string sourceCode = @"
  8604. using Foo = System.ObsoleteAttribute;
  8605. class FooAttribute : System.Attribute { }
  8606. [/*<bind>*/Foo/*</bind>*/]
  8607. class C { }
  8608. ";
  8609. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8610. Assert.Equal("Foo", semanticInfo.Type.ToTestDisplayString());
  8611. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  8612. Assert.Equal("Foo", semanticInfo.ConvertedType.ToTestDisplayString());
  8613. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  8614. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8615. Assert.Null(semanticInfo.Symbol);
  8616. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8617. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8618. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8619. Assert.Equal("FooAttribute", sortedCandidates[0].ToTestDisplayString());
  8620. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8621. Assert.Equal("System.ObsoleteAttribute", sortedCandidates[1].ToTestDisplayString());
  8622. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8623. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8624. Assert.False(semanticInfo.IsCompileTimeConstant);
  8625. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8626. Assert.Null(aliasInfo);
  8627. }
  8628. [Fact]
  8629. public void AmbigAliasAttributeName_03()
  8630. {
  8631. string sourceCode = @"
  8632. using Foo = FooAttribute;
  8633. class FooAttribute : System.Attribute { }
  8634. [/*<bind>*/Foo/*</bind>*/]
  8635. class C { }
  8636. ";
  8637. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8638. Assert.Equal("Foo", semanticInfo.Type.ToTestDisplayString());
  8639. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  8640. Assert.Equal("Foo", semanticInfo.ConvertedType.ToTestDisplayString());
  8641. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  8642. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8643. Assert.Null(semanticInfo.Symbol);
  8644. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8645. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8646. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8647. Assert.Equal("FooAttribute", sortedCandidates[0].ToTestDisplayString());
  8648. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8649. Assert.Equal("FooAttribute", sortedCandidates[1].ToTestDisplayString());
  8650. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8651. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8652. Assert.False(semanticInfo.IsCompileTimeConstant);
  8653. var aliasInfo = GetAliasInfoForTest(sourceCode);
  8654. Assert.Null(aliasInfo);
  8655. }
  8656. [WorkItem(542018, "DevDiv")]
  8657. [Fact]
  8658. public void AmbigObjectCreationBind()
  8659. {
  8660. string sourceCode = @"
  8661. using System;
  8662. public class X
  8663. {
  8664. }
  8665. public struct X
  8666. {
  8667. }
  8668. class Class1
  8669. {
  8670. public static void Main()
  8671. {
  8672. object x = new /*<bind>*/X/*</bind>*/();
  8673. }
  8674. }
  8675. ";
  8676. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8677. Assert.Null(semanticInfo.Symbol);
  8678. Assert.Equal(CandidateReason.Ambiguous, semanticInfo.CandidateReason);
  8679. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  8680. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8681. Assert.Equal("X", sortedCandidates[0].ToTestDisplayString());
  8682. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  8683. Assert.Equal("X", sortedCandidates[1].ToTestDisplayString());
  8684. Assert.Equal(SymbolKind.NamedType, sortedCandidates[1].Kind);
  8685. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8686. }
  8687. [WorkItem(542027, "DevDiv")]
  8688. [Fact()]
  8689. public void NonStaticMemberOfOuterTypeAccessedViaNestedType()
  8690. {
  8691. string sourceCode = @"
  8692. class MyClass
  8693. {
  8694. public int intTest = 1;
  8695. class TestClass
  8696. {
  8697. public void TestMeth()
  8698. {
  8699. int intI = /*<bind>*/ intTest /*</bind>*/;
  8700. }
  8701. }
  8702. }
  8703. ";
  8704. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8705. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  8706. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  8707. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  8708. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  8709. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8710. Assert.Null(semanticInfo.Symbol);
  8711. Assert.Equal(CandidateReason.StaticInstanceMismatch, semanticInfo.CandidateReason);
  8712. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8713. Assert.Equal("System.Int32 MyClass.intTest", sortedCandidates[0].ToTestDisplayString());
  8714. Assert.Equal(SymbolKind.Field, sortedCandidates[0].Kind);
  8715. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8716. Assert.False(semanticInfo.IsCompileTimeConstant);
  8717. }
  8718. [WorkItem(530093, "DevDiv")]
  8719. [Fact()]
  8720. public void ThisInFieldInitializer()
  8721. {
  8722. string sourceCode = @"
  8723. class MyClass
  8724. {
  8725. public MyClass self = /*<bind>*/ this /*</bind>*/;
  8726. }";
  8727. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  8728. Assert.Equal("MyClass", semanticInfo.Type.ToTestDisplayString());
  8729. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8730. Assert.Equal("MyClass", semanticInfo.ConvertedType.ToTestDisplayString());
  8731. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8732. Assert.Null(semanticInfo.Symbol);
  8733. Assert.Equal(CandidateReason.NotReferencable, semanticInfo.CandidateReason);
  8734. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8735. Assert.Equal(1, sortedCandidates.Length);
  8736. Assert.Equal("MyClass @this", sortedCandidates[0].ToTestDisplayString());
  8737. Assert.Equal(SymbolKind.Parameter, sortedCandidates[0].Kind);
  8738. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8739. Assert.False(semanticInfo.IsCompileTimeConstant);
  8740. }
  8741. [WorkItem(530093, "DevDiv")]
  8742. [Fact()]
  8743. public void BaseInFieldInitializer()
  8744. {
  8745. string sourceCode = @"
  8746. class MyClass
  8747. {
  8748. public object self = /*<bind>*/ base /*</bind>*/ .Id();
  8749. object Id() { return this; }
  8750. }";
  8751. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  8752. Assert.Equal("System.Object", semanticInfo.Type.ToTestDisplayString());
  8753. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8754. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  8755. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8756. Assert.Null(semanticInfo.Symbol);
  8757. Assert.Equal(SymbolKind.Parameter, semanticInfo.CandidateSymbols[0].Kind);
  8758. Assert.Equal(CandidateReason.NotReferencable, semanticInfo.CandidateReason);
  8759. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8760. Assert.Equal(1, sortedCandidates.Length);
  8761. Assert.Equal("MyClass @this", sortedCandidates[0].ToTestDisplayString());
  8762. Assert.Equal(SymbolKind.Parameter, sortedCandidates[0].Kind);
  8763. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8764. Assert.False(semanticInfo.IsCompileTimeConstant);
  8765. }
  8766. [Fact()]
  8767. public void MemberAccessToInaccessibleField()
  8768. {
  8769. string sourceCode = @"
  8770. class MyClass1
  8771. {
  8772. private static int myInt1 = 12;
  8773. }
  8774. class MyClass2
  8775. {
  8776. public int myInt2 = /*<bind>*/MyClass1.myInt1/*</bind>*/;
  8777. }
  8778. ";
  8779. var semanticInfo = GetSemanticInfoForTest<MemberAccessExpressionSyntax>(sourceCode);
  8780. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  8781. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  8782. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  8783. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  8784. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8785. Assert.Null(semanticInfo.Symbol);
  8786. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  8787. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8788. Assert.Equal("System.Int32 MyClass1.myInt1", sortedCandidates[0].ToTestDisplayString());
  8789. Assert.Equal(SymbolKind.Field, sortedCandidates[0].Kind);
  8790. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8791. Assert.False(semanticInfo.IsCompileTimeConstant);
  8792. }
  8793. [WorkItem(528682, "DevDiv")]
  8794. [Fact]
  8795. public void PropertyGetAccessWithPrivateGetter()
  8796. {
  8797. string sourceCode = @"
  8798. public class MyClass
  8799. {
  8800. public int Property
  8801. {
  8802. private get { return 0; }
  8803. set { }
  8804. }
  8805. }
  8806. public class Test
  8807. {
  8808. public static void Main(string[] args)
  8809. {
  8810. MyClass c = new MyClass();
  8811. int a = c./*<bind>*/Property/*</bind>*/;
  8812. }
  8813. }
  8814. ";
  8815. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8816. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  8817. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  8818. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  8819. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  8820. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8821. Assert.Null(semanticInfo.Symbol);
  8822. Assert.Equal(CandidateReason.NotAValue, semanticInfo.CandidateReason);
  8823. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8824. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8825. Assert.Equal("System.Int32 MyClass.Property { get; set; }", sortedCandidates[0].ToTestDisplayString());
  8826. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  8827. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8828. Assert.False(semanticInfo.IsCompileTimeConstant);
  8829. }
  8830. [WorkItem(542053, "DevDiv")]
  8831. [Fact]
  8832. public void GetAccessPrivateProperty()
  8833. {
  8834. string sourceCode = @"
  8835. public class Test
  8836. {
  8837. class Class1
  8838. {
  8839. private int a { get { return 1; } set { } }
  8840. }
  8841. class Class2 : Class1
  8842. {
  8843. public int b() { return /*<bind>*/a/*</bind>*/; }
  8844. }
  8845. }
  8846. ";
  8847. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8848. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  8849. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  8850. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  8851. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  8852. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8853. Assert.Null(semanticInfo.Symbol);
  8854. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  8855. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8856. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8857. Assert.Equal("System.Int32 Test.Class1.a { get; set; }", sortedCandidates[0].ToTestDisplayString());
  8858. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  8859. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8860. Assert.False(semanticInfo.IsCompileTimeConstant);
  8861. }
  8862. [WorkItem(542053, "DevDiv")]
  8863. [Fact]
  8864. public void GetAccessPrivateField()
  8865. {
  8866. string sourceCode = @"
  8867. public class Test
  8868. {
  8869. class Class1
  8870. {
  8871. private int a;
  8872. }
  8873. class Class2 : Class1
  8874. {
  8875. public int b() { return /*<bind>*/a/*</bind>*/; }
  8876. }
  8877. }
  8878. ";
  8879. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8880. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  8881. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  8882. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  8883. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  8884. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8885. Assert.Null(semanticInfo.Symbol);
  8886. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  8887. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8888. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8889. Assert.Equal("System.Int32 Test.Class1.a", sortedCandidates[0].ToTestDisplayString());
  8890. Assert.Equal(SymbolKind.Field, sortedCandidates[0].Kind);
  8891. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8892. Assert.False(semanticInfo.IsCompileTimeConstant);
  8893. }
  8894. [WorkItem(542053, "DevDiv")]
  8895. [Fact]
  8896. public void GetAccessPrivateEvent()
  8897. {
  8898. string sourceCode = @"
  8899. using System;
  8900. public class Test
  8901. {
  8902. class Class1
  8903. {
  8904. private event Action a;
  8905. }
  8906. class Class2 : Class1
  8907. {
  8908. public Action b() { return /*<bind>*/a/*</bind>*/(); }
  8909. }
  8910. }
  8911. ";
  8912. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8913. Assert.Equal("System.Action", semanticInfo.Type.ToTestDisplayString());
  8914. Assert.Equal(TypeKind.Delegate, semanticInfo.Type.TypeKind);
  8915. Assert.Equal("System.Action", semanticInfo.ConvertedType.ToTestDisplayString());
  8916. Assert.Equal(TypeKind.Delegate, semanticInfo.ConvertedType.TypeKind);
  8917. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8918. Assert.Null(semanticInfo.Symbol);
  8919. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  8920. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8921. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8922. Assert.Equal("event System.Action Test.Class1.a", sortedCandidates[0].ToTestDisplayString());
  8923. Assert.Equal(SymbolKind.Event, sortedCandidates[0].Kind);
  8924. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8925. Assert.False(semanticInfo.IsCompileTimeConstant);
  8926. }
  8927. [WorkItem(528684, "DevDiv")]
  8928. [Fact]
  8929. public void PropertySetAccessWithPrivateSetter()
  8930. {
  8931. string sourceCode = @"
  8932. public class MyClass
  8933. {
  8934. public int Property
  8935. {
  8936. get { return 0; }
  8937. private set { }
  8938. }
  8939. }
  8940. public class Test
  8941. {
  8942. static void Main()
  8943. {
  8944. MyClass c = new MyClass();
  8945. c./*<bind>*/Property/*</bind>*/ = 10;
  8946. }
  8947. }
  8948. ";
  8949. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  8950. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  8951. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  8952. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  8953. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  8954. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8955. Assert.Null(semanticInfo.Symbol);
  8956. Assert.Equal(CandidateReason.NotAVariable, semanticInfo.CandidateReason);
  8957. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8958. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8959. Assert.Equal("System.Int32 MyClass.Property { get; set; }", sortedCandidates[0].ToTestDisplayString());
  8960. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  8961. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8962. Assert.False(semanticInfo.IsCompileTimeConstant);
  8963. }
  8964. [Fact]
  8965. public void PropertyIndexerAccessWithPrivateSetter()
  8966. {
  8967. string sourceCode = @"
  8968. public class MyClass
  8969. {
  8970. public object this[int index]
  8971. {
  8972. get { return null; }
  8973. private set { }
  8974. }
  8975. }
  8976. public class Test
  8977. {
  8978. static void Main()
  8979. {
  8980. MyClass c = new MyClass();
  8981. /*<bind>*/c[0]/*</bind>*/ = null;
  8982. }
  8983. }
  8984. ";
  8985. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  8986. Assert.Equal("System.Object", semanticInfo.Type.ToTestDisplayString());
  8987. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  8988. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  8989. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  8990. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  8991. Assert.Null(semanticInfo.Symbol);
  8992. Assert.Equal(CandidateReason.NotAVariable, semanticInfo.CandidateReason);
  8993. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  8994. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  8995. Assert.Equal("System.Object MyClass.this[System.Int32 index] { get; set; }", sortedCandidates[0].ToTestDisplayString());
  8996. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  8997. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  8998. Assert.False(semanticInfo.IsCompileTimeConstant);
  8999. }
  9000. [WorkItem(542065, "DevDiv")]
  9001. [Fact]
  9002. public void GenericTypeWithNoTypeArgsOnAttribute()
  9003. {
  9004. string sourceCode = @"
  9005. class Gen<T> { }
  9006. [/*<bind>*/Gen/*</bind>*/]
  9007. public class Test
  9008. {
  9009. public static int Main()
  9010. {
  9011. return 1;
  9012. }
  9013. }
  9014. ";
  9015. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  9016. Assert.Equal("Gen<T>", semanticInfo.Type.ToTestDisplayString());
  9017. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  9018. Assert.Equal("Gen<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  9019. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  9020. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9021. Assert.Null(semanticInfo.Symbol);
  9022. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  9023. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  9024. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9025. Assert.Equal("Gen<T>..ctor()", sortedCandidates[0].ToTestDisplayString());
  9026. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  9027. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  9028. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9029. Assert.Equal("Gen<T>..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  9030. Assert.False(semanticInfo.IsCompileTimeConstant);
  9031. }
  9032. [WorkItem(542125, "DevDiv")]
  9033. [Fact]
  9034. public void MalformedSyntaxSemanticModel_Bug9223()
  9035. {
  9036. string sourceCode = @"
  9037. public delegate int D(int x);
  9038. public st C
  9039. {
  9040. public event D EV;
  9041. public C(D d)
  9042. {
  9043. EV = /*<bind>*/d/*</bind>*/;
  9044. }
  9045. public int OnEV(int x)
  9046. {
  9047. return x;
  9048. }
  9049. }
  9050. ";
  9051. // Don't crash or assert.
  9052. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9053. }
  9054. [WorkItem(528746, "DevDiv")]
  9055. [Fact]
  9056. public void ImplicitConversionArrayCreationExprInQuery()
  9057. {
  9058. string sourceCode = @"
  9059. using System;
  9060. using System.Collections.Generic;
  9061. using System.Linq;
  9062. class Program
  9063. {
  9064. static void Main(string[] args)
  9065. {
  9066. var q2 = from x in /*<bind>*/new int[] { 4, 5 }/*</bind>*/
  9067. select x;
  9068. }
  9069. }
  9070. ";
  9071. var semanticInfo = GetSemanticInfoForTest<ArrayCreationExpressionSyntax>(sourceCode);
  9072. Assert.Equal("System.Int32[]", semanticInfo.Type.ToTestDisplayString());
  9073. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9074. Assert.Equal("System.Int32[]", semanticInfo.ConvertedType.ToTestDisplayString());
  9075. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9076. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9077. Assert.Null(semanticInfo.Symbol);
  9078. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9079. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9080. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9081. Assert.False(semanticInfo.IsCompileTimeConstant);
  9082. }
  9083. [WorkItem(542256, "DevDiv")]
  9084. [Fact]
  9085. public void MalformedConditionalExprInWhereClause()
  9086. {
  9087. string sourceCode = @"
  9088. using System;
  9089. using System.Collections.Generic;
  9090. using System.Linq;
  9091. class Program
  9092. {
  9093. static void Main(string[] args)
  9094. {
  9095. var q1 = from x in new int[] { 4, 5 }
  9096. where /*<bind>*/new Program()/*</bind>*/ ?
  9097. select x;
  9098. }
  9099. }
  9100. ";
  9101. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  9102. Assert.NotNull(semanticInfo.Symbol);
  9103. Assert.Equal("Program..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  9104. Assert.Equal("Program", semanticInfo.Type.Name);
  9105. }
  9106. [WorkItem(542230, "DevDiv")]
  9107. [Fact]
  9108. public void MalformedExpressionInSelectClause()
  9109. {
  9110. string sourceCode = @"
  9111. using System.Linq;
  9112. class P
  9113. {
  9114. static void Main()
  9115. {
  9116. var src = new int[] { 4, 5 };
  9117. var q = from x in src
  9118. select /*<bind>*/x/*</bind>*/.";
  9119. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9120. Assert.NotNull(semanticInfo.Symbol);
  9121. }
  9122. [WorkItem(542344, "DevDiv")]
  9123. [Fact]
  9124. public void LiteralExprInGotoCaseInsideSwitch()
  9125. {
  9126. string sourceCode = @"
  9127. public class Test
  9128. {
  9129. public static void Main()
  9130. {
  9131. int ret = 6;
  9132. switch (ret)
  9133. {
  9134. case 0:
  9135. goto case /*<bind>*/2/*</bind>*/;
  9136. case 2:
  9137. break;
  9138. }
  9139. }
  9140. }
  9141. ";
  9142. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  9143. Assert.True(semanticInfo.IsCompileTimeConstant);
  9144. Assert.Equal(SpecialType.System_Int32, semanticInfo.Type.SpecialType);
  9145. Assert.Equal(2, semanticInfo.ConstantValue);
  9146. }
  9147. [WorkItem(542405, "DevDiv")]
  9148. [Fact]
  9149. public void ImplicitConvCaseConstantExpr()
  9150. {
  9151. string sourceCode = @"
  9152. class Program
  9153. {
  9154. static void Main()
  9155. {
  9156. long number = 45;
  9157. switch (number)
  9158. {
  9159. case /*<bind>*/21/*</bind>*/:
  9160. break;
  9161. }
  9162. }
  9163. }
  9164. ";
  9165. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  9166. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9167. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9168. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  9169. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9170. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  9171. Assert.True(semanticInfo.IsCompileTimeConstant);
  9172. Assert.Equal(21, semanticInfo.ConstantValue);
  9173. }
  9174. [WorkItem(542405, "DevDiv")]
  9175. [Fact]
  9176. public void ErrorConvCaseConstantExpr()
  9177. {
  9178. string sourceCode = @"
  9179. class Program
  9180. {
  9181. static void Main()
  9182. {
  9183. double number = 45;
  9184. switch (number)
  9185. {
  9186. case /*<bind>*/21/*</bind>*/:
  9187. break;
  9188. }
  9189. }
  9190. }
  9191. ";
  9192. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  9193. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9194. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9195. Assert.Equal("Double", semanticInfo.ConvertedType.ToTestDisplayString());
  9196. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  9197. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  9198. Assert.True(semanticInfo.IsCompileTimeConstant);
  9199. Assert.Equal(21, semanticInfo.ConstantValue);
  9200. }
  9201. [WorkItem(542405, "DevDiv")]
  9202. [Fact]
  9203. public void ImplicitConvGotoCaseConstantExpr()
  9204. {
  9205. string sourceCode = @"
  9206. class Program
  9207. {
  9208. static void Main()
  9209. {
  9210. long number = 45;
  9211. switch (number)
  9212. {
  9213. case 1:
  9214. goto case /*<bind>*/21/*</bind>*/;
  9215. case 21:
  9216. break;
  9217. }
  9218. }
  9219. }
  9220. ";
  9221. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  9222. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9223. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9224. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  9225. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9226. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  9227. Assert.True(semanticInfo.IsCompileTimeConstant);
  9228. Assert.Equal(21, semanticInfo.ConstantValue);
  9229. }
  9230. [WorkItem(542405, "DevDiv")]
  9231. [Fact]
  9232. public void ErrorConvGotoCaseConstantExpr()
  9233. {
  9234. string sourceCode = @"
  9235. class Program
  9236. {
  9237. static void Main()
  9238. {
  9239. double number = 45;
  9240. switch (number)
  9241. {
  9242. case 1:
  9243. goto case /*<bind>*/21/*</bind>*/;
  9244. case 21:
  9245. break;
  9246. }
  9247. }
  9248. }
  9249. ";
  9250. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  9251. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9252. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9253. Assert.Equal("Double", semanticInfo.ConvertedType.ToTestDisplayString());
  9254. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  9255. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  9256. Assert.True(semanticInfo.IsCompileTimeConstant);
  9257. Assert.Equal(21, semanticInfo.ConstantValue);
  9258. }
  9259. [WorkItem(542351, "DevDiv")]
  9260. [Fact]
  9261. public void AttributeSemanticInfo_OverloadResolutionFailure_01()
  9262. {
  9263. string sourceCode = @"
  9264. [module: /*<bind>*/System.Obsolete(typeof(.<>))/*</bind>*/]
  9265. ";
  9266. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  9267. Verify_AttributeSemanticInfo_OverloadResolutionFailure_Common(semanticInfo);
  9268. }
  9269. [WorkItem(542351, "DevDiv")]
  9270. [Fact]
  9271. public void AttributeSemanticInfo_OverloadResolutionFailure_02()
  9272. {
  9273. string sourceCode = @"
  9274. [module: System./*<bind>*/Obsolete/*</bind>*/(typeof(.<>))]
  9275. ";
  9276. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9277. Verify_AttributeSemanticInfo_OverloadResolutionFailure_Common(semanticInfo);
  9278. }
  9279. private void Verify_AttributeSemanticInfo_OverloadResolutionFailure_Common(CompilationUtils.SemanticInfoSummary semanticInfo)
  9280. {
  9281. Assert.Equal("System.ObsoleteAttribute", semanticInfo.Type.ToTestDisplayString());
  9282. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  9283. Assert.Equal("System.ObsoleteAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  9284. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  9285. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9286. Assert.Null(semanticInfo.Symbol);
  9287. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  9288. Assert.Equal(3, semanticInfo.CandidateSymbols.Length);
  9289. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9290. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedCandidates[0].ToTestDisplayString());
  9291. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  9292. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedCandidates[1].ToTestDisplayString());
  9293. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  9294. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedCandidates[2].ToTestDisplayString());
  9295. Assert.Equal(SymbolKind.Method, sortedCandidates[2].Kind);
  9296. Assert.Equal(3, semanticInfo.MethodGroup.Length);
  9297. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9298. Assert.Equal("System.ObsoleteAttribute..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  9299. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message)", sortedMethodGroup[1].ToTestDisplayString());
  9300. Assert.Equal("System.ObsoleteAttribute..ctor(System.String message, System.Boolean error)", sortedMethodGroup[2].ToTestDisplayString());
  9301. Assert.False(semanticInfo.IsCompileTimeConstant);
  9302. }
  9303. [WorkItem(542351, "DevDiv")]
  9304. [Fact]
  9305. public void ObjectCreationSemanticInfo_OverloadResolutionFailure()
  9306. {
  9307. string sourceCode = @"
  9308. using System;
  9309. class Foo
  9310. {
  9311. public Foo() { }
  9312. public Foo(int x) { }
  9313. public static void Main()
  9314. {
  9315. var x = new /*<bind>*/Foo/*</bind>*/(typeof(.<>));
  9316. }
  9317. }
  9318. ";
  9319. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9320. Assert.Null(semanticInfo.Type);
  9321. Assert.Null(semanticInfo.ConvertedType);
  9322. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9323. Assert.Equal("Foo", semanticInfo.Symbol.ToTestDisplayString());
  9324. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9325. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9326. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9327. Assert.False(semanticInfo.IsCompileTimeConstant);
  9328. }
  9329. [Fact]
  9330. public void ObjectCreationSemanticInfo_OverloadResolutionFailure_2()
  9331. {
  9332. string sourceCode = @"
  9333. using System;
  9334. class Foo
  9335. {
  9336. public Foo() { }
  9337. public Foo(int x) { }
  9338. public static void Main()
  9339. {
  9340. var x = /*<bind>*/new Foo(typeof(Foo))/*</bind>*/;
  9341. }
  9342. }
  9343. ";
  9344. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  9345. Assert.Equal("Foo", semanticInfo.Type.ToTestDisplayString());
  9346. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  9347. Assert.Equal("Foo", semanticInfo.ConvertedType.ToTestDisplayString());
  9348. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  9349. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9350. Assert.Null(semanticInfo.Symbol);
  9351. Assert.Equal(CandidateReason.OverloadResolutionFailure, semanticInfo.CandidateReason);
  9352. Assert.Equal(2, semanticInfo.CandidateSymbols.Length);
  9353. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9354. Assert.Equal("Foo..ctor()", sortedCandidates[0].ToTestDisplayString());
  9355. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  9356. Assert.Equal("Foo..ctor(System.Int32 x)", sortedCandidates[1].ToTestDisplayString());
  9357. Assert.Equal(SymbolKind.Method, sortedCandidates[1].Kind);
  9358. Assert.Equal(2, semanticInfo.MethodGroup.Length);
  9359. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9360. Assert.Equal("Foo..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  9361. Assert.Equal("Foo..ctor(System.Int32 x)", sortedMethodGroup[1].ToTestDisplayString());
  9362. Assert.False(semanticInfo.IsCompileTimeConstant);
  9363. }
  9364. [Fact]
  9365. public void ParameterDefaultValue1()
  9366. {
  9367. string sourceCode = @"
  9368. using System;
  9369. class Constants
  9370. {
  9371. public const short k = 9;
  9372. }
  9373. public class Class1
  9374. {
  9375. const int i = 12;
  9376. const int j = 14;
  9377. void f(long i = 32 + Constants./*<bind>*/k/*</bind>*/, long j = i)
  9378. { }
  9379. }
  9380. ";
  9381. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9382. Assert.Equal("System.Int16", semanticInfo.Type.ToTestDisplayString());
  9383. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9384. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  9385. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9386. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  9387. Assert.Equal("System.Int16 Constants.k", semanticInfo.Symbol.ToTestDisplayString());
  9388. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  9389. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9390. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9391. Assert.True(semanticInfo.IsCompileTimeConstant);
  9392. Assert.Equal((short)9, semanticInfo.ConstantValue);
  9393. }
  9394. [Fact]
  9395. public void ParameterDefaultValue2()
  9396. {
  9397. string sourceCode = @"
  9398. using System;
  9399. class Constants
  9400. {
  9401. public const short k = 9;
  9402. }
  9403. public class Class1
  9404. {
  9405. const int i = 12;
  9406. const int j = 14;
  9407. void f(long i = 32 + Constants.k, long j = /*<bind>*/i/*</bind>*/)
  9408. { }
  9409. }
  9410. ";
  9411. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9412. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9413. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9414. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  9415. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9416. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  9417. Assert.Equal("System.Int32 Class1.i", semanticInfo.Symbol.ToTestDisplayString());
  9418. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  9419. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9420. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9421. Assert.True(semanticInfo.IsCompileTimeConstant);
  9422. Assert.Equal(12, semanticInfo.ConstantValue);
  9423. }
  9424. [Fact]
  9425. public void ParameterDefaultValueInConstructor()
  9426. {
  9427. string sourceCode = @"
  9428. using System;
  9429. class Constants
  9430. {
  9431. public const short k = 9;
  9432. }
  9433. public class Class1
  9434. {
  9435. const int i = 12;
  9436. const int j = 14;
  9437. Class1(long i = 32 + Constants.k, long j = /*<bind>*/i/*</bind>*/)
  9438. { }
  9439. }
  9440. ";
  9441. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9442. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9443. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9444. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  9445. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9446. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  9447. Assert.Equal("System.Int32 Class1.i", semanticInfo.Symbol.ToTestDisplayString());
  9448. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  9449. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9450. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9451. Assert.True(semanticInfo.IsCompileTimeConstant);
  9452. Assert.Equal(12, semanticInfo.ConstantValue);
  9453. }
  9454. [Fact]
  9455. public void ParameterDefaultValueInIndexer()
  9456. {
  9457. string sourceCode = @"
  9458. using System;
  9459. class Constants
  9460. {
  9461. public const short k = 9;
  9462. }
  9463. public class Class1
  9464. {
  9465. const int i = 12;
  9466. const int j = 14;
  9467. public string this[long i = 32 + Constants.k, long j = /*<bind>*/i/*</bind>*/]
  9468. {
  9469. get { return """"; }
  9470. set { }
  9471. }
  9472. }
  9473. ";
  9474. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9475. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9476. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9477. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  9478. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9479. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  9480. Assert.Equal("System.Int32 Class1.i", semanticInfo.Symbol.ToTestDisplayString());
  9481. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  9482. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9483. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9484. Assert.True(semanticInfo.IsCompileTimeConstant);
  9485. Assert.Equal(12, semanticInfo.ConstantValue);
  9486. }
  9487. [WorkItem(542589, "DevDiv")]
  9488. [Fact]
  9489. public void UnrecognizedGenericTypeReference()
  9490. {
  9491. string sourceCode = "/*<bind>*/C<object, string/*</bind>*/";
  9492. var semanticInfo = GetSemanticInfoForTest<ExpressionSyntax>(sourceCode);
  9493. var type = (NamedTypeSymbol)semanticInfo.Type;
  9494. Assert.Equal("C<System.Object, System.String>", type.ToTestDisplayString());
  9495. Assert.Equal(2, type.TypeParameters.Length);
  9496. var typeParameter = type.TypeParameters[0];
  9497. Assert.Equal(0, typeParameter.Ordinal);
  9498. Assert.Equal(string.Empty, typeParameter.Name);
  9499. typeParameter = type.TypeParameters[1];
  9500. Assert.Equal(1, typeParameter.Ordinal);
  9501. Assert.Equal(string.Empty, typeParameter.Name);
  9502. }
  9503. [WorkItem(542452, "DevDiv")]
  9504. [Fact]
  9505. public void LambdaInSelectExpressionWithObjectCreation()
  9506. {
  9507. string sourceCode = @"
  9508. using System;
  9509. using System.Linq;
  9510. using System.Collections.Generic;
  9511. class Test
  9512. {
  9513. static void Main() { }
  9514. static void Foo(List<int> Scores)
  9515. {
  9516. var z = from y in Scores select new Action(() => { /*<bind>*/var/*</bind>*/ x = y; });
  9517. }
  9518. }
  9519. ";
  9520. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9521. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9522. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9523. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  9524. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9525. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9526. Assert.Equal("System.Int32", semanticInfo.Symbol.ToTestDisplayString());
  9527. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  9528. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9529. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9530. Assert.False(semanticInfo.IsCompileTimeConstant);
  9531. }
  9532. [Fact]
  9533. public void DefaultOptionalParamValue()
  9534. {
  9535. string sourceCode = @"
  9536. using System;
  9537. using System.Collections.Generic;
  9538. using System.Linq;
  9539. class Program
  9540. {
  9541. const bool v = true;
  9542. public void Foo(bool b = /*<bind>*/v == true/*</bind>*/)
  9543. {
  9544. }
  9545. }
  9546. ";
  9547. var semanticInfo = GetSemanticInfoForTest<BinaryExpressionSyntax>(sourceCode);
  9548. Assert.Equal("System.Boolean", semanticInfo.Type.ToTestDisplayString());
  9549. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9550. Assert.Equal("System.Boolean", semanticInfo.ConvertedType.ToTestDisplayString());
  9551. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9552. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9553. Assert.Equal("System.Boolean System.Boolean.op_Equality(System.Boolean left, System.Boolean right)", semanticInfo.Symbol.ToTestDisplayString());
  9554. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9555. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9556. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9557. Assert.True(semanticInfo.IsCompileTimeConstant);
  9558. Assert.Equal(true, semanticInfo.ConstantValue);
  9559. }
  9560. [Fact]
  9561. public void DefaultOptionalParamValueWithGenericTypes()
  9562. {
  9563. string sourceCode = @"
  9564. using System;
  9565. using System.Collections.Generic;
  9566. using System.Linq;
  9567. class Program
  9568. {
  9569. public void Foo<T, U>(T t = /*<bind>*/default(U)/*</bind>*/) where U : class, T
  9570. {
  9571. }
  9572. static void Main(string[] args)
  9573. {
  9574. }
  9575. }
  9576. ";
  9577. var semanticInfo = GetSemanticInfoForTest<DefaultExpressionSyntax>(sourceCode);
  9578. Assert.Equal("U", semanticInfo.Type.ToTestDisplayString());
  9579. Assert.Equal(TypeKind.TypeParameter, semanticInfo.Type.TypeKind);
  9580. Assert.Equal("T", semanticInfo.ConvertedType.ToTestDisplayString());
  9581. Assert.Equal(TypeKind.TypeParameter, semanticInfo.ConvertedType.TypeKind);
  9582. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  9583. Assert.Null(semanticInfo.Symbol);
  9584. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9585. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9586. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9587. Assert.True(semanticInfo.IsCompileTimeConstant);
  9588. Assert.Equal(null, semanticInfo.ConstantValue.Value);
  9589. }
  9590. [WorkItem(542850, "DevDiv")]
  9591. [Fact]
  9592. public void InaccessibleExtensionMethod()
  9593. {
  9594. string sourceCode = @"
  9595. using System;
  9596. using System.Collections.Generic;
  9597. using System.Linq;
  9598. public static class Extensions
  9599. {
  9600. private static int Foo(this string z) { return 3; }
  9601. }
  9602. class Program
  9603. {
  9604. static void Main(string[] args)
  9605. {
  9606. Console.WriteLine(args[0]./*<bind>*/Foo/*</bind>*/());
  9607. }
  9608. }
  9609. ";
  9610. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9611. Assert.Null(semanticInfo.Type);
  9612. Assert.Null(semanticInfo.ConvertedType);
  9613. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9614. Assert.Null(semanticInfo.Symbol);
  9615. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  9616. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  9617. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9618. Assert.Equal("System.Int32 System.String.Foo()", sortedCandidates[0].ToTestDisplayString());
  9619. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  9620. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  9621. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9622. Assert.Equal("System.Int32 System.String.Foo()", sortedMethodGroup[0].ToTestDisplayString());
  9623. Assert.False(semanticInfo.IsCompileTimeConstant);
  9624. }
  9625. [WorkItem(542883, "DevDiv")]
  9626. [Fact]
  9627. public void InaccessibleNamedAttrArg()
  9628. {
  9629. string sourceCode = @"
  9630. using System;
  9631. public class B : Attribute
  9632. {
  9633. private int X;
  9634. }
  9635. [B(/*<bind>*/X/*</bind>*/ = 5)]
  9636. public class D { }
  9637. ";
  9638. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9639. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9640. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9641. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  9642. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9643. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9644. Assert.Null(semanticInfo.Symbol);
  9645. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  9646. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  9647. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9648. Assert.Equal("System.Int32 B.X", sortedCandidates[0].ToTestDisplayString());
  9649. Assert.Equal(SymbolKind.Field, sortedCandidates[0].Kind);
  9650. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9651. Assert.False(semanticInfo.IsCompileTimeConstant);
  9652. }
  9653. [WorkItem(528914, "DevDiv")]
  9654. [Fact]
  9655. public void InvalidIdentifierAsAttrArg()
  9656. {
  9657. string sourceCode = @"
  9658. using System.Runtime.CompilerServices;
  9659. public interface Interface1
  9660. {
  9661. [/*<bind>*/IndexerName(null)/*</bind>*/]
  9662. string this[int arg]
  9663. {
  9664. get;
  9665. set;
  9666. }
  9667. }
  9668. ";
  9669. var semanticInfo = GetSemanticInfoForTest<AttributeSyntax>(sourceCode);
  9670. Assert.Equal("System.Runtime.CompilerServices.IndexerNameAttribute", semanticInfo.Type.ToTestDisplayString());
  9671. Assert.Equal("System.Runtime.CompilerServices.IndexerNameAttribute", semanticInfo.ConvertedType.ToTestDisplayString());
  9672. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9673. Assert.Equal("System.Runtime.CompilerServices.IndexerNameAttribute..ctor(System.String indexerName)", semanticInfo.Symbol.ToTestDisplayString());
  9674. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9675. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9676. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  9677. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  9678. Assert.Equal("System.Runtime.CompilerServices.IndexerNameAttribute..ctor(System.String indexerName)", sortedMethodGroup[0].ToTestDisplayString());
  9679. Assert.False(semanticInfo.IsCompileTimeConstant);
  9680. }
  9681. [WorkItem(542890, "DevDiv")]
  9682. [Fact()]
  9683. public void GlobalIdentifierName()
  9684. {
  9685. string sourceCode = @"
  9686. class Test
  9687. {
  9688. static void Main()
  9689. {
  9690. var t1 = new /*<bind>*/global/*</bind>*/::Test();
  9691. }
  9692. }
  9693. ";
  9694. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9695. var aliasInfo = GetAliasInfoForTest(sourceCode);
  9696. Assert.Null(semanticInfo.Type);
  9697. Assert.Null(semanticInfo.ConvertedType);
  9698. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9699. Assert.Equal("<global namespace>", semanticInfo.Symbol.ToTestDisplayString());
  9700. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  9701. Assert.True(((NamespaceSymbol)semanticInfo.Symbol).IsGlobalNamespace);
  9702. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9703. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9704. Assert.Equal("global", aliasInfo.Name);
  9705. Assert.Equal("<global namespace>", aliasInfo.Target.ToTestDisplayString());
  9706. Assert.True(((NamespaceSymbol)(aliasInfo.Target)).IsGlobalNamespace);
  9707. Assert.Equal(false, aliasInfo.IsExtern);
  9708. Assert.False(semanticInfo.IsCompileTimeConstant);
  9709. }
  9710. [Fact()]
  9711. public void GlobalIdentifierName2()
  9712. {
  9713. string sourceCode = @"
  9714. class Test
  9715. {
  9716. /*<bind>*/global/*</bind>*/::Test f;
  9717. static void Main()
  9718. {
  9719. }
  9720. }
  9721. ";
  9722. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9723. var aliasInfo = GetAliasInfoForTest(sourceCode);
  9724. Assert.Null(semanticInfo.Type);
  9725. Assert.Null(semanticInfo.ConvertedType);
  9726. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9727. Assert.Equal("<global namespace>", semanticInfo.Symbol.ToTestDisplayString());
  9728. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  9729. Assert.True(((NamespaceSymbol)semanticInfo.Symbol).IsGlobalNamespace);
  9730. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9731. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9732. Assert.Equal("global", aliasInfo.Name);
  9733. Assert.Equal("<global namespace>", aliasInfo.Target.ToTestDisplayString());
  9734. Assert.True(((NamespaceSymbol)(aliasInfo.Target)).IsGlobalNamespace);
  9735. Assert.Equal(false, aliasInfo.IsExtern);
  9736. Assert.False(semanticInfo.IsCompileTimeConstant);
  9737. }
  9738. [WorkItem(542536, "DevDiv")]
  9739. [Fact]
  9740. public void UndeclaredSymbolInDefaultParameterValue()
  9741. {
  9742. string sourceCode = @"
  9743. class Program
  9744. {
  9745. const int y = 1;
  9746. public void Foo(bool x = (undeclared == /*<bind>*/y/*</bind>*/)) { }
  9747. static void Main(string[] args)
  9748. {
  9749. }
  9750. }
  9751. ";
  9752. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9753. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  9754. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  9755. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  9756. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  9757. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9758. Assert.Equal("System.Int32 Program.y", semanticInfo.Symbol.ToTestDisplayString());
  9759. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  9760. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9761. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9762. Assert.True(semanticInfo.IsCompileTimeConstant);
  9763. Assert.Equal(1, semanticInfo.ConstantValue);
  9764. }
  9765. [WorkItem(543198, "DevDiv")]
  9766. [Fact]
  9767. public void NamespaceAliasInsideMethod()
  9768. {
  9769. string sourceCode = @"
  9770. using System;
  9771. using System.Collections.Generic;
  9772. using System.Linq;
  9773. using A = NS1;
  9774. namespace NS1
  9775. {
  9776. class B { }
  9777. }
  9778. class Program
  9779. {
  9780. class A
  9781. {
  9782. }
  9783. A::B y = null;
  9784. void Main()
  9785. {
  9786. /*<bind>*/A/*</bind>*/::B.Equals(null, null);
  9787. }
  9788. }
  9789. ";
  9790. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9791. // Should bind to namespace alias A=NS1, not class Program.A.
  9792. Assert.Equal("NS1", semanticInfo.Symbol.ToTestDisplayString());
  9793. Assert.Equal(SymbolKind.Namespace, semanticInfo.Symbol.Kind);
  9794. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9795. Assert.Null(semanticInfo.Type);
  9796. Assert.Null(semanticInfo.ConvertedType);
  9797. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9798. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9799. Assert.False(semanticInfo.IsCompileTimeConstant);
  9800. }
  9801. [Fact]
  9802. public void ImplicitArrayCreationExpression_ImplicitArrayCreationSyntax()
  9803. {
  9804. string sourceCode = @"
  9805. using System;
  9806. namespace Test
  9807. {
  9808. public class Program
  9809. {
  9810. public static int Main()
  9811. {
  9812. var a = /*<bind>*/new[] { 1, 2, 3 }/*</bind>*/;
  9813. return a[0];
  9814. }
  9815. }
  9816. }
  9817. ";
  9818. var semanticInfo = GetSemanticInfoForTest<ImplicitArrayCreationExpressionSyntax>(sourceCode);
  9819. Assert.Equal("System.Int32[]", semanticInfo.Type.ToTestDisplayString());
  9820. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9821. Assert.Equal("System.Int32[]", semanticInfo.ConvertedType.ToTestDisplayString());
  9822. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9823. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9824. Assert.Null(semanticInfo.Symbol);
  9825. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9826. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9827. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9828. Assert.False(semanticInfo.IsCompileTimeConstant);
  9829. }
  9830. [Fact]
  9831. public void ImplicitArrayCreationExpression_IdentifierNameSyntax()
  9832. {
  9833. string sourceCode = @"
  9834. using System;
  9835. namespace Test
  9836. {
  9837. public class Program
  9838. {
  9839. public static int Main()
  9840. {
  9841. var a = new[] { 1, 2, 3 };
  9842. return /*<bind>*/a/*</bind>*/[0];
  9843. }
  9844. }
  9845. }
  9846. ";
  9847. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9848. Assert.Equal("System.Int32[]", semanticInfo.Type.ToTestDisplayString());
  9849. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9850. Assert.Equal("System.Int32[]", semanticInfo.ConvertedType.ToTestDisplayString());
  9851. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9852. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9853. Assert.Equal("System.Int32[] a", semanticInfo.Symbol.ToTestDisplayString());
  9854. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  9855. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9856. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9857. Assert.False(semanticInfo.IsCompileTimeConstant);
  9858. }
  9859. [Fact]
  9860. public void ImplicitArrayCreationExpression_MultiDim_ImplicitArrayCreationSyntax()
  9861. {
  9862. string sourceCode = @"
  9863. using System;
  9864. namespace Test
  9865. {
  9866. public class Program
  9867. {
  9868. public int[][, , ] Foo()
  9869. {
  9870. var a3 = new[] { /*<bind>*/new [,,] {{{1, 2}}}/*</bind>*/, new [,,] {{{3, 4}}} };
  9871. return a3;
  9872. }
  9873. }
  9874. }
  9875. ";
  9876. var semanticInfo = GetSemanticInfoForTest<ImplicitArrayCreationExpressionSyntax>(sourceCode);
  9877. Assert.Equal("System.Int32[,,]", semanticInfo.Type.ToTestDisplayString());
  9878. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9879. Assert.Equal("System.Int32[,,]", semanticInfo.ConvertedType.ToTestDisplayString());
  9880. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9881. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9882. Assert.Null(semanticInfo.Symbol);
  9883. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9884. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9885. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9886. Assert.False(semanticInfo.IsCompileTimeConstant);
  9887. }
  9888. [Fact]
  9889. public void ImplicitArrayCreationExpression_MultiDim_IdentifierNameSyntax()
  9890. {
  9891. string sourceCode = @"
  9892. using System;
  9893. namespace Test
  9894. {
  9895. public class Program
  9896. {
  9897. public int[][, , ] Foo()
  9898. {
  9899. var a3 = new[] { new [,,] {{{3, 4}}}, new [,,] {{{3, 4}}} };
  9900. return /*<bind>*/a3/*</bind>*/;
  9901. }
  9902. }
  9903. }
  9904. ";
  9905. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9906. Assert.Equal("System.Int32[][,,]", semanticInfo.Type.ToTestDisplayString());
  9907. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9908. Assert.Equal("System.Int32[][,,]", semanticInfo.ConvertedType.ToTestDisplayString());
  9909. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9910. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9911. Assert.Equal("System.Int32[][,,] a3", semanticInfo.Symbol.ToTestDisplayString());
  9912. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  9913. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9914. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9915. Assert.False(semanticInfo.IsCompileTimeConstant);
  9916. }
  9917. [Fact]
  9918. public void ImplicitArrayCreationExpression_Error_ImplicitArrayCreationSyntax()
  9919. {
  9920. string sourceCode = @"
  9921. public class C
  9922. {
  9923. public int[] Foo()
  9924. {
  9925. char c = 'c';
  9926. short s1 = 0;
  9927. short s2 = -0;
  9928. short s3 = 1;
  9929. short s4 = -1;
  9930. var array1 = /*<bind>*/new[] { s1, s2, s3, s4, c, '1' }/*</bind>*/; // CS0826
  9931. return array1;
  9932. }
  9933. }
  9934. ";
  9935. var semanticInfo = GetSemanticInfoForTest<ImplicitArrayCreationExpressionSyntax>(sourceCode);
  9936. Assert.Equal("?[]", semanticInfo.Type.ToTestDisplayString());
  9937. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9938. Assert.Equal("?[]", semanticInfo.ConvertedType.ToTestDisplayString());
  9939. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9940. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  9941. Assert.Null(semanticInfo.Symbol);
  9942. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  9943. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9944. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9945. Assert.False(semanticInfo.IsCompileTimeConstant);
  9946. }
  9947. [Fact]
  9948. public void ImplicitArrayCreationExpression_Error_IdentifierNameSyntax()
  9949. {
  9950. string sourceCode = @"
  9951. public class C
  9952. {
  9953. public int[] Foo()
  9954. {
  9955. char c = 'c';
  9956. short s1 = 0;
  9957. short s2 = -0;
  9958. short s3 = 1;
  9959. short s4 = -1;
  9960. var array1 = new[] { s1, s2, s3, s4, c, '1' }; // CS0826
  9961. return /*<bind>*/array1/*</bind>*/;
  9962. }
  9963. }
  9964. ";
  9965. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  9966. Assert.Equal("?[]", semanticInfo.Type.ToTestDisplayString());
  9967. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9968. Assert.Equal("System.Int32[]", semanticInfo.ConvertedType.ToTestDisplayString());
  9969. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  9970. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  9971. Assert.Equal("?[] array1", semanticInfo.Symbol.ToTestDisplayString());
  9972. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  9973. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  9974. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  9975. Assert.False(semanticInfo.IsCompileTimeConstant);
  9976. }
  9977. [Fact]
  9978. public void ImplicitArrayCreationExpression_Error_NonArrayInitExpr()
  9979. {
  9980. string sourceCode = @"
  9981. using System;
  9982. namespace Test
  9983. {
  9984. public class Program
  9985. {
  9986. public int[][,,] Foo()
  9987. {
  9988. var a3 = new[] { /*<bind>*/new[,,] { { { 3, 4 } }, 3, 4 }/*</bind>*/, new[,,] { { { 3, 4 } } } };
  9989. return a3;
  9990. }
  9991. }
  9992. }
  9993. ";
  9994. var semanticInfo = GetSemanticInfoForTest<ImplicitArrayCreationExpressionSyntax>(sourceCode);
  9995. Assert.Equal("?[,,]", semanticInfo.Type.ToTestDisplayString());
  9996. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  9997. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  9998. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  9999. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  10000. Assert.Null(semanticInfo.Symbol);
  10001. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10002. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10003. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10004. Assert.False(semanticInfo.IsCompileTimeConstant);
  10005. }
  10006. [Fact]
  10007. public void ImplicitArrayCreationExpression_Error_NonArrayInitExpr_02()
  10008. {
  10009. string sourceCode = @"
  10010. using System;
  10011. namespace Test
  10012. {
  10013. public class Program
  10014. {
  10015. public int[][,,] Foo()
  10016. {
  10017. var a3 = new[] { /*<bind>*/new[,,] { { { 3, 4 } }, x, y }/*</bind>*/, new[,,] { { { 3, 4 } } } };
  10018. return a3;
  10019. }
  10020. }
  10021. }
  10022. ";
  10023. var semanticInfo = GetSemanticInfoForTest<ImplicitArrayCreationExpressionSyntax>(sourceCode);
  10024. Assert.Equal("?[,,]", semanticInfo.Type.ToTestDisplayString());
  10025. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  10026. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  10027. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  10028. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  10029. Assert.Null(semanticInfo.Symbol);
  10030. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10031. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10032. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10033. Assert.False(semanticInfo.IsCompileTimeConstant);
  10034. }
  10035. [Fact]
  10036. public void ImplicitArrayCreationExpression_Inside_ErrorImplicitArrayCreation()
  10037. {
  10038. string sourceCode = @"
  10039. public class C
  10040. {
  10041. public int[] Foo()
  10042. {
  10043. char c = 'c';
  10044. short s1 = 0;
  10045. short s2 = -0;
  10046. short s3 = 1;
  10047. short s4 = -1;
  10048. var array1 = new[] { /*<bind>*/new[] { 1, 2 }/*</bind>*/, new[] { s1, s2, s3, s4, c, '1' } }; // CS0826
  10049. return array1;
  10050. }
  10051. }
  10052. ";
  10053. var semanticInfo = GetSemanticInfoForTest<ImplicitArrayCreationExpressionSyntax>(sourceCode);
  10054. Assert.Equal("System.Int32[]", semanticInfo.Type.ToTestDisplayString());
  10055. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  10056. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  10057. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  10058. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  10059. Assert.Null(semanticInfo.Symbol);
  10060. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10061. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10062. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10063. Assert.False(semanticInfo.IsCompileTimeConstant);
  10064. }
  10065. [Fact, WorkItem(543201, "DevDiv")]
  10066. public void BindVariableIncompleteForLoop()
  10067. {
  10068. string sourceCode = @"
  10069. class Program
  10070. {
  10071. static void Main()
  10072. {
  10073. for (int i = 0; /*<bind>*/i/*</bind>*/
  10074. }
  10075. }";
  10076. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10077. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10078. }
  10079. [Fact, WorkItem(542843, "DevDiv")]
  10080. public void Bug10245()
  10081. {
  10082. string sourceCode = @"
  10083. class C<T> {
  10084. public T Field;
  10085. }
  10086. class D {
  10087. void M() {
  10088. new C<int>./*<bind>*/Field/*</bind>*/.ToString();
  10089. }
  10090. }
  10091. ";
  10092. var tree = Parse(sourceCode);
  10093. var comp = CreateCompilationWithMscorlib(tree);
  10094. var model = comp.GetSemanticModel(tree);
  10095. var expr = GetExprSyntaxForBinding(GetExprSyntaxList(tree));
  10096. var symbolInfo = model.GetSymbolInfo(expr);
  10097. Assert.Equal(CandidateReason.NotATypeOrNamespace, symbolInfo.CandidateReason);
  10098. Assert.Equal(1, symbolInfo.CandidateSymbols.Length);
  10099. Assert.Equal("System.Int32 C<System.Int32>.Field", symbolInfo.CandidateSymbols[0].ToTestDisplayString());
  10100. Assert.Null(symbolInfo.Symbol);
  10101. }
  10102. [Fact]
  10103. public void StaticClassWithinNew()
  10104. {
  10105. string sourceCode = @"
  10106. using System;
  10107. class Program
  10108. {
  10109. static void Main(string[] args)
  10110. {
  10111. object o = new /*<bind>*/Stat/*</bind>*/();
  10112. }
  10113. }
  10114. static class Stat { }
  10115. ";
  10116. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10117. Assert.Null(semanticInfo.Type);
  10118. Assert.Null(semanticInfo.ConvertedType);
  10119. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10120. Assert.Null(semanticInfo.Symbol);
  10121. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  10122. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10123. Assert.Equal("Stat", semanticInfo.CandidateSymbols[0].ToTestDisplayString());
  10124. Assert.Equal(SymbolKind.NamedType, semanticInfo.CandidateSymbols[0].Kind);
  10125. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10126. Assert.False(semanticInfo.IsCompileTimeConstant);
  10127. }
  10128. [Fact]
  10129. public void StaticClassWithinNew2()
  10130. {
  10131. string sourceCode = @"
  10132. using System;
  10133. class Program
  10134. {
  10135. static void Main(string[] args)
  10136. {
  10137. object o = /*<bind>*/new Stat()/*</bind>*/;
  10138. }
  10139. }
  10140. static class Stat { }
  10141. ";
  10142. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  10143. Assert.Equal("Stat", semanticInfo.Type.ToTestDisplayString());
  10144. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  10145. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  10146. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10147. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  10148. Assert.Null(semanticInfo.Symbol);
  10149. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10150. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10151. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10152. Assert.False(semanticInfo.IsCompileTimeConstant);
  10153. }
  10154. [WorkItem(543534, "DevDiv")]
  10155. [Fact]
  10156. public void InterfaceWithNew()
  10157. {
  10158. string sourceCode = @"
  10159. using System;
  10160. class Program
  10161. {
  10162. static void Main(string[] args)
  10163. {
  10164. object o = new /*<bind>*/X/*</bind>*/();
  10165. }
  10166. }
  10167. interface X { }
  10168. ";
  10169. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10170. Assert.Null(semanticInfo.Type);
  10171. Assert.Null(semanticInfo.ConvertedType);
  10172. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10173. Assert.Null(semanticInfo.Symbol);
  10174. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  10175. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10176. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10177. Assert.Equal("X", sortedCandidates[0].ToTestDisplayString());
  10178. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  10179. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10180. Assert.False(semanticInfo.IsCompileTimeConstant);
  10181. }
  10182. [Fact]
  10183. public void InterfaceWithNew2()
  10184. {
  10185. string sourceCode = @"
  10186. using System;
  10187. class Program
  10188. {
  10189. static void Main(string[] args)
  10190. {
  10191. object o = /*<bind>*/new X()/*</bind>*/;
  10192. }
  10193. }
  10194. interface X { }
  10195. ";
  10196. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  10197. Assert.Equal("X", semanticInfo.Type.ToTestDisplayString());
  10198. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  10199. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  10200. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10201. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  10202. Assert.Null(semanticInfo.Symbol);
  10203. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10204. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10205. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10206. Assert.False(semanticInfo.IsCompileTimeConstant);
  10207. }
  10208. [Fact]
  10209. public void TypeParameterWithNew()
  10210. {
  10211. string sourceCode = @"
  10212. using System;
  10213. class Program<T>
  10214. {
  10215. static void f()
  10216. {
  10217. object o = new /*<bind>*/T/*</bind>*/();
  10218. }
  10219. }
  10220. ";
  10221. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10222. Assert.Null(semanticInfo.Type);
  10223. Assert.Null(semanticInfo.ConvertedType);
  10224. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10225. Assert.Null(semanticInfo.Symbol);
  10226. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  10227. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10228. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10229. Assert.Equal("T", sortedCandidates[0].ToTestDisplayString());
  10230. Assert.Equal(SymbolKind.TypeParameter, sortedCandidates[0].Kind);
  10231. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10232. Assert.False(semanticInfo.IsCompileTimeConstant);
  10233. }
  10234. [Fact]
  10235. public void TypeParameterWithNew2()
  10236. {
  10237. string sourceCode = @"
  10238. using System;
  10239. class Program<T>
  10240. {
  10241. static void f()
  10242. {
  10243. object o = /*<bind>*/new T()/*</bind>*/;
  10244. }
  10245. }
  10246. ";
  10247. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  10248. Assert.Equal("T", semanticInfo.Type.ToTestDisplayString());
  10249. Assert.Equal(TypeKind.TypeParameter, semanticInfo.Type.TypeKind);
  10250. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  10251. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10252. Assert.Equal(ConversionKind.Boxing, semanticInfo.ImplicitConversion.Kind);
  10253. Assert.Null(semanticInfo.Symbol);
  10254. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10255. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10256. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10257. Assert.False(semanticInfo.IsCompileTimeConstant);
  10258. }
  10259. [Fact]
  10260. public void AbstractClassWithNew()
  10261. {
  10262. string sourceCode = @"
  10263. using System;
  10264. class Program
  10265. {
  10266. static void Main(string[] args)
  10267. {
  10268. object o = new /*<bind>*/X/*</bind>*/();
  10269. }
  10270. }
  10271. abstract class X { }
  10272. ";
  10273. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10274. Assert.Null(semanticInfo.Type);
  10275. Assert.Null(semanticInfo.ConvertedType);
  10276. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10277. Assert.Null(semanticInfo.Symbol);
  10278. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  10279. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10280. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10281. Assert.Equal("X", sortedCandidates[0].ToTestDisplayString());
  10282. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  10283. Assert.Equal(0, semanticInfo.MemberGroup.Length);
  10284. }
  10285. [Fact]
  10286. public void AbstractClassWithNew2()
  10287. {
  10288. string sourceCode = @"
  10289. using System;
  10290. class Program
  10291. {
  10292. static void Main(string[] args)
  10293. {
  10294. object o = /*<bind>*/new X()/*</bind>*/;
  10295. }
  10296. }
  10297. abstract class X { }
  10298. ";
  10299. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  10300. Assert.Equal("X", semanticInfo.Type.ToTestDisplayString());
  10301. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  10302. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  10303. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10304. Assert.Equal(ConversionKind.ImplicitReference, semanticInfo.ImplicitConversion.Kind);
  10305. Assert.Null(semanticInfo.Symbol);
  10306. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10307. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10308. Assert.Equal(0, semanticInfo.MemberGroup.Length);
  10309. }
  10310. [Fact()]
  10311. public void DynamicWithNew()
  10312. {
  10313. string sourceCode = @"
  10314. using System;
  10315. class Program
  10316. {
  10317. static void Main(string[] args)
  10318. {
  10319. object o = new /*<bind>*/dynamic/*</bind>*/();
  10320. }
  10321. }
  10322. ";
  10323. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10324. Assert.Null(semanticInfo.Type);
  10325. Assert.Null(semanticInfo.ConvertedType);
  10326. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10327. Assert.Null(semanticInfo.Symbol);
  10328. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  10329. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10330. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10331. Assert.Equal("dynamic", sortedCandidates[0].ToTestDisplayString());
  10332. Assert.Equal(SymbolKind.DynamicType, sortedCandidates[0].Kind);
  10333. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10334. Assert.False(semanticInfo.IsCompileTimeConstant);
  10335. }
  10336. [Fact()]
  10337. public void DynamicWithNew2()
  10338. {
  10339. string sourceCode = @"
  10340. using System;
  10341. class Program
  10342. {
  10343. static void Main(string[] args)
  10344. {
  10345. object o = /*<bind>*/new dynamic()/*</bind>*/;
  10346. }
  10347. }
  10348. ";
  10349. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  10350. Assert.Equal("?", semanticInfo.Type.ToTestDisplayString());
  10351. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  10352. Assert.Equal("System.Object", semanticInfo.ConvertedType.ToTestDisplayString());
  10353. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10354. Assert.Equal(ConversionKind.NoConversion, semanticInfo.ImplicitConversion.Kind);
  10355. Assert.Null(semanticInfo.Symbol);
  10356. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10357. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10358. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10359. Assert.False(semanticInfo.IsCompileTimeConstant);
  10360. }
  10361. [Fact]
  10362. public void SemanticInfo_SwitchGoverningImplicitUserDefined_01()
  10363. {
  10364. // There must be exactly one user-defined conversion to a non-nullable integral type,
  10365. // and there is.
  10366. string sourceCode = @"
  10367. struct Conv
  10368. {
  10369. public static implicit operator int (Conv C)
  10370. {
  10371. return 1;
  10372. }
  10373. public static int Main()
  10374. {
  10375. Conv C = new Conv();
  10376. switch (/*<bind>*/C/*</bind>*/)
  10377. {
  10378. default:
  10379. return 1;
  10380. }
  10381. }
  10382. }
  10383. ";
  10384. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10385. Assert.Equal("Conv", semanticInfo.Type.ToTestDisplayString());
  10386. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10387. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10388. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10389. Assert.Equal(ConversionKind.ImplicitUserDefined, semanticInfo.ImplicitConversion.Kind);
  10390. Assert.Equal("Conv.implicit operator int(Conv)", semanticInfo.ImplicitConversion.Method.ToString());
  10391. Assert.Equal("Conv C", semanticInfo.Symbol.ToTestDisplayString());
  10392. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  10393. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10394. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10395. Assert.False(semanticInfo.IsCompileTimeConstant);
  10396. }
  10397. [Fact]
  10398. public void SemanticInfo_SwitchGoverningImplicitUserDefined_02()
  10399. {
  10400. // The specification requires that the user-defined conversion chosen be one
  10401. // which converts to an integral or string type, but *not* a nullable integral type,
  10402. // oddly enough. Since the only applicable user-defined conversion here would be the
  10403. // lifted conversion from Conv? to int?, the resolution of the conversion fails
  10404. // and this program produces an error.
  10405. string sourceCode = @"
  10406. struct Conv
  10407. {
  10408. public static implicit operator int (Conv C)
  10409. {
  10410. return 1;
  10411. }
  10412. public static int Main()
  10413. {
  10414. Conv? C = new Conv();
  10415. switch (/*<bind>*/C/*</bind>*/)
  10416. {
  10417. default:
  10418. return 1;
  10419. }
  10420. }
  10421. }
  10422. ";
  10423. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10424. Assert.Equal("Conv?", semanticInfo.Type.ToTestDisplayString());
  10425. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10426. Assert.Equal("Conv? C", semanticInfo.Symbol.ToTestDisplayString());
  10427. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  10428. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10429. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10430. Assert.False(semanticInfo.IsCompileTimeConstant);
  10431. }
  10432. [Fact]
  10433. public void SemanticInfo_SwitchGoverningImplicitUserDefined_Error_01()
  10434. {
  10435. string sourceCode = @"
  10436. struct Conv
  10437. {
  10438. public static implicit operator int (Conv C)
  10439. {
  10440. return 1;
  10441. }
  10442. public static implicit operator int? (Conv? C)
  10443. {
  10444. return null;
  10445. }
  10446. public static int Main()
  10447. {
  10448. Conv C = new Conv();
  10449. switch (/*<bind>*/C/*</bind>*/)
  10450. {
  10451. default:
  10452. return 0;
  10453. }
  10454. }
  10455. }
  10456. ";
  10457. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10458. Assert.Equal("Conv", semanticInfo.Type.ToTestDisplayString());
  10459. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10460. Assert.Equal("Conv", semanticInfo.ConvertedType.ToTestDisplayString());
  10461. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  10462. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10463. Assert.Equal("Conv C", semanticInfo.Symbol.ToTestDisplayString());
  10464. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  10465. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10466. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10467. Assert.False(semanticInfo.IsCompileTimeConstant);
  10468. }
  10469. [Fact]
  10470. public void SemanticInfo_SwitchGoverningImplicitUserDefined_Error_02()
  10471. {
  10472. string sourceCode = @"
  10473. struct Conv
  10474. {
  10475. public static int Main()
  10476. {
  10477. Conv C = new Conv();
  10478. switch (/*<bind>*/C/*</bind>*/)
  10479. {
  10480. default:
  10481. return 0;
  10482. }
  10483. }
  10484. }
  10485. ";
  10486. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10487. Assert.Equal("Conv", semanticInfo.Type.ToTestDisplayString());
  10488. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10489. Assert.Equal("Conv", semanticInfo.ConvertedType.ToTestDisplayString());
  10490. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  10491. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10492. Assert.Equal("Conv C", semanticInfo.Symbol.ToTestDisplayString());
  10493. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  10494. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10495. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10496. Assert.False(semanticInfo.IsCompileTimeConstant);
  10497. }
  10498. [Fact]
  10499. public void ObjectInitializer_ObjectCreationExpressionSyntax()
  10500. {
  10501. string sourceCode = @"
  10502. public class MemberInitializerTest
  10503. {
  10504. public int x;
  10505. public int y { get; set; }
  10506. public static void Main()
  10507. {
  10508. var i = /*<bind>*/new MemberInitializerTest() { x = 1, y = 2 }/*</bind>*/;
  10509. }
  10510. }
  10511. ";
  10512. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  10513. Assert.Equal("MemberInitializerTest", semanticInfo.Type.ToTestDisplayString());
  10514. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  10515. Assert.Equal("MemberInitializerTest", semanticInfo.ConvertedType.ToTestDisplayString());
  10516. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10517. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10518. Assert.Equal("MemberInitializerTest..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  10519. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  10520. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10521. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  10522. Assert.Equal("MemberInitializerTest..ctor()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  10523. Assert.False(semanticInfo.IsCompileTimeConstant);
  10524. }
  10525. [Fact]
  10526. public void ObjectInitializer_InitializerExpressionSyntax()
  10527. {
  10528. string sourceCode = @"
  10529. public class MemberInitializerTest
  10530. {
  10531. public int x;
  10532. public int y { get; set; }
  10533. public static void Main()
  10534. {
  10535. var i = new MemberInitializerTest() /*<bind>*/{ x = 1, y = 2 }/*</bind>*/;
  10536. }
  10537. }
  10538. ";
  10539. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  10540. Assert.Null(semanticInfo.Type);
  10541. Assert.Null(semanticInfo.ConvertedType);
  10542. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10543. Assert.Null(semanticInfo.Symbol);
  10544. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10545. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10546. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10547. Assert.False(semanticInfo.IsCompileTimeConstant);
  10548. }
  10549. [Fact]
  10550. public void ObjectInitializer_MemberInitializerAssignment_BinaryExpressionSyntax()
  10551. {
  10552. string sourceCode = @"
  10553. public class MemberInitializerTest
  10554. {
  10555. public int x;
  10556. public int y { get; set; }
  10557. public static void Main()
  10558. {
  10559. var i = new MemberInitializerTest() { /*<bind>*/x = 1/*</bind>*/, y = 2 };
  10560. }
  10561. }
  10562. ";
  10563. var semanticInfo = GetSemanticInfoForTest<BinaryExpressionSyntax>(sourceCode);
  10564. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10565. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10566. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10567. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10568. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10569. Assert.Null(semanticInfo.Symbol);
  10570. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10571. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10572. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10573. Assert.False(semanticInfo.IsCompileTimeConstant);
  10574. }
  10575. [Fact]
  10576. public void ObjectInitializer_FieldAccess_IdentifierNameSyntax()
  10577. {
  10578. string sourceCode = @"
  10579. public class MemberInitializerTest
  10580. {
  10581. public int x;
  10582. public int y { get; set; }
  10583. public static void Main()
  10584. {
  10585. var i = new MemberInitializerTest() { /*<bind>*/x/*</bind>*/ = 1, y = 2 };
  10586. }
  10587. }
  10588. ";
  10589. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10590. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10591. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10592. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10593. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10594. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10595. Assert.Equal("System.Int32 MemberInitializerTest.x", semanticInfo.Symbol.ToTestDisplayString());
  10596. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  10597. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10598. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10599. Assert.False(semanticInfo.IsCompileTimeConstant);
  10600. }
  10601. [Fact]
  10602. public void ObjectInitializer_PropertyAccess_IdentifierNameSyntax()
  10603. {
  10604. string sourceCode = @"
  10605. public class MemberInitializerTest
  10606. {
  10607. public int x;
  10608. public int y { get; set; }
  10609. public static void Main()
  10610. {
  10611. var i = new MemberInitializerTest() { x = 1, /*<bind>*/y/*</bind>*/ = 2 };
  10612. }
  10613. }
  10614. ";
  10615. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10616. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10617. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10618. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10619. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10620. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10621. Assert.Equal("System.Int32 MemberInitializerTest.y { get; set; }", semanticInfo.Symbol.ToTestDisplayString());
  10622. Assert.Equal(SymbolKind.Property, semanticInfo.Symbol.Kind);
  10623. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10624. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10625. Assert.False(semanticInfo.IsCompileTimeConstant);
  10626. }
  10627. [Fact]
  10628. public void ObjectInitializer_TypeParameterBaseFieldAccess_IdentifierNameSyntax()
  10629. {
  10630. string sourceCode = @"
  10631. public class Base
  10632. {
  10633. public Base() { }
  10634. public int x;
  10635. public int y { get; set; }
  10636. public static void Main()
  10637. {
  10638. MemberInitializerTest<Base>.Foo();
  10639. }
  10640. }
  10641. public class MemberInitializerTest<T> where T : Base, new()
  10642. {
  10643. public static void Foo()
  10644. {
  10645. var i = new T() { /*<bind>*/x/*</bind>*/ = 1, y = 2 };
  10646. System.Console.WriteLine(i.x);
  10647. System.Console.WriteLine(i.y);
  10648. }
  10649. }
  10650. ";
  10651. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10652. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10653. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10654. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10655. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10656. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10657. Assert.Equal("System.Int32 Base.x", semanticInfo.Symbol.ToTestDisplayString());
  10658. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  10659. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10660. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10661. Assert.False(semanticInfo.IsCompileTimeConstant);
  10662. }
  10663. [Fact]
  10664. public void ObjectInitializer_NestedInitializer_InitializerExpressionSyntax()
  10665. {
  10666. string sourceCode = @"
  10667. public class MemberInitializerTest
  10668. {
  10669. public int x;
  10670. public int y { get; set; }
  10671. }
  10672. public class Test
  10673. {
  10674. public readonly MemberInitializerTest m = new MemberInitializerTest();
  10675. public static void Main()
  10676. {
  10677. var i = new Test() { m = /*<bind>*/{ x = 1, y = 2 }/*</bind>*/ };
  10678. System.Console.WriteLine(i.m.x);
  10679. System.Console.WriteLine(i.m.y);
  10680. }
  10681. }
  10682. ";
  10683. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  10684. Assert.Null(semanticInfo.Type);
  10685. Assert.Null(semanticInfo.ConvertedType);
  10686. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10687. Assert.Null(semanticInfo.Symbol);
  10688. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10689. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10690. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10691. Assert.False(semanticInfo.IsCompileTimeConstant);
  10692. }
  10693. [Fact]
  10694. public void ObjectInitializer_NestedInitializer_PropertyAccess_IdentifierNameSyntax()
  10695. {
  10696. string sourceCode = @"
  10697. public class MemberInitializerTest
  10698. {
  10699. public int x;
  10700. public int y { get; set; }
  10701. }
  10702. public class Test
  10703. {
  10704. public readonly MemberInitializerTest m = new MemberInitializerTest();
  10705. public static void Main()
  10706. {
  10707. var i = new Test() { m = { x = 1, /*<bind>*/y/*</bind>*/ = 2 } };
  10708. System.Console.WriteLine(i.m.x);
  10709. System.Console.WriteLine(i.m.y);
  10710. }
  10711. }
  10712. ";
  10713. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10714. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10715. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10716. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10717. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10718. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10719. Assert.Equal("System.Int32 MemberInitializerTest.y { get; set; }", semanticInfo.Symbol.ToTestDisplayString());
  10720. Assert.Equal(SymbolKind.Property, semanticInfo.Symbol.Kind);
  10721. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10722. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10723. Assert.False(semanticInfo.IsCompileTimeConstant);
  10724. }
  10725. [Fact]
  10726. public void ObjectInitializer_InaccessibleMember_IdentifierNameSyntax()
  10727. {
  10728. string sourceCode = @"
  10729. public class MemberInitializerTest
  10730. {
  10731. protected int x;
  10732. private int y { get; set; }
  10733. internal int z;
  10734. }
  10735. public class Test
  10736. {
  10737. public static void Main()
  10738. {
  10739. var i = new MemberInitializerTest() { x = 1, /*<bind>*/y/*</bind>*/ = 2, z = 3 };
  10740. }
  10741. }
  10742. ";
  10743. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10744. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10745. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10746. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10747. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10748. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10749. Assert.Null(semanticInfo.Symbol);
  10750. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  10751. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10752. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10753. Assert.Equal("System.Int32 MemberInitializerTest.y { get; set; }", sortedCandidates[0].ToTestDisplayString());
  10754. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  10755. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10756. Assert.False(semanticInfo.IsCompileTimeConstant);
  10757. }
  10758. [Fact]
  10759. public void ObjectInitializer_ReadOnlyPropertyAssign_IdentifierNameSyntax()
  10760. {
  10761. string sourceCode = @"
  10762. public struct MemberInitializerTest
  10763. {
  10764. public readonly int x;
  10765. public int y { get { return 0; } }
  10766. }
  10767. public struct Test
  10768. {
  10769. public static void Main()
  10770. {
  10771. var i = new MemberInitializerTest() { /*<bind>*/y/*</bind>*/ = 2 };
  10772. }
  10773. }
  10774. ";
  10775. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10776. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10777. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10778. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10779. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10780. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10781. Assert.Null(semanticInfo.Symbol);
  10782. Assert.Equal(CandidateReason.NotAVariable, semanticInfo.CandidateReason);
  10783. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10784. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10785. Assert.Equal("System.Int32 MemberInitializerTest.y { get; }", sortedCandidates[0].ToTestDisplayString());
  10786. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  10787. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10788. Assert.False(semanticInfo.IsCompileTimeConstant);
  10789. }
  10790. [Fact]
  10791. public void ObjectInitializer_WriteOnlyPropertyAccess_IdentifierNameSyntax()
  10792. {
  10793. string sourceCode = @"
  10794. public class MemberInitializerTest
  10795. {
  10796. public int x;
  10797. public int y { get; set; }
  10798. }
  10799. public class Test
  10800. {
  10801. public MemberInitializerTest m;
  10802. public MemberInitializerTest Prop { set { m = value; } }
  10803. public static void Main()
  10804. {
  10805. var i = new Test() { /*<bind>*/Prop/*</bind>*/ = { x = 1, y = 2 } };
  10806. }
  10807. }
  10808. ";
  10809. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10810. Assert.Equal("MemberInitializerTest", semanticInfo.Type.ToTestDisplayString());
  10811. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  10812. Assert.Equal("MemberInitializerTest", semanticInfo.ConvertedType.ToTestDisplayString());
  10813. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10814. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10815. Assert.Null(semanticInfo.Symbol);
  10816. Assert.Equal(CandidateReason.NotAValue, semanticInfo.CandidateReason);
  10817. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10818. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10819. Assert.Equal("MemberInitializerTest Test.Prop { set; }", sortedCandidates[0].ToTestDisplayString());
  10820. Assert.Equal(SymbolKind.Property, sortedCandidates[0].Kind);
  10821. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10822. Assert.False(semanticInfo.IsCompileTimeConstant);
  10823. }
  10824. [Fact]
  10825. public void ObjectInitializer_ErrorInitializerType_IdentifierNameSyntax()
  10826. {
  10827. string sourceCode = @"
  10828. public class MemberInitializerTest
  10829. {
  10830. public static void Main()
  10831. {
  10832. var i = new X() { /*<bind>*/x/*</bind>*/ = 0 };
  10833. }
  10834. }
  10835. ";
  10836. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10837. Assert.Null(semanticInfo.Type);
  10838. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  10839. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  10840. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10841. Assert.Null(semanticInfo.Symbol);
  10842. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  10843. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10844. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10845. Assert.False(semanticInfo.IsCompileTimeConstant);
  10846. }
  10847. [Fact]
  10848. public void ObjectInitializer_InvalidElementInitializer_IdentifierNameSyntax()
  10849. {
  10850. string sourceCode = @"
  10851. public class MemberInitializerTest
  10852. {
  10853. public int x, y;
  10854. public static void Main()
  10855. {
  10856. var i = new MemberInitializerTest { x = 0, /*<bind>*/y/*</bind>*/++ };
  10857. }
  10858. }
  10859. ";
  10860. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10861. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10862. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10863. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10864. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10865. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10866. Assert.Equal("System.Int32 MemberInitializerTest.y", semanticInfo.Symbol.ToTestDisplayString());
  10867. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  10868. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10869. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10870. Assert.False(semanticInfo.IsCompileTimeConstant);
  10871. }
  10872. [Fact]
  10873. public void ObjectInitializer_InvalidElementInitializer_InvocationExpressionSyntax()
  10874. {
  10875. string sourceCode = @"
  10876. public class MemberInitializerTest
  10877. {
  10878. public int x;
  10879. public MemberInitializerTest Foo() { return new MemberInitializerTest(); }
  10880. public static void Main()
  10881. {
  10882. var i = new MemberInitializerTest() { x = 0, /*<bind>*/Foo()/*</bind>*/};
  10883. }
  10884. }
  10885. ";
  10886. var semanticInfo = GetSemanticInfoForTest<InvocationExpressionSyntax>(sourceCode);
  10887. Assert.Equal("MemberInitializerTest", semanticInfo.Type.ToTestDisplayString());
  10888. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  10889. Assert.Equal("MemberInitializerTest", semanticInfo.ConvertedType.ToTestDisplayString());
  10890. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10891. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10892. Assert.Equal("MemberInitializerTest MemberInitializerTest.Foo()", semanticInfo.Symbol.ToTestDisplayString());
  10893. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  10894. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10895. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10896. Assert.False(semanticInfo.IsCompileTimeConstant);
  10897. }
  10898. [Fact]
  10899. public void ObjectInitializer_BadNamedAssignmentLeft_InvocationExpressionSyntax()
  10900. {
  10901. string sourceCode = @"
  10902. public class MemberInitializerTest
  10903. {
  10904. public int x;
  10905. public MemberInitializerTest Foo() { return new MemberInitializerTest(); }
  10906. public static void Main()
  10907. {
  10908. var i = new MemberInitializerTest() { x = 0, /*<bind>*/Foo()/*</bind>*/ = new MemberInitializerTest() };
  10909. }
  10910. }
  10911. ";
  10912. var semanticInfo = GetSemanticInfoForTest<InvocationExpressionSyntax>(sourceCode);
  10913. Assert.Equal("MemberInitializerTest", semanticInfo.Type.ToTestDisplayString());
  10914. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  10915. Assert.Equal("MemberInitializerTest", semanticInfo.ConvertedType.ToTestDisplayString());
  10916. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  10917. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10918. Assert.Equal("MemberInitializerTest MemberInitializerTest.Foo()", semanticInfo.Symbol.ToTestDisplayString());
  10919. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  10920. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10921. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10922. Assert.False(semanticInfo.IsCompileTimeConstant);
  10923. }
  10924. [Fact]
  10925. public void ObjectInitializer_MethodGroupNamedAssignmentLeft_IdentifierNameSyntax()
  10926. {
  10927. string sourceCode = @"
  10928. public class MemberInitializerTest
  10929. {
  10930. public MemberInitializerTest Foo() { return new MemberInitializerTest(); }
  10931. public static void Main()
  10932. {
  10933. var i = new MemberInitializerTest() { /*<bind>*/Foo/*</bind>*/ };
  10934. }
  10935. }
  10936. ";
  10937. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10938. Assert.Null(semanticInfo.Type);
  10939. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  10940. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  10941. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10942. Assert.Null(semanticInfo.Symbol);
  10943. Assert.Equal(CandidateReason.NotInvocable, semanticInfo.CandidateReason);
  10944. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  10945. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10946. Assert.Equal("MemberInitializerTest MemberInitializerTest.Foo()", sortedCandidates[0].ToTestDisplayString());
  10947. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  10948. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  10949. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  10950. Assert.Equal("MemberInitializerTest MemberInitializerTest.Foo()", sortedMethodGroup[0].ToTestDisplayString());
  10951. Assert.False(semanticInfo.IsCompileTimeConstant);
  10952. }
  10953. [Fact]
  10954. public void ObjectInitializer_DuplicateMemberInitializer_IdentifierNameSyntax()
  10955. {
  10956. string sourceCode = @"
  10957. public class MemberInitializerTest
  10958. {
  10959. public int x;
  10960. public static void Main()
  10961. {
  10962. var i = new MemberInitializerTest() { x = 1, /*<bind>*/x/*</bind>*/ = 2 };
  10963. }
  10964. }
  10965. ";
  10966. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  10967. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  10968. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  10969. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  10970. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  10971. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  10972. Assert.Equal("System.Int32 MemberInitializerTest.x", semanticInfo.Symbol.ToTestDisplayString());
  10973. Assert.Equal(SymbolKind.Field, semanticInfo.Symbol.Kind);
  10974. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  10975. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  10976. Assert.False(semanticInfo.IsCompileTimeConstant);
  10977. }
  10978. [Fact]
  10979. public void CollectionInitializer_ObjectCreationExpressionSyntax()
  10980. {
  10981. string sourceCode = @"
  10982. using System;
  10983. using System.Collections.Generic;
  10984. using System.Collections;
  10985. class Test
  10986. {
  10987. public static int Main()
  10988. {
  10989. var i = 2;
  10990. B coll = /*<bind>*/new B { 1, i, { 4L }, { 9 }, 3L }/*</bind>*/;
  10991. DisplayCollection(coll.GetEnumerator());
  10992. return 0;
  10993. }
  10994. public static void DisplayCollection(IEnumerator collection)
  10995. {
  10996. while (collection.MoveNext())
  10997. {
  10998. Console.WriteLine(collection.Current);
  10999. }
  11000. }
  11001. }
  11002. public class B : IEnumerable
  11003. {
  11004. List<object> list = new List<object>();
  11005. public void Add(long i)
  11006. {
  11007. list.Add(i);
  11008. }
  11009. public IEnumerator GetEnumerator()
  11010. {
  11011. for (int i = 0; i < list.Count; i++)
  11012. yield return list[i];
  11013. }
  11014. }
  11015. ";
  11016. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  11017. Assert.Equal("B", semanticInfo.Type.ToTestDisplayString());
  11018. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  11019. Assert.Equal("B", semanticInfo.ConvertedType.ToTestDisplayString());
  11020. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  11021. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11022. Assert.Equal("B..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  11023. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  11024. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11025. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  11026. Assert.Equal("B..ctor()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  11027. Assert.False(semanticInfo.IsCompileTimeConstant);
  11028. }
  11029. [Fact]
  11030. public void CollectionInitializer_InitializerExpressionSyntax()
  11031. {
  11032. string sourceCode = @"
  11033. using System;
  11034. using System.Collections.Generic;
  11035. using System.Collections;
  11036. class Test
  11037. {
  11038. public static int Main()
  11039. {
  11040. var i = 2;
  11041. B coll = new B /*<bind>*/{ 1, i, { 4L }, { 9 }, 3L }/*</bind>*/;
  11042. DisplayCollection(coll.GetEnumerator());
  11043. return 0;
  11044. }
  11045. public static void DisplayCollection(IEnumerator collection)
  11046. {
  11047. while (collection.MoveNext())
  11048. {
  11049. Console.WriteLine(collection.Current);
  11050. }
  11051. }
  11052. }
  11053. public class B : IEnumerable
  11054. {
  11055. List<object> list = new List<object>();
  11056. public void Add(long i)
  11057. {
  11058. list.Add(i);
  11059. }
  11060. public IEnumerator GetEnumerator()
  11061. {
  11062. for (int i = 0; i < list.Count; i++)
  11063. yield return list[i];
  11064. }
  11065. }
  11066. ";
  11067. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11068. Assert.Null(semanticInfo.Type);
  11069. Assert.Null(semanticInfo.ConvertedType);
  11070. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11071. Assert.Null(semanticInfo.Symbol);
  11072. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11073. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11074. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11075. Assert.False(semanticInfo.IsCompileTimeConstant);
  11076. }
  11077. [Fact]
  11078. public void CollectionInitializer_ElementInitializer_LiteralExpressionSyntax()
  11079. {
  11080. string sourceCode = @"
  11081. using System;
  11082. using System.Collections.Generic;
  11083. using System.Collections;
  11084. class Test
  11085. {
  11086. public static int Main()
  11087. {
  11088. var i = 2;
  11089. B coll = new B { /*<bind>*/1/*</bind>*/, i, { 4L }, { 9 }, 3L };
  11090. DisplayCollection(coll.GetEnumerator());
  11091. return 0;
  11092. }
  11093. public static void DisplayCollection(IEnumerator collection)
  11094. {
  11095. while (collection.MoveNext())
  11096. {
  11097. Console.WriteLine(collection.Current);
  11098. }
  11099. }
  11100. }
  11101. public class B : IEnumerable
  11102. {
  11103. List<object> list = new List<object>();
  11104. public void Add(long i)
  11105. {
  11106. list.Add(i);
  11107. }
  11108. public IEnumerator GetEnumerator()
  11109. {
  11110. for (int i = 0; i < list.Count; i++)
  11111. yield return list[i];
  11112. }
  11113. }
  11114. ";
  11115. var semanticInfo = GetSemanticInfoForTest<LiteralExpressionSyntax>(sourceCode);
  11116. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  11117. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  11118. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  11119. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  11120. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  11121. Assert.Null(semanticInfo.Symbol);
  11122. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11123. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11124. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11125. Assert.True(semanticInfo.IsCompileTimeConstant);
  11126. Assert.Equal(1, semanticInfo.ConstantValue);
  11127. }
  11128. [Fact]
  11129. public void CollectionInitializer_ElementInitializer_IdentifierNameSyntax()
  11130. {
  11131. string sourceCode = @"
  11132. using System;
  11133. using System.Collections.Generic;
  11134. using System.Collections;
  11135. class Test
  11136. {
  11137. public static int Main()
  11138. {
  11139. var i = 2;
  11140. B coll = new B { 1, /*<bind>*/i/*</bind>*/, { 4L }, { 9 }, 3L };
  11141. DisplayCollection(coll.GetEnumerator());
  11142. return 0;
  11143. }
  11144. public static void DisplayCollection(IEnumerator collection)
  11145. {
  11146. while (collection.MoveNext())
  11147. {
  11148. Console.WriteLine(collection.Current);
  11149. }
  11150. }
  11151. }
  11152. public class B : IEnumerable
  11153. {
  11154. List<object> list = new List<object>();
  11155. public void Add(long i)
  11156. {
  11157. list.Add(i);
  11158. }
  11159. public IEnumerator GetEnumerator()
  11160. {
  11161. for (int i = 0; i < list.Count; i++)
  11162. yield return list[i];
  11163. }
  11164. }
  11165. ";
  11166. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11167. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  11168. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  11169. Assert.Equal("System.Int64", semanticInfo.ConvertedType.ToTestDisplayString());
  11170. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  11171. Assert.Equal(ConversionKind.ImplicitNumeric, semanticInfo.ImplicitConversion.Kind);
  11172. Assert.Equal("System.Int32 i", semanticInfo.Symbol.ToTestDisplayString());
  11173. Assert.Equal(SymbolKind.Local, semanticInfo.Symbol.Kind);
  11174. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11175. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11176. Assert.False(semanticInfo.IsCompileTimeConstant);
  11177. }
  11178. [Fact]
  11179. public void CollectionInitializer_ComplexElementInitializer_InitializerExpressionSyntax()
  11180. {
  11181. string sourceCode = @"
  11182. using System;
  11183. using System.Collections.Generic;
  11184. using System.Collections;
  11185. class Test
  11186. {
  11187. public static int Main()
  11188. {
  11189. var i = 2;
  11190. B coll = new B { 1, i, /*<bind>*/{ 4L }/*</bind>*/, { 9 }, 3L };
  11191. DisplayCollection(coll.GetEnumerator());
  11192. return 0;
  11193. }
  11194. public static void DisplayCollection(IEnumerator collection)
  11195. {
  11196. while (collection.MoveNext())
  11197. {
  11198. Console.WriteLine(collection.Current);
  11199. }
  11200. }
  11201. }
  11202. public class B : IEnumerable
  11203. {
  11204. List<object> list = new List<object>();
  11205. public void Add(long i)
  11206. {
  11207. list.Add(i);
  11208. }
  11209. public IEnumerator GetEnumerator()
  11210. {
  11211. for (int i = 0; i < list.Count; i++)
  11212. yield return list[i];
  11213. }
  11214. }
  11215. ";
  11216. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11217. Assert.Null(semanticInfo.Type);
  11218. Assert.Null(semanticInfo.ConvertedType);
  11219. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11220. Assert.Null(semanticInfo.Symbol);
  11221. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11222. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11223. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11224. Assert.False(semanticInfo.IsCompileTimeConstant);
  11225. }
  11226. [Fact]
  11227. public void CollectionInitializer_ComplexElementInitializer_Empty_InitializerExpressionSyntax()
  11228. {
  11229. string sourceCode = @"
  11230. using System.Collections.Generic;
  11231. public class MemberInitializerTest
  11232. {
  11233. public List<int> y;
  11234. public static void Main()
  11235. {
  11236. i = new MemberInitializerTest { y = { /*<bind>*/{ }/*</bind>*/ } }; // CS1920
  11237. }
  11238. }
  11239. ";
  11240. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11241. Assert.Null(semanticInfo.Type);
  11242. Assert.Null(semanticInfo.ConvertedType);
  11243. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11244. Assert.Null(semanticInfo.Symbol);
  11245. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11246. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11247. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11248. Assert.False(semanticInfo.IsCompileTimeConstant);
  11249. }
  11250. [Fact]
  11251. public void CollectionInitializer_ComplexElementInitializer_AddMethodOverloadResolutionFailure()
  11252. {
  11253. string sourceCode = @"
  11254. using System;
  11255. using System.Collections.Generic;
  11256. using System.Collections;
  11257. class Test
  11258. {
  11259. public static int Main()
  11260. {
  11261. var i = 2;
  11262. B coll = new B { /*<bind>*/{ 1, 2 }/*</bind>*/ };
  11263. DisplayCollection(coll.GetEnumerator());
  11264. return 0;
  11265. }
  11266. public static void DisplayCollection(IEnumerator collection)
  11267. {
  11268. while (collection.MoveNext())
  11269. {
  11270. Console.WriteLine(collection.Current);
  11271. }
  11272. }
  11273. }
  11274. public class B : IEnumerable
  11275. {
  11276. List<object> list = new List<object>();
  11277. public void Add(float i, int j)
  11278. {
  11279. list.Add(i);
  11280. list.Add(j);
  11281. }
  11282. public void Add(int i, float j)
  11283. {
  11284. list.Add(i);
  11285. list.Add(j);
  11286. }
  11287. public IEnumerator GetEnumerator()
  11288. {
  11289. for (int i = 0; i < list.Count; i++)
  11290. yield return list[i];
  11291. }
  11292. }
  11293. ";
  11294. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11295. Assert.Null(semanticInfo.Type);
  11296. Assert.Null(semanticInfo.ConvertedType);
  11297. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11298. Assert.Null(semanticInfo.Symbol);
  11299. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11300. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11301. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11302. Assert.False(semanticInfo.IsCompileTimeConstant);
  11303. }
  11304. [Fact]
  11305. public void CollectionInitializer_Empty_InitializerExpressionSyntax()
  11306. {
  11307. string sourceCode = @"
  11308. using System.Collections.Generic;
  11309. public class MemberInitializerTest
  11310. {
  11311. public static void Main()
  11312. {
  11313. var i = new List<int>() /*<bind>*/{ }/*</bind>*/;
  11314. }
  11315. }
  11316. ";
  11317. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11318. Assert.Null(semanticInfo.Type);
  11319. Assert.Null(semanticInfo.ConvertedType);
  11320. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11321. Assert.Null(semanticInfo.Symbol);
  11322. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11323. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11324. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11325. Assert.False(semanticInfo.IsCompileTimeConstant);
  11326. }
  11327. [Fact]
  11328. public void CollectionInitializer_Nested_InitializerExpressionSyntax()
  11329. {
  11330. string sourceCode = @"
  11331. using System;
  11332. using System.Collections.Generic;
  11333. using System.Collections;
  11334. class Test
  11335. {
  11336. public static int Main()
  11337. {
  11338. var coll = new List<B> { new B(0) { list = new List<int>() { 1, 2, 3 } }, new B(1) { list = /*<bind>*/{ 2, 3 }/*</bind>*/ } };
  11339. DisplayCollection(coll);
  11340. return 0;
  11341. }
  11342. public static void DisplayCollection(IEnumerable<B> collection)
  11343. {
  11344. foreach (var i in collection)
  11345. {
  11346. i.Display();
  11347. }
  11348. }
  11349. }
  11350. public class B
  11351. {
  11352. public List<int> list = new List<int>();
  11353. public B() { }
  11354. public B(int i) { list.Add(i); }
  11355. public void Display()
  11356. {
  11357. foreach (var i in list)
  11358. {
  11359. Console.WriteLine(i);
  11360. }
  11361. }
  11362. }
  11363. ";
  11364. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11365. Assert.Null(semanticInfo.Type);
  11366. Assert.Null(semanticInfo.ConvertedType);
  11367. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11368. Assert.Null(semanticInfo.Symbol);
  11369. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11370. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11371. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11372. Assert.False(semanticInfo.IsCompileTimeConstant);
  11373. }
  11374. [Fact]
  11375. public void CollectionInitializer_InitializerTypeNotIEnumerable_InitializerExpressionSyntax()
  11376. {
  11377. string sourceCode = @"
  11378. class MemberInitializerTest
  11379. {
  11380. public static int Main()
  11381. {
  11382. B coll = new B /*<bind>*/{ 1 }/*</bind>*/;
  11383. return 0;
  11384. }
  11385. }
  11386. class B
  11387. {
  11388. public B() { }
  11389. }
  11390. ";
  11391. var semanticInfo = GetSemanticInfoForTest<InitializerExpressionSyntax>(sourceCode);
  11392. Assert.Null(semanticInfo.Type);
  11393. Assert.Null(semanticInfo.ConvertedType);
  11394. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11395. Assert.Null(semanticInfo.Symbol);
  11396. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11397. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11398. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11399. Assert.False(semanticInfo.IsCompileTimeConstant);
  11400. }
  11401. [Fact]
  11402. public void CollectionInitializer_InvalidInitializer_PostfixUnaryExpressionSyntax()
  11403. {
  11404. string sourceCode = @"
  11405. public class MemberInitializerTest
  11406. {
  11407. public int y;
  11408. public static void Main()
  11409. {
  11410. var i = new MemberInitializerTest { /*<bind>*/y++/*</bind>*/ };
  11411. }
  11412. }
  11413. ";
  11414. var semanticInfo = GetSemanticInfoForTest<PostfixUnaryExpressionSyntax>(sourceCode);
  11415. Assert.Equal("System.Object", semanticInfo.Type.ToTestDisplayString());
  11416. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  11417. Assert.Equal("?", semanticInfo.ConvertedType.ToTestDisplayString());
  11418. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  11419. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11420. Assert.Null(semanticInfo.Symbol);
  11421. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11422. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11423. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11424. Assert.False(semanticInfo.IsCompileTimeConstant);
  11425. }
  11426. [Fact]
  11427. public void CollectionInitializer_InvalidInitializer_BinaryExpressionSyntax()
  11428. {
  11429. string sourceCode = @"
  11430. using System.Collections.Generic;
  11431. public class MemberInitializerTest
  11432. {
  11433. public int x;
  11434. static MemberInitializerTest Foo() { return new MemberInitializerTest(); }
  11435. public static void Main()
  11436. {
  11437. int y = 0;
  11438. var i = new List<int> { 1, /*<bind>*/Foo().x = 1/*</bind>*/};
  11439. }
  11440. }
  11441. ";
  11442. var semanticInfo = GetSemanticInfoForTest<BinaryExpressionSyntax>(sourceCode);
  11443. Assert.Equal("System.Int32", semanticInfo.Type.ToTestDisplayString());
  11444. Assert.Equal(TypeKind.Struct, semanticInfo.Type.TypeKind);
  11445. Assert.Equal("System.Int32", semanticInfo.ConvertedType.ToTestDisplayString());
  11446. Assert.Equal(TypeKind.Struct, semanticInfo.ConvertedType.TypeKind);
  11447. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11448. Assert.Null(semanticInfo.Symbol);
  11449. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11450. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11451. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11452. Assert.False(semanticInfo.IsCompileTimeConstant);
  11453. }
  11454. [Fact]
  11455. public void SemanticInfo_SimpleNameWithGenericTypeInAttribute()
  11456. {
  11457. string sourceCode = @"
  11458. class Gen<T> { }
  11459. class Gen2<T> : System.Attribute { }
  11460. [/*<bind>*/Gen/*</bind>*/]
  11461. [Gen2]
  11462. public class Test
  11463. {
  11464. public static int Main()
  11465. {
  11466. return 1;
  11467. }
  11468. }
  11469. ";
  11470. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11471. Assert.Equal("Gen<T>", semanticInfo.Type.ToTestDisplayString());
  11472. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  11473. Assert.Equal("Gen<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  11474. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  11475. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11476. Assert.Null(semanticInfo.Symbol);
  11477. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  11478. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  11479. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11480. Assert.Equal("Gen<T>..ctor()", sortedCandidates[0].ToTestDisplayString());
  11481. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  11482. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  11483. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11484. Assert.Equal("Gen<T>..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  11485. Assert.False(semanticInfo.IsCompileTimeConstant);
  11486. }
  11487. [Fact]
  11488. public void SemanticInfo_SimpleNameWithGenericTypeInAttribute_02()
  11489. {
  11490. string sourceCode = @"
  11491. class Gen<T> { }
  11492. class Gen2<T> : System.Attribute { }
  11493. [Gen]
  11494. [/*<bind>*/Gen2/*</bind>*/]
  11495. public class Test
  11496. {
  11497. public static int Main()
  11498. {
  11499. return 1;
  11500. }
  11501. }
  11502. ";
  11503. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11504. Assert.Equal("Gen2<T>", semanticInfo.Type.ToTestDisplayString());
  11505. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  11506. Assert.Equal("Gen2<T>", semanticInfo.ConvertedType.ToTestDisplayString());
  11507. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  11508. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11509. Assert.Null(semanticInfo.Symbol);
  11510. Assert.Equal(CandidateReason.NotAnAttributeType, semanticInfo.CandidateReason);
  11511. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  11512. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11513. Assert.Equal("Gen2<T>..ctor()", sortedCandidates[0].ToTestDisplayString());
  11514. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  11515. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  11516. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11517. Assert.Equal("Gen2<T>..ctor()", sortedMethodGroup[0].ToTestDisplayString());
  11518. Assert.False(semanticInfo.IsCompileTimeConstant);
  11519. }
  11520. [WorkItem(543860, "DevDiv")]
  11521. [Fact]
  11522. public void SemanticInfo_VarKeyword_LocalDeclaration()
  11523. {
  11524. string sourceCode = @"
  11525. using System;
  11526. using System.Collections.Generic;
  11527. using System.Linq;
  11528. class Program
  11529. {
  11530. static void Main(string[] args)
  11531. {
  11532. /*<bind>*/var/*</bind>*/ rand = new Random();
  11533. }
  11534. }
  11535. ";
  11536. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11537. Assert.Equal("System.Random", semanticInfo.Type.ToTestDisplayString());
  11538. Assert.Equal(TypeKind.Class, semanticInfo.Type.TypeKind);
  11539. Assert.Equal("System.Random", semanticInfo.ConvertedType.ToTestDisplayString());
  11540. Assert.Equal(TypeKind.Class, semanticInfo.ConvertedType.TypeKind);
  11541. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11542. Assert.Equal("System.Random", semanticInfo.Symbol.ToTestDisplayString());
  11543. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  11544. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11545. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11546. Assert.False(semanticInfo.IsCompileTimeConstant);
  11547. }
  11548. [WorkItem(543860, "DevDiv")]
  11549. [Fact]
  11550. public void SemanticInfo_VarKeyword_FieldDeclaration()
  11551. {
  11552. string sourceCode = @"
  11553. class Program
  11554. {
  11555. /*<bind>*/var/*</bind>*/ x = 1;
  11556. }
  11557. ";
  11558. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11559. Assert.Equal("var", semanticInfo.Type.ToTestDisplayString());
  11560. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  11561. Assert.Equal("var", semanticInfo.ConvertedType.ToTestDisplayString());
  11562. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  11563. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11564. Assert.Null(semanticInfo.Symbol);
  11565. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11566. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11567. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11568. Assert.False(semanticInfo.IsCompileTimeConstant);
  11569. }
  11570. [WorkItem(543860, "DevDiv")]
  11571. [Fact]
  11572. public void SemanticInfo_VarKeyword_MethodReturnType()
  11573. {
  11574. string sourceCode = @"
  11575. class Program
  11576. {
  11577. /*<bind>*/var/*</bind>*/ Foo() {}
  11578. }
  11579. ";
  11580. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11581. Assert.Equal("var", semanticInfo.Type.ToTestDisplayString());
  11582. Assert.Equal(TypeKind.Error, semanticInfo.Type.TypeKind);
  11583. Assert.Equal("var", semanticInfo.ConvertedType.ToTestDisplayString());
  11584. Assert.Equal(TypeKind.Error, semanticInfo.ConvertedType.TypeKind);
  11585. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11586. Assert.Null(semanticInfo.Symbol);
  11587. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11588. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11589. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11590. Assert.False(semanticInfo.IsCompileTimeConstant);
  11591. }
  11592. [WorkItem(543860, "DevDiv")]
  11593. [Fact]
  11594. public void SemanticInfo_InterfaceCreation_With_CoClass_IdentifierNameSyntax()
  11595. {
  11596. string sourceCode = @"
  11597. using System;
  11598. using System.Runtime.InteropServices;
  11599. class CoClassType : InterfaceType { }
  11600. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11601. [CoClass(typeof(CoClassType))]
  11602. interface InterfaceType { }
  11603. public class Program
  11604. {
  11605. public static void Main()
  11606. {
  11607. var a = new /*<bind>*/InterfaceType/*</bind>*/();
  11608. }
  11609. }
  11610. ";
  11611. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11612. Assert.Null(semanticInfo.Type);
  11613. Assert.Null(semanticInfo.ConvertedType);
  11614. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11615. Assert.Equal("InterfaceType", semanticInfo.Symbol.ToTestDisplayString());
  11616. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  11617. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11618. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11619. Assert.False(semanticInfo.IsCompileTimeConstant);
  11620. }
  11621. [WorkItem(546242, "DevDiv")]
  11622. [Fact]
  11623. public void SemanticInfo_InterfaceArrayCreation_With_CoClass_IdentifierNameSyntax()
  11624. {
  11625. string sourceCode = @"
  11626. using System;
  11627. using System.Runtime.InteropServices;
  11628. class CoClassType : InterfaceType { }
  11629. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11630. [CoClass(typeof(CoClassType))]
  11631. interface InterfaceType { }
  11632. public class Program
  11633. {
  11634. public static void Main()
  11635. {
  11636. var a = new /*<bind>*/InterfaceType/*</bind>*/[] { };
  11637. }
  11638. }
  11639. ";
  11640. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11641. Assert.Equal("InterfaceType", semanticInfo.Type.ToTestDisplayString());
  11642. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  11643. Assert.Equal("InterfaceType", semanticInfo.ConvertedType.ToTestDisplayString());
  11644. Assert.Equal(TypeKind.Interface, semanticInfo.ConvertedType.TypeKind);
  11645. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11646. Assert.Equal("InterfaceType", semanticInfo.Symbol.ToTestDisplayString());
  11647. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  11648. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11649. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11650. Assert.False(semanticInfo.IsCompileTimeConstant);
  11651. }
  11652. [Fact]
  11653. public void SemanticInfo_InterfaceCreation_With_CoClass_ObjectCreationExpressionSyntax()
  11654. {
  11655. string sourceCode = @"
  11656. using System;
  11657. using System.Runtime.InteropServices;
  11658. class CoClassType : InterfaceType { }
  11659. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11660. [CoClass(typeof(CoClassType))]
  11661. interface InterfaceType { }
  11662. public class Program
  11663. {
  11664. public static void Main()
  11665. {
  11666. var a = /*<bind>*/new InterfaceType()/*</bind>*/;
  11667. }
  11668. }
  11669. ";
  11670. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  11671. Assert.Equal("InterfaceType", semanticInfo.Type.ToTestDisplayString());
  11672. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  11673. Assert.Equal("InterfaceType", semanticInfo.ConvertedType.ToTestDisplayString());
  11674. Assert.Equal(TypeKind.Interface, semanticInfo.ConvertedType.TypeKind);
  11675. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11676. Assert.Equal("CoClassType..ctor()", semanticInfo.Symbol.ToTestDisplayString());
  11677. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  11678. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11679. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  11680. Assert.Equal("CoClassType..ctor()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  11681. Assert.False(semanticInfo.IsCompileTimeConstant);
  11682. }
  11683. [WorkItem(546242, "DevDiv")]
  11684. [Fact]
  11685. public void SemanticInfo_InterfaceArrayCreation_With_CoClass_ObjectCreationExpressionSyntax()
  11686. {
  11687. string sourceCode = @"
  11688. using System;
  11689. using System.Runtime.InteropServices;
  11690. class CoClassType : InterfaceType { }
  11691. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11692. [CoClass(typeof(CoClassType))]
  11693. interface InterfaceType { }
  11694. public class Program
  11695. {
  11696. public static void Main()
  11697. {
  11698. var a = /*<bind>*/new InterfaceType[] { }/*</bind>*/;
  11699. }
  11700. }
  11701. ";
  11702. var semanticInfo = GetSemanticInfoForTest<ArrayCreationExpressionSyntax>(sourceCode);
  11703. Assert.Equal("InterfaceType[]", semanticInfo.Type.ToTestDisplayString());
  11704. Assert.Equal(TypeKind.ArrayType, semanticInfo.Type.TypeKind);
  11705. Assert.Equal("InterfaceType[]", semanticInfo.ConvertedType.ToTestDisplayString());
  11706. Assert.Equal(TypeKind.ArrayType, semanticInfo.ConvertedType.TypeKind);
  11707. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11708. Assert.Null(semanticInfo.Symbol);
  11709. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11710. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11711. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11712. Assert.False(semanticInfo.IsCompileTimeConstant);
  11713. }
  11714. [Fact]
  11715. public void SemanticInfo_InterfaceCreation_With_Generic_CoClass_IdentifierNameSyntax()
  11716. {
  11717. string sourceCode = @"
  11718. using System;
  11719. using System.Runtime.InteropServices;
  11720. public class GenericCoClassType<T, U> : NonGenericInterfaceType
  11721. {
  11722. public GenericCoClassType(U x) { Console.WriteLine(x); }
  11723. }
  11724. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11725. [CoClass(typeof(GenericCoClassType<int, string>))]
  11726. public interface NonGenericInterfaceType
  11727. {
  11728. }
  11729. public class MainClass
  11730. {
  11731. public static int Main()
  11732. {
  11733. var a = new /*<bind>*/NonGenericInterfaceType/*</bind>*/(""string"");
  11734. return 0;
  11735. }
  11736. }
  11737. ";
  11738. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11739. Assert.Null(semanticInfo.Type);
  11740. Assert.Null(semanticInfo.ConvertedType);
  11741. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11742. Assert.Equal("NonGenericInterfaceType", semanticInfo.Symbol.ToTestDisplayString());
  11743. Assert.Equal(SymbolKind.NamedType, semanticInfo.Symbol.Kind);
  11744. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11745. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11746. Assert.False(semanticInfo.IsCompileTimeConstant);
  11747. }
  11748. [Fact]
  11749. public void SemanticInfo_InterfaceCreation_With_Generic_CoClass_ObjectCreationExpressionSyntax()
  11750. {
  11751. string sourceCode = @"
  11752. using System;
  11753. using System.Runtime.InteropServices;
  11754. public class GenericCoClassType<T, U> : NonGenericInterfaceType
  11755. {
  11756. public GenericCoClassType(U x) { Console.WriteLine(x); }
  11757. }
  11758. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11759. [CoClass(typeof(GenericCoClassType<int, string>))]
  11760. public interface NonGenericInterfaceType
  11761. {
  11762. }
  11763. public class MainClass
  11764. {
  11765. public static int Main()
  11766. {
  11767. var a = /*<bind>*/new NonGenericInterfaceType(""string"")/*</bind>*/;
  11768. return 0;
  11769. }
  11770. }
  11771. ";
  11772. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  11773. Assert.Equal("NonGenericInterfaceType", semanticInfo.Type.ToTestDisplayString());
  11774. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  11775. Assert.Equal("NonGenericInterfaceType", semanticInfo.ConvertedType.ToTestDisplayString());
  11776. Assert.Equal(TypeKind.Interface, semanticInfo.ConvertedType.TypeKind);
  11777. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11778. Assert.Equal("GenericCoClassType<System.Int32, System.String>..ctor(System.String x)", semanticInfo.Symbol.ToTestDisplayString());
  11779. Assert.Equal(SymbolKind.Method, semanticInfo.Symbol.Kind);
  11780. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11781. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  11782. var sortedMethodGroup = semanticInfo.MethodGroup.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11783. Assert.Equal("GenericCoClassType<System.Int32, System.String>..ctor(System.String x)", sortedMethodGroup[0].ToTestDisplayString());
  11784. Assert.False(semanticInfo.IsCompileTimeConstant);
  11785. }
  11786. [Fact]
  11787. public void SemanticInfo_InterfaceCreation_With_Inaccessible_CoClass_IdentifierNameSyntax()
  11788. {
  11789. string sourceCode = @"
  11790. using System;
  11791. using System.Runtime.InteropServices;
  11792. public class Wrapper
  11793. {
  11794. private class CoClassType : InterfaceType
  11795. {
  11796. }
  11797. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11798. [CoClass(typeof(CoClassType))]
  11799. public interface InterfaceType
  11800. {
  11801. }
  11802. }
  11803. public class MainClass
  11804. {
  11805. public static int Main()
  11806. {
  11807. var a = new Wrapper./*<bind>*/InterfaceType/*</bind>*/();
  11808. return 0;
  11809. }
  11810. }
  11811. ";
  11812. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11813. Assert.Null(semanticInfo.Type);
  11814. Assert.Null(semanticInfo.ConvertedType);
  11815. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11816. Assert.Equal("Wrapper.InterfaceType", semanticInfo.Symbol.ToTestDisplayString());
  11817. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11818. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11819. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11820. Assert.False(semanticInfo.IsCompileTimeConstant);
  11821. }
  11822. [Fact]
  11823. public void SemanticInfo_InterfaceCreation_With_Inaccessible_CoClass_ObjectCreationExpressionSyntax()
  11824. {
  11825. string sourceCode = @"
  11826. using System;
  11827. using System.Runtime.InteropServices;
  11828. public class Wrapper
  11829. {
  11830. private class CoClassType : InterfaceType
  11831. {
  11832. }
  11833. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11834. [CoClass(typeof(CoClassType))]
  11835. public interface InterfaceType
  11836. {
  11837. }
  11838. }
  11839. public class MainClass
  11840. {
  11841. public static int Main()
  11842. {
  11843. var a = /*<bind>*/new Wrapper.InterfaceType()/*</bind>*/;
  11844. return 0;
  11845. }
  11846. }
  11847. ";
  11848. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  11849. Assert.Equal("Wrapper.InterfaceType", semanticInfo.Type.ToTestDisplayString());
  11850. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  11851. Assert.Equal("Wrapper.InterfaceType", semanticInfo.ConvertedType.ToTestDisplayString());
  11852. Assert.Equal(TypeKind.Interface, semanticInfo.ConvertedType.TypeKind);
  11853. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11854. Assert.Null(semanticInfo.Symbol);
  11855. Assert.Equal(CandidateReason.Inaccessible, semanticInfo.CandidateReason);
  11856. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  11857. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11858. Assert.Equal("Wrapper.CoClassType..ctor()", sortedCandidates[0].ToTestDisplayString());
  11859. Assert.Equal(SymbolKind.Method, sortedCandidates[0].Kind);
  11860. Assert.Equal(1, semanticInfo.MethodGroup.Length);
  11861. Assert.Equal("Wrapper.CoClassType..ctor()", semanticInfo.MethodGroup[0].ToTestDisplayString());
  11862. Assert.False(semanticInfo.IsCompileTimeConstant);
  11863. }
  11864. [Fact]
  11865. public void SemanticInfo_InterfaceCreation_With_Invalid_CoClass_ObjectCreationExpressionSyntax()
  11866. {
  11867. string sourceCode = @"
  11868. using System;
  11869. using System.Runtime.InteropServices;
  11870. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11871. [CoClass(typeof(int))]
  11872. public interface InterfaceType
  11873. {
  11874. }
  11875. public class MainClass
  11876. {
  11877. public static int Main()
  11878. {
  11879. var a = /*<bind>*/new InterfaceType()/*</bind>*/;
  11880. return 0;
  11881. }
  11882. }
  11883. ";
  11884. var semanticInfo = GetSemanticInfoForTest<ObjectCreationExpressionSyntax>(sourceCode);
  11885. Assert.Equal("InterfaceType", semanticInfo.Type.ToTestDisplayString());
  11886. Assert.Equal(TypeKind.Interface, semanticInfo.Type.TypeKind);
  11887. Assert.Equal("InterfaceType", semanticInfo.ConvertedType.ToTestDisplayString());
  11888. Assert.Equal(TypeKind.Interface, semanticInfo.ConvertedType.TypeKind);
  11889. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11890. Assert.Null(semanticInfo.Symbol);
  11891. Assert.Equal(CandidateReason.None, semanticInfo.CandidateReason);
  11892. Assert.Equal(0, semanticInfo.CandidateSymbols.Length);
  11893. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11894. Assert.False(semanticInfo.IsCompileTimeConstant);
  11895. }
  11896. [Fact]
  11897. public void SemanticInfo_InterfaceCreation_With_Invalid_CoClass_ObjectCreationExpressionSyntax_2()
  11898. {
  11899. string sourceCode = @"
  11900. using System;
  11901. using System.Runtime.InteropServices;
  11902. [ComImport, Guid(""00020810 - 0000 - 0000 - C000 - 000000000046"")]
  11903. [CoClass(typeof(int))]
  11904. public interface InterfaceType
  11905. {
  11906. }
  11907. public class MainClass
  11908. {
  11909. public static int Main()
  11910. {
  11911. var a = new /*<bind>*/InterfaceType/*</bind>*/();
  11912. return 0;
  11913. }
  11914. }
  11915. ";
  11916. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11917. Assert.Null(semanticInfo.Type);
  11918. Assert.Null(semanticInfo.ConvertedType);
  11919. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11920. Assert.Null(semanticInfo.Symbol);
  11921. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  11922. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  11923. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  11924. Assert.Equal("InterfaceType", sortedCandidates[0].ToTestDisplayString());
  11925. Assert.Equal(SymbolKind.NamedType, sortedCandidates[0].Kind);
  11926. Assert.Equal(0, semanticInfo.MethodGroup.Length);
  11927. Assert.False(semanticInfo.IsCompileTimeConstant);
  11928. }
  11929. [WorkItem(543593, "DevDiv")]
  11930. [Fact]
  11931. public void IncompletePropertyAccessStatement()
  11932. {
  11933. string sourceCode =
  11934. @"class C
  11935. {
  11936. static void M()
  11937. {
  11938. var c = new { P = 0 };
  11939. /*<bind>*/c.P.Q/*</bind>*/ x;
  11940. }
  11941. }";
  11942. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  11943. Assert.Null(semanticInfo.Symbol);
  11944. }
  11945. [WorkItem(544449, "DevDiv")]
  11946. [Fact]
  11947. public void IndexerAccessorWithSyntaxErrors()
  11948. {
  11949. string sourceCode =
  11950. @"public abstract int this[int i]
  11951. (
  11952. {
  11953. /*<bind>*/get/*</bind>*/;
  11954. set;
  11955. }";
  11956. var semanticInfo = GetSemanticInfoForTest(sourceCode);
  11957. Assert.Null(semanticInfo.Symbol);
  11958. }
  11959. [WorkItem(545040, "DevDiv")]
  11960. [Fact]
  11961. public void OmittedArraySizeExpressionSyntax()
  11962. {
  11963. string sourceCode =
  11964. @"
  11965. class A
  11966. {
  11967. public static void Main()
  11968. {
  11969. var arr = new int[5][
  11970. ];
  11971. }
  11972. }
  11973. ";
  11974. var compilation = CreateCompilationWithMscorlib(sourceCode);
  11975. var tree = compilation.SyntaxTrees.First();
  11976. var node = tree.GetCompilationUnitRoot().DescendantNodes().OfType<OmittedArraySizeExpressionSyntax>().Last();
  11977. var model = compilation.GetSemanticModel(tree);
  11978. var typeInfo = model.GetTypeInfo(node); // Ensure that this doesn't throw.
  11979. Assert.NotNull(typeInfo);
  11980. }
  11981. [WorkItem(11451, "DevDiv_Projects/Roslyn")]
  11982. [Fact]
  11983. public void InvalidNewInterface()
  11984. {
  11985. string sourceCode = @"
  11986. using System;
  11987. public class Program
  11988. {
  11989. static void Main(string[] args)
  11990. {
  11991. var c = new /*<bind>*/IAppDomainSetup/*</bind>*/
  11992. }
  11993. }
  11994. ";
  11995. var semanticInfo = GetSemanticInfoForTest<IdentifierNameSyntax>(sourceCode);
  11996. Assert.Null(semanticInfo.Type);
  11997. Assert.Null(semanticInfo.ConvertedType);
  11998. Assert.Equal(ConversionKind.Identity, semanticInfo.ImplicitConversion.Kind);
  11999. Assert.Null(semanticInfo.Symbol);
  12000. Assert.Equal(CandidateReason.NotCreatable, semanticInfo.CandidateReason);
  12001. Assert.Equal(1, semanticInfo.CandidateSymbols.Length);
  12002. var sortedCandidates = semanticInfo.CandidateSymbols.OrderBy(s => s.ToTestDisplayString()).ToArray();
  12003. Assert.Equal("System.IAppDomainSetup", sortedCandidates[0].ToTestDisplayString());