Author: Jannick Kremer Date: 2026-07-25T12:38:13+09:00 New Revision: c64a5b0c4cbf01df2a29cc2175b362c76e360373
URL: https://github.com/llvm/llvm-project/commit/c64a5b0c4cbf01df2a29cc2175b362c76e360373 DIFF: https://github.com/llvm/llvm-project/commit/c64a5b0c4cbf01df2a29cc2175b362c76e360373.diff LOG: [libclang/python] Remove CompletionString.AvailabilityKindCompat (#210682) This completes the fourth step of https://github.com/llvm/llvm-project/pull/156680 This change is a follow-up to https://github.com/llvm/llvm-project/pull/160296, following the release branching, to ensure a one release-cycle deprecation period. --------- Co-authored-by: Vlad Serebrennikov <[email protected]> Added: Modified: clang/bindings/python/clang/cindex.py clang/bindings/python/tests/cindex/test_code_completion.py clang/bindings/python/tests/cindex/test_enums.py clang/docs/ReleaseNotes.md Removed: ################################################################################ diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py index 0f6d2919b3795..126c7bf44d1d1 100644 --- a/clang/bindings/python/clang/cindex.py +++ b/clang/bindings/python/clang/cindex.py @@ -3140,52 +3140,6 @@ def string(self) -> CompletionString | None: class CompletionString(ClangObject): - # AvailabilityKindCompat is an exact copy of AvailabilityKind, except for __str__. - # This is a temporary measure to keep the string representation the same - # until we change CompletionString.availability to return AvailabilityKind, - # like Cursor.availability does. - # Note that deriving from AvailabilityKind directly is not possible. - class AvailabilityKindCompat(BaseEnumeration): - """ - Describes the availability of an entity. - It is deprecated in favor of AvailabilityKind. - """ - - # Ensure AvailabilityKindCompat is comparable with AvailabilityKind - def __eq__(self, other: object) -> bool: - if isinstance( - other, (AvailabilityKind, CompletionString.AvailabilityKindCompat) - ): - return self.value == other.value - else: - return NotImplemented - - def __str__(self) -> str: - """ - Converts enum value to string in the old camelCase format. - This is a temporary measure that will be changed in the future release - to return string in ALL_CAPS format, like for other enums. - """ - - warnings.warn( - "String representation of 'CompletionString.availability' will be " - "changed in a future release from 'camelCase' to 'ALL_CAPS' to " - "match other enums. 'CompletionString.availability' can be " - "compared to 'AvailabilityKind' directly, " - "without conversion to string.", - DeprecationWarning, - ) - # Remove underscores - components = self.name.split("_") - # Upper-camel case each split component - components = [component.lower().capitalize() for component in components] - return "".join(components) - - AVAILABLE = 0 - DEPRECATED = 1 - NOT_AVAILABLE = 2 - NOT_ACCESSIBLE = 3 - def __len__(self) -> int: return self.num_chunks @@ -3210,9 +3164,9 @@ def priority(self) -> int: return conf.lib.clang_getCompletionPriority(self.obj) # type: ignore [no-any-return] @property - def availability(self) -> AvailabilityKindCompat: + def availability(self) -> AvailabilityKind: res = conf.lib.clang_getCompletionAvailability(self.obj) - return CompletionString.AvailabilityKindCompat.from_id(res) + return AvailabilityKind.from_id(res) @property def briefComment(self) -> str: diff --git a/clang/bindings/python/tests/cindex/test_code_completion.py b/clang/bindings/python/tests/cindex/test_code_completion.py index abc5d3d23c982..f89927e50ab0a 100644 --- a/clang/bindings/python/tests/cindex/test_code_completion.py +++ b/clang/bindings/python/tests/cindex/test_code_completion.py @@ -16,24 +16,10 @@ def check_completion_results(self, cr, expected): self.assertIsNotNone(cr) self.assertEqual(len(cr.diagnostics), 0) - with warnings.catch_warnings(record=True) as log: - completions = [str(c) for c in cr] - self.assertEqual(len(log), 1) - for warning in log: - self.assertIsInstance(warning.message, DeprecationWarning) - + completions = [str(c) for c in cr] for c in expected: self.assertIn(c, completions) - with warnings.catch_warnings(record=True) as log: - completions_deprecated = [str(c) for c in cr.results] - self.assertEqual(len(log), 2) - for warning in log: - self.assertIsInstance(warning.message, DeprecationWarning) - - for c in expected: - self.assertIn(c, completions_deprecated) - def test_code_complete(self): files = [ ( @@ -64,9 +50,9 @@ def test_code_complete(self): ) expected = [ - "{'int', CompletionChunkKind.RESULT_TYPE} | {'test1', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: Available || Brief comment: Aaa.", - "{'void', CompletionChunkKind.RESULT_TYPE} | {'test2', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 50 || Availability: Available || Brief comment: Bbb.", - "{'return', CompletionChunkKind.TYPED_TEXT} | {';', CompletionChunkKind.SEMI_COLON} || Priority: 40 || Availability: Available || Brief comment: ", + "{'int', CompletionChunkKind.RESULT_TYPE} | {'test1', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: Aaa.", + "{'void', CompletionChunkKind.RESULT_TYPE} | {'test2', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: Bbb.", + "{'return', CompletionChunkKind.TYPED_TEXT} | {';', CompletionChunkKind.SEMI_COLON} || Priority: 40 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", ] self.check_completion_results(cr, expected) @@ -104,9 +90,9 @@ def test_code_complete_pathlike(self): ) expected = [ - "{'int', CompletionChunkKind.RESULT_TYPE} | {'test1', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: Available || Brief comment: Aaa.", - "{'void', CompletionChunkKind.RESULT_TYPE} | {'test2', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 50 || Availability: Available || Brief comment: Bbb.", - "{'return', CompletionChunkKind.TYPED_TEXT} | {';', CompletionChunkKind.SEMI_COLON} || Priority: 40 || Availability: Available || Brief comment: ", + "{'int', CompletionChunkKind.RESULT_TYPE} | {'test1', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: Aaa.", + "{'void', CompletionChunkKind.RESULT_TYPE} | {'test2', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: Bbb.", + "{'return', CompletionChunkKind.TYPED_TEXT} | {';', CompletionChunkKind.SEMI_COLON} || Priority: 40 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", ] self.check_completion_results(cr, expected) @@ -140,60 +126,18 @@ class Q : public P { cr = tu.codeComplete("fake.cpp", 12, 5, unsaved_files=files) expected = [ - "{'const', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: Available || Brief comment: ", - "{'volatile', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: Available || Brief comment: ", - "{'operator', CompletionChunkKind.TYPED_TEXT} || Priority: 40 || Availability: Available || Brief comment: ", - "{'P', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: Available || Brief comment: ", - "{'Q', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: Available || Brief comment: ", + "{'const', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", + "{'volatile', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", + "{'operator', CompletionChunkKind.TYPED_TEXT} || Priority: 40 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", + "{'P', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", + "{'Q', CompletionChunkKind.TYPED_TEXT} || Priority: 50 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", ] self.check_completion_results(cr, expected) cr = tu.codeComplete("fake.cpp", 13, 5, unsaved_files=files) expected = [ - "{'P', CompletionChunkKind.TYPED_TEXT} | {'::', CompletionChunkKind.TEXT} || Priority: 75 || Availability: Available || Brief comment: ", - "{'P &', CompletionChunkKind.RESULT_TYPE} | {'operator=', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {'const P &', CompletionChunkKind.PLACEHOLDER} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 79 || Availability: Available || Brief comment: ", - "{'int', CompletionChunkKind.RESULT_TYPE} | {'member', CompletionChunkKind.TYPED_TEXT} || Priority: 35 || Availability: NotAccessible || Brief comment: ", - "{'void', CompletionChunkKind.RESULT_TYPE} | {'~P', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 79 || Availability: Available || Brief comment: ", + "{'P', CompletionChunkKind.TYPED_TEXT} | {'::', CompletionChunkKind.TEXT} || Priority: 75 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", + "{'P &', CompletionChunkKind.RESULT_TYPE} | {'operator=', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {'const P &', CompletionChunkKind.PLACEHOLDER} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 79 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", + "{'int', CompletionChunkKind.RESULT_TYPE} | {'member', CompletionChunkKind.TYPED_TEXT} || Priority: 35 || AvailabilityKind.NOT_ACCESSIBLE || Brief comment: ", + "{'void', CompletionChunkKind.RESULT_TYPE} | {'~P', CompletionChunkKind.TYPED_TEXT} | {'(', CompletionChunkKind.LEFT_PAREN} | {')', CompletionChunkKind.RIGHT_PAREN} || Priority: 79 || Availability: AvailabilityKind.AVAILABLE || Brief comment: ", ] - self.check_completion_results(cr, expected) - - def test_availability_kind_compat(self): - numKinds = len(CompletionString.AvailabilityKindCompat) - - # Compare with regular kind - for compatKind in CompletionString.AvailabilityKindCompat: - commonKind = AvailabilityKind.from_id(compatKind.value) - nextKindId = (compatKind.value + 1) % numKinds - commonKindUnequal = AvailabilityKind.from_id(nextKindId) - self.assertEqual(commonKind, compatKind) - self.assertEqual(compatKind, commonKind) - self.assertNotEqual(commonKindUnequal, compatKind) - self.assertNotEqual(compatKind, commonKindUnequal) - - # Compare two compat kinds - for compatKind in CompletionString.AvailabilityKindCompat: - compatKind2 = CompletionString.AvailabilityKindCompat.from_id( - compatKind.value - ) - nextKindId = (compatKind.value + 1) % numKinds - compatKind2Unequal = CompletionString.AvailabilityKindCompat.from_id( - nextKindId - ) - self.assertEqual(compatKind, compatKind2) - self.assertEqual(compatKind2, compatKind) - self.assertNotEqual(compatKind2Unequal, compatKind) - self.assertNotEqual(compatKind, compatKind2Unequal) - - def test_compat_str(self): - kindStringMap = { - 0: "Available", - 1: "Deprecated", - 2: "NotAvailable", - 3: "NotAccessible", - } - for id, string in kindStringMap.items(): - kind = CompletionString.AvailabilityKindCompat.from_id(id) - with warnings.catch_warnings(record=True) as log: - self.assertEqual(str(kind), string) - self.assertEqual(len(log), 1) - self.assertIsInstance(log[0].message, DeprecationWarning) diff --git a/clang/bindings/python/tests/cindex/test_enums.py b/clang/bindings/python/tests/cindex/test_enums.py index 283a54998470c..09f346ee6e11f 100644 --- a/clang/bindings/python/tests/cindex/test_enums.py +++ b/clang/bindings/python/tests/cindex/test_enums.py @@ -27,7 +27,6 @@ class TestEnums(unittest.TestCase): # Test all enum classes, except for AvailabilityKindCompat since it is # just a copy of AvailabilityKind and has no corresponding C-class enums = BaseEnumeration.__subclasses__() - enums.remove(CompletionString.AvailabilityKindCompat) def test_from_id(self): """Check that kinds can be constructed from valid IDs""" diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md index 83a2b10d96046..846c65a7784df 100644 --- a/clang/docs/ReleaseNotes.md +++ b/clang/docs/ReleaseNotes.md @@ -83,6 +83,10 @@ features cannot lower the translation-unit ABI level; Affected methods: `isKindOptional`, `isKindTypedText`, `isKindPlaceHolder`, `isKindInformative` and `isKindResultType`. +- `CompletionString.availability` now returns instances of `AvailabilityKind`. + As a result, the `__str__` representation of its return values changed. + Like other libclang enums, it now follows the `CompletionChunkKind.VARIANT_NAME` scheme instead of `VariantName`. + ### OpenCL Potentially Breaking Changes ## What's New in Clang {{env.config.release}}? _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
