diff options
author | Artem Sokolovskii <artem.sokolovskii@qt.io> | 2022-05-13 15:25:40 +0200 |
---|---|---|
committer | Artem Sokolovskii <artem.sokolovskii@qt.io> | 2022-07-29 11:14:22 +0000 |
commit | 79aaf155b7c434487809723d9b4a7a34916e1ebc (patch) | |
tree | 781d92fc1fae50388b4f399fbcbe472b48ed15e1 /scripts | |
parent | 82553f16a15ace287d6a58000027a7498ddfe040 (diff) |
ClangFormat: Update generateClangFormatChecksUI script
Now relay on clang/Format.h file not on ClangFormatStyleOptions.rst.
The information from Format.h is more complete, reliable and easy
parsable.
Change-Id: I96899257f5fd075bfd6e51c5a4fa70a614c32398
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'scripts')
-rwxr-xr-x[-rw-r--r--] | scripts/generateClangFormatChecksUI.py | 257 |
1 files changed, 87 insertions, 170 deletions
diff --git a/scripts/generateClangFormatChecksUI.py b/scripts/generateClangFormatChecksUI.py index cf38d44d922..8517a1e2f81 100644..100755 --- a/scripts/generateClangFormatChecksUI.py +++ b/scripts/generateClangFormatChecksUI.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3.10 ############################################################################ # # Copyright (C) 2019 The Qt Company Ltd. @@ -25,11 +25,17 @@ ############################################################################ import argparse -import json import os -import docutils.nodes -import docutils.parsers.rst -import docutils.utils +# for installing use pip3 install robotpy-cppheaderparse +import CppHeaderParser + +def parse_arguments(): + parser = argparse.ArgumentParser(description='Clazy 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_ui_content(checks): return '''<?xml version="1.0" encoding="UTF-8"?> @@ -38,7 +44,7 @@ def full_ui_content(checks): <widget class="QWidget" name="ClangFormat::ClangFormatChecksWidget"> <property name="maximumSize"> <size> - <width>480</width> + <width>580</width> <height>16777215</height> </size> </property> @@ -50,63 +56,45 @@ def full_ui_content(checks): </ui> ''' -def parse_arguments(): - parser = argparse.ArgumentParser(description='Clazy checks header file generator') - parser.add_argument('--clang-format-options-rst', help='path to ClangFormatStyleOptions.rst', - default=None, dest='options_rst') - return parser.parse_args() - -def parse_rst(text): - parser = docutils.parsers.rst.Parser() - components = (docutils.parsers.rst.Parser,) - settings = docutils.frontend.OptionParser(components=components).get_default_values() - document = docutils.utils.new_document('<rst-doc>', settings=settings) - parser.parse(text, document) - return document - -def createItem(key, value, index): - label = ''' <item row="''' + str(index) + '''" column="0"> - <widget class="QLabel" name="label''' + key + '''"> +def lable_ui(name, index, offset = ""): + return ''' <item row="''' + str(index) + '''" column="0"> + <widget class="QLabel" name="label''' + name + '''"> <property name="text"> - <string notr="true">''' + key + '''</string> + <string notr="true">''' + offset + name + '''</string> </property> </widget> </item> ''' - value_item = '' - if value[0] == 'bool': - value_item = ''' <item row="''' + str(index) + '''" column="1"> - <widget class="QComboBox" name="''' + key + '''"> + +def combobox_ui(name, values, index): + combobox = ''' <item row="''' + str(index) + '''" column="1"> + <widget class="QComboBox" name="''' + name + '''"> <property name="focusPolicy"> <enum>Qt::StrongFocus</enum> </property> - <item> - <property name="text"> - <string notr="true">Default</string> - </property> - </item> - <item> - <property name="text"> - <string notr="true">true</string> - </property> - </item> - <item> +''' + for value in values: + combobox += ''' <item> <property name="text"> - <string notr="true">false</string> + <string notr="true">''' + value + '''</string> </property> </item> - </widget> +''' + # for + combobox += ''' </widget> </item> ''' - elif value[0].startswith('std::string') or value[0] == 'unsigned' or value[0] == 'int': - value_item = ''' <item row="''' + str(index) + '''" column="1"> + return combobox + +def string_ui(name, index): + return ''' <item row="''' + str(index) + '''" column="1"> <layout class="QHBoxLayout"> <item> - <widget class="QLineEdit" name="''' + key + '''"> + <widget class="QLineEdit" name="''' + name + '''"> </widget> </item> <item> - <widget class="QPushButton" name="set''' + key + '''"> + <widget class="QPushButton" name="set''' + name + '''"> <property name="maximumSize"> <size> <width>40</width> @@ -121,11 +109,12 @@ def createItem(key, value, index): </layout> </item> ''' - elif value[0].startswith('std::vector'): - value_item = ''' <item row="''' + str(index) + '''" column="1"> + +def vector_ui(name, index): + return ''' <item row="''' + str(index) + '''" column="1"> <layout class="QHBoxLayout"> <item> - <widget class="QPlainTextEdit" name="''' + key + '''"> + <widget class="QPlainTextEdit" name="''' + name + '''"> <property name="sizePolicy"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed"/> </property> @@ -138,7 +127,7 @@ def createItem(key, value, index): </widget> </item> <item> - <widget class="QPushButton" name="set''' + key + '''"> + <widget class="QPushButton" name="set''' + name + '''"> <property name="maximumSize"> <size> <width>40</width> @@ -153,139 +142,67 @@ def createItem(key, value, index): </layout> </item> ''' - else: - if ' ' in value[1]: - value_item = '' - for i, val in enumerate(value): - if i == 0: - continue - index += 1 - space_index = val.find(' ') - val = val[space_index + 1:] - value_item += ''' <item row="''' + str(index) + '''" column="0"> - <widget class="QLabel" name="label''' + val + '''"> - <property name="text"> - <string notr="true"> ''' + val + '''</string> - </property> - </widget> - </item> -''' - value_item += ''' <item row="''' + str(index) + '''" column="1"> - <widget class="QComboBox" name="''' + val + '''"> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> - <item> - <property name="text"> - <string notr="true">Default</string> - </property> - </item> - <item> - <property name="text"> - <string notr="true">true</string> - </property> - </item> - <item> - <property name="text"> - <string notr="true">false</string> - </property> - </item> - </widget> - </item> -''' - else: - value_item = ''' <item row="''' + str(index) + '''" column="1"> - <widget class="QComboBox" name="''' + key + '''"> - <property name="focusPolicy"> - <enum>Qt::StrongFocus</enum> - </property> -''' - if key == 'Language': - value_item += ''' <property name="enabled"> - <bool>false</bool> - </property> -''' - if index > 0: - value_item += ''' <item> - <property name="text"> - <string notr="true">Default</string> - </property> - </item> -''' - for i, val in enumerate(value): - if i == 0: - continue - underline_index = val.find('_') - val = val[underline_index + 1:] - value_item += ''' <item> - <property name="text"> - <string notr="true">''' + val + '''</string> - </property> - </item> -''' - value_item += ''' </widget> - </item> -''' - return label + value_item, index +def combobox_ui_bool(name, index): + return combobox_ui(name, ["Default", "true", "false"], index) + +def in_list(list, type): + for element in list: + if element["name"] == type: + return element; + return + +create_checks_index = 0 +def create_checks(variables, enums, structs, offset = ""): + checks = "" + global create_checks_index + # create BasedOnStyle combobox ussually not presented in FormatStyle struct + if 0 == create_checks_index: + create_checks_index += 1 + checks = lable_ui("BasedOnStyle", create_checks_index) + checks += combobox_ui("BasedOnStyle", ["LLVM", "Google", "Chromium", "Mozilla", "WebKit", "Microsoft", "GNU"], create_checks_index) + + for variable in variables: + create_checks_index += 1 + type = variable["type"] + name = variable["name"] + enum = in_list(enums, type) + struct = in_list(structs, type) + if enum: + checks += lable_ui(name, create_checks_index, offset) + checks += combobox_ui(name, [value["name"].split("_")[1] for value in enum["values"]], create_checks_index) + elif struct: + checks += lable_ui(name, create_checks_index, offset) + check = create_checks(struct["properties"]["public"], enums, structs, " ") + checks += check + elif "std::string" == type or "unsigned" == type or "int" == type: + checks += lable_ui(name, create_checks_index, offset) + checks += string_ui(name, create_checks_index) + elif "std::vector<std::string >" == type: + checks += lable_ui(name, create_checks_index, offset) + checks += vector_ui(name, create_checks_index) + elif "bool" == type: + checks += lable_ui(name, create_checks_index, offset) + checks += combobox_ui_bool(name, create_checks_index) + return checks -class MyVisitor(docutils.nodes.NodeVisitor): - in_bullet_list = False - in_bullet_list_paragraph = False - tree = {} - last_key = '' - def visit_term(self, node): - node_values = node.traverse(condition=docutils.nodes.Text) - name = node_values[0].astext() - self.last_key = name - self.tree[name] = [node_values[2].astext()] - def visit_bullet_list(self, node): - self.in_bullet_list = True - def depart_bullet_list(self, node): - self.in_bullet_list = False - def visit_paragraph(self, node): - if self.in_bullet_list: - self.in_bullet_list_paragraph = True - def depart_paragraph(self, node): - self.in_bullet_list_paragraph = False - def visit_literal(self, node): - if self.in_bullet_list_paragraph: - value = node.traverse(condition=docutils.nodes.Text)[0].astext() - self.tree[self.last_key].append(value) - self.in_bullet_list_paragraph = False - def unknown_visit(self, node): - """Called for all other node types.""" - #print(node) - pass - def unknown_departure(self, node): - pass def main(): arguments = parse_arguments() + header = CppHeaderParser.CppHeader(arguments.options_header) - content = file(arguments.options_rst).read() - document = parse_rst(content) - visitor = MyVisitor(document) - document.walkabout(visitor) - keys = visitor.tree.keys() - basedOnStyleKey = 'BasedOnStyle' - keys.remove(basedOnStyleKey) - keys.sort() + enums = header.classes["FormatStyle"]["enums"]["public"] + structs = header.classes["FormatStyle"]["nested_classes"] + variables = header.classes["FormatStyle"]["properties"]["public"] - text = '' - line, index = createItem(basedOnStyleKey, visitor.tree[basedOnStyleKey], 0) - text += line - index = 1 - for key in keys: - line, index = createItem(key, visitor.tree[key], index) - text += line - index += 1 + checks = create_checks(variables, enums, structs) current_path = os.path.dirname(os.path.abspath(__file__)) ui_path = os.path.abspath(os.path.join(current_path, '..', 'src', 'plugins', 'clangformat', 'clangformatchecks.ui')) with open(ui_path, 'w') as f: - f.write(full_ui_content(text)) + f.write(full_ui_content(checks)) + if __name__ == "__main__": main() |