diff --git a/include/ASTData.h b/include/ASTData.h index 48bee63..8717a75 100644 --- a/include/ASTData.h +++ b/include/ASTData.h @@ -26,10 +26,13 @@ class ASTData { ~ASTData(); std::string toString(); static std::string ASTTypeToString(ASTType type); + void addTemplateTypeDefToReplace(NodeTree* typeDefToReplace); + std::vector*> getTemplateTypeDefsToReplace(); ASTType type; Type* valueType; Symbol symbol; std::map*>> scope; + std::vector*> templateTypeDefsToReplace; //Used only by template classes/functions to keep track of pointers to the typedefs that need to be changed private: }; diff --git a/src/ASTData.cpp b/src/ASTData.cpp index 22fc30d..e4a399d 100644 --- a/src/ASTData.cpp +++ b/src/ASTData.cpp @@ -74,3 +74,12 @@ std::string ASTData::ASTTypeToString(ASTType type) { return "unknown_ASTType"; } } + +void ASTData::addTemplateTypeDefToReplace(NodeTree* typeDefToReplace) { + templateTypeDefsToReplace.push_back(typeDefToReplace); +} + +std::vector*> ASTData::getTemplateTypeDefsToReplace() { + return templateTypeDefsToReplace; +} + diff --git a/src/ASTTransformation.cpp b/src/ASTTransformation.cpp index 751b64c..361cbc0 100644 --- a/src/ASTTransformation.cpp +++ b/src/ASTTransformation.cpp @@ -77,20 +77,30 @@ NodeTree* ASTTransformation::transform(NodeTree* from, NodeTree if (children[1]->getData().getName() == "type") { typeAlias = concatSymbolTree(children[0]); newNode = new NodeTree(name, ASTData(type_def, Symbol(typeAlias, true, typeAlias), typeFromTypeNode(children[1], scope))); - skipChildren.insert(1); //Don't want any children, it's unnecessary for ailising + skipChildren.insert(0); //Don't want any children, it's unnecessary for ailising + skipChildren.insert(1); } else { //Is a struct or class Type* objectType = NULL; if (children[0]->getData().getName() == "template_dec") { typeAlias = concatSymbolTree(children[1]); + newNode = new NodeTree(name, ASTData(type_def, Symbol(typeAlias, true, typeAlias))); objectType = new Type(newNode), std::cout << "Template Type!"<getChildren()[1]); + NodeTree* templateTypeDef = new NodeTree(name, ASTData(type_def, Symbol(templateTypeName, true, templateTypeName), NULL)); + newNode->getDataRef()->scope[templateTypeName].push_back(templateTypeDef); + newNode->getDataRef()->addTemplateTypeDefToReplace(templateTypeDef); + skipChildren.insert(0); //Don't try to transform the template skipChildren.insert(1); //Identifier lookup will be ourselves, as we just added ourselves to the scope } else { typeAlias = concatSymbolTree(children[0]); + newNode = new NodeTree(name, ASTData(type_def, Symbol(typeAlias, true, typeAlias))); objectType = new Type(newNode); skipChildren.insert(0); //Identifier lookup will be ourselves, as we just added ourselves to the scope } - newNode = new NodeTree(name, ASTData(type_def, Symbol(typeAlias, true, typeAlias))); newNode->getDataRef()->valueType = objectType; //Type is self-referential since this is the definition } scope->getDataRef()->scope[typeAlias].push_back(newNode);