Skip to content

Commit 8369db4

Browse files
matthewleongaryb
authored andcommitted
create UnusedIdent (purescript#3194)
Fixes purescript#3187 Rather than using the magic string "__unused" to represent generated names that are meant to go unused, we create a new Ident constructor for them. Instead of eliminating them as arguments in the optimization phase, they are stripped during the conversion from CoreFn to CoreImp.
1 parent 950f184 commit 8369db4

12 files changed

Lines changed: 31 additions & 23 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module Main (main) where
2+
3+
import Prelude ((+))
4+
import Control.Monad.Eff.Console (log)
5+
6+
-- the __unused parameter used to get optimized away
7+
abuseUnused :: forall a. a -> a
8+
abuseUnused __unused = __unused
9+
10+
main = do
11+
let explode = abuseUnused 0 + abuseUnused 0
12+
log "Done"

src/Language/PureScript/CodeGen/JS.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ moduleToJs (Module coms mn _ imps exps foreigns decls) foreign_ =
164164
accessor :: Ident -> AST -> AST
165165
accessor (Ident prop) = accessorString $ mkString prop
166166
accessor (GenIdent _ _) = internalError "GenIdent in accessor"
167+
accessor UnusedIdent = internalError "UnusedIdent in accessor"
167168

168169
accessorString :: PSString -> AST -> AST
169170
accessorString prop = AST.Indexer Nothing (AST.StringLiteral Nothing prop)
@@ -199,7 +200,10 @@ moduleToJs (Module coms mn _ imps exps foreigns decls) foreign_ =
199200
(var name)
200201
valueToJs' (Abs _ arg val) = do
201202
ret <- valueToJs val
202-
return $ AST.Function Nothing Nothing [identToJs arg] (AST.Block Nothing [AST.Return Nothing ret])
203+
let jsArg = case arg of
204+
UnusedIdent -> []
205+
_ -> [identToJs arg]
206+
return $ AST.Function Nothing Nothing jsArg (AST.Block Nothing [AST.Return Nothing ret])
203207
valueToJs' e@App{} = do
204208
let (f, args) = unApp e []
205209
args' <- mapM valueToJs args

src/Language/PureScript/CodeGen/JS/Common.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ moduleNameToJs (ModuleName pns) =
2626
identToJs :: Ident -> Text
2727
identToJs (Ident name) = properToJs name
2828
identToJs (GenIdent _ _) = internalError "GenIdent in identToJs"
29+
identToJs UnusedIdent = "$__unused"
2930

3031
properToJs :: Text -> Text
3132
properToJs name

src/Language/PureScript/Constants.hs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -418,11 +418,6 @@ typ = "Type"
418418
symbol :: forall a. (IsString a) => a
419419
symbol = "Symbol"
420420

421-
-- Code Generation
422-
423-
__unused :: forall a. (IsString a) => a
424-
__unused = "__unused"
425-
426421
-- Modules
427422

428423
prim :: forall a. (IsString a) => a

src/Language/PureScript/CoreImp/Optimizer.hs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ optimize js = do
4444
[ collapseNestedBlocks
4545
, collapseNestedIfs
4646
, removeCodeAfterReturnStatements
47-
, removeUnusedArg
4847
, removeUndefinedApp
4948
, unThunk
5049
, etaConvert

src/Language/PureScript/CoreImp/Optimizer/Unused.hs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
-- | Removes unused variables
22
module Language.PureScript.CoreImp.Optimizer.Unused
33
( removeCodeAfterReturnStatements
4-
, removeUnusedArg
54
, removeUndefinedApp
65
) where
76

@@ -21,12 +20,6 @@ removeCodeAfterReturnStatements = everywhere (removeFromBlock go)
2120
isReturn (ReturnNoResult _) = True
2221
isReturn _ = False
2322

24-
removeUnusedArg :: AST -> AST
25-
removeUnusedArg = everywhere convert
26-
where
27-
convert (Function ss name [arg] body) | arg == C.__unused = Function ss name [] body
28-
convert js = js
29-
3023
removeUndefinedApp :: AST -> AST
3124
removeUndefinedApp = everywhere convert
3225
where

src/Language/PureScript/Linter/Exhaustive.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,11 +291,11 @@ checkExhaustive ss env mn numArgs cas expr = makeResult . first ordNub $ foldl'
291291
return $
292292
Let
293293
[ partial var tyVar ]
294-
$ App (Var (Qualified Nothing (Ident C.__unused))) e
294+
$ App (Var (Qualified Nothing UnusedIdent)) e
295295
where
296296
partial :: Text -> Text -> Declaration
297297
partial var tyVar =
298-
ValueDecl (ss, []) (Ident C.__unused) Private [] $
298+
ValueDecl (ss, []) UnusedIdent Private [] $
299299
[MkUnguarded
300300
(TypedValue
301301
True

src/Language/PureScript/Names.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ data Ident
7676
-- A generated name for an identifier
7777
--
7878
| GenIdent (Maybe Text) Integer
79+
-- |
80+
-- A generated name used only for type-checking
81+
--
82+
| UnusedIdent
7983
deriving (Show, Eq, Ord, Generic)
8084

8185
instance NFData Ident
@@ -84,6 +88,7 @@ runIdent :: Ident -> Text
8488
runIdent (Ident i) = i
8589
runIdent (GenIdent Nothing n) = "$" <> T.pack (show n)
8690
runIdent (GenIdent (Just name) n) = "$" <> name <> T.pack (show n)
91+
runIdent UnusedIdent = "$__unused"
8792

8893
showIdent :: Ident -> Text
8994
showIdent = runIdent

src/Language/PureScript/Renamer.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import qualified Data.Text as T
1717
import Language.PureScript.CoreFn
1818
import Language.PureScript.Names
1919
import Language.PureScript.Traversals
20-
import qualified Language.PureScript.Constants as C
2120

2221
-- |
2322
-- The state object used in this module
@@ -62,8 +61,8 @@ newScope x = do
6261
updateScope :: Ident -> Rename Ident
6362
updateScope ident =
6463
case ident of
65-
Ident name | name == C.__unused -> return ident
6664
GenIdent name _ -> go ident $ Ident (fromMaybe "v" name)
65+
UnusedIdent -> return UnusedIdent
6766
_ -> go ident ident
6867
where
6968
go :: Ident -> Ident -> Rename Ident
@@ -88,7 +87,7 @@ updateScope ident =
8887
-- Finds the new name to use for an ident.
8988
--
9089
lookupIdent :: Ident -> Rename Ident
91-
lookupIdent i@(Ident name) | name == C.__unused = return i
90+
lookupIdent UnusedIdent = return UnusedIdent
9291
lookupIdent name = do
9392
name' <- gets $ M.lookup name . rsBoundNames
9493
case name' of

src/Language/PureScript/Sugar/DoNotation.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ desugarDo d =
4444
go [DoNotationValue val] = return val
4545
go (DoNotationValue val : rest) = do
4646
rest' <- go rest
47-
return $ App (App discard val) (Abs (VarBinder (Ident C.__unused)) rest')
47+
return $ App (App discard val) (Abs (VarBinder UnusedIdent) rest')
4848
go [DoNotationBind _ _] = throwError . errorMessage $ InvalidDoBind
4949
go (DoNotationBind b _ : _) | First (Just ident) <- foldMap fromIdent (binderNames b) =
5050
throwError . errorMessage $ CannotUseBindWithDo (Ident ident)

0 commit comments

Comments
 (0)