-
Notifications
You must be signed in to change notification settings - Fork 25
/
PackageCollection.groovy
84 lines (75 loc) · 2.56 KB
/
PackageCollection.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
* Copyright 2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.beryx.jlink.util
import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
import groovy.transform.ToString
import jdk.internal.org.objectweb.asm.Type
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
@ToString
@CompileStatic
class PackageCollection {
private static final Logger LOGGER = Logging.getLogger(PackageCollection.class);
final TreeSet<String> packages = new TreeSet<String>()
void addPackage(String pkg) {
packages << adjust(pkg)
}
@CompileDynamic
void addDescriptor(String descriptor) {
addTypes(Type.getType(descriptor))
}
@CompileDynamic
void addTypes(Type... types) {
types.each { Type type ->
switch(type.sort) {
case Type.ARRAY: addTypes(type.elementType); break
case Type.OBJECT: addClass(type.className); break;
case Type.METHOD: addTypes(*type.argumentTypes, type.returnType); break;
}
}
}
void addClass(String className) {
if(!className) return
if(className.startsWith('[')) {
addDescriptor(className)
} else {
def pkg = removeFromLastOccurrence(adjust(className), '.')
if(pkg) packages << pkg
}
}
static String removeFromLastOccurrence(String s, String delimiter) {
int pos = s.lastIndexOf(delimiter)
if(pos <= 0) {
LOGGER.debug("Cannot remove from last occurrence of $delimiter in $s")
return null
}
s.substring(0, pos)
}
static String adjust(String s) {
s = s?.trim()
if(!s) return ''
while(!Character.isJavaIdentifierStart(s[0] as char)) {
s = s.substring(1)
if(!s) return ''
}
while(!Character.isJavaIdentifierPart(s[s.length() - 1] as char)) {
s = s.substring(0, s.length()-1)
if(!s) return ''
}
s.replace('/', '.')
}
}