class_docstr: An extension of CompletionFinder which dynamically completes class-trait based options
  
  This finder adds a few functionalities:
  
  1. When completing options, it will add ``--Class.`` to the list of completions, for each
  class in `Application.classes` that could complete the current option.
  2. If it detects that we are currently trying to complete an option related to ``--Class.``,
  it will add the corresponding config traits of Class to the `ArgumentParser` instance,
  so that the traits' completers can be used.
  3. If there are any subcommands, they are added as completions for the first word
  
  Note that we are avoiding adding all config traits of all classes to the `ArgumentParser`,
  which would be easier but would add more runtime overhead and would also make completions
  appear more spammy.
  
  These changes do require using the internals of `argcomplete.CompletionFinder`.
class_docstr_tok: ["An","extension","of","CompletionFinder","which","dynamically","completes","class-trait","based","options","This","finder","adds","a","few","functionalities",":","1",".","When","completing","options",",","it","will","add","``","--","Class.","``","to","the","list","of","completions",",","for","each","class","in","`","Application.classes","`","that","could","complete","the","current","option",".","2",".","If","it","detects","that","we","are","currently","trying","to","complete","an","option","related","to","``","--","Class.","``",",","it","will","add","the","corresponding","config","traits","of","Class","to","the","`","ArgumentParser","`","instance",",","so","that","the","traits","'","completers","can","be","used",".","3",".","If","there","are","any","subcommands",",","they","are","added","as","completions","for","the","first","word","Note","that","we","are","avoiding","adding","all","config","traits","of","all","classes","to","the","`","ArgumentParser","`",",","which","would","be","easier","but","would","add","more","runtime","overhead","and","would","also","make","completions","appear","more","spammy",".","These","changes","do","require","using","the","internals","of","`","argcomplete.CompletionFinder","`","."]
docstr: Overridden to dynamically append --Class.trait arguments if appropriate
  
  Warning:
      This does not (currently) support completions of the form
      --Class1.Class2.<...>.trait, although this is valid for traitlets.
      Part of the reason is that we don't currently have a way to identify
      which classes may be used with Class1 as a parent.
  
  Warning:
      This is an internal method in CompletionFinder and so the API might
      be subject to drift.
docstr_tok: ["Overridden","to","dynamically","append","--","Class.trait","arguments","if","appropriate","Warning",":","This","does","not","(","currently",")","support","completions","of","the","form","--","Class1.Class2.","<","...",">",".trait",",","although","this","is","valid","for","traitlets",".","Part","of","the","reason","is","that","we","do","n't","currently","have","a","way","to","identify","which","classes","may","be","used","with","Class1","as","a","parent",".","Warning",":","This","is","an","internal","method","in","CompletionFinder","and","so","the","API","might","be","subject","to","drift","."]
code: def _get_completions(
      self, comp_words: t.List[str], cword_prefix: str, *args: t.Any
  ) -> t.List[str]:
      """Overridden to dynamically append --Class.trait arguments if appropriate
  
      Warning:
          This does not (currently) support completions of the form
          --Class1.Class2.<...>.trait, although this is valid for traitlets.
          Part of the reason is that we don't currently have a way to identify
          which classes may be used with Class1 as a parent.
  
      Warning:
          This is an internal method in CompletionFinder and so the API might
          be subject to drift.
      """
      # Try to identify if we are completing something related to --Class. for
      # a known Class, if we are then add the Class config traits to our ArgumentParser.
      prefix_chars = self._parser.prefix_chars
      is_option = (
          len(cword_prefix) > 0 and cword_prefix[0] in prefix_chars
      )
      if is_option:
          # If we are currently completing an option, check if it could
          # match with any of the --Class. completions. If there's exactly
          # one matched class, then expand out the --Class.trait options.
          matched_completions = self.match_class_completions(
              cword_prefix
          )
          if len(matched_completions) == 1:
              matched_cls = matched_completions[0][0]
              self.inject_class_to_parser(matched_cls)
      elif (
          len(comp_words) > 0
          and "." in comp_words[-1]
          and not is_option
      ):
          # If not an option, perform a hacky check to see if we are completing
          # an argument for an already present --Class.trait option. Search backwards
          # for last option (based on last word starting with prefix_chars), and see
          # if it is of the form --Class.trait. Note that if multiplicity="+", these
          # arguments might conflict with positional arguments.
          for prev_word in comp_words[::-1]:
              if len(prev_word) > 0 and prev_word[0] in prefix_chars:
                  matched_completions = self.match_class_completions(
                      prev_word
                  )
                  if matched_completions:
                      matched_cls = matched_completions[0][0]
                      self.inject_class_to_parser(matched_cls)
                  break
  
      completions: t.List[str]
      completions = super()._get_completions(
          comp_words, cword_prefix, *args
      )  # type:ignore[no-untyped-call]
  
      # For subcommand-handling: it is difficult to get this to work
      # using argparse subparsers, because the ArgumentParser accepts
      # arbitrary extra_args, which ends up masking subparsers.
      # Instead, check if comp_words only consists of the script,
      # if so check if any subcommands start with cword_prefix.
      if self.subcommands and len(comp_words) == 1:
          argcomplete.debug(
              "Adding subcommands for", cword_prefix
          )  # type:ignore[attr-defined,no-untyped-call]
          completions.extend(
              subc
              for subc in self.subcommands
              if subc.startswith(cword_prefix)
          )
  
      return completions
  
file_path: catboost/contrib/python/traitlets/py3/traitlets/config/argcomplete_config.py
imports: import argparse
  import os
  import typing
label_desc: Use image node_id 3 for calling the ExtendedCompletionFinder obj's underlying member method code with example usage: obj._get_completions(comp_words, cword_prefix) and returns: completions