001package de.monochromata.anaphors.ast.strategy;
002
003import static de.monochromata.anaphors.ast.relatedexp.strategy.ClassInstanceCreationStrategy.CIC_KIND;
004import static de.monochromata.anaphors.ast.relatedexp.strategy.MethodInvocationStrategy.MI_KIND;
005import static de.monochromata.anaphors.ast.relatedexp.strategy.ParameterDeclarationStrategy.PD_KIND;
006import static de.monochromata.anaphors.ast.relatedexp.strategy.LocalVariableDeclarationStrategy.LVD_KIND;
007
008import java.util.List;
009
010import de.monochromata.anaphors.ast.ASTBasedAnaphora;
011import de.monochromata.anaphors.ast.AnaphorPart;
012import de.monochromata.anaphors.ast.RelatedExpressionPart;
013import de.monochromata.anaphors.ast.relatedexp.RelatedExpression;
014import de.monochromata.anaphors.ast.relatedexp.strategy.LocalTempVariableIntroducingStrategy;
015import de.monochromata.anaphors.ast.relatedexp.strategy.RelatedExpressionStrategy;
016import de.monochromata.anaphors.ast.spi.RelatedExpressionsSpi;
017
018public interface AnaphorCreationForReferentInLocalTempVariable {
019
020        static <N, E, T, B, MB extends B, TB extends B, S, I, QI, EV, PP, R extends RelatedExpression<N, T, B, TB, S, QI, R>, A extends ASTBasedAnaphora<N, E, T, B, TB, S, I, QI, R, A>> String getAnaphorToBeRealized(
021                        final RelatedExpressionPart<N, E, T, B, TB, S, I, QI, R> relatedExpressionPart,
022                        final List<AnaphorPart<N, E, T, B, TB, S, I, QI, R, A>> allAnaphorPartsRelatedToTheRelatedExpression,
023                        final AnaphorPart<N, E, T, B, TB, S, I, QI, R, A> anaphorPart, final S scope,
024                        final RelatedExpressionsSpi<N, E, T, B, MB, TB, S, I, QI, EV, PP, R> relatedExpressionsSpi) {
025                final RelatedExpressionStrategy<N, T, B, TB, S, QI, R> reStrategy = relatedExpressionPart
026                                .getRelatedExpressionStrategy();
027                final String kindOfRelatedExpression = reStrategy.getKind();
028                switch (kindOfRelatedExpression) {
029                case CIC_KIND:
030                case MI_KIND:
031                        final I identifierForTempVariable = ((LocalTempVariableIntroducingStrategy<N, E, T, B, TB, S, I, QI, R, A>) reStrategy)
032                                        .getIdentifierForTempVariable(relatedExpressionPart, allAnaphorPartsRelatedToTheRelatedExpression,
033                                                        scope);
034                        return relatedExpressionsSpi.identifierToString(identifierForTempVariable);
035                case PD_KIND:
036                case LVD_KIND:
037                        final QI relatedExpressionName = relatedExpressionPart.getRelatedExpression().getName();
038                        return relatedExpressionsSpi.qualifiedIdentifierToString(relatedExpressionName);
039                default:
040                        throw new IllegalArgumentException("Unknown related expression strategy: " + reStrategy.getKind());
041                }
042        }
043
044}