[FE] Convert ClassId.java to Kotlin
This commit is contained in:
committed by
Space Team
parent
a3bcac00e4
commit
a43cb721ba
@@ -13,14 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.name;
|
||||
|
||||
import kotlin.text.StringsKt;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
package org.jetbrains.kotlin.name
|
||||
|
||||
/**
|
||||
* A class name which is used to uniquely identify a Kotlin class.
|
||||
@@ -31,145 +24,106 @@ import java.util.List;
|
||||
* the package, separated by dollar signs. If a class is an inner of local, relativeClassName would consist of two names,
|
||||
* the second one being the class' short name.
|
||||
*/
|
||||
public final class ClassId {
|
||||
@NotNull
|
||||
public static ClassId topLevel(@NotNull FqName topLevelFqName) {
|
||||
return new ClassId(topLevelFqName.parent(), topLevelFqName.shortName());
|
||||
class ClassId(val packageFqName: FqName, relativeClassName: FqName, local: Boolean) {
|
||||
val relativeClassName: FqName
|
||||
val isLocal: Boolean
|
||||
|
||||
init {
|
||||
assert(!relativeClassName.isRoot) { "Class name must not be root: " + packageFqName + if (local) " (local)" else "" }
|
||||
this.relativeClassName = relativeClassName
|
||||
isLocal = local
|
||||
}
|
||||
|
||||
private final FqName packageFqName;
|
||||
private final FqName relativeClassName;
|
||||
private final boolean local;
|
||||
constructor(packageFqName: FqName, topLevelName: Name) : this(packageFqName, FqName.topLevel(topLevelName), false)
|
||||
|
||||
public ClassId(@NotNull FqName packageFqName, @NotNull FqName relativeClassName, boolean local) {
|
||||
this.packageFqName = packageFqName;
|
||||
assert !relativeClassName.isRoot() :
|
||||
"Class name must not be root: " + packageFqName + (local ? " (local)" : "");
|
||||
this.relativeClassName = relativeClassName;
|
||||
this.local = local;
|
||||
val parentClassId: ClassId?
|
||||
get() = if (!isNestedClass) null else ClassId(
|
||||
packageFqName,
|
||||
relativeClassName.parent(),
|
||||
isLocal
|
||||
)
|
||||
val shortClassName: Name
|
||||
get() = relativeClassName.shortName()
|
||||
|
||||
fun createNestedClassId(name: Name): ClassId {
|
||||
return ClassId(packageFqName, relativeClassName.child(name), isLocal)
|
||||
}
|
||||
|
||||
public ClassId(@NotNull FqName packageFqName, @NotNull Name topLevelName) {
|
||||
this(packageFqName, FqName.topLevel(topLevelName), false);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public FqName getPackageFqName() {
|
||||
return packageFqName;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public FqName getRelativeClassName() {
|
||||
return relativeClassName;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ClassId getParentClassId() {
|
||||
if (!isNestedClass()) return null;
|
||||
return new ClassId(packageFqName, relativeClassName.parent(), isLocal());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Name getShortClassName() {
|
||||
return relativeClassName.shortName();
|
||||
}
|
||||
|
||||
public boolean isLocal() {
|
||||
return local;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ClassId createNestedClassId(@NotNull Name name) {
|
||||
return new ClassId(getPackageFqName(), relativeClassName.child(name), local);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ClassId getOuterClassId() {
|
||||
FqName parent = relativeClassName.parent();
|
||||
return parent.isRoot() ? null : new ClassId(getPackageFqName(), parent, local);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ClassId getOutermostClassId() {
|
||||
FqName name = relativeClassName;
|
||||
while (!name.parent().isRoot()) name = name.parent();
|
||||
return new ClassId(packageFqName, name, false);
|
||||
}
|
||||
|
||||
public boolean isNestedClass() {
|
||||
return !relativeClassName.parent().isRoot();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public FqName asSingleFqName() {
|
||||
if (packageFqName.isRoot()) return relativeClassName;
|
||||
return new FqName(packageFqName.asString() + "." + relativeClassName.asString());
|
||||
}
|
||||
|
||||
public boolean startsWith(@NotNull Name segment) {
|
||||
return packageFqName.startsWith(segment);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
|
||||
*/
|
||||
@NotNull
|
||||
public static ClassId fromString(@NotNull String string) {
|
||||
return fromString(string, false);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static ClassId fromString(@NotNull String string, boolean isLocal) {
|
||||
int lastSlashIndex = string.lastIndexOf("/");
|
||||
String packageName;
|
||||
String className;
|
||||
if (lastSlashIndex == -1) {
|
||||
packageName = "";
|
||||
className = string;
|
||||
} else {
|
||||
packageName = string.substring(0, lastSlashIndex).replace('/', '.');
|
||||
className = string.substring(lastSlashIndex + 1);
|
||||
val outerClassId: ClassId?
|
||||
get() {
|
||||
val parent = relativeClassName.parent()
|
||||
return if (parent.isRoot) null else ClassId(packageFqName, parent, isLocal)
|
||||
}
|
||||
return new ClassId(new FqName(packageName), new FqName(className), isLocal);
|
||||
val outermostClassId: ClassId
|
||||
get() {
|
||||
var name = relativeClassName
|
||||
while (!name.parent().isRoot) name = name.parent()
|
||||
return ClassId(packageFqName, name, false)
|
||||
}
|
||||
val isNestedClass: Boolean
|
||||
get() = !relativeClassName.parent().isRoot
|
||||
|
||||
fun asSingleFqName(): FqName {
|
||||
return if (packageFqName.isRoot) relativeClassName else FqName(packageFqName.asString() + "." + relativeClassName.asString())
|
||||
}
|
||||
|
||||
fun startsWith(segment: Name): Boolean {
|
||||
return packageFqName.startsWith(segment)
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
|
||||
*/
|
||||
@NotNull
|
||||
public String asString() {
|
||||
if (packageFqName.isRoot()) return relativeClassName.asString();
|
||||
return packageFqName.asString().replace('.', '/') + "/" + relativeClassName.asString();
|
||||
fun asString(): String {
|
||||
return if (packageFqName.isRoot) relativeClassName.asString() else packageFqName.asString()
|
||||
.replace('.', '/') + "/" + relativeClassName.asString()
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String asFqNameString() {
|
||||
if (packageFqName.isRoot()) return relativeClassName.asString();
|
||||
return packageFqName.asString() + "." + relativeClassName.asString();
|
||||
fun asFqNameString(): String {
|
||||
return if (packageFqName.isRoot) relativeClassName.asString() else packageFqName.asString() + "." + relativeClassName.asString()
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
ClassId id = (ClassId) o;
|
||||
|
||||
return packageFqName.equals(id.packageFqName) &&
|
||||
relativeClassName.equals(id.relativeClassName) &&
|
||||
local == id.local;
|
||||
override fun equals(o: Any?): Boolean {
|
||||
if (this === o) return true
|
||||
if (o == null || javaClass != o.javaClass) return false
|
||||
val id = o as ClassId
|
||||
return packageFqName == id.packageFqName && relativeClassName == id.relativeClassName && isLocal == id.isLocal
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = packageFqName.hashCode();
|
||||
result = 31 * result + relativeClassName.hashCode();
|
||||
result = 31 * result + Boolean.valueOf(local).hashCode();
|
||||
return result;
|
||||
override fun hashCode(): Int {
|
||||
var result = packageFqName.hashCode()
|
||||
result = 31 * result + relativeClassName.hashCode()
|
||||
result = 31 * result + isLocal.hashCode()
|
||||
return result
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return packageFqName.isRoot() ? "/" + asString() : asString();
|
||||
override fun toString(): String {
|
||||
return if (packageFqName.isRoot) "/" + asString() else asString()
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun topLevel(topLevelFqName: FqName): ClassId {
|
||||
return ClassId(topLevelFqName.parent(), topLevelFqName.shortName())
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
|
||||
*/
|
||||
@JvmOverloads
|
||||
@JvmStatic
|
||||
fun fromString(string: String, isLocal: Boolean = false): ClassId {
|
||||
val lastSlashIndex = string.lastIndexOf("/")
|
||||
val packageName: String
|
||||
val className: String
|
||||
if (lastSlashIndex == -1) {
|
||||
packageName = ""
|
||||
className = string
|
||||
} else {
|
||||
packageName = string.substring(0, lastSlashIndex).replace('/', '.')
|
||||
className = string.substring(lastSlashIndex + 1)
|
||||
}
|
||||
return ClassId(FqName(packageName), FqName(className), isLocal)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user