Skip to content
Snippets Groups Projects
Commit c3fd7091 authored by Marcel Steinbeck's avatar Marcel Steinbeck
Browse files

Use Spoon to detect imports.

parent ea93878c
No related branches found
No related tags found
No related merge requests found
///////////////////////////// Dependencies
@Grapes([
@Grab(group='com.github.javaparser', module='javaparser-core', version='3.6.7')]
)
import com.github.javaparser.JavaParser
import groovy.io.FileType
@Grab(group = 'fr.inria.gforge.spoon', module = 'spoon-core', version = '7.0.0')
])
import groovy.transform.Field
import spoon.*
import spoon.reflect.declaration.*
import spoon.reflect.visitor.*
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.util.stream.Collectors
import static java.lang.System.exit
import static java.lang.System.exit
///////////////////////////// Configuration
@Field final SCRIPT_LOCATION = new File(this.class.protectionDomain.codeSource.location.path).parent
......@@ -75,31 +74,31 @@ padding = Math.max(padding as int, 150)
///////////////////////////// Generate JSON string
Optional<String> parseJavaFile(Path p) {
String ex = exclude
def cu = JavaParser.parse(p)
def pkg = cu.packageDeclaration
.map{pd -> pd.nameAsString}
.orElse('')
def base = p.fileName.toString().replaceFirst('[.][^.]+$', '')
def name = "${pkg}.${base}"
if (name.matches(ex)) {
return Optional.empty()
def entries = []
def launcher = new Launcher();
launcher.addInputResource(input)
launcher.environment.noClasspath = true
launcher.buildModel()
launcher.factory.CompilationUnit().map.values().each {
def name = it.declaredPackage.qualifiedName + "." +
it.file.name.replaceFirst('[.][^.]+$', '')
if (name.matches((String) exclude)) {
return
}
def imports = new HashSet<CtImport>()
it.declaredTypes.each {
ImportScanner scanner = new ImportScannerImpl()
scanner.scan(it)
imports.addAll(scanner.getAllImports())
}
def imports = String.join(',',
cu.imports.stream()
.map{i -> i.nameAsString}
.filter{i -> !i.matches(ex)}
def importsStr = String.join(',',
imports.stream()
.map{i -> i.reference}
.map{i -> i.toString()}
.filter{i -> !i.isEmpty()}
.map{i -> "\"${i}\""}
.collect(Collectors.toList()))
return Optional.of('{"name":"'+name+'","size":1,"imports":['+imports+']}')
}
def entries = []
new File(input).eachFileRecurse(FileType.FILES) {
if (it.name.endsWith(".java")) {
parseJavaFile(it.toPath()).ifPresent({ e -> entries << e })
}
entries << '{"name":"'+name+'","size":1,"imports":['+importsStr+']}'
}
def json = '[' + String.join(',', entries) + ']'
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment