{
OldLink derivative;
- ComputeClassParameters(base, strchr(base.name, '<'), null);
+ ComputeClassParameters(base, strchr(base.name, '<'), null, base.templateClass != mod);
for(derivative = base.derivatives.first; derivative; derivative = derivative.next)
{
//const char * templateParams = strchr(template.name, '<');
template.base = base.base;
template._vTbl = base._vTbl;
- //ComputeClassParameters(template, templateParams, null);
+ //ComputeClassParameters(template, templateParams, null, true);
template.data = base.data;
template.offset = base.offset;
Class _class = null;
const char * dataTypeString = null;
Class enumBase = null;
- Class base = (baseName && baseName[0]) ? eSystem_FindClass(module, baseName) : null;
+ Class base = (baseName && baseName[0]) ? System_FindClass(module, baseName, true) : null;
Class prevBase = null;
if(base && !base.internalDecl && (base.type == noHeadClass || base.type == structClass || base.type == normalClass))
offsetClass = base ? base.sizeClass : (type == noHeadClass ? 0 : 0 /*sizeof(class Class)*/);
totalSizeClass = offsetClass + sizeClass;
- _class = eSystem_FindClass(module, name);
+ _class = System_FindClass(module, name, true);
if(!_class)
{
const char * colons = RSearchString(name, "::", strlen(name), true, false);
if(colons && colons)
{
- _class = eSystem_FindClass(module, colons + 2);
+ _class = System_FindClass(module, colons + 2, true);
if(_class)
{
if(_class.internalDecl)
Class templateBase;
strcpy(templateClassName, baseName);
*strchr(templateClassName, '<') = '\0';
- templateBase = eSystem_FindClass(module, templateClassName);
+ templateBase = System_FindClass(module, templateClassName, true);
if(!templateBase)
{
templateBase = eSystem_RegisterClass(0, templateClassName, null, 0,0, null, null, module, declMode, publicAccess);
templateBase.internalDecl = true;
}
- base = eSystem_FindClass(module, baseName);
+ base = System_FindClass(module, baseName, true);
}
else
{
}
else if(type == bitClass || type == enumClass || type == unitClass)
{
- Class dataTypeClass = eSystem_FindClass(_class.module, dataTypeString);
+ Class dataTypeClass = System_FindClass(_class.module, dataTypeString, true);
if(dataTypeClass)
_class.typeSize = dataTypeClass.typeSize;
_class.structSize = 0;
public dllexport Class eSystem_FindClass(Module module, const char * name)
{
+ return System_FindClass(module, name, false);
+}
+
+Class System_FindClass(Module module, const char * name, bool registerTemplatesInternalDecl)
+{
if(name && module)
{
BTNamedLink link;
module.classes.Add(templatedClass);
- ComputeClassParameters(templatedClass, templateParams, module);
+ ComputeClassParameters(templatedClass, templateParams, module, registerTemplatesInternalDecl);
_class.templatized.Add(OldLink { data = templatedClass });
}
}
}
-static void ComputeClassParameters(Class templatedClass, const char * templateParams, Module findModule)
+static void ComputeClassParameters(Class templatedClass, const char * templateParams, Module findModule, bool registerInternalDecl)
{
char ch;
const char * nextParamStart = templateParams ? (templateParams + 1) : null;
{
case type:
argument.dataTypeString = CopyString(value);
- argument.dataTypeClass = eSystem_FindClass(findModule, value);
+ argument.dataTypeClass = System_FindClass(findModule, value, registerInternalDecl);
if(!argument.dataTypeClass)
- argument.dataTypeClass = eSystem_FindClass(_class.module, value);
+ argument.dataTypeClass = System_FindClass(_class.module, value, registerInternalDecl);
if(!argument.dataTypeClass)
- argument.dataTypeClass = eSystem_FindClass(_class.module.application, value);
+ argument.dataTypeClass = System_FindClass(_class.module.application, value, registerInternalDecl);
+ if(registerInternalDecl && !argument.dataTypeClass)
+ {
+ ClassTemplateParameter param;
+ for(param = templatedClass.templateParams.first; param; param = param.next)
+ if(!strcmp(param.name, value))
+ break;
+ if(!param)
+ {
+ argument.dataTypeClass = eSystem_RegisterClass(0, value, null, 0,0, null, null, _class.module, publicAccess, publicAccess);
+ argument.dataTypeClass.internalDecl = true;
+ }
+ }
break;
case expression:
{
- Class expClass = eSystem_FindClass(_class.module, curParam.dataTypeString);
- if(!expClass) expClass = eSystem_FindClass(_class.module.application, curParam.dataTypeString);
+ Class expClass = System_FindClass(_class.module, curParam.dataTypeString, true);
+ if(!expClass) expClass = System_FindClass(_class.module.application, curParam.dataTypeString, true);
if(expClass)
{
//if(expClass.type ==
CopyTemplateArg(param, templatedClass.templateArgs[curParamID]);
if(param.type == type && param.defaultArg.dataTypeString)
{
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(findModule, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(findModule, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString, true);
}
}
curParamID++;
FreeTemplateArg(templatedClass, param, c);
arg->dataTypeString = CopyString(templateString);
- arg->dataTypeClass = eSystem_FindClass(findModule, templateString);
+ arg->dataTypeClass = System_FindClass(findModule, templateString, true);
if(!arg->dataTypeClass)
- arg->dataTypeClass = eSystem_FindClass(templatedClass.module, templateString);
+ arg->dataTypeClass = System_FindClass(templatedClass.module, templateString, true);
if(!arg->dataTypeClass)
- arg->dataTypeClass = eSystem_FindClass(templatedClass.module.application, templateString);
+ arg->dataTypeClass = System_FindClass(templatedClass.module.application, templateString, true);
}
else
{
CopyTemplateArg(param, templatedClass.templateArgs[curParamID]);
if(param.type == type && param.defaultArg.dataTypeString)
{
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(findModule, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(findModule, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module, param.defaultArg.dataTypeString, true);
if(!templatedClass.templateArgs[curParamID].dataTypeClass)
- templatedClass.templateArgs[curParamID].dataTypeClass = eSystem_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString);
+ templatedClass.templateArgs[curParamID].dataTypeClass = System_FindClass(templatedClass.module.application, param.defaultArg.dataTypeString, true);
}
}
curParamID++;
}
}
// TESTING: Added this here...
- memberClass = eSystem_FindClass(findModule, className);
+ memberClass = System_FindClass(findModule, className, true);
if(!memberClass)
- memberClass = eSystem_FindClass(templatedClass.module, className);
+ memberClass = System_FindClass(templatedClass.module, className, true);
if(!memberClass)
- memberClass = eSystem_FindClass(templatedClass.module.application, className);
+ memberClass = System_FindClass(templatedClass.module.application, className, true);
}
if(memberClass)
type = type;
(type == identifier) ? info : CopyString(info);
};
+
+ {
+ Class c = eSystem_FindClass(_class.module, name);
+ if(c && c.internalDecl)
+ {
+ c.module.classes.Remove(c);
+ eClass_Unregister(c);
+ }
+ }
if(defaultArg != null)
{
param.defaultArg = defaultArg;