diff --git a/CHANGELOG.d/fix_bundle-function-declarations.md b/CHANGELOG.d/fix_bundle-function-declarations.md new file mode 100644 index 0000000000..ce613debd4 --- /dev/null +++ b/CHANGELOG.d/fix_bundle-function-declarations.md @@ -0,0 +1 @@ +* Do not remove bindings referenced in function declarations when bundling diff --git a/src/Language/PureScript/Bundle.hs b/src/Language/PureScript/Bundle.hs index 734c61da8c..0ab9e79589 100644 --- a/src/Language/PureScript/Bundle.hs +++ b/src/Language/PureScript/Bundle.hs @@ -474,6 +474,10 @@ matchMember stmt , JSIdentifier _ name <- var , JSVarInit _ decl <- varInit = Just (Internal, name, decl) + -- function foo(...args) { body } + | JSFunction a0 jsIdent a1 args a2 body _ <- stmt + , JSIdentName _ name <- jsIdent + = pure (Internal, name, JSFunctionExpression a0 jsIdent a1 args a2 body) -- exports.foo = expr; exports["foo"] = expr; | JSAssignStatement e (JSAssign _) decl _ <- stmt , Just name <- exportsAccessor e diff --git a/tests/purs/bundle/FunctionDeclaration.js b/tests/purs/bundle/FunctionDeclaration.js new file mode 100644 index 0000000000..6d7bfdc1e0 --- /dev/null +++ b/tests/purs/bundle/FunctionDeclaration.js @@ -0,0 +1,19 @@ +"use strict"; + +var foo = 0; + +function bar(foo) { + return foo; +} + +var baz = "Done"; + +function qux() { + return bar(baz); +} + +exports.qux = qux; + +var fs = require('fs'); +var source = fs.readFileSync(__filename, 'utf-8'); +exports.fooIsEliminated = !/^ *var foo/m.test(source); diff --git a/tests/purs/bundle/FunctionDeclaration.purs b/tests/purs/bundle/FunctionDeclaration.purs new file mode 100644 index 0000000000..5d9810c71b --- /dev/null +++ b/tests/purs/bundle/FunctionDeclaration.purs @@ -0,0 +1,14 @@ +module Main (main) where + +import Prelude +import Effect (Effect) +import Effect.Console (log) +import Test.Assert (assert') + +main :: Effect Unit +main = do + assert' "foo" fooIsEliminated + qux >>= log + +foreign import qux :: Effect String +foreign import fooIsEliminated :: Boolean