12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #!/usr/bin/env python
- # Simple and indolent text processor to do inline go function calling
- import sys, re
- files = sys.argv
- class inline(object):
- def __init__(self, name):
- self.name = name
- self.receiver = ""
- self.args = []
- self.contents = []
- self.file = ""
- self.original = ""
- inlines = {}
- for file in sorted(files, reverse=True):
- contents = open(file).read().splitlines()
- i = 0
- name = ""
- while i < len(contents):
- line = contents[i]
- m = re.match(".*\/\/ \+inline-start", line)
- if m:
- m2 = re.match("^func\s*(\([\*\s\w]+\))?\s*(\w+)\(([^\)]*)\)", line)
- name = m2.group(2)
- tinline = inline(name)
- tinline.original = line.split("//")[0].strip().rstrip("{")
- tinline.file = file
- if m2.group(1):
- tinline.receiver = m2.group(1).split("(")[1].split(" ")[0]
- tinline.args = [arg.strip().split(" ")[0] for arg in m2.group(3).split(",")]
- inlines[name] = tinline
- else:
- if re.match(".*\/\/\s*\+inline-end", line):
- inlines[name].contents = "\n".join(inlines[name].contents)
- name = ""
- elif len(name) > 0:
- inlines[name].contents.append(line)
- i += 1
- def do_inlining(text):
- contents = text.splitlines()
- buf = []
- i = 0
- while i < len(contents):
- line = contents[i]
- m = re.match("\s*\/\/\s*\+inline-call\s+([\w\.]+)\s+(.*)", line)
- if m:
- inlinet = inlines[m.group(1).split(".")[-1]]
- buf.append("// this section is inlined by go-inline")
- buf.append("// source function is '{}' in '{}'".format(inlinet.original, inlinet.file))
- buf.append("{")
- if len(inlinet.receiver) > 0 and inlinet.receiver != m.group(1).split(".")[0]:
- buf.append("{} := {}".format(inlinet.receiver, ".".join(m.group(1).split(".")[0:-1])))
- callargs = [arg.strip() for arg in m.group(2).split(" ")]
- for j in range(len(callargs)):
- if inlinet.args[j] != callargs[j]:
- buf.append("{} := {}".format(inlinet.args[j], callargs[j]))
- buf.append(do_inlining(inlinet.contents))
- buf.append("}")
- else:
- buf.append(line)
- i += 1
- return "\n".join(buf)
- for file in files:
- if not file.startswith("_"):
- continue
- contents = open(file).read()
- with open(file.lstrip("_"), "w") as io:
- inlined = do_inlining(contents).split("\n")
- for i in range(len(inlined)):
- if i == 1:
- io.write("////////////////////////////////////////////////////////\n")
- io.write("// This file was generated by go-inline. DO NOT EDIT. //\n")
- io.write("////////////////////////////////////////////////////////\n")
- io.write(inlined[i])
- io.write("\n")
- io.write("\n")
|