PageRenderTime 27ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.Dom/ResolveResult.cs

https://github.com/jfcantin/monodevelop
C# | 745 lines | 603 code | 87 blank | 55 comment | 125 complexity | b24a64a12bfde827735e18aa872eacf5 MD5 | raw file
  1. //
  2. // ResolveResult.cs
  3. //
  4. // Author:
  5. // Mike Krüger <mkrueger@novell.com>
  6. //
  7. // Copyright (C) 2008 Novell, Inc (http://www.novell.com)
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.Collections;
  30. using System.Collections.ObjectModel;
  31. using System.Collections.Generic;
  32. using MonoDevelop.Projects.Dom.Parser;
  33. using System.Diagnostics;
  34. using System.Linq;
  35. using System.Text;
  36. namespace MonoDevelop.Projects.Dom
  37. {
  38. public abstract class ResolveResult
  39. {
  40. public IType CallingType {
  41. get;
  42. set;
  43. }
  44. public virtual IReturnType ResolvedType {
  45. get;
  46. set;
  47. }
  48. public virtual IReturnType UnresolvedType {
  49. get;
  50. set;
  51. }
  52. public IMember CallingMember {
  53. get;
  54. set;
  55. }
  56. public bool StaticResolve {
  57. get;
  58. set;
  59. }
  60. public ExpressionResult ResolvedExpression {
  61. get;
  62. set;
  63. }
  64. public virtual IEnumerable<ResolveResult> ResolveResults {
  65. get { yield return this; }
  66. }
  67. List<string> resolveErrors = new List<string> ();
  68. public List<string> ResolveErrors {
  69. get {
  70. return resolveErrors;
  71. }
  72. }
  73. public ResolveResult () : this (false)
  74. {
  75. }
  76. public ResolveResult (bool staticResolve)
  77. {
  78. this.StaticResolve = staticResolve;
  79. }
  80. public abstract IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember);
  81. }
  82. public class AggregatedResolveResult : ResolveResult
  83. {
  84. List<ResolveResult> resolveResults = new List<ResolveResult> ();
  85. public ResolveResult PrimaryResult {
  86. get {
  87. if (resolveResults.Count == 0)
  88. return null;
  89. return resolveResults[0];
  90. }
  91. }
  92. public override IReturnType UnresolvedType {
  93. get {
  94. if (PrimaryResult == null)
  95. return base.UnresolvedType;
  96. return PrimaryResult.UnresolvedType;
  97. }
  98. }
  99. public override IEnumerable<ResolveResult> ResolveResults {
  100. get { return this.resolveResults; }
  101. }
  102. public override IReturnType ResolvedType {
  103. get {
  104. if (PrimaryResult == null)
  105. return base.ResolvedType;
  106. return PrimaryResult.ResolvedType;
  107. }
  108. }
  109. public AggregatedResolveResult (params ResolveResult[] results)
  110. {
  111. resolveResults.AddRange (results);
  112. }
  113. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  114. {
  115. foreach (ResolveResult result in resolveResults) {
  116. foreach (object o in result.CreateResolveResult (dom, callingMember)) {
  117. yield return o;
  118. }
  119. }
  120. }
  121. }
  122. public class LocalVariableResolveResult : ResolveResult
  123. {
  124. LocalVariable variable;
  125. public LocalVariable LocalVariable {
  126. get {
  127. return variable;
  128. }
  129. }
  130. bool isLoopVariable;
  131. public bool IsLoopVariable {
  132. get {
  133. return isLoopVariable;
  134. }
  135. }
  136. public LocalVariableResolveResult (LocalVariable variable) : this (variable, false)
  137. {
  138. }
  139. public LocalVariableResolveResult (LocalVariable variable, bool isLoopVariable)
  140. {
  141. this.variable = variable;
  142. this.isLoopVariable = isLoopVariable;
  143. }
  144. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  145. {
  146. List<object> result = new List<object> ();
  147. if (IsLoopVariable) {
  148. if (ResolvedType.Name == "IEnumerable" && ResolvedType.GenericArguments != null && ResolvedType.GenericArguments.Count > 0) {
  149. MemberResolveResult.AddType (dom, result, ResolvedType.GenericArguments [0], callingMember, StaticResolve);
  150. } else if (ResolvedType.Name == "IEnumerable") {
  151. MemberResolveResult.AddType (dom, result, DomReturnType.Object, callingMember, StaticResolve);
  152. } else {
  153. MemberResolveResult.AddType (dom, result, dom.GetType (ResolvedType), callingMember, StaticResolve);
  154. }
  155. } else {
  156. MemberResolveResult.AddType (dom, result, ResolvedType, callingMember, StaticResolve);
  157. }
  158. return result;
  159. }
  160. public override string ToString ()
  161. {
  162. return String.Format ("[LocalVariableResolveResult: LocalVariable={0}, ResolvedType={1}]", LocalVariable, ResolvedType);
  163. }
  164. }
  165. public class ParameterResolveResult : ResolveResult
  166. {
  167. IParameter parameter;
  168. public IParameter Parameter {
  169. get {
  170. return parameter;
  171. }
  172. }
  173. public ParameterResolveResult (IParameter parameter)
  174. {
  175. this.parameter = parameter;
  176. }
  177. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  178. {
  179. List<object> result = new List<object> ();
  180. MemberResolveResult.AddType (dom, result, ResolvedType, callingMember, StaticResolve);
  181. return result;
  182. }
  183. public override string ToString ()
  184. {
  185. return String.Format ("[ParameterResolveResult: Parameter={0}]", Parameter);
  186. }
  187. }
  188. public class AnonymousTypeResolveResult : ResolveResult
  189. {
  190. public IType AnonymousType {
  191. get;
  192. set;
  193. }
  194. public AnonymousTypeResolveResult (IType anonymousType)
  195. {
  196. this.AnonymousType = anonymousType;
  197. this.ResolvedType = new DomReturnType (anonymousType);
  198. }
  199. public override string ToString ()
  200. {
  201. return String.Format ("[AnonymousTypeResolveResult: AnonymousType={0}]", AnonymousType);
  202. }
  203. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  204. {
  205. foreach (IMember member in AnonymousType.Members) {
  206. yield return member;
  207. }
  208. }
  209. }
  210. public class MemberResolveResult : ResolveResult
  211. {
  212. public virtual IMember ResolvedMember {
  213. get;
  214. set;
  215. }
  216. protected MemberResolveResult ()
  217. {
  218. }
  219. public MemberResolveResult (IMember resolvedMember)
  220. {
  221. this.ResolvedMember = resolvedMember;
  222. }
  223. public MemberResolveResult (IMember resolvedMember, bool staticResolve) : base (staticResolve)
  224. {
  225. this.ResolvedMember = resolvedMember;
  226. }
  227. internal static void AddType (ProjectDom dom, List<object> result, IType type, IMember callingMember, bool showStatic)
  228. {
  229. AddType (dom, result, type, callingMember, showStatic, null);
  230. }
  231. internal static void AddType (ProjectDom dom, List<object> result, IType type, IMember callingMember, bool showStatic, Func<IMember, bool> filter)
  232. {
  233. // System.Console.WriteLine("Add Type:" + type);
  234. if (type == null)
  235. return;
  236. if (showStatic && type.ClassType == ClassType.Enum) {
  237. foreach (IMember member in type.Fields) {
  238. result.Add (member);
  239. }
  240. return;
  241. }
  242. List<IType> accessibleStaticTypes = null;
  243. if (callingMember != null && callingMember.DeclaringType != null)
  244. accessibleStaticTypes = DomType.GetAccessibleExtensionTypes (dom, callingMember.DeclaringType.CompilationUnit);
  245. /* TODO: Typed extension methods
  246. IList<IReturnType> genericParameters = null;
  247. if (type is InstantiatedType)
  248. genericParameters = ((InstantiatedType)type).GenericParameters;*/
  249. bool includeProtected = callingMember != null ? DomType.IncludeProtected (dom, type, callingMember.DeclaringType) : false;
  250. if (accessibleStaticTypes != null) {
  251. foreach (IMethod extensionMethod in type.GetAllExtensionMethods (accessibleStaticTypes))
  252. result.Add (extensionMethod);
  253. }
  254. foreach (IType curType in dom.GetInheritanceTree (type)) {
  255. if (curType.ClassType == ClassType.Interface && type.ClassType != ClassType.Interface && !(type is InstantiatedParameterType))
  256. continue;
  257. foreach (IMember member in curType.Members) {
  258. if (callingMember != null && !member.IsAccessibleFrom (dom, type, callingMember, includeProtected))
  259. continue;
  260. // handled by member.IsAccessibleFrom
  261. // if (member.IsProtected && !includeProtected)
  262. // continue;
  263. if (member is IMethod && (((IMethod)member).IsConstructor || ((IMethod)member).IsFinalizer))
  264. continue;
  265. if (!showStatic && member is IType)
  266. continue;
  267. if (filter != null && filter (member))
  268. continue;
  269. if (member is IType || !(showStatic ^ (member.IsStatic || member.IsConst))) {
  270. result.Add (member);
  271. }
  272. }
  273. // if (showStatic)
  274. // break;
  275. }
  276. }
  277. internal static void AddType (ProjectDom dom, List<object> result, IReturnType returnType, IMember callingMember, bool showStatic)
  278. {
  279. if (returnType == null || returnType.FullName == "System.Void")
  280. return;
  281. if (returnType.ArrayDimensions > 0) {
  282. DomReturnType elementType = new DomReturnType (returnType.FullName);
  283. elementType.ArrayDimensions = returnType.ArrayDimensions - 1;
  284. for (int i = 0; i < elementType.ArrayDimensions; i++) {
  285. elementType.SetDimension (i, returnType.ArrayDimensions - 1);
  286. }
  287. elementType.PointerNestingLevel = returnType.PointerNestingLevel;
  288. AddType (dom, result, dom.GetArrayType (elementType), callingMember, showStatic);
  289. return;
  290. }
  291. IType type = dom.GetType (returnType);
  292. AddType (dom, result, type, callingMember, showStatic);
  293. }
  294. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  295. {
  296. List<object> result = new List<object> ();
  297. if (ResolvedExpression != null && ResolvedExpression.ExpressionContext != null && ResolvedExpression.ExpressionContext.IsObjectCreation) {
  298. AddType (dom, result, dom.GetType (ResolvedType), callingMember, true);
  299. } else {
  300. AddType (dom, result, ResolvedType, callingMember, StaticResolve);
  301. }
  302. return result;
  303. }
  304. public override string ToString ()
  305. {
  306. return String.Format ("[MemberResolveResult: CallingType={0}, CallingMember={1}, ResolvedMember={2}, ResolvedType={3}]",
  307. CallingType,
  308. CallingMember,
  309. ResolvedMember,
  310. ResolvedType);
  311. }
  312. }
  313. public class UnresolvedMemberResolveResult : ResolveResult
  314. {
  315. public ResolveResult TargetResolveResult {
  316. get;
  317. private set;
  318. }
  319. public string MemberName {
  320. get;
  321. private set;
  322. }
  323. public UnresolvedMemberResolveResult (ResolveResult targetResolveResult, string memberName)
  324. {
  325. this.TargetResolveResult = targetResolveResult;
  326. this.MemberName = memberName;
  327. }
  328. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  329. {
  330. return null;
  331. }
  332. }
  333. public class MethodResolveResult : MemberResolveResult
  334. {
  335. List<IMethod> methods = new List<IMethod> ();
  336. List<IMethod> originalMethods = new List<IMethod> ();
  337. List<IReturnType> arguments = new List<IReturnType> ();
  338. List<IReturnType> genericArguments = new List<IReturnType> ();
  339. /// <value>
  340. /// The type the methods are called on. (Required to resolve extension methods).
  341. /// </value>
  342. public IType Type {
  343. get;
  344. set;
  345. }
  346. public ReadOnlyCollection<IMethod> Methods {
  347. get {
  348. return methods.AsReadOnly ();
  349. }
  350. }
  351. public override IMember ResolvedMember {
  352. get {
  353. return MostLikelyMethod;
  354. }
  355. }
  356. public bool ExactMethodMatch {
  357. get {
  358. if (methods.Count == 0)
  359. return false;
  360. foreach (IMethod method in methods) {
  361. if (method.TypeParameters.Count != genericArguments.Count || method.Parameters.Count != arguments.Count)
  362. continue;
  363. bool match = true;
  364. for (int i = 0; i < method.Parameters.Count; i++) {
  365. if (method.Parameters[i].ReturnType.ToInvariantString () != arguments[i].ToInvariantString ()) {
  366. match = false;
  367. break;
  368. }
  369. }
  370. if (match)
  371. return true;
  372. }
  373. return false;
  374. }
  375. }
  376. public IMethod MostLikelyMethod {
  377. get {
  378. if (methods.Count == 0)
  379. return null;
  380. IMethod result = methods[0];
  381. foreach (IMethod method in methods) {
  382. if (method.Parameters.Any (p => p.IsParams)) {
  383. if (method.Parameters.Count - 1 > arguments.Count)
  384. continue;
  385. } else {
  386. if (method.Parameters.Count != arguments.Count)
  387. continue;
  388. }
  389. bool match = true;
  390. for (int i = 0; i < arguments.Count; i++) {
  391. if (method.Parameters.Count == 0) { // should never happen
  392. match = false;
  393. break;
  394. }
  395. IParameter parameter = method.Parameters[System.Math.Min (i, method.Parameters.Count - 1)];
  396. if (!IsCompatible (parameter.ReturnType, arguments[i])) {
  397. match = false;
  398. break;
  399. }
  400. }
  401. if (match)
  402. return method;
  403. if (MayBeBetter (result, method))
  404. result = method;
  405. }
  406. return result;
  407. }
  408. }
  409. string CreateGenericIdString (IReturnType type)
  410. {
  411. StringBuilder result = new StringBuilder ();
  412. result.Append (type.GenericArguments.Count);
  413. result.Append ("<");
  414. foreach (var generic in type.GenericArguments)
  415. result.Append (CreateGenericIdString (generic));
  416. result.Append (">");
  417. return result.ToString ();
  418. }
  419. bool MayBeBetter (IMethod current, IMethod possibleBetterMethod)
  420. {
  421. if (current == null)
  422. return true;
  423. if (possibleBetterMethod == null)
  424. return false;
  425. int better = 0;
  426. for (int i = 0; i < arguments.Count; i++) {
  427. if (i >= current.Parameters.Count || i >= possibleBetterMethod.Parameters.Count)
  428. return false;
  429. IParameter curParameter = current.Parameters[System.Math.Min (i, current.Parameters.Count - 1)];
  430. IParameter newParameter = possibleBetterMethod.Parameters[System.Math.Min (i, possibleBetterMethod.Parameters.Count - 1)];
  431. string s1 = CreateGenericIdString (curParameter.ReturnType);
  432. string s2 = CreateGenericIdString (newParameter.ReturnType);
  433. string arg = CreateGenericIdString (arguments[i]);
  434. if (arg.Contains (s1) || s1.Contains (arg))
  435. better--;
  436. if (arg.Contains (s2) || s2.Contains (arg))
  437. better++;
  438. }
  439. return better >= 0;
  440. }
  441. public bool IsCompatible (IReturnType baseType, IReturnType type)
  442. {
  443. if (baseType.ToInvariantString () == type.ToInvariantString ())
  444. return true;
  445. ProjectDom dom = null;
  446. if (CallingType == null)
  447. return false;
  448. dom = CallingType.SourceProjectDom;
  449. IType b = dom.SearchType (CallingType.CompilationUnit, CallingType, CallingType.Location, baseType);
  450. IType t = dom.SearchType (CallingType.CompilationUnit, CallingType, CallingType.Location, type);
  451. if (b == null || t == null)
  452. return false;
  453. return dom.GetInheritanceTree (t).Any (tBase => tBase.DecoratedFullName == b.DecoratedFullName);
  454. }
  455. public override IReturnType ResolvedType {
  456. get {
  457. IMethod method = MostLikelyMethod;
  458. if (method != null) {
  459. IMethod instMethod = DomMethod.CreateInstantiatedGenericMethod (method, genericArguments, arguments);
  460. return instMethod.ReturnType;
  461. }
  462. return base.ResolvedType;
  463. }
  464. }
  465. public override IReturnType UnresolvedType {
  466. get {
  467. return ResolvedType;
  468. }
  469. }
  470. /// <summary>
  471. /// Flags, if the return type should be completed or this result is in 'delegate' state.
  472. /// </summary>
  473. public bool GetsInvoked {
  474. get;
  475. set;
  476. }
  477. public ReadOnlyCollection<IReturnType> GenericArguments {
  478. get {
  479. return genericArguments.AsReadOnly ();
  480. }
  481. }
  482. public void AddGenericArgument (IReturnType arg)
  483. {
  484. genericArguments.Add (arg);
  485. }
  486. public ReadOnlyCollection<IReturnType> Arguments {
  487. get {
  488. return arguments.AsReadOnly ();
  489. }
  490. }
  491. public void AddArgument (IReturnType arg)
  492. {
  493. arguments.Add (arg);
  494. }
  495. public MethodResolveResult (IMethod method)
  496. {
  497. AddMethods (new IMethod [] { method });
  498. }
  499. public MethodResolveResult (IEnumerable members)
  500. {
  501. AddMethods (members);
  502. }
  503. public void AddMethods (IEnumerable members)
  504. {
  505. if (members == null)
  506. return;
  507. foreach (object member in members) {
  508. IMethod method = member as IMethod;
  509. if (method == null)
  510. continue;
  511. methods.Add (method);
  512. originalMethods.Add (method);
  513. }
  514. }
  515. public bool StaticUsage {
  516. get;
  517. set;
  518. }
  519. public void ResolveExtensionMethods ()
  520. {
  521. // Console.WriteLine (" --- Resolve extension");
  522. // Console.WriteLine ("---Args:");
  523. // foreach (var arg in arguments)
  524. // Console.WriteLine (arg);
  525. // Console.WriteLine ("---GenArgs:");
  526. // if (genericArguments != null) {
  527. // foreach (var arg in genericArguments)
  528. // Console.WriteLine (arg);
  529. // } else {
  530. // Console.WriteLine ("<null>");
  531. // }
  532. Debug.Assert (originalMethods.Count == methods.Count);
  533. for (int i = 0; i < originalMethods.Count; i++) {
  534. if (originalMethods[i] is ExtensionMethod) { // Extension methods are already resolved & instantiated.
  535. methods[i] = originalMethods[i];
  536. } else if (!StaticUsage && originalMethods[i].IsExtension && Type != null) {
  537. methods[i] = new ExtensionMethod (Type, originalMethods[i], genericArguments, arguments);
  538. } else {
  539. methods[i] = DomMethod.CreateInstantiatedGenericMethod (originalMethods[i], genericArguments, arguments);
  540. }
  541. }
  542. // Console.WriteLine ("-- end resolve extension.");
  543. }
  544. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  545. {
  546. List<object> result = new List<object> ();
  547. MemberResolveResult.AddType (dom, result, GetsInvoked ? ResolvedType : DomReturnType.Delegate , callingMember, StaticResolve);
  548. return result;
  549. }
  550. public override string ToString ()
  551. {
  552. return String.Format ("[MethodResolveResult: #methods={0}]", methods.Count);
  553. }
  554. }
  555. public class CombinedMethodResolveResult : MemberResolveResult
  556. {
  557. public MemberResolveResult BaseResolveResult {
  558. get;
  559. set;
  560. }
  561. public MethodResolveResult MethodResolveResult {
  562. get;
  563. set;
  564. }
  565. public CombinedMethodResolveResult (MemberResolveResult baseResolveResult, MethodResolveResult methodResolveResult)
  566. {
  567. BaseResolveResult = baseResolveResult;
  568. MethodResolveResult = methodResolveResult;
  569. CallingType = baseResolveResult.CallingType;
  570. CallingMember = baseResolveResult.CallingMember;
  571. StaticResolve = baseResolveResult.StaticResolve;
  572. ResolvedMember = baseResolveResult.ResolvedMember;
  573. ResolvedExpression = baseResolveResult.ResolvedExpression;
  574. }
  575. public override IReturnType ResolvedType {
  576. get {
  577. return BaseResolveResult.ResolvedType;
  578. }
  579. }
  580. public override IReturnType UnresolvedType {
  581. get {
  582. return BaseResolveResult.UnresolvedType;
  583. }
  584. }
  585. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  586. {
  587. return BaseResolveResult.CreateResolveResult (dom, callingMember);
  588. }
  589. }
  590. public class ThisResolveResult : ResolveResult
  591. {
  592. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  593. {
  594. List<object> result = new List<object> ();
  595. if (CallingMember != null && !CallingMember.IsStatic)
  596. MemberResolveResult.AddType (dom, result, new DomReturnType (CallingType), callingMember, StaticResolve);
  597. return result;
  598. }
  599. public override string ToString ()
  600. {
  601. return String.Format ("[ThisResolveResult]");
  602. }
  603. }
  604. public class BaseResolveResult : ResolveResult
  605. {
  606. internal class BaseMemberDecorator : DomMemberDecorator
  607. {
  608. IType fakeDeclaringType;
  609. public override IType DeclaringType {
  610. get {
  611. return fakeDeclaringType;
  612. }
  613. }
  614. public BaseMemberDecorator (IMember member, IType fakeDeclaringType) : base (member)
  615. {
  616. this.fakeDeclaringType = fakeDeclaringType;
  617. }
  618. }
  619. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  620. {
  621. List<object> result = new List<object> ();
  622. if (CallingMember != null && !CallingMember.IsStatic) {
  623. IType baseType = dom.SearchType (CallingType != null ? CallingType.CompilationUnit : null, CallingType, CallingMember.Location ,CallingType.BaseType ?? DomReturnType.Object);
  624. MemberResolveResult.AddType (dom, result, baseType, new BaseMemberDecorator (CallingMember, baseType), StaticResolve, m => m.IsAbstract);
  625. }
  626. return result;
  627. }
  628. public override string ToString ()
  629. {
  630. return String.Format ("[BaseResolveResult]");
  631. }
  632. }
  633. public class NamespaceResolveResult : ResolveResult
  634. {
  635. string ns;
  636. public string Namespace {
  637. get {
  638. return ns;
  639. }
  640. }
  641. public NamespaceResolveResult (string ns)
  642. {
  643. this.ns = ns;
  644. }
  645. public override string ToString ()
  646. {
  647. return String.Format ("[NamespaceResolveResult: Namespace={0}]", Namespace);
  648. }
  649. public override IEnumerable<object> CreateResolveResult (ProjectDom dom, IMember callingMember)
  650. {
  651. List<object> result = new List<object> ();
  652. foreach (object o in dom.GetNamespaceContents (ns, true, true)) {
  653. result.Add (o);
  654. }
  655. return result;
  656. }
  657. }
  658. }