3 #define YYLTYPE Location
7 const char * defaultNameSpace;
8 int defaultNameSpaceLen;
9 public void SetDefaultNameSpace(const char * s) { defaultNameSpace = s; defaultNameSpaceLen = s ? strlen(s) : 0; }
11 bool strictNameSpaces;
12 public void SetStrictNameSpaces(bool b) { strictNameSpaces = b; }
14 AccessMode declMode = privateAccess;
15 AccessMode structDeclMode = privateAccess;
17 public void SetDeclMode(AccessMode accessMode) { structDeclMode = declMode = accessMode; }
18 AccessMode defaultDeclMode = privateAccess;
19 public void SetDefaultDeclMode(AccessMode accessMode) { defaultDeclMode = accessMode; }
21 const char * currentNameSpace;
22 int currentNameSpaceLen;
23 public void SetCurrentNameSpace(const char * s) { currentNameSpace = s; currentNameSpaceLen = s ? strlen(s) : 0; }
26 Time findClassTotalTime;
27 Time checkTypeTotalTime;
28 Time externalImportTotalTime;
29 Time findClassIgnoreNSTotalTime;
32 public OldList * MkList()
34 return new0 OldList[1];
37 public OldList * MkListOne(void * item)
39 OldList * list = new0 OldList[1];
44 void ListAdd(OldList list, void * item)
50 void ListAddFront(OldList list, void * item)
53 list.Insert(null, item);
56 public Identifier MkIdentifier(const char * string)
61 id._class = null; // Default class...
65 const char * namePart;
66 bool gotColon = false;
67 for(c = strlen(string)-1; c >= 0; c--)
74 namePart = string+c+1;
75 while(c >= 0 && string[c] == ':') c--;
81 memcpy(name, string, c+1);
83 // TODO: Do these better, keep in string?
84 if(!strcmp(name, "typed_object"))
86 id._class = MkSpecifierName("typed_object"); //"class");
87 id.string = CopyString(namePart);
89 else if(!strcmp(name, "property"))
91 id._class = MkSpecifierName("property");
92 id.string = CopyString(namePart);
94 else if(!strcmp(name, "typed_object&"))
96 id._class = MkSpecifierName("typed_object&");
97 id.string = CopyString(namePart);
99 else if(!strcmp(name, "any_object"))
101 id._class = MkSpecifierName("any_object");
102 id.string = CopyString(namePart);
106 TemplatedType templatedType = FindTemplateTypeParameter(curContext, name);
109 id._class = Specifier { type = templateTypeSpecifier, templateParameter = templatedType.param };
110 //id._class = MkSpecifierName(name);
111 id.string = CopyString(namePart);
115 symbol = FindClass(name);
118 id._class = _MkSpecifierName(symbol.string, symbol, null);
119 id.string = CopyString(namePart);
122 id.string = CopyString(string);
128 id._class = MkSpecifierName(null);
129 id.string = CopyString(namePart);
132 id.string = CopyString(string);
135 id.string = CopyString("");
139 public TemplateParameter MkTypeTemplateParameter(Identifier identifier, TemplateDatatype baseTplDatatype, TemplateArgument defaultArgument)
141 if(identifier.string)
143 TemplateParameter param { type = TemplateParameterType::type, identifier = identifier, dataType = baseTplDatatype, defaultArgument = defaultArgument };
144 TemplatedType type { key = (uintptr)identifier.string, param = param };
145 if(!curContext.templateTypes.Add((BTNode)type))
152 public TemplateParameter MkIdentifierTemplateParameter(Identifier identifier, TemplateMemberType memberType, TemplateArgument defaultArgument)
154 if(identifier.string)
156 TemplateParameter param { type = TemplateParameterType::identifier, identifier = identifier, memberType = memberType, defaultArgument = defaultArgument };
162 public TemplateParameter MkExpressionTemplateParameter(Identifier identifier, TemplateDatatype dataType, TemplateArgument defaultArgument)
164 if(identifier.string)
166 TemplateParameter param { type = TemplateParameterType::expression, identifier = identifier, dataType = dataType, defaultArgument = defaultArgument };
172 public TemplateDatatype MkTemplateDatatype(OldList * specifiers, Declarator decl)
174 TemplateDatatype datatype { specifiers = specifiers, decl = decl };
178 public TemplateArgument MkTemplateTypeArgument(TemplateDatatype tplDatatype)
180 TemplateArgument argument { type = type, templateDatatype = tplDatatype };
184 public TemplateArgument MkTemplateExpressionArgument(Expression expr)
186 TemplateArgument argument { type = expression, expression = expr };
190 public TemplateArgument MkTemplateIdentifierArgument(Identifier ident)
192 TemplateArgument argument { type = identifier, identifier = ident };
196 Expression MkExpExtensionCompound(Statement compound)
198 return { type = extensionCompoundExp, compound = compound };
201 Expression MkExpExtensionExpression(OldList * expressions)
203 return { type = extensionExpressionExp, list = expressions, loc = yylloc };
206 Expression MkExpExtensionInitializer(TypeName typeName, Initializer initializer)
208 return { type = extensionInitializerExp, initializer.typeName = typeName, initializer.initializer = initializer, loc = yylloc };
211 public Expression MkExpIdentifier(Identifier id)
213 return { type = identifierExp, identifier = id, loc = yylloc };
216 public Expression MkExpDummy()
218 Expression exp { type = dummyExp };
222 public Expression MkExpConstant(const char * string)
224 return { type = constantExp, constant = CopyString(string), loc = yylloc };
227 Expression MkExpString(const char * string)
229 return { type = stringExp, string = CopyString(string), loc = yylloc };
232 Expression MkExpWideString(const char * string)
234 return { type = stringExp, string = CopyString(string), loc = yylloc, wideString = true };
237 // TODO: String is case sensitive..
238 // What should we do about it?
239 /*public class CaseSensitiveString : String
241 int OnCompare(CaseSensitiveString string2)
245 result = strcmpi(this, string2);
246 else if(!this && string2)
248 else if(this && !string2)
254 public struct ContextStringPair
256 String string, context;
258 // TODO: Should this be automated somehow?
265 int OnCompare(ContextStringPair b)
268 result = (string && b.string) ? strcmp(string, b.string) :
269 (!string && b.string) ? 1 : (string && !b.string) ? -1 : 0;
270 if(result) return result;
272 result = (context && b.context) ? strcmp(context, b.context) :
273 (!context && b.context) ? 1 : (context && !b.context) ? -1 : 0;
274 // TODO: Support these
275 // result = CaseSensitiveString::OnCompare(string, b.string);
276 // result = ((CaseSensitiveString)string).OnCompare(b.string);
281 Map<ContextStringPair, List<Location>> intlStrings { };
283 Expression MkExpIntlString(const char * string, const char * context)
287 OldList * list = MkList();
291 ContextStringPair pair { };
293 int len = strlen(string);
295 pair.string = new byte[len-2+1]; memcpy(pair.string, string+1, len-2); pair.string[len-2] = '\0';
296 if(context) { len = strlen(context); pair.context = new byte[len-2+1]; memcpy(pair.context, context+1, len-2); pair.context[len-2] = '\0'; }
298 list = intlStrings[pair];
302 intlStrings[pair] = list;
311 //ListAdd(list, QMkExpId("__thisModule"));
312 s = QMkString(i18nModuleName ? i18nModuleName : "");
313 ListAdd(list, MkExpString(s));
315 ListAdd(list, MkExpString(string));
318 int lenString = strlen(string), lenContext = strlen(context);
319 char * msgid = new char[lenString-2 + lenContext-2 + 4];
321 memcpy(msgid+1, context+1, lenContext-2);
322 msgid[1+lenContext-2] = 4; // EOT
323 memcpy(msgid+1+lenContext-2+1, string+1, lenString-2);
324 memcpy(msgid+1+lenContext-2+1+lenString-2, "\"", 2);
325 ListAdd(list, MkExpString(msgid));
329 ListAdd(list, QMkExpId("null"));
330 return MkExpCall(QMkExpId("GetTranslatedString"), list);
334 Expression e = MkExpString(string);
340 Expression MkExpOp(Expression exp1, int op, Expression exp2)
351 exp.loc.start = exp1 ? exp1.loc.start : exp2.loc.start;
352 exp.loc.end = exp2 ? exp2.loc.end : exp1.loc.end;
357 Expression MkExpBrackets(OldList expressions)
364 if(expressions && expressions.first)
366 exp.loc.start = ((Expression)expressions.first).loc.start;
367 exp.loc.end = ((Expression)expressions.last).loc.end;
372 Expression MkExpIndex(Expression expression, OldList index)
374 return { type = indexExp, index.exp = expression, index.index = index };
377 Expression MkExpCall(Expression expression, OldList arguments)
379 return { type = callExp, call.exp = expression, call.arguments = arguments, loc = yylloc };
382 Expression MkExpMember(Expression expression, Identifier member)
384 return { type = memberExp, member.exp = expression, member.member = member, loc = yylloc };
387 Expression MkExpPointer(Expression expression, Identifier member)
389 return { type = pointerExp, member.exp = expression, member.member = member, loc = yylloc };
392 Expression MkExpTypeSize(TypeName typeName)
394 return { type = typeSizeExp, typeName = typeName, loc = yylloc };
397 Expression MkExpTypeAlign(TypeName typeName)
399 return { type = typeAlignExp, typeName = typeName, loc = yylloc };
402 Expression MkExpOffsetOf(TypeName typeName, Identifier id)
404 return { type = offsetOfExp, offset.typeName = typeName, offset.id = id, loc = yylloc };
407 Expression MkExpClassSize(Specifier _class)
409 return { type = classSizeExp, _class = _class, loc = yylloc };
412 Expression MkExpCast(TypeName typeName, Expression expression)
414 return { type = castExp, cast.typeName = typeName, cast.exp = expression, loc = yylloc };
417 Expression MkExpCondition(Expression cond, OldList expressions, Expression elseExp)
419 return { type = conditionExp, cond.cond = cond, cond.exp = expressions, cond.elseExp = elseExp, loc = yylloc };
422 Expression MkExpRenew(Expression memExp, TypeName type, Expression size)
424 return { type = renewExp, _renew.exp = memExp, _renew.typeName = type, _renew.size = size, loc = yylloc };
427 Expression MkExpRenew0(Expression memExp, TypeName type, Expression size)
429 return { type = renew0Exp, _renew.exp = memExp, _renew.typeName = type, _renew.size = size, loc = yylloc };
432 Expression MkExpNew(TypeName type, Expression size)
434 return { type = newExp, _new.typeName = type, _new.size = size, loc = yylloc };
437 Expression MkExpNew0(TypeName type, Expression size)
439 return { type = new0Exp, _new.typeName = type, _new.size = size, loc = yylloc };
442 Expression MkExpVaArg(Expression exp, TypeName type)
444 return { type = vaArgExp, vaArg.exp = exp, vaArg.typeName = type, loc = yylloc };
447 Specifier MkSpecifier(int specifier)
449 if(specifier == _BOOL && (declMode != defaultAccess && defaultDeclMode != defaultAccess))
450 return MkSpecifierName("bool");
451 else if(specifier == _BOOL || specifier == BOOL)
452 return { type = baseSpecifier, specifier = specifier };
454 return { type = baseSpecifier, specifier = specifier };
457 Specifier MkSpecifierTypeOf(Expression expression)
459 return { type = typeOfSpecifier, expression = expression };
462 Specifier MkSpecifierSubClass(Specifier _class)
464 return { type = subClassSpecifier, _class = _class };
467 Specifier MkSpecifierExtended(ExtDecl extDecl)
469 return { type = extendedSpecifier, extDecl = extDecl /*name = CopyString(name)*/ };
472 Specifier MkEnum(Identifier id, OldList list)
476 type = enumSpecifier;
480 if(list && (!declMode || !id))
486 type = ProcessType(&specs, null);
490 Symbol symbol { string = CopyString(id.string), isStruct = true, type = type };
492 if(strstr(symbol.string, "::"))
493 curContext.hasNameSpace = true;
494 if(!curContext.structSymbols.Add((BTNode)symbol))
497 for(e = list.first; e; e = e.next)
499 Symbol symbol { string = CopyString(e.id.string), type = type };
501 if(strstr(symbol.string, "::"))
502 curContext.hasNameSpace = true;
503 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
511 Specifier MkStructOrUnion(SpecifierType type, Identifier id, OldList definitions)
513 Specifier spec { type = type, id = id };
514 if(id && FindType(curContext, id.string))
515 structDeclMode = defaultAccess;
516 spec.definitions = definitions;
517 if(definitions && id && structDeclMode == defaultAccess)
522 symbol = Symbol { string = CopyString(id.string), type = ProcessType(specs, null), isStruct = true };
523 if(!curContext.structSymbols.Add((BTNode)symbol))
529 void AddStructDefinitions(Specifier spec, OldList definitions)
531 spec.definitions = definitions;
532 if(definitions && spec.id && !declMode)
537 symbol = Symbol { string = CopyString(spec.id.string), type = ProcessType(specs, null), isStruct = true };
538 if(!curContext.parent.structSymbols.Add((BTNode)symbol))
543 Attribute MkAttribute(String attr, Expression exp)
545 return { attr = attr, exp = exp };
548 Attrib MkAttrib(int type, OldList * attribs)
550 return { type = type, attribs = attribs };
553 ExtDecl MkExtDeclString(String s)
555 return { type = extDeclString, s = s };
559 ExtDecl MkExtDeclAttrib(Attrib attr)
561 return { type = extDeclAttrib, attr = attr };
565 public Declarator MkDeclaratorIdentifier(Identifier id)
567 return { type = identifierDeclarator, identifier = id };
570 Declarator MkDeclaratorFunction(Declarator declarator, OldList parameters)
572 return { type = functionDeclarator, declarator = declarator, function.parameters = parameters };
575 Declarator MkDeclaratorExtended(ExtDecl extended, Declarator declarator)
577 return { type = extendedDeclarator, declarator = declarator, extended.extended = extended };
580 Declarator MkDeclaratorExtendedEnd(ExtDecl extended, Declarator declarator)
582 return { type = extendedDeclaratorEnd, declarator = declarator, extended.extended = extended };
585 Declarator MkStructDeclarator(Declarator declarator, Expression exp)
587 return { type = structDeclarator, declarator = declarator, structDecl.exp = exp };
590 Declarator MkDeclaratorBrackets(Declarator declarator)
592 return { type = bracketsDeclarator, declarator = declarator };
595 Declarator MkDeclaratorArray(Declarator declarator, Expression exp)
597 return { type = arrayDeclarator, declarator = declarator, array.exp = exp };
600 Declarator MkDeclaratorEnumArray(Declarator declarator, Specifier _class)
602 return { type = arrayDeclarator, declarator = declarator, array.enumClass = _class };
605 Declarator MkDeclaratorPointer(Pointer pointer, Declarator declarator)
607 return { type = pointerDeclarator, declarator = declarator, pointer.pointer = pointer };
610 Enumerator MkEnumerator(Identifier id, Expression exp)
612 return { id = id, exp = exp };
615 Pointer MkPointer(OldList qualifiers, Pointer pointer)
617 return { qualifiers = qualifiers, pointer = pointer };
620 Initializer MkInitializerAssignment(Expression exp)
622 /*if(yylloc.start.line == 1)
624 return { type = expInitializer, exp = exp, loc = yylloc };
627 Initializer MkInitializerList(OldList list)
629 /*if(yylloc.start.line == 1)
631 return { type = listInitializer, list = list, loc = yylloc };
634 InitDeclarator MkInitDeclarator(Declarator declarator, Initializer initializer)
636 return { declarator = declarator, initializer = initializer };
639 public TypeName MkTypeName(OldList qualifiers, Declarator declarator)
641 if(qualifiers != null)
643 Declarator parentDecl = declarator;
644 Declarator decl = declarator;
645 while(decl && decl.type == arrayDeclarator)
646 decl = decl.declarator;
647 if(decl && decl.type == identifierDeclarator && decl.identifier.string && CheckType(decl.identifier.string) == TYPE_NAME)
650 // Check if we're missing a real type specifier here
651 for(spec = qualifiers.first; spec; spec = spec.next)
653 if(spec.type == baseSpecifier)
655 if(spec.specifier == CONST || spec.specifier == VOLATILE ||
656 spec.specifier == EXTERN || spec.specifier == STATIC ||
657 spec.specifier == AUTO || spec.specifier == REGISTER)
661 else if(spec.type != extendedSpecifier)
666 // This is actually a type
667 ListAdd(qualifiers, MkSpecifierName(decl.identifier.string));
668 FreeDeclarator(decl);
669 parentDecl.declarator = null;
673 return { qualifiers = qualifiers, declarator = declarator };
676 public TypeName MkTypeNameGuessDecl(OldList qualifiers, Declarator declarator)
678 if(qualifiers != null)
680 bool gotType = false;
681 bool gotFullType = false;
682 Specifier spec, next;
683 for(spec = qualifiers.first; spec; spec = next)
686 if(gotType && !declarator && ((spec.type == nameSpecifier && spec.name) || (spec.type == baseSpecifier && gotFullType)))
688 const String s = null;
689 if(spec.type == nameSpecifier)
691 char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
692 s = colon ? colon + 2 : spec.name;
694 else if(spec.type == baseSpecifier)
696 if(spec.specifier == INT64) s = "int64";
697 else if(spec.specifier == INT128) s = "__int128";
701 declarator = MkDeclaratorIdentifier(MkIdentifier(s));
702 qualifiers.Remove(spec);
707 if(spec && spec.type != extendedSpecifier)
709 if(spec.type == baseSpecifier)
711 if(spec.specifier == CONST || spec.specifier == VOLATILE ||
712 spec.specifier == EXTERN || spec.specifier == STATIC ||
713 spec.specifier == AUTO || spec.specifier == REGISTER)
715 else if(spec.specifier != UNSIGNED && spec.specifier != SIGNED && spec.specifier != LONG)
727 return { qualifiers = qualifiers, declarator = declarator };
730 public Identifier GetDeclId(Declarator decl)
732 while(decl && decl.type != identifierDeclarator)
733 decl = decl.declarator;
734 return decl ? decl.identifier : null;
737 Declaration MkDeclarationClassInst(Instantiation inst)
739 return { type = instDeclaration, inst = inst, loc = yylloc };
742 Declaration MkDeclarationInst(Instantiation inst)
744 Declaration decl { type = instDeclaration, inst = inst, loc = yylloc };
746 if(curContext == globalContext && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
749 int len = 0, stringLen;
752 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
753 len += defaultNameSpaceLen;
759 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
760 len += currentNameSpaceLen;
765 stringLen = strlen(inst.exp.identifier.string);
766 memcpy(name + len, inst.exp.identifier.string, stringLen);
769 delete inst.exp.identifier.string;
770 inst.exp.identifier.string = CopyString(name);
775 string = (inst.exp.type == identifierExp) ? CopyString(inst.exp.identifier.string) : null;
776 type = MkClassTypeSymbol(inst._class.symbol);
778 if(strstr(symbol.string, "::"))
779 curContext.hasNameSpace = true;
780 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
781 excludedSymbols->Add(symbol);
782 decl.symbol = inst.symbol = symbol;
786 Declaration MkDeclarationDefine(Identifier id, Expression exp)
788 Declaration decl { type = defineDeclaration, id = id, exp = exp, loc = yylloc };
789 char expString[1024];
792 PrintExpression(exp, expString);
794 if(curContext == globalContext && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
797 int len = 0, stringLen;
800 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
801 len += defaultNameSpaceLen;
807 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
808 len += currentNameSpaceLen;
812 stringLen = strlen(id.string);
813 memcpy(name + len, id.string, stringLen);
817 id.string = CopyString(name);
820 if(!eSystem_FindDefine(privateModule, id.string))
821 eSystem_RegisterDefine(id.string, expString, privateModule, buildingECERECOMModule ? baseSystemAccess : publicAccess);
823 Compiler_Warning($"Redefinition of %s ignored\n", id.string);
827 Declaration MkDeclaration(OldList specifiers, OldList initDeclarators)
829 Declaration decl { type = initDeclaration, declarators = initDeclarators, specifiers = specifiers, loc = yylloc };
830 bool variable = true;
832 if(specifiers != null)
834 bool gotType = false;
835 Specifier spec, next;
836 for(spec = specifiers.first; spec; spec = next)
839 if(spec.type == baseSpecifier && spec.specifier == TYPEDEF)
841 if(initDeclarators != null)
845 for(d = initDeclarators.first; d; d = d.next)
847 if(GetDeclId(d.declarator).string)
851 string = CopyString(GetDeclId(d.declarator).string);
852 type = ProcessType(specifiers, d.declarator);
855 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).types.Add((BTNode)type))
856 excludedSymbols->Add(type);
857 decl.symbol = d.declarator.symbol = type;
863 //for(spec = spec.next; spec; spec = spec.next)
864 spec = specifiers.last;
866 if((spec.type == nameSpecifier && spec.name) || spec.type == baseSpecifier)
868 const String s = null;
869 if(spec.type == nameSpecifier)
871 const char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
872 s = colon ? colon + 2 : spec.name;
874 else if(spec.type == baseSpecifier)
876 if(spec.specifier == INT64) s = "int64";
877 else if(spec.specifier == INT128) s = "__int128";
881 Symbol type { string = CopyString(s), type = ProcessType(specifiers, null) };
883 decl.declarators = initDeclarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
884 specifiers.Remove(spec);
886 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).types.Add((BTNode)type))
887 excludedSymbols->Add(type);
895 else if(spec.type == baseSpecifier &&
896 (spec.specifier == STRUCT || spec.specifier == UNION))
900 if(gotType && initDeclarators == null && !spec.next && ((spec.type == nameSpecifier && spec.name) || spec.type == baseSpecifier))
902 const String s = null;
903 if(spec.type == nameSpecifier)
905 char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
906 s = colon ? colon + 2 : spec.name;
908 else if(spec.type == baseSpecifier)
910 if(spec.specifier == INT64) s = "int64";
911 else if(spec.specifier == INT128) s = "__int128";
915 decl.declarators = initDeclarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
916 specifiers.Remove(spec);
922 if(spec && spec.type != extendedSpecifier)
926 if(variable && initDeclarators)
929 for(d = initDeclarators.first; d; d = d.next)
931 Identifier id = GetDeclId(d.declarator);
932 if(id && id.string && id.string[0])
938 if(curContext == globalContext && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
941 int len = 0, stringLen;
944 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
945 len += defaultNameSpaceLen;
951 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
952 len += currentNameSpaceLen;
956 stringLen = strlen(id.string);
957 memcpy(name + len, id.string, stringLen);
961 id.string = CopyString(name);
964 // Avoid memory leaks on duplicated symbols (BinaryTree::Add Would Fail)
965 symbol = (Symbol)(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.FindString(id.string);
966 if(!symbol && strcmp(id.string, "strlen")) // Avoid overriding our definition of strlen or our 'uintsize' warning override won't take effect
968 symbol = Symbol { string = CopyString(id.string), type = ProcessType(specifiers, d.declarator) };
969 if(strstr(symbol.string, "::"))
970 curContext.hasNameSpace = true;
971 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
972 excludedSymbols->Add(symbol);
973 // TODO: Add better support to count declarators
974 if(symbol.type && symbol.type.kind == arrayType && !symbol.type.arraySizeExp && d.initializer)
976 if(d.initializer.type == listInitializer)
979 sprintf(string, "%d",d.initializer.list->count);
980 symbol.type.arraySizeExp = MkExpConstant(string);
981 symbol.type.freeExp = true;
983 else if(d.initializer.type == expInitializer && d.initializer.exp.type == stringExp && d.initializer.exp.string)
988 bool escaped = false;
989 char * s = d.initializer.exp.string;
992 // MAKE MORE ACCURATE
993 for(c = 1; (ch = s[c]); c++)
995 if(ch == '\\' && !escaped)
1004 sprintf(string, "%d", count);
1005 symbol.type.arraySizeExp = MkExpConstant(string);
1006 symbol.type.freeExp = true;
1010 decl.symbol = d.declarator.symbol = symbol;
1017 decl.symbol = Symbol { };
1018 excludedSymbols->Add(decl.symbol);
1023 Declaration MkStructDeclaration(OldList specifiers, OldList declarators, Specifier extStorage)
1025 Declaration decl { type = structDeclaration, declarators = declarators, specifiers = specifiers, extStorage = extStorage, loc = yylloc };
1026 if(specifiers != null)
1028 bool gotType = false;
1029 Specifier spec, next;
1030 for(spec = specifiers.first; spec; spec = next)
1033 if(gotType && declarators == null && ((spec.type == nameSpecifier && spec.name) || spec.type == baseSpecifier))
1035 const String s = null;
1036 if(spec.type == nameSpecifier)
1038 const char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
1039 s = colon ? colon + 2 : spec.name;
1041 else if(spec.type == baseSpecifier)
1043 if(spec.specifier == INT64) s = "int64";
1044 else if(spec.specifier == INT128) s = "__int128";
1048 decl.declarators = declarators = MkListOne(MkStructDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
1049 specifiers.Remove(spec);
1050 FreeSpecifier(spec);
1054 if(spec && spec.type != extendedSpecifier)
1061 Statement MkLabeledStmt(Identifier id, Statement statement)
1063 return { type = labeledStmt, labeled.id = id, labeled.stmt = statement, loc = yylloc };
1066 Statement MkCaseStmt(Expression exp, Statement statement)
1068 return { type = caseStmt, caseStmt.exp = exp, caseStmt.stmt = statement, loc = yylloc };
1071 Statement MkCompoundStmt(OldList declarations, OldList statements)
1073 return { type = compoundStmt, compound.declarations = declarations, compound.statements = statements, loc = yylloc };
1076 Statement MkExpressionStmt(OldList expressions)
1078 return { type = expressionStmt, expressions = expressions, loc = yylloc };
1081 Statement MkBadDeclStmt(Declaration decl)
1083 return { type = badDeclarationStmt, decl = decl, loc = yylloc };
1086 Statement MkIfStmt(OldList exp, Statement statement, Statement elseStmt)
1088 return { type = ifStmt, ifStmt.exp = exp, ifStmt.stmt = statement, ifStmt.elseStmt = elseStmt, loc = yylloc };
1091 Statement MkSwitchStmt(OldList exp, Statement statement)
1093 // To know it's a switch compound... (Don't want declarations in there... bugs)
1095 statement.compound.isSwitch = true;
1096 return { type = switchStmt, switchStmt.exp = exp, switchStmt.stmt = statement, loc = yylloc };
1099 Statement MkWhileStmt(OldList exp, Statement statement)
1101 return { type = whileStmt, whileStmt.exp = exp, whileStmt.stmt = statement, loc = yylloc };
1104 Statement MkDoWhileStmt(Statement statement, OldList exp)
1106 return { type = doWhileStmt, doWhile.exp = exp, doWhile.stmt = statement, loc = yylloc };
1109 Statement MkForStmt(Statement init, Statement check, OldList inc, Statement statement)
1111 return { type = forStmt, forStmt.init = init, forStmt.check = check, forStmt.increment = inc, forStmt.stmt = statement, loc = yylloc };
1114 Statement MkForEachStmt(Identifier id, OldList exp, OldList filter, Statement statement)
1116 return { type = forEachStmt, forEachStmt.id = id, forEachStmt.exp = exp, forEachStmt.filter = filter, forEachStmt.stmt = statement, loc = yylloc };
1119 Statement MkGotoStmt(Identifier id)
1121 return { type = gotoStmt, gotoStmt.id = id, loc = yylloc };
1124 Statement MkContinueStmt()
1126 return { type = continueStmt, loc = yylloc };
1129 Statement MkBreakStmt()
1131 return { type = breakStmt, loc = yylloc };
1134 Statement MkReturnStmt(OldList exp)
1136 return { type = returnStmt, expressions = exp, loc = yylloc };
1139 FunctionDefinition MkFunction(OldList specifiers, Declarator declarator, OldList declarationList)
1141 return _MkFunction(specifiers, declarator, declarationList, true);
1144 FunctionDefinition _MkFunction(OldList specifiers, Declarator declarator, OldList declarationList, bool errorOnOmit)
1148 Declarator funcDecl = GetFuncDecl(declarator);
1149 if(funcDecl && funcDecl.function.parameters)
1152 for(tn = funcDecl.function.parameters->first; tn; tn = tn.next)
1154 if(tn.qualifiers || tn.declarator)
1156 Identifier declID = tn.declarator ? GetDeclId(tn.declarator) : null;
1160 Specifier spec = tn.qualifiers ? tn.qualifiers->first : null;
1161 if(!tn.declarator && !tn.prev && !tn.next && spec && !spec.next && spec.type == baseSpecifier && spec.specifier == VOID);
1163 Compiler_Error($"parameter name omitted\n");
1170 return { specifiers = specifiers, declarator = declarator, declarations = declarationList };
1173 void ProcessFunctionBody(FunctionDefinition func, Statement body)
1175 Declarator declarator = func.declarator;
1176 Declarator funcDecl = GetFuncDecl(declarator);
1181 if(funcDecl && funcDecl.function.parameters && body)
1183 Context context = body.compound.context;
1185 for(param = funcDecl.function.parameters->first; param; param = param.next)
1187 if(param.declarator)
1189 Symbol symbol = null;
1190 Identifier id = GetDeclId(param.declarator);
1191 char * string = id ? id.string : null;
1194 for(symbol = (Symbol)context.symbols.first; symbol; symbol = (Symbol)((BTNode)symbol).next)
1195 if(!strcmp(symbol.string, string))
1197 // This parameter is not shadowed by a local declaration
1200 symbol = Symbol { string = CopyString(id.string), type = ProcessType(param.qualifiers, param.declarator), isParam = true };
1201 if(!context.symbols.Add((BTNode)symbol))
1202 excludedSymbols->Add(symbol);
1204 param.declarator.symbol = symbol;
1211 if(!declarator.symbol)
1213 Identifier id = GetDeclId(declarator);
1215 if((currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess && strcmp(id.string, "__on_register_module"))
1218 int len = 0, stringLen;
1219 if(defaultNameSpace)
1221 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
1222 len += defaultNameSpaceLen;
1226 if(currentNameSpace)
1228 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
1229 len += currentNameSpaceLen;
1233 stringLen = strlen(id.string);
1234 memcpy(name + len, id.string, stringLen);
1238 id.string = CopyString(name);
1240 symbol = Symbol { string = CopyString(id.string), type = ProcessType(func.specifiers, declarator) };
1241 if(strstr(symbol.string, "::"))
1242 globalContext.hasNameSpace = true;
1243 if(!globalContext.symbols.Add((BTNode)symbol))
1244 excludedSymbols->Add(symbol);
1245 declarator.symbol = symbol;
1249 symbol = declarator.symbol;
1250 excludedSymbols->Remove(declarator.symbol);
1251 delete symbol.string;
1252 symbol.string = CopyString(GetDeclId(declarator).string);
1253 if(strstr(symbol.string, "::"))
1254 globalContext.hasNameSpace = true;
1255 if(!globalContext.symbols.Add((BTNode)symbol))
1256 excludedSymbols->Add(symbol);
1259 symbol.type = ProcessType(func.specifiers, declarator);
1261 if(symbol.type && (symbol.type.kind == functionType || symbol.type.kind == methodType))
1263 if(!symbol.type.params.count)
1265 Type type { refCount = 1 };
1266 symbol.type.params.Add(type);
1275 External MkExternalFunction(FunctionDefinition function)
1277 External external { type = functionExternal, function = function, symbol = function.declarator.symbol };
1278 if(function.specifiers)
1281 for(spec = function.specifiers->first; spec; spec = spec.next)
1282 if(spec.type == baseSpecifier && spec.specifier == STATIC)
1284 structDeclMode = declMode = staticAccess;
1289 if(external.symbol && !external.symbol.methodExternal)
1290 external.symbol.methodExternal = external;
1294 External MkExternalImport(char * name, ImportType importType, AccessMode importAccess)
1296 External external { type = importExternal };
1297 int len = strlen(name) - 2;
1298 external.importString = new char[len + 1];
1299 strncpy(external.importString, name+1, len);
1300 external.importString[len] = '\0';
1305 Time startTime = GetTime();
1308 ImportModule(external.importString, importType, importAccess, true);
1309 ImportModule(external.importString, importType, importAccess, false);
1311 time = GetTime() - startTime;
1312 printf("Importing took %.3f seconds for %s\n", time, external.importString);
1313 externalImportTotalTime += time;
1319 External MkExternalDeclaration(Declaration declaration)
1321 External external { type = declarationExternal, declaration = declaration, symbol = declaration ? declaration.symbol : null };
1322 if(declaration && declaration.type == initDeclaration && declaration.specifiers)
1325 for(spec = declaration.specifiers->first; spec; spec = spec.next)
1326 if(spec.type == baseSpecifier && spec.specifier == TYPEDEF)
1328 structDeclMode = declMode = defaultAccess;
1331 else if(spec.type == baseSpecifier && spec.specifier == STATIC)
1333 structDeclMode = declMode = staticAccess;
1337 if(declaration && declaration.symbol && !declaration.symbol.methodExternal)
1338 declaration.symbol.methodExternal = external;
1342 External MkExternalNameSpace(Identifier identifier)
1344 External external { type = nameSpaceExternal, id = identifier };
1345 currentNameSpace = identifier ? identifier.string : null;
1346 currentNameSpaceLen = currentNameSpace ? strlen(currentNameSpace) : 0;
1350 void SetClassTemplateArgs(Specifier spec, OldList templateArgs)
1352 if(spec.type == nameSpecifier)
1354 Symbol symbol = spec.symbol;
1355 spec.templateArgs = templateArgs;
1356 if(templateArgs && templateArgs.first)
1358 char templateString[1024];
1359 TemplateArgument arg;
1360 strcpy(templateString, symbol ? symbol.string : spec.name);
1361 strcat(templateString, "<");
1362 for(arg = templateArgs.first; arg; arg = arg.next)
1370 char expString[1024];
1371 Class backupThisClass = thisClass;
1373 expString[0] = '\0';
1374 // Will this work here?
1376 Location oldLocation = yylloc;
1377 File backFileInput = fileInput;
1382 // TESTING THIS SCANNER RESUME STUFF
1385 yylloc = oldLocation;
1386 fileInput = backFileInput;
1389 fileInput.Seek(yylloc.start.pos, start);
1390 resetScannerPos(&yylloc.start);
1395 //ProcessExpressionType(arg.expression);
1396 //ComputeExpression(arg.expression);
1397 PrintExpression(arg.expression, expString);
1398 strcat(argument, expString);
1399 thisClass = backupThisClass;
1404 strcat(argument, arg.identifier.string);
1409 char * typeString = StringFromSpecDecl(arg.templateDatatype.specifiers, arg.templateDatatype.decl);
1410 strcat(argument, typeString);
1417 if(arg.prev) strcat(templateString, ", ");
1420 strcat(templateString, arg.name.string);
1421 strcat(templateString, " = ");
1423 strcat(templateString, argument);
1427 int len = strlen(templateString);
1428 if(templateString[len-1] == '>') templateString[len++] = ' ';
1429 templateString[len++] = '>';
1430 templateString[len++] = '\0';
1432 // printf("SetClassTemplateArgs templateString: %s\n", templateString);
1433 symbol = FindClass(templateString);
1434 if(!symbol && spec.symbol)
1436 // If class was only decl'ed, invoke DeclClass on this templated class as well
1437 symbol = _DeclClass(null, templateString);
1438 symbol.notYetDeclared = true;
1440 // Add a reference to all templated class to the basic class
1442 spec.symbol.templatedClasses.Add(OldLink { data = symbol });
1444 spec.symbol = symbol;
1445 spec.name = CopyString(symbol ? symbol.string : templateString);
1449 FreeList(templateArgs, FreeTemplateArgument);
1452 Specifier _MkSpecifierName(const char * name, Symbol symbol, OldList templateArgs)
1454 Specifier spec { type = nameSpecifier };
1460 TemplatedType templatedType = FindTemplateTypeParameter(curContext, name);
1463 spec.templateParameter = templatedType.param;
1464 spec.type = templateTypeSpecifier;
1468 symbol = FindClass(name);
1470 if(symbol && symbol.registered && symbol.registered.isRemote == 1)
1472 char className[1024];
1473 strcpy(className, "DCOMClient_");
1474 if(!strncmp(name, className, strlen(className)))
1475 spec.name = CopyString(name);
1478 strcat(className, name);
1479 spec.name = CopyString(className);
1484 char nameSpace[1024];
1485 char * c = strstr(name, symbol.string);
1486 spec.name = CopyString(symbol.string);
1487 if(c && c >= name + 2 && c[-1] == ':' && c[-2] == ':')
1491 memcpy(nameSpace, name, c - name - 2);
1492 nameSpace[c-name] = 0;
1493 spec.nsSpec = _MkSpecifierName(nameSpace, null, null);
1496 spec.nsSpec = _MkSpecifierName(null, null, null);
1500 spec.name = CopyString(name);
1501 spec.symbol = symbol;
1502 if(templateArgs != null)
1503 SetClassTemplateArgs(spec, templateArgs);
1508 public Specifier MkSpecifierName(const char * name)
1510 return _MkSpecifierName(name, null, null);
1513 public Specifier MkSpecifierNameArgs(const char * name, OldList * templateArgs)
1515 return _MkSpecifierName(name, null, templateArgs);
1519 Specifier MkClassName(const char * string)
1521 return { type = SpecifierClass, name = CopyString(string) };
1524 ClassFunction MkClassFunction(OldList specifiers, Specifier _class, Declarator decl, OldList declList)
1526 return { specifiers = specifiers, /*_class = _class,*/ declarator = decl, declarations = declList };
1529 void ProcessClassFunctionBody(ClassFunction func, Statement body)
1533 Declarator decl = func.declarator;
1535 //Declarator decl = GetFuncDecl(func.declarator);
1536 Declarator funcDecl = GetFuncDecl(func.declarator);
1540 if(decl && !decl.symbol)
1542 OldList * symbolSpecs = MkList();
1544 // WHAT WILL WE DO WITH THIS? Double instances?
1545 //if(decl.function.parameters && body)
1546 if(funcDecl && funcDecl.function.parameters && body)
1548 Context context = body.compound.context;
1550 for(param = funcDecl.function.parameters->first; param; param = param.next)
1552 if(param.declarator)
1554 Symbol symbol = null;
1555 Identifier id = GetDeclId(param.declarator);
1556 char * string = id ? id.string : null;
1559 symbol = (Symbol)context.symbols.FindString(string);
1561 // This parameter is not shadowed by a local declaration
1566 string = CopyString(id.string);
1567 type = ProcessType(param.qualifiers, param.declarator);
1571 if(!context.symbols.Add((BTNode)symbol))
1572 excludedSymbols->Add(symbol);
1574 param.declarator.symbol = symbol;
1579 //////////////////////////////////
1587 Identifier id = GetDeclId(funcDecl);
1591 for(c = strlen(id.string)-1; c >= 0; c--)
1593 if(id.string[c] == ':')
1595 char * string = CopyString(id.string + c + 1);
1596 id.string[c - 1] = 0;
1597 id._class = MkSpecifierName(id.string);
1603 symbol.string = CopyString(id.string);
1610 for(spec = func.specifiers->first; spec; spec = spec.next)
1611 symbolSpecs->Add(CopySpecifier(spec));
1613 symbol.type = ProcessType(symbolSpecs, decl);
1614 decl.symbol = symbol;
1616 excludedSymbols->Add(symbol);
1618 FreeList(symbolSpecs, FreeSpecifier);
1622 OldList * MkSpecsClass(Specifier _class)
1624 OldList * list = MkList();
1625 ListAdd(list, _class);
1629 MemberInit MkMemberInit(OldList ids, Initializer initializer)
1631 return { identifiers = ids, initializer = initializer };
1634 MemberInit MkMemberInitExp(Expression idExp, Initializer initializer)
1636 MemberInit init { initializer = initializer, identifiers = MkList() };
1639 for(exp = idExp; exp && exp.type == memberExp; exp = exp.member.exp)
1641 init.identifiers->Insert(null, exp.member.member);
1642 exp.member.member = null;
1644 if(exp && exp.type == identifierExp)
1646 init.identifiers->Insert(null, exp.identifier);
1647 exp.identifier = null;
1649 FreeExpression(idExp);
1653 MembersInit MkMembersInitList(OldList dataMembers)
1655 return { type = dataMembersInit, dataMembers = dataMembers };
1658 MembersInit MkMembersInitMethod(ClassFunction function)
1660 return { type = methodMembersInit, function = function };
1663 Instantiation MkInstantiation(Specifier _class, Expression exp, OldList members)
1665 return { _class = _class, exp = exp, members = members };
1668 Instantiation MkInstantiationNamed(OldList specs, Expression exp, OldList members)
1670 Instantiation inst { exp = exp, members = members };
1675 for(spec = specs.first; spec; spec = spec.next)
1676 if(spec.type == nameSpecifier /*classSpecifier*/)
1683 FreeList(specs, FreeSpecifier);
1687 Compiler_Error($"Expecting class specifier\n");
1688 inst._class = MkSpecifierName /*MkClassName*/("");
1696 ClassDef MkClassDefAccessOverride(AccessMode access, Identifier id)
1698 return { type = accessOverrideClassDef, id = id, memberAccess = access };
1701 ClassDef MkClassDefMemberAccess()
1703 return { type = memberAccessClassDef };
1706 ClassDef MkClassDefDeclaration(Declaration decl)
1708 return { type = declarationClassDef, decl = decl };
1711 ClassDef MkClassDefClassData(Declaration decl)
1713 return { type = classDataClassDef, decl = decl };
1716 ClassDef MkClassDefDesigner(const char * designer)
1718 return { type = classDesignerClassDef, designer = CopyString(designer) };
1721 ClassDef MkClassDefNoExpansion()
1723 return { type = classNoExpansionClassDef };
1726 ClassDef MkClassDefFixed()
1728 return { type = classFixedClassDef };
1731 ClassDef MkClassDefDesignerDefaultProperty(Identifier id)
1733 return { type = designerDefaultPropertyClassDef, defaultProperty = id };
1736 ClassDef MkClassDefDefaultProperty(OldList defProperties)
1738 return { type = defaultPropertiesClassDef, defProperties = defProperties };
1741 ClassDef MkClassDefFunction(ClassFunction function)
1744 if(function && function.declarator)
1746 Declarator funcDecl = GetFuncDecl(function.declarator);
1747 if(funcDecl && funcDecl.declarator && funcDecl.declarator.type == bracketsDeclarator)
1749 def.type = declarationClassDef;
1750 def.decl = MkStructDeclaration(function.specifiers, MkListOne(MkStructDeclarator(function.declarator, null)), null);
1751 function.declarator = null;
1752 function.specifiers = null;
1753 FreeClassFunction(function);
1757 def.type = functionClassDef;
1758 def.function = function;
1762 Symbol DeclClassAddNameSpace(Specifier _class, const char * className)
1765 int len = 0, stringLen;
1767 if(className[0] != ':' && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess && (!_class || _class.name))
1769 if(defaultNameSpace)
1771 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
1772 len += defaultNameSpaceLen;
1776 if(currentNameSpace)
1778 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
1779 len += currentNameSpaceLen;
1784 stringLen = strlen(className);
1785 memcpy(name + len, className, stringLen);
1788 return _DeclClass(_class, name);
1791 Symbol DeclClass(Specifier _class, const char * name)
1793 if(_class || strchr(name, ':'))
1794 return _DeclClass(_class, name);
1796 return DeclClassAddNameSpace(_class, name);
1799 Symbol _DeclClass(Specifier _class, const char * name)
1802 char nameBuffer[1024];
1805 strcpy(nameBuffer, _class.name ? _class.name : "");
1806 strcat(nameBuffer, "::");
1807 strcat(nameBuffer, name);
1811 symbol = FindClass(name);
1815 Context classContext;
1816 for(classContext = curContext; classContext && !classContext.classDef; classContext = classContext.parent);
1822 if(name[0] == ':' && name[1] == ':')
1826 string = CopyString(name);
1827 notYetDeclared = true;
1829 if(!globalContext.classes.Add((BTNode)symbol))
1830 excludedSymbols->Add(symbol);
1835 for(c = 0; (ch = name[c]); c++)
1837 if(ch == '.' || (ch == ':' && name[c+1] == ':'))
1843 if(start && c - start)
1844 symbol.shortName = CopyString(name + start);
1850 void SetupBaseSpecs(Symbol symbol, OldList baseSpecs)
1852 if(baseSpecs && baseSpecs.first && ((Specifier)baseSpecs.first).type == nameSpecifier)
1857 strcpy(name, ((Specifier)baseSpecs.first).name);
1858 tpl = strchr(name, '<');
1861 baseClass = FindClass(name);
1862 if(baseClass && baseClass.ctx)
1865 for(copy = (TemplatedType)baseClass.ctx.templateTypes.first; copy; copy = (TemplatedType)copy.next)
1867 TemplatedType type { key = copy.key, param = copy.param };
1868 if(!curContext.templateTypes.Add((BTNode)type))
1872 else if(baseClass && baseClass.registered)
1875 for(sClass = baseClass.registered; sClass; sClass = sClass.base)
1877 ClassTemplateParameter p;
1878 for(p = sClass.templateParams.first; p; p = p.next)
1880 //OldList * specs = MkList();
1881 //Declarator decl = null;
1882 //decl = SpecDeclFromString(p.dataTypeString, specs, null);
1885 TemplateParameter param = p.param;
1889 p.param = param = TemplateParameter
1891 identifier = MkIdentifier(p.name), type = p.type,
1892 dataTypeString = p.dataTypeString /*, dataType = { specs, decl }*/
1895 type = TemplatedType { key = (uintptr)p.name, param = param };
1896 if(!curContext.templateTypes.Add((BTNode)type))
1905 ClassDefinition MkClass(Symbol symbol, OldList baseSpecs, OldList definitions)
1907 ClassDefinition classDef;
1908 SetupBaseSpecs(symbol, baseSpecs);
1911 ClassDefinition classDef = symbol.ctx.classDef;
1914 // This can occur if two instances of a class are defined...
1915 // To avoid dangling 'parent' Contexts, we free the previous class definition
1917 for(external = ast->first; external; external = external.next)
1919 if(external.type == classExternal && external._class == classDef)
1921 ast->Remove(external);
1922 FreeExternal(external);
1927 FreeContext(symbol.ctx);
1930 symbol.ctx = curContext;
1931 classDef = { symbol = symbol, _class = MkSpecifierName(symbol.string), baseSpecs = baseSpecs, definitions = definitions, nameLoc = symbol.nameLoc };
1932 curContext.classDef = classDef;
1936 Expression MkExpInstance(Instantiation inst)
1938 return { type = instanceExp, instance = inst };
1941 External MkExternalClass(ClassDefinition _class)
1943 return { type = classExternal, _class = _class, symbol = _class.symbol };
1946 PropertyDef MkProperty(OldList specs, Declarator decl, Identifier id, Statement setStmt, Statement getStmt)
1956 Type type = ProcessType(specs, decl);
1959 char typeString[1024];
1960 typeString[0] = '\0';
1961 PrintTypeNoConst(type, typeString, false, true);
1962 id = MkIdentifier(typeString);
1963 prop.conversion = true;
1969 string = CopyString(id.string);
1972 excludedSymbols->Add(symbol);
1973 prop.symbol = symbol;
1977 ClassDef MkClassDefProperty(PropertyDef propertyDef)
1979 return { type = propertyClassDef, propertyDef = propertyDef, loc = yylloc };
1982 ClassDef MkClassDefClassProperty(PropertyDef propertyDef)
1984 return { type = classPropertyClassDef, propertyDef = propertyDef, loc = yylloc };
1987 ClassDef MkClassDefClassPropertyValue(Identifier id, Initializer initializer)
1989 return { type = classPropertyValueClassDef, id = id, initializer = initializer, loc = yylloc };
1992 int CheckType(const char * text)
1995 Time startTime = GetTime();
2000 // Help out the Debugger with Windows files until we improve the parser
2001 if(!strcmp(text, "WINAPI"))
2003 else if(!strcmp(text, "BOOL") || !strcmp(text, "WINUSERAPI"))
2007 if(FindTemplateTypeParameter(curContext, text))
2010 checkTypeTotalTime += GetTime() - startTime;
2014 if(FindType(curContext, text))
2017 checkTypeTotalTime += GetTime() - startTime;
2024 checkTypeTotalTime += GetTime() - startTime;
2026 return TYPE_NAME; //CLASS_NAME;
2029 checkTypeTotalTime += GetTime() - startTime;
2036 return CheckType(yytext);
2039 Context PushContext()
2041 Context ctx { parent = curContext };
2046 void PopContext(Context ctx)
2048 curContext = ctx.parent;
2051 Symbol FindType(Context ctx, const char * name)
2056 //char output[8192];
2057 type = (Symbol)ctx.types.FindString(name);
2058 /*if(!strcmp(name, "intptr_t") && !type)
2060 ctx.types.Print(output, depthOrder);
2063 if(!type && ctx.parent)
2064 type = FindType(ctx.parent, name);
2069 Symbol FindStruct(Context ctx, const char * name)
2074 type = (Symbol)ctx.structSymbols.FindString(name);
2075 if(!type && ctx.parent)
2076 type = FindStruct(ctx.parent, name);
2081 TemplatedType FindTemplateTypeParameter(Context ctx, const char * name)
2083 TemplatedType templatedType = null;
2086 templatedType = (TemplatedType)ctx.templateTypes.FindString(name);
2087 if(!templatedType && ctx.parent)
2088 templatedType = FindTemplateTypeParameter(ctx.parent, name);
2090 return templatedType;
2093 bool ModuleAccess(Module searchIn, Module searchFor)
2095 SubModule subModule;
2097 if(searchFor == searchIn)
2100 for(subModule = searchIn.modules.first; subModule; subModule = subModule.next)
2102 if(subModule.importMode == publicAccess /*|| searchIn == searchIn.application*/)
2104 if(ModuleAccess(subModule.module, searchFor))
2111 ModuleImport FindModule(Module moduleToFind)
2113 ModuleImport module;
2114 if(!moduleToFind.name)
2116 for(module = imports->first; module; module = module.next)
2117 if(module.name && !strcmp(module.name, moduleToFind.name))
2121 module = ModuleImport
2123 name = CopyString(moduleToFind.name), importType = moduleToFind.importType,
2124 importAccess = ModuleAccess(privateModule, moduleToFind) ? publicAccess : privateAccess
2126 imports->Add(module);
2132 // TO REMOVE: OBSOLETE...
2133 static void GetFullClassNameSpace(NameSpace * ns, char * name)
2137 GetFullClassNameSpace(ns->parent, name);
2138 strcat(name, ns->name);
2143 static char * GetFullClassName(Class c, char * name)
2145 NameSpace * nameSpace;
2147 GetFullClassNameSpace(c.nameSpace, name);
2148 strcat(name, c.name);
2153 public Symbol FindClass(const char * name)
2156 Time startTime = GetTime();
2160 bool global = false;
2161 char fullName[1024];
2163 if(name[0] == ':' && name[1] == ':')
2169 if(!global && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
2171 int len = 0, stringLen;
2172 if(defaultNameSpace)
2174 memcpy(fullName, defaultNameSpace, defaultNameSpaceLen);
2175 len += defaultNameSpaceLen;
2176 fullName[len++] = ':';
2177 fullName[len++] = ':';
2179 if(currentNameSpace)
2181 memcpy(fullName + len, currentNameSpace, currentNameSpaceLen);
2182 len += currentNameSpaceLen;
2183 fullName[len++] = ':';
2184 fullName[len++] = ':';
2186 stringLen = strlen(name);
2187 memcpy(fullName + len, name, stringLen);
2190 cl = globalContext ? (Symbol)globalContext.classes.FindString(fullName) : null;
2194 cl = globalContext ? (Symbol)globalContext.classes.FindString(name) : null;
2199 Time startTime = GetTime();
2201 // Ignore name space name when searching
2202 for(cl = globalContext ? (Symbol)globalContext.classes.first : null; cl; cl = (Symbol)((BTNode)cl).next)
2206 char * string = cl.string;
2208 for(c = 0; (ch = string[c]); c++)
2210 if(ch == '.' || (ch == ':' && string[c+1] == ':'))
2216 if(start && c - start)
2218 if(!strcmp(string + start, name))
2222 if(cl.shortName && !strcmp(cl.shortName, name))
2226 findClassIgnoreNSTotalTime += GetTime() - startTime;
2232 if(!global && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
2233 _class = eSystem_FindClass(privateModule, fullName);
2235 _class = eSystem_FindClass(privateModule, name);
2239 name = _class.fullName;
2241 cl = (Symbol)globalContext.classes.FindString(name);
2246 string = CopyString(name);
2247 registered = _class;
2248 notYetDeclared = true;
2253 cl.module = FindModule(_class.module);
2255 cl.module = mainModule;
2256 if(!globalContext.classes.Add((BTNode)cl))
2257 excludedSymbols->Add(cl);
2258 if(strcmp(name, _class.name))
2259 cl.shortName = CopyString(_class.name);
2264 findClassTotalTime += GetTime() - startTime;
2269 void CopyTypeInto(Type type, Type src)
2273 type.name = CopyString(src.name);
2274 type.typeName = CopyString(src.typeName);
2277 if(src.kind == enumType)
2281 type.members.Clear();
2282 // This must have been a mistake: member = **type**.members.first
2283 for(member = src.members.first; member; member = member.next)
2285 type.members.Add(NamedLink64 { name = CopyString(member.name), data = member.data });
2287 type.enumName = CopyString(src.enumName);
2289 else if(src.kind == structType || src.kind == unionType)
2292 // Tricky stuff... will be removed from list only when ref count reaches 0
2293 for(member = type.members.first; member; member = member.next)
2295 type.enumName = CopyString(src.enumName);
2297 else if(src.kind == functionType)
2300 type.returnType.refCount++;
2301 for(param = type.params.first; param; param = param.next)
2304 else if(src.kind == pointerType || src.kind == arrayType)
2306 type.type.refCount++;
2307 if(src.kind == arrayType)
2309 if(type.arraySizeExp)
2310 type.arraySizeExp = CopyExpression(type.arraySizeExp);
2315 static Type ProcessTypeSpecs(OldList specs, bool assumeEllipsis, bool keepTypeName)
2317 Type specType { refCount = 1, kind = intType, isSigned = true };
2320 bool isTypedef = false;
2322 bool isLong = false;
2323 for(spec = specs.first; spec; spec = spec.next)
2325 if(spec.type == extendedSpecifier)
2327 ExtDecl extDecl = spec.extDecl;
2328 if(extDecl.type == extDeclString)
2330 if(!strcmp(spec.extDecl.s, "__declspec(dllexport)") || !strcmp(spec.extDecl.s, "dllexport"))
2331 specType.dllExport = true;
2332 else if(!strcmp(spec.extDecl.s, "__declspec(stdcall)") || !strcmp(spec.extDecl.s, "stdcall"))
2333 specType.attrStdcall = true;
2335 else if(extDecl.type == extDeclAttrib)
2337 OldList * attribs = extDecl.attr.attribs;
2341 for(attr = attribs->first; attr; attr = attr.next)
2343 String s = attr.attr;
2346 if(!strcmp(s, "dllexport"))
2347 specType.dllExport = true;
2348 else if(!strcmp(s, "stdcall"))
2349 specType.attrStdcall = true;
2350 else if(!strcmp(s, "__vector_size__"))
2351 specType.isVector = true;
2355 specType.keepCast = true;
2359 if(spec.specifier != CONST && (specType.kind == structType || specType.kind == unionType))
2362 specType = { kind = intType, isSigned = true, refCount = 1 };
2365 if(isTypedef && keepTypeName)
2367 specType.kind = dummyType;
2370 else if(spec.type == baseSpecifier)
2372 if(spec.specifier == TYPEDEF)
2374 else if(spec.specifier == VOID) specType.kind = voidType;
2375 else if(spec.specifier == CHAR) specType.kind = charType;
2376 else if(spec.specifier == INT) { if(specType.kind != shortType && specType.kind != longType && !isLong) specType.kind = intType; }
2377 else if(spec.specifier == _BOOL || spec.specifier == BOOL)
2378 specType.kind = _BoolType;
2379 else if(spec.specifier == UINT) { if(specType.kind != shortType && specType.kind != longType) specType.kind = intType; specType.isSigned = false; }
2380 else if(spec.specifier == INT64) specType.kind = int64Type;
2381 else if(spec.specifier == INT128) specType.kind = int128Type;
2382 else if(spec.specifier == VALIST)
2383 specType.kind = vaListType;
2384 else if(spec.specifier == SHORT) specType.kind = shortType;
2385 else if(spec.specifier == LONG)
2387 if(isLong || (targetBits == 64 && targetPlatform != win32))
2388 specType.kind = int64Type;
2390 specType.kind = intType;
2391 specType.isLong = true;
2394 else if(spec.specifier == FLOAT) specType.kind = floatType;
2395 else if(spec.specifier == DOUBLE) specType.kind = doubleType;
2396 else if(spec.specifier == SIGNED) specType.isSigned = true;
2397 else if(spec.specifier == UNSIGNED) specType.isSigned = false;
2398 else if(spec.specifier == CONST)
2399 specType.constant = true;
2400 else if(spec.specifier == TYPED_OBJECT || spec.specifier == ANY_OBJECT || spec.specifier == CLASS)
2402 switch(spec.specifier)
2404 case TYPED_OBJECT: specType.classObjectType = typedObject; break;
2405 case ANY_OBJECT: specType.classObjectType = anyObject; break;
2406 case CLASS: specType.classObjectType = classPointer; break;
2408 specType.kind = classType;
2409 specType._class = FindClass("class");
2411 else if(spec.specifier == THISCLASS)
2412 specType.kind = thisClassType;
2414 else if(spec.type == nameSpecifier)
2416 if(spec.name && (!strcmp(spec.name, "intptr") || !strcmp(spec.name, "uintptr")))
2418 specType.kind = intPtrType;
2419 if(!strcmp(spec.name, "uintptr"))
2420 specType.isSigned = false;
2422 else if(spec.name && (!strcmp(spec.name, "uintsize") || !strcmp(spec.name, "intsize")))
2424 specType.kind = intSizeType;
2425 if(!strcmp(spec.name, "uintsize"))
2426 specType.isSigned = false;
2430 Symbol symbol = spec.name ? FindType(curContext, spec.name) : null;
2431 if(symbol && symbol.type)
2433 // Keep constant qualifier
2434 bool isConstant = specType.constant;
2435 // Free Type Contents:
2440 CopyTypeInto(specType, symbol.type);
2441 specType.constant = isConstant;
2442 delete specType.typeName;
2443 specType.typeName = CopyString(symbol.type.name);
2445 else if(!isTypedef) // !specType.kind) // TESTING THIS FOR enum / typedef problem
2447 // key.sym enum values need FindClass:
2448 specType._class = spec.name ? FindClass(spec.name) : null;
2449 specType.kind = classType;
2450 if(!specType._class)
2451 specType.kind = intType;
2455 else if(spec.type == enumSpecifier)
2457 specType.kind = enumType;
2458 specType.enumName = spec.id ? CopyString(spec.id.string) : null;
2463 for(e = spec.list->first; e; e = e.next)
2465 NamedLink64 i { name = CopyString(e.id.string) };
2466 if(e.exp && e.exp.type == constantExp && e.exp.constant)
2467 i.data = strtoll(e.exp.constant, null, 0);
2468 specType.members.Add(i);
2472 else if(spec.type == templateTypeSpecifier)
2474 specType.kind = templateType;
2475 specType.templateParameter = spec.templateParameter;
2477 else if(spec.type == structSpecifier || spec.type == unionSpecifier)
2479 Symbol _class = spec.id ? FindClass(spec.id.string) : null;
2482 specType.declaredWithStruct = true;
2483 if(!_class.registered || _class.registered.type != structClass)
2484 specType.directClassAccess = true; // TODO: Need to clarify what 'directClassAccess' is about
2485 specType._class = _class;
2486 specType.kind = classType;
2489 specType.members.Clear();
2490 if(spec.type == structSpecifier)
2491 specType.kind = structType;
2492 else if(spec.type == unionSpecifier)
2493 specType.kind = unionType;
2496 // TESTING THIS HERE... Had 0 type size
2497 if(!spec.definitions && !isTypedef)
2499 Symbol symbol = spec.id.string ? FindSymbol(spec.id.string, curContext, globalContext, true, false) : null;
2500 if(symbol && symbol.type)
2502 specType = *symbol.type;
2503 specType.name = CopyString(symbol.type.name);
2504 specType.typeName = CopyString(spec.name);
2505 specType.enumName = CopyString(symbol.type.enumName);
2506 specType.refCount = 1;
2508 if(symbol.type.kind == enumType)
2512 specType.members.Clear();
2513 for(member = symbol.type.members.first; member; member = member.next)
2515 NamedLink64 item { name = CopyString(member.name), data = member.data };
2516 specType.members.Add(item);
2519 else if(symbol.type.kind == structType || symbol.type.kind == unionType)
2522 // Tricky stuff... will be removed from list only when ref count reaches 0
2523 for(member = specType.members.first; member; member = member.next)
2526 else if(symbol.type.kind == functionType)
2529 specType.returnType.refCount++;
2530 for(param = specType.params.first; param; param = param.next)
2533 else if(symbol.type.kind == pointerType || symbol.type.kind == arrayType)
2535 specType.type.refCount++;
2536 if(symbol.type.kind == arrayType)
2538 if(specType.arraySizeExp)
2539 specType.arraySizeExp = CopyExpression(specType.arraySizeExp);
2545 specType.enumName = CopyString(spec.id.string);
2548 specType.enumName = CopyString(spec.id.string);
2551 if(spec.definitions)
2554 for(def = spec.definitions->first; def; def = def.next)
2556 if(def.type == declarationClassDef && def.decl.type == structDeclaration)
2558 Declaration decl = def.decl;
2559 if(decl.declarators)
2562 for(d = decl.declarators->first; d; d = d.next)
2564 Type memberType = ProcessType(decl.specifiers, d);
2565 specType.members.Add(memberType);
2568 else if(decl.specifiers)
2570 Type memberType = ProcessType(decl.specifiers, null);
2571 specType.members.Add(memberType);
2578 else if(spec.type == subClassSpecifier)
2580 specType.kind = subClassType;
2581 specType._class = spec._class.symbol;
2585 else if(assumeEllipsis)
2586 specType.kind = ellipsisType;
2590 static Type ProcessTypeDecls(OldList specs, Declarator decl, Type parentType)
2592 Type type = parentType;
2593 Declarator subDecl = decl ? decl.declarator : null;
2594 bool isVector = false;
2595 if(decl && (decl.type == extendedDeclarator || decl.type == extendedDeclaratorEnd))
2597 ExtDecl extDecl = decl.extended.extended;
2598 if(extDecl && extDecl.type == extDeclAttrib)
2600 OldList * attribs = extDecl.attr.attribs;
2604 for(attr = attribs->first; attr; attr = attr.next)
2606 String s = attr.attr;
2608 if(!strcmp(s, "__vector_size__"))
2616 type = ProcessTypeSpecs(specs, decl == null, (decl && decl.type == extendedDeclaratorEnd && !isVector) ? true : false);
2621 case bracketsDeclarator: break;
2622 case extendedDeclarator:
2623 case extendedDeclaratorEnd:
2625 ExtDecl extDecl = decl.extended.extended;
2628 switch(extDecl.type)
2632 String s = extDecl.s;
2635 if(!strcmp(s, "__declspec(dllexport)") || !strcmp(s, "dllexport"))
2636 type.dllExport = true;
2637 else if(!strcmp(s, "__declspec(stdcall)") || !strcmp(s, "stdcall"))
2638 type.attrStdcall = true;
2644 OldList * attribs = extDecl.attr.attribs;
2648 for(attr = attribs->first; attr; attr = attr.next)
2650 String s = attr.attr;
2653 if(!strcmp(s, "dllexport"))
2654 type.dllExport = true;
2655 else if(!strcmp(s, "stdcall"))
2656 type.attrStdcall = true;
2657 else if(!strcmp(s, "__vector_size__"))
2659 type.isVector = true;
2661 Expression exp = attr.exp;
2662 while(exp.type == bracketsExp)
2663 exp = exp.list ? exp.list->last : null;
2664 type.vectorSize = CopyExpression(exp);
2670 type.keepCast = true;
2677 case structDeclarator:
2679 Expression exp = decl.structDecl.exp;
2682 ProcessExpressionType(exp);
2683 ComputeExpression(exp);
2684 if(exp.type == constantExp)
2685 type.bitFieldCount = (uint)strtoul(exp.constant, null, 0);
2689 case functionDeclarator:
2691 type = { refCount = 1, kind = functionType, returnType = type, dllExport = type.dllExport, attrStdcall = type.attrStdcall };
2692 if(decl.function.parameters)
2695 for(param = decl.function.parameters->first; param; param = param.next)
2696 type.params.Add(ProcessType(param.qualifiers, param.declarator));
2700 case arrayDeclarator:
2702 type = { refCount = 1, kind = arrayType, arraySizeExp = CopyExpression(decl.array.exp), freeExp = true, type = type, dllExport = type.dllExport, attrStdcall = type.attrStdcall };
2703 if(decl.array.enumClass)
2704 type.enumClass = decl.array.enumClass.symbol;
2707 case pointerDeclarator:
2709 Pointer pointer = decl.pointer.pointer;
2712 OldList * qualifiers = pointer.qualifiers;
2713 if(type.classObjectType)
2714 type.byReference = true;
2716 type = { refCount = 1, kind = pointerType, type = type, dllExport = type.dllExport, attrStdcall = type.attrStdcall };
2720 for(spec = qualifiers->first; spec; spec = spec.next)
2722 if(spec.type == baseSpecifier && spec.specifier == CONST)
2723 type.constant = true;
2726 pointer = pointer.pointer;
2730 case identifierDeclarator:
2732 Identifier id = decl.identifier;
2733 Specifier _class = id._class;
2735 type.name = CopyString(id.string);
2738 if(_class.type == templateTypeSpecifier)
2740 type.thisClassTemplate = _class.templateParameter;
2741 type.extraParam = true;
2745 String name = _class.name;
2747 type.staticMethod = true;
2751 id.classSym = _class.symbol; // FindClass(_class.name);
2752 /* TODO: Name Space Fix ups
2753 id.nameSpace = eSystem_FindNameSpace(privateModule, _class.name);
2756 if(name[strlen(name)-1] == '&')
2758 type.thisClass = FindClass("class");
2759 type.byReference = true;
2762 type.thisClass = _class.symbol;
2764 if(type.thisClass && strcmp(type.thisClass.string, "class"))
2765 type.extraParam = true;
2766 else if(!strcmp(name, "any_object"))
2768 type.extraParam = true;
2769 type.thisClass = FindClass("class");
2771 else if(!strcmp(name, "class"))
2773 type.thisClass = FindClass("class");
2774 type.classObjectType = classPointer; // This is used for class properties
2776 else if(!strcmp(name, "typed_object") || !strcmp(name, "typed_object&"))
2778 type.thisClass = FindClass("class");
2779 type.classObjectType = typedObject;
2787 PrintLn("Unhandled Declarator Type: ", decl.type);
2792 Type curType = type;
2793 type = ProcessTypeDecls(null, subDecl, type);
2794 if(curType && type.kind != functionType)
2796 curType.thisClassTemplate = type.thisClassTemplate;
2797 curType.extraParam = type.extraParam;
2798 curType.staticMethod = type.staticMethod;
2799 curType.thisClass = type.thisClass;
2800 curType.byReference = type.byReference;
2801 curType.classObjectType = type.classObjectType;
2807 public Type ProcessType(OldList specs, Declarator decl)
2809 return ProcessTypeDecls(specs, decl, null);
2812 public Type ProcessTypeString(const char * string, bool staticMethod)
2814 OldList * specs = MkList();
2815 Declarator decl = SpecDeclFromString(string, specs, null);
2816 Type type = ProcessType(specs, decl);
2817 if(type && !type.thisClass && staticMethod) type.staticMethod = true;
2818 FreeList(specs, FreeSpecifier);
2819 if(decl) FreeDeclarator(decl);
2823 Type MkClassTypeSymbol(Symbol symbol)
2827 Type type { kind = classType, _class = symbol };
2830 // Defaults to an int instead...
2831 type.kind = intType;
2839 public Type MkClassType(const char * name)
2843 Type type { kind = classType, _class = FindClass(name) };
2846 // Defaults to an int instead...
2847 type.kind = intType;
2855 AsmField MkAsmField(char * command, Expression expression, Identifier symbolic)
2857 return { command = command, expression = expression, symbolic = symbolic };
2860 Statement MkAsmStmt(Specifier spec, char * statements, OldList inputFields, OldList outputFields, OldList clobberedFields)
2862 return { type = asmStmt, asmStmt.spec = spec, asmStmt.statements = statements,
2863 asmStmt.inputFields = inputFields, asmStmt.outputFields = outputFields,
2864 asmStmt.clobberedFields = clobberedFields };
2867 ClassDef MkClassDefPropertyWatch(PropertyWatch watcher)
2869 return { type = propertyWatchClassDef, propertyWatch = watcher };
2872 Statement MkFireWatchersStmt(Expression object, OldList watches)
2874 return { type = fireWatchersStmt, _watch.object = object, _watch.watches = watches };
2877 Statement MkStopWatchingStmt(Expression watcher, Expression object, OldList watches)
2879 return { type = stopWatchingStmt, _watch.watcher = watcher, _watch.object = object, _watch.watches = watches };
2882 Statement MkWatchStmt(Expression watcher, Expression object, OldList watches)
2884 return { type = watchStmt, _watch.watcher = watcher, _watch.object = object, _watch.watches = watches };
2887 PropertyWatch MkDeleteWatch(Statement compound)
2889 return { compound = compound, deleteWatch = true };
2892 PropertyWatch MkPropertyWatch(OldList properties, Statement compound)
2894 return { compound = compound, properties = properties };
2897 Expression MkExpClass(OldList * specifiers, Declarator decl)
2899 return { type = classExp, _classExp.specifiers = specifiers, _classExp.decl = decl };
2902 Expression MkExpClassData(Identifier id)
2904 return { type = classDataExp, classData.id = id };
2908 External MkExternalDBTable(DBTableDef table)
2910 return { type = dbtableExternal, table = table };
2913 DBTableDef MkDBTableDef(char * name, Symbol symbol, OldList * definitions)
2915 return { name = name, symbol = symbol, definitions = definitions };
2918 DBTableEntry MkDBFieldEntry(TypeName type, Identifier id, char * name)
2920 return { type = fieldEntry, dataType = type, id = id, name = name };
2923 DBIndexItem MkDBIndexItem(Identifier id, Order order)
2925 return { id = id, order = order };
2928 DBTableEntry MkDBIndexEntry(OldList * items, Identifier id)
2930 return { type = indexEntry, items = items, id = id };
2933 Expression MkExpDBOpen(Expression ds, Expression dbName)
2935 return { type = dbopenExp, dbopen.ds = ds, dbopen.name = dbName };
2938 Expression MkExpDBField(char * table, Identifier id)
2940 return { type = dbfieldExp, db.table = table, db.id = id };
2943 Expression MkExpDBIndex(char * table, Identifier id)
2945 return { type = dbindexExp, db.table = table, db.id = id };
2948 Expression MkExpDBTable(char * table)
2950 return { type = dbtableExp, db.table = table };
2953 Expression MkExpArray(OldList * expressions)
2955 return { type = arrayExp, list = expressions };
2958 Expression GetTemplateArgExpByName(const char * paramName, Class thisClassFrom, Class curClass, TemplateParameterType tplType)
2960 Expression argExp = null;
2961 Class instanceClass = ((curExternal && curExternal.type == functionExternal && curExternal.function) ? curExternal.function._class : null);
2962 Class _class = curClass ? curClass : instanceClass;
2964 if(thisClassFrom && instanceClass && thisClassFrom != instanceClass && strcmp(thisClassFrom.name, "class"))
2965 Compiler_Error($"unresolved template type (%s)\n", paramName);
2969 ClassTemplateParameter curParam;
2971 if(_class.templateClass) _class = _class.templateClass;
2972 for(sClass = _class; sClass; sClass = sClass.base)
2975 for(curParam = sClass.templateParams.first; curParam; curParam = curParam.next)
2977 if(!strcmp(curParam.name, paramName))
2979 for(sClass = sClass.base; sClass; sClass = sClass.base)
2980 id += sClass.templateParams.count;
2988 if(curParam && curParam.type != tplType)
2994 char className[1024];
2996 sprintf(idString, "%d", id);
2997 strcpy(className, "__ecereClass_");
2998 FullClassNameCat(className, _class.fullName, true);
2999 DeclareClass(curExternal, FindClass(_class.fullName), className);
3001 argExp = MkExpIndex((/*pointer ? MkExpPointer : */MkExpMember)
3002 (MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class")) /*MkExpIdentifier(MkIdentifier(className))*/,
3003 MkIdentifier("templateArgs")), MkListOne(MkExpConstant(idString)));
3009 Expression GetTemplateArgExp(TemplateParameter param, Class thisClassFrom, Class curClass, bool pointer)
3011 return param.identifier ? GetTemplateArgExpByName(param.identifier.string, thisClassFrom, curClass, type) : null;
3014 /*char * CreateMsgID(const char * string, const char * context)
3016 int lenString = strlen(string), lenContext = strlen(context);
3017 char * msgid = new char[lenString + lenContext + 20];
3018 memcpy(msgid, string, lenString);
3019 memcpy(msgid+lenString, " [msgctxt: ", 11);
3020 memcpy(msgid+lenString+11, context, lenContext);
3021 memcpy(msgid+lenString+11+lenContext, "]", 2);
3025 public void OutputIntlStrings()
3027 if(intlStrings.count)
3029 const char * srcFile = GetSourceFile();
3030 const char * objFile = GetOutputFile();
3031 char srcFileFixed[MAX_LOCATION];
3032 char potFile[MAX_LOCATION];
3034 ChangeExtension(objFile, "bowl", potFile);
3035 f = FileOpen(potFile, write);
3038 const char * filePrefix = "";
3039 if(!(srcFile[0] && (srcFile[1] == ':' || srcFile[0] == '/')))
3040 filePrefix = "./"; //(__runtimePlatform == win32) ? ".\\" : "./";
3041 // GetSystemPathBuffer(srcFileFixed, srcFile);
3042 GetSlashPathBuffer(srcFileFixed, srcFile);
3044 for(s : intlStrings)
3046 // TOFIX: (#654) ContextStringPair * pair = &s;
3047 ContextStringPair pair = &s;
3049 f.Printf("#: %s%s:%d\n", filePrefix, srcFileFixed, l.start.line);
3050 // PoEdit now preserves and distinguish msgctxt
3052 f.Printf("msgctxt \"%s\"\n", pair.context);
3053 f.Printf("msgid \"%s\"\n", pair.string);
3054 f.Printf("msgstr \"%s\"\n\n", pair.string);
3062 default extern OldList * ast;
3063 default extern int yyparse ();
3064 default extern int yylex ();
3066 public void SetAST(OldList * list) { ast = list; }
3067 public OldList * GetAST() { return ast; }
3068 public void ParseEc()
3078 public const char * GetYYText()