blob: 93e600d2d8cd4045924a1f32c5a7eac80059b030 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2013, 2020 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.ltk.model.core.util;
import java.util.Comparator;
import com.ibm.icu.text.Collator;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.ltk.model.core.LtkModelUtils;
import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
import org.eclipse.statet.ltk.model.core.element.SourceElement;
import org.eclipse.statet.ltk.model.core.element.SourceUnit;
@NonNullByDefault
public class LtkModelElementComparator implements Comparator<LtkModelElement> {
private final Collator unitIdComparator;
private final Collator elementIdComparator;
public LtkModelElementComparator() {
this(Collator.getInstance());
}
public LtkModelElementComparator(final Collator elementIdComparator) {
this.unitIdComparator= Collator.getInstance();
this.elementIdComparator= elementIdComparator;
}
@Override
public int compare(final @Nullable LtkModelElement e1, final @Nullable LtkModelElement e2) {
if (e1 == e2) {
return 0;
}
if (e1 == null) {
return 1;
}
if (e2 == null) {
return -1;
}
final SourceUnit u1= LtkModelUtils.getSourceUnit(e1);
final SourceUnit u2= LtkModelUtils.getSourceUnit(e2);
final int result= compareSourceUnits(u1, u2);
if (result != 0) {
return result;
}
if (e1 instanceof SourceElement) {
if (e2 instanceof SourceElement) {
return compareSourceElementsInUnit((SourceElement)e1, (SourceElement)e2);
}
return -1;
}
else if (e2 instanceof SourceElement) { // && !(e1 instanceof SourceUnit)
return 1;
}
else {
return this.elementIdComparator.compare(e1.getId(), e2.getId());
}
}
protected int compareSourceUnits(final @Nullable SourceUnit u1, final @Nullable SourceUnit u2) {
if (u1 == u2) {
return 0;
}
if (u1 == null) {
return 1;
}
if (u2 == null) {
return -1;
}
return this.unitIdComparator.compare(u1.getId(), u2.getId());
}
protected int compareSourceElementsInUnit(final SourceElement e1, final SourceElement e2) {
return e1.getSourceRange().getStartOffset() - e2.getSourceRange().getStartOffset();
}
}