示例#1
0
        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());
        }
示例#2
0
        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)));
        }