2007-01-01 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / mcs / iterators.cs
index 6edf144054f2ca6585d8a936e0023fec8c777a2e..8720298fca897c6039fcf59d0f5efe8f9fc2ec46 100644 (file)
@@ -124,7 +124,7 @@ namespace Mono.CSharp {
                }
        }
 
-       public class IteratorHost : AnonymousMethodHost
+       public class IteratorHost : RootScopeInfo
        {
                public readonly Iterator Iterator;
 
@@ -229,6 +229,27 @@ namespace Mono.CSharp {
                        return base.DoResolveMembers ();
                }
 
+               public void CaptureScopes ()
+               {
+                       Report.Debug (128, "DEFINE ITERATOR HOST", this, scopes);
+
+                       foreach (ScopeInfo si in scopes)
+                               CaptureScope (si);
+
+                       foreach (ScopeInfo si in scopes) {
+                               if (!si.Define ())
+                                       throw new InternalErrorException ();
+                               if (si.DefineType () == null)
+                                       throw new InternalErrorException ();
+                               if (!si.ResolveType ())
+                                       throw new InternalErrorException ();
+                               if (!si.ResolveMembers ())
+                                       throw new InternalErrorException ();
+                               if (!si.DefineMembers ())
+                                       throw new InternalErrorException ();
+                       }
+               }
+
                protected override bool DoDefineMembers ()
                {
                        if (!base.DoDefineMembers ())
@@ -320,7 +341,7 @@ namespace Mono.CSharp {
                        return new IteratorHostInitializer (this);
                }
 
-               protected class IteratorHostInitializer : AnonymousMethodHostInitializer
+               protected class IteratorHostInitializer : RootScopeInitializer
                {
                        new public readonly IteratorHost Host;
                        protected Iterator.State state;
@@ -781,14 +802,18 @@ namespace Mono.CSharp {
                        get { return true; }
                }
 
-               public override AnonymousMethodHost RootScope {
+               public override RootScopeInfo RootScope {
+                       get { return IteratorHost; }
+               }
+
+               public override ScopeInfo Scope {
                        get { return IteratorHost; }
                }
 
                //
                // Our constructor
                //
-               public Iterator (IMethodData m_container, TypeContainer host, GenericMethod generic,
+               private Iterator (IMethodData m_container, DeclSpace host, GenericMethod generic,
                                 int modifiers, Type iterator_type, bool is_enumerable)
                        : base (null, host, generic, m_container.ParameterInfo,
                                new ToplevelBlock (m_container.ParameterInfo, m_container.Location),
@@ -890,6 +915,10 @@ namespace Mono.CSharp {
 
                protected override Method DoCreateMethodHost (EmitContext ec)
                {
+                       Report.Debug (128, "CREATE METHOD HOST", this, IteratorHost);
+
+                       IteratorHost.CaptureScopes ();
+
                        return new AnonymousMethodMethod (
                                this, RootScope, null, TypeManager.system_boolean_expr,
                                Modifiers.PUBLIC, new MemberName ("MoveNext", Location),
@@ -951,7 +980,7 @@ namespace Mono.CSharp {
                        }
                }
 
-               public static Iterator CreateIterator (IMethodData method, TypeContainer parent,
+               public static Iterator CreateIterator (IMethodData method, DeclSpace parent,
                                                       GenericMethod generic, int modifiers)
                {
                        bool is_enumerable;