From 10cf0ed1f1cb414a0575a69e3143fde6734c4fb4 Mon Sep 17 00:00:00 2001 From: ajlopez Date: Sat, 30 Nov 2013 16:43:53 -0300 Subject: [PATCH] Parent and FullName in DynamicClass --- Src/RubySharp.Core.Tests/EvaluateTests.cs | 3 +- .../Expressions/ModuleExpressionTests.cs | 3 +- Src/RubySharp.Core.Tests/MachineFileTests.cs | 16 ++++++--- .../Expressions/ClassExpression.cs | 36 ++++++------------- .../Expressions/ModuleExpression.cs | 9 ++--- Src/RubySharp.Core/Language/DynamicClass.cs | 19 ++++++++-- 6 files changed, 44 insertions(+), 42 deletions(-) diff --git a/Src/RubySharp.Core.Tests/EvaluateTests.cs b/Src/RubySharp.Core.Tests/EvaluateTests.cs index 65aa90c..5c92266 100644 --- a/Src/RubySharp.Core.Tests/EvaluateTests.cs +++ b/Src/RubySharp.Core.Tests/EvaluateTests.cs @@ -458,7 +458,8 @@ public void DefineQualifiedClass() Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(DynamicClass)); - Assert.AreEqual("MyModule::MyClass", ((DynamicClass)result).Name); + Assert.AreEqual("MyClass", ((DynamicClass)result).Name); + Assert.AreEqual("MyModule::MyClass", ((DynamicClass)result).FullName); } [TestMethod] diff --git a/Src/RubySharp.Core.Tests/Expressions/ModuleExpressionTests.cs b/Src/RubySharp.Core.Tests/Expressions/ModuleExpressionTests.cs index 6e6118a..4264ab5 100644 --- a/Src/RubySharp.Core.Tests/Expressions/ModuleExpressionTests.cs +++ b/Src/RubySharp.Core.Tests/Expressions/ModuleExpressionTests.cs @@ -86,7 +86,8 @@ public void EvaluateModuleExpressionWithClassDefinition() Assert.IsNotNull(@class); Assert.IsInstanceOfType(@class, typeof(DynamicClass)); - Assert.AreEqual("Module1::Foo", ((DynamicClass)@class).Name); + Assert.AreEqual("Foo", ((DynamicClass)@class).Name); + Assert.AreEqual("Module1::Foo", ((DynamicClass)@class).FullName); } [TestMethod] diff --git a/Src/RubySharp.Core.Tests/MachineFileTests.cs b/Src/RubySharp.Core.Tests/MachineFileTests.cs index 4fa1479..fe1d018 100644 --- a/Src/RubySharp.Core.Tests/MachineFileTests.cs +++ b/Src/RubySharp.Core.Tests/MachineFileTests.cs @@ -193,11 +193,13 @@ public void ExecuteModuleWithClassesFile() Assert.IsNotNull(result1); Assert.IsInstanceOfType(result1, typeof(DynamicClass)); - Assert.AreEqual("MyLisp::List", ((DynamicClass)result1).Name); + Assert.AreEqual("List", ((DynamicClass)result1).Name); + Assert.AreEqual("MyLisp::List", ((DynamicClass)result1).FullName); Assert.IsNotNull(result2); Assert.IsInstanceOfType(result2, typeof(DynamicClass)); - Assert.AreEqual("MyLisp::Atom", ((DynamicClass)result2).Name); + Assert.AreEqual("Atom", ((DynamicClass)result2).Name); + Assert.AreEqual("MyLisp::Atom", ((DynamicClass)result2).FullName); } [TestMethod] @@ -211,10 +213,12 @@ public void ExecuteClassWithModuleFile() Assert.IsNotNull(result1); Assert.IsInstanceOfType(result1, typeof(DynamicClass)); Assert.AreEqual("MyClass", ((DynamicClass)result1).Name); + Assert.AreEqual("MyClass", ((DynamicClass)result1).FullName); Assert.IsNotNull(result2); Assert.IsInstanceOfType(result2, typeof(DynamicClass)); - Assert.AreEqual("MyClass::MyModule", ((DynamicClass)result2).Name); + Assert.AreEqual("MyModule", ((DynamicClass)result2).Name); + Assert.AreEqual("MyClass::MyModule", ((DynamicClass)result2).FullName); } [TestMethod] @@ -232,11 +236,13 @@ public void ExecuteNestedModulesFile() Assert.IsNotNull(result2); Assert.IsInstanceOfType(result2, typeof(DynamicClass)); - Assert.AreEqual("MyModule::MySubmodule", ((DynamicClass)result2).Name); + Assert.AreEqual("MySubmodule", ((DynamicClass)result2).Name); + Assert.AreEqual("MyModule::MySubmodule", ((DynamicClass)result2).FullName); Assert.IsNotNull(result3); Assert.IsInstanceOfType(result3, typeof(DynamicClass)); - Assert.AreEqual("MyModule::MySubmodule::MySubmodule2", ((DynamicClass)result3).Name); + Assert.AreEqual("MySubmodule2", ((DynamicClass)result3).Name); + Assert.AreEqual("MyModule::MySubmodule::MySubmodule2", ((DynamicClass)result3).FullName); } [TestMethod] diff --git a/Src/RubySharp.Core/Expressions/ClassExpression.cs b/Src/RubySharp.Core/Expressions/ClassExpression.cs index 895e088..5d5165d 100644 --- a/Src/RubySharp.Core/Expressions/ClassExpression.cs +++ b/Src/RubySharp.Core/Expressions/ClassExpression.cs @@ -54,33 +54,19 @@ public object Evaluate(Context context) if (value == null || !(value is DynamicClass)) { var classclass = (DynamicClass)context.RootContext.GetLocalValue("Class"); - var objectclass = (DynamicClass)context.RootContext.GetLocalValue("Object"); - var newclass = new DynamicClass(classclass, this.namedexpression.Name, objectclass); - - if (target == null) - { - if (context.Module != null) - { - newclass.Name = context.Module.Name + "::" + this.namedexpression.Name; - context.Module.Constants.SetLocalValue(this.namedexpression.Name, newclass); - } - else - { - newclass.Name = this.namedexpression.Name; - context.RootContext.SetLocalValue(this.namedexpression.Name, newclass); - } - } - else - { - newclass.Name = target.Name + "::" + this.namedexpression.Name; - target.Constants.SetLocalValue(this.namedexpression.Name, newclass); - } + var superclass = (DynamicClass)context.RootContext.GetLocalValue("Object"); + string name = this.namedexpression.Name; + var parent = target == null ? context.Module : target; if (this.superclassexpression != null) - { - var superclass = (DynamicClass)this.superclassexpression.Evaluate(context); - newclass.SetSuperClass(superclass); - } + superclass = (DynamicClass)this.superclassexpression.Evaluate(context); + + var newclass = new DynamicClass(classclass, name, superclass, parent); + + if (parent == null) + context.RootContext.SetLocalValue(name, newclass); + else + parent.Constants.SetLocalValue(name, newclass); value = newclass; } diff --git a/Src/RubySharp.Core/Expressions/ModuleExpression.cs b/Src/RubySharp.Core/Expressions/ModuleExpression.cs index cdf3ea3..5e672bb 100644 --- a/Src/RubySharp.Core/Expressions/ModuleExpression.cs +++ b/Src/RubySharp.Core/Expressions/ModuleExpression.cs @@ -36,18 +36,13 @@ public object Evaluate(Context context) if (value == null || !(value is DynamicClass)) { DynamicClass modclass = (DynamicClass)context.RootContext.GetLocalValue("Module"); - module = new DynamicClass(modclass, this.name); + var superclass = (DynamicClass)context.RootContext.GetLocalValue("Object"); + module = new DynamicClass(modclass, this.name, superclass, context.Module); if (context.Module != null) - { - module.Name = context.Module.Name + "::" + this.name; context.Module.Constants.SetLocalValue(this.name, module); - } else - { - module.Name = this.name; context.RootContext.SetLocalValue(this.name, module); - } } else module = (DynamicClass)value; diff --git a/Src/RubySharp.Core/Language/DynamicClass.cs b/Src/RubySharp.Core/Language/DynamicClass.cs index 307dc36..26ccd12 100644 --- a/Src/RubySharp.Core/Language/DynamicClass.cs +++ b/Src/RubySharp.Core/Language/DynamicClass.cs @@ -12,6 +12,7 @@ public class DynamicClass : DynamicObject private string name; private DynamicClass superclass; + private DynamicClass parent; private IDictionary methods = new Dictionary(); private Context constants = new Context(); @@ -20,19 +21,31 @@ public DynamicClass(string name, DynamicClass superclass = null) { } - public DynamicClass(DynamicClass @class, string name, DynamicClass superclass = null) + public DynamicClass(DynamicClass @class, string name, DynamicClass superclass = null, DynamicClass parent = null) : base(@class) { this.name = name; this.superclass = superclass; + this.parent = parent; } - public string Name { get { return this.name; } internal set { this.name = value; } } + public string Name { get { return this.name; } } public DynamicClass SuperClass { get { return this.superclass; } } public Context Constants { get { return this.constants; } } + public string FullName + { + get + { + if (this.parent == null) + return this.Name; + + return this.parent.FullName + "::" + this.Name; + } + } + public void SetInstanceMethod(string name, IFunction method) { this.methods[name] = method; @@ -66,7 +79,7 @@ public IList GetOwnInstanceMethodNames() public override string ToString() { - return this.Name; + return this.FullName; } internal void SetSuperClass(DynamicClass superclass)