code: def splitCallsOntoSeparateLines(icNames, icMethod, source):
      
      callIndices = [
          node.func.col_offset if hasattr(node, 'func') else node.col_offset
          for node in ast.walk(ast.parse(source))
          if isAstNodeIceCreamCall(node, icNames, icMethod)]
      lines = splitStringAtIndices(source, callIndices)
      sourceWithNewlinesBeforeInvocations = joinContinuedLines(lines)
  
      return sourceWithNewlinesBeforeInvocations
docs: To determine the bytecode offsets of ic() calls with dis.findlinestarts(),
      every ic() invocation needs to start its own line. That is, this
  
        foo(ic(1), ic(2))
  
      needs to be turned into
  
        foo(
        ic(1),
        ic(2))
  
      Then the bytecode offsets of ic(1) and ic(2) can be determined with
      dis.findlinestarts().
  
      This split is necessary for ic() calls inside other expressions,
      like foo(ic(1)), to be extracted correctly.