mirror of
https://github.com/unisonweb/unison.git
synced 2024-10-05 06:07:21 +03:00
compiles with no warnings, still gotta fill in a couple functions:
Runtime.evaluateWatches, and FileParser todo for generrating a UnisonFile from the stanzas. Also need the implementation of Runtime interface for the Haskell runtime
This commit is contained in:
parent
e96683981a
commit
076faf186e
@ -1,17 +1,12 @@
|
||||
module Unison.Codebase.CodeLookup where
|
||||
|
||||
import Control.Applicative
|
||||
import Data.Map ( Map )
|
||||
import qualified Data.Map as Map
|
||||
import Control.Monad.IO.Class ( MonadIO )
|
||||
import Unison.UnisonFile ( UnisonFile )
|
||||
import qualified Unison.UnisonFile as UF
|
||||
import qualified Unison.Term as Term
|
||||
import Unison.Term ( Term
|
||||
, AnnotatedTerm
|
||||
)
|
||||
import Unison.Term ( AnnotatedTerm )
|
||||
import Unison.Var ( Var )
|
||||
import Unison.Reference ( Reference )
|
||||
import qualified Unison.Reference as Reference
|
||||
import qualified Unison.Typechecker.TypeLookup as TL
|
||||
|
||||
|
@ -61,7 +61,7 @@ import Unison.NamePrinter (prettyName,
|
||||
styleHashQualified
|
||||
)
|
||||
import Unison.Parser (Ann)
|
||||
import Unison.Parser (startingLine, endingLine)
|
||||
import Unison.Parser (startingLine)
|
||||
import qualified Unison.PrettyPrintEnv as PPE
|
||||
import Unison.PrintError (prettyParseError,
|
||||
prettyTypecheckedFile,
|
||||
|
@ -222,7 +222,7 @@ loop s = Free.unfold' (evalStateT (maybe (Left ()) Right <$> runMaybeT (go *> ge
|
||||
unnameAll currentBranchName' nameTarget name success
|
||||
SlurpFileI allowUpdates -> case uf of
|
||||
Nothing -> respond NoUnisonFile
|
||||
Just uf'@(UF.TypecheckedUnisonFile datas effects _ _) -> do
|
||||
Just uf' -> do
|
||||
let collisionHandler = if allowUpdates
|
||||
then Editor.updateCollisionHandler
|
||||
else Editor.addCollisionHandler
|
||||
|
@ -1,26 +1,21 @@
|
||||
{-#LANGUAGE RankNTypes#-}
|
||||
module Unison.Codebase.Runtime where
|
||||
|
||||
import Control.Applicative
|
||||
import Data.Map ( Map )
|
||||
import qualified Data.Map as Map
|
||||
import Control.Monad.IO.Class ( MonadIO )
|
||||
import Unison.Codebase ( Codebase, Decl )
|
||||
import Unison.Codebase ( Codebase )
|
||||
import qualified Unison.Codebase.CodeLookup as CL
|
||||
import Unison.UnisonFile ( UnisonFile )
|
||||
import qualified Unison.UnisonFile as UF
|
||||
import qualified Unison.Term as Term
|
||||
import Unison.Term ( Term
|
||||
, AnnotatedTerm
|
||||
)
|
||||
import Unison.Var ( Var )
|
||||
import Unison.Reference ( Reference )
|
||||
import qualified Unison.Reference as Reference
|
||||
|
||||
data Runtime v = Runtime
|
||||
{ terminate :: forall m. MonadIO m => m ()
|
||||
, evaluate
|
||||
:: forall a b m
|
||||
:: forall a m
|
||||
. (MonadIO m, Monoid a)
|
||||
=> CL.CodeLookup m v a
|
||||
-> AnnotatedTerm v a
|
||||
@ -41,4 +36,4 @@ evaluateWatches :: (Var v, MonadIO m)
|
||||
-> Runtime v
|
||||
-> UnisonFile v a
|
||||
-> m (Map v (a, Term v))
|
||||
evaluateWatches evaluationCache rt uf = error "todo"
|
||||
evaluateWatches _evaluationCache _rt _uf = error "todo"
|
||||
|
@ -12,7 +12,6 @@ import Data.Bytes.Get ( getWord8
|
||||
)
|
||||
import Data.Bytes.Put ( runPutS )
|
||||
import Data.ByteString ( ByteString )
|
||||
import Data.Text ( Text )
|
||||
import Network.Socket
|
||||
import System.IO.Streams ( InputStream
|
||||
, OutputStream
|
||||
@ -22,16 +21,13 @@ import qualified System.IO.Streams as Streams
|
||||
import qualified System.IO.Streams.ByteString as BSS
|
||||
import qualified System.IO.Streams.Network as N
|
||||
import qualified System.Process as P
|
||||
import Unison.Codebase ( Codebase )
|
||||
import qualified Unison.Codebase as Codebase
|
||||
import Unison.Codebase.Runtime ( Runtime(..))
|
||||
import Unison.Codebase.CodeLookup ( CodeLookup )
|
||||
import qualified Unison.Codebase.Runtime as Runtime
|
||||
import qualified Unison.Codebase.Serialization.V0
|
||||
as Szn
|
||||
import qualified Unison.Codecs as Codecs
|
||||
import Unison.Term ( AnnotatedTerm, Term )
|
||||
import Unison.UnisonFile ( UnisonFile )
|
||||
import Unison.Var ( Var )
|
||||
|
||||
javaRuntime :: (Var v, MonadIO m) => (forall g. MonadGet g => g v) -> Int -> m (Runtime v)
|
||||
@ -52,7 +48,7 @@ javaRuntime getv suggestedPort = do
|
||||
pure $ (reverse acc, term)
|
||||
x -> fail $ "Unexpected byte in JVM output: " ++ show x
|
||||
feedme
|
||||
:: forall v a b m. (Var v, MonadIO m, Monoid a)
|
||||
:: forall v a m. (Var v, MonadIO m, Monoid a)
|
||||
=> (forall g. MonadGet g => g v)
|
||||
-> InputStream ByteString
|
||||
-> OutputStream ByteString
|
||||
|
@ -27,14 +27,8 @@ import System.FSNotify ( Event(Added, Modified)
|
||||
, watchTree
|
||||
, withManager
|
||||
)
|
||||
import Unison.Names ( Names )
|
||||
import qualified Unison.TermPrinter as TermPrinter
|
||||
import Unison.Term ( Term )
|
||||
import qualified Unison.PrettyPrintEnv as PPE
|
||||
import Unison.Util.TQueue ( TQueue )
|
||||
import qualified Unison.Util.TQueue as TQueue
|
||||
import qualified Unison.Util.Pretty as P
|
||||
import Unison.Var ( Var )
|
||||
-- import Debug.Trace
|
||||
|
||||
watchDirectory' :: FilePath -> IO (IO (), IO (FilePath, UTCTime))
|
||||
|
@ -5,7 +5,7 @@ module Unison.FileParser where
|
||||
import qualified Unison.ABT as ABT
|
||||
import qualified Data.Set as Set
|
||||
import Control.Applicative
|
||||
import Control.Monad (void, guard)
|
||||
import Control.Monad (guard)
|
||||
import Control.Monad.Reader (local, ask)
|
||||
import Data.Either (partitionEithers)
|
||||
import Data.List (foldl')
|
||||
@ -39,7 +39,7 @@ file = do
|
||||
-- push names onto the stack ahead of existing names
|
||||
local (UF.names env `mappend`) $ do
|
||||
names <- ask
|
||||
stanzas <- sepBy semi stanza
|
||||
_stanzas <- sepBy semi stanza
|
||||
let terms = error "todo - create terms and watches from the stanzas"
|
||||
watches = []
|
||||
uf = UnisonFile (UF.datas env) (UF.effects env) terms watches
|
||||
@ -58,8 +58,8 @@ file = do
|
||||
-- which parses as [(Woot.x, 42), (Woot.y, 17)]
|
||||
|
||||
data Stanza v
|
||||
= WatchBinding Ann String ((Ann, v), AnnotatedTerm v Ann)
|
||||
| WatchExpression Ann String (AnnotatedTerm v Ann)
|
||||
= WatchBinding Ann ((Ann, v), AnnotatedTerm v Ann)
|
||||
| WatchExpression Ann (AnnotatedTerm v Ann)
|
||||
| Binding ((Ann, v), (AnnotatedTerm v Ann))
|
||||
| Bindings [((Ann, v), AnnotatedTerm v Ann)]
|
||||
|
||||
@ -67,22 +67,19 @@ stanza :: Var v => P v (Stanza v)
|
||||
stanza = watchExpression <|> binding <|> namespace
|
||||
where
|
||||
watchExpression = do
|
||||
(ann, msg) <- watched
|
||||
(WatchExpression ann msg <$> TermParser.blockTerm)
|
||||
<|> (WatchBinding ann msg <$> TermParser.binding)
|
||||
ann <- watched
|
||||
(WatchExpression ann <$> TermParser.blockTerm)
|
||||
<|> (WatchBinding ann <$> TermParser.binding)
|
||||
binding = Binding <$> TermParser.binding
|
||||
namespace = tweak <$> TermParser.namespaceBlock where
|
||||
tweak ns = Bindings (TermParser.toBindings [ns])
|
||||
|
||||
watched :: Var v => P v (Ann, String)
|
||||
watched :: Var v => P v Ann
|
||||
watched = P.try $ do
|
||||
op <- optional (L.payload <$> P.lookAhead symbolyId)
|
||||
guard (op == Just ">")
|
||||
cur <- P.lookAhead anyToken
|
||||
let a = ann cur
|
||||
(curLine, lineContents) <- currentLine
|
||||
_ <- anyToken -- consume the '>' token
|
||||
pure (a, lineContents)
|
||||
tok <- anyToken
|
||||
pure (ann tok)
|
||||
|
||||
terminateTerm :: Var v => AnnotatedTerm v Ann -> AnnotatedTerm v Ann
|
||||
terminateTerm e@(Term.LetRecNamedAnnotatedTop' top a bs body@(Term.Var' v))
|
||||
|
@ -4,12 +4,10 @@
|
||||
|
||||
module Unison.FileParsers where
|
||||
|
||||
import Control.Monad (foldM, join)
|
||||
import Control.Monad (foldM)
|
||||
import Control.Monad.Trans (lift)
|
||||
import Control.Monad.State (evalStateT)
|
||||
import Control.Monad.Writer (tell)
|
||||
import Data.Bytes.Put (runPutS)
|
||||
import Data.ByteString (ByteString)
|
||||
import qualified Data.Foldable as Foldable
|
||||
import Data.Map (Map)
|
||||
import qualified Data.Map as Map
|
||||
@ -21,7 +19,6 @@ import qualified Data.Sequence as Seq
|
||||
import Data.Text (Text, unpack)
|
||||
import qualified Unison.ABT as ABT
|
||||
import qualified Unison.Blank as Blank
|
||||
import qualified Unison.Codecs as Codecs
|
||||
import Unison.DataDeclaration (DataDeclaration',
|
||||
EffectDeclaration')
|
||||
import qualified Unison.Name as Name
|
||||
@ -107,7 +104,7 @@ synthesizeFile
|
||||
synthesizeFile preexistingTypes preexistingNames unisonFile = do
|
||||
let
|
||||
-- substitute builtins into the datas/effects/body of unisonFile
|
||||
uf@(UnisonFile dds0 eds0 terms watches) = unisonFile
|
||||
uf@(UnisonFile dds0 eds0 _terms _watches) = unisonFile
|
||||
term0 = UF.uberTerm uf
|
||||
localNames = UF.toNames uf
|
||||
localTypes = UF.declsToTypeLookup uf
|
||||
@ -129,7 +126,7 @@ synthesizeFile preexistingTypes preexistingNames unisonFile = do
|
||||
Result notes mayType =
|
||||
evalStateT (Typechecker.synthesizeAndResolve env0) tdnrTerm
|
||||
-- If typechecking succeeded, reapply the TDNR decisions to user's term:
|
||||
Result (convertNotes notes) mayType >>= \typ -> do
|
||||
Result (convertNotes notes) mayType >>= \_typ -> do
|
||||
let infos = Foldable.toList $ Typechecker.infos notes
|
||||
(topLevelComponents :: [[(v, Term v, Type v)]]) <-
|
||||
let
|
||||
|
@ -8,7 +8,6 @@
|
||||
module Unison.TermParser where
|
||||
|
||||
-- import Debug.Trace
|
||||
import qualified Data.Strings as Strings
|
||||
import qualified Data.Text as Text
|
||||
import Control.Applicative
|
||||
import Control.Monad (guard, join, when)
|
||||
|
@ -14,7 +14,6 @@ import qualified Data.Map as Map
|
||||
import Data.Maybe (catMaybes)
|
||||
import qualified Data.Set as Set
|
||||
import Data.Set (Set)
|
||||
import qualified Data.Text as Text
|
||||
import Unison.DataDeclaration (DataDeclaration')
|
||||
import Unison.DataDeclaration (EffectDeclaration' (..))
|
||||
import Unison.DataDeclaration (hashDecls, toDataDecl, withEffectDecl)
|
||||
|
@ -13,7 +13,6 @@ import EasyTest
|
||||
import System.FilePath (joinPath, splitPath)
|
||||
import System.FilePath.Find (always, extension, find, (==?))
|
||||
import qualified Unison.Builtin as Builtin
|
||||
import Unison.FileParsers (Type, Term)
|
||||
import Unison.Parser as Parser
|
||||
import qualified Unison.PrettyPrintEnv as PPE
|
||||
import qualified Unison.PrintError as PrintError
|
||||
@ -23,18 +22,20 @@ import Unison.Symbol (Symbol)
|
||||
import Unison.Test.Common (parseAndSynthesizeAsFile)
|
||||
import qualified Unison.UnisonFile as UF
|
||||
import Unison.Util.Monoid (intercalateMap)
|
||||
import Control.Arrow ((&&&))
|
||||
|
||||
type Note = Result.Note Symbol Parser.Ann
|
||||
|
||||
type TFile = UF.TypecheckedUnisonFile Symbol Ann
|
||||
type SynthResult =
|
||||
Result (Seq Note) (PrintError.Env, Maybe (Term Symbol, Type Symbol))
|
||||
type EitherResult = Either String (Term Symbol, Type Symbol)
|
||||
Result (Seq Note)
|
||||
(PrintError.Env, Maybe TFile)
|
||||
|
||||
type EitherResult = Either String TFile
|
||||
|
||||
ppEnv :: PPE.PrettyPrintEnv
|
||||
ppEnv = PPE.fromNames Builtin.names
|
||||
|
||||
expectRight' :: EitherResult -> Test (Term Symbol, Type Symbol)
|
||||
expectRight' :: Either String a -> Test a
|
||||
expectRight' (Left e) = crash e
|
||||
expectRight' (Right a) = ok >> pure a
|
||||
|
||||
@ -80,13 +81,13 @@ showNotes source env notes =
|
||||
intercalateMap "\n\n" (PrintError.renderNoteAsANSI env source) notes
|
||||
|
||||
decodeResult
|
||||
:: String -> SynthResult -> Either String (Term Symbol, Type Symbol)
|
||||
:: String -> SynthResult -> EitherResult-- String (UF.TypecheckedUnisonFile Symbol Ann)
|
||||
decodeResult source (Result notes Nothing) =
|
||||
Left $ showNotes source ppEnv notes
|
||||
decodeResult source (Result notes (Just (env, Nothing))) =
|
||||
Left $ showNotes source env notes
|
||||
decodeResult _source (Result _notes (Just (_env, Just (t, typ)))) =
|
||||
Right (t, typ)
|
||||
decodeResult _source (Result _notes (Just (_env, Just uf))) =
|
||||
Right uf
|
||||
|
||||
makePassingTest :: (EitherResult -> Test ()) -> FilePath -> Test ()
|
||||
makePassingTest how filepath = join $ do
|
||||
@ -97,6 +98,5 @@ makePassingTest how filepath = join $ do
|
||||
$ scope shortName
|
||||
. how
|
||||
. decodeResult source
|
||||
. fmap (fmap (fmap (UF.topLevelTerm &&& UF.typ)))
|
||||
. parseAndSynthesizeAsFile shortName
|
||||
$ source
|
||||
|
Loading…
Reference in New Issue
Block a user