Add basic code completion mechanism
This commit is contained in:
parent
08a0eb55d1
commit
107018e6f3
@ -8,3 +8,4 @@ import AST.Types as M
|
|||||||
import AST.Parser as M
|
import AST.Parser as M
|
||||||
import AST.Scope as M
|
import AST.Scope as M
|
||||||
import AST.Find as M
|
import AST.Find as M
|
||||||
|
import AST.Completion as M
|
||||||
|
52
tools/lsp/squirrel/src/AST/Completion.hs
Normal file
52
tools/lsp/squirrel/src/AST/Completion.hs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
module AST.Completion where
|
||||||
|
|
||||||
|
import Data.Text (Text)
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
import Data.Maybe (listToMaybe)
|
||||||
|
import Data.List (isSubsequenceOf, nub)
|
||||||
|
|
||||||
|
import Duplo.Tree
|
||||||
|
import Duplo.Lattice
|
||||||
|
import Duplo.Pretty
|
||||||
|
|
||||||
|
import AST.Types
|
||||||
|
import AST.Scope
|
||||||
|
import AST.Parser
|
||||||
|
import Range
|
||||||
|
import Product
|
||||||
|
|
||||||
|
import Debug.Trace
|
||||||
|
|
||||||
|
|
||||||
|
complete
|
||||||
|
:: ( Eq (Product xs)
|
||||||
|
, Modifies (Product xs)
|
||||||
|
, Contains Range xs
|
||||||
|
, Contains [ScopedDecl] xs
|
||||||
|
, Contains (Maybe Category) xs
|
||||||
|
)
|
||||||
|
=> Range
|
||||||
|
-> LIGO (Product xs)
|
||||||
|
-> Maybe [Text]
|
||||||
|
complete r tree = do
|
||||||
|
let l = spineTo (leq r . getElem) tree
|
||||||
|
word <- listToMaybe l
|
||||||
|
let scope = getElem (extract word)
|
||||||
|
let cat = getElem (extract word)
|
||||||
|
return
|
||||||
|
$ filter (isSubseqOf (ppToText word))
|
||||||
|
$ nub
|
||||||
|
$ map (ppToText . _sdName)
|
||||||
|
$ filter (fits cat . catFromType)
|
||||||
|
$ scope
|
||||||
|
|
||||||
|
isSubseqOf :: Text -> Text -> Bool
|
||||||
|
isSubseqOf l r = isSubsequenceOf (Text.unpack l) (Text.unpack r)
|
||||||
|
|
||||||
|
fits :: Maybe Category -> Category -> Bool
|
||||||
|
fits Nothing _ = True
|
||||||
|
fits (Just c) c' = c == c'
|
||||||
|
|
||||||
|
catFromType :: ScopedDecl -> Category
|
||||||
|
catFromType = maybe Variable (either (const Variable) (const Type)) . _sdType
|
3
tools/lsp/squirrel/src/AST/Folding.hs
Normal file
3
tools/lsp/squirrel/src/AST/Folding.hs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
module AST.Folding where
|
||||||
|
|
@ -45,7 +45,8 @@ import Debug.Trace
|
|||||||
-- example = "../../../src/test/contracts/blockless.ligo"
|
-- example = "../../../src/test/contracts/blockless.ligo"
|
||||||
-- example = "../../../src/test/contracts/bytes_arithmetic.ligo"
|
-- example = "../../../src/test/contracts/bytes_arithmetic.ligo"
|
||||||
-- example = "../../../src/test/contracts/chain_id.ligo"
|
-- example = "../../../src/test/contracts/chain_id.ligo"
|
||||||
example = "../../../src/test/contracts/closure-3.ligo"
|
-- example = "../../../src/test/contracts/closure-3.ligo"
|
||||||
|
example = "../../../src/test/contracts/coase.ligo"
|
||||||
|
|
||||||
sample' :: FilePath -> IO (LIGO Info)
|
sample' :: FilePath -> IO (LIGO Info)
|
||||||
sample' f
|
sample' f
|
||||||
|
@ -102,11 +102,11 @@ ofCategory _ _ = False
|
|||||||
|
|
||||||
type Info' = Product [[ScopedDecl], Maybe Category, [Text], Range, ShowRange]
|
type Info' = Product [[ScopedDecl], Maybe Category, [Text], Range, ShowRange]
|
||||||
|
|
||||||
instance Modifies (Product '[[ScopedDecl], Maybe Category, [Text], Range, a]) where
|
-- instance Modifies (Product '[[ScopedDecl], Maybe Category, [Text], Range, a]) where
|
||||||
ascribe (ds :> _ :> _ :> r :> _) d =
|
-- ascribe (ds :> _ :> _ :> r :> _) d =
|
||||||
color 3 (fsep (map (pp . _sdName) ds))
|
-- color 3 (fsep (map (pp . _sdName) ds))
|
||||||
$$ pp r
|
-- $$ pp r
|
||||||
$$ d
|
-- $$ d
|
||||||
|
|
||||||
addLocalScopes
|
addLocalScopes
|
||||||
:: forall xs
|
:: forall xs
|
||||||
|
@ -70,7 +70,7 @@ srcToBytestring = \case
|
|||||||
type RawTree = Tree '[ParseTree] RawInfo
|
type RawTree = Tree '[ParseTree] RawInfo
|
||||||
type RawInfo = Product [Range, Text]
|
type RawInfo = Product [Range, Text]
|
||||||
|
|
||||||
instance Modifies RawInfo where
|
instance {-# OVERLAPS #-} Modifies RawInfo where
|
||||||
ascribe (r :> n :> _) d = color 3 (pp n) <+> pp r `indent` pp d
|
ascribe (r :> n :> _) d = color 3 (pp n) <+> pp r `indent` pp d
|
||||||
|
|
||||||
-- | The tree tree-sitter produces.
|
-- | The tree tree-sitter produces.
|
||||||
|
@ -111,8 +111,16 @@ instance Pretty ShowRange where
|
|||||||
type Info = Product [[Text], Range, ShowRange]
|
type Info = Product [[Text], Range, ShowRange]
|
||||||
type PreInfo = Product [Range, ShowRange]
|
type PreInfo = Product [Range, ShowRange]
|
||||||
|
|
||||||
instance Modifies Info where
|
instance
|
||||||
ascribe (comms :> r :> pin :> _) = ascribeRange r pin . ascribeComms comms
|
( Contains Range xs
|
||||||
|
, Contains [Text] xs
|
||||||
|
, Contains ShowRange xs
|
||||||
|
)
|
||||||
|
=> Modifies (Product xs)
|
||||||
|
where
|
||||||
|
ascribe xs
|
||||||
|
= ascribeRange (getElem @Range xs) (getElem xs)
|
||||||
|
. ascribeComms (getElem xs)
|
||||||
|
|
||||||
ascribeComms comms
|
ascribeComms comms
|
||||||
| null comms = id
|
| null comms = id
|
||||||
|
@ -15,7 +15,7 @@ extra-deps:
|
|||||||
- semilattices-0.0.0.4@sha256:333707e460923711d1edbdd02ebe1c3957d4e0808eab9886747b52ee3e443639,1909
|
- semilattices-0.0.0.4@sha256:333707e460923711d1edbdd02ebe1c3957d4e0808eab9886747b52ee3e443639,1909
|
||||||
- fastsum-0.1.1.1
|
- fastsum-0.1.1.1
|
||||||
- git: https://github.com/serokell/duplo.git
|
- git: https://github.com/serokell/duplo.git
|
||||||
commit: 0cc243e90bc497989ec48417a6b5a5ce6a01759f
|
commit: 60983e6e1fd21eba57af83da7d541fe555678cc8
|
||||||
|
|
||||||
nix:
|
nix:
|
||||||
packages: [zlib]
|
packages: [zlib]
|
@ -45,11 +45,11 @@ packages:
|
|||||||
git: https://github.com/serokell/duplo.git
|
git: https://github.com/serokell/duplo.git
|
||||||
pantry-tree:
|
pantry-tree:
|
||||||
size: 557
|
size: 557
|
||||||
sha256: e8618a84baa4c24a1cabc47008cc12bbb7bd52b6fd8acaff6c4871201509c2ac
|
sha256: b00e0db1d2c3c0db58e90a69415f6cdc4d416ff6e50789f2de841fc60e2f2ffb
|
||||||
commit: 0cc243e90bc497989ec48417a6b5a5ce6a01759f
|
commit: 60983e6e1fd21eba57af83da7d541fe555678cc8
|
||||||
original:
|
original:
|
||||||
git: https://github.com/serokell/duplo.git
|
git: https://github.com/serokell/duplo.git
|
||||||
commit: 0cc243e90bc497989ec48417a6b5a5ce6a01759f
|
commit: 60983e6e1fd21eba57af83da7d541fe555678cc8
|
||||||
snapshots:
|
snapshots:
|
||||||
- completed:
|
- completed:
|
||||||
size: 493124
|
size: 493124
|
||||||
|
Loading…
Reference in New Issue
Block a user