diff options
-rw-r--r-- | lsp/Main.hs | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/lsp/Main.hs b/lsp/Main.hs index 1784aec..d1da888 100644 --- a/lsp/Main.hs +++ b/lsp/Main.hs @@ -17,37 +17,48 @@ import Language.LSP.Server import qualified HSVIS.Diagnostic as HV import qualified HSVIS.Parser as HV +import qualified HSVIS.Typecheck as HV -parseFile :: NormalizedUri -> T.Text -> [Diagnostic] +mkDiag :: HV.Diagnostic -> Diagnostic +mkDiag msg = Diagnostic + { _range = + let -- TODO: col needs to be UTF-16 based, which this is not + mkPos (HV.Pos line col) = Position (fromIntegral line) (fromIntegral col) + HV.Range from to = HV.dRange msg + in Range (mkPos from) (mkPos to) + , _severity = Just DiagnosticSeverity_Error + , _code = Nothing + , _codeDescription = Nothing + , _source = Just "hs-vis" + , _message = T.pack $ intercalate "\n" $ + HV.dMsg msg : ["In " ++ entry | entry <- reverse (HV.dStk msg)] + , _tags = Nothing + , _relatedInformation = Nothing + , _data_ = Nothing + } + +parseFile :: NormalizedUri -> T.Text -> ([Diagnostic], Maybe HV.PProgram) parseFile (NormalizedUri _ fpath) source = - let (errs, _) = HV.parse (T.unpack fpath) (T.unpack source) - in map mkDiag errs - where - mkDiag :: HV.Diagnostic -> Diagnostic - mkDiag msg = Diagnostic - { _range = - let -- TODO: col needs to be UTF-16 based, which this is not - mkPos (HV.Pos line col) = Position (fromIntegral line) (fromIntegral col) - HV.Range from to = HV.dRange msg - in Range (mkPos from) (mkPos to) - , _severity = Just DiagnosticSeverity_Error - , _code = Nothing - , _codeDescription = Nothing - , _source = Just "hs-vis" - , _message = T.pack $ intercalate "\n" $ - HV.dMsg msg : ["In " ++ entry | entry <- reverse (HV.dStk msg)] - , _tags = Nothing - , _relatedInformation = Nothing - , _data_ = Nothing - } + let (errs, mpprog) = HV.parse (T.unpack fpath) (T.unpack source) + in (map mkDiag errs, mpprog) + +typecheckFile :: NormalizedUri -> T.Text -> HV.PProgram -> ([Diagnostic], HV.TProgram) +typecheckFile (NormalizedUri _ fpath) source pprog = + let (errs, tprog) = HV.typecheck (T.unpack fpath) (T.unpack source) pprog + in (map mkDiag errs, tprog) publishDiagsForUri :: Uri -> LspM () () publishDiagsForUri fileUri = do - getVirtualFile (toNormalizedUri fileUri) >>= \case + let filename = toNormalizedUri fileUri + getVirtualFile filename >>= \case Just vfile -> do - let diags = parseFile (toNormalizedUri fileUri) - (Rope.toText (vfile ^. L.file_text)) + let source = Rope.toText (vfile ^. L.file_text) + let (diags1, mpprog) = parseFile filename source + let (diags2, _mtprog) = case mpprog of Just pprog -> Just <$> typecheckFile filename source pprog + Nothing -> ([], Nothing) + let diags = diags1 ++ diags2 + -- liftIO $ appendFile "/home/tom/hsvislsplog.txt" (" -> publishing diags: " ++ show diags ++ "\n") sendNotification SMethod_TextDocumentPublishDiagnostics PublishDiagnosticsParams { _uri = fileUri |