static IList <string> AssembleClass(KecaknoahScriptClassInfo info) { var result = new List <string>(); result.Add($".class {info.Name}"); foreach (var i in info.Locals) { result.Add(" .local" + i); } result.Add(" "); foreach (var i in info.InstanceMethods) { result.AddRange(AssembleFunction(i as KecaknoahScriptMethodInfo).Select(p => " " + p)); result.Add(" "); } foreach (var i in info.ClassMethods) { result.AddRange(AssembleFunction(i as KecaknoahScriptMethodInfo).Select(p => " " + p)); result.Add(" "); } foreach (var i in info.InnerClasses) { result.AddRange(AssembleClass(i as KecaknoahScriptClassInfo).Select(p => " " + p)); result.Add(" "); } return(result); }
/// <summary> /// 特定の<see cref="KecaknoahScriptClassInfo"/>を元にして、インスタンスを生成します。 /// コンストラクタがあった場合、呼び出します。 /// </summary> /// <param name="klass">クラス</param> /// <param name="ctx">コンテキスト</param> /// <param name="ctorArgs">コンストラクタ引数</param> public KecaknoahInstance(KecaknoahScriptClassInfo klass, KecaknoahContext ctx, KecaknoahObject[] ctorArgs) { Class = klass; LocalFieldReferences = localReferences; InstanceMethodReferences = methodReferences; foreach (var i in klass.Locals) { localReferences[i] = new KecaknoahReference() { IsLeftValue = true } } ; foreach (var i in klass.methods) { methodReferences[i.Name] = new KecaknoahReference() { IsLeftValue = true, RawObject = new KecaknoahScriptFunction(this, i) } } ; if (klass.classMethods.Any(p => p.Name == "new")) { var ctor = klass.classMethods.First(p => p.Name == "new"); new KecaknoahScriptFunction(this, ctor).Call(ctx, ctorArgs); } }
/// <summary> /// 特定の<see cref="KecaknoahScriptClassInfo"/>を元にして、インスタンスを生成します。 /// コンストラクタがあった場合、呼び出します。 /// </summary> /// <param name="klass">クラス</param> /// <param name="ctx">コンテキスト</param> /// <param name="ctorArgs">コンストラクタ引数</param> public KecaknoahInstance(KecaknoahScriptClassInfo klass, KecaknoahContext ctx, KecaknoahObject[] ctorArgs) { Class = klass; ExtraType = klass.Name; LocalFieldReferences = localReferences; InstanceMethodReferences = methodReferences; foreach (var i in klass.LocalInfos) { localReferences[i.Name] = new KecaknoahReference() { IsLeftValue = true }; if (i.InitializeIL != null) { localReferences[i.Name].RawObject = ctx.ExecuteExpressionIL(i.InitializeIL); } } foreach (var i in klass.methods) methodReferences[i.Name] = new KecaknoahReference() { IsLeftValue = true, RawObject = new KecaknoahScriptFunction(this, i) }; var ctor = klass.classMethods.FirstOrDefault(p => p.Name == "new"); if (ctor != null) { new KecaknoahScriptFunction(this, ctor).Call(ctx, ctorArgs); } }
/// <summary> /// 特定の<see cref="KecaknoahScriptClassInfo"/>を元にして、インスタンスを生成します。 /// コンストラクタがあった場合、呼び出します。 /// </summary> /// <param name="klass">クラス</param> /// <param name="ctx">コンテキスト</param> /// <param name="ctorArgs">コンストラクタ引数</param> public KecaknoahInstance(KecaknoahScriptClassInfo klass, KecaknoahContext ctx, KecaknoahObject[] ctorArgs) : this(klass) { if (klass.classMethods.Any(p => p.Name == "new")) { var ctor = klass.classMethods.First(p => p.Name == "new"); new KecaknoahScriptFunction(this, ctor).Call(ctx, ctorArgs); } }
/// <summary> /// 新しいインスタンスを初期化します。 /// </summary> /// <param name="info"></param> public KecaknoahScriptClassObject(KecaknoahScriptClassInfo info) { Class = info; Constructor = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, CreateInstance)); foreach (var i in Class.classMethods) { methods[i.Name] = (KecaknoahReference.CreateRightReference(new KecaknoahScriptFunction(KecaknoahNil.Instance, i))); } }
/// <summary> /// 新しいインスタンスを初期化します。 /// </summary> /// <param name="info"></param> public KecaknoahScriptClassObject(KecaknoahScriptClassInfo info) { Class = info; ExtraType = "ScriptClass"; Constructor = KecaknoahReference.Right(this, CreateInstance); foreach (var i in Class.classMethods) { methods[i.Name] = (KecaknoahReference.Right(new KecaknoahScriptFunction(KecaknoahNil.Instance, i))); } }
/// <summary> /// 特定の<see cref="KecaknoahScriptClassInfo"/>を元にして、インスタンスを生成します。 /// </summary> /// <param name="klass">クラス</param> public KecaknoahInstance(KecaknoahScriptClassInfo klass) { Class = klass; LocalFieldReferences = localReferences; InstanceMethodReferences = methodReferences; foreach (var i in klass.Locals) localReferences[i] = new KecaknoahReference() { IsLeftValue = true }; foreach (var i in klass.methods) methodReferences[i.Name] = new KecaknoahReference() { IsLeftValue = true, RawObject = new KecaknoahScriptFunction(this, i) }; }
/// <summary> /// 特定の<see cref="KecaknoahScriptClassInfo"/>を元にして、インスタンスを生成します。 /// コンストラクタがあった場合、呼び出します。 /// </summary> /// <param name="klass">クラス</param> /// <param name="ctx">コンテキスト</param> /// <param name="ctorArgs">コンストラクタ引数</param> public KecaknoahInstance(KecaknoahScriptClassInfo klass, KecaknoahContext ctx, KecaknoahObject[] ctorArgs) { Class = klass; LocalFieldReferences = localReferences; InstanceMethodReferences = methodReferences; foreach (var i in klass.Locals) localReferences[i] = new KecaknoahReference() { IsLeftValue = true }; foreach (var i in klass.methods) methodReferences[i.Name] = new KecaknoahReference() { IsLeftValue = true, RawObject = new KecaknoahScriptFunction(this, i) }; if (klass.classMethods.Any(p => p.Name == "new")) { var ctor = klass.classMethods.First(p => p.Name == "new"); new KecaknoahScriptFunction(this, ctor).Call(ctx, ctorArgs); } }
/// <summary> /// 特定の<see cref="KecaknoahScriptClassInfo"/>を元にして、インスタンスを生成します。 /// </summary> /// <param name="klass">クラス</param> public KecaknoahInstance(KecaknoahScriptClassInfo klass) { Class = klass; LocalFieldReferences = localReferences; InstanceMethodReferences = methodReferences; foreach (var i in klass.Locals) { localReferences[i] = new KecaknoahReference() { IsLeftValue = true } } ; foreach (var i in klass.methods) { methodReferences[i.Name] = new KecaknoahReference() { IsLeftValue = true, RawObject = new KecaknoahScriptFunction(this, i) } } ; }