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>
Thu, 15 Oct 2015 00:19:49 +0000 (20:19 -0400)
ecere/src/sys/JSON.ec

index c11c706..9a841f9 100644 (file)
@@ -465,6 +465,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;
@@ -476,6 +478,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
@@ -630,7 +634,7 @@ public:
                   else
                      result = syntaxError;
 
-                  if(prop && type.type == structClass)
+                  if(prop && type && type.type == structClass)
                   {
                      delete value.p;
                   }
@@ -711,18 +715,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;
+                     }
                   }
                }
             }
@@ -1042,6 +1051,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)
@@ -1138,6 +1151,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);
@@ -1210,6 +1225,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;