#!/usr/bin/env python
# split-cmdline - Split swift compiler command lines ------------*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
# ----------------------------------------------------------------------------
#
# Split swift compiler command lines into multiple lines.
#
# Reads the command line from stdin an outputs the split line to stdout.
# Example:
#
# $ swiftc -c hello.swift -### | split-cmdline
# /path-to-swift/bin/swift \
#   -frontend \
#   -c \
#   -primary-file hello.swift \
#   -target x86_64-apple-macosx10.9 \
#   -enable-objc-interop \
#   -color-diagnostics \
#   -module-name hello \
#   -o hello.o
# 
# Example usage in vim:
# *) make sure that split-cmdline is in the $PATH
# *) copy-paste the swift command line the text buffer
# *) select the command line
# *) go to the command prompt (= press ':')
# :'<,'>!split-cmdline
#
# ----------------------------------------------------------------------------

from __future__ import print_function

import re
import sys
import os
import shlex

def main():
  for line in sys.stdin:
    first = True
    is_arg_param = False
    # Handle escaped spaces
    args = shlex.split(line)
    for arg in args:
      if arg == '':
        continue
      if not first:
        # Print option arguments in the same line
        print(' ' if is_arg_param else ' \\\n  ', end='')
      first = False

      # Expand @ option files
      m = re.match('^@(\S+\.txt)$', arg)
      if m:
        cmd_file = m.group(1)
        if os.path.isfile(cmd_file):
          with open(cmd_file) as f:
            for ln in f.readlines():
              for name in ln.rstrip().split(';'):
                if name != '':
                  print(name + ' \\')
        first = True
        continue

      if ' ' in arg:
        print('"' + arg + '"', end='')
      else:
        print(arg, end='')

      # A hard-coded list of options which expect a parameter
      is_arg_param = (arg in [
        '-o', '-target', '-isysroot', '-emit-sil', '-emit-ir', '-module-name',
        '-framework', '-Xlinker', '-arch', '-D', '-sdk', '-module-cache-path',
        '-F', '-output-file-map', '-emit-module-path', '-Xcc', '-I', '-iquote',
        '-emit-objc-header-path', '-Xfrontend', '-filelist', '-num-threads',
        '-Xclang', '-x', '-L', '-rpath', '-macosx_version_min',
        '-syslibroot', '-add_ast_path', '-import-objc-header',
        '-serialize-diagnostics-path', '-emit-dependencies-path',
        '-emit-reference-dependencies-path', '-primary-file', '-resource-dir',
        '--sdk', '--toolchain', '-emit-module-doc-path', '-module-link-name',
        '-group-info-path', '-fileno', '-swift-version', '-Xllvm'])

    # Print 2 new lines after each command line
    print('\n')

if __name__ == '__main__':
    main()
