package jetbrains.mps.internal.make.runtime.util; /*Generated by MPS */ import jetbrains.mps.make.IHName; import java.util.regex.Pattern; import java.util.regex.Matcher; public abstract class DefaultHName<T> implements IHName<T> { private static Pattern FQNAME = Pattern.compile("(.+)\\.([^\\.]+)"); private T parentName; private String name; protected DefaultHName(T parentName, String name) { this.parentName = parentName; this.name = name; } protected DefaultHName(String fqName) { Matcher m = FQNAME.matcher(fqName); if (m.matches()) { this.parentName = createParentName(m.group(1)); this.name = m.group(2); } else { this.name = fqName; } } @Override public final T parentName() { return parentName; } @Override public final String fqName() { return prefix() + name; } @Override public String name() { return name; } @Override public boolean equals(Object that) { if (this == that) { return true; } if (!(that instanceof IHName)) { return false; } return fqName().equals(((IHName) that).fqName()); } @Override public int hashCode() { return fqName().hashCode() * 43; } @Override public String toString() { return fqName(); } /** * Override and make final. Called from the constructor when object is not fully constructed. * * @param parentFqName * @return */ protected abstract T createParentName(String parentFqName); private String prefix() { if (parentName == null) { return ""; } return (((parentName instanceof IHName) ? ((IHName) parentName).fqName() : parentName.toString())) + "."; } }