forked from qt-creator/qt-creator
		
	GPL-3.0 is deprecated by SPDX.
Change done by
 find . -type f -exec perl -pi -e 's/LicenseRef-Qt-Commercial OR GPL-3.0(?!-)/LicenseRef-Qt-Commercial OR GPL-3.0-only/g' {} \;
Change-Id: If316a498e3f27d2030b86d4e7743b3237ce09939
Reviewed-by: Lucie Gerard <lucie.gerard@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
		
	
		
			
				
	
	
		
			232 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3.10
 | |
| # Copyright (C) 2022 The Qt Company Ltd.
 | |
| # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
 | |
| 
 | |
| import argparse
 | |
| import os
 | |
| # for installing use pip3 install robotpy-cppheaderparse
 | |
| import CppHeaderParser
 | |
| 
 | |
| def parse_arguments():
 | |
|     parser = argparse.ArgumentParser(description='Clang-Format checks header file \
 | |
|     generator')
 | |
|     parser.add_argument('--clang-format-header-file', help='path to \
 | |
|     Format.h usually /usr/lib/llvm-x/include/clang/Format/Format.h',
 | |
|                         default=None, dest='options_header', required=True)
 | |
|     return parser.parse_args()
 | |
| 
 | |
| 
 | |
| def full_header_content(header_code):
 | |
|     return '''// Copyright (C) 2022 The Qt Company Ltd.
 | |
| // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
 | |
| 
 | |
| // THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <QWidget>
 | |
| 
 | |
| QT_BEGIN_NAMESPACE
 | |
| class QCheckBox;
 | |
| class QComboBox;
 | |
| class QLabel;
 | |
| class QLineEdit;
 | |
| class QPlainTextEdit;
 | |
| class QPushButton;
 | |
| class QWidget;
 | |
| QT_END_NAMESPACE
 | |
| 
 | |
| namespace ClangFormat {
 | |
| 
 | |
| class ClangFormatChecks : public QWidget
 | |
| {
 | |
|     Q_OBJECT
 | |
| public:
 | |
|     ClangFormatChecks(QWidget *parent = nullptr);
 | |
| 
 | |
| private:
 | |
| ''' + header_code + '''
 | |
| };
 | |
| 
 | |
| } //ClangFormat
 | |
| '''
 | |
| 
 | |
| 
 | |
| def full_source_content(source_code, layout_code):
 | |
|     return '''// Copyright (C) 2022 The Qt Company Ltd.
 | |
| // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
 | |
| 
 | |
| // THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT!
 | |
| 
 | |
| #include "clangformatchecks.h"
 | |
| 
 | |
| #include <utils/layoutbuilder.h>
 | |
| 
 | |
| #include <QCheckBox>
 | |
| #include <QComboBox>
 | |
| #include <QLabel>
 | |
| #include <QLineEdit>
 | |
| #include <QPlainTextEdit>
 | |
| #include <QPushButton>
 | |
| #include <QWidget>
 | |
| 
 | |
| using namespace Utils;
 | |
| 
 | |
| using namespace ClangFormat;
 | |
| 
 | |
| ClangFormatChecks::ClangFormatChecks(QWidget *parent)
 | |
|     : QWidget(parent)
 | |
| {
 | |
| ''' + source_code + '''
 | |
|     using namespace Layouting;
 | |
| 
 | |
|     Grid {
 | |
| ''' + layout_code + '''    }.attachTo(this);
 | |
| }
 | |
| '''
 | |
| 
 | |
| #   Combobox UI
 | |
| def combobox_header(name):
 | |
|     header = "    QComboBox *m_" + name + " = nullptr;\n"
 | |
|     return header
 | |
| 
 | |
| def combobox_source(name, values, offset):
 | |
|     source = ""
 | |
|     source += "    m_" + name + " = new QComboBox(this);\n"
 | |
| 
 | |
|     list = ""
 | |
|     for value in values:
 | |
|         list += "\"" + value + "\","
 | |
| 
 | |
|     source += "    m_" + name + "->addItems({" + list + "});\n"
 | |
|     source += "    m_" + name + "->setObjectName(\"" + name + "\");\n\n"
 | |
|     return source
 | |
| 
 | |
| def combobox_source_bool(name, offset):
 | |
|     return combobox_source(name, ["Default", "true", "false"], offset)
 | |
| 
 | |
| def combobox_layout(name, offset):
 | |
|     layout = "        new QLabel(\"" + offset + name + "\"), m_" + name + ", br,\n"
 | |
|     return layout
 | |
| 
 | |
| #   String UI
 | |
| def string_header(name):
 | |
|     header = "    QLineEdit *m_" + name + " = nullptr;\n"
 | |
|     header += "    QPushButton *m_set" + name + " = nullptr;\n"
 | |
|     return header
 | |
| 
 | |
| def string_source(name, offset):
 | |
|     source = ""
 | |
|     source += "    m_" + name + " = new QLineEdit(this);\n"
 | |
|     source += "    m_" + name + "->setObjectName(\"" + name + "\");\n"
 | |
|     source += "    m_set" + name + " = new QPushButton(\"Set\", this);\n\n"
 | |
|     source += "    m_set" + name + "->setObjectName(\"set" + name + "\");\n"
 | |
| #    source += "m_" + name + "->setObjectName(\"" + offset + name + "\");\n\n"
 | |
|     return source
 | |
| 
 | |
| def string_layout(name, offset):
 | |
|     layout = "        new QLabel(\"" + offset + name + "\"), Row {m_" + name + ", m_set" + name + "}, br,\n"
 | |
|     return layout
 | |
| 
 | |
| #   Vector UI
 | |
| def vector_header(name):
 | |
|     header = "    QPlainTextEdit *m_" + name + " = nullptr;\n"
 | |
|     header += "    QPushButton *m_set" + name + " = nullptr;\n"
 | |
|     return header
 | |
| 
 | |
| def vector_source(name, offset):
 | |
|     source = ""
 | |
|     source += "    m_" + name + " = new QPlainTextEdit(this);\n"
 | |
|     source += "    m_" + name + "->setObjectName(\"" + name + "\");\n"
 | |
|     source += "    m_" + name + "->setFixedHeight(100);\n"
 | |
|     source += "    m_set" + name + " = new QPushButton(\"Set\", this);\n\n"
 | |
|     source += "    m_set" + name + "->setObjectName(\"set" + name + "\");\n"
 | |
| #    source += "m_" + name + "->setObjectName(\"" + offset + name + "\");\n\n"
 | |
|     return source
 | |
| 
 | |
| def vector_layout(name, offset):
 | |
|     layout = "        new QLabel(\"" + offset + name + "\"), Row {m_" + name + ", m_set" + name + "}, br,\n"
 | |
|     return layout
 | |
| 
 | |
| #   Struct Layout
 | |
| def struct_layout(name, offset):
 | |
|     layout = "        new QLabel(\"" + offset + name + "\"), br,\n"
 | |
|     return layout
 | |
| 
 | |
| 
 | |
| def in_list(list, type):
 | |
|     for element in list:
 | |
|         if element["name"] == type:
 | |
|             return element;
 | |
|     return
 | |
| 
 | |
| def create_private_variables(variables, enums, structs, offset = ""):
 | |
|     header = ""
 | |
|     source = ""
 | |
|     layout = ""
 | |
| 
 | |
|     # create BasedOnStyle combobox ussually not presented in FormatStyle struct
 | |
|     if offset == "":
 | |
|         header += combobox_header("BasedOnStyle")
 | |
|         source += combobox_source("BasedOnStyle", ["LLVM", "Google", "Chromium", "Mozilla", "WebKit", "Microsoft", "GNU"], offset)
 | |
|         layout += combobox_layout("BasedOnStyle", offset)
 | |
| 
 | |
|     for variable in variables:
 | |
|         if "doxygen" in variable.keys():
 | |
|             if ("**deprecated**" in variable['doxygen']):
 | |
|                 continue;
 | |
| 
 | |
|         type = variable["type"]
 | |
|         name = variable["name"]
 | |
|         enum = in_list(enums, type)
 | |
|         struct = in_list(structs, type)
 | |
|         if enum:
 | |
|             header += combobox_header(name)
 | |
|             source += combobox_source(name, [value["name"].split("_")[1] for value in enum["values"]], offset)
 | |
|             layout += combobox_layout(name, offset)
 | |
|         elif struct:
 | |
|             layout += struct_layout(name, offset)
 | |
|             header_tmp, source_tmp, layout_tmp = create_private_variables(struct["properties"]["public"], enums, structs, "  ")
 | |
|             header += header_tmp
 | |
|             source += source_tmp
 | |
|             layout += layout_tmp
 | |
|         elif "std::string" == type or "unsigned" == type or "int" == type:
 | |
|             header += string_header(name)
 | |
|             source += string_source(name, offset)
 | |
|             layout += string_layout(name, offset)
 | |
|         elif "std::vector<std::string >" == type:
 | |
|             header += vector_header(name)
 | |
|             source += vector_source(name, offset)
 | |
|             layout += vector_layout(name, offset)
 | |
|         elif "bool" == type:
 | |
|             header += combobox_header(name)
 | |
|             source += combobox_source_bool(name, offset)
 | |
|             layout += combobox_layout(name, offset);
 | |
|     return header, source, layout
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     arguments = parse_arguments()
 | |
|     header = CppHeaderParser.CppHeader(arguments.options_header)
 | |
| 
 | |
|     enums = header.classes["FormatStyle"]["enums"]["public"]
 | |
|     structs = header.classes["FormatStyle"]["nested_classes"]
 | |
|     variables = header.classes["FormatStyle"]["properties"]["public"]
 | |
| 
 | |
|     current_path = os.path.dirname(os.path.abspath(__file__))
 | |
|     source_path = os.path.abspath(os.path.join(current_path, '..', 'src',
 | |
|                     'plugins', 'clangformat', 'clangformatchecks.cpp'))
 | |
|     header_path = os.path.abspath(os.path.join(current_path, '..', 'src',
 | |
|                     'plugins', 'clangformat', 'clangformatchecks.h'))
 | |
| 
 | |
|     header, source, layout = create_private_variables(variables, enums, structs)
 | |
|     with open(source_path, 'w') as f:
 | |
|         f.write(full_source_content(source, layout))
 | |
| 
 | |
|     with open(header_path, 'w') as f:
 | |
|         f.write(full_header_content(header))
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 |