lsp-2.7.0.0: Haskell library for the Microsoft Language Server Protocol
Safe HaskellSafe-Inferred
LanguageGHC2021

Language.LSP.VFS

Description

Handles the Language.LSP.Types.TextDocumentDidChange / Language.LSP.Types.TextDocumentDidOpen / Language.LSP.Types.TextDocumentDidClose messages to keep an in-memory filesystem of the current client workspace. The server can access and edit files in the client workspace by operating on the VFS in LspFuncs.

Synopsis

Documentation

data VFS Source #

Constructors

VFS 

Fields

Instances

Instances details
Show VFS Source # 
Instance details

Defined in Language.LSP.VFS

Methods

showsPrec :: Int -> VFS -> ShowS #

show :: VFS -> String #

showList :: [VFS] -> ShowS #

vfsMap :: HasVfsMap s a => Lens' s a Source #

data VirtualFile Source #

Constructors

VirtualFile 

Fields

Instances

Instances details
Show VirtualFile Source # 
Instance details

Defined in Language.LSP.VFS

lsp_version :: HasLsp_version s a => Lens' s a Source #

file_version :: HasFile_version s a => Lens' s a Source #

file_text :: HasFile_text s a => Lens' s a Source #

data VfsLog Source #

Constructors

SplitInsideCodePoint Position Rope 
URINotFound NormalizedUri 
Opening NormalizedUri 
Closing NormalizedUri 
PersistingFile NormalizedUri FilePath 
CantRecursiveDelete NormalizedUri 
DeleteNonExistent NormalizedUri 

Instances

Instances details
Show VfsLog Source # 
Instance details

Defined in Language.LSP.VFS

Pretty VfsLog Source # 
Instance details

Defined in Language.LSP.VFS

Methods

pretty :: VfsLog -> Doc ann #

prettyList :: [VfsLog] -> Doc ann #

Managing the VFS

openVFS :: MonadState VFS m => LogAction m (WithSeverity VfsLog) -> TMessage 'Method_TextDocumentDidOpen -> m () Source #

Applies the changes from a DidOpenTextDocument to the VFS

changeFromClientVFS :: MonadState VFS m => LogAction m (WithSeverity VfsLog) -> TMessage 'Method_TextDocumentDidChange -> m () Source #

Applies a DidChangeTextDocumentNotification to the VFS

changeFromServerVFS :: forall m. MonadState VFS m => LogAction m (WithSeverity VfsLog) -> TMessage 'Method_WorkspaceApplyEdit -> m () Source #

Applies the changes from a ApplyWorkspaceEditRequest to the VFS

persistFileVFS :: MonadIO m => LogAction m (WithSeverity VfsLog) -> FilePath -> VFS -> NormalizedUri -> Maybe (FilePath, m ()) Source #

Write a virtual file to a file in the given directory if it exists in the VFS.

closeVFS :: MonadState VFS m => LogAction m (WithSeverity VfsLog) -> TMessage 'Method_TextDocumentDidClose -> m () Source #

Positions and transformations

data CodePointPosition Source #

A position, like a Position, but where the offsets in the line are measured in Unicode code points instead of UTF-16 code units.

Constructors

CodePointPosition 

Fields

  • _line :: UInt

    Line position in a document (zero-based).

  • _character :: UInt

    Character offset on a line in a document in *code points* (zero-based).

line :: HasLine s a => Lens' s a Source #

character :: HasCharacter s a => Lens' s a Source #

codePointPositionToPosition :: VirtualFile -> CodePointPosition -> Maybe Position Source #

Given a virtual file, translate a CodePointPosition in that file into a Position in that file.

Will return Nothing if the requested position is out of bounds of the document.

Logarithmic in the number of lines in the document, and linear in the length of the line containing the position.

positionToCodePointPosition :: VirtualFile -> Position -> Maybe CodePointPosition Source #

Given a virtual file, translate a Position in that file into a CodePointPosition in that file.

Will return Nothing if the requested position lies inside a code point, or if it is out of bounds of the document.

Logarithmic in the number of lines in the document, and linear in the length of the line containing the position.

data CodePointRange Source #

A range, like a Range, but where the offsets in the line are measured in Unicode code points instead of UTF-16 code units.

Constructors

CodePointRange 

Fields

start :: HasStart s a => Lens' s a Source #

end :: HasEnd s a => Lens' s a Source #

codePointRangeToRange :: VirtualFile -> CodePointRange -> Maybe Range Source #

Given a virtual file, translate a CodePointRange in that file into a Range in that file.

Will return Nothing if any of the positions are out of bounds of the document.

Logarithmic in the number of lines in the document, and linear in the length of the lines containing the positions.

rangeToCodePointRange :: VirtualFile -> Range -> Maybe CodePointRange Source #

Given a virtual file, translate a Range in that file into a CodePointRange in that file.

Will return Nothing if any of the positions are out of bounds of the document.

Logarithmic in the number of lines in the document, and linear in the length of the lines containing the positions.

manipulating the file contents

for tests

applyChanges :: Monad m => LogAction m (WithSeverity VfsLog) -> Rope -> [TextDocumentContentChangeEvent] -> m Rope Source #

Apply the list of changes. Changes should be applied in the order that they are received from the client.

applyChange :: Monad m => LogAction m (WithSeverity VfsLog) -> Rope -> TextDocumentContentChangeEvent -> m Rope Source #

changeChars :: Monad m => LogAction m (WithSeverity VfsLog) -> Rope -> Position -> Position -> Text -> m Rope Source #

Given a Rope, start and end positions, and some new text, replace the given range with the new text. If the given positions lie within a code point then this does nothing (returns the original Rope) and logs.