From d484064076e5b9f1719e8e95de5b53b710bfe689 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 9 Apr 2020 15:59:55 +0200 Subject: [PATCH] Make DeclarationInTextSource implement hashCode/equals In order to de-duplicate warnings, we will want to use StatementSourceReference as a Set member, for which we need all implementations to behave correctly w.r.t comparison. JIRA: YANGTOOLS-1090 Change-Id: I18971e7681c02f56300a64cb08fda4bf4eef613a Signed-off-by: Robert Varga --- .../spi/source/DeclarationInTextSource.java | 82 +++++++++++++------ 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/DeclarationInTextSource.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/DeclarationInTextSource.java index 3d340e0e69..a8e7f0198d 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/DeclarationInTextSource.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/source/DeclarationInTextSource.java @@ -7,24 +7,23 @@ */ package org.opendaylight.yangtools.yang.parser.spi.source; +import java.util.Objects; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; /** * Reference of statement source present in textual source format. Utility implementation - * of {@link StatementSourceReference} for textual sources, this is prefered {@link StatementSourceReference} + * of {@link StatementSourceReference} for textual sources, this is preferred {@link StatementSourceReference} * for implementations of YANG / YIN statement stream sources. * *

* To create source reference use one of this static factories: *

*/ public abstract class DeclarationInTextSource implements StatementSourceReference { @@ -32,11 +31,6 @@ public abstract class DeclarationInTextSource implements StatementSourceReferenc InSource(final String sourceName) { super(sourceName); } - - @Override - public String toString() { - return getSourceName(); - } } private static class AtLine extends InSource { @@ -48,12 +42,18 @@ public abstract class DeclarationInTextSource implements StatementSourceReferenc } @Override - public String toString() { - return getSourceName() + ':' + line; + int hashCodeImpl() { + return super.hashCodeImpl() * 31 + line; + } + + @Override + boolean equalsImpl(final DeclarationInTextSource obj) { + return line == ((AtLine) obj).line && super.equalsImpl(obj); } - int getLine() { - return line; + @Override + public String toString() { + return super.toString() + ':' + line; } } @@ -65,9 +65,19 @@ public abstract class DeclarationInTextSource implements StatementSourceReferenc this.character = character; } + @Override + int hashCodeImpl() { + return super.hashCodeImpl() * 31 + character; + } + + @Override + boolean equalsImpl(final DeclarationInTextSource obj) { + return character == ((AtPosition) obj).character && super.equalsImpl(obj); + } + @Override public String toString() { - return getSourceName() + ':' + getLine() + ':' + character; + return super.toString() + ':' + character; } } @@ -77,27 +87,49 @@ public abstract class DeclarationInTextSource implements StatementSourceReferenc this.sourceName = sourceName; } - public static DeclarationInTextSource inSource(final String sourceName) { + public static @NonNull DeclarationInTextSource inSource(final String sourceName) { return new InSource(sourceName); } - public static DeclarationInTextSource atLine(final String sourceName, final int line) { + public static @NonNull DeclarationInTextSource atLine(final String sourceName, final int line) { return new AtLine(sourceName, line); } - public static DeclarationInTextSource atPosition(final String sourceName, final int line, final int position) { + public static @NonNull DeclarationInTextSource atPosition(final String sourceName, final int line, + final int position) { return new AtPosition(sourceName, line, position); } - public String getSourceName() { + public final String getSourceName() { return sourceName; } @Override - public StatementSource getStatementSource() { + public final StatementSource getStatementSource() { return StatementSource.DECLARATION; } @Override - public abstract String toString(); + public final int hashCode() { + return hashCodeImpl(); + } + + @Override + public final boolean equals(final Object obj) { + return this == obj + || obj != null && getClass().equals(obj.getClass()) && equalsImpl((DeclarationInTextSource) obj); + } + + @Override + public String toString() { + return sourceName == null ? "null" : sourceName; + } + + int hashCodeImpl() { + return Objects.hashCode(sourceName); + } + + boolean equalsImpl(final DeclarationInTextSource obj) { + return Objects.equals(sourceName, obj.sourceName); + } } -- 2.36.6