llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Jannick Kremer (DeinAlptraum)

<details>
<summary>Changes</summary>

This adresses point 2 from https://github.com/llvm/llvm-project/issues/156680.

Also add a dummy object that serves as an alias to `SPELLING_CACHE`, used to 
replicate the old behavior and throw a `DeprecationWarning`.

---
Full diff: https://github.com/llvm/llvm-project/pull/177586.diff


2 Files Affected:

- (modified) clang/bindings/python/clang/cindex.py (+101-76) 
- (modified) clang/docs/ReleaseNotes.rst (+5) 


``````````diff
diff --git a/clang/bindings/python/clang/cindex.py 
b/clang/bindings/python/clang/cindex.py
index 9dce404a183aa..f76fb38de6a7f 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -3024,82 +3024,6 @@ class _CXUnsavedFile(Structure):
     _fields_ = [("name", c_char_p), ("contents", c_char_p), ("length", 
c_ulong)]
 
 
-# Functions calls through the python interface are rather slow. Fortunately,
-# for most symbols, we do not need to perform a function call. Their spelling
-# never changes and is consequently provided by this spelling cache.
-SPELLING_CACHE = {
-    # 0: CompletionChunk.Kind("Optional"),
-    # 1: CompletionChunk.Kind("TypedText"),
-    # 2: CompletionChunk.Kind("Text"),
-    # 3: CompletionChunk.Kind("Placeholder"),
-    # 4: CompletionChunk.Kind("Informative"),
-    # 5 : CompletionChunk.Kind("CurrentParameter"),
-    6: "(",  # CompletionChunk.Kind("LeftParen"),
-    7: ")",  # CompletionChunk.Kind("RightParen"),
-    8: "[",  # CompletionChunk.Kind("LeftBracket"),
-    9: "]",  # CompletionChunk.Kind("RightBracket"),
-    10: "{",  # CompletionChunk.Kind("LeftBrace"),
-    11: "}",  # CompletionChunk.Kind("RightBrace"),
-    12: "<",  # CompletionChunk.Kind("LeftAngle"),
-    13: ">",  # CompletionChunk.Kind("RightAngle"),
-    14: ", ",  # CompletionChunk.Kind("Comma"),
-    # 15: CompletionChunk.Kind("ResultType"),
-    16: ":",  # CompletionChunk.Kind("Colon"),
-    17: ";",  # CompletionChunk.Kind("SemiColon"),
-    18: "=",  # CompletionChunk.Kind("Equal"),
-    19: " ",  # CompletionChunk.Kind("HorizontalSpace"),
-    # 20: CompletionChunk.Kind("VerticalSpace")
-}
-
-
-class CompletionChunk:
-    __kind_id: int
-
-    def __init__(self, completionString: CObjP, key: int):
-        self.cs = completionString
-        self.key = key
-
-    def __repr__(self) -> str:
-        return "{'" + self.spelling + "', " + str(self.kind) + "}"
-
-    @CachedProperty
-    def spelling(self) -> str:
-        kind_id = conf.lib.clang_getCompletionChunkKind(self.cs, self.key)
-        if kind_id in SPELLING_CACHE:
-            return SPELLING_CACHE[kind_id]
-        return _CXString.from_result(
-            conf.lib.clang_getCompletionChunkText(self.cs, self.key)
-        )
-
-    @CachedProperty
-    def kind(self) -> CompletionChunkKind:
-        return CompletionChunkKind.from_id(
-            conf.lib.clang_getCompletionChunkKind(self.cs, self.key)
-        )
-
-    @CachedProperty
-    def string(self) -> CompletionString | None:
-        res = conf.lib.clang_getCompletionChunkCompletionString(self.cs, 
self.key)
-
-        if not res:
-            return None
-        return CompletionString(res)
-
-    def isKindOptional(self) -> bool:
-        return self.kind == CompletionChunkKind.OPTIONAL
-
-    def isKindTypedText(self) -> bool:
-        return self.kind == CompletionChunkKind.TYPED_TEXT
-
-    def isKindPlaceHolder(self) -> bool:
-        return self.kind == CompletionChunkKind.PLACEHOLDER
-
-    def isKindInformative(self) -> bool:
-        return self.kind == CompletionChunkKind.INFORMATIVE
-
-    def isKindResultType(self) -> bool:
-        return self.kind == CompletionChunkKind.RESULT_TYPE
-
 ### Completion Chunk Kinds ###
 class CompletionChunkKind(BaseEnumeration):
     """
@@ -3149,6 +3073,107 @@ def __str__(self) -> str:
     VERTICAL_SPACE = 20
 
 
+class CompletionChunk:
+    class SpellingCacheAlias:
+        """
+        A temporary utility that acts as an alias to 
CompletionChunk.SPELLING_CACHE.
+        This will be removed without deprecation warning in a future release.
+        Please do not use it directly!
+        """
+
+        deprecation_message = (
+            "'SPELLING_CACHE' has been moved into the scope of 
'CompletionChunk' "
+            "and adapted to use 'CompletionChunkKind's as keys instead of 
their "
+            "enum values. Please adapt all uses of 'SPELLING_CACHE' to use "
+            "'CompletionChunk.SPELLING_CACHE' instead. The old 
'SPELLING_CACHE' "
+            "will be removed in a future release."
+        )
+
+        def __getitem__(self, value: int):
+            warnings.warn(self.deprecation_message, DeprecationWarning)
+            return 
CompletionChunk.SPELLING_CACHE[CompletionChunkKind.from_id(value)]
+        
+        def __contains__(self, value: int):
+            warnings.warn(self.deprecation_message, DeprecationWarning)
+            return CompletionChunkKind.from_id(value) in 
CompletionChunk.SPELLING_CACHE
+
+
+    # Functions calls through the python interface are rather slow. 
Fortunately,
+    # for most symbols, we do not need to perform a function call. Their 
spelling
+    # never changes and is consequently provided by this spelling cache.
+    SPELLING_CACHE = {
+        # 0: CompletionChunkKind.OPTIONAL
+        # 1: CompletionChunkKind.TYPED_TEXT
+        # 2: CompletionChunkKind.TEXT
+        # 3: CompletionChunkKind.PLACEHOLDER
+        # 4: CompletionChunkKind.INFORMATIVE
+        # 5: CompletionChunkKind.CURRENT_PARAMETER
+        CompletionChunkKind.LEFT_PAREN: "(",  # 6
+        CompletionChunkKind.RIGHT_PAREN: ")",  # 7
+        CompletionChunkKind.LEFT_BRACKET: "[",  # 8
+        CompletionChunkKind.RIGHT_BRACKET: "]",  # 9
+        CompletionChunkKind.LEFT_BRACE: "{",  # 10
+        CompletionChunkKind.RIGHT_BRACE: "}",  # 11
+        CompletionChunkKind.LEFT_ANGLE: "<",  # 12
+        CompletionChunkKind.RIGHT_ANGLE: ">",  # 13
+        CompletionChunkKind.COMMA: ", ",  # 14
+        # 15: CompletionChunkKind.RESULT_TYPE
+        CompletionChunkKind.COLON: ":",  # 16
+        CompletionChunkKind.SEMI_COLON: ";",  # 17
+        CompletionChunkKind.EQUAL: "=",  # 18
+        CompletionChunkKind.HORIZONTAL_SPACE: " ",  # 19
+        # 20: CompletionChunkKind.VERTICAL_SPACE
+    }
+
+    def __init__(self, completionString: CObjP, key: int):
+        self.cs = completionString
+        self.key = key
+
+    def __repr__(self) -> str:
+        return "{'" + self.spelling + "', " + str(self.kind) + "}"
+
+    @CachedProperty
+    def spelling(self) -> str:
+        kind = self.kind
+        if kind in CompletionChunk.SPELLING_CACHE:
+            return CompletionChunk.SPELLING_CACHE[kind]
+        return _CXString.from_result(
+            conf.lib.clang_getCompletionChunkText(self.cs, self.key)
+        )
+
+    @CachedProperty
+    def kind(self) -> CompletionChunkKind:
+        return CompletionChunkKind.from_id(
+            conf.lib.clang_getCompletionChunkKind(self.cs, self.key)
+        )
+
+    @CachedProperty
+    def string(self) -> CompletionString | None:
+        res = conf.lib.clang_getCompletionChunkCompletionString(self.cs, 
self.key)
+
+        if not res:
+            return None
+        return CompletionString(res)
+
+    def isKindOptional(self) -> bool:
+        return self.kind == CompletionChunkKind.OPTIONAL
+
+    def isKindTypedText(self) -> bool:
+        return self.kind == CompletionChunkKind.TYPED_TEXT
+
+    def isKindPlaceHolder(self) -> bool:
+        return self.kind == CompletionChunkKind.PLACEHOLDER
+
+    def isKindInformative(self) -> bool:
+        return self.kind == CompletionChunkKind.INFORMATIVE
+
+    def isKindResultType(self) -> bool:
+        return self.kind == CompletionChunkKind.RESULT_TYPE
+
+
+SPELLING_CACHE = CompletionChunk.SpellingCacheAlias()
+
+
 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
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index a734804865c57..081a4773009f7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -72,6 +72,11 @@ Clang Python Bindings Potentially Breaking Changes
   These representations will be changed in a future release to match other 
enums.
 - Remove ``completionChunkKindMap``. In this release, uses of 
``completionChunkKindMap``
   need to be replaced by ``CompletionChunkKind``.
+- Move ``SPELLING_CACHE`` into ``CompletionChunk`` and change it to use
+  ``CompletionChunkKind`` instances as keys, instead of the enum values.
+  An alias is kept in the form of a ``SPELLING_CACHE`` variable, but it only 
supports
+  ``__getitem__`` and ``__contains__``. It will be removed in a future release.
+  Please migrate to using ``CompletionChunk.SPELLING_CACHE`` instead.
 
 What's New in Clang |release|?
 ==============================

``````````

</details>


https://github.com/llvm/llvm-project/pull/177586
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to