public void OverloadResolution_Block() { var t = GetType(); var gse = new GlobalScopeExtension(Context, new Scope(), new object(), true); var scope = new RubyTopLevelScope(gse, null, new SymbolDictionary()); var proc = new Proc(ProcKind.Proc, null, scope, new BlockDispatcher0((x, y) => null, BlockSignatureAttributes.None)); var scopeArg = new MetaObject(Ast.Constant(proc.LocalScope), Restrictions.Empty, proc.LocalScope); var contextArg = new MetaObject(Ast.Constant(Context), Restrictions.Empty, Context); var instanceInt = new MetaObject(Ast.Constant(1), Restrictions.Empty, 1); var str = "foo"; var instanceStr = new MetaObject(Ast.Constant(str), Restrictions.Empty, str); var procArg = new MetaObject(Ast.Constant(proc), Restrictions.Empty, proc); var nullArg = new MetaObject(Ast.Constant(Ast.Constant(null)), Restrictions.Empty, null); var arguments = new[] { // 1.times new CallArguments(scopeArg, instanceInt, new MetaObject[0], RubyCallSignature.WithScope(0)), // 1.times &nil new CallArguments(scopeArg, instanceInt, new[] { nullArg }, RubyCallSignature.WithScopeAndBlock(0)), // 1.times &p new CallArguments(contextArg, instanceInt, new[] { procArg }, RubyCallSignature.WithBlock(0)), // obj.times &p new CallArguments(contextArg, instanceStr, new[] { procArg }, RubyCallSignature.WithBlock(0)), }; var results = new[] { "Times2", "Times1", "Times3", "Times4", }; for (int i = 0; i < arguments.Length; i++) { var bindingTarget = RubyMethodGroupInfo.ResolveOverload("times", new[] { t.GetMethod("Times1"), t.GetMethod("Times2"), t.GetMethod("Times3"), t.GetMethod("Times4"), }, arguments[i], true, false); Assert(bindingTarget.Success); Assert(bindingTarget.Method.Name == results[i]); } }
internal RubyTopLevelScope(GlobalScopeExtension/*!*/ globalScope, RubyModule definitionsModule, IAttributesCollection/*!*/ frame) : base(globalScope.Context, frame) { Assert.NotNull(globalScope); _globalScope = globalScope; _definitionsModule = definitionsModule; }
internal void SetGlobalScope(GlobalScopeExtension /*!*/ value) { Assert.NotNull(value); _globalScope = value; }