internal static void ResolveSymbols(Parser parser, ScriptBlockAst scriptBlockAst) { Diagnostics.Assert(scriptBlockAst.Parent == null, "Can only resolve starting from the root"); var usingState = scriptBlockAst.UsingStatements.Count > 0 ? new TypeResolutionState(TypeOps.GetNamespacesForTypeResolutionState(scriptBlockAst.UsingStatements), TypeResolutionState.emptyAssemblies) : TypeResolutionState.GetDefaultUsingState(null); var resolver = new SymbolResolver(parser, usingState); resolver._symbolTable.EnterScope(scriptBlockAst, ScopeType.ScriptBlock); scriptBlockAst.Visit(resolver); resolver._symbolTable.LeaveScope(); Diagnostics.Assert(resolver._symbolTable._scopes.Count == 0, "Somebody missed removing a scope"); }
public ManagedObject(object obj) { // Console.WriteLine ("new ManagedObject created wrapping object of type {0}, handle == {1}", obj.GetType(), Handle); managed = obj; lock (cachedObjects) cachedObjects[obj] = new WeakReference(this); Type type = obj.GetType(); bool isScriptable = type.IsDefined(typeof(ScriptableTypeAttribute), true); // add properties TypeOps typeOps = null; foreach (PropertyInfo pi in type.GetProperties()) { if (!isScriptable && !pi.IsDefined(typeof(ScriptableMemberAttribute), true)) { continue; } RegisterScriptableProperty(pi); if (IsCreateable(pi.PropertyType)) { typeOps = typeOps ?? new TypeOps(); typeOps.RegisterCreateableType(pi.PropertyType); } } // add events foreach (EventInfo ei in type.GetEvents()) { if (!isScriptable && !ei.IsDefined(typeof(ScriptableMemberAttribute), true)) { continue; } RegisterScriptableEvent(ei); HasEvents = true; // XXX toshok - do we need to RegisterCreateableTypes for parameters on the delegate? } // add functions foreach (MethodInfo mi in type.GetMethods()) { if (!isScriptable && !mi.IsDefined(typeof(ScriptableMemberAttribute), true)) { continue; } RegisterScriptableMethod(mi); if (IsCreateable(mi)) { typeOps = typeOps ?? new TypeOps(); typeOps.RegisterCreateableTypes(mi); } } if (typeOps != null) { RegisterBuiltinScriptableMethod(typeof(TypeOps).GetMethod("CreateManagedObject"), "createManagedObject", typeOps); } if (HasEvents) { EventOps eventOps = new EventOps(this); Type eventOpsType = typeof(EventOps); RegisterBuiltinScriptableMethod(eventOpsType.GetMethod("AddEventListener"), "addEventListener", eventOps); RegisterBuiltinScriptableMethod(eventOpsType.GetMethod("RemoveEventListener"), "removeEventListener", eventOps); } RegisterScriptableMethod(type.GetMethod("ToString", Type.EmptyTypes), "toString"); if (ManagedObject is IList) { if (type.GetProperty("Length") != null) { RegisterScriptableProperty(type.GetProperty("Length"), "length"); } else if (type.GetProperty("Count") != null) { RegisterScriptableProperty(type.GetProperty("Count"), "length"); } foreach (MethodInfo mi in type.GetMethods()) { switch (mi.Name) { case "IndexOf": RegisterScriptableMethod(mi, "indexOf"); break; case "LastIndexOf": RegisterScriptableMethod(mi, "lastIndexOf"); break; case "ToArray": RegisterScriptableMethod(mi, "toArray"); break; } } Type listType = typeof(object); if (type.IsArray) { listType = type.GetElementType(); } else { foreach (Type t in type.GetInterfaces()) { if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IList <>)) { listType = t.GetGenericArguments()[0]; break; } } } var listOps = CreateListOpsInstance(listType); Type listOpsType = listOps.GetType(); if (type.GetProperty("Item") != null) { RegisterScriptableProperty(type.GetProperty("Item"), "item"); } else { RegisterScriptableProperty(listOpsType.GetProperty("Item"), "item", listOps); } RegisterScriptableMethod(listOpsType.GetMethod("Pop"), "pop", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Push"), "push", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Reverse"), "reverse", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Shift"), "shift", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Unshift"), "unshift", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Splice"), "splice", listOps); } else if (ManagedObject is IDictionary) { DictOps dictOps = new DictOps((IDictionary)ManagedObject); Type dictOpsType = typeof(DictOps); RegisterScriptableProperty(dictOpsType.GetProperty("Item"), "item", dictOps); } }
public object VisitTypeExpression(TypeExpressionAst typeExpressionAst) { return(TypeOps.ResolveTypeName(typeExpressionAst.TypeName)); }
public ManagedObject (object obj) { // Console.WriteLine ("new ManagedObject created wrapping object of type {0}, handle == {1}", obj.GetType(), Handle); managed = obj; Type type = obj.GetType (); bool isScriptable = type.IsDefined (typeof(ScriptableTypeAttribute), true); // add properties foreach (PropertyInfo pi in type.GetProperties ()) { if (!isScriptable && !pi.IsDefined (typeof(ScriptableMemberAttribute), true)) continue; RegisterScriptableProperty (pi); if (RegisterScriptableTypes (pi)) HasTypes = true; } // add events foreach (EventInfo ei in type.GetEvents ()) { if (!isScriptable && !ei.IsDefined (typeof(ScriptableMemberAttribute), true)) continue; RegisterScriptableEvent (ei); HasEvents = true; // XXX toshok - do we need to RegisterScriptableTypes for parameters on the delegate? } // add functions foreach (MethodInfo mi in type.GetMethods ()) { if (!isScriptable && !mi.IsDefined (typeof(ScriptableMemberAttribute), true)) continue; RegisterScriptableMethod (mi); if (RegisterScriptableTypes (mi)) HasTypes = true; } if (HasTypes) { TypeOps typeOps = new TypeOps (); Type typeOpsType = typeof (TypeOps); RegisterBuiltinScriptableMethod (typeOpsType.GetMethod ("CreateManagedObject"), "createManagedObject", typeOps); } if (HasEvents) { EventOps eventOps = new EventOps (this); Type eventOpsType = typeof (EventOps); RegisterBuiltinScriptableMethod (eventOpsType.GetMethod ("AddEventListener"), "addEventListener", eventOps); RegisterBuiltinScriptableMethod (eventOpsType.GetMethod ("RemoveEventListener"), "removeEventListener", eventOps); } RegisterScriptableMethod (type.GetMethod ("ToString"), "toString"); if (ManagedObject is IList) { if (type.GetProperty ("Length") != null) RegisterScriptableProperty (type.GetProperty ("Length"), "length"); else if (type.GetProperty ("Count") != null) RegisterScriptableProperty (type.GetProperty ("Count"), "length"); foreach (MethodInfo mi in type.GetMethods ()) { switch (mi.Name) { case "IndexOf": RegisterScriptableMethod (mi, "indexOf"); break; case "LastIndexOf": RegisterScriptableMethod (mi, "lastIndexOf"); break; case "ToArray": RegisterScriptableMethod (mi, "toArray"); break; } } ListOps listOps = new ListOps ((IList)ManagedObject); Type listOpsType = typeof (ListOps); if (type.GetProperty ("Item") != null) RegisterScriptableProperty (type.GetProperty ("Item"), "item"); else RegisterScriptableProperty (listOpsType.GetProperty ("Item"), "item", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Pop"), "pop", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Push"), "push", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Reverse"), "reverse", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Shift"), "shift", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Unshift"), "unshift", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Splice"), "splice", listOps); } else if (ManagedObject is IDictionary) { DictOps dictOps = new DictOps ((IDictionary)ManagedObject); Type dictOpsType = typeof (DictOps); RegisterScriptableProperty (dictOpsType.GetProperty ("Item"), "item", dictOps); } }