// CPPParserSymTemplate.cpp: manipulation of template parameters and arguments.
#include "CPPParserSym.h"
#include "TemplateParameterList.h"
#include "TemplateArgumentList.h"
#include "CPPScope.h"
#include "CPPSymTable.h"
//
// Methods to manipulate template parameter lists
//
///////////////////////////////////////////////////////////////////////
TemplateParameterListRefI
CPPParserSym::MakeTemplateParameterList()
{
return new TemplateParameterList;
}
///////////////////////////////////////////////////////////////////////
void
CPPParserSym::AddTemplateParameterToList(
TemplateParameterListRefI parmList,
TemplateParameterRefI parm
)
{
parmList->push_back(parm);
}
//
// Methods to manipulate template argument lists
//
///////////////////////////////////////////////////////////////////////
TemplateArgumentListRefI
CPPParserSym::MakeTemplateArgumentList()
{
return new TemplateArgumentList;
}
///////////////////////////////////////////////////////////////////////
TemplateArgumentRefI
CPPParserSym::MakeTemplateArgumentType(
CPPTypeRefI type
)
{
return new TemplateArgumentType(type);
}
///////////////////////////////////////////////////////////////////////
TemplateArgumentRefI
CPPParserSym::MakeTemplateArgumentValue(
CPPExprRefI value
)
{
return new TemplateArgumentValue(value);
}
///////////////////////////////////////////////////////////////////////
void
CPPParserSym::AddTemplateArgumentToList(
TemplateArgumentListRefI argList,
TemplateArgumentRefI arg
)
{
argList->push_back(arg);
}
///////////////////////////////////////////////////////////////////////
void
CPPParserSym::SetTokensInTemplateDeclaration(
CPPTypeRefI templateType,
TemplateParameterListRefI templateParameters,
TokenListRefI tokens
)
{
symTable->SetTokensInTemplateDeclaration(
templateType,
templateParameters,
tokens
);
}
///////////////////////////////////////////////////////////////////////
void
CPPParserSym::LookupSpecialization(
const JLStr& name,
TemplateArgumentListRefI argList,
const ANTLRTokenPtr& errTok,
JLStr& specializationNameReturn,
CPPTypeRefI& specializationTypeReturn
)
{
// TODO: figure out how to report specialization errors
CPPScopeRefI specializationScope;
if (!symTable->LookupSpecialization(
name,
argList,
errTok,
specializationNameReturn,
specializationTypeReturn
)
)
{
// There was an error in creating the specialization
// Ensure that the type is usable
specializationNameReturn = name;
specializationTypeReturn = LookupVoidType();
}
}
///////////////////////////////////////////////////////////////////////
JLStr
CPPParserSym::FormatClassSpecializationName(
const JLStr& name,
TemplateArgumentListRefI specializationArgList
)
{
return symTable->FormatClassSpecializationName(name, specializationArgList);
}
///////////////////////////////////////////////////////////////////////
JLStr
CPPParserSym::FormatFunctionSpecializationName(
const JLStr& name,
TemplateParameterListRefI templateParameterList,
TemplateArgumentListRefI specializationArgList
)
{
return symTable->FormatFunctionSpecializationName(
name,
templateParameterList,
specializationArgList
);
}