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 as Module
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.Region as R
15import qualified Canonicalize.Environment as Env
16import qualified Canonicalize.Result as Result
17import Elm.Utils ((|>))
20variable :: R.Region -> Env.Environment -> String -> Result.ResultErr Var.Canonical
21variable region env var =
24 | Module.nameIsNative name ->
25 Result.var (Var.Canonical (Var.Module name) varName)
28 case Set.toList `fmap` Map.lookup var (Env._values env) of
33 preferLocals region env "variable" vs var
36 notFound region "variable" (Map.keys (Env._values env)) var
46 (Var.Canonical, [String], Type.Canonical)
49 case adts ++ aliases of
50 [] -> notFound region "type" (Map.keys (Env._adts env) ++ Map.keys (Env._aliases env)) var
51 [v] -> Result.var' extract v
52 vs -> preferLocals' region env extract "type" vs var
55 map Left (maybe [] Set.toList (Map.lookup var (Env._adts env)))
58 map Right (maybe [] Set.toList (Map.lookup var (Env._aliases env)))
71 -> Result.ResultErr Var.Canonical
72pvar region env var actualArgs =
73 case Set.toList `fmap` Map.lookup var (Env._patterns env) of
78 preferLocals' region env fst "pattern" values var
79 `Result.andThen` foundArgCheck
82 notFound region "pattern" (Map.keys (Env._patterns env)) var
84 foundArgCheck (name, expectedArgs) =
85 if actualArgs == expectedArgs
87 else Result.err (A.A region (Error.argMismatch name expectedArgs actualArgs))
98 -> Result.ResultErr Var.Canonical
99preferLocals region env =
100 preferLocals' region env id
106 -> (a -> Var.Canonical)
110 -> Result.ResultErr a
111preferLocals' region env extract kind possibilities var =
112 case filter (isLocal . extract) possibilities of
114 ambiguous possibilities
117 Result.var' extract v
122 isLocal :: Var.Canonical -> Bool
123 isLocal (Var.Canonical home _) =
128 name == Env._home env
130 ambiguous possibleVars =
131 Result.err (A.A region (Error.variable kind var Error.Ambiguous vars))
133 vars = map (Var.toString . extract) possibleVars
139 Either String (Module.Name, String)
142toVarName :: String -> VarName
144 case Help.splitDots var of
146 xs -> Right (init xs, last xs)
149noQualifier :: VarName -> String
156qualifiedToString :: (Module.Name, String) -> String
157qualifiedToString (modul, name) =
158 Module.nameToString (modul ++ [name])
161isOp :: VarName -> Bool
163 Help.isOp (noQualifier name)
168notFound :: R.Region -> String -> [String] -> String -> Result.ResultErr a
169notFound region kind possibilities var =
174 map toVarName possibilities
176 (problem, suggestions) =
179 exposedProblem name possibleNames
181 Right (modul, varName) ->
182 qualifiedProblem modul varName (Either.rights possibleNames)
184 Result.err (A.A region (Error.variable kind var problem suggestions))
187exposedProblem :: VarName -> [VarName] -> (Error.VarProblem, [String])
188exposedProblem name possibleNames =
189 let (exposed, qualified) =
191 |> filter (\n -> isOp name == isOp n)
192 |> Error.nearbyNames noQualifier name
193 |> Either.partitionEithers
195 ( Error.ExposedUnknown
196 , exposed ++ map qualifiedToString qualified
203 -> [(Module.Name, String)]
204 -> (Error.VarProblem, [String])
205qualifiedProblem moduleName name allQualified =
206 let availableModules =
207 Set.fromList (map fst allQualified)
210 Module.nameToString moduleName
212 case Set.member moduleName availableModules of
214 ( Error.QualifiedUnknown moduleNameString
216 |> filter ((==) moduleName . fst)
218 |> Error.nearbyNames id name
222 ( Error.UnknownQualifier moduleNameString
223 , Set.toList availableModules
224 |> map Module.nameToString
225 |> 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