mirror of
https://github.com/zaaarf/geb-processor.git
synced 2024-11-15 02:39:20 +01:00
Compare commits
No commits in common. "d6c1976261a7d2b17f910dd6b76804f7401a1858" and "1cac528f2336dbcfdc5e2e656c8a64bc04e63795" have entirely different histories.
d6c1976261
...
1cac528f23
2 changed files with 25 additions and 52 deletions
|
@ -4,7 +4,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
archivesBaseName = 'processor'
|
archivesBaseName = 'processor'
|
||||||
version = versionDetails().lastTag
|
version = gitVersion().split('-').getAt(0).replace('dirty', '')
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
@ -25,6 +25,6 @@ repositories {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'ftbsc:geb:0.3.0'
|
implementation 'ftbsc:geb:0.2.0'
|
||||||
implementation 'com.squareup:javapoet:1.13.0'
|
implementation 'com.squareup:javapoet:1.13.0'
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,8 +153,9 @@ public class GEBProcessor extends AbstractProcessor {
|
||||||
listener.getEnclosingElement().getSimpleName().toString(),
|
listener.getEnclosingElement().getSimpleName().toString(),
|
||||||
listener.getSimpleName().toString()));
|
listener.getSimpleName().toString()));
|
||||||
|
|
||||||
this.listenerMap.computeIfAbsent(event, k -> new HashSet<>())
|
if(!this.listenerMap.containsKey(event))
|
||||||
.add(new ListenerContainer(listener));
|
this.listenerMap.put(event, new HashSet<>());
|
||||||
|
this.listenerMap.get(event).add(new ListenerContainer(listener));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -165,66 +166,38 @@ public class GEBProcessor extends AbstractProcessor {
|
||||||
TypeElement eventClass = (TypeElement) this.processingEnv.getTypeUtils().asElement(event);
|
TypeElement eventClass = (TypeElement) this.processingEnv.getTypeUtils().asElement(event);
|
||||||
boolean cancelable = this.processingEnv.getTypeUtils().isAssignable(event, this.cancelableEventInterface);
|
boolean cancelable = this.processingEnv.getTypeUtils().isAssignable(event, this.cancelableEventInterface);
|
||||||
|
|
||||||
|
//reorder the injectors to follow priority
|
||||||
|
List<ListenerContainer> ordered = listeners.stream().sorted(Comparator.comparingInt(
|
||||||
|
container -> container.annotation.priority()
|
||||||
|
)).collect(Collectors.toList());
|
||||||
|
|
||||||
ParameterSpec eventParam = ParameterSpec.builder(TypeName.get(this.eventInterface), "event").build();
|
ParameterSpec eventParam = ParameterSpec.builder(TypeName.get(this.eventInterface), "event").build();
|
||||||
ParameterSpec listenersParam = ParameterSpec.builder(
|
ParameterSpec listenersParam = ParameterSpec.builder(ParameterizedTypeName.get(
|
||||||
ParameterizedTypeName.get(
|
ClassName.get("java.util", "Map"), ParameterizedTypeName.get(
|
||||||
ClassName.get("java.util", "Map"),
|
ClassName.get("java.lang", "Class"),
|
||||||
ParameterizedTypeName.get(
|
WildcardTypeName.subtypeOf(TypeName.get(this.listenerInterface))),
|
||||||
ClassName.get("java.lang", "Class"),
|
ClassName.get(this.listenerInterface)), "listeners")
|
||||||
WildcardTypeName.subtypeOf(TypeName.get(this.listenerInterface))
|
.build();
|
||||||
),
|
|
||||||
ParameterizedTypeName.get(
|
|
||||||
ClassName.get("java.util", "Set"),
|
|
||||||
ClassName.get(this.listenerInterface)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
"listeners"
|
|
||||||
).build();
|
|
||||||
|
|
||||||
MethodSpec.Builder callListenersBuilder = MethodSpec.methodBuilder("callListeners")
|
MethodSpec.Builder callListenersBuilder = MethodSpec.methodBuilder("callListeners")
|
||||||
.addModifiers(Modifier.PUBLIC)
|
.addModifiers(Modifier.PUBLIC)
|
||||||
.addAnnotation(Override.class)
|
.addAnnotation(Override.class)
|
||||||
.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class) // because why not
|
.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class) //because why not
|
||||||
.addMember("value" , "{$S}", "unchecked").build())
|
.addMember("value" , "{$S}", "unchecked").build())
|
||||||
.addParameter(eventParam)
|
.addParameter(eventParam)
|
||||||
.addParameter(listenersParam)
|
.addParameter(listenersParam)
|
||||||
.returns(boolean.class);
|
.returns(boolean.class);
|
||||||
|
|
||||||
// reorder the injectors to follow priority
|
int counter = 0;
|
||||||
Map<TypeMirror, Integer> done = new HashMap<>();
|
|
||||||
List<ListenerContainer> ordered = listeners.stream().sorted(Comparator.comparingInt(
|
|
||||||
container -> container.annotation.priority()
|
|
||||||
)).collect(Collectors.toList());
|
|
||||||
|
|
||||||
// get all the relevant injectors
|
|
||||||
for(int i = 0; i < ordered.size(); i++) {
|
|
||||||
ListenerContainer listener = ordered.get(i);
|
|
||||||
if(!done.containsKey(listener.parent)) {
|
|
||||||
done.put(listener.parent, i);
|
|
||||||
String varName = String.format("listener%d", i);
|
|
||||||
callListenersBuilder.addStatement(
|
|
||||||
"java.util.Set<$T> $L = $N.get($T.class)",
|
|
||||||
this.listenerInterface,
|
|
||||||
varName,
|
|
||||||
listenersParam,
|
|
||||||
listener.parent
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(ListenerContainer listener : ordered) {
|
for(ListenerContainer listener : ordered) {
|
||||||
String varName = String.format("listener%d", done.get(listener.parent));
|
String varName = String.format("listener%d", counter);
|
||||||
callListenersBuilder
|
callListenersBuilder
|
||||||
.addStatement("for($T l : $L) {", this.listenerInterface, varName)
|
.addStatement("$T $L = $N.get($T.class)", this.listenerInterface, varName, listenersParam, listener.parent)
|
||||||
.addStatement(
|
.addStatement("if($L.isActive()) (($T) $L).$L(($T) $N)", varName, listener.parent, varName,
|
||||||
"if(l != null) (($T) l).$L(($T) $N); }",
|
listener.method.getSimpleName().toString(), event, eventParam);
|
||||||
listener.parent,
|
|
||||||
listener.method.getSimpleName().toString(),
|
|
||||||
event,
|
|
||||||
eventParam
|
|
||||||
);
|
|
||||||
if(cancelable) callListenersBuilder
|
if(cancelable) callListenersBuilder
|
||||||
.addStatement("if((($T) $N).isCanceled()) return false", this.cancelableEventInterface, eventParam);
|
.addStatement("if((($T) $N).isCanceled()) return true", this.cancelableEventInterface, eventParam);
|
||||||
|
counter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
callListenersBuilder.addStatement("return false");
|
callListenersBuilder.addStatement("return false");
|
||||||
|
@ -277,7 +250,7 @@ public class GEBProcessor extends AbstractProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A container class to carry information about a listener class.
|
* A container class to carry information about a listener method.
|
||||||
*/
|
*/
|
||||||
private static class ListenerContainer {
|
private static class ListenerContainer {
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue