Apply some of @jwestman's suggestions

This commit is contained in:
gregorni 2023-09-17 10:10:25 +02:00
parent 455924e22f
commit f777c531e4
4 changed files with 66 additions and 69 deletions

View file

@ -1,6 +1,6 @@
# decompiler.py # formatter.py
# #
# Copyright 2021 James Westman <james@jwestman.net> # Copyright 2023 James Westman <james@jwestman.net>
# #
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as # under the terms of the GNU Lesser General Public License as
@ -27,7 +27,7 @@ CLOSING_TOKENS = ["}", "]"]
NEWLINE_AFTER = [";"] + OPENING_TOKENS + CLOSING_TOKENS NEWLINE_AFTER = [";"] + OPENING_TOKENS + CLOSING_TOKENS
NO_WHITESPACE_BEFORE = [",", ":", "::", ";", ")", ".", ">"] NO_WHITESPACE_BEFORE = [",", ":", "::", ";", ")", ".", ">", "]"]
NO_WHITESPACE_AFTER = ["C_", "_", "("] NO_WHITESPACE_AFTER = ["C_", "_", "("]
# NO_WHITESPACE_BEFORE takes precedence over WHITESPACE_AFTER # NO_WHITESPACE_BEFORE takes precedence over WHITESPACE_AFTER
@ -127,9 +127,8 @@ class Format:
): ):
if str_item in OPENING_TOKENS: if str_item in OPENING_TOKENS:
if str_item == "[": if str_item == "[":
is_child_type = (current_line + "[").startswith("[") is_child_type = current_line.startswith("[")
if is_child_type: if is_child_type:
NO_WHITESPACE_BEFORE.append("]")
if str(last_not_whitespace) not in OPENING_TOKENS: if str(last_not_whitespace) not in OPENING_TOKENS:
another_newline() another_newline()
last_not_whitespace = item last_not_whitespace = item
@ -147,33 +146,32 @@ class Format:
LineType.BLOCK_OPEN, LineType.BLOCK_OPEN,
) )
elif str_item == "]" and is_child_type:
commit_current_line(
line_type=LineType.CHILD_TYPE,
indent_decrease=False,
)
is_child_type = False
elif str_item in CLOSING_TOKENS: elif str_item in CLOSING_TOKENS:
if str_item == "]": if str_item == "]":
if is_child_type: NEWLINE_AFTER.remove(",")
NO_WHITESPACE_BEFORE.remove("]") WHITESPACE_AFTER.append(",")
indent_levels += 1
else:
WHITESPACE_AFTER.append(",")
NEWLINE_AFTER.remove(",")
if last_not_whitespace != ",": if last_not_whitespace != ",":
current_line = current_line[:-1] current_line = current_line[:-1]
commit_current_line() commit_current_line()
current_line = "]" current_line = "]"
indent_levels -= 1 indent_levels -= 1
commit_current_line( commit_current_line(
line_type=LineType.CHILD_TYPE line_type=LineType.BLOCK_CLOSE,
if is_child_type indent_decrease=True,
else LineType.BLOCK_CLOSE,
indent_decrease=not is_child_type,
) )
is_child_type = False
elif str_item == ";" and len(end_str) > 0: elif str_item == ";" and len(end_str) > 0:
commit_current_line( commit_current_line(
two_newlines=end_str.strip()[-1] in CLOSING_TOKENS two_newlines=prev_line_type == LineType.BLOCK_CLOSE
) )
else: else:

View file

@ -292,18 +292,15 @@ class LanguageServer:
return return
try: try:
XmlOutput().emit(open_file.ast) formatted_blp = Format.format(
except: open_file.text,
printerr(traceback.format_exc()) params["options"]["tabSize"],
self._send_error(id, ErrorCode.RequestFailed, "Could not compile document") params["options"]["insertSpaces"],
)
except PrintableError:
self._send_error(id, ErrorCode.RequestFailed, "Could not format document")
return return
formatted_blp = Format.format(
open_file.text,
params["options"]["tabSize"],
params["options"]["insertSpaces"],
)
lst = [] lst = []
for tag, i1, i2, j1, j2 in SequenceMatcher( for tag, i1, i2, j1, j2 in SequenceMatcher(
None, open_file.text, formatted_blp None, open_file.text, formatted_blp

View file

@ -186,12 +186,12 @@ class BlueprintApp:
for path in opts.inputs: for path in opts.inputs:
if os.path.isfile(path): if os.path.isfile(path):
input_files.append(open(path, "r+")) input_files.append(path)
elif os.path.isdir(path): elif os.path.isdir(path):
for root, subfolders, files in os.walk(path): for root, subfolders, files in os.walk(path):
for file in files: for file in files:
if file.endswith(".blp"): if file.endswith(".blp"):
input_files.append(open(os.path.join(root, file), "r+")) input_files.append(os.path.join(root, file))
else: else:
print( print(
f"{Colors.RED}{Colors.BOLD}Could not find file: {path}{Colors.CLEAR}" f"{Colors.RED}{Colors.BOLD}Could not find file: {path}{Colors.CLEAR}"
@ -200,50 +200,52 @@ class BlueprintApp:
formatted_files = 0 formatted_files = 0
for file in input_files: for file in input_files:
data = file.read() with open(file, "r+") as file:
data = file.read()
try: try:
xml, warnings = self._compile(data) xml, warnings = self._compile(data)
for warning in warnings: for warning in warnings:
warning.pretty_print(file.name, data, stream=sys.stderr) warning.pretty_print(file.name, data, stream=sys.stderr)
formatted_str = Format.format(data, opts.spaces, not opts.tabs) formatted_str = Format.format(data, opts.spaces, not opts.tabs)
if data != formatted_str: if data != formatted_str:
happened = "Would reformat" happened = "Would reformat"
if opts.fix: if opts.fix:
file.seek(0) file.seek(0)
file.truncate() file.truncate()
file.write(formatted_str) file.write(formatted_str)
happened = "Reformatted" happened = "Reformatted"
a_lines = data.splitlines(keepends=True) a_lines = data.splitlines(keepends=True)
b_lines = formatted_str.splitlines(keepends=True) b_lines = formatted_str.splitlines(keepends=True)
diff_lines = [] diff_lines = []
for line in difflib.unified_diff( for line in difflib.unified_diff(
a_lines, b_lines, fromfile=file.name, tofile=file.name, n=5 a_lines, b_lines, fromfile=file.name, tofile=file.name, n=5
): ):
# Work around https://bugs.python.org/issue2142 # Work around https://bugs.python.org/issue2142
# See: # See:
# https://www.gnu.org/software/diffutils/manual/html_node/Incomplete-Lines.html # https://www.gnu.org/software/diffutils/manual/html_node/Incomplete-Lines.html
if line[-1] == "\n": if line[-1] == "\n":
diff_lines.append(line) diff_lines.append(line)
else: else:
diff_lines.append(line + "\n") diff_lines.append(line + "\n")
diff_lines.append("\\ No newline at end of file\n") diff_lines.append("\\ No newline at end of file\n")
print( print(
f"{''.join(diff_lines)}\n{Colors.BOLD}{happened} {file.name}{Colors.CLEAR}\n" # f"{''.join(diff_lines)}\n{Colors.BOLD}{happened} {file.name}{Colors.CLEAR}\n"
) formatted_str
)
formatted_files += 1 formatted_files += 1
except PrintableError as e: except PrintableError as e:
e.pretty_print(file.name, data, stream=sys.stderr) e.pretty_print(file.name, data, stream=sys.stderr)
sys.exit(1) sys.exit(1)
left_files = len(input_files) - formatted_files left_files = len(input_files) - formatted_files

View file

@ -1,6 +1,6 @@
# test_formatter.py # test_formatter.py
# #
# Copyright 2021 James Westman <james@jwestman.net> # Copyright 2023 James Westman <james@jwestman.net>
# #
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as # under the terms of the GNU Lesser General Public License as