Skip to content

Commit

Permalink
Fix compiler bug affecting Elm Parser module declarations
Browse files Browse the repository at this point in the history
This commit fixes a bug in the Elm compiler that resulted in invalid emission for a subset of module-level declarations with zero arguments. For example, this defect surfaced when compiling declarations applying `Parser.Advanced.oneOf` as the root expression or when using `Parser.int`
  • Loading branch information
Viir committed Sep 27, 2024
1 parent 372f2b3 commit fda2732
Show file tree
Hide file tree
Showing 22 changed files with 99 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -806,7 +806,7 @@ compilationAndEmitStackFromModulesInCompilation availableModules { moduleAliases
case FirCompiler.parseFunctionRecordFromValueTagged functionValue of
Err _ ->
( 0
, FirCompiler.LocalEnvironment []
, FirCompiler.IndependentEnvironment
)

Ok (FirCompiler.ParsedFunctionValue _ _ parameterCount _ _) ->
Expand Down Expand Up @@ -3256,7 +3256,7 @@ emitRecursionDomain { exposedDeclarationsNames, allModuleDeclarations, importedF
in
case
evaluateAsIndependentExpression
(if parameterCount < 1 then
(if parameterCount == 0 && newEnvFunctionsValues == [] then
FirCompiler.emitWrapperForPartialApplicationZero
{ getFunctionInnerExpression = getFunctionInnerExpression
, getEnvFunctionsExpression = envFunctionsExpression
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
module ModuleA exposing (..)


partially_applied_a =
function_with_three_parameters 11


function_with_three_parameters param0 param1 param2 =
[ param0, param1, param0, param2, param1 ]


same_module_partially_applied_b =
partially_applied_a named_literal


named_literal =
71
module ModuleA exposing (..)


partially_applied_a =
function_with_three_parameters 11


function_with_three_parameters param0 param1 param2 =
[ param0, param1, param0, param2, param1 ]


same_module_partially_applied_b =
partially_applied_a named_literal


named_literal =
71
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
module ModuleB exposing (partially_applied_b)

import ModuleA exposing (..)


partially_applied_b =
ModuleA.partially_applied_a named_literal


named_literal =
13
module ModuleB exposing (partially_applied_b)

import ModuleA exposing (..)


partially_applied_b =
ModuleA.partially_applied_a named_literal


named_literal =
13
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/elm-stuff/
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"type": "application",
"source-directories": [
"src"
],
"elm-version": "0.19.1",
"dependencies": {
"direct": {
"elm/browser": "1.0.2",
"elm/core": "1.0.5",
"elm/html": "1.0.0",
"elm/parser": "1.1.0"
},
"indirect": {
"elm/json": "1.1.3",
"elm/time": "1.0.0",
"elm/url": "1.0.0",
"elm/virtual-dom": "1.0.3"
}
},
"test-dependencies": {
"direct": {},
"indirect": {}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module CompositeParser exposing (..)

import Parser.Advanced exposing ((|.), (|=))


negateToken : Parser.Advanced.Token ()
negateToken =
Parser.Advanced.Token "-" ()


oneOf_only_int : Parser.Advanced.Parser () () Int
oneOf_only_int =
Parser.Advanced.oneOf
[ Parser.Advanced.int () ()
]


signedInt : Parser.Advanced.Parser () () Int
signedInt =
Parser.Advanced.oneOf
[ Parser.Advanced.succeed negate
|. Parser.Advanced.symbol negateToken
|= Parser.Advanced.int () ()
, Parser.Advanced.int () ()
]
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Parser.Advanced.run (Parser.succeed "test") "unrelated"
Parser.Advanced.run (Parser.Advanced.succeed "test") "unrelated"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok []
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Parser.Advanced.run
(Parser.Advanced.symbol CompositeParser.negateToken)
"-"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok 1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Parser.Advanced.run (Parser.Advanced.oneOf [ Parser.Advanced.int () () ]) "1"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
testOneOf = Parser.Advanced.oneOf [ Parser.Advanced.int () () ]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok 13
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Parser.Advanced.run testOneOf "13"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok 17
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Parser.Advanced.run CompositeParser.oneOf_only_int "17"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok 0
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Parser.run Parser.int "0"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok 1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Parser.run Parser.int "1"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ok 731
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Parser.run Parser.int "731"

0 comments on commit fda2732

Please sign in to comment.