Completed
Pull Request — master (#38)
by James
01:25
created

getSolutionDescription()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Facade\Ignition\Solutions;
4
5
use Illuminate\Support\Facades\Blade;
6
use Facade\IgnitionContracts\RunnableSolution;
7
8
class SuggestCorrectVariableNameSolution implements RunnableSolution
9
{
10
    private $variableName;
11
    private $viewFile;
12
13
    public function __construct($variableName = null, $viewFile = null, $suggested = null)
14
    {
15
        $this->variableName = $variableName;
16
        $this->viewFile = $viewFile;
17
        $this->suggested = $suggested;
18
    }
19
20
    public function getSolutionTitle(): string
21
    {
22
        return 'Possible typo $'.$this->variableName;
23
    }
24
25
    public function getDocumentationLinks(): array
26
    {
27
        return [];
28
    }
29
30
    public function getSolutionActionDescription(): string
31
    {
32
        $path = str_replace(base_path().'/', '', $this->viewFile);
0 ignored issues
show
Unused Code introduced by
$path is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
33
        $output = [
34
            'Did you mean `$'.$this->suggested.'`?',
35
        ];
36
37
        return implode(PHP_EOL, $output);
38
    }
39
40
    public function getRunButtonText(): string
41
    {
42
        return 'Fix typo';
43
    }
44
45
    public function getSolutionDescription(): string
46
    {
47
        return '';
48
    }
49
50
    public function getRunParameters(): array
51
    {
52
        return [
53
            'variableName' => $this->variableName,
54
            'viewFile' => $this->viewFile,
55
            'suggested' => $this->suggested,
56
        ];
57
    }
58
59
    public function isRunnable(array $parameters = [])
60
    {
61
        return $this->fixTypo($this->getRunParameters()) !== false;
62
    }
63
64
    public function run(array $parameters = [])
65
    {
66
        $output = $this->fixTypo($parameters);
67
        if ($output !== false) {
68
            file_put_contents($parameters['viewFile'], $output);
69
        }
70
    }
71
72
    public function fixTypo(array $parameters = [])
73
    {
74
        // Make sure suggested variable is valid alpha-numeric with underscore, or return false
75
        if (! preg_match('/^[a-zA-Z]+[a-zA-Z0-9_]+$/', $parameters['suggested'])) {
76
            return false;
77
        }
78
79
        $originalContents = file_get_contents($parameters['viewFile']);
80
        $newContents = str_replace('$'.$parameters['variableName'], '$'.$parameters['suggested'], $originalContents);
81
82
        // Compile blade, tokenize
83
        $originalTokens = token_get_all(Blade::compileString($originalContents));
84
        $newTokens = token_get_all(Blade::compileString($newContents));
85
86
        // Generate what we expect the tokens to be after we change the blade file
87
        $expectedTokens = $originalTokens;
88
        foreach ($expectedTokens as $key => $token) {
89
            if ($token[0] === T_VARIABLE && $token[1] === '$'.$parameters['variableName']) {
90
                $expectedTokens[$key][1] = '$'.$parameters['suggested'];
91
            }
92
        }
93
        if ($expectedTokens !== $newTokens) {
94
            return false;
95
        }
96
97
        return $newContents;
98
    }
99
}
100