@Override
    public void visitPyFunction(@NotNull PyFunction node) {
      super.visitPyFunction(node);
      // check @foo.setter and @foo.deleter
      PyClass cls = node.getContainingClass();
      if (cls != null) {
        final PyDecoratorList decos = node.getDecoratorList();
        if (decos != null) {
          String name = node.getName();
          for (PyDecorator deco : decos.getDecorators()) {
            final QualifiedName qName = deco.getQualifiedName();
            if (qName != null) {
              List<String> nameParts = qName.getComponents();
              if (nameParts.size() == 2) {
                final int suffixIndex = SUFFIXES.indexOf(nameParts.get(1));
                if (suffixIndex >= 0) {
                  if (Objects.equals(name, nameParts.get(0))) {
                    // names are ok, what about signatures?
                    PsiElement markable = getFunctionMarkingElement(node);
                    if (suffixIndex == 0) {
                      checkSetter(node, markable);
                    }
                    else {
                      checkDeleter(node, markable);
                    }
                  }
                  else {
                    registerProblem(deco, PyPsiBundle.message("INSP.func.property.name.mismatch"));
                  }
                }
              }
            }
          }
        }
      }
    }
@Override
    public void visitPyFunction(@NotNull PyFunction node)