// Copyright 2018 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package remoteexec

import (
	"errors"
)

// TODO: share exec/clangcl.go ?

// clangclCwdAgnostic checks if args will generate cwd-agnostic outputs
// (files/stdout/stderr).
//
// TODO: implement it.
func clangclCwdAgnostic(args, envs []string) error {
	return errors.New("no cwd agnostic check for clang-cl")
}

// clangclOutputs returns output files from clang-cl command line.
// https://clang.llvm.org/docs/UsersManual.html#id8
//  /Fo<obj> and /Fd<pdb> is used in Cross-compiling Chrome/win
//  but clang-cl currently doesn't emit pdb.
// https://chromium.googlesource.com/chromium/src/+/lkcr/docs/win_cross.md
// TODO: support output directory (ends in / or \)?
func clangclOutputs(args []string) []string {
	var outputs []string
	outputArg := false

	for _, arg := range args {
		switch {
		case outputArg:
			outputs = append(outputs, arg)
			outputArg = false

		case arg == "/o" || arg == "-o": // /o <file or directory>
			outputArg = true

		case len(arg) > 2 &&
			(arg[0] == '-' || arg[0] == '/') &&
			arg[1] == 'o':
			outputs = append(outputs, arg[2:])

		case len(arg) > 3 &&
			(arg[0] == '-' || arg[0] == '/') &&
			arg[1] == 'F' &&
			(arg[2] == 'o' || // /Fo<obj>
				arg[2] == 'i' || // /Fi<file>  preproc output
				arg[2] == 'a' || // /Fa<file>  asm output
				arg[2] == 'e' || // /Fe<exec>
				arg[2] == 'p'): // /Fp<pch>
			// TODO: /Fd<pdb> if clang-cl emits pdb.
			outputs = append(outputs, arg[3:])
		}
	}
	return outputs
}
