1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Variable where
4import qualified Data.Either as Either
5import qualified Data.Map as Map
6import qualified Data.Set as Set
8import qualified AST.Helpers as Help
9import qualified AST.Module.Name as ModuleName
10import qualified AST.Type as Type
11import qualified AST.Variable as Var
12import qualified Reporting.Annotation as A
13import qualified Reporting.Error.Canonicalize as Error
14import qualified Reporting.Error.Helpers as Error
15import qualified Reporting.Region as R
16import qualified Canonicalize.Environment as Env
17import qualified Canonicalize.Result as Result
18import Elm.Utils ((|>))
21variable :: R.Region -> Env.Environment -> String -> Result.ResultErr Var.Canonical
22variable region env var =
25 | ModuleName.isNative name ->
26 error "TODO" "Result.var (Var.Canonical (Var.Module name) varName)"
29 case Set.toList `fmap` Map.lookup var (Env._values env) of
34 preferLocals region env "variable" vs var
37 notFound region "variable" (Map.keys (Env._values env)) var
47 (Var.Canonical, [String], Type.Canonical)
50 case adts ++ aliases of
51 [] -> notFound region "type" (Map.keys (Env._adts env) ++ Map.keys (Env._aliases env)) var
52 [v] -> Result.var' extract v
53 vs -> preferLocals' region env extract "type" vs var
56 map Left (maybe [] Set.toList (Map.lookup var (Env._adts env)))
59 map Right (maybe [] Set.toList (Map.lookup var (Env._aliases env)))
72 -> Result.ResultErr Var.Canonical
73pvar region env var actualArgs =
74 case Set.toList `fmap` Map.lookup var (Env._patterns env) of
79 preferLocals' region env fst "pattern" values var
80 `Result.andThen` foundArgCheck
83 notFound region "pattern" (Map.keys (Env._patterns env)) var
85 foundArgCheck (name, expectedArgs) =
86 if actualArgs == expectedArgs
88 else Result.err (A.A region (Error.argMismatch name expectedArgs actualArgs))
99 -> Result.ResultErr Var.Canonical
100preferLocals region env =
101 preferLocals' region env id
107 -> (a -> Var.Canonical)
111 -> Result.ResultErr a
112preferLocals' region env extract kind possibilities var =
113 case filter (isLocal (Env._home env) . extract) possibilities of
115 ambiguous possibilities
118 Result.var' extract v
120 --Local vars shadow top-level vars
122 | isTopLevel (extract v1) ->
123 Result.var' extract v2
125 | isTopLevel (extract v2) ->
126 Result.var' extract v1
131 ambiguous possibleVars =
132 Result.err (A.A region (Error.variable kind var Error.Ambiguous vars))
134 vars = map (Var.toString . extract) possibleVars
137isLocal :: ModuleName.Canonical -> Var.Canonical -> Bool
138isLocal contextName (Var.Canonical home _) =
153isTopLevel :: Var.Canonical -> Bool
154isTopLevel (Var.Canonical home _) =
166 Either String (ModuleName.Raw, String)
169toVarName :: String -> VarName
171 case Help.splitDots var of
173 xs -> Right (init xs, last xs)
176noQualifier :: VarName -> String
183qualifiedToString :: (ModuleName.Raw, String) -> String
184qualifiedToString (modul, name) =
185 ModuleName.toString modul ++ "." ++ name
188isOp :: VarName -> Bool
190 Help.isOp (noQualifier name)
195notFound :: R.Region -> String -> [String] -> String -> Result.ResultErr a
196notFound region kind possibilities var =
201 map toVarName possibilities
203 (problem, suggestions) =
206 exposedProblem name possibleNames
208 Right (modul, varName) ->
209 qualifiedProblem modul varName (Either.rights possibleNames)
211 Result.err (A.A region (Error.variable kind var problem suggestions))
214exposedProblem :: VarName -> [VarName] -> (Error.VarProblem, [String])
215exposedProblem name possibleNames =
216 let (exposed, qualified) =
218 |> filter (\n -> isOp name == isOp n)
219 |> Error.nearbyNames noQualifier name
220 |> Either.partitionEithers
222 ( Error.ExposedUnknown
223 , exposed ++ map qualifiedToString qualified
230 -> [(ModuleName.Raw, String)]
231 -> (Error.VarProblem, [String])
232qualifiedProblem moduleName name allQualified =
233 let availableModules =
234 Set.fromList (map fst allQualified)
237 ModuleName.toString moduleName
239 case Set.member moduleName availableModules of
241 ( Error.QualifiedUnknown moduleNameString name
243 |> filter ((==) moduleName . fst)
245 |> Error.nearbyNames id name
249 ( Error.UnknownQualifier moduleNameString name
250 , Set.toList availableModules
251 |> map ModuleName.toString
252 |> Error.nearbyNames id moduleNameString
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list