docs: def link_with_parents(self, parent, c_selectors, c_rules):
          """
          Link with a parent for the current child rule.
          If parents found, returns a list of parent rules to the child
          """
          parent_found = None
          for p_selectors, p_rules in self.parts.items():
              _p_selectors, _, _ = p_selectors.partition(' extends ')
              _p_selectors = _p_selectors.split(',')
  
              new_selectors = set()
              found = False
  
              # Finds all the parent selectors and parent selectors with another
              # bind selectors behind. For example, if `.specialClass extends
              # .baseClass`,
              # and there is a `.baseClass` selector, the extension should create
              # `.specialClass` for that rule, but if there's also a `.baseClass
              # a`
              # it also should create `.specialClass a`
              for p_selector in _p_selectors:
                  if parent in p_selector:
                      # get the new child selector to add (same as the parent
                      # selector but with the child name)
                      # since selectors can be together, separated with # or .
                      # (i.e. something.parent) check that too:
                      for c_selector in c_selectors.split(','):
                          # Get whatever is different between the two selectors:
                          _c_selector, _parent = c_selector, parent
                          lcp = self.longest_common_prefix(_c_selector, _parent)
                          if lcp:
                              _c_selector = _c_selector[lcp:]
                              _parent = _parent[lcp:]
                          lcs = self.longest_common_suffix(_c_selector, _parent)
                          if lcs:
                              _c_selector = _c_selector[:-lcs]
                              _parent = _parent[:-lcs]
                          if _c_selector and _parent:
                              # Get the new selectors:
                              prev_symbol = '(?<![#.:])' if _parent[
                                  0] in ('#', '.', ':') else r'(?<![-\w#.:])'
                              post_symbol = r'(?![-\w])'
                              new_parent = re.sub(prev_symbol + _parent +
                                                  post_symbol, _c_selector, p_selector)
                              if p_selector != new_parent:
                                  new_selectors.add(new_parent)
                                  found = True
  
              if found:
                  # add parent:
                  parent_found = parent_found or []
                  parent_found.extend(p_rules)
  
              if new_selectors:
                  new_selectors = self.normalize_selectors(
                      p_selectors, new_selectors)
                  # rename node:
                  if new_selectors != p_selectors:
                      del self.parts[p_selectors]
                      self.parts.setdefault(new_selectors, [])
                      self.parts[new_selectors].extend(p_rules)
  
                  deps = set()
                  # save child dependencies:
                  for c_rule in c_rules or []:
                      c_rule[SELECTORS] = c_selectors  # re-set the SELECTORS for the rules
                      deps.add(c_rule[POSITION])
  
                  for p_rule in p_rules:
                      p_rule[SELECTORS] = new_selectors  # re-set the SELECTORS for the rules
                      p_rule[DEPS].update(
                          deps)  # position is the "index" of the object
  
          return parent_found