LookupExtensionMethod() public method

public LookupExtensionMethod ( System.TypeSpec extensionType, TypeContainer invocationContext, string name, int arity ) : List
extensionType System.TypeSpec
invocationContext TypeContainer
name string
arity int
return List
Esempio n. 1
0
        //
        // Does extension methods look up to find a method which matches name and extensionType.
        // Search starts from this namespace and continues hierarchically up to top level.
        //
        public IList <MethodSpec> LookupExtensionMethod(TypeSpec extensionType, string name, int arity, ref NamespaceContainer scope)
        {
            List <MethodSpec> candidates = null;

            foreach (Namespace n in GetUsingTable())
            {
                var a = n.LookupExtensionMethod(this, extensionType, name, arity);
                if (a == null)
                {
                    continue;
                }

                if (candidates == null)
                {
                    candidates = a;
                }
                else
                {
                    candidates.AddRange(a);
                }
            }

            scope = parent;
            if (candidates != null)
            {
                return(candidates);
            }

            if (parent == null)
            {
                return(null);
            }

            //
            // Inspect parent namespaces in namespace expression
            //
            Namespace parent_ns = ns.Parent;

            do
            {
                candidates = parent_ns.LookupExtensionMethod(this, extensionType, name, arity);
                if (candidates != null)
                {
                    return(candidates);
                }

                parent_ns = parent_ns.Parent;
            } while (parent_ns != null);

            //
            // Continue in parent scope
            //
            return(parent.LookupExtensionMethod(extensionType, name, arity, ref scope));
        }
Esempio n. 2
0
        //
        // Extension methods look up for dotted namespace names
        //
        public IList <MethodSpec> LookupExtensionMethod(IMemberContext invocationContext, TypeSpec extensionType, string name, int arity, out Namespace scope)
        {
            //
            // Inspect parent namespaces in namespace expression
            //
            scope = this;
            do
            {
                var candidates = scope.LookupExtensionMethod(invocationContext, extensionType, name, arity);
                if (candidates != null)
                {
                    return(candidates);
                }

                scope = scope.Parent;
            } while (scope != null);

            return(null);
        }
Esempio n. 3
0
		//
		// Extension methods look up for dotted namespace names
		//
		public IList<MethodSpec> LookupExtensionMethod (IMemberContext invocationContext, TypeSpec extensionType, string name, int arity, out Namespace scope)
		{
			//
			// Inspect parent namespaces in namespace expression
			//
			scope = this;
			do {
				var candidates = scope.LookupExtensionMethod (invocationContext, extensionType, name, arity);
				if (candidates != null)
					return candidates;

				scope = scope.Parent;
			} while (scope != null);

			return null;
		}
Esempio n. 4
0
        ///
        /// Does extension methods look up to find a method which matches name and extensionType.
        /// Search starts from this namespace and continues hierarchically up to top level.
        ///
        public ExtensionMethodGroupExpr LookupExtensionMethod(Type extensionType, ClassOrStruct currentClass, string name, Location loc)
        {
            ArrayList candidates = null;

            if (currentClass != null)
            {
                candidates = ns.LookupExtensionMethod(extensionType, currentClass, name);
                if (candidates != null)
                {
                    return(new ExtensionMethodGroupExpr(candidates, this, extensionType, loc));
                }
            }

            foreach (Namespace n in GetUsingTable())
            {
                ArrayList a = n.LookupExtensionMethod(extensionType, null, name);
                if (a == null)
                {
                    continue;
                }

                if (candidates == null)
                {
                    candidates = a;
                }
                else
                {
                    candidates.AddRange(a);
                }
            }

            if (candidates != null)
            {
                return(new ExtensionMethodGroupExpr(candidates, parent, extensionType, loc));
            }

            if (parent == null)
            {
                return(null);
            }

            //
            // Inspect parent namespaces in namespace expression
            //
            Namespace parent_ns = ns.Parent;

            do
            {
                candidates = parent_ns.LookupExtensionMethod(extensionType, null, name);
                if (candidates != null)
                {
                    return(new ExtensionMethodGroupExpr(candidates, parent, extensionType, loc));
                }

                parent_ns = parent_ns.Parent;
            } while (parent_ns != null);

            //
            // Continue in parent scope
            //
            return(parent.LookupExtensionMethod(extensionType, currentClass, name, loc));
        }