@@ -28,6 +28,7 @@ import qualified Data.Map.Strict as Map
2828import Data.Maybe (catMaybes , fromMaybe ,
2929 isJust )
3030import qualified Data.Text as T
31+ import Data.String (fromString )
3132import Development.IDE hiding (pluginHandlers ,
3233 pluginRules )
3334import Development.IDE.Core.PositionMapping
@@ -269,12 +270,35 @@ mkExplicitEdit pred posMapping (L (locA -> src) imp) explicit
269270 | otherwise =
270271 Nothing
271272
273+ -- This number is somewhat arbitrarily chosen. Ideally the protocol would tell us these things,
274+ -- but at the moment I don't believe we know it.
275+ -- 80 columns is traditional, but Haskellers tend to use longer lines (citation needed) and it's
276+ -- probably not too bad if the lens is a *bit* longer than normal lines.
277+ maxColumns :: Int
278+ maxColumns = 120
279+
272280-- | Given an import declaration, generate a code lens unless it has an
273281-- explicit import list or it's qualified
274282generateLens :: PluginId -> Uri -> TextEdit -> IO (Maybe CodeLens )
275283generateLens pId uri importEdit@ TextEdit {_range, _newText} = do
276- -- The title of the command is just the minimal explicit import decl
277- let title = _newText
284+ let
285+ -- The title of the command is ideally the minimal explicit import decl, but
286+ -- we don't want to create a really massive code lens (and the decl can be extremely large!).
287+ -- So we abbreviate it to fit a max column size, and indicate how many more items are in the list
288+ -- after the abbreviation
289+
290+ -- For starters, we only want one line in the title
291+ oneLineText = T. unwords $ T. lines _newText
292+ -- Now, split at the max columns, leaving space for the suffix text we're going to add
293+ -- (conservatively assuming we won't need to print a number larger than 100)
294+ (editPrefix, editSuffix) = T. splitAt (maxColumns - (T. length (suffixText 100 ))) oneLineText
295+ -- The number of additional items is the number of commas: one more after every comma!
296+ numAdditionalItems = T. count " ," editSuffix
297+ -- We want to make text like this: import Foo (AImport, BImport, CImp... (30 more items))
298+ -- Trailing paren is to match the opening paren from the import list
299+ suffixText n = " ... (" <> fromString (show n) <> " more items) )"
300+ title = if T. length oneLineText <= maxColumns then oneLineText else editPrefix <> suffixText numAdditionalItems
301+
278302 -- the code lens has no extra data
279303 _xdata = Nothing
280304 -- an edit that replaces the whole declaration with the explicit one
0 commit comments