Example #1
0
 void start_tour(Site site, ISiteseer siteseer)
 {
     if (!siteseer.view_whole(site)) {
         siteseer.begin();
         tour_each(site, siteseer);
         siteseer.end();
     }
 }
Example #2
0
 bool tour_default(Site site, out ISiteseer new_siteseer)
 {
     if (m_default_siteseer != null) {
         return m_default_siteseer.view_part(site, out new_siteseer);
     } else {
         new_siteseer = null;
         return false;
     }
 }
Example #3
0
        public void tour(object site, ISiteseer siteseer, ISiteseer default_siteseer)
        {
            if (null == site) throw new ArgumentNullException("site");
            if (null == siteseer && null == default_siteseer) throw new ArgumentNullException("siteseer and default_siteseer cannot both be null");

            m_default_siteseer = default_siteseer;

            start_tour(new Site(site), siteseer ?? default_siteseer);
        }
Example #4
0
        void tour_each(Site site, ISiteseer siteseer)
        {
            foreach (Site part in new SiteList(site)) {
                ISiteseer new_siteseer;

                if (!(siteseer.view_part(part, out new_siteseer) || tour_default(part, out new_siteseer) || siteseer.view_whole(part))) {
                    tour_each(part, siteseer);
                } else if (new_siteseer != null) {
                    start_tour(part, new_siteseer);
                }
            }
        }
Example #5
0
        public bool view_part(Site node, out ISiteseer new_op)
        {
            string prefix;

            if (node.name != null) {
                prefix = "visit";
            } else {
                prefix = "visitItem";
            }

            return
                invokeNonTerminal(prefix, node.type, node.name, out new_op) ||
                invokeTerminal(prefix+(node.name!=null?"_"+node.name:""), node.type, node.value, out new_op) ||
                invokeInline(prefix, node.type, node.name, node.value, out new_op);
        }
        public bool view_part(Site site, out ISiteseer new_siteseer)
        {
            m_count++;

            if (site.type != null) {
                object[] attrib = site.type.GetCustomAttributes(typeof(LiteralFieldAttribute), true);

                if (attrib.Length > 0) {
                    FieldInfo fi = site.type.GetField(((LiteralFieldAttribute)attrib[0]).field);

                    if (fi != null) {
                        m_collection.put(fi.GetValue(site.value));
                        new_siteseer = null;
                        return true;
                    }
                }
            }

            if (Literal.is_atom_type(site.value)) {

                new_siteseer = null;

                if (site.value is Symbol) {
                    m_collection.put(new Cons(Abbrev.quote, new Cons(site.value)));
                } else /*if (site.value != null)*/ {
                    object[] sitelist = m_parent_type.GetCustomAttributes(typeof(SiteListAttribute), false);

                    if (sitelist.Length > 0 || site.value != null) m_collection.put(site.value);
                }

                return true;
            } else {
                if (site.type != null) {
                    object[] attrib = site.type.GetCustomAttributes(typeof(RepresentativeFieldAttribute), true);

                    FieldInfo fi;

                    if (attrib.Length > 0) {
                        fi = site.type.GetField(((RepresentativeFieldAttribute)attrib[0]).field);

                        if (fi != null) {
                            object name = fi.GetValue(site.value);

                            if (name != null) {
                                object sym;
                                bool was_defined = m_symtab.TryGetValue(name, out sym);

                                if (was_defined) {
                                    if (sym == site.value) {
                                        m_collection.put(name);
                                        new_siteseer = null;
                                        return true;
                                    } else {
                                        throw new Exception();
                                    }
                                } else {
                                    m_symtab.Add(name, site.value);
                                }
                            }
                        }
                    }

                    if (site.value is object[]) {
                        ListBox list = new ListBox();
                        new_siteseer = new ConstructSiteseer(m_collection, list, m_ns, m_symtab, m_aliases);
                        return true;
                    } else if (site.value is Cons) {
                        m_collection.put(site.value);
                        new_siteseer = null;
                        return true;
                    } else {
                        object[] sitelist = m_parent_type.GetCustomAttributes(typeof(SiteListAttribute), false);

                        string name = resolve(site.type.Namespace, site.type.FullName, site.type.Name);

                        if (site.name != null && sitelist.Length == 0)
                            name = String.Format("{0}#{1}", name, site.name);

                        ProperListBox list = new ProperListBox();
                        ((IBox)list).put(Symbol.get_symbol(name));
                        new_siteseer = new ConstructSiteseer(m_collection, list, m_ns, m_symtab, m_aliases);
                        return true;
                    }
                } else {
                    new_siteseer = null;
                    return true;
                }
            }
        }
Example #7
0
        bool invokeTerminal(string method_name, Type type, object value, out ISiteseer new_op)
        {
            while (type != null) {
                Type[] types = { type };
                MethodInfo mi = GetMethod(method_name, types);

                if (mi != null) {
                    object[] args = { value };
                    Object new_visitor = mi.Invoke(m_visitor, args);

                    if (null == new_visitor) {
                        new_op = null;
                        Trace.Warning("debug: {0}.{1}({2}) did not return a new visitor", m_visitor_type.FullName, method_name, type.FullName);
                    } else {
                        new_op = new VisitSiteseer(new_visitor, m_aliases);
                    }

                    return true;
                } else {
                    Trace.Warning("debug: could not find method {0}.{1}({2}), skipping", m_visitor_type.FullName, method_name, type.FullName);
                    type = type.BaseType;
                }
            }

            new_op = null;

            return false;
        }
Example #8
0
        bool invokeNonTerminal(string prefix, Type type, string name, out ISiteseer new_method)
        {
            while (type != null) {
                string type_name = getMethodTag(type);

                if (type_name != null) {
                    if (innerCall(prefix+"_"+type_name+(name!=null?"_"+name:""), out new_method, false)) {
                        return true;
                    }
                }

                type = type.BaseType;
            }

            return innerCall(prefix+(name!=null?"_"+name:""), out new_method, true);
        }
Example #9
0
        bool invokeInline(string prefix, Type type, string name, object value, out ISiteseer new_op)
        {
            if (value != null) {
                MemberInfo[] graph_props = type.FindMembers(MemberTypes.Property|MemberTypes.Field, BindingFlags.Public|BindingFlags.Instance, null, null);
                List<Type> param_list = new List<Type>();
                List<Object> args_list = new List<Object>();

                foreach (MemberInfo p in graph_props) {
                    if (MemberTypes.Field == p.MemberType) {
                        FieldInfo fi = type.GetField(p.Name);
                        args_list.Add(fi.GetValue(value));
                        param_list.Add(fi.FieldType);
                    } else {
                        PropertyInfo pi = type.GetProperty(p.Name);
                        if (0 == pi.GetIndexParameters().Length) {
                            args_list.Add(pi.GetValue(value, null));
                            param_list.Add(pi.PropertyType);
                        }
                    }
                }

                Type[] param_array = new Type[param_list.Count];
                Object[] arg_array = new Object[args_list.Count];

                param_list.CopyTo(param_array);
                args_list.CopyTo(arg_array);

                string method_name = prefix+"_"+type.Name+(name!=null?"_"+name:"");
                MethodInfo mi = GetMethod(method_name, param_array);

                if (mi != null) {
                    Object new_visitor = mi.Invoke(m_visitor, arg_array);

                    if (null == new_visitor) {
                        new_op = null;
                        Trace.Warning("debug: {0}.{1}({2}) did not return a new visitor", m_visitor_type.FullName, method_name, make_type_string(param_array));
                    } else {
                        new_op = new VisitSiteseer(new_visitor, m_aliases);
                    }

                    return true;
                } else {
                    Trace.Warning("debug: could not find method {0}.{1}({2}), skipping", m_visitor_type.FullName, method_name, make_type_string(param_array));
                }
            }

            new_op = null;

            return false;
        }
Example #10
0
        bool innerCall(string method_name, out ISiteseer new_method, bool is_last)
        {
            MethodInfo mi = GetMethod(method_name, no_params);

            if (mi != null) {
                Object new_visitor = mi.Invoke(m_visitor, no_args);

                if (null == new_visitor) {
                    new_method = null;
                    if (!is_last) Trace.Verbose("debug: {0} did not return a new visitor", method_name);
                } else {
                    new_method = new VisitSiteseer(new_visitor, m_aliases);
                }

                return true;
            } else {
                if (is_last) Trace.Warning("debug: could not find method {0}.{1}(), skipping", m_visitor_type.FullName, method_name);
                new_method = null;
                return false;
            }
        }
Example #11
0
 public void tour(object site, ISiteseer siteseer)
 {
     tour(site, siteseer, null);
 }