com.github.tonivade.purefun.AbstractClassTransformer Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2020, Antonio Gabriel Muñoz Conejo
* Distributed under the terms of the MIT License
*/
package com.github.tonivade.purefun;
import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import static java.util.Arrays.asList;
import static java.util.Objects.requireNonNull;
public abstract class AbstractClassTransformer implements ClassTransformer {
protected final JavacElements elements;
protected final TreeMaker maker;
public AbstractClassTransformer(Context context) {
this(JavacElements.instance(context), TreeMaker.instance(context));
}
private AbstractClassTransformer(JavacElements elements, TreeMaker maker) {
this.elements = requireNonNull(elements);
this.maker = requireNonNull(maker);
}
protected List params2Ident(JCTree.JCTypeParameter... typeParams) {
return params2Ident(asList(typeParams));
}
protected List params2Type(JCTree.JCTypeParameter... typeParams) {
return params2Type(asList(typeParams));
}
protected List params2Ident(Iterable typeParams) {
return mapParams(typeParams, this::ident);
}
protected List params2Type(Iterable typeParams) {
return mapParams(typeParams, this::typeParam);
}
protected void fixPos(JCTree newTree, int basePos) {
newTree.accept(new TreeScanner() {
@Override
public void scan(JCTree tree) {
if (tree != null) {
tree.pos += basePos;
super.scan(tree);
}
}
});
}
private List mapParams(Iterable typeParams, Function mapper) {
return toStream(typeParams).map(mapper)
.reduce(List.nil(), List::append, List::appendList);
}
private JCTree.JCIdent ident(JCTree.JCTypeParameter typeParam) {
return maker.Ident(typeParam.name);
}
private JCTree.JCTypeParameter typeParam(JCTree.JCTypeParameter typeParam) {
return maker.TypeParameter(typeParam.name, typeParam.bounds, typeParam.annotations);
}
private Stream toStream(Iterable typeParams) {
return StreamSupport.stream(typeParams.spliterator(), false);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy