001package de.monochromata.anaphors.cog.transform;
002
003import de.monochromata.anaphors.ast.ASTBasedAnaphora;
004import de.monochromata.anaphors.ast.relatedexp.RelatedExpression;
005import de.monochromata.anaphors.ast.spi.TransformationsSpi;
006import de.monochromata.anaphors.cog.memory.Chunk;
007
008/**
009 * A no-operation preparatory transformation that merely returns a given
010 * {@link ASTBasedAnaphora} relation.
011 *
012 * @param <N>  The node type in the AST
013 * @param <E>  The expression type
014 * @param <T>  The type type
015 * @param <B>  The binding type
016 * @param <TB> The type binding type
017 * @param <S>  The scope type (optional)
018 * @param <I>  The type used to represent identifiers
019 * @param <QI> The type used to represent qualified identifiers
020 * @param <R>  The sub-type of related expression to use
021 * @param <A>  The sub-type of AST-based anaphora to use
022 */
023public class NoPreparationRequired<N, E, T, B, TB extends B, S, I, QI, R extends RelatedExpression<N, T, B, TB, S, QI, R>, A extends ASTBasedAnaphora<N, E, T, B, TB, S, I, QI, R, A>>
024        extends AbstractPreparatoryTransformation<N, E, T, B, TB, S, I, QI, R, A> {
025
026    /**
027     * Used in contract testing.
028     */
029    @SuppressWarnings("unused")
030    protected NoPreparationRequired() {
031    }
032
033    public NoPreparationRequired(final TransformationsSpi<N, E, T, B, TB, S, I, QI, R, A> transformationsSpi) {
034        super(transformationsSpi);
035    }
036
037    @Override
038    public String getKind() {
039        return "NOP";
040    }
041
042    @Override
043    public CheckResult<N, E, S> canPerform(final Chunk<N> chunk, final E definiteExpression, final S scope) {
044        final boolean canPerformTransformation = transformationsSpi.partOfSameInvocable(chunk.getRepresented(),
045                definiteExpression);
046        return new NopCheckResult(chunk, definiteExpression, scope, canPerformTransformation);
047    }
048
049    @Override
050    @SuppressWarnings("unchecked")
051    public A perform(final CheckResult<N, E, S> result, final A preliminaryAnaphora) {
052        requireSuccessfulCheck(result);
053        requireInstanceOf(result, NopCheckResult.class);
054        return preliminaryAnaphora;
055    }
056
057    private class NopCheckResult extends AbstractCheckResult<N, E, S> {
058
059        /**
060         * Used in contract testing.
061         */
062        @SuppressWarnings("unused")
063        protected NopCheckResult() {
064        }
065
066        public NopCheckResult(final Chunk<N> chunk, final E definiteExpression, final S scope,
067                final boolean canPerformTransformation) {
068            super(chunk, definiteExpression, scope, canPerformTransformation);
069        }
070
071    }
072
073}