package org.inferred.freebuilder.processor.util.feature; import org.inferred.freebuilder.processor.util.SourceBuilder; import javax.annotation.processing.ProcessingEnvironment; /** * Algorithm to select the correct instance of a given feature type for a processing environment, * and the default to use in tests when an explicit value has not been registered for that feature. * * <p>Each feature class should expose a single {@code FeatureType} constant for the user to pass * to {@link SourceBuilder#feature(FeatureType)}, e.g. {@link SourceLevel#SOURCE_LEVEL}. */ public abstract class FeatureType<F extends Feature<F>> { /** Returns the instance of {@code F} to use by default in tests. */ protected abstract F testDefault(FeatureSet features); /** Returns the instance of {@code F} to use in {@code env}. */ protected abstract F forEnvironment(ProcessingEnvironment env, FeatureSet features); @SuppressWarnings("unchecked") protected Class<F> type() { return (Class<F>) testDefault(new StaticFeatureSet()).getClass(); } }