compiler/libec: (#307, #70) Warning on undeclared class; Overriding namespaces
[sdk] / compiler / libec / src / ast.ec
index 2ebb573..6cf7333 100644 (file)
@@ -229,6 +229,11 @@ Expression MkExpString(const char * string)
    return { type = stringExp, string = CopyString(string), loc = yylloc };
 }
 
+Expression MkExpWideString(const char * string)
+{
+   return { type = stringExp, string = CopyString(string), loc = yylloc, wideString = true };
+}
+
 // TODO: String is case sensitive..
 //       What should we do about it?
 /*public class CaseSensitiveString : String
@@ -764,7 +769,6 @@ Declaration MkDeclarationInst(Instantiation inst)
       string = (inst.exp.type == identifierExp) ? CopyString(inst.exp.identifier.string) : null;
       type = MkClassTypeSymbol(inst._class.symbol);
    };
-   symbol.idCode = symbol.id = curContext.nextID++;
    if(strstr(symbol.string, "::"))
       curContext.hasNameSpace = true;
    if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
@@ -841,7 +845,6 @@ Declaration MkDeclaration(OldList specifiers, OldList initDeclarators)
                         string = CopyString(GetDeclId(d.declarator).string);
                         type = ProcessType(specifiers, d.declarator);
                      };
-                     type.id = type.idCode = curContext.nextID++;
 
                      if(!(curContext.templateTypesOnly ? curContext.parent : curContext).types.Add((BTNode)type))
                         excludedSymbols->Add(type);
@@ -869,7 +872,6 @@ Declaration MkDeclaration(OldList specifiers, OldList initDeclarators)
                      if(s)
                      {
                         Symbol type { string = CopyString(s), type = ProcessType(specifiers, null) };
-                        type.id = type.idCode = curContext.nextID++;
                         decl.symbol = type;
                         decl.declarators = initDeclarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
                         specifiers.Remove(spec);
@@ -995,7 +997,6 @@ Declaration MkDeclaration(OldList specifiers, OldList initDeclarators)
                         symbol.type.freeExp = true;
                      }
                   }
-                  symbol.id = symbol.idCode = curContext.nextID++;
                }
                decl.symbol = d.declarator.symbol = symbol;
             }
@@ -1005,7 +1006,6 @@ Declaration MkDeclaration(OldList specifiers, OldList initDeclarators)
    else
    {
       decl.symbol = Symbol { };
-      decl.symbol.id = decl.symbol.idCode = curContext.nextID++;
       excludedSymbols->Add(decl.symbol);
    }
    return decl;
@@ -1191,8 +1191,6 @@ void ProcessFunctionBody(FunctionDefinition func, Statement body)
                   if(!context.symbols.Add((BTNode)symbol))
                      excludedSymbols->Add(symbol);
 
-                  // TODO: Fix this, the parameters' IDs should really be smaller...
-                  symbol.id = context.nextID++;
                   param.declarator.symbol = symbol;
                }
             }
@@ -1230,7 +1228,6 @@ void ProcessFunctionBody(FunctionDefinition func, Statement body)
          id.string = CopyString(name);
       }
       symbol = Symbol { string = CopyString(id.string), type = ProcessType(func.specifiers, declarator) };
-      symbol.idCode = symbol.id = globalContext.nextID++;
       if(strstr(symbol.string, "::"))
          globalContext.hasNameSpace = true;
       if(!globalContext.symbols.Add((BTNode)symbol))
@@ -1427,7 +1424,8 @@ void SetClassTemplateArgs(Specifier spec, OldList templateArgs)
          if(!symbol && spec.symbol)
          {
             // If class was only decl'ed, invoke DeclClass on this templated class as well
-            symbol = _DeclClass(MAXINT, templateString);
+            symbol = _DeclClass(null, templateString);
+            symbol.notYetDeclared = true;
          }
          // Add a reference to all templated class to the basic class
          if(spec.symbol)
@@ -1472,7 +1470,22 @@ Specifier _MkSpecifierName(const char * name, Symbol symbol, OldList templateArg
          }
       }
       else if(symbol)
+      {
+         char nameSpace[1024];
+         char * c = strstr(name, symbol.string);
          spec.name = CopyString(symbol.string);
+         if(c && c >= name + 2 && c[-1] == ':' && c[-2] == ':')
+         {
+            if(c > name + 2)
+            {
+               memcpy(nameSpace, name, c - name - 2);
+               nameSpace[c-name] = 0;
+               spec.nsSpec = _MkSpecifierName(nameSpace, null, null);
+            }
+            else
+               spec.nsSpec = _MkSpecifierName(null, null, null);
+         }
+      }
       else
          spec.name = CopyString(name);
       spec.symbol = symbol;
@@ -1545,8 +1558,6 @@ void ProcessClassFunctionBody(ClassFunction func, Statement body)
                      isParam = true;
                   };
 
-                  // TODO: Fix this, the parameters' IDs should really be smaller...
-                  symbol.idCode = symbol.id = context.nextID++;
                   if(!context.symbols.Add((BTNode)symbol))
                      excludedSymbols->Add(symbol);
 
@@ -1590,7 +1601,6 @@ void ProcessClassFunctionBody(ClassFunction func, Statement body)
             symbolSpecs->Add(CopySpecifier(spec));
       }
       symbol.type = ProcessType(symbolSpecs, decl);
-      symbol.idCode = symbol.id = globalContext.nextID++;
       decl.symbol = symbol;
 
       excludedSymbols->Add(symbol);
@@ -1739,12 +1749,12 @@ ClassDef MkClassDefFunction(ClassFunction function)
    return def;
 }
 
-Symbol DeclClassAddNameSpace(int symbolID, const char * className)
+Symbol DeclClassAddNameSpace(Specifier _class, const char * className)
 {
    char name[1024];
    int len = 0, stringLen;
    name[0] = '\0';
-   if((currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
+   if(className[0] != ':' && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess && (!_class || _class.name))
    {
       if(defaultNameSpace)
       {
@@ -1765,20 +1775,30 @@ Symbol DeclClassAddNameSpace(int symbolID, const char * className)
    memcpy(name + len, className, stringLen);
    len += stringLen;
    name[len] = 0;
-   return _DeclClass(symbolID, name);
+   return _DeclClass(_class, name);
 }
 
-Symbol DeclClass(int symbolID, const char * name)
+Symbol DeclClass(Specifier _class, const char * name)
 {
-   if(strchr(name, ':'))
-      return _DeclClass(symbolID, name);
+   if(_class || strchr(name, ':'))
+      return _DeclClass(_class, name);
    else
-      return DeclClassAddNameSpace(symbolID, name);
+      return DeclClassAddNameSpace(_class, name);
 }
 
-Symbol _DeclClass(int symbolID, const char * name)
+Symbol _DeclClass(Specifier _class, const char * name)
 {
-   Symbol symbol = FindClass(name);
+   Symbol symbol;
+   char nameBuffer[1024];
+   if(_class)
+   {
+      strcpy(nameBuffer,  _class.name ? _class.name : "");
+      strcat(nameBuffer, "::");
+      strcat(nameBuffer, name);
+      name = nameBuffer;
+   }
+
+   symbol = FindClass(name);
    if(!symbol)
    {
       /*
@@ -1794,7 +1814,7 @@ Symbol _DeclClass(int symbolID, const char * name)
       symbol = Symbol
       {
          string = CopyString(name);
-         idCode = symbolID, id = symbolID;
+         notYetDeclared = true;
       };
       if(!globalContext.classes.Add((BTNode)symbol))
          excludedSymbols->Add(symbol);
@@ -1814,8 +1834,6 @@ Symbol _DeclClass(int symbolID, const char * name)
             symbol.shortName = CopyString(name + start);
       }
    }
-   if(symbolID)
-      symbol.idCode = symbol.id = symbolID;
    return symbol;
 }
 
@@ -1900,7 +1918,7 @@ ClassDefinition MkClass(Symbol symbol, OldList baseSpecs, OldList definitions)
       delete symbol.ctx;
    }
    symbol.ctx = curContext;
-   classDef = { symbol = symbol, _class = MkSpecifierName /*MkClassName*/(symbol.string), baseSpecs = baseSpecs, definitions = definitions, nameLoc = symbol.nameLoc };
+   classDef = { symbol = symbol, _class = MkSpecifierName(symbol.string), baseSpecs = baseSpecs, definitions = definitions, nameLoc = symbol.nameLoc };
    curContext.classDef = classDef;
    return classDef;
 }
@@ -1941,10 +1959,7 @@ PropertyDef MkProperty(OldList specs, Declarator decl, Identifier id, Statement
       string = CopyString(id.string);
       type = type;
    };
-   symbol.idCode = symbol.id = globalContext.nextID++;
    excludedSymbols->Add(symbol);
-   globalContext.nextID++;
-   globalContext.nextID++;
    prop.symbol = symbol;
    return prop;
 }
@@ -2016,7 +2031,7 @@ void PopContext(Context ctx)
 Symbol FindType(Context ctx, const char * name)
 {
    Symbol type = null;
-   if(curContext)
+   if(ctx)
    {
       //char output[8192];
       type = (Symbol)ctx.types.FindString(name);
@@ -2031,6 +2046,18 @@ Symbol FindType(Context ctx, const char * name)
    return type;
 }
 
+Symbol FindStruct(Context ctx, const char * name)
+{
+   Symbol type = null;
+   if(ctx)
+   {
+      type = (Symbol)ctx.structSymbols.FindString(name);
+      if(!type && ctx.parent)
+         type = FindStruct(ctx.parent, name);
+   }
+   return type;
+}
+
 TemplatedType FindTemplateTypeParameter(Context ctx, const char * name)
 {
    TemplatedType templatedType = null;
@@ -2198,8 +2225,7 @@ public Symbol FindClass(const char * name)
             {
                string = CopyString(name);
                registered = _class;
-               id = MAXINT;
-               idCode = MAXINT;
+               notYetDeclared = true;
                imported = true;
             };
             _class.symbol = cl;
@@ -2224,6 +2250,7 @@ void CopyTypeInto(Type type, Type src)
 {
    type = *src;
    type.name = CopyString(src.name);
+   type.typeName = CopyString(src.typeName);
    type.refCount = 1;
 
    if(src.kind == enumType)
@@ -2261,7 +2288,6 @@ void CopyTypeInto(Type type, Type src)
          if(type.arraySizeExp)
             type.arraySizeExp = CopyExpression(type.arraySizeExp);
       }
-
    }
 }
 
@@ -2908,8 +2934,7 @@ Expression GetTemplateArgExpByName(const char * paramName, Class curClass, Templ
          sprintf(idString, "%d", id);
          strcpy(className, "__ecereClass_");
          FullClassNameCat(className, _class.fullName, true);
-         //MangleClassName(className);
-         DeclareClass(FindClass(_class.fullName), className);
+         DeclareClass(curExternal, FindClass(_class.fullName), className);
 
          argExp = MkExpIndex((/*pointer ? MkExpPointer : */MkExpMember)
                (MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class")) /*MkExpIdentifier(MkIdentifier(className))*/,
@@ -2950,7 +2975,7 @@ public void OutputIntlStrings()
       {
          const char * filePrefix = "";
          if(!(srcFile[0] && (srcFile[1] == ':' || srcFile[0] == '/')))
-            filePrefix = "./"; //(GetRuntimePlatform() == win32) ? ".\\" : "./";
+            filePrefix = "./"; //(__runtimePlatform == win32) ? ".\\" : "./";
          // GetSystemPathBuffer(srcFileFixed, srcFile);
          GetSlashPathBuffer(srcFileFixed, srcFile);