void start_tour(Site site, ISiteseer siteseer) { if (!siteseer.view_whole(site)) { siteseer.begin(); tour_each(site, siteseer); siteseer.end(); } }
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; } }
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); }
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); } } }
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; } } }
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; }
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); }
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; }
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; } }
public void tour(object site, ISiteseer siteseer) { tour(site, siteseer, null); }