2020-08-11 12:32:09 +04:00

77 lines
1.5 KiB
Haskell

module AST.Find where
import Control.Monad
import AST.Types
import AST.Scope
import AST.Parser
import Tree
import Range
import Pretty
import Product
-- import Debug.Trace
findScopedDecl
:: ( Contains [ScopedDecl] xs
, Contains Range xs
, Contains (Maybe Category) xs
)
=> Range
-> Pascal (Product xs)
-> Maybe ScopedDecl
findScopedDecl pos tree = do
pt <- lookupTree pos tree
let info = infoOf pt
let fullEnv = getElem info
do
categ <- getElem info
let filtered = filter (ofCategory categ) fullEnv
lookupEnv (ppToText $ void pt) filtered
definitionOf
:: ( Contains [ScopedDecl] xs
, Contains Range xs
, Contains (Maybe Category) xs
)
=> Range
-> Pascal (Product xs)
-> Maybe Range
definitionOf pos tree =
_sdOrigin <$> findScopedDecl pos tree
typeOf
:: ( Contains [ScopedDecl] xs
, Contains Range xs
, Contains (Maybe Category) xs
)
=> Range
-> Pascal (Product xs)
-> Maybe (Either (Pascal ()) Kind)
typeOf pos tree =
_sdType =<< findScopedDecl pos tree
implementationOf
:: ( Contains [ScopedDecl] xs
, Contains Range xs
, Contains (Maybe Category) xs
)
=> Range
-> Pascal (Product xs)
-> Maybe Range
implementationOf pos tree =
_sdBody =<< findScopedDecl pos tree
referencesOf
:: ( Contains [ScopedDecl] xs
, Contains Range xs
, Contains (Maybe Category) xs
)
=> Range
-> Pascal (Product xs)
-> Maybe [Range]
referencesOf pos tree =
_sdRefs <$> findScopedDecl pos tree