Skip to content

Commit 2ff597a

Browse files
committed
correct path, indefinite search(?)
1 parent a49ecea commit 2ff597a

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal.hs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ import Distribution.PackageDescription (Benchmark (..),
6565
library,
6666
unUnqualComponentName)
6767
import Distribution.PackageDescription.Configuration (flattenPackageDescription)
68+
import Distribution.Utils.Path (getSymbolicPath)
69+
import System.Directory (doesFileExist)
70+
import System.FilePath ((</>), takeDirectory)
71+
import Distribution.Utils.Generic (safeHead)
6872

6973
data Log
7074
= LogModificationTime NormalizedFilePath FileVersion
@@ -325,23 +329,25 @@ gotoDefinition ideState _ msgParam = do
325329
let mModuleNames = CabalFields.getModulesNames <$> mCabalFields
326330
mModuleName = find (isModuleName cursorText) =<< mModuleNames
327331
case mModuleName of
328-
Nothing -> traceShowM ("NOT A MODULE")
332+
Nothing -> pure $ InR $ InR Null
329333
Just (mBuildTargetNames, moduleName) -> do
330-
traceShowM ("IS A MODULE", moduleName, "at", mBuildTargetNames)
331334
mGPD <- liftIO $ runAction "cabal.GPD" ideState $ useWithStale ParseCabalFile $ toNormalizedFilePath filePath
332335
case mGPD of
333-
Nothing -> traceShowM ("failed to get GPD")
336+
Nothing -> pure $ InR $ InR Null
334337
Just (gpd, _) -> do
335-
let debug = map (lookupBuildTargetPackageDescription
336-
(flattenPackageDescription gpd))
337-
mBuildTargetNames
338-
traceShowM ("debug is", debug)
339338
let buildInfos = foldMap (lookupBuildTargetPackageDescription
340339
(flattenPackageDescription gpd))
341340
mBuildTargetNames
342-
traceShowM ("buildInfos is", buildInfos)
343-
traceShowM ("Found hsSourceDirs", map hsSourceDirs buildInfos)
344-
pure $ InR $ InR Null
341+
sourceDirs = map getSymbolicPath $ concatMap hsSourceDirs buildInfos
342+
potentialPaths = map (\dir -> takeDirectory filePath </> dir </> toHaskellFile moduleName) sourceDirs
343+
traceShowM ("potentialPaths", potentialPaths)
344+
allPaths <- liftIO $ filterM doesFileExist potentialPaths
345+
traceShowM ("allPaths", allPaths)
346+
let locations = map (\pth -> Location (filePathToUri pth) (mkRange 0 0 0 0)) allPaths
347+
traceShowM ("locations", locations)
348+
case safeHead locations of
349+
Nothing -> pure $ InR $ InR Null
350+
Just location -> pure $ InL $ Definition $ InL location
345351
where
346352
cursor = Types.lspPositionToCabalPosition (msgParam ^. JL.position)
347353
uri = msgParam ^. JL.textDocument . JL.uri
@@ -390,6 +396,10 @@ gotoDefinition ideState _ msgParam = do
390396
if T.pack (unUnqualComponentName benchmarkName) == buildTargetName
391397
then Just benchmarkBuildInfo
392398
else Nothing
399+
400+
toHaskellFile :: T.Text -> FilePath
401+
toHaskellFile moduleName = foldl1 (</>) (map T.unpack $ T.splitOn "." moduleName) ++ ".hs"
402+
393403
-- ----------------------------------------------------------------
394404
-- Cabal file of Interest rules and global variable
395405
-- ----------------------------------------------------------------

plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/Completion/CabalFields.hs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
module Ide.Plugin.Cabal.Completion.CabalFields (findStanzaForColumn, getSectionsWithModules, getModulesNames, findFieldSection, findTextWord, findFieldLine, getOptionalSectionName, getAnnotation, getFieldName, onelineSectionArgs, getFieldEndPosition, getSectionArgEndPosition, getNameEndPosition, getFieldLineEndPosition, getFieldLSPRange) where
22

3+
import qualified Data.ByteString as BS
4+
import Data.List (find)
5+
import Data.List.Extra (groupSort)
36
import Data.List.NonEmpty (NonEmpty)
47
import qualified Data.List.NonEmpty as NE
58
import qualified Data.Text as T
69
import qualified Data.Text.Encoding as T
10+
import Data.Tuple (swap)
711
import qualified Distribution.Fields as Syntax
812
import qualified Distribution.Parsec.Position as Syntax
9-
import Ide.Plugin.Cabal.Completion.Types
10-
import qualified Data.ByteString as BS
11-
import Data.List (find)
13+
import Ide.Plugin.Cabal.Completion.Types
14+
( cabalPositionToLSPPosition, FieldContext(None), StanzaContext )
1215
import qualified Language.LSP.Protocol.Types as LSP
13-
import Data.List.Extra (groupSort)
14-
import Data.Bifunctor (second)
15-
import Data.Tuple (swap)
1616

1717
-- ----------------------------------------------------------------
1818
-- Cabal-syntax utilities I don't really want to write myself
@@ -152,9 +152,9 @@ getModulesNames fields = map swap $ groupSort rawModuleTargetPairs
152152
getSectionModuleNames (Syntax.Section _ secArgs fields) = map (, getArgsName secArgs) $ concatMap getFieldModuleNames fields
153153
getSectionModuleNames _ = []
154154

155-
getArgsName [] = Nothing -- only a main library can have no name
155+
getArgsName [] = Nothing -- only a main library can have no name
156156
getArgsName [Syntax.SecArgName _ name] = Just $ T.decodeUtf8 name
157-
getArgsName _ = Nothing -- impossible to have multiple names for a build target
157+
getArgsName _ = Nothing -- impossible to have multiple names for a build target
158158

159159
getFieldModuleNames field@(Syntax.Field _ modules) = if getFieldName field == T.pack "exposed-modules" ||
160160
getFieldName field == T.pack "other-modules"

0 commit comments

Comments
 (0)