blob: ebd2bd3f12efaa2a5f47ca177b53e400e7a1d98c [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
generate fidl_project.json file declaring FIDL libraries
This script reads the all_fidl_generated.json file which contains all fidlgen- &
fidlc-generated output, and generates a fidl_project.json file which declares
all FIDL libraries along with their constituent files, dependencies, and build
artifacts (JSON IR and bindings). This is for use in the FIDL Language Server,
which uses fidl_project to do dependency resolution.
This script makes the assumption that all FIDL library names are unique, which
is currently not the case. However, the exceptions are mainly test libraries, so
for now this is left unaddressed.
"""
import glob
import json
import os
import re
import sys
from pathlib import Path
FUCHSIA_DIR = os.getenv('FUCHSIA_DIR')
ALL_FIDL_GENERATED_PATH = 'out/default/all_fidl_generated.json'
# schema:
# map<string, Library>
# where string is library name e.g. 'fuchsia.mem'
# and Library is
# {
# "files": []string,
# "json": string,
# "deps": []string,
# "bindings": {
# "hlcpp": {},
# "llcpp": {},
# "rust": {},
# "go": {},
# "dart": {},
# ...
# }
# }
def find_files(artifact):
library_name = artifact['library']
pattern = f'^fidling\/gen\/([\w\.\/-]+)\/[\w\-. ]+\.fidl\.json$'
result = re.search(pattern, artifact['files'][0])
if not result or not result.group(1):
return []
fidl_dir = Path(f'{FUCHSIA_DIR}/{result.group(1)}')
globs = [
fidl_dir.glob('*.fidl'),
fidl_dir.parent.glob('*.fidl'),
]
files = []
for glob in globs:
for file in glob:
# TODO: read in file
# parse `library` decl
# check that it matches library name
files.append(str(file))
return files
def find_deps(artifact):
library_json = artifact['files'][0]
library_json_path = Path(f'{FUCHSIA_DIR}/out/default/{library_json}')
with open(library_json_path, 'r') as f:
library = json.load(f)
deps = library['library_dependencies']
deps = [dep['name'] for dep in deps]
return deps
def gen_fidl_project(fidl_project_path):
result = {}
all_fidl_path = FUCHSIA_DIR + '/' + ALL_FIDL_GENERATED_PATH
with open(all_fidl_path, 'r') as f:
artifacts = json.load(f)
print('have read in all_fidl_generated')
print(len(artifacts))
for artifact in artifacts:
if artifact['type'] == 'json':
result[artifact['library']] = {
'json': f"{FUCHSIA_DIR}/out/default/{artifact['files'][0]}",
'files': find_files(artifact),
'deps': find_deps(artifact),
'bindings': {}, # TODO
}
print('writing to {}', fidl_project_path)
with open(fidl_project_path, 'w') as f:
json.dump(result, f, indent=4, sort_keys=True)
if __name__ == '__main__':
gen_fidl_project(sys.argv[1])