Skip to content

Commit 4110a65

Browse files
limpidsarandom1223
authored andcommitted
Add phpstan analyzer.
1 parent 554007d commit 4110a65

File tree

8 files changed

+99
-7
lines changed

8 files changed

+99
-7
lines changed

analyzer-phpstan/src/main/java/io/codety/scanner/analyzer/phpstan/PhpstanCodeAnalyzer.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@
99
import io.codety.scanner.service.dto.AnalyzerRequest;
1010
import io.codety.scanner.util.CodetyConsoleLogger;
1111
import io.codety.scanner.util.RuntimeExecUtil;
12-
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.beans.factory.annotation.Value;
1313
import org.springframework.stereotype.Service;
1414

1515
import java.util.ArrayList;
1616
import java.util.List;
1717

1818
@Service
1919
public class PhpstanCodeAnalyzer implements CodeAnalyzerInterface {
20+
21+
private static final long memoryLimit = 1024000000;
22+
23+
@Value("${codety.phpstan.path}")
24+
String phpstanBinPath;
25+
2026
@Override
2127
public List<CodeAnalysisResultDto> analyzeCode(AnalyzerConfigurationDetailDto runnerConfiguration, AnalyzerRequest request) {
2228

@@ -26,11 +32,13 @@ public List<CodeAnalysisResultDto> analyzeCode(AnalyzerConfigurationDetailDto ru
2632
String[] command;
2733
String localGitRepoPath = request.getLocalGitRepoPath();
2834
//./vendor/bin/phpstan --memory-limit=1024000000 --no-interaction --no-progress --error-format=json analyse
35+
36+
String phpstanPath = phpstanBinPath + "phpstan";
2937
if(runnerConfiguration.getPayload() == null || runnerConfiguration.getPayload().isEmpty()){
30-
command = new String[]{"./vendor/bin/phpsta", "--memory-limit=1024000000", "--no-interaction", "--no-progress", "--error-format=json", "analyse", localGitRepoPath};
38+
command = new String[]{phpstanPath, "--memory-limit=" + memoryLimit, "--no-interaction", "--no-progress", "--error-format=json", "analyse", localGitRepoPath};
3139
}else{
3240
//Use multiple rules: --check CKV_GCP_33,CKV_GCP_34,CKV_GCP_35 ...
33-
command = new String[]{"./vendor/bin/phpsta", "--memory-limit=1024000000", "--no-interaction", "--no-progress", "--error-format=json", "analyse", localGitRepoPath};
41+
command = new String[]{phpstanPath, "--memory-limit=" + memoryLimit, "--no-interaction", "--no-progress", "--error-format=json", "analyse", localGitRepoPath};
3442
}
3543
try {
3644
RuntimeExecUtil.RuntimeExecResult runtimeExecResult = RuntimeExecUtil.exec(command, "/", 60, false, null);

analyzer-phpstan/src/main/java/io/codety/scanner/analyzer/phpstan/PhpstanConverter.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import io.codety.scanner.analyzer.phpstan.dto.PhpstanIssueDto;
5+
import io.codety.scanner.analyzer.phpstan.dto.PhpstanMessage;
56
import io.codety.scanner.analyzer.phpstan.dto.PhpstanRoot;
67
import io.codety.scanner.reporter.dto.CodeAnalysisIssueDto;
78
import io.codety.scanner.util.JsonFactoryUtil;
@@ -11,19 +12,38 @@
1112
import java.util.Map;
1213

1314
public class PhpstanConverter {
15+
16+
private static final int defaultPriority = 3;
17+
1418
public static List<CodeAnalysisIssueDto> convertResult(String successOutput, String localGitRepoPath) throws JsonProcessingException {
1519
List<CodeAnalysisIssueDto> result = new ArrayList<>();
1620
PhpstanRoot phpstanRoot = JsonFactoryUtil.objectMapper.readValue(successOutput, PhpstanRoot.class);
1721

1822
Map<String, PhpstanIssueDto> files = phpstanRoot.getFiles();
1923
for(String file : files.keySet()){
20-
if(file.startsWith(localGitRepoPath)){
21-
24+
String filePath = file;
25+
if(filePath.startsWith(localGitRepoPath)){
26+
filePath = filePath.substring(localGitRepoPath.length()+1);
27+
}
28+
PhpstanIssueDto phpstanIssueDto = files.get(file);
29+
ArrayList<PhpstanMessage> messages = phpstanIssueDto.getMessages();
30+
if(messages== null){
31+
continue;
32+
}
33+
for(PhpstanMessage phpstanMessage : messages){
34+
String message = phpstanMessage.getTip();
35+
CodeAnalysisIssueDto issueDto = new CodeAnalysisIssueDto();
36+
issueDto.setFilePath(filePath);
37+
issueDto.setStartLineNumber(phpstanMessage.getLine());
38+
String identifier = phpstanMessage.getIdentifier();
39+
issueDto.setIssueCategory(identifier);
40+
issueDto.setDescription(message);
41+
issueDto.setIssueCode(identifier);
42+
issueDto.setPriority(defaultPriority);
43+
result.add(issueDto);
2244
}
23-
2445
}
2546

26-
2747
return result;
2848
}
2949
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.codety.scanner.analyzer.phpstan;
2+
3+
import io.codety.common.dto.CodeAnalyzerType;
4+
import io.codety.scanner.analyzer.dto.AnalyzerConfigurationDetailDto;
5+
import io.codety.scanner.reporter.dto.CodeAnalysisIssueDto;
6+
import io.codety.scanner.reporter.dto.CodeAnalysisResultDto;
7+
import io.codety.scanner.service.dto.AnalyzerRequest;
8+
import org.junit.jupiter.api.Assertions;
9+
import org.junit.jupiter.api.Test;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.boot.test.context.SpringBootTest;
12+
13+
import java.nio.file.Paths;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
@SpringBootTest
19+
public class PhpstanCodeAnalyzerTest {
20+
21+
@Autowired
22+
PhpstanCodeAnalyzer phpstanCodeAnalyzer;
23+
24+
@Test
25+
void testCodeAnalyze(){
26+
String path = Paths.get("../","code-issue-examples", "php").toFile().getAbsoluteFile().getPath();
27+
28+
String language = "java";
29+
AnalyzerConfigurationDetailDto runnerConfiguration = new AnalyzerConfigurationDetailDto(language, CodeAnalyzerType.trivy);
30+
Map<String, String> env = new HashMap<>();
31+
AnalyzerRequest analyzerRequest = AnalyzerRequest.processSystemVariablesToRequest(env, new String[]{path});
32+
List<CodeAnalysisResultDto> codeAnalysisResultDtos = phpstanCodeAnalyzer.analyzeCode(runnerConfiguration, analyzerRequest);
33+
Assertions.assertTrue(codeAnalysisResultDtos.size() > 0);
34+
35+
CodeAnalysisResultDto resultDto = codeAnalysisResultDtos.get(0);
36+
Assertions.assertEquals(resultDto.getLanguage(), language);
37+
Map<String, List<CodeAnalysisIssueDto>> issuesByFile = resultDto.getIssuesByFile();
38+
Assertions.assertTrue(issuesByFile.size()>0);
39+
for(String file : issuesByFile.keySet()) {
40+
List<CodeAnalysisIssueDto> issues = issuesByFile.get(file);
41+
Assertions.assertTrue(issues.size() > 0);
42+
for (CodeAnalysisIssueDto issueDto : issues) {
43+
Assertions.assertTrue(issueDto.getStartLineNumber() > 0);
44+
Assertions.assertTrue(issueDto.getIssueCode().length() > 0);
45+
Assertions.assertTrue(issueDto.getPriority() > 0);
46+
Assertions.assertTrue(issueDto.getIssueCategory().length() > 0);
47+
Assertions.assertTrue(issueDto.getDescription().length() > 10);
48+
Assertions.assertTrue(issueDto.getFilePath().length() > 10);
49+
}
50+
}
51+
}
52+
53+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
codety.phpstan.path=/Users/user/git/runnerDockerDownloads/vendor/bin/
2+
3+
logging.level.root=WARN

scanner/src/main/java/io/codety/scanner/service/ScannerService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.codety.scanner.analyzer.checkov.CheckovCodeAnalyzer;
44
import io.codety.scanner.analyzer.golangcilint.GolangcilintCodeAnalyzer;
5+
import io.codety.scanner.analyzer.phpstan.PhpstanCodeAnalyzer;
56
import io.codety.scanner.analyzer.rubocop.RubocopCodeAnalyzer;
67
import io.codety.scanner.analyzer.scalastyle.ScalastyleCodeAnalyzer;
78
import io.codety.scanner.analyzer.shellcheck.ShellcheckCodeAnalyzer;
@@ -65,6 +66,9 @@ public class ScannerService {
6566
@Autowired
6667
ShellcheckCodeAnalyzer shellcheckCodeAnalyzer;
6768

69+
@Autowired
70+
PhpstanCodeAnalyzer phpstanCodeAnalyzer;
71+
6872
@Autowired
6973
CodetyRegexCodeAnalyzer codetyRegexCodeAnalyzer;
7074

@@ -129,6 +133,7 @@ private CodeAnalysisResultSetDto runDefaultCodeAnalysis(AnalyzerRequest request)
129133
codeAnalysisResultSetDto.getCodeAnalysisResultDtoList().addAll(rubocopCodeAnalyzer.analyzeCode(request));
130134
codeAnalysisResultSetDto.getCodeAnalysisResultDtoList().addAll(stylelintCodeAnalyzer.analyzeCode(request));
131135
codeAnalysisResultSetDto.getCodeAnalysisResultDtoList().addAll(shellcheckCodeAnalyzer.analyzeCode(request));
136+
// codeAnalysisResultSetDto.getCodeAnalysisResultDtoList().addAll(phpstanCodeAnalyzer.analyzeCode(request));
132137

133138
return codeAnalysisResultSetDto;
134139
}

scanner/src/main/resources/application-dev.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ codety.analyzer.java.ruleset.path=tools/pmd-default
33
codety.base.path=tools/
44
codety.eslint.path=/Users/user/dev/
55
codety.stylelint.path=/Users/user/dev/
6+
codety.phpstan.path=/vendor/bin/
67

78
logging.level.root=WARN

scanner/src/main/resources/application-prod.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ codety.analyzer.java.ruleset.path=/tools/pmd-default
33
codety.base.path=/tools/
44
codety.eslint.path=/usr/local/
55
codety.stylelint.path=/usr/local/stylelint/
6+
codety.phpstan.path=/vendor/bin/
67

78
logging.level.root=WARN

scanner/src/main/resources/application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ codety.analyzer.java.ruleset.path=tools/pmd-default
55
codety.base.path=tools/
66
codety.eslint.path=/Users/user/dev/
77
codety.stylelint.path=/Users/user/dev/
8+
codety.phpstan.path=/vendor/bin/
89

910
logging.level.root=WARN
1011
logging.level.io.codety=WARN

0 commit comments

Comments
 (0)