PageRenderTime 53ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Src/Compilers/CSharp/Test/Symbol/Symbols/Source/DeclaringSyntaxNodeTests.cs

https://github.com/EkardNT/Roslyn
C# | 726 lines | 609 code | 83 blank | 34 comment | 45 complexity | 9e96692b75addba099ebfd92d5136230 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.CSharp.Test.Utilities;
  8. using Microsoft.CodeAnalysis.Text;
  9. using Roslyn.Test.Utilities;
  10. using Xunit;
  11. namespace Microsoft.CodeAnalysis.CSharp.UnitTests.Symbols.Source
  12. {
  13. public class DeclaringSyntaxNodeTests : CSharpTestBase
  14. {
  15. // Check that the given symbol has the expected number of declaring syntax nodes.
  16. // and that each declared node goes back to the given symbol.
  17. private ImmutableArray<SyntaxReference> CheckDeclaringSyntaxNodes(CSharpCompilation compilation,
  18. Symbol symbol,
  19. int expectedNumber)
  20. {
  21. var declaringReferences = symbol.DeclaringSyntaxReferences;
  22. Assert.Equal(expectedNumber, declaringReferences.Length);
  23. if (expectedNumber == 0)
  24. {
  25. Assert.True(!symbol.IsFromCompilation(compilation) || symbol.IsImplicitlyDeclared, "non-implicitly declares source symbol should have declaring location");
  26. }
  27. else
  28. {
  29. Assert.True(symbol.IsFromCompilation(compilation) || symbol is MergedNamespaceSymbol, "symbol with declaration should be in source, except for merged namespaces");
  30. Assert.False(symbol.IsImplicitlyDeclared);
  31. foreach (var node in declaringReferences.Select(d => d.GetSyntax()))
  32. {
  33. // Make sure GetDeclaredSymbol gets back to the symbol for each node.
  34. SyntaxTree tree = node.SyntaxTree;
  35. SemanticModel model = compilation.GetSemanticModel(tree);
  36. Assert.Equal(symbol.OriginalDefinition, model.GetDeclaredSymbol(node));
  37. }
  38. }
  39. return declaringReferences;
  40. }
  41. private ImmutableArray<SyntaxReference> CheckDeclaringSyntaxNodesIncludingParameters(CSharpCompilation compilation,
  42. Symbol symbol,
  43. int expectedNumber)
  44. {
  45. var nodes = CheckDeclaringSyntaxNodes(compilation, symbol, expectedNumber);
  46. MethodSymbol meth = symbol as MethodSymbol;
  47. if (meth != null)
  48. {
  49. foreach (ParameterSymbol p in meth.Parameters)
  50. CheckDeclaringSyntaxNodes(compilation, p, meth.IsAccessor() ? 0 : expectedNumber);
  51. }
  52. PropertySymbol prop = symbol as PropertySymbol;
  53. if (prop != null)
  54. {
  55. foreach (ParameterSymbol p in prop.Parameters)
  56. CheckDeclaringSyntaxNodes(compilation, p, expectedNumber);
  57. }
  58. return nodes;
  59. }
  60. // Check that the given symbol has the expected number of declaring syntax nodes.
  61. // and that the syntax has the expected kind. Does NOT test GetDeclaringSymbol
  62. private ImmutableArray<SyntaxReference> CheckDeclaringSyntaxNodesWithoutGetDeclaredSymbol(CSharpCompilation compilation,
  63. Symbol symbol,
  64. int expectedNumber,
  65. SyntaxKind expectedSyntaxKind)
  66. {
  67. var declaringReferences = symbol.DeclaringSyntaxReferences;
  68. Assert.Equal(expectedNumber, declaringReferences.Length);
  69. if (expectedNumber == 0)
  70. {
  71. Assert.True(!symbol.IsFromCompilation(compilation) || symbol.IsImplicitlyDeclared, "non-implicitly declares source symbol should have declaring location");
  72. }
  73. else
  74. {
  75. Assert.True(symbol.IsFromCompilation(compilation) || symbol is MergedNamespaceSymbol, "symbol with declaration should be in source, except for merged namespaces");
  76. if (symbol.Kind == SymbolKind.Namespace && ((NamespaceSymbol)symbol).IsGlobalNamespace)
  77. {
  78. Assert.True(symbol.IsImplicitlyDeclared);
  79. }
  80. else
  81. {
  82. Assert.False(symbol.IsImplicitlyDeclared);
  83. }
  84. foreach (var node in declaringReferences.Select(d => d.GetSyntax()))
  85. {
  86. // Make sure each node is of the expected kind.
  87. Assert.Equal(expectedSyntaxKind, node.CSharpKind());
  88. }
  89. }
  90. return declaringReferences;
  91. }
  92. private void AssertDeclaringSyntaxNodes(Symbol symbol, CSharpCompilation compilation, params SyntaxNode[] expectedSyntaxNodes)
  93. {
  94. int expectedNumber = expectedSyntaxNodes.Length;
  95. var declaringReferences = symbol.DeclaringSyntaxReferences;
  96. Assert.Equal(expectedNumber, declaringReferences.Length);
  97. if (expectedNumber == 0)
  98. {
  99. Assert.True(!symbol.IsFromCompilation(compilation) || symbol.IsImplicitlyDeclared, "non-implicitly declares source symbol should have declaring location");
  100. }
  101. else
  102. {
  103. Assert.True(symbol.IsFromCompilation(compilation) || symbol is MergedNamespaceSymbol, "symbol with declaration should be in source, except for merged namespaces");
  104. Assert.False(symbol.IsImplicitlyDeclared);
  105. for (int i = 0; i < expectedNumber; i++)
  106. {
  107. Assert.Same(expectedSyntaxNodes[i], declaringReferences[i].GetSyntax());
  108. }
  109. }
  110. }
  111. private void CheckDeclaringSyntax<TNode>(CSharpCompilation comp, SyntaxTree tree, string name, SymbolKind kind)
  112. where TNode : CSharpSyntaxNode
  113. {
  114. var model = comp.GetSemanticModel(tree);
  115. string code = tree.GetText().ToString();
  116. int position = code.IndexOf(name);
  117. var node = tree.GetRoot().FindToken(position).Parent.FirstAncestorOrSelf<TNode>();
  118. var sym = (Symbol)model.GetDeclaredSymbol(node);
  119. Assert.Equal(kind, sym.Kind);
  120. Assert.Equal(name, sym.Name);
  121. CheckDeclaringSyntaxNodes(comp, sym, 1);
  122. }
  123. private void CheckLambdaDeclaringSyntax<TNode>(CSharpCompilation comp, SyntaxTree tree, string textToSearchFor)
  124. where TNode : ExpressionSyntax
  125. {
  126. var model = comp.GetSemanticModel(tree);
  127. string code = tree.GetText().ToString();
  128. int position = code.IndexOf(textToSearchFor);
  129. var node = tree.GetCompilationUnitRoot().FindToken(position).Parent.FirstAncestorOrSelf<TNode>();
  130. MethodSymbol sym = model.GetSymbolInfo(node).Symbol as MethodSymbol;
  131. Assert.NotNull(sym);
  132. Assert.Equal(MethodKind.AnonymousFunction, sym.MethodKind);
  133. var nodes = CheckDeclaringSyntaxNodesWithoutGetDeclaredSymbol(comp, sym, 1, node.Kind);
  134. Assert.Equal(nodes[0].GetSyntax(), node);
  135. foreach (ParameterSymbol p in sym.Parameters)
  136. {
  137. CheckDeclaringSyntaxNodes(comp, p, 1);
  138. }
  139. }
  140. [Fact]
  141. public void SourceNamedTypeDeclaringSyntax()
  142. {
  143. var text =
  144. @"
  145. namespace N1 {
  146. class C1<T> {
  147. class Nested<U> {}
  148. delegate int NestedDel(string s);
  149. }
  150. public struct S1 {
  151. C1<int> f;
  152. }
  153. internal interface I1 {}
  154. enum E1 { Red }
  155. delegate void D1(int i);
  156. }
  157. ";
  158. var comp = CreateCompilationWithMscorlib(text);
  159. var global = comp.GlobalNamespace;
  160. var n1 = global.GetMembers("N1").Single() as NamespaceSymbol;
  161. Assert.False(n1.IsImplicitlyDeclared);
  162. Assert.True(comp.SourceModule.GlobalNamespace.IsImplicitlyDeclared);
  163. var types = n1.GetTypeMembers();
  164. foreach (Symbol s in types)
  165. {
  166. CheckDeclaringSyntaxNodes(comp, s, 1);
  167. }
  168. var c1 = n1.GetTypeMembers("C1").Single() as NamedTypeSymbol;
  169. var s1 = n1.GetTypeMembers("S1").Single() as NamedTypeSymbol;
  170. var f = s1.GetMembers("f").Single() as FieldSymbol;
  171. CheckDeclaringSyntaxNodes(comp, f.Type, 1); // constructed type C1<int>.
  172. // Nested types.
  173. foreach (Symbol s in c1.GetTypeMembers())
  174. {
  175. CheckDeclaringSyntaxNodes(comp, s, 1);
  176. }
  177. }
  178. [Fact]
  179. public void NonSourceTypeDeclaringSyntax()
  180. {
  181. var text =
  182. @"
  183. namespace N1 {
  184. class C1 {
  185. object o;
  186. int i;
  187. System.Collections.Generic.List<string> lst;
  188. dynamic dyn;
  189. C1[] arr;
  190. C1[,] arr2d;
  191. ErrType err;
  192. ConsErrType<object> consErr;
  193. }
  194. }
  195. ";
  196. var comp = CreateCompilationWithMscorlib(text);
  197. var global = comp.GlobalNamespace;
  198. var n1 = global.GetMembers("N1").Single() as NamespaceSymbol;
  199. var c1 = n1.GetTypeMembers("C1").Single() as NamedTypeSymbol;
  200. // Check types of each field in C1; should not have declaring syntax node.
  201. foreach (FieldSymbol f in c1.GetMembers().OfType<FieldSymbol>())
  202. {
  203. CheckDeclaringSyntaxNodes(comp, f.Type, 0);
  204. }
  205. }
  206. [Fact]
  207. public void AnonTypeDeclaringSyntax()
  208. {
  209. var text =
  210. @"
  211. class C1 {
  212. void f()
  213. {
  214. var a1 = new { a = 5, b = ""hi"" };
  215. var a2 = new {};
  216. }
  217. }
  218. ";
  219. var tree = Parse(text);
  220. var comp = CreateCompilationWithMscorlib(tree);
  221. var model = comp.GetSemanticModel(tree);
  222. var global = comp.GlobalNamespace;
  223. int posA1 = text.IndexOf("a1");
  224. var declaratorA1 = tree.GetCompilationUnitRoot().FindToken(posA1).Parent.FirstAncestorOrSelf<VariableDeclaratorSyntax>();
  225. var localA1 = (LocalSymbol)model.GetDeclaredSymbol(declaratorA1);
  226. var localA1Type = localA1.Type;
  227. Assert.True(localA1Type.IsAnonymousType);
  228. // Anonymous types don't support GetDeclaredSymbol.
  229. CheckDeclaringSyntaxNodesWithoutGetDeclaredSymbol(comp, localA1Type, 1, SyntaxKind.AnonymousObjectCreationExpression);
  230. // Check members of the anonymous type.
  231. foreach (Symbol memb in localA1Type.GetMembers())
  232. {
  233. int expectedDeclaringNodes = 0;
  234. if (memb is PropertySymbol)
  235. {
  236. expectedDeclaringNodes = 1; // declared property
  237. }
  238. CheckDeclaringSyntaxNodes(comp, memb, expectedDeclaringNodes);
  239. }
  240. }
  241. [WorkItem(543829, "DevDiv")]
  242. [Fact]
  243. public void AnonymousTypeSymbolWithExplicitNew()
  244. {
  245. var text =
  246. @"
  247. class C1 {
  248. void f()
  249. {
  250. var q = new { y = 2 };
  251. var x = new { y = 5 };
  252. var z = x;
  253. }
  254. }
  255. ";
  256. var tree = Parse(text);
  257. var comp = CreateCompilationWithMscorlib(tree);
  258. var model = comp.GetSemanticModel(tree);
  259. var global = comp.GlobalNamespace;
  260. // check 'q'
  261. int posQ = text.IndexOf("q");
  262. var declaratorQ = tree.GetCompilationUnitRoot().FindToken(posQ).Parent.FirstAncestorOrSelf<VariableDeclaratorSyntax>();
  263. CheckAnonymousType(model,
  264. (LocalSymbol)model.GetDeclaredSymbol(declaratorQ),
  265. (AnonymousObjectCreationExpressionSyntax)declaratorQ.Initializer.Value);
  266. // check 'x'
  267. int posX = text.IndexOf("x");
  268. var declaratorX = tree.GetCompilationUnitRoot().FindToken(posX).Parent.FirstAncestorOrSelf<VariableDeclaratorSyntax>();
  269. CheckAnonymousType(model,
  270. (LocalSymbol)model.GetDeclaredSymbol(declaratorX),
  271. (AnonymousObjectCreationExpressionSyntax)declaratorX.Initializer.Value);
  272. // check 'z' --> 'x'
  273. int posZ = text.IndexOf("z");
  274. var declaratorZ = tree.GetCompilationUnitRoot().FindToken(posZ).Parent.FirstAncestorOrSelf<VariableDeclaratorSyntax>();
  275. CheckAnonymousType(model,
  276. (LocalSymbol)model.GetDeclaredSymbol(declaratorZ),
  277. (AnonymousObjectCreationExpressionSyntax)declaratorX.Initializer.Value);
  278. }
  279. private void CheckAnonymousType(SemanticModel model, LocalSymbol local, AnonymousObjectCreationExpressionSyntax anonObjectCreation)
  280. {
  281. var localType = local.Type;
  282. Assert.True(localType.IsAnonymousType);
  283. // IsImplicitlyDeclared: Return false. The new { } clause
  284. // serves as the declaration.
  285. Assert.False(localType.IsImplicitlyDeclared);
  286. // DeclaringSyntaxNodes: Return the AnonymousObjectCreationExpression from the particular
  287. // anonymous type definition that flowed to this usage.
  288. AssertDeclaringSyntaxNodes(localType, (CSharpCompilation)model.Compilation, anonObjectCreation);
  289. // SemanticModel.GetDeclaredSymbol: Return this symbol when applied to the
  290. // AnonymousObjectCreationExpression in the new { } declaration.
  291. var symbol = model.GetDeclaredSymbol(anonObjectCreation);
  292. Assert.NotNull(symbol);
  293. Assert.Equal<ISymbol>(localType, symbol);
  294. Assert.Same(localType.DeclaringSyntaxReferences[0].GetSyntax(), symbol.DeclaringSyntaxReferences[0].GetSyntax());
  295. // Locations: Return the Span of that particular
  296. // AnonymousObjectCreationExpression's NewKeyword.
  297. Assert.Equal(1, localType.Locations.Length);
  298. Assert.Equal(localType.Locations[0], anonObjectCreation.NewKeyword.GetLocation());
  299. // Members check
  300. int propIndex = 0;
  301. foreach (var member in localType.GetMembers())
  302. {
  303. if (member.Kind == SymbolKind.Property)
  304. {
  305. // Equals: Return true when comparing same-named members of
  306. // structurally-equivalent anonymous type symbols.
  307. var members = symbol.GetMembers(member.Name);
  308. Assert.Equal(1, members.Length);
  309. Assert.Equal(member, members[0]);
  310. // IsImplicitlyDeclared: Return false. The foo = bar clause in
  311. // the new { } clause serves as the declaration.
  312. Assert.False(member.IsImplicitlyDeclared);
  313. // DeclaringSyntaxNodes: Return the AnonymousObjectMemberDeclarator from the
  314. // particular property definition that flowed to this usage.
  315. var propertyInitializer = anonObjectCreation.Initializers[propIndex];
  316. Assert.Equal(1, member.DeclaringSyntaxReferences.Length);
  317. Assert.Same(propertyInitializer, member.DeclaringSyntaxReferences[0].GetSyntax());
  318. // SemanticModel.GetDeclaredSymbol: Return this symbol when applied to its new { }
  319. // declaration's AnonymousObjectMemberDeclarator.
  320. var propSymbol = model.GetDeclaredSymbol(propertyInitializer);
  321. Assert.Equal<ISymbol>(member, propSymbol);
  322. Assert.Same(propertyInitializer, propSymbol.DeclaringSyntaxReferences[0].GetSyntax());
  323. // Locations: Return the Span of that particular
  324. // AnonymousObjectMemberDeclarator's IdentifierToken.
  325. Assert.Equal(1, member.Locations.Length);
  326. Assert.Equal(member.Locations[0], propertyInitializer.NameEquals.Name.GetLocation());
  327. propIndex++;
  328. }
  329. }
  330. }
  331. [Fact]
  332. public void NamespaceDeclaringSyntax()
  333. {
  334. var text =
  335. @"
  336. namespace N1 {
  337. namespace N2 {
  338. namespace N3 {}
  339. }
  340. }
  341. namespace N1.N2 {
  342. namespace N3 {}
  343. }
  344. namespace System {}
  345. ";
  346. var comp = CreateCompilationWithMscorlib(text);
  347. var global = comp.GlobalNamespace;
  348. var system = global.GetMembers("System").Single() as NamespaceSymbol;
  349. var n1 = global.GetMembers("N1").Single() as NamespaceSymbol;
  350. var n2 = n1.GetMembers("N2").Single() as NamespaceSymbol;
  351. var n3 = n2.GetMembers("N3").Single() as NamespaceSymbol;
  352. CheckDeclaringSyntaxNodes(comp, n2, 2);
  353. CheckDeclaringSyntaxNodes(comp, n3, 2);
  354. CheckDeclaringSyntaxNodes(comp, system, 1);
  355. // Can't use GetDeclaredSymbol for N1 or global.
  356. CheckDeclaringSyntaxNodesWithoutGetDeclaredSymbol(comp, n1, 2, SyntaxKind.NamespaceDeclaration);
  357. CheckDeclaringSyntaxNodesWithoutGetDeclaredSymbol(comp, global, 1, SyntaxKind.CompilationUnit);
  358. }
  359. [Fact]
  360. public void TypeParameterDeclaringSyntax()
  361. {
  362. var text =
  363. @"
  364. using System;
  365. using System.Collections.Generic;
  366. namespace N1 {
  367. class C1<T, U> {
  368. class C2<W> {
  369. public C1<int, string>.C2<W> f1;
  370. public void m<R, S>();
  371. }
  372. class C3<W> {
  373. IEnumerable<U> f2;
  374. Foo<Bar> f3;
  375. }
  376. }
  377. class M {
  378. }
  379. }
  380. ";
  381. var comp = CreateCompilationWithMscorlib(text);
  382. var global = comp.GlobalNamespace;
  383. var n1 = global.GetMembers("N1").Single() as NamespaceSymbol;
  384. var c1 = n1.GetTypeMembers("C1").Single() as NamedTypeSymbol;
  385. var c2 = c1.GetTypeMembers("C2").Single() as NamedTypeSymbol;
  386. var c3 = c1.GetTypeMembers("C3").Single() as NamedTypeSymbol;
  387. foreach (Symbol s in c1.TypeParameters)
  388. {
  389. CheckDeclaringSyntaxNodes(comp, s, 1);
  390. }
  391. foreach (FieldSymbol f in c2.GetMembers().OfType<FieldSymbol>())
  392. {
  393. foreach (TypeParameterSymbol tp in ((NamedTypeSymbol)f.Type).TypeParameters)
  394. {
  395. CheckDeclaringSyntaxNodes(comp, tp, 1);
  396. }
  397. }
  398. foreach (MethodSymbol m in c2.GetMembers().OfType<MethodSymbol>())
  399. {
  400. foreach (TypeParameterSymbol tp in m.TypeParameters)
  401. {
  402. CheckDeclaringSyntaxNodes(comp, tp, 1);
  403. }
  404. }
  405. foreach (FieldSymbol f in c3.GetMembers().OfType<FieldSymbol>())
  406. {
  407. foreach (TypeParameterSymbol tp in ((NamedTypeSymbol)f.Type).TypeParameters)
  408. {
  409. CheckDeclaringSyntaxNodes(comp, tp, 0);
  410. }
  411. }
  412. }
  413. [Fact]
  414. public void MemberDeclaringSyntax()
  415. {
  416. var text =
  417. @"
  418. using System;
  419. using System.Collections.Generic;
  420. namespace N1 {
  421. enum E1 {Red, Blue = 5, Green };
  422. class C1<T> {
  423. C1<int> t, w, x;
  424. const int q = 4, r = 7;
  425. C1(int i) {}
  426. static C1() {}
  427. int m(T t, int y = 3) { return 3; }
  428. int P {get { return 0; } set {}}
  429. abstract int Prop2 {get; set; }
  430. int Prop3 {get; set; }
  431. string this[int i] {get { return ""; } set {}}
  432. abstract string this[int i, int j] {get; set;}
  433. event EventHandler ev1;
  434. event EventHandler ev2 { add {} remove {} }
  435. }
  436. class C2<U>
  437. {
  438. static int x = 7;
  439. }
  440. }
  441. ";
  442. var comp = CreateCompilationWithMscorlib(text);
  443. var global = comp.GlobalNamespace;
  444. var n1 = global.GetMembers("N1").Single() as NamespaceSymbol;
  445. var c1 = n1.GetTypeMembers("C1").Single() as NamedTypeSymbol;
  446. var c2 = n1.GetTypeMembers("C2").Single() as NamedTypeSymbol;
  447. var e1 = n1.GetTypeMembers("E1").Single() as NamedTypeSymbol;
  448. foreach (Symbol memb in e1.GetMembers())
  449. {
  450. if (memb.Kind == SymbolKind.Method && ((MethodSymbol)memb).MethodKind == MethodKind.Constructor)
  451. CheckDeclaringSyntaxNodesIncludingParameters(comp, memb, 0); // implicit constructor
  452. else
  453. CheckDeclaringSyntaxNodesIncludingParameters(comp, memb, 1);
  454. }
  455. var ev1 = c1.GetMembers("ev1").Single() as EventSymbol;
  456. var prop3 = c1.GetMembers("Prop3").Single() as PropertySymbol;
  457. foreach (Symbol memb in c1.GetMembers())
  458. {
  459. int expectedDeclaringNodes = 1;
  460. if (memb is MethodSymbol)
  461. {
  462. MethodSymbol meth = (MethodSymbol)memb;
  463. if (meth.AssociatedSymbol != null && meth.AssociatedSymbol.OriginalDefinition.Equals(ev1))
  464. expectedDeclaringNodes = 0; // implicit accessor.
  465. }
  466. if (memb is FieldSymbol)
  467. {
  468. FieldSymbol fld = (FieldSymbol)memb;
  469. if (fld.AssociatedSymbol != null && fld.AssociatedSymbol.OriginalDefinition.Equals(prop3))
  470. expectedDeclaringNodes = 0; // auto-prop backing field.
  471. }
  472. CheckDeclaringSyntaxNodesIncludingParameters(comp, memb, expectedDeclaringNodes);
  473. }
  474. var fieldT = c1.GetMembers("t").Single() as FieldSymbol;
  475. var constructedC1 = fieldT.Type;
  476. foreach (Symbol memb in constructedC1.GetMembers())
  477. {
  478. int expectedDeclaringNodes = 1;
  479. if (memb is MethodSymbol)
  480. {
  481. MethodSymbol meth = (MethodSymbol)memb;
  482. if (meth.AssociatedSymbol != null && meth.AssociatedSymbol.OriginalDefinition.Equals(ev1))
  483. expectedDeclaringNodes = 0; // implicit accessor.
  484. }
  485. if (memb is FieldSymbol)
  486. {
  487. FieldSymbol fld = (FieldSymbol)memb;
  488. if (fld.AssociatedSymbol != null && fld.AssociatedSymbol.OriginalDefinition.Equals(prop3))
  489. expectedDeclaringNodes = 0; // auto-prop backing field.
  490. }
  491. CheckDeclaringSyntaxNodesIncludingParameters(comp, memb, expectedDeclaringNodes);
  492. }
  493. foreach (Symbol memb in c2.GetMembers())
  494. {
  495. if (memb.Kind == SymbolKind.Method)
  496. CheckDeclaringSyntaxNodesIncludingParameters(comp, memb, 0);
  497. }
  498. }
  499. [Fact]
  500. public void LocalDeclaringSyntax()
  501. {
  502. var text =
  503. @"
  504. using System;
  505. using System.Collections.Generic;
  506. class C1
  507. {
  508. void m()
  509. {
  510. int loc1, loc2 = 4, loc3;
  511. const int loc4 = 6, loc5 = 7;
  512. using (IDisposable loc6 = foo()) {}
  513. for (int loc7 = 0; loc7 < 10; ++loc7) {}
  514. foreach (int loc8 in new int[] {1,3,4}) {}
  515. }
  516. }
  517. ";
  518. var tree = Parse(text);
  519. var comp = CreateCompilationWithMscorlib(tree);
  520. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc1", SymbolKind.Local);
  521. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc2", SymbolKind.Local);
  522. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc3", SymbolKind.Local);
  523. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc4", SymbolKind.Local);
  524. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc5", SymbolKind.Local);
  525. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc6", SymbolKind.Local);
  526. CheckDeclaringSyntax<VariableDeclaratorSyntax>(comp, tree, "loc7", SymbolKind.Local);
  527. CheckDeclaringSyntax<ForEachStatementSyntax>(comp, tree, "loc8", SymbolKind.Local);
  528. }
  529. [Fact]
  530. public void LabelDeclaringSyntax()
  531. {
  532. var text =
  533. @"
  534. using System;
  535. using System.Collections.Generic;
  536. class C1
  537. {
  538. void m(int i)
  539. {
  540. lab1: ;
  541. lab2: lab3: Console.WriteLine();
  542. switch (i) {
  543. case 4: case 3:
  544. break;
  545. default:
  546. break;
  547. }
  548. }
  549. }
  550. ";
  551. var tree = Parse(text);
  552. var comp = CreateCompilationWithMscorlib(tree);
  553. CheckDeclaringSyntax<LabeledStatementSyntax>(comp, tree, "lab1", SymbolKind.Label);
  554. CheckDeclaringSyntax<LabeledStatementSyntax>(comp, tree, "lab2", SymbolKind.Label);
  555. CheckDeclaringSyntax<LabeledStatementSyntax>(comp, tree, "lab3", SymbolKind.Label);
  556. CheckDeclaringSyntax<SwitchLabelSyntax>(comp, tree, "case 4:", SymbolKind.Label);
  557. CheckDeclaringSyntax<SwitchLabelSyntax>(comp, tree, "case 3:", SymbolKind.Label);
  558. CheckDeclaringSyntax<SwitchLabelSyntax>(comp, tree, "default:", SymbolKind.Label);
  559. }
  560. [Fact]
  561. public void AliasDeclaringSyntax()
  562. {
  563. var text =
  564. @"
  565. using System;
  566. using System.Collections.Generic;
  567. using ConsoleAlias=System.Console;
  568. using ListOfIntAlias=System.Collections.Generic.List<int>;
  569. namespace N1
  570. {
  571. using FooAlias=Con;
  572. }
  573. ";
  574. var tree = Parse(text);
  575. var comp = CreateCompilationWithMscorlib(tree);
  576. CheckDeclaringSyntax<UsingDirectiveSyntax>(comp, tree, "ConsoleAlias", SymbolKind.Alias);
  577. CheckDeclaringSyntax<UsingDirectiveSyntax>(comp, tree, "ListOfIntAlias", SymbolKind.Alias);
  578. CheckDeclaringSyntax<UsingDirectiveSyntax>(comp, tree, "FooAlias", SymbolKind.Alias);
  579. }
  580. [Fact]
  581. public void RangeVariableDeclaringSyntax()
  582. {
  583. var text =
  584. @"
  585. using System;
  586. using System.Collections.Generic;
  587. using System.Linq;
  588. class C
  589. {
  590. void f()
  591. {
  592. IEnumerable<int> a = null;
  593. var y1 = from range1 in a let range2 = a.ToString() select range1 into range3 select range3 + 1;
  594. var y2 = from range4 in a join range5 in a on range4.ToString() equals range5.ToString() into range6 select range6;
  595. }
  596. }
  597. ";
  598. var tree = Parse(text);
  599. var comp = CreateCompilationWithMscorlib(tree);
  600. CheckDeclaringSyntax<QueryClauseSyntax>(comp, tree, "range1", SymbolKind.RangeVariable);
  601. CheckDeclaringSyntax<QueryClauseSyntax>(comp, tree, "range2", SymbolKind.RangeVariable);
  602. CheckDeclaringSyntax<QueryContinuationSyntax>(comp, tree, "range3", SymbolKind.RangeVariable);
  603. CheckDeclaringSyntax<QueryClauseSyntax>(comp, tree, "range4", SymbolKind.RangeVariable);
  604. CheckDeclaringSyntax<QueryClauseSyntax>(comp, tree, "range5", SymbolKind.RangeVariable);
  605. CheckDeclaringSyntax<JoinIntoClauseSyntax>(comp, tree, "range6", SymbolKind.RangeVariable);
  606. }
  607. [Fact]
  608. public void LambdaDeclaringSyntax()
  609. {
  610. var text =
  611. @"
  612. using System;
  613. using System.Collections.Generic;
  614. using System.Linq;
  615. class C
  616. {
  617. void f()
  618. {
  619. Func<int, int, int> f1 = (a,b) => /*1*/ a + b;
  620. Func<int, int, int> f1 = a => /*2*/ a + 1;
  621. Func<int, int, int> f1 = delegate(int a, int b) /*3*/ { return a + b; };
  622. }
  623. }
  624. ";
  625. var tree = Parse(text);
  626. var comp = CreateCompilationWithMscorlib(tree);
  627. CheckLambdaDeclaringSyntax<ParenthesizedLambdaExpressionSyntax>(comp, tree, "/*1*/");
  628. CheckLambdaDeclaringSyntax<SimpleLambdaExpressionSyntax>(comp, tree, "/*2*/");
  629. CheckLambdaDeclaringSyntax<AnonymousMethodExpressionSyntax>(comp, tree, "/*3*/");
  630. }
  631. }
  632. }