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 ()
