Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/Language/PureScript/Backend/Lua.hs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import Language.PureScript.Backend.Lua.Types qualified as Lua
import Language.PureScript.Backend.Types (AppOrModule (..))
import Language.PureScript.Names (ModuleName (..), runModuleName)
import Language.PureScript.Names qualified as PS
import Language.PureScript.PSString (decodeStringEscaping, mkString)
import Path (Abs, Dir, Path)
import Prelude hiding (exp, local)

Expand Down Expand Up @@ -149,7 +150,7 @@ fromIR foreigns topLevelNames modname ir = case ir of
IR.LiteralString _ann s →
pure . Right $ Lua.String s
IR.LiteralChar _ann c →
pure . Right $ Lua.String $ Text.singleton c
pure (Right (Lua.String (decodeStringEscaping (mkString (Text.singleton c)))))
IR.LiteralBool _ann b →
pure . Right $ Lua.Boolean b
IR.LiteralArray _ann exprs →
Expand Down
20 changes: 20 additions & 0 deletions test/ps/golden/Golden/CharLiterals/Test.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-- Char literals must be escaped in generated Lua: an unescaped '\n' inside
-- a quoted Lua string splits it across lines, producing a chunk no Lua
-- interpreter can parse.
module Golden.CharLiterals.Test where

import Prelude

import Effect (Effect)
import Effect.Console (log)

main :: Effect Unit
main = do
log (show '\n')
log (show '\t')
log (show '\r')
log (show '\'')
log (show '\\')
log (show 'a')
log (show ('\n' == '\n'))
log (show ('\t' < '\n'))
1 change: 1 addition & 0 deletions test/ps/output/Golden.CharLiterals.Test/corefn.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"builtWith":"0.15.16","comments":[{"LineComment":" Char literals must be escaped in generated Lua: an unescaped '\\n' inside"},{"LineComment":" a quoted Lua string splits it across lines, producing a chunk no Lua"},{"LineComment":" interpreter can parse."}],"decls":[{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"bindType":"NonRec","expression":{"abstraction":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[13,18],"start":[13,3]}},"type":"Var","value":{"identifier":"discard","moduleName":["Control","Bind"]}},"annotation":{"meta":{"metaType":"IsSyntheticApp"},"sourceSpan":{"end":[13,18],"start":[13,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discardUnit","moduleName":["Control","Bind"]}},"type":"App"},"annotation":{"meta":{"metaType":"IsSyntheticApp"},"sourceSpan":{"end":[13,18],"start":[13,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"bindEffect","moduleName":["Effect"]}},"type":"App"},"identifier":"discard"},{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"bindType":"NonRec","expression":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[13,12],"start":[13,8]}},"type":"Var","value":{"identifier":"show","moduleName":["Data","Show"]}},"annotation":{"meta":{"metaType":"IsSyntheticApp"},"sourceSpan":{"end":[13,17],"start":[13,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"showChar","moduleName":["Data","Show"]}},"type":"App"},"identifier":"show"},{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"bindType":"NonRec","expression":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[19,12],"start":[19,8]}},"type":"Var","value":{"identifier":"show","moduleName":["Data","Show"]}},"annotation":{"meta":{"metaType":"IsSyntheticApp"},"sourceSpan":{"end":[19,27],"start":[19,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"showBoolean","moduleName":["Data","Show"]}},"type":"App"},"identifier":"show1"},{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"bindType":"NonRec","expression":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[19,21],"start":[19,19]}},"type":"Var","value":{"identifier":"eq","moduleName":["Data","Eq"]}},"annotation":{"meta":{"metaType":"IsSyntheticApp"},"sourceSpan":{"end":[19,26],"start":[19,14]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"eqChar","moduleName":["Data","Eq"]}},"type":"App"},"identifier":"eq"},{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"bindType":"NonRec","expression":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[20,20],"start":[20,19]}},"type":"Var","value":{"identifier":"lessThan","moduleName":["Data","Ord"]}},"annotation":{"meta":{"metaType":"IsSyntheticApp"},"sourceSpan":{"end":[20,25],"start":[20,14]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"ordChar","moduleName":["Data","Ord"]}},"type":"App"},"identifier":"lessThan"},{"annotation":{"meta":null,"sourceSpan":{"end":[11,20],"start":[11,1]}},"bindType":"NonRec","expression":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[13,18],"start":[13,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[13,6],"start":[13,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[13,18],"start":[13,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[13,17],"start":[13,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[13,17],"start":[13,13]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\n"}},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[13,18],"start":[13,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[13,18],"start":[13,3]}},"argument":"$__unused","body":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[14,18],"start":[14,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[14,6],"start":[14,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[14,18],"start":[14,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[14,17],"start":[14,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[14,17],"start":[14,13]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\t"}},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[14,18],"start":[14,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[14,18],"start":[14,3]}},"argument":"$__unused","body":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[15,18],"start":[15,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[15,6],"start":[15,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[15,18],"start":[15,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[15,17],"start":[15,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[15,17],"start":[15,13]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\r"}},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[15,18],"start":[15,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[15,18],"start":[15,3]}},"argument":"$__unused","body":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[16,18],"start":[16,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[16,6],"start":[16,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[16,18],"start":[16,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[16,17],"start":[16,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[16,17],"start":[16,13]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"'"}},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[16,18],"start":[16,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[16,18],"start":[16,3]}},"argument":"$__unused","body":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[17,18],"start":[17,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[17,6],"start":[17,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[17,18],"start":[17,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[17,17],"start":[17,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[17,17],"start":[17,13]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\\"}},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[17,18],"start":[17,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[17,18],"start":[17,3]}},"argument":"$__unused","body":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[18,17],"start":[18,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[18,6],"start":[18,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[18,17],"start":[18,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[18,16],"start":[18,8]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[18,16],"start":[18,13]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"a"}},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[18,17],"start":[18,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[18,17],"start":[18,3]}},"argument":"$__unused","body":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"discard","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[19,28],"start":[19,3]}},"argument":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[19,6],"start":[19,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[19,28],"start":[19,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show1","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[19,27],"start":[19,8]}},"argument":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"eq","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[19,26],"start":[19,14]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[19,18],"start":[19,14]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\n"}},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[19,26],"start":[19,14]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[19,26],"start":[19,22]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\n"}},"type":"App"},"type":"App"},"type":"App"},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[19,28],"start":[19,3]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[19,28],"start":[19,3]}},"argument":"$__unused","body":{"abstraction":{"annotation":{"meta":{"metaType":"IsForeign"},"sourceSpan":{"end":[20,6],"start":[20,3]}},"type":"Var","value":{"identifier":"log","moduleName":["Effect","Console"]}},"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[20,3]}},"argument":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"show1","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[20,26],"start":[20,8]}},"argument":{"abstraction":{"abstraction":{"annotation":{"meta":null,"sourceSpan":{"end":[0,0],"start":[0,0]}},"type":"Var","value":{"identifier":"lessThan","moduleName":["Golden","CharLiterals","Test"]}},"annotation":{"meta":null,"sourceSpan":{"end":[20,25],"start":[20,14]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[20,18],"start":[20,14]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\t"}},"type":"App"},"annotation":{"meta":null,"sourceSpan":{"end":[20,25],"start":[20,14]}},"argument":{"annotation":{"meta":null,"sourceSpan":{"end":[20,25],"start":[20,21]}},"type":"Literal","value":{"literalType":"CharLiteral","value":"\n"}},"type":"App"},"type":"App"},"type":"App"},"type":"Abs"},"type":"App"},"type":"Abs"},"type":"App"},"type":"Abs"},"type":"App"},"type":"Abs"},"type":"App"},"type":"Abs"},"type":"App"},"type":"Abs"},"type":"App"},"type":"Abs"},"type":"App"},"identifier":"main"}],"exports":["main"],"foreign":[],"imports":[{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Control","Bind"]},{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Data","Eq"]},{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Data","Ord"]},{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Data","Show"]},{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Effect"]},{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Effect","Console"]},{"annotation":{"meta":null,"sourceSpan":{"end":[6,15],"start":[6,1]}},"moduleName":["Prelude"]},{"annotation":{"meta":null,"sourceSpan":{"end":[20,27],"start":[4,1]}},"moduleName":["Prim"]}],"moduleName":["Golden","CharLiterals","Test"],"modulePath":"golden/Golden/CharLiterals/Test.purs","reExports":{},"sourceSpan":{"end":[20,27],"start":[4,1]}}
1 change: 1 addition & 0 deletions test/ps/output/Golden.CharLiterals.Test/eval/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
actual.txt
8 changes: 8 additions & 0 deletions test/ps/output/Golden.CharLiterals.Test/eval/golden.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
'\n'
'\t'
'\r'
'\''
'\\'
'a'
true
true
Loading
Loading