0

mojom: handle relative imports in check script

crrev.com/c/3367595 and crrev.com/c/3141536 revealed mojom import
statements in src/platform2/media_perception/mojom inconsistent with
imports elsewhere in src/platform2.  Attempts to make these consistent
also failed the check-mojoms presbumit check.

This adjusts the mojom compatibility checker to handle partially-
specified paths in mojom import statements, when they are not resolved
directly from --src-root, by speculatively prepending path components to
the import path. In the case no mojom is found, we are back where we
started.

TEST=repo upload crrev.com/c/3367595 succeeded with presubmit checks

Bug: None
Change-Id: Iaedd486931f08008319549f144a4ad65baba9f6b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3387100
Reviewed-by: Ken Rockot <rockot@google.com>
Commit-Queue: Richard Yeh <rcy@google.com>
Cr-Commit-Position: refs/heads/main@{#961052}
This commit is contained in:
Richard C Yeh
2022-01-19 18:56:32 +00:00
committed by Chromium LUCI CQ
parent aa42d177a8
commit d30db55832
2 changed files with 74 additions and 0 deletions

@ -75,6 +75,17 @@ def _ValidateDelta(root, delta):
raise ParseError('encountered exception {0} while parsing {1}'.format(
e, mojom))
for imp in ast.import_list:
if (not file_overrides.get(imp.import_filename)
and not os.path.exists(os.path.join(root, imp.import_filename))):
# Speculatively construct a path prefix to locate the import_filename
mojom_path = os.path.dirname(os.path.normpath(mojom)).split(os.sep)
test_prefix = ''
for path_component in mojom_path:
test_prefix = os.path.join(test_prefix, path_component)
test_import_filename = os.path.join(test_prefix, imp.import_filename)
if os.path.exists(os.path.join(root, test_import_filename)):
imp.import_filename = test_import_filename
break
parseMojom(imp.import_filename, file_overrides, override_modules)
# Now that the transitive set of dependencies has been imported and parsed

@ -258,3 +258,66 @@ class CheckStableMojomCompatibilityTest(unittest.TestCase):
[Stable] struct T { foo.S s; int32 x; };
""")
])
def testWithPartialImport(self):
"""The compatibility checking tool correctly parses imports with partial
paths."""
self.assertBackwardCompatible([
UnchangedFile('foo/foo.mojom', 'module foo; [Stable] struct S {};'),
Change('foo/bar.mojom',
old="""\
module bar;
import "foo/foo.mojom";
[Stable] struct T { foo.S s; };
""",
new="""\
module bar;
import "foo.mojom";
[Stable] struct T { foo.S s; };
""")
])
self.assertBackwardCompatible([
UnchangedFile('foo/foo.mojom', 'module foo; [Stable] struct S {};'),
Change('foo/bar.mojom',
old="""\
module bar;
import "foo.mojom";
[Stable] struct T { foo.S s; };
""",
new="""\
module bar;
import "foo/foo.mojom";
[Stable] struct T { foo.S s; };
""")
])
self.assertNotBackwardCompatible([
UnchangedFile('foo/foo.mojom', 'module foo; [Stable] struct S {};'),
Change('bar/bar.mojom',
old="""\
module bar;
import "foo/foo.mojom";
[Stable] struct T { foo.S s; };
""",
new="""\
module bar;
import "foo.mojom";
[Stable] struct T { foo.S s; };
""")
])
self.assertNotBackwardCompatible([
UnchangedFile('foo/foo.mojom', 'module foo; [Stable] struct S {};'),
Change('bar/bar.mojom',
old="""\
module bar;
import "foo.mojom";
[Stable] struct T { foo.S s; };
""",
new="""\
module bar;
import "foo/foo.mojom";
[Stable] struct T { foo.S s; };
""")
])