protected override Expression DoResolve(ResolveContext ec) { Expression expr_resolved = expr.Resolve(ec, ResolveFlags.VariableOrValue | ResolveFlags.Type); if (expr_resolved == null) { return(null); } TypeSpec expr_type = expr_resolved.Type; if (expr_type.IsPointer || expr_type.Kind == MemberKind.Void || expr_type == InternalType.NullLiteral || expr_type == InternalType.AnonymousMethod) { Unary.Error_OperatorCannotBeApplied(ec, loc, ".", expr_type); return(null); } if (targs != null) { if (!targs.Resolve(ec)) { return(null); } } var results = new List <string> (); if (expr_resolved is Namespace) { Namespace nexpr = expr_resolved as Namespace; string namespaced_partial; if (partial_name == null) { namespaced_partial = nexpr.Name; } else { namespaced_partial = nexpr.Name + "." + partial_name; } #if false Console.WriteLine("Workign with: namespaced partial {0}", namespaced_partial); foreach (var x in ec.TypeContainer.NamespaceEntry.CompletionGetTypesStartingWith(ec.TypeContainer, namespaced_partial)) { Console.WriteLine(" {0}", x); } #endif CompletionSimpleName.AppendResults( results, partial_name, ec.CurrentMemberDefinition.Parent.NamespaceEntry.CompletionGetTypesStartingWith(namespaced_partial)); } else { var r = MemberCache.GetCompletitionMembers(ec, expr_type, partial_name).Select(l => l.Name); AppendResults(results, partial_name, r); } throw new CompletionResult(partial_name == null ? "" : partial_name, results.Distinct().ToArray()); }
public override Expression DoResolve(ResolveContext ec) { Expression expr_resolved = expr.Resolve(ec, ResolveFlags.VariableOrValue | ResolveFlags.Type | ResolveFlags.Intermediate | ResolveFlags.DisableStructFlowAnalysis); if (expr_resolved == null) { return(null); } Type expr_type = expr_resolved.Type; if (expr_type.IsPointer || expr_type == TypeManager.void_type || expr_type == TypeManager.null_type || expr_type == InternalType.AnonymousMethod) { Unary.Error_OperatorCannotBeApplied(ec, loc, ".", expr_type); return(null); } if (targs != null) { if (!targs.Resolve(ec)) { return(null); } } ArrayList results = new ArrayList(); if (expr_resolved is Namespace) { Namespace nexpr = expr_resolved as Namespace; string namespaced_partial; if (partial_name == null) { namespaced_partial = nexpr.Name; } else { namespaced_partial = nexpr.Name + "." + partial_name; } #if false Console.WriteLine("Workign with: namespaced partial {0}", namespaced_partial); foreach (var x in ec.TypeContainer.NamespaceEntry.CompletionGetTypesStartingWith(ec.TypeContainer, namespaced_partial)) { Console.WriteLine(" {0}", x); } #endif CompletionSimpleName.AppendResults( results, partial_name, ec.CurrentTypeDefinition.NamespaceEntry.CompletionGetTypesStartingWith(namespaced_partial)); } else { MemberInfo [] result = expr_type.FindMembers( MemberTypes.All, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public, CollectingFilter, partial_name); foreach (MemberInfo r in result) { string name; MethodBase rasb = r as MethodBase; if (rasb != null && rasb.IsSpecialName) { continue; } if (partial_name == null) { name = r.Name; } else { name = r.Name.Substring(partial_name.Length); } if (results.Contains(name)) { continue; } results.Add(name); } } throw new CompletionResult(partial_name == null ? "" : partial_name, (string [])results.ToArray(typeof(string))); }