blob: bff77bfcafec0d95b09f85af1e30fb33c3addeac [file]
from check_index import *
import json
import os
def read_json(filename):
with open(os.path.join(reply_dir, filename)) as f:
return json.load(f)
def check_target_id(target_ids, std_target_ids, state, target_file, context, target_id):
assert target_id in target_ids, \
"Target '%s' has dangling %s target id '%s'." % (target_file, context, target_id)
if target_id in std_target_ids:
state["referenced_std_target"] = True
def collect_target_ids(codemodel):
target_ids = set()
target_json_files = set()
std_target_ids = set()
seen_main_target = False
seen_std_target = False
assert is_list(codemodel["configurations"])
assert len(codemodel["configurations"]) > 0
for configuration in codemodel["configurations"]:
for target_list_name in ("targets", "abstractTargets"):
for target in configuration[target_list_name]:
assert is_dict(target)
target_id = target["id"]
target_ids.add(target_id)
target_json_files.add(target["jsonFile"])
if target["name"] == "main":
seen_main_target = True
if target["name"] == "@cmake_cxx_std":
seen_std_target = True
std_target_ids.add(target_id)
assert seen_main_target, "The File API codemodel did not report the user target 'main'."
assert seen_std_target, \
"The File API codemodel did not report the import std target '@cmake_cxx_std'."
return target_ids, target_json_files, std_target_ids
def check_target_references(codemodel):
target_ids, target_json_files, std_target_ids = collect_target_ids(codemodel)
target_id_reference_fields = (
"dependencies",
"compileDependencies",
"interfaceCompileDependencies",
"objectDependencies",
"orderDependencies",
)
link_reference_fields = (
"linkLibraries",
"interfaceLinkLibraries",
)
state = {
"referenced_std_target": False,
}
for target_json_file in sorted(target_json_files):
target = read_json(target_json_file)
for target_reference_field in target_id_reference_fields:
if target_reference_field not in target:
continue
assert is_list(target[target_reference_field])
for reference in target[target_reference_field]:
assert is_dict(reference)
check_target_id(
target_ids,
std_target_ids,
state,
target_json_file,
target_reference_field,
reference["id"])
if "fromDependency" in reference:
assert is_dict(reference["fromDependency"])
assert sorted(reference["fromDependency"].keys()) == ["id"]
check_target_id(
target_ids,
std_target_ids,
state,
target_json_file,
target_reference_field + ".fromDependency",
reference["fromDependency"]["id"])
for target_reference_field in link_reference_fields:
if target_reference_field not in target:
continue
assert is_list(target[target_reference_field])
for reference in target[target_reference_field]:
assert is_dict(reference)
has_id = "id" in reference
has_fragment = "fragment" in reference
assert has_id != has_fragment
if has_id:
check_target_id(
target_ids,
std_target_ids,
state,
target_json_file,
target_reference_field,
reference["id"])
if "fromDependency" in reference:
assert is_dict(reference["fromDependency"])
assert sorted(reference["fromDependency"].keys()) == ["id"]
check_target_id(
target_ids,
std_target_ids,
state,
target_json_file,
target_reference_field + ".fromDependency",
reference["fromDependency"]["id"])
assert state["referenced_std_target"], \
"The File API codemodel did not reference '@cmake_cxx_std' from any target relationship."
assert is_dict(index)
assert sorted(index.keys()) == ["cmake", "objects", "reply"]
assert is_list(index["objects"])
codemodel_index = None
for index_object in index["objects"]:
if index_object["kind"] == "codemodel":
codemodel_index = index_object
break
assert codemodel_index is not None, "No codemodel object found in File API index."
assert codemodel_index["version"]["major"] == 2
codemodel = read_json(codemodel_index["jsonFile"])
check_target_references(codemodel)