From 951e297362917675f605154ff6da89fb1acb3d40 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 13 Feb 2019 12:24:14 +0100 Subject: [PATCH] CMake: pro2cmake.py: Warn and fix broken line continuation Warn on broken line continuation in .pro-files, but fix up the issue and proceed. Change-Id: Ibe68011b312bcea25620ce790a0b44b2983fbd88 Reviewed-by: Alexandru Croitor --- util/cmake/pro2cmake.py | 18 +++++++++++- util/cmake/tests/test_lc_fixup.py | 46 +++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100755 util/cmake/tests/test_lc_fixup.py diff --git a/util/cmake/pro2cmake.py b/util/cmake/pro2cmake.py index 1f85e977aac..eccf0455595 100755 --- a/util/cmake/pro2cmake.py +++ b/util/cmake/pro2cmake.py @@ -72,6 +72,13 @@ def _parse_commandline(): return parser.parse_args() +def fixup_linecontinuation(contents: str) -> str: + contents = re.sub(r'([^\t ])\\[ \t]*\n', '\\1 \\\n', contents) + contents = re.sub(r'\\[ \t]*\n', '\\\n', contents) + + return contents + + def spaces(indent: int) -> str: return ' ' * indent @@ -622,7 +629,16 @@ class QmakeParser: def parseFile(self, file: str): print('Parsing \"{}\"...'.format(file)) try: - result = self._Grammar.parseFile(file, parseAll=True) + with open(file, 'r') as file_fd: + contents = file_fd.read() + + old_contents = contents + contents = fixup_linecontinuation(contents) + + if old_contents != contents: + print('Warning: Fixed line continuation in .pro-file!\n' + ' Position information in Parsing output might be wrong!') + result = self._Grammar.parseString(contents, parseAll=True) except pp.ParseException as pe: print(pe.line) print(' '*(pe.col-1) + '^') diff --git a/util/cmake/tests/test_lc_fixup.py b/util/cmake/tests/test_lc_fixup.py new file mode 100755 index 00000000000..d3680e895d5 --- /dev/null +++ b/util/cmake/tests/test_lc_fixup.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +############################################################################# +## +## Copyright (C) 2018 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the plugins 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$ +## +############################################################################# + +from pro2cmake import fixup_linecontinuation + +from textwrap import dedent + + +def test_no_change(): + input = "test \\\nline2\n line3" + result = fixup_linecontinuation(input) + assert input == result + + +def test_fix(): + input = "test \\\t\nline2\\\n line3\\ \nline4 \\ \t\nline5\\\n\n\n" + result = fixup_linecontinuation(input) + assert 'test \\\nline2 \\\n line3 \\\nline4 \\\nline5 \\\n\n\n' == result + +