package architect.autopath.compiler.extractor;
import com.google.auto.common.MoreElements;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import architect.autopath.AutoPath;
import processorworkflow.AbstractExtractor;
import processorworkflow.Errors;
import processorworkflow.ExtractorUtils;
/**
* @author Lukasz Piliszczuk - lukasz.pili@gmail.com
*/
public class PathExtractor extends AbstractExtractor {
private static final String ANNOTATION_VIEW = "withView";
private TypeMirror viewTypeMirror;
private List<ExecutableElement> constructorElements;
public PathExtractor(Element element, Types types, Elements elements, Errors errors) {
super(element, types, elements, errors);
extract();
}
@Override
public void extract() {
if (element.getKind() != ElementKind.CLASS) {
errors.addInvalid("Annotation can be applied only on a class");
return;
}
viewTypeMirror = ExtractorUtils.getValueFromAnnotation(element, AutoPath.class, ANNOTATION_VIEW);
if (viewTypeMirror == null) {
errors.addMissing("withView() value");
}
constructorElements = new ArrayList<>();
for (Element e : element.getEnclosedElements()) {
if (e.getKind() == ElementKind.CONSTRUCTOR) {
constructorElements.add(MoreElements.asExecutable(e));
}
}
}
public TypeMirror getViewTypeMirror() {
return viewTypeMirror;
}
public List<ExecutableElement> getConstructorElements() {
return constructorElements;
}
}