private static VisitorsBridge createVisitorBridge( Iterable<CodeVisitor> codeVisitors, List<File> classpath, JavaConfiguration conf, @Nullable SonarComponents sonarComponents, boolean enableSymbolicExecution) { VisitorsBridge visitorsBridge = new VisitorsBridge(codeVisitors, classpath, sonarComponents, enableSymbolicExecution); visitorsBridge.setCharset(conf.getCharset()); visitorsBridge.setAnalyseAccessors(conf.separatesAccessorsFromMethods()); visitorsBridge.setJavaVersion(conf.javaVersion()); return visitorsBridge; }
public void setJavaVersion(JavaVersion javaVersion) { this.javaVersion = javaVersion; this.executableScanners = executableScanners(scanners, javaVersion); }
private boolean isNotJavaLangOrSerializable(String packageName) { String name = currentFile.getName(); return !(inJavaLang(packageName) || isAnnotation(packageName, name) || isSerializable(packageName, name)); }
private static VisitorsBridge createVisitorBridge( Iterable<JavaCheck> codeVisitors, List<File> classpath, JavaVersion javaVersion, @Nullable SonarComponents sonarComponents, SymbolicExecutionMode symbolicExecutionMode) { VisitorsBridge visitorsBridge = new VisitorsBridge(codeVisitors, classpath, sonarComponents, symbolicExecutionMode); visitorsBridge.setJavaVersion(javaVersion); return visitorsBridge; }
if (fileParsed && parsedTree.is(Tree.Kind.COMPILATION_UNIT)) { tree = (CompilationUnitTree) parsedTree; if (isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { try { semanticModel = SemanticModel.createFor(tree, classLoader); } catch (Exception e) { LOG.error("Unable to create symbol table for : " + currentFile.getAbsolutePath(), e); addAnalysisError(e, currentFile.getPath(), AnalysisError.Kind.SEMANTIC_ERROR); sonarComponents.reportAnalysisError(currentFile, e.getMessage()); return; createSonarSymbolTable(tree); } else { SemanticModel.handleMissingTypes(tree); JavaFileScannerContext javaFileScannerContext = createScannerContext(tree, semanticModel, sonarComponents, fileParsed); if (symbolicExecutionEnabled && isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { runScanner(javaFileScannerContext, new SymbolicExecutionVisitor(executableScanners, behaviorCache), AnalysisError.Kind.SE_ERROR); behaviorCache.cleanup(); executableScanners.forEach(scanner -> runScanner(javaFileScannerContext, scanner, AnalysisError.Kind.CHECK_ERROR)); scannerRunner.run(javaFileScannerContext); if (semanticModel != null) {
@Override public void visitFile(@Nullable AstNode astNode) { semanticModel = null; if (astNode != null) { CompilationUnitTree tree = (CompilationUnitTree) astNode; if (isNotJavaLangOrSerializable()) { try { semanticModel = SemanticModel.createFor(tree, getProjectClasspath()); } catch (Exception e) { LOG.error("Unable to create symbol table for : " + getContext().getFile().getAbsolutePath(), e); return; } createSonarSymbolTable(tree); } else { SemanticModel.handleMissingTypes(tree); } JavaFileScannerContext context = new DefaultJavaFileScannerContext(tree, (SourceFile) getContext().peekSourceCode(), getContext().getFile(), semanticModel, analyseAccessors); for (JavaFileScanner scanner : scanners) { scanner.scanFile(context); } if (semanticModel != null) { // Close class loader after all the checks. semanticModel.done(); } } }
if (fileParsed && parsedTree.is(Tree.Kind.COMPILATION_UNIT)) { tree = (CompilationUnitTree) parsedTree; if (isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { try { semanticModel = SemanticModel.createFor(tree, getProjectClasspath()); } catch (Exception e) { LOG.error("Unable to create symbol table for : " + currentFile.getAbsolutePath(), e); return; createSonarSymbolTable(tree); } else { SemanticModel.handleMissingTypes(tree); JavaFileScannerContext javaFileScannerContext = createScannerContext(tree, semanticModel, analyseAccessors, sonarComponents, fileParsed); if (symbolicExecutionEnabled && isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { new SymbolicExecutionVisitor().scanFile(javaFileScannerContext);
private void setupAstScanner(AstScanner astScanner, Iterable<CodeVisitor> visitorsToBridge, List<File> classpath, JavaConfiguration conf, @Nullable SonarComponents sonarComponents) { if(sonarComponents != null) { astScanner.accept(new FileLinesVisitor(sonarComponents, conf.getCharset())); astScanner.accept(new SyntaxHighlighterVisitor(sonarComponents, conf.getCharset())); } VisitorsBridge visitorsBridgeTest = new VisitorsBridge(visitorsToBridge, classpath, sonarComponents); visitorsBridgeTest.setCharset(conf.getCharset()); visitorsBridgeTest.setAnalyseAccessors(conf.separatesAccessorsFromMethods()); astScanner.accept(visitorsBridgeTest); }
/** * Collects actual issues detected when running a {@link JavaCheck} against a test {@link File}. * * @param testFile test {@link File} against which the {@link JavaCheck} has to be run. * @param check {@link JavaCheck} to run against the test {@link File}. * @return a {@link TreeMultimap} object containing detected actual issues. */ static TreeMultimap<Integer, String> collect(final File testFile, final JavaFileScanner check) { final Collection<File> classpath = Lists.newArrayList(); final File testJarDirectory = new File("target/test-jars"); if (testJarDirectory.exists() && testJarDirectory.isDirectory()) { classpath.addAll(FileUtils.listFiles(testJarDirectory, new String[] { "jar", "zip" }, true)); } classpath.add(new File("target/test-classes")); final VisitorsBridge visitorsBridge = new VisitorsBridge(Lists.newArrayList(check), Lists.newArrayList(classpath), null); JavaAstScanner.scanSingleFile(testFile, visitorsBridge); final VisitorContext context = visitorsBridge.getContext(); final SourceCode sourceCode = context.peekSourceCode(); return collectIssues(sourceCode); }
/** * Collects expected issues that were declared in the test {@link File}. * * @param testFile test {@link File} to scan for expected issues. * @return {@link TreeMultimap} containing detected expected issues that were declared in the test {@link File} */ static TreeMultimap<Integer, String> collect(final File testFile) { final Collection<File> classpath = Lists.newArrayList(); final File testJarDirectory = new File("target/test-jars"); if (testJarDirectory.exists() && testJarDirectory.isDirectory()) { classpath.addAll(FileUtils.listFiles(testJarDirectory, new String[] { "jar", "zip" }, true)); } classpath.add(new File("target/test-classes")); final Visitor visitor = new Visitor(); JavaAstScanner.scanSingleFile(testFile, new VisitorsBridge(Lists.newArrayList(visitor), Lists.newArrayList(classpath), null)); return visitor.expectedIssues(); }
private boolean isNotJavaLangOrSerializable() { String[] path = getContext().peekSourceCode().getName().split(Pattern.quote(File.separator)); boolean isJavaLang = path.length > 3 && "java".equals(path[path.length - 3]) && "lang".equals(path[path.length - 2]); boolean isJavaLangAnnotation = path.length > 4 && "Annotation.java".equals(path[path.length - 1]) && "java".equals(path[path.length - 4]) && "lang".equals(path[path.length - 3]) && "annotation".equals(path[path.length - 2]); boolean isSerializable = path.length > 3 && "Serializable.java".equals(path[path.length - 1]) && "java".equals(path[path.length - 3]) && "io".equals(path[path.length - 2]); return !(isJavaLang || isJavaLangAnnotation || isSerializable); }
if (fileParsed && parsedTree.is(Tree.Kind.COMPILATION_UNIT)) { tree = (CompilationUnitTree) parsedTree; if (isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { try { semanticModel = SemanticModel.createFor(tree, classLoader); } catch (Exception e) { LOG.error("Unable to create symbol table for : " + currentFile.getAbsolutePath(), e); addAnalysisError(e, currentFile.getPath(), AnalysisError.Kind.SEMANTIC_ERROR); sonarComponents.reportAnalysisError(currentFile, e.getMessage()); return; createSonarSymbolTable(tree); } else { SemanticModel.handleMissingTypes(tree); JavaFileScannerContext javaFileScannerContext = createScannerContext(tree, semanticModel, sonarComponents, fileParsed); if (symbolicExecutionEnabled && isNotJavaLangOrSerializable(PackageUtils.packageName(tree.packageDeclaration(), "/"))) { runScanner(javaFileScannerContext, new SymbolicExecutionVisitor(executableScanners, behaviorCache), AnalysisError.Kind.SE_ERROR); behaviorCache.cleanup(); executableScanners.forEach(scanner -> runScanner(javaFileScannerContext, scanner, AnalysisError.Kind.CHECK_ERROR)); scannerRunner.run(javaFileScannerContext); if (semanticModel != null) {
private static VisitorsBridge createVisitorBridge( Iterable<JavaCheck> codeVisitors, List<File> classpath, JavaVersion javaVersion, @Nullable SonarComponents sonarComponents, SymbolicExecutionMode symbolicExecutionMode) { VisitorsBridge visitorsBridge = new VisitorsBridge(codeVisitors, classpath, sonarComponents, symbolicExecutionMode); visitorsBridge.setJavaVersion(javaVersion); return visitorsBridge; }
private void createSonarSymbolTable(CompilationUnitTree tree) { if (sonarComponents != null) { SonarSymbolTableVisitor symVisitor = new SonarSymbolTableVisitor(sonarComponents.symbolizableFor(getContext().getFile()), semanticModel); symVisitor.visitCompilationUnit(tree); } }
private boolean isNotJavaLangOrSerializable(String packageName) { String name = currentFile.getName(); return !(inJavaLang(packageName) || isAnnotation(packageName, name) || isSerializable(packageName, name)); }
public void setJavaVersion(JavaVersion javaVersion) { this.javaVersion = javaVersion; List<JavaFileScanner> scannersForJavaVersion = executableScanners(allScanners, javaVersion); this.executableScanners = scannersForJavaVersion.stream().filter(isIssuableSubscriptionVisitor.negate()).collect(Collectors.toList()); this.scannerRunner = new ScannerRunner(scannersForJavaVersion); }
private boolean isNotJavaLangOrSerializable(String packageName) { String name = currentFile.getName(); return !(inJavaLang(packageName) || isAnnotation(packageName, name) || isSerializable(packageName, name)); }
public void setJavaVersion(JavaVersion javaVersion) { this.javaVersion = javaVersion; List<JavaFileScanner> scannersForJavaVersion = executableScanners(allScanners, javaVersion); this.executableScanners = scannersForJavaVersion.stream().filter(isIssuableSubscriptionVisitor.negate()).collect(Collectors.toList()); this.scannerRunner = new ScannerRunner(scannersForJavaVersion); }