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}