return null;
foreach (var ts in found) {
- if (ts.Arity == arity) {
+ if (ts.Arity == arity || mode == LookupMode.NameOf) {
if (best == null) {
if ((ts.Modifiers & Modifiers.INTERNAL) != 0 && !ts.MemberDefinition.IsInternalAsPublic (ctx.Module.DeclaringAssembly) && mode != LookupMode.IgnoreAccessibility)
continue;
if (arity == 0 && mode == LookupMode.Normal)
cached_types.Add (name, best);
+ if (best != null) {
+ var dep = best.GetMissingDependencies ();
+ if (dep != null)
+ ImportedTypeDefinition.Error_MissingDependency (ctx, dep, loc);
+ }
+
return best;
}
public void RemoveContainer (TypeContainer tc)
{
- types.Remove (tc.Basename);
- cached_types.Remove (tc.Basename);
+ IList<TypeSpec> found;
+ if (types.TryGetValue (tc.MemberName.Name, out found)) {
+ for (int i = 0; i < found.Count; ++i) {
+ if (tc.MemberName.Arity != found [i].Arity)
+ continue;
+
+ if (found.Count == 1)
+ types.Remove (tc.MemberName.Name);
+ else
+ found.RemoveAt (i);
+
+ break;
+ }
+ }
+
+ cached_types.Remove (tc.MemberName.Basename);
}
public void SetBuiltinType (BuiltinTypeSpec pts)
public override void AddTypeContainer (TypeContainer tc)
{
- string name = tc.Basename;
-
var mn = tc.MemberName;
+ var name = mn.Basename;
while (mn.Left != null) {
mn = mn.Left;
name = mn.Name;
candidates.AddRange (a);
}
- if (candidates != null)
- return new ExtensionMethodCandidates (invocationContext, candidates, this, position);
- }
+ if (types_using_table != null) {
+ foreach (var t in types_using_table) {
- // LAMESPEC: TODO no spec about priority over normal extension methods yet
- if (types_using_table != null) {
- foreach (var t in types_using_table) {
-
- var res = t.MemberCache.FindExtensionMethods (invocationContext, name, arity);
- if (res == null)
- continue;
+ var res = t.MemberCache.FindExtensionMethods (invocationContext, name, arity);
+ if (res == null)
+ continue;
- if (candidates == null)
- candidates = res;
- else
- candidates.AddRange (res);
+ if (candidates == null)
+ candidates = res;
+ else
+ candidates.AddRange (res);
+ }
}
if (candidates != null)
public virtual void Define (NamespaceContainer ctx)
{
- resolved = expr.ResolveAsTypeOrNamespace (ctx);
+ resolved = expr.ResolveAsTypeOrNamespace (ctx, false);
var ns = resolved as NamespaceExpression;
if (ns != null)
return;
// We achieve that by introducing alias-context which redirect any local
// namespace or type resolve calls to parent namespace
//
- resolved = NamespaceExpression.ResolveAsTypeOrNamespace (new AliasContext (ctx));
+ resolved = NamespaceExpression.ResolveAsTypeOrNamespace (new AliasContext (ctx), false);
}
}
}