diff --git a/mypy/stubgen.py b/mypy/stubgen.py
--- a/mypy/stubgen.py
+++ b/mypy/stubgen.py
@@ -134,6 +134,7 @@
     TypeList,
     TypeStrVisitor,
     UnboundType,
+    UnionType,
     get_proper_type,
 )
 from mypy.visitor import NodeVisitor
@@ -326,6 +327,9 @@ def visit_none_type(self, t: NoneType) -> str:
     def visit_type_list(self, t: TypeList) -> str:
         return f"[{self.list_str(t.items)}]"
 
+    def visit_union_type(self, t: UnionType) -> str:
+        return " | ".join([item.accept(self) for item in t.items])
+
     def args_str(self, args: Iterable[Type]) -> str:
         """Convert an array of arguments to strings and join the results with commas.
 

diff --git a/test-data/unit/stubgen.test b/test-data/unit/stubgen.test
--- a/test-data/unit/stubgen.test
+++ b/test-data/unit/stubgen.test
@@ -2783,3 +2783,13 @@ T = TypeVar("T", bound=str | None)
 from typing import TypeVar
 
 T = TypeVar('T', bound=str | None)
+
+
+[case testPEP604UnionType]
+a: str | int
+
+def f(x: str | None) -> None: ...
+[out]
+a: str | int
+
+def f(x: str | None) -> None: ...

stubgen: import `Union` if generated stub code includes
**Feature**

I would like to insert `from typing import Union` when generated stub code by stubgen includes `Union`.

**Pitch**

ref: #12920

Now:

```shellsession
# Python 3.10.4, mypy 0.960
$ cat test.py
import random


def a() -> int | str:
    if random.random() > 0.5:
        return 1
    else:
        return "hey!"

def b() -> str | None:
    if random.random() > 0.5:
        return "hey!"

$ stubgen test.py
Processed 1 modules
Generated out/test.pyi

$ cat out/test.pyi
def a() -> Union[int, str]: ...
def b() -> Union[str, None]: ...
```

Expect:

```python
from typing import Union

def a() -> Union[int, str]: ...
def b() -> Union[str, None]: ...
```
Add import Union to stub file (#12929)
Fixes #12929

Stubs generated from files with new format of Union typing will include importing Union from typing.

## Test Plan

I've added 3 new tests while making sure they pass locally.


Thanks! I expect this is an easy fix (just need to ad some function call to make stubgen emit the import), so if you're willing to dive into the code, feel free to make a PR.
OK, I'll try it...
Is there any update on this fix?
I've fixed the formatting and failing test :-)
mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testEmptyFile mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPreserveVarAnnotation mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testMultipleVariable mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSpecialInternalVar mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPreserveVarAnnotationWithoutQuotes mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSingleFunction mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testClassVariable mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testBaseClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVarArgs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTwoFunctions mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testInitTypeAnnotationPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDecoratedFunction mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testKwVarArgs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgInt mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSelfAssignment mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testMultipleAssignment mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVarArgsWithKwVarArgs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgNone mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSelfAndClassBodyAssignment mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testMultipleAssignmentAnnotated mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgBool mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testEmptyClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testMultipleAssignment2 mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVariable mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgStr mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSkipPrivateFunction mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testKeywordOnlyArg mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotatedVariable mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgBytes mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludePrivateFunction mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotatedVariableGeneric mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgFloat mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testProperty mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSkipPrivateMethod mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotatedVariableOldSyntax mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDefaultArgOther mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testStaticMethod mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludePrivateMethod mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotatedVariableNone mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testClassMethod mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPreserveFunctionAnnotation mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSkipPrivateVar mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotatedVariableNoneOldSyntax mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIfMainCheck mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludePrivateVar mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPreserveFunctionAnnotationWithArgs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNoSpacesBetweenEmptyClasses mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImportStar mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSkipPrivateStaticAndClassMethod mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExceptionBaseClasses mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtupleAltSyntaxFieldsTuples mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludePrivateStaticAndClassMethod mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOmitSomeSpecialMethods mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDynamicNamedTuple mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtuple mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportModule_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testArbitraryBaseClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testEmptyNamedtuple mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testArbitraryBaseClass2 mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtupleAltSyntax mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testUnqualifiedArbitraryBaseClassWithNoDef mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtupleAltSyntaxUsingComma mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOmitDefsNotInAll_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportModule2_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testUnqualifiedArbitraryBaseClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtupleAltSyntaxUsingMultipleCommas mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testUnqualifiedArbitraryBaseClassWithImportAs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtupleWithUnderscore mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testGenericClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedtupleBaseClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportModuleAs_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testObjectBaseClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testEmptyLines mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testInferOptionalOnlyFunc mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNestedClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportModuleInPackage_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportViaRelativeImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotationImportsFrom mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportViaRelativePackageImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotationImports mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportPackageOfAModule_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNoExportViaRelativeImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotationImports2 mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testRelativeImportAll mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testRelativeImportAndBase mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAnnotationFwRefs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDuplicateDef mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCommentForUndefinedName_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAsyncAwait_fast_parser mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTypeVarPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTypeAliasPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTypeVarArgsPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIgnoreSlots mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDeepTypeAliasPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTypeVarNamedArgsPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSkipPrivateProperty mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDeepGenericTypeAliasPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludePrivateProperty mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testComplexAlias mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testEllipsisAliasPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCallable mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionNoReturnInfersReturnNone mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCallableAliasPreserved mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAwaitDef mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionReturnNoReturnType mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAliasPullsImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportAsyncio mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionEllipsisInfersReturnNone mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAliasExceptions mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportAsyncioCoroutines mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionYields mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineFromAsyncioImportCoroutine mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportAsyncioCoroutinesSub mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionYieldsNone mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineFromAsyncioCoroutinesImportCoroutine mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportTypes mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testGeneratorAlreadyDefined mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineFromTypesImportCoroutine mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportAsyncioAsA mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineFromAsyncioImportCoroutineAsC mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportAsyncioCoroutinesAsC mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineFromAsyncioCoroutinesImportCoroutineAsC mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportAsyncioCoroutinesSubAsA mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineFromTypesImportCoroutineAsC mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCoroutineImportTypesAsT mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOmitDefsNotInAll_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVarDefsNotInAll_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testModuleAlias_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludeClassNotInAll_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNestedClass_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPrivateAliasesIncluded_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAllAndClass_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testSkipMultiplePrivateDefs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludeMultiplePrivateDefs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testIncludeFromImportIfInAll_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExplicitAnyArg mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExplicitReturnedAny mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPlacementOfDecorators mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testMisplacedTypeComment mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testBadAliasNested_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFinalWrapped_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testConditionalImportAll_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionAlias_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAbstractMethodMemberExpr mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAbstractMethodMemberExpr2 mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCrossModuleClass_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFinalInvalid_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCannotCalculateMRO_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testABCMeta_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testInvalidNumberOfArgsInAnnotation mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testFunctionPartiallyAnnotated mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testCrossModuleFunction_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNoFunctionNested_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAbstractMethodNameExpr mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVerboseFlag mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImportedModuleExits_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImportedModuleHardExits_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImportedModuleHardExits2_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImportedModuleHardExits3_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImportedModuleHardExits4_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportInternalImportsByDefault mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNoExportOfInternalImportsIfAll_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportInternalImportsByDefaultFromUnderscorePackage mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testDisableExportOfInternalImports mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportInternalImportsByDefaultUsingRelativeImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportInternalImportsByDefaultSkipPrivate mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportInternalImportsByDefaultIncludePrivate mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testHideDunderModuleAttributes mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testHideDunderModuleAttributesWithAll_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testUnreachableCode_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAbstractProperty2_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPrivateAliasesExcluded_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVendoredSix mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testVendoredPackage mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTestFiles mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTestFiles_import mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_directImportsMixed mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImport_overwrites_directWithAlias_from mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImport_overwrites_directWithAlias_fromWithAlias mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_overwrites_direct_from mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_overwrites_direct_fromWithAlias mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_overwrites_from_directWithAlias mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_overwrites_fromWithAlias_direct mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_direct mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOverload_fromTypingImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOverload_fromTypingExtensionsImport mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOverload_importTyping mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testOverload_importTypingAs mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAttrsClass_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNamedTupleInClass mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNonDefaultKeywordOnlyArgAfterAsterisk mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testNestedGenerator mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testKnownMagicMethodsReturnTypes mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testTypeVarPEP604Bound mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAbstractProperty1_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testImports_directImportsWithAlias mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testAbstractProperty3_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testClassWithNameIncompleteOrOptional mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testExportedNameImported mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testProtocol_semanal mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testProtocolAbstractMethod_semanal
mypy/test/teststubgen.py::StubgenPythonSuite::stubgen.test::testPEP604UnionType