PageRenderTime 66ms CodeModel.GetById 24ms RepoModel.GetById 0ms 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

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

  1. // Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  2. 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.CheckSym

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