/**************************************************************************** ** ** Copyright (C) 2014 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Sergio Martins ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL21$ ** 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 http://www.qt.io/terms-conditions. For further ** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** As a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include static bool lint_file(const QString &filename, bool silent) { QFile file(filename); if (!file.open(QFile::ReadOnly)) { qWarning() << "Failed to open file" << filename << file.error(); return false; } QString code = QString::fromUtf8(file.readAll()); file.close(); QQmlJS::Engine engine; QQmlJS::Lexer lexer(&engine); QFileInfo info(filename); bool isJavaScript = info.suffix().toLower() == QLatin1String("js"); lexer.setCode(code, /*line = */ 1, /*qmlMode=*/ !isJavaScript); QQmlJS::Parser parser(&engine); bool success = isJavaScript ? parser.parseProgram() : parser.parse(); if (!success && !silent) { foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) { qWarning("%s:%d : %s", qPrintable(filename), m.loc.startLine, qPrintable(m.message)); } } return success; } int main(int argv, char *argc[]) { QCoreApplication app(argv, argc); QCoreApplication::setApplicationName("qmllint"); QCoreApplication::setApplicationVersion("1.0"); QCommandLineParser parser; parser.setApplicationDescription(QLatin1String("QML syntax verifier")); parser.addHelpOption(); parser.addVersionOption(); QCommandLineOption silentOption(QStringList() << "s" << "silent", QLatin1String("Don't output syntax errors")); parser.addOption(silentOption); parser.addPositionalArgument(QLatin1String("files"), QLatin1String("list of qml or js files to verify")); parser.process(app); if (parser.positionalArguments().isEmpty()) { parser.showHelp(-1); } bool silent = parser.isSet(silentOption); bool success = true; foreach (const QString &filename, parser.positionalArguments()) { success &= lint_file(filename, silent); } return success ? 0 : -1; }