001package de.monochromata.anaphors.ast; 002 003import de.monochromata.anaphors.ast.relatedexp.RelatedExpression; 004import de.monochromata.anaphors.ast.relatedexp.strategy.RelatedExpressionStrategy; 005 006/** 007 * An default implementation of the {@link RelatedExpressionPart} interface. 008 * 009 * @param <N> The node type in the AST 010 * @param <E> The expression type 011 * @param <T> The type type 012 * @param <B> The binding type 013 * @param <VB> The variable binding type 014 * @param <TB> The type binding type 015 * @param <S> The scope type (optional) 016 * @param <I> The type used to represent identifiers 017 * @param <QI> The type used to represent qualified identifiers 018 * @param <R> The sub-type of related expression to use 019 */ 020public class DefaultRelatedExpressionPart<N, E, T, B, VB extends B, TB extends B, S, I, QI, R extends RelatedExpression<N, T, B, TB, S, QI, R>> 021 implements RelatedExpressionPart<N, E, T, B, TB, S, I, QI, R> { 022 023 private final R relatedExpression; 024 025 /** 026 * Used in contract testing. 027 */ 028 @SuppressWarnings("unused") 029 protected DefaultRelatedExpressionPart() { 030 this(null); 031 } 032 033 public DefaultRelatedExpressionPart(final R relatedExpression) { 034 this.relatedExpression = relatedExpression; 035 } 036 037 @Override 038 public R getRelatedExpression() { 039 return relatedExpression; 040 } 041 042 @Override 043 public RelatedExpressionStrategy<N, T, B, TB, S, QI, R> getRelatedExpressionStrategy() { 044 return relatedExpression.getStrategy(); 045 } 046 047 @Override 048 public int hashCode() { 049 final int prime = 31; 050 int result = 1; 051 result = prime * result + ((relatedExpression == null) ? 0 : relatedExpression.hashCode()); 052 return result; 053 } 054 055 @Override 056 public boolean equals(final Object obj) { 057 if (this == obj) { 058 return true; 059 } 060 if (obj == null) { 061 return false; 062 } 063 if (getClass() != obj.getClass()) { 064 return false; 065 } 066 final DefaultRelatedExpressionPart other = (DefaultRelatedExpressionPart) obj; 067 if (relatedExpression == null) { 068 if (other.relatedExpression != null) { 069 return false; 070 } 071 } else if (!relatedExpression.equals(other.relatedExpression)) { 072 return false; 073 } 074 return true; 075 } 076 077 @Override 078 public String toString() { 079 return "DefaultRelatedExpressionPart [relatedExpression=" + relatedExpression + "]"; 080 } 081 082}