content: module Move1 where
  
  data Located a = L Int a
  type Name = String
  hsBinds = undefined
  divideDecls = undefined
  definingDeclsNames = undefined
  nub = undefined
  definedPNs :: a -> [b]
  definedPNs = undefined
  logm = undefined
  showGhc = undefined
  pnsNeedRenaming = undefined
  concatMap1 = undefined
  
  -- liftToTopLevel' :: ModuleName -- -> (ParseResult,[PosToken]) -> FilePath
  --                 -> Located Name
  --                 -> RefactGhc [a]
  liftToTopLevel' :: Int -> Located Name -> IO [a]
  liftToTopLevel' modName pn@(L _ n) = do
    liftToMod
    return []
      where
            {-step1: divide the module's top level declaration list into three parts:
              'parent' is the top level declaration containing the lifted declaration,
              'before' and `after` are those declarations before and after 'parent'.
              step2: get the declarations to be lifted from parent, bind it to liftedDecls 
              step3: remove the lifted declarations from parent and extra arguments may be introduce.
              step4. test whether there are any names need to be renamed.
            -}
         liftToMod :: IO ()
         liftToMod = do
                        -- renamed <- getRefactRenamed
                        let renamed = undefined
                        let declsr = hsBinds renamed
                        let (before,parent,after) = divideDecls declsr pn
                        -- error ("liftToMod:(before,parent,after)=" ++ (showGhc (before,parent,after))) -- ++AZ++
                        {- ++AZ++ : hsBinds does not return class or instance definitions
                        when (isClassDecl $ ghead "liftToMod" parent)
                              $ error "Sorry, the refactorer cannot lift a definition from a class declaration!"
                        when (isInstDecl $ ghead "liftToMod" parent)
                              $ error "Sorry, the refactorer cannot lift a definition from an instance declaration!"
                        -}
                        let liftedDecls = definingDeclsNames [n] parent True True
                            declaredPns = nub $ concatMap1 definedPNs liftedDecls
  
                        -- TODO: what about declarations between this
                        -- one and the top level that are used in this one?
  
                        logm $ "liftToMod:(liftedDecls,declaredPns)=" ++ (showGhc (liftedDecls,declaredPns))
                        -- original : pns<-pnsNeedRenaming inscps mod parent liftedDecls declaredPns
                        -- pns <- pnsNeedRenaming renamed parent liftedDecls declaredPns
                        return ()
  