compiler/libec: Improved error messages
[sdk] / compiler / libec / src / loadSymbols.ec
index bb53b13..90ec83b 100644 (file)
@@ -84,19 +84,22 @@ static void ReadDataMembers(Class regClass, DataMember member, File f)
             if(member)
             {
                if(!eMember_AddDataMember(member, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
-                  ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
+                  ;//Compiler_Error($"Member with same name (%s) already exists in member %s\n", name, member->name);
             }
             else if(regClass && regClass.type == bitClass)
             {
                //eClass_AddBitMember(regClass, name, line[0] ? line : 0, size, bitPos);
                BitMember member = eClass_AddBitMember(regClass, name, line[0] ? line : 0, 0, 0, memberAccess);
-               member.size = size;
-               member.pos = bitPos;
+               if(member)
+               {
+                  member.size = size;
+                  member.pos = bitPos;
+               }
             }
             else if(regClass)
             {
                if(!eClass_AddDataMember(regClass, name, line[0] ? line : 0, 0, 0 /*size *//*type->size*/, memberAccess))
-                  ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.fullName);
+                  ;//Compiler_Error($"Member with same name (%s) already exists in class %s\n", name, regClass.fullName);
             }
          }
          else if(!strcmp(line, "[Struct]") || !strcmp(line, "[Union]"))
@@ -106,12 +109,12 @@ static void ReadDataMembers(Class regClass, DataMember member, File f)
             if(member)
             {
                if(!eMember_AddMember(member, dataMember))
-                  ;//Compiler_Error($"Member with same name already exists %s in member %s\n", name, member->name);
+                  ;//Compiler_Error($"Member with same name (%s) already exists in member %s\n", name, member->name);
             }
             else if(regClass)
             {
                if(!eClass_AddMember(regClass, dataMember))
-                  ;//Compiler_Error($"Member with same name already exists %s in class %s\n", name, regClass.name);
+                  ;//Compiler_Error($"Member with same name (%s) already exists in class %s\n", name, regClass.name);
             }
          }
       }
@@ -207,7 +210,7 @@ public bool LoadSymbols(const char * fileName, ImportType importType, bool loadD
                         TrimLSpaces(line, line);
 
                         if(importType == preDeclImport)
-                           DeclClass(0, name);
+                           DeclClass(null, name);
                         if(isStatic || loadDllOnly || importType == preDeclImport || importType == comCheckImport)
                           regClass = null;
                         else if(regClass = eSystem_FindClass(privateModule, name), !regClass || regClass.internalDecl || regClass.isRemote)
@@ -219,7 +222,7 @@ public bool LoadSymbols(const char * fileName, ImportType importType, bool loadD
                            /*if(classType != unitClass && classType != bitClass && classType != enumClass && baseName && !eSystem_FindClass(privateModule, baseName))
                            {
                               Compiler_Error($"Base class %s undefined\n", baseName);
-                              DeclClass(0, name);
+                              DeclClass(name);
                               regClass = null;
                               continue;
                            }
@@ -239,7 +242,7 @@ public bool LoadSymbols(const char * fileName, ImportType importType, bool loadD
                                     char className[1024] = "DCOMClient_";
                                     strcat(className, name);
                                     if(!existingClass)
-                                       existingClass = DeclClass(0, name);
+                                       existingClass = DeclClass(null, name);
                                     regClass = eSystem_RegisterClass(classType, className, baseName, 0, 0, null, null, privateModule, ecereCOMModule ? baseSystemAccess : publicAccess, inheritanceAccess);
                                  }
                                  if(regClass)
@@ -268,13 +271,11 @@ public bool LoadSymbols(const char * fileName, ImportType importType, bool loadD
                                  regClass.structSize = regClass.offset;    // THIS COULD PROBABLY BENEFIT FROM SOME EXPLANATIONS...
                               }
 
-                              // Added this
                               if(regClass && existingClass)
                               {
                                  existingClass.registered = regClass;
-                                 regClass.symbol = existingClass; // TESTING THIS
-                                 existingClass.id = MAXINT;
-                                 existingClass.idCode = MAXINT;
+                                 regClass.symbol = existingClass;
+                                 existingClass.notYetDeclared = true;
                                  existingClass.imported = true;
                                  if(regClass.module)
                                     existingClass.module = FindModule(regClass.module);
@@ -723,6 +724,15 @@ public void ImportModule(const char * name, ImportType importType, AccessMode im
 {
    ImportedModule module = null;
    char moduleName[MAX_LOCATION];
+   bool isSourceModule = false;
+   if(sourceFile)
+   {
+      char sourceFileModule[MAX_FILENAME];
+      GetLastDirectory(sourceFile, sourceFileModule);
+      StripExtension(sourceFileModule);
+      if(!strcmpi(sourceFileModule, name))
+         isSourceModule = true;
+   }
 
    strncpy(moduleName, name, MAX_LOCATION-1);
    moduleName[MAX_LOCATION-1] = 0;
@@ -730,7 +740,8 @@ public void ImportModule(const char * name, ImportType importType, AccessMode im
 
    for(module = defines->first; module; module = module.next)
    {
-      if(module.type == moduleDefinition && !strcmpi(module.name, moduleName))
+      if(module.type == moduleDefinition && !strcmpi(module.name, moduleName) &&
+         ((importType == remoteImport) == (module.importType == remoteImport) || isSourceModule))
          break;
    }
    if((!module || (module.dllOnly && !loadDllOnly)) && strlen(name) < MAX_FILENAME)