blob: 68ab2884535229d40bef3c3b8fe0ed4e319fd423 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
/*
location.h
*/
#ifndef LOCATION_H
#define LOCATION_H
#include <QtCore/qcoreapplication.h>
#include <QtCore/qstack.h>
QT_BEGIN_NAMESPACE
class QRegExp;
class Location
{
Q_DECLARE_TR_FUNCTIONS(QDoc::Location)
public:
Location();
Location(const QString &filePath);
Location(const Location &other);
~Location() { delete stk; }
Location &operator=(const Location &other);
void start();
void advance(QChar ch);
void advanceLines(int n)
{
stkTop->lineNo += n;
stkTop->columnNo = 1;
}
void push(const QString &filePath);
void pop();
void setEtc(bool etc) { etcetera = etc; }
void setLineNo(int no) { stkTop->lineNo = no; }
void setColumnNo(int no) { stkTop->columnNo = no; }
bool isEmpty() const { return stkDepth == 0; }
int depth() const { return stkDepth; }
const QString &filePath() const { return stkTop->filePath; }
QString fileName() const;
QString fileSuffix() const;
int lineNo() const { return stkTop->lineNo; }
int columnNo() const { return stkTop->columnNo; }
bool etc() const { return etcetera; }
void warning(const QString &message, const QString &details = QString()) const;
void error(const QString &message, const QString &details = QString()) const;
void fatal(const QString &message, const QString &details = QString()) const;
void report(const QString &message, const QString &details = QString()) const;
static void initialize();
static void terminate();
static void information(const QString &message);
static void internalError(const QString &hint);
static QString canonicalRelativePath(const QString &path);
static int exitCode();
private:
enum MessageType { Warning, Error, Report };
struct StackEntry
{
QString filePath;
int lineNo;
int columnNo;
};
friend class QTypeInfo<StackEntry>;
void emitMessage(MessageType type, const QString &message, const QString &details) const;
QString toString() const;
QString top() const;
private:
StackEntry stkBottom;
QStack<StackEntry> *stk;
StackEntry *stkTop;
int stkDepth;
bool etcetera;
static int tabSize;
static int warningCount;
static int warningLimit;
static QString programName;
static QString project;
static QRegExp *spuriousRegExp;
};
Q_DECLARE_TYPEINFO(Location::StackEntry, Q_MOVABLE_TYPE);
Q_DECLARE_TYPEINFO(Location, Q_COMPLEX_TYPE); // stkTop = &stkBottom
QT_END_NAMESPACE
#endif