// Copyright 2020 The Go 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 fillreturns

import (
	"errors"
	"go/ast"
	ast2 "go/ast"
	"io"
	"net/http"
	. "net/http"
	"net/url"
	"strconv"
)

type T struct{}
type T1 = T
type I interface{}
type I1 = I
type z func(string, http.Handler) error

func x() error {
	return errors.New("foo")
}

func b() (string, int, error) {
	return "", errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)"
}

func c() (string, int, error) {
	return 7, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)"
}

func d() (string, int, error) {
	return "", 7 // want "wrong number of return values \\(want 3, got 2\\)"
}

func e() (T, error, *bool) {
	return (z(http.ListenAndServe))("", nil) // want "wrong number of return values \\(want 3, got 1\\)"
}

func preserveLeft() (int, int, error) {
	return 1, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)"
}

func matchValues() (int, error, string) {
	return errors.New("foo"), 3 // want "wrong number of return values \\(want 3, got 2\\)"
}

func preventDataOverwrite() (int, string) {
	return errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)"
}

func closure() (string, error) {
	_ = func() (int, error) {
		return // want "wrong number of return values \\(want 2, got 0\\)"
	}
	return // want "wrong number of return values \\(want 2, got 0\\)"
}

func basic() (uint8, uint16, uint32, uint64, int8, int16, int32, int64, float32, float64, complex64, complex128, byte, rune, uint, int, uintptr, string, bool, error) {
	return // want "wrong number of return values \\(want 20, got 0\\)"
}

func complex() (*int, []int, [2]int, map[int]int) {
	return // want "wrong number of return values \\(want 4, got 0\\)"
}

func structsAndInterfaces() (T, url.URL, T1, I, I1, io.Reader, Client, ast2.Stmt) {
	return // want "wrong number of return values \\(want 8, got 0\\)"
}

func m() (int, error) {
	if 1 == 2 {
		return // want "wrong number of return values \\(want 2, got 0\\)"
	} else if 1 == 3 {
		return errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)"
	} else {
		return 1 // want "wrong number of return values \\(want 2, got 1\\)"
	}
	return // want "wrong number of return values \\(want 2, got 0\\)"
}

func convertibleTypes() (ast2.Expr, int) {
	return &ast2.ArrayType{} // want "wrong number of return values \\(want 2, got 1\\)"
}

func assignableTypes() (map[string]int, int) {
	type X map[string]int
	var x X
	return x // want "wrong number of return values \\(want 2, got 1\\)"
}

func interfaceAndError() (I, int) {
	return errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)"
}

func funcOneReturn() (string, error) {
	return strconv.Itoa(1) // want "wrong number of return values \\(want 2, got 1\\)"
}

func funcMultipleReturn() (int, error, string) {
	return strconv.Atoi("1")
}

func localFuncMultipleReturn() (string, int, error, string) {
	return b()
}

func multipleUnused() (int, string, string, string) {
	return 3, 4, 5 // want "wrong number of return values \\(want 4, got 3\\)"
}

func gotTooMany() int {
	if true {
		return 0, "" // want "wrong number of return values \\(want 1, got 2\\)"
	} else {
		return 1, 0, nil // want "wrong number of return values \\(want 1, got 3\\)"
	}
	return 0, 5, false // want "wrong number of return values \\(want 1, got 3\\)"
}

func fillVars() (int, string, ast.Node, bool, error) {
	eint := 0
	s := "a"
	var t bool
	if true {
		err := errors.New("fail")
		return // want "wrong number of return values \\(want 5, got 0\\)"
	}
	n := ast.NewIdent("ident")
	int := 3
	var b bool
	return "" // want "wrong number of return values \\(want 5, got 1\\)"
}
