diff --git a/mypy/plugins/common.py b/mypy/plugins/common.py
--- a/mypy/plugins/common.py
+++ b/mypy/plugins/common.py
@@ -9,6 +9,7 @@
     Block,
     CallExpr,
     ClassDef,
+    Decorator,
     Expression,
     FuncDef,
     JsonDict,
@@ -26,6 +27,7 @@
     CallableType,
     Overloaded,
     Type,
+    TypeType,
     TypeVarType,
     deserialize_type,
     get_proper_type,
@@ -102,6 +104,8 @@ def add_method(
     return_type: Type,
     self_type: Type | None = None,
     tvar_def: TypeVarType | None = None,
+    is_classmethod: bool = False,
+    is_staticmethod: bool = False,
 ) -> None:
     """
     Adds a new method to a class.
@@ -115,6 +119,8 @@ def add_method(
         return_type=return_type,
         self_type=self_type,
         tvar_def=tvar_def,
+        is_classmethod=is_classmethod,
+        is_staticmethod=is_staticmethod,
     )
 
 
@@ -126,8 +132,15 @@ def add_method_to_class(
     return_type: Type,
     self_type: Type | None = None,
     tvar_def: TypeVarType | None = None,
+    is_classmethod: bool = False,
+    is_staticmethod: bool = False,
 ) -> None:
     """Adds a new method to a class definition."""
+
+    assert not (
+        is_classmethod is True and is_staticmethod is True
+    ), "Can't add a new method that's both staticmethod and classmethod."
+
     info = cls.info
 
     # First remove any previously generated methods with the same name
@@ -137,13 +150,21 @@ def add_method_to_class(
         if sym.plugin_generated and isinstance(sym.node, FuncDef):
             cls.defs.body.remove(sym.node)
 
-    self_type = self_type or fill_typevars(info)
     if isinstance(api, SemanticAnalyzerPluginInterface):
         function_type = api.named_type("builtins.function")
     else:
         function_type = api.named_generic_type("builtins.function", [])
 
-    args = [Argument(Var("self"), self_type, None, ARG_POS)] + args
+    if is_classmethod:
+        self_type = self_type or TypeType(fill_typevars(info))
+        first = [Argument(Var("_cls"), self_type, None, ARG_POS, True)]
+    elif is_staticmethod:
+        first = []
+    else:
+        self_type = self_type or fill_typevars(info)
+        first = [Argument(Var("self"), self_type, None, ARG_POS)]
+    args = first + args
+
     arg_types, arg_names, arg_kinds = [], [], []
     for arg in args:
         assert arg.type_annotation, "All arguments must be fully typed."
@@ -158,6 +179,8 @@ def add_method_to_class(
     func = FuncDef(name, args, Block([PassStmt()]))
     func.info = info
     func.type = set_callable_name(signature, func)
+    func.is_class = is_classmethod
+    func.is_static = is_staticmethod
     func._fullname = info.fullname + "." + name
     func.line = info.line
 
@@ -168,7 +191,21 @@ def add_method_to_class(
         r_name = get_unique_redefinition_name(name, info.names)
         info.names[r_name] = info.names[name]
 
-    info.names[name] = SymbolTableNode(MDEF, func, plugin_generated=True)
+    # Add decorator for is_staticmethod. It's unnecessary for is_classmethod.
+    if is_staticmethod:
+        func.is_decorated = True
+        v = Var(name, func.type)
+        v.info = info
+        v._fullname = func._fullname
+        v.is_staticmethod = True
+        dec = Decorator(func, [], v)
+        dec.line = info.line
+        sym = SymbolTableNode(MDEF, dec)
+    else:
+        sym = SymbolTableNode(MDEF, func)
+    sym.plugin_generated = True
+    info.names[name] = sym
+
     info.defn.defs.body.append(func)
 
 
diff --git a/test-data/unit/plugins/add_classmethod.py b/test-data/unit/plugins/add_classmethod.py
new file mode 100644
--- /dev/null
+++ b/test-data/unit/plugins/add_classmethod.py
@@ -0,0 +1,28 @@
+from typing import Callable, Optional
+
+from mypy.nodes import ARG_POS, Argument, Var
+from mypy.plugin import ClassDefContext, Plugin
+from mypy.plugins.common import add_method
+from mypy.types import NoneType
+
+
+class ClassMethodPlugin(Plugin):
+    def get_base_class_hook(self, fullname: str) -> Optional[Callable[[ClassDefContext], None]]:
+        if "BaseAddMethod" in fullname:
+            return add_extra_methods_hook
+        return None
+
+
+def add_extra_methods_hook(ctx: ClassDefContext) -> None:
+    add_method(ctx, "foo_classmethod", [], NoneType(), is_classmethod=True)
+    add_method(
+        ctx,
+        "foo_staticmethod",
+        [Argument(Var(""), ctx.api.named_type("builtins.int"), None, ARG_POS)],
+        ctx.api.named_type("builtins.str"),
+        is_staticmethod=True,
+    )
+
+
+def plugin(version):
+    return ClassMethodPlugin

diff --git a/test-data/unit/check-custom-plugin.test b/test-data/unit/check-custom-plugin.test
--- a/test-data/unit/check-custom-plugin.test
+++ b/test-data/unit/check-custom-plugin.test
@@ -991,3 +991,17 @@ class Cls:
 [file mypy.ini]
 \[mypy]
 plugins=<ROOT>/test-data/unit/plugins/class_attr_hook.py
+
+[case testAddClassMethodPlugin]
+# flags: --config-file tmp/mypy.ini
+class BaseAddMethod: pass
+
+class MyClass(BaseAddMethod):
+    pass
+
+my_class = MyClass()
+reveal_type(MyClass.foo_classmethod)  # N: Revealed type is "def ()"
+reveal_type(MyClass.foo_staticmethod)  # N: Revealed type is "def (builtins.int) -> builtins.str"
+[file mypy.ini]
+\[mypy]
+plugins=<ROOT>/test-data/unit/plugins/add_classmethod.py
diff --git a/test-data/unit/check-incremental.test b/test-data/unit/check-incremental.test
--- a/test-data/unit/check-incremental.test
+++ b/test-data/unit/check-incremental.test
@@ -5911,6 +5911,38 @@ tmp/c.py:4: note: Revealed type is "TypedDict('a.N', {'r': Union[TypedDict('b.M'
 tmp/c.py:5: error: Incompatible types in assignment (expression has type "Optional[N]", variable has type "int")
 tmp/c.py:7: note: Revealed type is "TypedDict('a.N', {'r': Union[TypedDict('b.M', {'r': Union[..., None], 'x': builtins.int}), None], 'x': builtins.int})"
 
+[case testIncrementalAddClassMethodPlugin]
+# flags: --config-file tmp/mypy.ini
+import b
+
+[file mypy.ini]
+\[mypy]
+plugins=<ROOT>/test-data/unit/plugins/add_classmethod.py
+
+[file a.py]
+class BaseAddMethod: pass
+
+class MyClass(BaseAddMethod):
+    pass
+
+[file b.py]
+import a
+
+[file b.py.2]
+import a
+
+my_class = a.MyClass()
+reveal_type(a.MyClass.foo_classmethod)
+reveal_type(a.MyClass.foo_staticmethod)
+reveal_type(my_class.foo_classmethod)
+reveal_type(my_class.foo_staticmethod)
+
+[rechecked b]
+[out2]
+tmp/b.py:4: note: Revealed type is "def ()"
+tmp/b.py:5: note: Revealed type is "def (builtins.int) -> builtins.str"
+tmp/b.py:6: note: Revealed type is "def ()"
+tmp/b.py:7: note: Revealed type is "def (builtins.int) -> builtins.str"
 [case testGenericNamedTupleSerialization]
 import b
 [file a.py]

Plugin add_classmethod
**Feature request:**
A function like `mypy.plugins.common.add_method`, but with support for classmethods.

-----

More context:

I am working on a plugin, and would like to be able to detect and raise errors when an inherited (factory) classmethod is called, but *only* if certain conditions hold for the type (which I am computing in the `base_model_hook` and storing on `ctx.cls.info.metadata`).

The method is inherited from a parent class, and when the method hook is called it only contains references to the parent class, not the calling class (on which I've stored the metadata). (The parent does not have the appropriate type-specific metadata I want to access.)

In order to get around this, I had the idea to directly add a classmethod to the subclass so that it could trigger the method_hook itself. (Note: I'm not sure whether this would work since I'd be generating the method in the `base_class_hook`; I'm not sure whether it would get picked up by the `get_method_hook` or not.)

**(Any insight into how I can create a conditionally-erroring classmethod, where the error occurs based on data computed in the `base_model_hook`, would be appreciated.)**

Whether or not the above approach would work for this purpose, I didn't see an easy way to add a classmethod (similarly to how `add_method` works), and I think this might be a nice capability to suppport.

(This came up in a discussion with @ilevkivskyi on gitter, and he suggested I create an issue.)

I think we can just add an optional argument `is_classmethod=False` (maybe also `is_staticmethod=False`?) to the existing function (and essentially copy the corresponding part from `semanal_namedtuple.py`).
Would you like to submit a PR, @dmontagu 
@msullivan I can take a look tonight and give it a shot, but am still very new to mypy, at least from the developer side. So as long as you don't mind it being an "attempt", I can open a PR. (But I haven't put any effort into this yet if someone else is able to do it very quickly/easily.)
mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginFile mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testAttributeTypeHookPluginUntypedDecoratedGetattr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalError mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginFilePyProjectTOML mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testArgKindsMethod mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testAttributeTypeHookPluginDecoratedGetattr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSimpleImportSequence mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPlugin mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testAttributeHookPluginForDynamicClass mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testArgKindsFunction mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginPyProjectTOML mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testHookCallableInstance mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInternalChangeOnly mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginFullnameIsNotNone mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginFullnameIsNotNonePyProjectTOML mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalImportGone mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testGetMethodHooksOnUnions mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testTypeAnalyzeHookPlugin mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testTwoPlugins mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testTwoPluginsPyProjectTOML mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testGetMethodHooksOnUnionsStrictOptional mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginHookForClass mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testTwoPluginsMixedType mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionPluginHookForReturnedCallable mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testTwoPluginsMixedTypePyProjectTOML mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testGetMethodHooksOnUnionsSpecial mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testMissingPluginFile mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testMissingPlugin mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testMultipleSectionsDefinePlugin mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testInvalidPluginExtension mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionMethodContextsHasArgNames mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testMissingPluginEntryPoint mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalCallable mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testPluginDependencies mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testCustomizeMroTrivial mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionMethodContextsHasArgNamesPositionals mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testCustomPluginEntryPointFile mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testCustomPluginEntryPoint mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testDescriptorMethods mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionMethodContextsHasArgNamesInitMethod mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testInvalidPluginEntryPointReturnValue mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testInvalidPluginEntryPointReturnValue2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSameNameChange mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionSigPluginFile mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionMethodContextsHasArgNamesUnfilledArguments mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testAttributeTypeHookPlugin mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testPluginCalledCorrectlyWhenMethodInDecorator mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalPartialInterfaceChange mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testClassAttrPluginClassVar mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionMethodContextsHasArgNamesStarExpressions mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalOkChangeWithSave mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testClassAttrPluginMethod mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testFunctionMethodContextArgNamesForInheritedMethods mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInternalFunctionDefinitionChange mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testClassAttrPluginEnum mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithComplexDictExpression mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testMethodSignatureHook mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInternalScramble mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testClassAttrPluginMetaclassAnyBase mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testClassAttrPluginMetaclassRegularBase mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithComplexConstantExpressionNoAnnotation mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testClassAttrPluginPartialType mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalMethodInterfaceChange mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testMethodSignatureHookNamesFullyQualified mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithComplexConstantExpressionWithAnnotation mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBaseClassChange mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testDynamicClassPlugin mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalEmpty mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testDynamicClassPluginChainCall mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalCascadingChange mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSmall mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBasics mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testDynamicClassPluginChainedAssignment mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testDynamicClassPluginNegatives mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalRemoteErrorFixed mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testDynamicClassHookFromClassMethod mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithDecorators mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBrokenCascade mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalChangedError mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalChangingClassAttributes mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testBaseClassPluginHookWorksIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalReplacingImports mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalLongBrokenCascade mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalChangingFields mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSubmoduleParentWithImportFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalChangingFieldsWithAssignment mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSubmoduleParentBackreference mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalChangingAlias mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedBrokenCascade mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalCheckingChangingFields mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSubmoduleParentBackreferenceComplex mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalStoresAliasTypeVars mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedBrokenCascadeWithType1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSilentImportsWithBlatantError mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalReferenceNewFileWithImportFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedClassDefinition mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalImportIsNewlySilenced mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalReferenceExistingFileWithImportFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSimpleBranchingModules mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSilencedModuleNoLongerCausesError mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedBrokenCascadeWithType2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithTypeIgnoreOnDirectImport mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSubmoduleImport mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalRemoteChange mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFixedBugCausesPropagation mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithTypeIgnoreOnImportFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSubmoduleWithAttr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBadChange mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalIncidentalChangeWithBugCausesPropagation mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBadChangeWithSave mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedSubmoduleImportFromWithAttr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithPartialTypeIgnore mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalIncidentalChangeWithBugFixCausesPropagation mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedSubmoduleWithAttr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalAnyIsDifferentFromIgnore mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWorksWithBasicProtocols mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSilentImportsWithInnerImports mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSilentImportsAndImportsInClass mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSilentImportsWithInnerImportsAndNewFile mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNamedTupleInMethod mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSwitchFromNominalToStructural mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSameFileSize mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWorksWithNestedClasses mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalSwitchFromStructuralToNominal mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNamedTupleInMethod2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalClassVar mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalUnsilencingModule mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalClassVarGone mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNamedTupleInMethod3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithIgnores mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWorksWithNamedTuple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCachingClassVar mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithSilentImportsAndIgnore mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWorksWithNestedNamedTuple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalRemoteError mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalTypedDictInMethod mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalPartialSubmoduleUpdate mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeTypedDict mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCacheDeletedAfterErrorsFound mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedClassRef mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalTypedDictInMethod2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeMetaclass mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeMetaclassInImportCycle1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalTypedDictInMethod3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCacheDeletedAfterErrorsFound2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalLoadsParentAfterChild mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeMetaclassInImportCycle2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testDeleteFile mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBaseClassAttributeConflict mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCacheDeletedAfterErrorsFound3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNewTypeInMethod mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInnerClassAttrInMethod mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFollowImportsSilent mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testDeleteFileWithinCycle mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCacheDeletedAfterErrorsFound4 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFollowImportsSkip mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInnerClassAttrInMethodReveal mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNoCrashOnDeletedWithCacheOnCmdline mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericMethodRestoreMetaLevel mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeAbstractPropertyIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFollowImportsError mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testThreePassesBasic mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeAbstractPropertyDisallowUntypedIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericMethodRestoreMetaLevel2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testClassNamesResolutionCrashAccess mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFollowImportsVariable mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testThreePassesErrorInThirdPass mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericMethodRestoreMetaLevel3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testClassNamesResolutionCrashReadCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFollowImportsVariablePyProjectTOML mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testThreePassesThirdPassFixesError mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalPerFileFlags mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testClassNamesResolutionCrashReveal mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testForwardNamedTupleToUnionWithOtherNamedTUple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithSilentImports mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testErrorsAffectDependentsOnly mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeRecursiveAliases3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNoCrashForwardRefToBrokenDoubleNewTypeIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testDisallowAnyExprIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNoCrashForwardRefOverloadIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNoCrashForwardRefOverloadIncrementalClass mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericTypeAliasesForwardAnyIncremental1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalStrictOptional mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalConverterInSubmodule mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNewTypeFromForwardNamedTupleIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericTypeAliasesForwardAnyIncremental2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalSubclassingCached mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNamedTupleForwardAsUpperBoundSerialization mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalSubclassingCachedConverter mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNewTypeFromForwardTypedDictIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSelfRefNTIncremental1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalConverterManyStyles mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalSubclassingCachedType mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testForwardTypeAliasInBase1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSelfRefNTIncremental2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalConverterInFunction mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testForwardTypeAliasInBase2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSelfRefNTIncremental3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalArguments mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSelfRefNTIncremental4 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeRecursiveAliases1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSelfRefNTIncremental5 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalDunder mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCrashWithPartialGlobalAndCycle mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSerializeRecursiveAliases2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalSubclassModified mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalMetaclassUpdate mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalCrashOnTypeWithFunction mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalThreeRuns mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalLotsOfInheritance mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testDeletedDepLineNumber mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalSubclassModifiedErrorFirst mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testReprocessModuleEvenIfInterfaceHashDoesNotChange mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInheritanceProperty mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAttrsIncrementalThreeFiles mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInheritanceAddAnnotation mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testTreeShadowingViaParentPackage mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithIgnoresTwice mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWorkingFineGrainedCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testRegularUsesFgCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesThreeFiles mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesSubclassingCached mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFgCacheNeedsFgCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesThreeRuns mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIgnoredImport2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesSubclassingCachedType mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalPackageNameOverload mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testParentPatchingMess mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testDeletionOfSubmoduleTriggersImportFrom2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesArguments mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testDeleteIndirectDependency mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalFineGrainedCacheError1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCachedBadProtocolNote mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIndirectDepsAlwaysPatched mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testImportReExportInCycle mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesDunder mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBustedFineGrainedCache1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testImportUnusedIgnore1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testModuleGetattrInitIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesSubclassModified mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testImportUnusedIgnore2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBustedFineGrainedCache2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testModuleGetattrInitIncremental2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsIgnorePackage mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalDataclassesSubclassModifiedErrorFirst mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsIgnorePackageFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVarAlias mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsIgnorePackagePartial mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalBustedFineGrainedCache3 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testModuleGetattrIncrementalSerializeVarFlag mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVarLocal mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVarClass mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubs mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFinalAddFinalVarAssign mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsPackage mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVarClassAlias mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFinalAddFinalVarOverride mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testRecursiveAliasImported mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsPackageFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFollowImportSkipNotInvalidatedOnPresent mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFinalAddFinalMethodOverride mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVarExisting mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFollowImportSkipNotInvalidatedOnPresentPackage mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVar mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadVarAliasExisting mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFollowImportSkipNotInvalidatedOnAdded mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsPackagePartial mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByIdemAliasReversed mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByBadFunction mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFollowImportSkipInvalidatedOnAddedStub mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsPackagePartialGetAttr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testFollowImportSkipNotInvalidatedOnAddedStubOnFollowForStubs mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedMissingStubsIgnore mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByIdemAliasGeneric mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testConditionalExceptionAliasOverride mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedSkippedStubsPackageFrom mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByIdemAliasImported mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testBadEnumLoading mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedPluginsInvalidateCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByIdemAlias mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testOverrideByIdemAliasImportedReversed mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testChangedPluginsInvalidateCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testRemovedPluginsInvalidateCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNewAnalyzerIncrementalBrokenNamedTupleNested mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testLiteralIncrementalTurningIntoLiteral mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testChangedPluginsInvalidateCache2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testPluginConfigData mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testAddedSubStarImport mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNewAnalyzerIncrementalMethodNamedTuple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testRedefinitionClass mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNewAnalyzerIncrementalNestedEnum mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNodeCreatedFromGetattr mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNewAnalyzerIncrementalBrokenNamedTuple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testCannotDetermineTypeFromOtherModule mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalNoChange mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalNoChangeSameName mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalIsInstanceChange mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalUnderlyingObjChang mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalIntersectionToUnreachable mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalNoChangeTuple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIsInstanceAdHocIntersectionIncrementalUnreachaableToIntersection mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testStubFixupIssues mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalIndirectSkipWarnUnused mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedTypeAlias mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNestedNamedTuple mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNamespacePackage1 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalNamespacePackage2 mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testExplicitReexportImportCycleWildcard mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testEnumAreStillFinalAfterCache mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testMethodAliasIncremental mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testSlotsSerialization mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalInvalidNamedTupleInUnannotatedFunction mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testTupleTypeUpdateNonRecursiveToRecursiveCoarse mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalWithDifferentKindsOfNestedTypesWithinMethod mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testNamedTupleUpdateNonRecursiveToRecursiveCoarse mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testTypeAliasUpdateNonRecursiveToRecursiveCoarse mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testTypedDictUpdateNonRecursiveToRecursiveCoarse mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericNamedTupleSerialization mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testGenericTypedDictSerialization
mypy/test/testcheck.py::TypeCheckSuite::check-custom-plugin.test::testAddClassMethodPlugin mypy/test/testcheck.py::TypeCheckSuite::check-incremental.test::testIncrementalAddClassMethodPlugin