on master help sign in
Enforce locals shadowing top-levels
91bc3a4jmite
src/Canonicalize/Variable.hs+14−1
@@ -117,6 +117,13 @@ preferLocals' region env extract kind possibilities var =
117 [v] ->
117 [v] ->
118 Result.var' extract v
118 Result.var' extract v
119
119
120+ --Local vars shadow top-level vars
121+ [v1, v2] | isTopLevel (extract v1) ->
122+ Result.var' extract v2
123+
124+ [v1, v2] | isTopLevel (extract v2) ->
125+ Result.var' extract v1
126+
120 locals ->
127 locals ->
121 ambiguous locals
128 ambiguous locals
122 where
129 where
@@ -129,10 +136,16 @@ preferLocals' region env extract kind possibilities var =
129 Var.Module name ->
136 Var.Module name ->
130 name == Env._home env
137 name == Env._home env
131
138
139+ isTopLevel :: Var.Canonical -> Bool
140+ isTopLevel (Var.Canonical home _) =
141+ case home of
142+ Var.TopLevel _ -> True
143+ _ -> False
144+
132 ambiguous possibleVars =
145 ambiguous possibleVars =
133 Result.err (A.A region (Error.variable kind var Error.Ambiguous vars))
146 Result.err (A.A region (Error.variable kind var Error.Ambiguous vars))
134 where
147 where
135− vars = map (Var.toString . extract) possibleVars
148+ vars = map (show {-Var.toString-} . extract) possibleVars
136
149
137
150
138-- NOT FOUND HELPERS
151-- NOT FOUND HELPERS
src/Generate/JavaScript.hs+8
@@ -351,6 +351,12 @@ isTailCall tcc (A.A _ func) arity =
351 else
351 else
352 Nothing
352 Nothing
353
353
354+ (Var (Var.Canonical (Var.TopLevel _) name), Just (tcName, tcArgs, tcLabel)) ->
355+ if name == tcName && length tcArgs == arity then
356+ Just (tcArgs, tcLabel)
357+ else
358+ Nothing
359+
354 _ ->
360 _ ->
355 Nothing
361 Nothing
356
362
@@ -516,6 +522,8 @@ generateCase tcc expr branches =
516 case expr of
522 case expr of
517 A.A _ (Var (Var.Canonical Var.Local x)) ->
523 A.A _ (Var (Var.Canonical Var.Local x)) ->
518 return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
524 return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
525+ A.A _ (Var (Var.Canonical (Var.TopLevel _) x)) ->
526+ return (Case.matchSubst [(tempVar, Var.varName x)] initialMatch, [])
519 _ ->
527 _ ->
520 do expr' <- toJsExpr expr
528 do expr' <- toJsExpr expr
521 return (initialMatch, [VarDeclStmt () [varDecl tempVar expr']])
529 return (initialMatch, [VarDeclStmt () [varDecl tempVar expr']])
src/Optimize/TailCalls.hs+2
@@ -130,6 +130,8 @@ findTailCalls context annExpr@(A.A _ expression) =
130 case (context, func) of
130 case (context, func) of
131 ( Just (name, argNum), A.A _ (Var (Var.Canonical Var.Local name')) ) ->
131 ( Just (name, argNum), A.A _ (Var (Var.Canonical Var.Local name')) ) ->
132 name == name' && length args == argNum
132 name == name' && length args == argNum
133+ ( Just (name, argNum), A.A _ (Var (Var.Canonical (Var.TopLevel _) name')) ) ->
134+ name == name' && length args == argNum
133 _ ->
135 _ ->
134 False
136 False
135
137