public Lookup ( |
||
ctx | ||
name | string | |
arity | int | |
loc | Mono.CSharp.Location | |
return | Mono.CSharp.FullNamedExpression |
private FullNamedExpression Lookup(string name, int arity, Location loc, bool ignore_cs0104) { // // Check whether it's in the namespace. // FullNamedExpression fne = ns.Lookup(Compiler, name, arity, loc); // // Check aliases. // if (using_aliases != null && arity == 0) { foreach (UsingAliasEntry ue in using_aliases) { if (ue.Alias == name) { if (fne != null) { if (Doppelganger != null) { // TODO: Namespace has broken location //Report.SymbolRelatedToPreviousError (fne.Location, null); Compiler.Report.SymbolRelatedToPreviousError(ue.Location, null); Compiler.Report.Error(576, loc, "Namespace `{0}' contains a definition with same name as alias `{1}'", GetSignatureForError(), name); } else { return(fne); } } return(ue.Resolve(Doppelganger ?? this, Doppelganger == null)); } } } if (fne != null) { if (!((fne.Type.Modifiers & Modifiers.INTERNAL) != 0 && !fne.Type.MemberDefinition.IsInternalAsPublic(RootContext.ToplevelTypes.DeclaringAssembly))) { return(fne); } } if (IsImplicit) { return(null); } // // Check using entries. // FullNamedExpression match = null; foreach (Namespace using_ns in GetUsingTable()) { // A using directive imports only types contained in the namespace, it // does not import any nested namespaces fne = using_ns.LookupType(Compiler, name, arity, false, loc); if (fne == null) { continue; } if (match == null) { match = fne; continue; } // Prefer types over namespaces var texpr_fne = fne as TypeExpr; var texpr_match = match as TypeExpr; if (texpr_fne != null && texpr_match == null) { match = fne; continue; } else if (texpr_fne == null) { continue; } if (ignore_cs0104) { return(match); } // It can be top level accessibility only var better = Namespace.IsImportedTypeOverride(texpr_match.Type, texpr_fne.Type); if (better == null) { Compiler.Report.SymbolRelatedToPreviousError(texpr_match.Type); Compiler.Report.SymbolRelatedToPreviousError(texpr_fne.Type); Compiler.Report.Error(104, loc, "`{0}' is an ambiguous reference between `{1}' and `{2}'", name, texpr_match.GetSignatureForError(), texpr_fne.GetSignatureForError()); return(match); } if (better == texpr_fne.Type) { match = texpr_fne; } } return(match); }
private FullNamedExpression Lookup(DeclSpace ds, string name, Location loc, bool ignore_cs0104) { // // Check whether it's in the namespace. // FullNamedExpression fne = ns.Lookup(ds, name, loc); // // Check aliases. // if (using_aliases != null) { foreach (UsingAliasEntry ue in using_aliases) { if (ue.Alias == name) { if (fne != null) { if (Doppelganger != null) { // TODO: Namespace has broken location //Report.SymbolRelatedToPreviousError (fne.Location, null); Report.SymbolRelatedToPreviousError(ue.Location, null); Report.Error(576, loc, "Namespace `{0}' contains a definition with same name as alias `{1}'", GetSignatureForError(), name); } else { return(fne); } } return(ue.Resolve(Doppelganger)); } } } if (fne != null) { return(fne); } if (IsImplicit) { return(null); } // // Check using entries. // FullNamedExpression match = null; foreach (Namespace using_ns in GetUsingTable()) { match = using_ns.Lookup(ds, name, loc); if (match == null || !(match is TypeExpr)) { continue; } if (fne != null) { if (!ignore_cs0104) { Error_AmbiguousTypeReference(loc, name, fne, match); } return(null); } fne = match; } return(fne); }