tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

align_stack_comment.py (2944B)


      1 #!/usr/bin/python -B
      2 # This Source Code Form is subject to the terms of the Mozilla Public
      3 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
      4 # You can obtain one at http://mozilla.org/MPL/2.0/.
      5 
      6 
      7 """Usage: align_stack_comment.py FILE
      8 
      9 This script aligns the stack transition comment in BytecodeEmitter and
     10 its helper classes.
     11 
     12 The stack transition comment looks like the following:
     13  //        [stack] VAL1 VAL2 VAL3
     14 """
     15 
     16 import re
     17 import sys
     18 
     19 # The column index of '[' of '[stack]'
     20 ALIGNMENT_COLUMN = 20
     21 
     22 # The maximum column for comment
     23 MAX_CHARS_PER_LINE = 80
     24 
     25 stack_comment_pat = re.compile(r"^( *//) *(\[stack\].*)$")
     26 
     27 
     28 def align_stack_comment(path):
     29    lines = []
     30    changed = False
     31 
     32    with open(path) as f:
     33        max_head_len = 0
     34        max_comment_len = 0
     35 
     36        line_num = 0
     37 
     38        for line in f:
     39            line_num += 1
     40            # Python includes \n in lines.
     41            line = line.rstrip("\n")
     42 
     43            m = stack_comment_pat.search(line)
     44            if m:
     45                head = m.group(1) + " "
     46                head_len = len(head)
     47                comment = m.group(2)
     48                comment_len = len(comment)
     49 
     50                if head_len > ALIGNMENT_COLUMN:
     51                    print(
     52                        f"Warning: line {line_num} overflows from alignment column {ALIGNMENT_COLUMN}: {head_len}",
     53                        file=sys.stderr,
     54                    )
     55 
     56                line_len = max(head_len, ALIGNMENT_COLUMN) + comment_len
     57                if line_len > MAX_CHARS_PER_LINE:
     58                    print(
     59                        f"Warning: line {line_num} overflows from {MAX_CHARS_PER_LINE} chars: {line_len}",
     60                        file=sys.stderr,
     61                    )
     62 
     63                max_head_len = max(max_head_len, head_len)
     64                max_comment_len = max(max_comment_len, comment_len)
     65 
     66                spaces = max(ALIGNMENT_COLUMN - head_len, 0)
     67                formatted = head + " " * spaces + comment
     68 
     69                if formatted != line:
     70                    changed = True
     71 
     72                lines.append(formatted)
     73            else:
     74                lines.append(line)
     75 
     76        print(
     77            f"Info: Minimum column number for [stack]: {max_head_len}",
     78            file=sys.stderr,
     79        )
     80        print(
     81            f"Info: Alignment column number for [stack]: {ALIGNMENT_COLUMN}",
     82            file=sys.stderr,
     83        )
     84        print(
     85            f"Info: Max length of stack transition comments: {max_comment_len}",
     86            file=sys.stderr,
     87        )
     88 
     89    if changed:
     90        with open(path, "w") as f:
     91            for line in lines:
     92                print(line, file=f)
     93    else:
     94        print("No change.")
     95 
     96 
     97 if __name__ == "__main__":
     98    if len(sys.argv) < 2:
     99        print("Usage: align_stack_comment.py FILE", file=sys.stderr)
    100        sys.exit(1)
    101 
    102    for path in sys.argv[1:]:
    103        print(path)
    104        align_stack_comment(path)