class_name EnumFunctionTypecheckOuterClass

enum MyEnum { V0, V1, V2 }

class InnerClass:
	enum MyEnum { V0, V2, V1 }

	func inner_inner_no_class(e: MyEnum) -> MyEnum:
		print(e)
		return e

	func inner_inner_class(e: InnerClass.MyEnum) -> InnerClass.MyEnum:
		print(e)
		return e

	func inner_inner_class_class(e: EnumFunctionTypecheckOuterClass.InnerClass.MyEnum) -> EnumFunctionTypecheckOuterClass.InnerClass.MyEnum:
		print(e)
		return e

	func inner_outer(e: EnumFunctionTypecheckOuterClass.MyEnum) -> EnumFunctionTypecheckOuterClass.MyEnum:
		print(e)
		return e

	func test():
		var _d
		print("Inner")

		var o := EnumFunctionTypecheckOuterClass.new()

		_d = o.outer_outer_no_class(EnumFunctionTypecheckOuterClass.MyEnum.V1)
		print()
		_d = o.outer_outer_class(EnumFunctionTypecheckOuterClass.MyEnum.V1)
		print()
		_d = o.outer_inner_class(MyEnum.V1)
		_d = o.outer_inner_class(InnerClass.MyEnum.V1)
		_d = o.outer_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
		print()
		_d = o.outer_inner_class_class(MyEnum.V1)
		_d = o.outer_inner_class_class(InnerClass.MyEnum.V1)
		_d = o.outer_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
		print()
		print()


		_d = inner_inner_no_class(MyEnum.V1)
		_d = inner_inner_no_class(InnerClass.MyEnum.V1)
		_d = inner_inner_no_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
		print()
		_d = inner_inner_class(MyEnum.V1)
		_d = inner_inner_class(InnerClass.MyEnum.V1)
		_d = inner_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
		print()
		_d = inner_inner_class_class(MyEnum.V1)
		_d = inner_inner_class_class(InnerClass.MyEnum.V1)
		_d = inner_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
		print()
		_d = inner_outer(EnumFunctionTypecheckOuterClass.MyEnum.V1)
		print()
		print()


func outer_outer_no_class(e: MyEnum) -> MyEnum:
	print(e)
	return e

func outer_outer_class(e: EnumFunctionTypecheckOuterClass.MyEnum) -> EnumFunctionTypecheckOuterClass.MyEnum:
	print(e)
	return e

func outer_inner_class(e: InnerClass.MyEnum) -> InnerClass.MyEnum:
	print(e)
	return e

func outer_inner_class_class(e: EnumFunctionTypecheckOuterClass.InnerClass.MyEnum) -> EnumFunctionTypecheckOuterClass.InnerClass.MyEnum:
	print(e)
	return e

func test():
	var _d
	print("Outer")

	_d = outer_outer_no_class(MyEnum.V1)
	_d = outer_outer_no_class(EnumFunctionTypecheckOuterClass.MyEnum.V1)
	print()
	_d = outer_outer_class(MyEnum.V1)
	_d = outer_outer_class(EnumFunctionTypecheckOuterClass.MyEnum.V1)
	print()
	_d = outer_inner_class(InnerClass.MyEnum.V1)
	_d = outer_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
	print()
	_d = outer_inner_class_class(InnerClass.MyEnum.V1)
	_d = outer_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
	print()
	print()

	var i := EnumFunctionTypecheckOuterClass.InnerClass.new()

	_d = i.inner_inner_no_class(InnerClass.MyEnum.V1)
	_d = i.inner_inner_no_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
	print()
	_d = i.inner_inner_class(InnerClass.MyEnum.V1)
	_d = i.inner_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
	print()
	_d = i.inner_inner_class_class(InnerClass.MyEnum.V1)
	_d = i.inner_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1)
	print()
	_d = i.inner_outer(MyEnum.V1)
	_d = i.inner_outer(EnumFunctionTypecheckOuterClass.MyEnum.V1)
	print()
	print()

	i.test()
