Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
52.17% covered (warning)
52.17%
12 / 23
50.00% covered (danger)
50.00%
3 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
SwitchStatement
52.17% covered (warning)
52.17%
12 / 23
50.00% covered (danger)
50.00%
3 / 6
48.61
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toTypescript
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toJavascript
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 needsDefinitions
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
42
 render
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
7
 providesDefinitions
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2namespace Apie\TypescriptCodeBuilder\Dto\ControlFlow;
3
4use Apie\TypescriptCodeBuilder\Lists\JavascriptIdentifierList;
5use Apie\TypescriptCodeBuilder\Lists\SwitchCaseList;
6use Apie\TypescriptCodeBuilder\TypescriptFileExpressionInterface;
7use Apie\TypescriptCodeBuilder\Utils\ControlFlowUtils;
8
9class SwitchStatement implements TypescriptFileExpressionInterface
10{
11    public function __construct(
12        public TypescriptFileExpressionInterface $expression,
13        public SwitchCaseList $cases
14    ) {
15    }
16
17    public function toTypescript(): string
18    {
19        return $this->render(true);
20    }
21    public function toJavascript(): string
22    {
23        return $this->render(false);
24    }
25
26    public function needsDefinitions(): JavascriptIdentifierList
27    {
28        $definitions = ControlFlowUtils::mergeDefinitions($this->expression);
29        foreach ($this->cases as $case) {
30            if ($case->condition) {
31                foreach ($case->condition->needsDefinitions() as $definition) {
32                    $definitions = $definitions->append($definition);
33                }
34            }
35            foreach ($case->codeList as $code) {
36                foreach ($code->needsDefinitions() as $definition) {
37                    $definitions = $definitions->append($definition);
38                }
39            }
40        }
41        return $definitions;
42    }
43    private function render(bool $typescript): string
44    {
45        $expression = $typescript ? $this->expression->toTypescript() : $this->expression->toJavascript();
46        $lines = ['switch (' . $expression . ') {'];
47        foreach ($this->cases as $case) {
48            $condition = $case->condition ? ($typescript ? $case->condition->toTypescript() : $case->condition->toJavascript()) : 'default';
49            $lines[] = '    ' . ($case->condition ? 'case ' . $condition : $condition) . ':';
50            $body = ControlFlowUtils::renderBlock($case->codeList, $typescript);
51            if ($body !== '') {
52                $lines[] = ControlFlowUtils::indent($body);
53            }
54        }
55        $lines[] = '}';
56        return implode(PHP_EOL, $lines);
57    }
58
59    public function providesDefinitions(bool $applyBlockScope): JavascriptIdentifierList
60    {
61        return new JavascriptIdentifierList();
62    }
63}