diff --git a/lib/parse.js b/lib/parse.js index 210633c2..1d6c9be0 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -91,6 +91,14 @@ parse.Conditional = function(contract, expression, skipStatementRegistry) { parse[expression.condition.type] && parse[expression.condition.type](contract, expression.condition, true); + if (expression.trueExpression && expression.trueExpression.type === 'Conditional'){ + parse[expression.trueExpression.type](contract, expression.trueExpression, true); + } + + if (expression.falseExpression && expression.falseExpression.type === 'Conditional'){ + parse[expression.falseExpression.type](contract, expression.falseExpression, true); + } + register.conditional(contract, expression); }; diff --git a/test/sources/solidity/contracts/conditional/chained-multiline.sol b/test/sources/solidity/contracts/conditional/chained-multiline.sol new file mode 100644 index 00000000..87db27a7 --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-multiline.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + value < min + ? min + : value > max + ? max + : value; + } +} diff --git a/test/sources/solidity/contracts/conditional/chained-singleline.sol b/test/sources/solidity/contracts/conditional/chained-singleline.sol new file mode 100644 index 00000000..539a7b90 --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-singleline.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + value < min ? min : value > max ? max : value; + } +} diff --git a/test/sources/solidity/contracts/conditional/chained-true.sol b/test/sources/solidity/contracts/conditional/chained-true.sol new file mode 100644 index 00000000..166c4dcf --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-true.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + value < min + ? value > max + ? max + : value + : min; + } +} diff --git a/test/sources/solidity/contracts/conditional/chained-with-parens.sol b/test/sources/solidity/contracts/conditional/chained-with-parens.sol new file mode 100644 index 00000000..184fb29c --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-with-parens.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + (value < min) ? min : (value > max) ? max : value; + } +} diff --git a/test/units/conditional.js b/test/units/conditional.js index 84185e5c..a9fb2e47 100644 --- a/test/units/conditional.js +++ b/test/units/conditional.js @@ -233,4 +233,24 @@ describe('ternary conditionals', () => { const info = util.instrumentAndCompile('conditional/ternary-with-unbracketed-else'); util.report(info.solcOutput.errors); }); + + it('should compile after instrumenting a chain of ternary conditionals (single line)', () => { + const info = util.instrumentAndCompile('conditional/chained-singleline'); + util.report(info.solcOutput.errors); + }); + + it('should compile after instrumenting a chain of ternary conditionals (multi-line)', () => { + const info = util.instrumentAndCompile('conditional/chained-multiline'); + util.report(info.solcOutput.errors); + }); + + it('should compile after instrumenting a chain of ternary conditionals (parens)', () => { + const info = util.instrumentAndCompile('conditional/chained-with-parens'); + util.report(info.solcOutput.errors); + }); + + it('should compile after instrumenting a chain of ternary conditionals (true expr is tern)', () => { + const info = util.instrumentAndCompile('conditional/chained-true'); + util.report(info.solcOutput.errors); + }); });