87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
|
#!/usr/bin/env python3
|
||
|
import json
|
||
|
import os
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import re
|
||
|
|
||
|
def main():
|
||
|
base_offset = 41
|
||
|
|
||
|
go_version_raw = subprocess.Popen("go version",
|
||
|
shell=True,
|
||
|
stdout=subprocess.PIPE
|
||
|
).stdout.read()
|
||
|
|
||
|
go_version = str(go_version_raw).split(' ')[2].strip('go')
|
||
|
go_os = sys.argv[1]
|
||
|
go_arch = sys.argv[2]
|
||
|
|
||
|
with open('./stdlib-' + go_version + '_' + go_os + '_' + go_arch + '.txt') as stdlib:
|
||
|
packages = stdlib.read().splitlines()
|
||
|
|
||
|
for pkg in packages:
|
||
|
template_file = './template.go'
|
||
|
f = open(template_file)
|
||
|
fs = f.read(-1)
|
||
|
|
||
|
func = None
|
||
|
if re.search(r'/', pkg):
|
||
|
library = str(pkg).split(r'/')[:-1]
|
||
|
func = str(pkg).split(r'/')[-1]
|
||
|
else:
|
||
|
library = pkg
|
||
|
func = pkg
|
||
|
source = str(fs).replace('IMPORT', pkg).replace('FUNC', func).encode()
|
||
|
|
||
|
offset = base_offset + (len(pkg) + len(func))
|
||
|
|
||
|
process = subprocess.Popen([FindBinaryPath('gocode'),
|
||
|
'-f=json',
|
||
|
'autocomplete',
|
||
|
template_file,
|
||
|
str(offset)],
|
||
|
stdin=subprocess.PIPE,
|
||
|
stdout=subprocess.PIPE,
|
||
|
stderr=subprocess.PIPE,
|
||
|
start_new_session=True)
|
||
|
process.stdin.write(source)
|
||
|
stdout_data, stderr_data = process.communicate()
|
||
|
result = json.loads(stdout_data.decode())
|
||
|
|
||
|
out_dir = os.path.join(
|
||
|
'./json', go_version, go_os + '_' + go_arch)
|
||
|
if not os.path.exists(out_dir):
|
||
|
os.makedirs(out_dir)
|
||
|
|
||
|
libdir = str(pkg).rsplit('/', 1)[0]
|
||
|
pkg_dir = os.path.join(out_dir, libdir)
|
||
|
if not os.path.exists(pkg_dir):
|
||
|
os.makedirs(pkg_dir)
|
||
|
out_path = \
|
||
|
os.path.join(pkg_dir, func + '.json')
|
||
|
out = open(out_path, 'w')
|
||
|
out.write(json.dumps(result, sort_keys=True))
|
||
|
out.close()
|
||
|
|
||
|
print(pkg)
|
||
|
|
||
|
|
||
|
def FindBinaryPath(cmd):
|
||
|
def is_exec(fpath):
|
||
|
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
|
||
|
|
||
|
fpath, fname = os.path.split(cmd)
|
||
|
if fpath:
|
||
|
if is_exec(cmd):
|
||
|
return cmd
|
||
|
else:
|
||
|
for path in os.environ["PATH"].split(os.pathsep):
|
||
|
path = path.strip('"')
|
||
|
binary = os.path.join(path, cmd)
|
||
|
if is_exec(binary):
|
||
|
return binary
|
||
|
return print('gocode binary not found')
|
||
|
|
||
|
main()
|