1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Variable (Result, variable, tvar, pvar) 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 Canonicalize.Environment as Env
13import qualified Reporting.Error.Canonicalize as Error
14import qualified Reporting.Error.Helpers as Error
15import qualified Reporting.Region as R
16import qualified Reporting.Result as Result
17import qualified Reporting.Warning as Warning
18import Elm.Utils ((|>))
26 Result.Result (Set.Set ModuleName.Raw) Warning.Warning Error.Error a
29logVarWith :: (a -> Var.Canonical) -> a -> Result a
30logVarWith toVar value =
32 Var.Canonical (Var.Module (ModuleName.Canonical _ moduleName)) _name ->
33 Result.accumulate (Set.singleton moduleName) value
39logVar :: Var.Canonical -> Result Var.Canonical
48variable :: R.Region -> Env.Environment -> String -> Result Var.Canonical
49variable region env var =
51 Right (name, varName) | ModuleName.isNative name ->
54 ModuleName._package (Env._home env)
57 ModuleName.Canonical localPkg name
59 logVar (Var.Canonical (Var.Module moduleName) varName)
62 case Set.toList <$> Map.lookup var (Env._values env) of
67 preferLocals region env "variable" vs var
70 notFound region "variable" (Map.keys (Env._values env)) var
80 (Var.Canonical, [String], Type.Canonical)
83 case unions ++ aliases of
84 [] -> notFound region "type" (Map.keys (Env._unions env) ++ Map.keys (Env._aliases env)) var
85 [v] -> logVarWith extract v
86 vs -> preferLocals' region env extract "type" vs var
89 map Left (maybe [] Set.toList (Map.lookup var (Env._unions env)))
92 map Right (maybe [] Set.toList (Map.lookup var (Env._aliases env)))
105 -> Result Var.Canonical
106pvar region env var actualArgs =
107 case Set.toList <$> Map.lookup var (Env._patterns env) of
112 foundArgCheck =<< preferLocals' region env fst "pattern" values var
115 notFound region "pattern" (Map.keys (Env._patterns env)) var
117 foundArgCheck (name, expectedArgs) =
118 if actualArgs == expectedArgs then
122 Result.throw region (Error.argMismatch name expectedArgs actualArgs)
135 -> Result Var.Canonical
136preferLocals region env =
137 preferLocals' region env id
143 -> (a -> Var.Canonical)
148preferLocals' region env extract kind possibilities var =
149 case filter (isLocal (Env._home env) . extract) possibilities of
151 ambiguous possibilities
156 --Local vars shadow top-level vars
158 | isTopLevel (extract v1) ->
159 logVarWith extract v2
161 | isTopLevel (extract v2) ->
162 logVarWith extract v1
167 ambiguous possibleVars =
168 Result.throw region (Error.variable kind var Error.Ambiguous vars)
170 vars = map (Var.toString . extract) possibleVars
173isLocal :: ModuleName.Canonical -> Var.Canonical -> Bool
174isLocal contextName (Var.Canonical home _) =
189isTopLevel :: Var.Canonical -> Bool
190isTopLevel (Var.Canonical home _) =
204 Either String (ModuleName.Raw, String)
207toVarName :: String -> VarName
209 case Help.splitDots var of
211 xs -> Right (init xs, last xs)
214noQualifier :: VarName -> String
221qualifiedToString :: (ModuleName.Raw, String) -> String
222qualifiedToString (modul, name) =
223 ModuleName.toString modul ++ "." ++ name
226isOp :: VarName -> Bool
228 Help.isOp (noQualifier name)
235notFound :: R.Region -> String -> [String] -> String -> Result a
236notFound region kind possibilities var =
241 map toVarName possibilities
243 (problem, suggestions) =
246 exposedProblem name possibleNames
248 Right (modul, varName) ->
249 qualifiedProblem modul varName (Either.rights possibleNames)
251 Result.throw region (Error.variable kind var problem suggestions)
254exposedProblem :: VarName -> [VarName] -> (Error.VarProblem, [String])
255exposedProblem name possibleNames =
256 let (exposed, qualified) =
258 |> filter (\n -> isOp name == isOp n)
259 |> Error.nearbyNames noQualifier name
260 |> Either.partitionEithers
262 ( Error.ExposedUnknown
263 , exposed ++ map qualifiedToString qualified
270 -> [(ModuleName.Raw, String)]
271 -> (Error.VarProblem, [String])
272qualifiedProblem moduleName name allQualified =
273 let availableModules =
274 Set.fromList (map fst allQualified)
277 ModuleName.toString moduleName
279 case Set.member moduleName availableModules of
281 ( Error.QualifiedUnknown moduleNameString name
283 |> filter ((==) moduleName . fst)
285 |> Error.nearbyNames id name
289 ( Error.UnknownQualifier moduleNameString name
290 , Set.toList availableModules
291 |> map ModuleName.toString
292 |> 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