[System.Net] Add support for .pac proxy config scripts on mac
[mono.git] / mcs / mcs / namespace.cs
1 //
2 // namespace.cs: Tracks namespaces
3 //
4 // Author:
5 //   Miguel de Icaza (miguel@ximian.com)
6 //   Marek Safar (marek.safar@seznam.cz)
7 //
8 // Copyright 2001 Ximian, Inc.
9 // Copyright 2003-2008 Novell, Inc.
10 // Copyright 2011 Xamarin Inc
11 //
12 using System;
13 using System.Collections.Generic;
14 using System.Linq;
15 using Mono.CompilerServices.SymbolWriter;
16
17 namespace Mono.CSharp {
18
19         public class RootNamespace : Namespace {
20
21                 readonly string alias_name;
22                 readonly Dictionary<string, Namespace> all_namespaces;
23
24                 public RootNamespace (string alias_name)
25                         : base ()
26                 {
27                         this.alias_name = alias_name;
28                         RegisterNamespace (this);
29
30                         all_namespaces = new Dictionary<string, Namespace> ();
31                         all_namespaces.Add ("", this);
32                 }
33
34                 public string Alias {
35                         get {
36                                 return alias_name;
37                         }
38                 }
39
40                 public static void Error_GlobalNamespaceRedefined (Report report, Location loc)
41                 {
42                         report.Error (1681, loc, "The global extern alias cannot be redefined");
43                 }
44
45                 //
46                 // For better error reporting where we try to guess missing using directive
47                 //
48                 public List<string> FindTypeNamespaces (IMemberContext ctx, string name, int arity)
49                 {
50                         List<string> res = null;
51
52                         foreach (var ns in all_namespaces) {
53                                 var type = ns.Value.LookupType (ctx, name, arity, LookupMode.Normal, Location.Null);
54                                 if (type != null) {
55                                         if (res == null)
56                                                 res = new List<string> ();
57
58                                         res.Add (ns.Key);
59                                 }
60                         }
61
62                         return res;
63                 }
64
65                 //
66                 // For better error reporting where compiler tries to guess missing using directive
67                 //
68                 public List<string> FindExtensionMethodNamespaces (IMemberContext ctx, string name, int arity)
69                 {
70                         List<string> res = null;
71
72                         foreach (var ns in all_namespaces) {
73                                 var methods = ns.Value.LookupExtensionMethod (ctx, name, arity);
74                                 if (methods != null) {
75                                         if (res == null)
76                                                 res = new List<string> ();
77
78                                         res.Add (ns.Key);
79                                 }
80                         }
81
82                         return res;
83                 }
84
85                 public void RegisterNamespace (Namespace child)
86                 {
87                         if (child != this)
88                                 all_namespaces.Add (child.Name, child);
89                 }
90
91                 public override string GetSignatureForError ()
92                 {
93                         return alias_name + "::";
94                 }
95         }
96
97         public sealed class GlobalRootNamespace : RootNamespace
98         {
99                 public GlobalRootNamespace ()
100                         : base ("global")
101                 {
102                 }
103         }
104
105         //
106         // Namespace cache for imported and compiled namespaces
107         //
108         public class Namespace
109         {
110                 readonly Namespace parent;
111                 string fullname;
112                 protected Dictionary<string, Namespace> namespaces;
113                 protected Dictionary<string, IList<TypeSpec>> types;
114                 List<TypeSpec> extension_method_types;
115                 Dictionary<string, TypeSpec> cached_types;
116                 bool cls_checked;
117
118                 /// <summary>
119                 ///   Constructor Takes the current namespace and the
120                 ///   name.  This is bootstrapped with parent == null
121                 ///   and name = ""
122                 /// </summary>
123                 public Namespace (Namespace parent, string name)
124                         : this ()
125                 {
126                         if (name == null)
127                                 throw new ArgumentNullException ("name");
128
129                         this.parent = parent;
130
131                         string pname = parent != null ? parent.fullname : null;
132                                 
133                         if (pname == null)
134                                 fullname = name;
135                         else
136                                 fullname = pname + "." + name;
137
138                         while (parent.parent != null)
139                                 parent = parent.parent;
140
141                         var root = parent as RootNamespace;
142                         if (root == null)
143                                 throw new InternalErrorException ("Root namespaces must be created using RootNamespace");
144
145                         root.RegisterNamespace (this);
146                 }
147
148                 protected Namespace ()
149                 {
150                         namespaces = new Dictionary<string, Namespace> ();
151                         cached_types = new Dictionary<string, TypeSpec> ();
152                 }
153
154                 #region Properties
155
156                 /// <summary>
157                 ///   The qualified name of the current namespace
158                 /// </summary>
159                 public string Name {
160                         get { return fullname; }
161                 }
162
163                 /// <summary>
164                 ///   The parent of this namespace, used by the parser to "Pop"
165                 ///   the current namespace declaration
166                 /// </summary>
167                 public Namespace Parent {
168                         get { return parent; }
169                 }
170
171                 #endregion
172
173                 public Namespace AddNamespace (MemberName name)
174                 {
175                         var ns_parent = name.Left == null ? this : AddNamespace (name.Left);
176                         return ns_parent.TryAddNamespace (name.Basename);
177                 }
178
179                 Namespace TryAddNamespace (string name)
180                 {
181                         Namespace ns;
182
183                         if (!namespaces.TryGetValue (name, out ns)) {
184                                 ns = new Namespace (this, name);
185                                 namespaces.Add (name, ns);
186                         }
187
188                         return ns;
189                 }
190
191                 public bool TryGetNamespace (string name, out Namespace ns)
192                 {
193                         return namespaces.TryGetValue (name, out ns);
194                 }
195
196                 // TODO: Replace with CreateNamespace where MemberName is created for the method call
197                 public Namespace GetNamespace (string name, bool create)
198                 {
199                         int pos = name.IndexOf ('.');
200
201                         Namespace ns;
202                         string first;
203                         if (pos >= 0)
204                                 first = name.Substring (0, pos);
205                         else
206                                 first = name;
207
208                         if (!namespaces.TryGetValue (first, out ns)) {
209                                 if (!create)
210                                         return null;
211
212                                 ns = new Namespace (this, first);
213                                 namespaces.Add (first, ns);
214                         }
215
216                         if (pos >= 0)
217                                 ns = ns.GetNamespace (name.Substring (pos + 1), create);
218
219                         return ns;
220                 }
221
222                 public IList<TypeSpec> GetAllTypes (string name)
223                 {
224                         IList<TypeSpec> found;
225                         if (types == null || !types.TryGetValue (name, out found))
226                                 return null;
227
228                         return found;
229                 }
230
231                 public virtual string GetSignatureForError ()
232                 {
233                         return fullname;
234                 }
235
236                 public TypeSpec LookupType (IMemberContext ctx, string name, int arity, LookupMode mode, Location loc)
237                 {
238                         if (types == null)
239                                 return null;
240
241                         TypeSpec best = null;
242                         if (arity == 0 && cached_types.TryGetValue (name, out best)) {
243                                 if (best != null || mode != LookupMode.IgnoreAccessibility)
244                                         return best;
245                         }
246
247                         IList<TypeSpec> found;
248                         if (!types.TryGetValue (name, out found))
249                                 return null;
250
251                         foreach (var ts in found) {
252                                 if (ts.Arity == arity) {
253                                         if (best == null) {
254                                                 if ((ts.Modifiers & Modifiers.INTERNAL) != 0 && !ts.MemberDefinition.IsInternalAsPublic (ctx.Module.DeclaringAssembly) && mode != LookupMode.IgnoreAccessibility)
255                                                         continue;
256
257                                                 best = ts;
258                                                 continue;
259                                         }
260
261                                         if (best.MemberDefinition.IsImported && ts.MemberDefinition.IsImported) {
262                                                 if (ts.Kind == MemberKind.MissingType)
263                                                         continue;
264
265                                                 if (best.Kind == MemberKind.MissingType) {
266                                                         best = ts;
267                                                         continue;
268                                                 }
269
270                                                 if (mode == LookupMode.Normal) {
271                                                         ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (best);
272                                                         ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (ts);
273                                                         ctx.Module.Compiler.Report.Error (433, loc, "The imported type `{0}' is defined multiple times", ts.GetSignatureForError ());
274                                                 }
275
276                                                 break;
277                                         }
278
279                                         if (best.MemberDefinition.IsImported)
280                                                 best = ts;
281
282                                         if ((best.Modifiers & Modifiers.INTERNAL) != 0 && !best.MemberDefinition.IsInternalAsPublic (ctx.Module.DeclaringAssembly))
283                                                 continue;
284
285                                         if (mode != LookupMode.Normal)
286                                                 continue;
287
288                                         if (ts.MemberDefinition.IsImported) {
289                                                 ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (best);
290                                                 ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (ts);
291                                         }
292
293                                         ctx.Module.Compiler.Report.Warning (436, 2, loc,
294                                                 "The type `{0}' conflicts with the imported type of same name'. Ignoring the imported type definition",
295                                                 best.GetSignatureForError ());
296                                 }
297
298                                 //
299                                 // Lookup for the best candidate with the closest arity match
300                                 //
301                                 if (arity < 0) {
302                                         if (best == null) {
303                                                 best = ts;
304                                         } else if (System.Math.Abs (ts.Arity + arity) < System.Math.Abs (best.Arity + arity)) {
305                                                 best = ts;
306                                         }
307                                 }
308                         }
309
310                         // TODO MemberCache: Cache more
311                         if (arity == 0 && mode == LookupMode.Normal)
312                                 cached_types.Add (name, best);
313
314                         return best;
315                 }
316
317                 public FullNamedExpression LookupTypeOrNamespace (IMemberContext ctx, string name, int arity, LookupMode mode, Location loc)
318                 {
319                         var texpr = LookupType (ctx, name, arity, mode, loc);
320
321                         Namespace ns;
322                         if (arity == 0 && namespaces.TryGetValue (name, out ns)) {
323                                 if (texpr == null)
324                                         return new NamespaceExpression (ns, loc);
325
326                                 if (mode != LookupMode.Probing) {
327                                         //ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (texpr.Type);
328                                         // ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (ns.loc, "");
329                                         ctx.Module.Compiler.Report.Warning (437, 2, loc,
330                                                 "The type `{0}' conflicts with the imported namespace `{1}'. Using the definition found in the source file",
331                                                 texpr.GetSignatureForError (), ns.GetSignatureForError ());
332                                 }
333
334                                 if (texpr.MemberDefinition.IsImported)
335                                         return new NamespaceExpression (ns, loc);
336                         }
337
338                         if (texpr == null)
339                                 return null;
340
341                         return new TypeExpression (texpr, loc);
342                 }
343
344                 //
345                 // Completes types with the given `prefix'
346                 //
347                 public IEnumerable<string> CompletionGetTypesStartingWith (string prefix)
348                 {
349                         if (types == null)
350                                 return Enumerable.Empty<string> ();
351
352                         var res = from item in types
353                                           where item.Key.StartsWith (prefix) && item.Value.Any (l => (l.Modifiers & Modifiers.PUBLIC) != 0)
354                                           select item.Key;
355
356                         if (namespaces != null)
357                                 res = res.Concat (from item in namespaces where item.Key.StartsWith (prefix) select item.Key);
358
359                         return res;
360                 }
361
362                 // 
363                 // Looks for extension method in this namespace
364                 //
365                 public List<MethodSpec> LookupExtensionMethod (IMemberContext invocationContext, string name, int arity)
366                 {
367                         if (extension_method_types == null)
368                                 return null;
369
370                         List<MethodSpec> found = null;
371                         for (int i = 0; i < extension_method_types.Count; ++i) {
372                                 var ts = extension_method_types[i];
373
374                                 //
375                                 // When the list was built we didn't know what members the type
376                                 // contains
377                                 //
378                                 if ((ts.Modifiers & Modifiers.METHOD_EXTENSION) == 0) {
379                                         if (extension_method_types.Count == 1) {
380                                                 extension_method_types = null;
381                                                 return found;
382                                         }
383
384                                         extension_method_types.RemoveAt (i--);
385                                         continue;
386                                 }
387
388                                 var res = ts.MemberCache.FindExtensionMethods (invocationContext, name, arity);
389                                 if (res == null)
390                                         continue;
391
392                                 if (found == null) {
393                                         found = res;
394                                 } else {
395                                         found.AddRange (res);
396                                 }
397                         }
398
399                         return found;
400                 }
401
402                 public void AddType (ModuleContainer module, TypeSpec ts)
403                 {
404                         if (types == null) {
405                                 types = new Dictionary<string, IList<TypeSpec>> (64);
406                         }
407
408                         if (ts.IsClass && ts.Arity == 0) {
409                                 var extension_method_allowed = ts.MemberDefinition.IsImported ? (ts.Modifiers & Modifiers.METHOD_EXTENSION) != 0 : (ts.IsStatic || ts.MemberDefinition.IsPartial);
410                                 if (extension_method_allowed) {
411                                         if (extension_method_types == null)
412                                                 extension_method_types = new List<TypeSpec> ();
413
414                                         extension_method_types.Add (ts);
415                                 }
416                         }
417
418                         var name = ts.Name;
419                         IList<TypeSpec> existing;
420                         if (types.TryGetValue (name, out existing)) {
421                                 TypeSpec better_type;
422                                 TypeSpec found;
423                                 if (existing.Count == 1) {
424                                         found = existing[0];
425                                         if (ts.Arity == found.Arity) {
426                                                 better_type = IsImportedTypeOverride (module, ts, found);
427                                                 if (better_type == found)
428                                                         return;
429
430                                                 if (better_type != null) {
431                                                         existing [0] = better_type;
432                                                         return;
433                                                 }
434                                         }
435
436                                         existing = new List<TypeSpec> ();
437                                         existing.Add (found);
438                                         types[name] = existing;
439                                 } else {
440                                         for (int i = 0; i < existing.Count; ++i) {
441                                                 found = existing[i];
442                                                 if (ts.Arity != found.Arity)
443                                                         continue;
444
445                                                 better_type = IsImportedTypeOverride (module, ts, found);
446                                                 if (better_type == found)
447                                                         return;
448
449                                                 if (better_type != null) {
450                                                         existing.RemoveAt (i);
451                                                         --i;
452                                                         continue;
453                                                 }
454                                         }
455                                 }
456
457                                 existing.Add (ts);
458                         } else {
459                                 types.Add (name, new TypeSpec[] { ts });
460                         }
461                 }
462
463                 //
464                 // We import any types but in the situation there are same types
465                 // but one has better visibility (either public or internal with friend)
466                 // the less visible type is removed from the namespace cache
467                 //
468                 public static TypeSpec IsImportedTypeOverride (ModuleContainer module, TypeSpec ts, TypeSpec found)
469                 {
470                         var ts_accessible = (ts.Modifiers & Modifiers.PUBLIC) != 0 || ts.MemberDefinition.IsInternalAsPublic (module.DeclaringAssembly);
471                         var found_accessible = (found.Modifiers & Modifiers.PUBLIC) != 0 || found.MemberDefinition.IsInternalAsPublic (module.DeclaringAssembly);
472
473                         if (ts_accessible && !found_accessible)
474                                 return ts;
475
476                         // found is better always better for accessible or inaccessible ts
477                         if (!ts_accessible)
478                                 return found;
479
480                         return null;
481                 }
482
483                 public void RemoveContainer (TypeContainer tc)
484                 {
485                         types.Remove (tc.Basename);
486                         cached_types.Remove (tc.Basename);
487                 }
488
489                 public void SetBuiltinType (BuiltinTypeSpec pts)
490                 {
491                         var found = types[pts.Name];
492                         cached_types.Remove (pts.Name);
493                         if (found.Count == 1) {
494                                 types[pts.Name][0] = pts;
495                         } else {
496                                 throw new NotImplementedException ();
497                         }
498                 }
499
500                 public void VerifyClsCompliance ()
501                 {
502                         if (types == null || cls_checked)
503                                 return;
504
505                         cls_checked = true;
506
507                         // TODO: This is quite ugly way to check for CLS compliance at namespace level
508
509                         var locase_types = new Dictionary<string, List<TypeSpec>> (StringComparer.OrdinalIgnoreCase);
510                         foreach (var tgroup in types.Values) {
511                                 foreach (var tm in tgroup) {
512                                         if ((tm.Modifiers & Modifiers.PUBLIC) == 0 || !tm.IsCLSCompliant ())
513                                                 continue;
514
515                                         List<TypeSpec> found;
516                                         if (!locase_types.TryGetValue (tm.Name, out found)) {
517                                                 found = new List<TypeSpec> ();
518                                                 locase_types.Add (tm.Name, found);
519                                         }
520
521                                         found.Add (tm);
522                                 }
523                         }
524
525                         foreach (var locase in locase_types.Values) {
526                                 if (locase.Count < 2)
527                                         continue;
528
529                                 bool all_same = true;
530                                 foreach (var notcompliant in locase) {
531                                         all_same = notcompliant.Name == locase[0].Name;
532                                         if (!all_same)
533                                                 break;
534                                 }
535
536                                 if (all_same)
537                                         continue;
538
539                                 TypeContainer compiled = null;
540                                 foreach (var notcompliant in locase) {
541                                         if (!notcompliant.MemberDefinition.IsImported) {
542                                                 if (compiled != null)
543                                                         compiled.Compiler.Report.SymbolRelatedToPreviousError (compiled);
544
545                                                 compiled = notcompliant.MemberDefinition as TypeContainer;
546                                         } else {
547                                                 compiled.Compiler.Report.SymbolRelatedToPreviousError (notcompliant);
548                                         }
549                                 }
550
551                                 compiled.Compiler.Report.Warning (3005, 1, compiled.Location,
552                                         "Identifier `{0}' differing only in case is not CLS-compliant", compiled.GetSignatureForError ());
553                         }
554                 }
555         }
556
557         public class CompilationSourceFile : NamespaceContainer
558         {
559                 readonly SourceFile file;
560                 CompileUnitEntry comp_unit;
561                 Dictionary<string, SourceFile> include_files;
562                 Dictionary<string, bool> conditionals;
563
564                 public CompilationSourceFile (ModuleContainer parent, SourceFile sourceFile)
565                         : this (parent)
566                 {
567                         this.file = sourceFile;
568                 }
569
570                 public CompilationSourceFile (ModuleContainer parent)
571                         : base (parent)
572                 {
573                 }
574
575                 public CompileUnitEntry SymbolUnitEntry {
576                         get {
577                                 return comp_unit;
578                         }
579                 }
580
581                 public string FileName {
582                         get {
583                                 return file.Name;
584                         }
585                 }
586
587                 public SourceFile SourceFile {
588                         get {
589                                 return file;
590                         }
591                 }
592
593                 public void AddIncludeFile (SourceFile file)
594                 {
595                         if (file == this.file)
596                                 return;
597
598                         if (include_files == null)
599                                 include_files = new Dictionary<string, SourceFile> ();
600
601                         if (!include_files.ContainsKey (file.FullPathName))
602                                 include_files.Add (file.FullPathName, file);
603                 }
604
605                 public void AddDefine (string value)
606                 {
607                         if (conditionals == null)
608                                 conditionals = new Dictionary<string, bool> (2);
609
610                         conditionals[value] = true;
611                 }
612
613                 public void AddUndefine (string value)
614                 {
615                         if (conditionals == null)
616                                 conditionals = new Dictionary<string, bool> (2);
617
618                         conditionals[value] = false;
619                 }
620
621                 public override void PrepareEmit ()
622                 {
623                         var sw = Module.DeclaringAssembly.SymbolWriter;
624                         if (sw != null) {
625                                 CreateUnitSymbolInfo (sw);
626                         }
627
628                         base.PrepareEmit ();
629                 }
630
631                 //
632                 // Creates symbol file index in debug symbol file
633                 //
634                 void CreateUnitSymbolInfo (MonoSymbolFile symwriter)
635                 {
636                         var si = file.CreateSymbolInfo (symwriter);
637                         comp_unit = new CompileUnitEntry (symwriter, si);
638
639                         if (include_files != null) {
640                                 foreach (SourceFile include in include_files.Values) {
641                                         si = include.CreateSymbolInfo (symwriter);
642                                         comp_unit.AddFile (si);
643                                 }
644                         }
645                 }
646
647                 public bool IsConditionalDefined (string value)
648                 {
649                         if (conditionals != null) {
650                                 bool res;
651                                 if (conditionals.TryGetValue (value, out res))
652                                         return res;
653
654                                 // When conditional was undefined
655                                 if (conditionals.ContainsKey (value))
656                                         return false;
657                         }
658
659                         return Compiler.Settings.IsConditionalSymbolDefined (value);
660                 }
661
662                 public override void Accept (StructuralVisitor visitor)
663                 {
664                         visitor.Visit (this);
665                 }
666         }
667
668
669         //
670         // Namespace block as created by the parser
671         //
672         public class NamespaceContainer : TypeContainer, IMemberContext
673         {
674                 static readonly Namespace[] empty_namespaces = new Namespace[0];
675
676                 readonly Namespace ns;
677
678                 public new readonly NamespaceContainer Parent;
679
680                 List<UsingNamespace> clauses;
681
682                 // Used by parsed to check for parser errors
683                 public bool DeclarationFound;
684
685                 Namespace[] namespace_using_table;
686                 TypeSpec[] types_using_table;
687                 Dictionary<string, UsingAliasNamespace> aliases;
688
689                 public NamespaceContainer (MemberName name, NamespaceContainer parent)
690                         : base (parent, name, null, MemberKind.Namespace)
691                 {
692                         this.Parent = parent;
693                         this.ns = parent.NS.AddNamespace (name);
694
695                         containers = new List<TypeContainer> ();
696                 }
697
698                 protected NamespaceContainer (ModuleContainer parent)
699                         : base (parent, null, null, MemberKind.Namespace)
700                 {
701                         ns = parent.GlobalRootNamespace;
702                         containers = new List<TypeContainer> (2);
703                 }
704
705                 #region Properties
706
707                 public override AttributeTargets AttributeTargets {
708                         get {
709                                 throw new NotSupportedException ();
710                         }
711                 }
712
713                 public override string DocCommentHeader {
714                         get {
715                                 throw new NotSupportedException ();
716                         }
717                 }
718
719                 public Namespace NS {
720                         get {
721                                 return ns;
722                         }
723                 }
724
725                 public List<UsingNamespace> Usings {
726                         get {
727                                 return clauses;
728                         }
729                 }
730
731                 public override string[] ValidAttributeTargets {
732                         get {
733                                 throw new NotSupportedException ();
734                         }
735                 }
736
737                 #endregion
738
739                 public void AddUsing (UsingNamespace un)
740                 {
741                         if (DeclarationFound){
742                                 Compiler.Report.Error (1529, un.Location, "A using clause must precede all other namespace elements except extern alias declarations");
743                         }
744
745                         if (clauses == null)
746                                 clauses = new List<UsingNamespace> ();
747
748                         clauses.Add (un);
749                 }
750
751                 public void AddUsing (UsingAliasNamespace un)
752                 {
753                         if (DeclarationFound){
754                                 Compiler.Report.Error (1529, un.Location, "A using clause must precede all other namespace elements except extern alias declarations");
755                         }
756
757                         AddAlias (un);
758                 }
759
760                 void AddAlias (UsingAliasNamespace un)
761                 {
762                         if (clauses == null) {
763                                 clauses = new List<UsingNamespace> ();
764                         } else {
765                                 foreach (var entry in clauses) {
766                                         var a = entry as UsingAliasNamespace;
767                                         if (a != null && a.Alias.Value == un.Alias.Value) {
768                                                 Compiler.Report.SymbolRelatedToPreviousError (a.Location, "");
769                                                 Compiler.Report.Error (1537, un.Location,
770                                                         "The using alias `{0}' appeared previously in this namespace", un.Alias.Value);
771                                         }
772                                 }
773                         }
774
775                         clauses.Add (un);
776                 }
777
778                 public override void AddPartial (TypeDefinition next_part)
779                 {
780                         var existing = ns.LookupType (this, next_part.MemberName.Name, next_part.MemberName.Arity, LookupMode.Probing, Location.Null);
781                         var td = existing != null ? existing.MemberDefinition as TypeDefinition : null;
782                         AddPartial (next_part, td);
783                 }
784
785                 public override void AddTypeContainer (TypeContainer tc)
786                 {
787                         string name = tc.Basename;
788
789                         var mn = tc.MemberName;
790                         while (mn.Left != null) {
791                                 mn = mn.Left;
792                                 name = mn.Name;
793                         }
794
795                         var names_container = Parent == null ? Module : (TypeContainer) this;
796
797                         MemberCore mc;
798                         if (names_container.DefinedNames.TryGetValue (name, out mc)) {
799                                 if (tc is NamespaceContainer && mc is NamespaceContainer) {
800                                         AddTypeContainerMember (tc);
801                                         return;
802                                 }
803
804                                 Report.SymbolRelatedToPreviousError (mc);
805                                 if ((mc.ModFlags & Modifiers.PARTIAL) != 0 && (tc is ClassOrStruct || tc is Interface)) {
806                                         Error_MissingPartialModifier (tc);
807                                 } else {
808                                         Report.Error (101, tc.Location, "The namespace `{0}' already contains a definition for `{1}'",
809                                                 GetSignatureForError (), mn.GetSignatureForError ());
810                                 }
811                         } else {
812                                 names_container.DefinedNames.Add (name, tc);
813
814                                 var tdef = tc.PartialContainer;
815                                 if (tdef != null) {
816                                         //
817                                         // Same name conflict in different namespace containers
818                                         //
819                                         var conflict = ns.GetAllTypes (name);
820                                         if (conflict != null) {
821                                                 foreach (var e in conflict) {
822                                                         if (e.Arity == mn.Arity) {
823                                                                 mc = (MemberCore) e.MemberDefinition;
824                                                                 break;
825                                                         }
826                                                 }
827                                         }
828
829                                         if (mc != null) {
830                                                 Report.SymbolRelatedToPreviousError (mc);
831                                                 Report.Error (101, tc.Location, "The namespace `{0}' already contains a definition for `{1}'",
832                                                         GetSignatureForError (), mn.GetSignatureForError ());
833                                         } else {
834                                                 ns.AddType (Module, tdef.Definition);
835                                         }
836                                 }
837                         }
838
839                         base.AddTypeContainer (tc);
840                 }
841
842                 public override void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, PredefinedAttributes pa)
843                 {
844                         throw new NotSupportedException ();
845                 }
846
847                 public override void EmitContainer ()
848                 {
849                         VerifyClsCompliance ();
850
851                         base.EmitContainer ();
852                 }
853
854                 public ExtensionMethodCandidates LookupExtensionMethod (IMemberContext invocationContext, TypeSpec extensionType, string name, int arity, int position)
855                 {
856                         //
857                         // Here we try to resume the search for extension method at the point
858                         // where the last bunch of candidates was found. It's more tricky than
859                         // it seems as we have to check both namespace containers and namespace
860                         // in correct order.
861                         //
862                         // Consider:
863                         // 
864                         // namespace A {
865                         //      using N1;
866                         //  namespace B.C.D {
867                         //              <our first search found candidates in A.B.C.D
868                         //  }
869                         // }
870                         //
871                         // In the example above namespace A.B.C.D, A.B.C and A.B have to be
872                         // checked before we hit A.N1 using
873                         //
874                         ExtensionMethodCandidates candidates;
875                         var container = this;
876                         do {
877                                 candidates = container.LookupExtensionMethodCandidates (invocationContext, name, arity, ref position);
878                                 if (candidates != null || container.MemberName == null)
879                                         return candidates;
880
881                                 var container_ns = container.ns.Parent;
882                                 var mn = container.MemberName.Left;
883                                 int already_checked = position - 2;
884                                 while (already_checked-- > 0) {
885                                         mn = mn.Left;
886                                         container_ns = container_ns.Parent;
887                                 }
888
889                                 while (mn != null) {
890                                         ++position;
891
892                                         var methods = container_ns.LookupExtensionMethod (invocationContext, name, arity);
893                                         if (methods != null) {
894                                                 return new ExtensionMethodCandidates (invocationContext, methods, container, position);
895                                         }
896
897                                         mn = mn.Left;
898                                         container_ns = container_ns.Parent;
899                                 }
900
901                                 position = 0;
902                                 container = container.Parent;
903                         } while (container != null);
904
905                         return null;
906                 }
907
908                 ExtensionMethodCandidates LookupExtensionMethodCandidates (IMemberContext invocationContext, string name, int arity, ref int position)
909                 {
910                         List<MethodSpec> candidates = null;
911
912                         if (position == 0) {
913                                 ++position;
914
915                                 candidates = ns.LookupExtensionMethod (invocationContext, name, arity);
916                                 if (candidates != null) {
917                                         return new ExtensionMethodCandidates (invocationContext, candidates, this, position);
918                                 }
919                         }
920
921                         if (position == 1) {
922                                 ++position;
923
924                                 foreach (Namespace n in namespace_using_table) {
925                                         var a = n.LookupExtensionMethod (invocationContext, name, arity);
926                                         if (a == null)
927                                                 continue;
928
929                                         if (candidates == null)
930                                                 candidates = a;
931                                         else
932                                                 candidates.AddRange (a);
933                                 }
934
935                                 if (candidates != null)
936                                         return new ExtensionMethodCandidates (invocationContext, candidates, this, position);
937                         }
938
939                         // LAMESPEC: TODO no spec about priority over normal extension methods yet
940                         if (types_using_table != null) {
941                                 foreach (var t in types_using_table) {
942
943                                         var res = t.MemberCache.FindExtensionMethods (invocationContext, name, arity);
944                                         if (res == null)
945                                                 continue;
946
947                                         if (candidates == null)
948                                                 candidates = res;
949                                         else
950                                                 candidates.AddRange (res);
951                                 }
952
953                                 if (candidates != null)
954                                         return new ExtensionMethodCandidates (invocationContext, candidates, this, position);
955                         }
956
957                         return null;
958                 }
959
960                 public override FullNamedExpression LookupNamespaceOrType (string name, int arity, LookupMode mode, Location loc)
961                 {
962                         //
963                         // Only simple names (no dots) will be looked up with this function
964                         //
965                         FullNamedExpression resolved;
966                         for (NamespaceContainer container = this; container != null; container = container.Parent) {
967                                 resolved = container.Lookup (name, arity, mode, loc);
968                                 if (resolved != null || container.MemberName == null)
969                                         return resolved;
970
971                                 var container_ns = container.ns.Parent;
972                                 var mn = container.MemberName.Left;
973                                 while (mn != null) {
974                                         resolved = container_ns.LookupTypeOrNamespace (this, name, arity, mode, loc);
975                                         if (resolved != null)
976                                                 return resolved;
977
978                                         mn = mn.Left;
979                                         container_ns = container_ns.Parent;
980                                 }
981                         }
982
983                         return null;
984                 }
985
986                 public override void GetCompletionStartingWith (string prefix, List<string> results)
987                 {
988                         if (Usings == null)
989                                 return;
990
991                         foreach (var un in Usings) {
992                                 if (un.Alias != null)
993                                         continue;
994
995                                 var name = un.NamespaceExpression.Name;
996                                 if (name.StartsWith (prefix))
997                                         results.Add (name);
998                         }
999
1000
1001                         IEnumerable<string> all = Enumerable.Empty<string> ();
1002
1003                         foreach (Namespace using_ns in namespace_using_table) {
1004                                 if (prefix.StartsWith (using_ns.Name)) {
1005                                         int ld = prefix.LastIndexOf ('.');
1006                                         if (ld != -1) {
1007                                                 string rest = prefix.Substring (ld + 1);
1008
1009                                                 all = all.Concat (using_ns.CompletionGetTypesStartingWith (rest));
1010                                         }
1011                                 }
1012                                 all = all.Concat (using_ns.CompletionGetTypesStartingWith (prefix));
1013                         }
1014
1015                         results.AddRange (all);
1016
1017                         base.GetCompletionStartingWith (prefix, results);
1018                 }
1019
1020                 
1021                 //
1022                 // Looks-up a alias named @name in this and surrounding namespace declarations
1023                 //
1024                 public FullNamedExpression LookupExternAlias (string name)
1025                 {
1026                         if (aliases == null)
1027                                 return null;
1028
1029                         UsingAliasNamespace uan;
1030                         if (aliases.TryGetValue (name, out uan) && uan is UsingExternAlias)
1031                                 return uan.ResolvedExpression;
1032
1033                         return null;
1034                 }
1035                 
1036                 //
1037                 // Looks-up a alias named @name in this and surrounding namespace declarations
1038                 //
1039                 public override FullNamedExpression LookupNamespaceAlias (string name)
1040                 {
1041                         for (NamespaceContainer n = this; n != null; n = n.Parent) {
1042                                 if (n.aliases == null)
1043                                         continue;
1044
1045                                 UsingAliasNamespace uan;
1046                                 if (n.aliases.TryGetValue (name, out uan))
1047                                         return uan.ResolvedExpression;
1048                         }
1049
1050                         return null;
1051                 }
1052
1053                 FullNamedExpression Lookup (string name, int arity, LookupMode mode, Location loc)
1054                 {
1055                         //
1056                         // Check whether it's in the namespace.
1057                         //
1058                         FullNamedExpression fne = ns.LookupTypeOrNamespace (this, name, arity, mode, loc);
1059
1060                         //
1061                         // Check aliases. 
1062                         //
1063                         if (aliases != null && arity == 0) {
1064                                 UsingAliasNamespace uan;
1065                                 if (aliases.TryGetValue (name, out uan)) {
1066                                         if (fne != null && mode != LookupMode.Probing) {
1067                                                 // TODO: Namespace has broken location
1068                                                 //Report.SymbolRelatedToPreviousError (fne.Location, null);
1069                                                 Compiler.Report.SymbolRelatedToPreviousError (uan.Location, null);
1070                                                 Compiler.Report.Error (576, loc,
1071                                                         "Namespace `{0}' contains a definition with same name as alias `{1}'",
1072                                                         GetSignatureForError (), name);
1073                                         }
1074
1075                                         return uan.ResolvedExpression;
1076                                 }
1077                         }
1078
1079                         if (fne != null)
1080                                 return fne;
1081
1082                         //
1083                         // Lookup can be called before the namespace is defined from different namespace using alias clause
1084                         //
1085                         if (namespace_using_table == null) {
1086                                 DoDefineNamespace ();
1087                         }
1088
1089                         //
1090                         // Check using entries.
1091                         //
1092                         FullNamedExpression match = null;
1093                         foreach (Namespace using_ns in namespace_using_table) {
1094                                 //
1095                                 // A using directive imports only types contained in the namespace, it
1096                                 // does not import any nested namespaces
1097                                 //
1098                                 var t = using_ns.LookupType (this, name, arity, mode, loc);
1099                                 if (t == null)
1100                                         continue;
1101
1102                                 fne = new TypeExpression (t, loc);
1103                                 if (match == null) {
1104                                         match = fne;
1105                                         continue;
1106                                 }
1107
1108                                 // Prefer types over namespaces
1109                                 var texpr_fne = fne as TypeExpr;
1110                                 var texpr_match = match as TypeExpr;
1111                                 if (texpr_fne != null && texpr_match == null) {
1112                                         match = fne;
1113                                         continue;
1114                                 } else if (texpr_fne == null) {
1115                                         continue;
1116                                 }
1117
1118                                 // It can be top level accessibility only
1119                                 var better = Namespace.IsImportedTypeOverride (Module, texpr_match.Type, texpr_fne.Type);
1120                                 if (better == null) {
1121                                         if (mode == LookupMode.Normal) {
1122                                                 Compiler.Report.SymbolRelatedToPreviousError (texpr_match.Type);
1123                                                 Compiler.Report.SymbolRelatedToPreviousError (texpr_fne.Type);
1124                                                 Compiler.Report.Error (104, loc, "`{0}' is an ambiguous reference between `{1}' and `{2}'",
1125                                                         name, texpr_match.GetSignatureForError (), texpr_fne.GetSignatureForError ());
1126                                         }
1127
1128                                         return match;
1129                                 }
1130
1131                                 if (better == texpr_fne.Type)
1132                                         match = texpr_fne;
1133                         }
1134
1135                         return match;
1136                 }
1137
1138                 public static MethodGroupExpr LookupStaticUsings (IMemberContext mc, string name, int arity, Location loc)
1139                 {
1140                         for (var m = mc.CurrentMemberDefinition; m != null; m = m.Parent) {
1141
1142                                 var nc = m as NamespaceContainer;
1143                                 if (nc == null)
1144                                         continue;
1145
1146                                 List<MemberSpec> candidates = null;
1147                                 if (nc.types_using_table != null) {
1148                                         foreach (var using_type in nc.types_using_table) {
1149                                                 var members = MemberCache.FindMembers (using_type, name, true);
1150                                                 if (members != null) {
1151                                                         foreach (var member in members) {
1152                                                                 if ((member.Modifiers & Modifiers.METHOD_EXTENSION) != 0)
1153                                                                         continue;
1154
1155                                                                 if (arity > 0 && member.Arity != arity)
1156                                                                         continue;
1157
1158                                                                 if (candidates == null)
1159                                                                         candidates = new List<MemberSpec> ();
1160
1161                                                                 candidates.Add (member);
1162                                                         }
1163                                                 }
1164                                         }
1165                                 }
1166
1167                                 if (candidates != null)
1168                                         return new MethodGroupExpr (candidates, null, loc);
1169                         }
1170
1171                         return null;
1172                 }
1173
1174                 protected override void DefineNamespace ()
1175                 {
1176                         if (namespace_using_table == null)
1177                                 DoDefineNamespace ();
1178
1179                         base.DefineNamespace ();
1180                 }
1181
1182                 void DoDefineNamespace ()
1183                 {
1184                         namespace_using_table = empty_namespaces;
1185
1186                         if (clauses != null) {
1187                                 List<Namespace> namespaces = null;
1188                                 List<TypeSpec> types = null;
1189
1190                                 bool post_process_using_aliases = false;
1191
1192                                 for (int i = 0; i < clauses.Count; ++i) {
1193                                         var entry = clauses[i];
1194
1195                                         if (entry.Alias != null) {
1196                                                 if (aliases == null)
1197                                                         aliases = new Dictionary<string, UsingAliasNamespace> ();
1198
1199                                                 //
1200                                                 // Aliases are not available when resolving using section
1201                                                 // except extern aliases
1202                                                 //
1203                                                 if (entry is UsingExternAlias) {
1204                                                         entry.Define (this);
1205                                                         if (entry.ResolvedExpression != null)
1206                                                                 aliases.Add (entry.Alias.Value, (UsingExternAlias) entry);
1207
1208                                                         clauses.RemoveAt (i--);
1209                                                 } else {
1210                                                         post_process_using_aliases = true;
1211                                                 }
1212
1213                                                 continue;
1214                                         }
1215
1216                                         entry.Define (this);
1217
1218                                         //
1219                                         // It's needed for repl only, when using clause cannot be resolved don't hold it in
1220                                         // global list which is resolved for each evaluation
1221                                         //
1222                                         if (entry.ResolvedExpression == null) {
1223                                                 clauses.RemoveAt (i--);
1224                                                 continue;
1225                                         }
1226
1227                                         var using_ns = entry.ResolvedExpression as NamespaceExpression;
1228                                         if (using_ns == null) {
1229
1230                                                 var type = ((TypeExpr)entry.ResolvedExpression).Type;
1231
1232                                                 if (types == null)
1233                                                         types = new List<TypeSpec> ();
1234
1235                                                 if (types.Contains (type)) {
1236                                                         Warning_DuplicateEntry (entry);
1237                                                 } else {
1238                                                         types.Add (type);
1239                                                 }
1240                                         } else {
1241                                                 if (namespaces == null)
1242                                                         namespaces = new List<Namespace> ();
1243
1244                                                 if (namespaces.Contains (using_ns.Namespace)) {
1245                                                         // Ensure we don't report the warning multiple times in repl
1246                                                         clauses.RemoveAt (i--);
1247
1248                                                         Warning_DuplicateEntry (entry);
1249                                                 } else {
1250                                                         namespaces.Add (using_ns.Namespace);
1251                                                 }
1252                                         }
1253                                 }
1254
1255                                 namespace_using_table = namespaces == null ? new Namespace [0] : namespaces.ToArray ();
1256                                 if (types != null)
1257                                         types_using_table = types.ToArray ();
1258
1259                                 if (post_process_using_aliases) {
1260                                         for (int i = 0; i < clauses.Count; ++i) {
1261                                                 var entry = clauses[i];
1262                                                 if (entry.Alias != null) {
1263                                                         entry.Define (this);
1264                                                         if (entry.ResolvedExpression != null) {
1265                                                                 aliases.Add (entry.Alias.Value, (UsingAliasNamespace) entry);
1266                                                         }
1267
1268                                                         clauses.RemoveAt (i--);
1269                                                 }
1270                                         }
1271                                 }
1272                         }
1273                 }
1274
1275                 public void EnableRedefinition ()
1276                 {
1277                         is_defined = false;
1278                         namespace_using_table = null;
1279                 }
1280
1281                 internal override void GenerateDocComment (DocumentationBuilder builder)
1282                 {
1283                         if (containers != null) {
1284                                 foreach (var tc in containers)
1285                                         tc.GenerateDocComment (builder);
1286                         }
1287                 }
1288
1289                 public override string GetSignatureForError ()
1290                 {
1291                         return MemberName == null ? "global::" : base.GetSignatureForError ();
1292                 }
1293
1294                 public override void RemoveContainer (TypeContainer cont)
1295                 {
1296                         base.RemoveContainer (cont);
1297                         NS.RemoveContainer (cont);
1298                 }
1299
1300                 protected override bool VerifyClsCompliance ()
1301                 {
1302                         if (Module.IsClsComplianceRequired ()) {
1303                                 if (MemberName != null && MemberName.Name[0] == '_') {
1304                                         Warning_IdentifierNotCompliant ();
1305                                 }
1306
1307                                 ns.VerifyClsCompliance ();
1308                                 return true;
1309                         }
1310
1311                         return false;
1312                 }
1313
1314                 void Warning_DuplicateEntry (UsingNamespace entry)
1315                 {
1316                         Compiler.Report.Warning (105, 3, entry.Location,
1317                                 "The using directive for `{0}' appeared previously in this namespace",
1318                                 entry.ResolvedExpression.GetSignatureForError ());
1319                 }
1320
1321                 public override void Accept (StructuralVisitor visitor)
1322                 {
1323                         visitor.Visit (this);
1324                 }
1325         }
1326
1327         public class UsingNamespace
1328         {
1329                 readonly ATypeNameExpression expr;
1330                 readonly Location loc;
1331                 protected FullNamedExpression resolved;
1332
1333                 public UsingNamespace (ATypeNameExpression expr, Location loc)
1334                 {
1335                         this.expr = expr;
1336                         this.loc = loc;
1337                 }
1338
1339                 #region Properties
1340
1341                 public virtual SimpleMemberName Alias {
1342                         get {
1343                                 return null;
1344                         }
1345                 }
1346
1347                 public Location Location {
1348                         get {
1349                                 return loc;
1350                         }
1351                 }
1352
1353                 public ATypeNameExpression NamespaceExpression  {
1354                         get {
1355                                 return expr;
1356                         }
1357                 }
1358
1359                 public FullNamedExpression ResolvedExpression {
1360                         get {
1361                                 return resolved;
1362                         }
1363                 }
1364
1365                 #endregion
1366
1367                 public string GetSignatureForError ()
1368                 {
1369                         return expr.GetSignatureForError ();
1370                 }
1371
1372                 public virtual void Define (NamespaceContainer ctx)
1373                 {
1374                         resolved = expr.ResolveAsTypeOrNamespace (ctx);
1375                         var ns = resolved as NamespaceExpression;
1376                         if (ns != null)
1377                                 return;
1378
1379                         if (resolved != null) {
1380                                 var compiler = ctx.Module.Compiler;
1381                                 var type = resolved.Type;
1382                                 if (compiler.Settings.Version >= LanguageVersion.V_6) {
1383                                         if (!type.IsClass || !type.IsStatic) {
1384                                                 compiler.Report.SymbolRelatedToPreviousError (type);
1385                                                 compiler.Report.Error (7007, Location,
1386                                                         "`{0}' is not a static class. A using namespace directive can only be applied to static classes or namespace",
1387                                                         GetSignatureForError ());
1388                                         }
1389
1390                                         return;
1391                                 }
1392
1393                                 compiler.Report.SymbolRelatedToPreviousError (type);
1394                                 compiler.Report.Error (138, Location,
1395                                         "`{0}' is a type not a namespace. A using namespace directive can only be applied to namespaces",
1396                                         GetSignatureForError ());
1397                         }
1398                 }
1399
1400                 public override string ToString()
1401                 {
1402                         return resolved.ToString();
1403                 }
1404         }
1405
1406         public class UsingExternAlias : UsingAliasNamespace
1407         {
1408                 public UsingExternAlias (SimpleMemberName alias, Location loc)
1409                         : base (alias, null, loc)
1410                 {
1411                 }
1412
1413                 public override void Define (NamespaceContainer ctx)
1414                 {
1415                         var ns = ctx.Module.GetRootNamespace (Alias.Value);
1416                         if (ns == null) {
1417                                 ctx.Module.Compiler.Report.Error (430, Location,
1418                                         "The extern alias `{0}' was not specified in -reference option",
1419                                         Alias.Value);
1420                                 return;
1421                         }
1422
1423                         resolved = new NamespaceExpression (ns, Location);
1424                 }
1425         }
1426
1427         public class UsingAliasNamespace : UsingNamespace
1428         {
1429                 readonly SimpleMemberName alias;
1430
1431                 public struct AliasContext : IMemberContext
1432                 {
1433                         readonly NamespaceContainer ns;
1434
1435                         public AliasContext (NamespaceContainer ns)
1436                         {
1437                                 this.ns = ns;
1438                         }
1439
1440                         public TypeSpec CurrentType {
1441                                 get {
1442                                         return null;
1443                                 }
1444                         }
1445
1446                         public TypeParameters CurrentTypeParameters {
1447                                 get {
1448                                         return null;
1449                                 }
1450                         }
1451
1452                         public MemberCore CurrentMemberDefinition {
1453                                 get {
1454                                         return null;
1455                                 }
1456                         }
1457
1458                         public bool IsObsolete {
1459                                 get {
1460                                         return false;
1461                                 }
1462                         }
1463
1464                         public bool IsUnsafe {
1465                                 get {
1466                                         throw new NotImplementedException ();
1467                                 }
1468                         }
1469
1470                         public bool IsStatic {
1471                                 get {
1472                                         throw new NotImplementedException ();
1473                                 }
1474                         }
1475
1476                         public ModuleContainer Module {
1477                                 get {
1478                                         return ns.Module;
1479                                 }
1480                         }
1481
1482                         public string GetSignatureForError ()
1483                         {
1484                                 throw new NotImplementedException ();
1485                         }
1486
1487                         public ExtensionMethodCandidates LookupExtensionMethod (TypeSpec extensionType, string name, int arity)
1488                         {
1489                                 return null;
1490                         }
1491
1492                         public FullNamedExpression LookupNamespaceOrType (string name, int arity, LookupMode mode, Location loc)
1493                         {
1494                                 var fne = ns.NS.LookupTypeOrNamespace (ns, name, arity, mode, loc);
1495                                 if (fne != null)
1496                                         return fne;
1497
1498                                 //
1499                                 // Only extern aliases are allowed in this context
1500                                 //
1501                                 fne = ns.LookupExternAlias (name);
1502                                 if (fne != null || ns.MemberName == null)
1503                                         return fne;
1504
1505                                 var container_ns = ns.NS.Parent;
1506                                 var mn = ns.MemberName.Left;
1507                                 while (mn != null) {
1508                                         fne = container_ns.LookupTypeOrNamespace (this, name, arity, mode, loc);
1509                                         if (fne != null)
1510                                                 return fne;
1511
1512                                         mn = mn.Left;
1513                                         container_ns = container_ns.Parent;
1514                                 }
1515
1516                                 if (ns.Parent != null)
1517                                         return ns.Parent.LookupNamespaceOrType (name, arity, mode, loc);
1518
1519                                 return null;
1520                         }
1521
1522                         public FullNamedExpression LookupNamespaceAlias (string name)
1523                         {
1524                                 return ns.LookupNamespaceAlias (name);
1525                         }
1526                 }
1527
1528                 public UsingAliasNamespace (SimpleMemberName alias, ATypeNameExpression expr, Location loc)
1529                         : base (expr, loc)
1530                 {
1531                         this.alias = alias;
1532                 }
1533
1534                 public override SimpleMemberName Alias {
1535                         get {
1536                                 return alias;
1537                         }
1538                 }
1539
1540                 public override void Define (NamespaceContainer ctx)
1541                 {
1542                         //
1543                         // The namespace-or-type-name of a using-alias-directive is resolved as if
1544                         // the immediately containing compilation unit or namespace body had no
1545                         // using-directives. A using-alias-directive may however be affected
1546                         // by extern-alias-directives in the immediately containing compilation
1547                         // unit or namespace body
1548                         //
1549                         // We achieve that by introducing alias-context which redirect any local
1550                         // namespace or type resolve calls to parent namespace
1551                         //
1552                         resolved = NamespaceExpression.ResolveAsTypeOrNamespace (new AliasContext (ctx));
1553                 }
1554         }
1555 }