@@ -8,15 +8,16 @@ object LoxObjectClass : LoxNativeClass("Object", null){
88 defineNativeMetaclass(" Object class" )
99 defineNativeGetter(" className" , this ::classNameProp)
1010 defineNativeMethod(" getClass" , 0 , this ::getClassDef)
11- defineNativeMethod(" getClassName" , 0 , this ::getClassNameDef)
1211 defineNativeMethod(" hashCode" , 0 , this ::hashCodeDef)
12+ defineNativeMethod(" hasTrait" , 1 , this ::hasTraitDef)
1313 defineNativeMethod(" instanceOf" , 1 , this ::instanceOfDef)
1414 defineNativeMethod(" isBoolean" , 0 , this ::isBooleanDef)
1515 defineNativeMethod(" isClass" , 0 , this ::isClassDef)
1616 defineNativeMethod(" isNil" , 0 , this ::isNilDef)
1717 defineNativeMethod(" isNilOrEmpty" , 0 , this ::isNilOrEmptyDef)
1818 defineNativeMethod(" isNumber" , 0 , this ::isNumberDef)
1919 defineNativeMethod(" isString" , 0 , this ::isStringDef)
20+ defineNativeMethod(" isTrait" , 0 , this ::isTraitDef)
2021 defineNativeMethod(" memberOf" , 1 , this ::memberOfDef)
2122 defineNativeMethod(" toString" , 0 , this ::toStringDef)
2223 }
@@ -25,13 +26,20 @@ object LoxObjectClass : LoxNativeClass("Object", null){
2526
2627 private fun getClassDef (interpreter : Interpreter , arguments : List <Any ?>? ) = interpreter.thisInstance.klass
2728
28- private fun getClassNameDef (interpreter : Interpreter , arguments : List <Any ?>? ) = interpreter.thisInstance.className
29-
3029 private fun hashCodeDef (interpreter : Interpreter , arguments : List <Any ?>? ) = interpreter.thisInstance.hashCode()
3130
31+ private fun hasTraitDef (interpreter : Interpreter , arguments : List <Any ?>? ) : Boolean {
32+ val self = interpreter.thisInstance
33+ val trait = arguments!! [0 ] as ? LoxTrait ? : return false
34+ self.klass?.traits?.forEach {
35+ if (it == trait || it.parents.contains(trait)) return true
36+ }
37+ return false
38+ }
39+
3240 private fun instanceOfDef (interpreter : Interpreter , arguments : List <Any ?>? ) : Boolean {
3341 val self = interpreter.thisInstance
34- val klass = arguments!! [0 ] as ? LoxClass ? : return false
42+ val klass = arguments!! [0 ] as ? LoxClass ? : return hasTraitDef(interpreter, arguments)
3543 if (self.className == klass.name) return true
3644
3745 var superKlass = self.klass
@@ -54,6 +62,8 @@ object LoxObjectClass : LoxNativeClass("Object", null){
5462
5563 private fun isStringDef (interpreter : Interpreter , arguments : List <Any ?>? ) = false
5664
65+ private fun isTraitDef (interpreter : Interpreter , arguments : List <Any ?>? ) = false
66+
5767 private fun memberOfDef (interpreter : Interpreter , arguments : List <Any ?>? ) : Boolean {
5868 val self = interpreter.thisInstance
5969 val klass = arguments!! [0 ] as ? LoxClass ? : return false
0 commit comments