ecere/sys/JSON: Improved look up of classes across modules
authorJerome St-Louis <jerome@ecere.com>
Tue, 16 Jun 2015 08:21:11 +0000 (04:21 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 9 Dec 2015 23:11:28 +0000 (18:11 -0500)
ecere/src/sys/JSON.ec

index 4fc47dd..e076c82 100644 (file)
@@ -464,6 +464,8 @@ public:
                      {
                         type = eSystem_FindClass(__thisModule, member.dataTypeString);
                         if(!type)
+                           type = eSystem_FindClass(objectType.module, member.dataTypeString);
+                        if(!type)
                            type = eSystem_FindClass(__thisModule.application, member.dataTypeString);
 
                         offset = member._class.offset + member.offset;
@@ -475,6 +477,8 @@ public:
                         {
                            type = eSystem_FindClass(__thisModule, prop.dataTypeString);
                            if(!type)
+                              type = eSystem_FindClass(objectType.module, prop.dataTypeString);
+                           if(!type)
                               type = eSystem_FindClass(__thisModule.application, prop.dataTypeString);
                         }
                         else
@@ -629,7 +633,7 @@ public:
                   else
                      result = syntaxError;
 
-                  if(prop && type.type == structClass)
+                  if(prop && type && type.type == structClass)
                   {
                      delete value.p;
                   }
@@ -710,18 +714,23 @@ public:
          for(prop = type.conversions.first; prop; prop = prop.next)
          {
             bool refProp = false;
-            Class c;
             if(!strcmp(prop.name, type.base.fullName))
                refProp = true;
-            else if( (c = eSystem_FindClass(type.module, prop.name) ) )
+            else
             {
-               Property p;
-               for(p = c.conversions.first; p; p = p.next)
+               Class c = eSystem_FindClass(type.module, prop.name);
+               if(!c)
+                  c = eSystem_FindClass(type.module.application, prop.name);
+               if(c)
                {
-                  if(!strcmp(p.name, type.base.fullName) && !p.Set && !p.Get)
+                  Property p;
+                  for(p = c.conversions.first; p; p = p.next)
                   {
-                     refProp = true;
-                     break;
+                     if(!strcmp(p.name, type.base.fullName) && !p.Set && !p.Get)
+                     {
+                        refProp = true;
+                        break;
+                     }
                   }
                }
             }
@@ -1041,6 +1050,10 @@ bool WriteValue(File f, Class type, DataValue value, int indent)
    {
       Class dataType;
       dataType = eSystem_FindClass(__thisModule, type.dataTypeString);
+      if(!dataType)
+         dataType = eSystem_FindClass(type.module, type.dataTypeString);
+      if(!dataType)
+         dataType = eSystem_FindClass(__thisModule.application, type.dataTypeString);
       WriteNumber(f, dataType, value, indent);
    }
    else if(type.type == systemClass || type.type == unitClass)
@@ -1137,6 +1150,8 @@ static bool _WriteJSONObject(File f, Class objectType, void * object, int indent
                         type = eSystem_FindClass(__thisModule, prop.dataTypeString);
 
                      if(!type)
+                        type = eSystem_FindClass(objectType.module, prop.dataTypeString);
+                     if(!type)
                         type = eSystem_FindClass(__thisModule.application, prop.dataTypeString);
                      if(!type)
                         PrintLn("warning: Unresolved data type ", (String)prop.dataTypeString);
@@ -1209,6 +1224,8 @@ static bool _WriteJSONObject(File f, Class objectType, void * object, int indent
                   uint offset;
                   Class type = eSystem_FindClass(__thisModule, member.dataTypeString);
                   if(!type)
+                     type = eSystem_FindClass(objectType.module, member.dataTypeString);
+                  if(!type)
                      type = eSystem_FindClass(__thisModule.application, member.dataTypeString);
 
                   offset = member._class.offset + member.offset;