/**
   * Decides which process should take care of the request.
   *
   * @param request
   */
  public static IRefactorRenameProcess getProcess(
      Definition definition, RefactoringRequest request) {
    if (definition instanceof AssignDefinition) {
      AssignDefinition d = (AssignDefinition) definition;
      if (d.target.indexOf('.') != -1) {
        if (d.target.startsWith("self.")) {
          // ok, it is a member and not a local
          return new PyRenameSelfAttributeProcess(definition, d.target);
        } else {
          return new PyRenameAttributeProcess(definition, d.target);
        }

      } else {
        if (definition.scope != null) {
          // classvar
          if (definition.scope.isLastClassDef()) {
            return new PyRenameAttributeProcess(definition, d.target);
          }
          FastStack scopeStack = definition.scope.getScopeStack();
          if (request.moduleName.equals(definition.module.getName())) {
            if (!scopeStack.empty()) {
              Object peek = scopeStack.peek();
              if (peek instanceof FunctionDef) {
                return new PyRenameLocalProcess(definition);
              }
            }
          }
        }
        return new PyRenameGlobalProcess(definition);
      }
    }
    if (definition.ast != null) {
      if (definition.ast instanceof ClassDef) {
        return new PyRenameClassProcess(definition);
      }

      if (definition.ast instanceof Name) {
        Name n = (Name) definition.ast;
        if (n.ctx == Name.Param || n.ctx == Attribute.KwOnlyParam) {
          return new PyRenameParameterProcess(definition);
        }
      }

      if (definition instanceof KeywordParameterDefinition) {
        return new PyRenameParameterProcess(
            (KeywordParameterDefinition) definition, request.nature);
      }

      if (definition.ast instanceof FunctionDef) {
        return new PyRenameFunctionProcess(definition);
      }
      if (NodeUtils.isImport(definition.ast)) {
        // this means that we found an import and we cannot actually map that import to a definition
        // (so, it is an unresolved import)
        return new PyRenameImportProcess(definition);
      }
    } else {
      // the definition ast is null. This should mean that it was actually an import
      // and pointed to some module
      return new PyRenameImportProcess(definition);
    }
    if (definition.scope != null) {
      // classvar
      if (definition.scope.isLastClassDef()) {
        return new PyRenameAttributeProcess(definition, definition.value);
      }

      FastStack scopeStack = definition.scope.getScopeStack();
      if (request.moduleName.equals(definition.module.getName())) {
        if (!scopeStack.empty()) {
          Object peek = scopeStack.peek();
          if (peek instanceof FunctionDef) {
            return new PyRenameLocalProcess(definition);
          }
        }
      }
    }
    return new PyRenameGlobalProcess(definition);
  }