Commit 1a50748b authored by Andrew Gibiansky's avatar Andrew Gibiansky

Added extension completion for :extension directive, closes #60

parent c4176b3f
...@@ -17,27 +17,29 @@ ...@@ -17,27 +17,29 @@
-} -}
module IHaskell.Eval.Completion (complete, completionTarget, completionType, CompletionType(..)) where module IHaskell.Eval.Completion (complete, completionTarget, completionType, CompletionType(..)) where
import Prelude import Control.Applicative ((<$>))
import Data.ByteString.UTF8 hiding (drop, take)
import Data.Char
import Data.List (find, isPrefixOf, nub, findIndex, intercalate, elemIndex) import Data.List (find, isPrefixOf, nub, findIndex, intercalate, elemIndex)
import Data.List.Split
import Data.List.Split.Internals
import Data.Maybe
import Data.String.Utils (strip, startswith, replace)
import Prelude
import GHC import GHC
import DynFlags
import GhcMonad import GhcMonad
import PackageConfig import PackageConfig
import Outputable (showPpr) import Outputable (showPpr)
import Data.Char
import Data.ByteString.UTF8 hiding (drop, take)
import Data.List.Split
import Data.List.Split.Internals
import Data.String.Utils (strip, startswith, replace)
import Data.Maybe
import IHaskell.Types import IHaskell.Types
import Control.Applicative ((<$>))
import Debug.Trace
data CompletionType data CompletionType
= Empty = Empty
| Identifier String | Identifier String
| Extension String
| Qualified String String | Qualified String String
| ModuleName String String | ModuleName String String
deriving (Show, Eq) deriving (Show, Eq)
...@@ -61,20 +63,29 @@ complete line pos = do ...@@ -61,20 +63,29 @@ complete line pos = do
options <- options <-
case completionType line target of case completionType line target of
Empty -> return [] Empty -> return []
Identifier candidate -> Identifier candidate ->
return $ filter (candidate `isPrefixOf`) unqualNames return $ filter (candidate `isPrefixOf`) unqualNames
Qualified moduleName candidate -> do Qualified moduleName candidate -> do
trueName <- getTrueModuleName moduleName trueName <- getTrueModuleName moduleName
let prefix = intercalate "." [trueName, candidate] let prefix = intercalate "." [trueName, candidate]
completions = filter (prefix `isPrefixOf`) qualNames completions = filter (prefix `isPrefixOf`) qualNames
falsifyName = replace trueName moduleName falsifyName = replace trueName moduleName
return $ map falsifyName completions return $ map falsifyName completions
ModuleName previous candidate -> do ModuleName previous candidate -> do
let prefix = if null previous let prefix = if null previous
then candidate then candidate
else intercalate "." [previous, candidate] else intercalate "." [previous, candidate]
return $ filter (prefix `isPrefixOf`) moduleNames return $ filter (prefix `isPrefixOf`) moduleNames
Extension ext -> do
let extName (name, _, _) = name
names = map extName xFlags
nonames = map ("No" ++) names
return $ filter (ext `isPrefixOf`) $ names ++ nonames
return (matchedText, options) return (matchedText, options)
getTrueModuleName :: GhcMonad m => String -> m String getTrueModuleName :: GhcMonad m => String -> m String
...@@ -98,12 +109,16 @@ getTrueModuleName name = do ...@@ -98,12 +109,16 @@ getTrueModuleName name = do
completionType :: String -> [String] -> CompletionType completionType :: String -> [String] -> CompletionType
completionType line [] = Empty completionType line [] = Empty
completionType line target completionType line target
| startswith "import" (strip line) && isModName = | startswith "import" stripped && isModName
ModuleName dotted candidate = ModuleName dotted candidate
| isModName && (not . null . init) target = | isModName && (not . null . init) target
Qualified dotted candidate = Qualified dotted candidate
| otherwise = Identifier candidate | startswith ":e" stripped
where dotted = dots target = Extension candidate
| otherwise
= Identifier candidate
where stripped = strip line
dotted = dots target
candidate = last target candidate = last target
dots = intercalate "." . init dots = intercalate "." . init
isModName = all isCapitalized (init target) isModName = all isCapitalized (init target)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment