xref: /aosp_15_r20/external/grpc-grpc/src/objective-c/change-comments.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker#!/usr/bin/env python2.7
2*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2015 gRPC authors.
3*cc02d7e2SAndroid Build Coastguard Worker#
4*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*cc02d7e2SAndroid Build Coastguard Worker#
8*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
9*cc02d7e2SAndroid Build Coastguard Worker#
10*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
15*cc02d7e2SAndroid Build Coastguard Worker"""Change comments style of source files from // to /** */"""
16*cc02d7e2SAndroid Build Coastguard Worker
17*cc02d7e2SAndroid Build Coastguard Workerimport re
18*cc02d7e2SAndroid Build Coastguard Workerimport sys
19*cc02d7e2SAndroid Build Coastguard Worker
20*cc02d7e2SAndroid Build Coastguard Workerif len(sys.argv) < 2:
21*cc02d7e2SAndroid Build Coastguard Worker    print("Please provide at least one source file name as argument.")
22*cc02d7e2SAndroid Build Coastguard Worker    sys.exit()
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard Workerfor file_name in sys.argv[1:]:
25*cc02d7e2SAndroid Build Coastguard Worker    print(
26*cc02d7e2SAndroid Build Coastguard Worker        "Modifying format of {file} comments in place...".format(
27*cc02d7e2SAndroid Build Coastguard Worker            file=file_name,
28*cc02d7e2SAndroid Build Coastguard Worker        )
29*cc02d7e2SAndroid Build Coastguard Worker    )
30*cc02d7e2SAndroid Build Coastguard Worker
31*cc02d7e2SAndroid Build Coastguard Worker    # Input
32*cc02d7e2SAndroid Build Coastguard Worker
33*cc02d7e2SAndroid Build Coastguard Worker    with open(file_name, "r") as input_file:
34*cc02d7e2SAndroid Build Coastguard Worker        lines = input_file.readlines()
35*cc02d7e2SAndroid Build Coastguard Worker
36*cc02d7e2SAndroid Build Coastguard Worker    def peek():
37*cc02d7e2SAndroid Build Coastguard Worker        return lines[0]
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard Worker    def read_line():
40*cc02d7e2SAndroid Build Coastguard Worker        return lines.pop(0)
41*cc02d7e2SAndroid Build Coastguard Worker
42*cc02d7e2SAndroid Build Coastguard Worker    def more_input_available():
43*cc02d7e2SAndroid Build Coastguard Worker        return lines
44*cc02d7e2SAndroid Build Coastguard Worker
45*cc02d7e2SAndroid Build Coastguard Worker    # Output
46*cc02d7e2SAndroid Build Coastguard Worker
47*cc02d7e2SAndroid Build Coastguard Worker    output_lines = []
48*cc02d7e2SAndroid Build Coastguard Worker
49*cc02d7e2SAndroid Build Coastguard Worker    def write(line):
50*cc02d7e2SAndroid Build Coastguard Worker        output_lines.append(line)
51*cc02d7e2SAndroid Build Coastguard Worker
52*cc02d7e2SAndroid Build Coastguard Worker    def flush_output():
53*cc02d7e2SAndroid Build Coastguard Worker        with open(file_name, "w") as output_file:
54*cc02d7e2SAndroid Build Coastguard Worker            for line in output_lines:
55*cc02d7e2SAndroid Build Coastguard Worker                output_file.write(line)
56*cc02d7e2SAndroid Build Coastguard Worker
57*cc02d7e2SAndroid Build Coastguard Worker    # Pattern matching
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Worker    comment_regex = r"^(\s*)//\s(.*)$"
60*cc02d7e2SAndroid Build Coastguard Worker
61*cc02d7e2SAndroid Build Coastguard Worker    def is_comment(line):
62*cc02d7e2SAndroid Build Coastguard Worker        return re.search(comment_regex, line)
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard Worker    def isnt_comment(line):
65*cc02d7e2SAndroid Build Coastguard Worker        return not is_comment(line)
66*cc02d7e2SAndroid Build Coastguard Worker
67*cc02d7e2SAndroid Build Coastguard Worker    def next_line(predicate):
68*cc02d7e2SAndroid Build Coastguard Worker        return more_input_available() and predicate(peek())
69*cc02d7e2SAndroid Build Coastguard Worker
70*cc02d7e2SAndroid Build Coastguard Worker    # Transformation
71*cc02d7e2SAndroid Build Coastguard Worker
72*cc02d7e2SAndroid Build Coastguard Worker    def indentation_of(line):
73*cc02d7e2SAndroid Build Coastguard Worker        match = re.search(comment_regex, line)
74*cc02d7e2SAndroid Build Coastguard Worker        return match.group(1)
75*cc02d7e2SAndroid Build Coastguard Worker
76*cc02d7e2SAndroid Build Coastguard Worker    def content(line):
77*cc02d7e2SAndroid Build Coastguard Worker        match = re.search(comment_regex, line)
78*cc02d7e2SAndroid Build Coastguard Worker        return match.group(2)
79*cc02d7e2SAndroid Build Coastguard Worker
80*cc02d7e2SAndroid Build Coastguard Worker    def format_as_block(comment_block):
81*cc02d7e2SAndroid Build Coastguard Worker        if len(comment_block) == 0:
82*cc02d7e2SAndroid Build Coastguard Worker            return []
83*cc02d7e2SAndroid Build Coastguard Worker
84*cc02d7e2SAndroid Build Coastguard Worker        indent = indentation_of(comment_block[0])
85*cc02d7e2SAndroid Build Coastguard Worker
86*cc02d7e2SAndroid Build Coastguard Worker        if len(comment_block) == 1:
87*cc02d7e2SAndroid Build Coastguard Worker            return [indent + "/** " + content(comment_block[0]) + " */\n"]
88*cc02d7e2SAndroid Build Coastguard Worker
89*cc02d7e2SAndroid Build Coastguard Worker        block = (
90*cc02d7e2SAndroid Build Coastguard Worker            ["/**"]
91*cc02d7e2SAndroid Build Coastguard Worker            + [" * " + content(line) for line in comment_block]
92*cc02d7e2SAndroid Build Coastguard Worker            + [" */"]
93*cc02d7e2SAndroid Build Coastguard Worker        )
94*cc02d7e2SAndroid Build Coastguard Worker        return [indent + line.rstrip() + "\n" for line in block]
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Worker    # Main algorithm
97*cc02d7e2SAndroid Build Coastguard Worker
98*cc02d7e2SAndroid Build Coastguard Worker    while more_input_available():
99*cc02d7e2SAndroid Build Coastguard Worker        while next_line(isnt_comment):
100*cc02d7e2SAndroid Build Coastguard Worker            write(read_line())
101*cc02d7e2SAndroid Build Coastguard Worker
102*cc02d7e2SAndroid Build Coastguard Worker        comment_block = []
103*cc02d7e2SAndroid Build Coastguard Worker        # Get all lines in the same comment block. We could restrict the indentation
104*cc02d7e2SAndroid Build Coastguard Worker        # to be the same as the first line of the block, but it's probably ok.
105*cc02d7e2SAndroid Build Coastguard Worker        while next_line(is_comment):
106*cc02d7e2SAndroid Build Coastguard Worker            comment_block.append(read_line())
107*cc02d7e2SAndroid Build Coastguard Worker
108*cc02d7e2SAndroid Build Coastguard Worker        for line in format_as_block(comment_block):
109*cc02d7e2SAndroid Build Coastguard Worker            write(line)
110*cc02d7e2SAndroid Build Coastguard Worker
111*cc02d7e2SAndroid Build Coastguard Worker    flush_output()
112