@Override
    public void visitPyDecorator(@NotNull PyDecorator deco) {
      if (deco.hasArgumentList()) return;
      final PyCallableType callableType = ContainerUtil.getFirstItem(deco.multiResolveCallee(getResolveContext()));
      if (callableType != null) {
        final PyCallable callable = callableType.getCallable();
        if (callable == null) return;
        final int firstParamOffset = callableType.getImplicitOffset();
        final List<PyCallableParameter> params = callableType.getParameters(myTypeEvalContext);
        if (params == null) return;

        final PyCallableParameter allegedFirstParam = ContainerUtil.getOrElse(params, firstParamOffset - 1, null);
        if (allegedFirstParam == null || allegedFirstParam.isKeywordContainer()) {
          // no parameters left to pass function implicitly, or wrong param type
          registerProblem(deco, PyPsiBundle.message("INSP.function.lacks.positional.argument", callable.getName())); // TODO: better names for anon lambdas
        }
        else { // possible unfilled params
          for (int i = firstParamOffset; i < params.size(); i++) {
            final PyCallableParameter parameter = params.get(i);
            if (parameter.getParameter() instanceof PySingleStarParameter || parameter.getParameter() instanceof PySlashParameter) {
              continue;
            }
            // param tuples, non-starred or non-default won't do
            if (!parameter.isKeywordContainer() && !parameter.isPositionalContainer() && !parameter.hasDefaultValue()) {
              final String parameterName = parameter.getName();
              registerProblem(deco, PyPsiBundle.message("INSP.parameter.unfilled", parameterName == null ? "(...)" : parameterName));
            }
          }
        }
      }
      // else: this case is handled by arglist visitor
    }
@Override
    public void visitPyDecorator(@NotNull PyDecorator deco)