package me.tomassetti.turin.parser.ast;
import com.google.common.collect.ImmutableList;
import me.tomassetti.jvm.JvmNameUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class QualifiedName extends Node {
private QualifiedName base;
private String name;
public static QualifiedName create(List<String> base) {
if (base.isEmpty()) {
throw new IllegalArgumentException();
} else if (base.size() == 1) {
return new QualifiedName(base.get(0));
} else {
return new QualifiedName(QualifiedName.create(base.subList(0, base.size() - 1)), base.get(base.size() - 1));
}
}
public QualifiedName getBase() {
return base;
}
public String getName() {
return name;
}
public QualifiedName(QualifiedName base, String name) {
if (!JvmNameUtils.isValidQualifiedName(name)) {
throw new IllegalArgumentException();
}
this.base = base;
this.name = name;
}
public QualifiedName(String name) {
if (!JvmNameUtils.isValidQualifiedName(name)) {
throw new IllegalArgumentException();
}
this.name = name;
}
public boolean isSimpleName() {
return base == null;
}
@Override
public Iterable<Node> getChildren() {
if (base == null) {
return Collections.emptyList();
} else {
return ImmutableList.of(base);
}
}
public String qualifiedName() {
if (base == null) {
return name;
} else {
return base + "." + name;
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
QualifiedName that = (QualifiedName) o;
if (base != null ? !base.equals(that.base) : that.base != null) return false;
if (!name.equals(that.name)) return false;
return true;
}
@Override
public int hashCode() {
int result = base != null ? base.hashCode() : 0;
result = 31 * result + name.hashCode();
return result;
}
@Override
public String toString() {
return qualifiedName();
}
public String firstSegment() {
if (isSimpleName()) {
return name;
} else {
return base.firstSegment();
}
}
public QualifiedName rest() {
if (isSimpleName()) {
throw new UnsupportedOperationException();
}
if (base.isSimpleName()) {
return new QualifiedName(name);
} else {
return new QualifiedName(base.rest(), name);
}
}
public static QualifiedName create(String path) {
return create(Arrays.stream(path.split("\\.")).collect(Collectors.toList()));
}
}