mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-31 19:00:54 -06:00
cmListFileParser: use unique_ptr to own cmListFileLexer instance
This commit is contained in:
@@ -46,7 +46,6 @@ class cmListFileParser
|
||||
public:
|
||||
cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt,
|
||||
cmMessenger* messenger);
|
||||
~cmListFileParser();
|
||||
cmListFileParser(const cmListFileParser&) = delete;
|
||||
cmListFileParser& operator=(const cmListFileParser&) = delete;
|
||||
|
||||
@@ -74,7 +73,7 @@ private:
|
||||
cmListFileBacktrace Backtrace;
|
||||
cmMessenger* Messenger;
|
||||
const char* FileName = nullptr;
|
||||
cmListFileLexer* Lexer;
|
||||
std::unique_ptr<cmListFileLexer, void (*)(cmListFileLexer*)> Lexer;
|
||||
std::string FunctionName;
|
||||
long FunctionLine;
|
||||
long FunctionLineEnd;
|
||||
@@ -86,15 +85,10 @@ cmListFileParser::cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt,
|
||||
: ListFile(lf)
|
||||
, Backtrace(std::move(lfbt))
|
||||
, Messenger(messenger)
|
||||
, Lexer(cmListFileLexer_New())
|
||||
, Lexer(cmListFileLexer_New(), cmListFileLexer_Delete)
|
||||
{
|
||||
}
|
||||
|
||||
cmListFileParser::~cmListFileParser()
|
||||
{
|
||||
cmListFileLexer_Delete(this->Lexer);
|
||||
}
|
||||
|
||||
void cmListFileParser::IssueFileOpenError(const std::string& text) const
|
||||
{
|
||||
this->Messenger->IssueMessage(MessageType::FATAL_ERROR, text,
|
||||
@@ -105,7 +99,7 @@ void cmListFileParser::IssueError(const std::string& text) const
|
||||
{
|
||||
cmListFileContext lfc;
|
||||
lfc.FilePath = this->FileName;
|
||||
lfc.Line = cmListFileLexer_GetCurrentLine(this->Lexer);
|
||||
lfc.Line = cmListFileLexer_GetCurrentLine(this->Lexer.get());
|
||||
cmListFileBacktrace lfbt = this->Backtrace;
|
||||
lfbt = lfbt.Push(lfc);
|
||||
this->Messenger->IssueMessage(MessageType::FATAL_ERROR, text, lfbt);
|
||||
@@ -124,13 +118,13 @@ bool cmListFileParser::ParseFile(const char* filename)
|
||||
|
||||
// Open the file.
|
||||
cmListFileLexer_BOM bom;
|
||||
if (!cmListFileLexer_SetFileName(this->Lexer, filename, &bom)) {
|
||||
if (!cmListFileLexer_SetFileName(this->Lexer.get(), filename, &bom)) {
|
||||
this->IssueFileOpenError("cmListFileCache: error can not open file.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bom == cmListFileLexer_BOM_Broken) {
|
||||
cmListFileLexer_SetFileName(this->Lexer, nullptr, nullptr);
|
||||
cmListFileLexer_SetFileName(this->Lexer.get(), nullptr, nullptr);
|
||||
this->IssueFileOpenError("Error while reading Byte-Order-Mark. "
|
||||
"File not seekable?");
|
||||
return false;
|
||||
@@ -138,7 +132,7 @@ bool cmListFileParser::ParseFile(const char* filename)
|
||||
|
||||
// Verify the Byte-Order-Mark, if any.
|
||||
if (bom != cmListFileLexer_BOM_None && bom != cmListFileLexer_BOM_UTF8) {
|
||||
cmListFileLexer_SetFileName(this->Lexer, nullptr, nullptr);
|
||||
cmListFileLexer_SetFileName(this->Lexer.get(), nullptr, nullptr);
|
||||
this->IssueFileOpenError(
|
||||
"File starts with a Byte-Order-Mark that is not UTF-8.");
|
||||
return false;
|
||||
@@ -152,7 +146,7 @@ bool cmListFileParser::ParseString(const char* str,
|
||||
{
|
||||
this->FileName = virtual_filename;
|
||||
|
||||
if (!cmListFileLexer_SetString(this->Lexer, str)) {
|
||||
if (!cmListFileLexer_SetString(this->Lexer.get(), str)) {
|
||||
this->IssueFileOpenError("cmListFileCache: cannot allocate buffer.");
|
||||
return false;
|
||||
}
|
||||
@@ -165,7 +159,8 @@ bool cmListFileParser::Parse()
|
||||
// Use a simple recursive-descent parser to process the token
|
||||
// stream.
|
||||
bool haveNewline = true;
|
||||
while (cmListFileLexer_Token* token = cmListFileLexer_Scan(this->Lexer)) {
|
||||
while (cmListFileLexer_Token* token =
|
||||
cmListFileLexer_Scan(this->Lexer.get())) {
|
||||
if (token->type == cmListFileLexer_Token_Space) {
|
||||
} else if (token->type == cmListFileLexer_Token_Newline) {
|
||||
haveNewline = true;
|
||||
@@ -184,7 +179,8 @@ bool cmListFileParser::Parse()
|
||||
} else {
|
||||
std::ostringstream error;
|
||||
error << "Parse error. Expected a newline, got "
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer, token->type)
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer.get(),
|
||||
token->type)
|
||||
<< " with text \"" << token->text << "\".";
|
||||
this->IssueError(error.str());
|
||||
return false;
|
||||
@@ -192,7 +188,7 @@ bool cmListFileParser::Parse()
|
||||
} else {
|
||||
std::ostringstream error;
|
||||
error << "Parse error. Expected a command name, got "
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer, token->type)
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer.get(), token->type)
|
||||
<< " with text \"" << token->text << "\".";
|
||||
this->IssueError(error.str());
|
||||
return false;
|
||||
@@ -220,7 +216,7 @@ bool cmListFileParser::ParseFunction(const char* name, long line)
|
||||
|
||||
// Command name has already been parsed. Read the left paren.
|
||||
cmListFileLexer_Token* token;
|
||||
while ((token = cmListFileLexer_Scan(this->Lexer)) &&
|
||||
while ((token = cmListFileLexer_Scan(this->Lexer.get())) &&
|
||||
token->type == cmListFileLexer_Token_Space) {
|
||||
}
|
||||
if (!token) {
|
||||
@@ -231,7 +227,7 @@ bool cmListFileParser::ParseFunction(const char* name, long line)
|
||||
if (token->type != cmListFileLexer_Token_ParenLeft) {
|
||||
std::ostringstream error;
|
||||
error << "Parse error. Expected \"(\", got "
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer, token->type)
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer.get(), token->type)
|
||||
<< " with text \"" << token->text << "\".";
|
||||
this->IssueError(error.str());
|
||||
return false;
|
||||
@@ -240,7 +236,7 @@ bool cmListFileParser::ParseFunction(const char* name, long line)
|
||||
// Arguments.
|
||||
unsigned long parenDepth = 0;
|
||||
this->Separation = SeparationOkay;
|
||||
while ((token = cmListFileLexer_Scan(this->Lexer))) {
|
||||
while ((token = cmListFileLexer_Scan(this->Lexer.get()))) {
|
||||
if (token->type == cmListFileLexer_Token_Space ||
|
||||
token->type == cmListFileLexer_Token_Newline) {
|
||||
this->Separation = SeparationOkay;
|
||||
@@ -286,7 +282,7 @@ bool cmListFileParser::ParseFunction(const char* name, long line)
|
||||
std::ostringstream error;
|
||||
error << "Parse error. Function missing ending \")\". "
|
||||
"Instead found "
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer, token->type)
|
||||
<< cmListFileLexer_GetTypeAsString(this->Lexer.get(), token->type)
|
||||
<< " with text \"" << token->text << "\".";
|
||||
this->IssueError(error.str());
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user