Drop path() from FQ names, remove weird code from FqNameUnsafe

This commit is contained in:
Alexander Udalov
2015-10-20 21:45:08 +03:00
parent 8a89662ea5
commit 05f9f5a661
4 changed files with 17 additions and 133 deletions
@@ -24,52 +24,6 @@ import java.util.Arrays;
import java.util.List;
public class FqNameTest {
@Test
public void pathRoot() {
List<FqName> path = new FqName("").path();
Assert.assertEquals(1, path.size());
Assert.assertEquals("", path.get(0).asString());
}
@Test
public void pathLevel1() {
List<FqName> path = new FqName("org").path();
Assert.assertEquals(2, path.size());
Assert.assertEquals("", path.get(0).asString());
Assert.assertEquals("org", path.get(1).asString());
Assert.assertEquals("org", path.get(1).shortName().asString());
Assert.assertEquals("", path.get(1).parent().asString());
}
@Test
public void pathLevel2() {
List<FqName> path = new FqName("org.jetbrains").path();
Assert.assertEquals(3, path.size());
Assert.assertEquals("", path.get(0).asString());
Assert.assertEquals("org", path.get(1).asString());
Assert.assertEquals("org", path.get(1).shortName().asString());
Assert.assertEquals("", path.get(1).parent().asString());
Assert.assertEquals("org.jetbrains", path.get(2).asString());
Assert.assertEquals("jetbrains", path.get(2).shortName().asString());
Assert.assertEquals("org", path.get(2).parent().asString());
}
@Test
public void pathLevel3() {
List<FqName> path = new FqName("org.jetbrains.kotlin").path();
Assert.assertEquals(4, path.size());
Assert.assertEquals("", path.get(0).asString());
Assert.assertEquals("org", path.get(1).asString());
Assert.assertEquals("org", path.get(1).shortName().asString());
Assert.assertEquals("", path.get(1).parent().asString());
Assert.assertEquals("org.jetbrains", path.get(2).asString());
Assert.assertEquals("jetbrains", path.get(2).shortName().asString());
Assert.assertEquals("org", path.get(2).parent().asString());
Assert.assertEquals("org.jetbrains.kotlin", path.get(3).asString());
Assert.assertEquals("kotlin", path.get(3).shortName().asString());
Assert.assertEquals("org.jetbrains", path.get(3).parent().asString());
}
@Test
public void pathSegments() {
Assert.assertEquals(new ArrayList<Name>(), new FqName("").pathSegments());
@@ -99,20 +99,6 @@ public final class FqName {
return fqName.shortNameOrSpecial();
}
@NotNull
public List<FqName> path() {
final List<FqName> path = new ArrayList<FqName>();
path.add(ROOT);
fqName.walk(new FqNameUnsafe.WalkCallback() {
@Override
public void segment(@NotNull Name shortName, @NotNull FqNameUnsafe fqName) {
// TODO: do not validate
path.add(new FqName(fqName));
}
});
return path;
}
@NotNull
public List<Name> pathSegments() {
return fqName.pathSegments();
@@ -16,10 +16,12 @@
package org.jetbrains.kotlin.name;
import kotlin.ArraysKt;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@@ -146,77 +148,15 @@ public final class FqNameUnsafe {
}
}
interface WalkCallback {
void segment(@NotNull Name shortName, @NotNull FqNameUnsafe fqName);
}
@NotNull
public List<FqNameUnsafe> path() {
final List<FqNameUnsafe> path = new ArrayList<FqNameUnsafe>();
path.add(FqName.ROOT.toUnsafe());
walk(new WalkCallback() {
@Override
public void segment(@NotNull Name shortName, @NotNull FqNameUnsafe fqName) {
path.add(fqName);
}
});
return path;
}
@NotNull
public List<Name> pathSegments() {
final List<Name> path = new ArrayList<Name>();
walk(new WalkCallback() {
@Override
public void segment(@NotNull Name shortName, @NotNull FqNameUnsafe fqName) {
path.add(shortName);
}
});
return path;
}
void walk(@NotNull WalkCallback callback) {
if (isRoot()) {
return;
}
int pos = fqName.indexOf('.');
if (pos < 0) {
if (this.parent == null) {
this.parent = FqName.ROOT.toUnsafe();
}
if (this.shortName == null) {
this.shortName = Name.guess(fqName);
}
callback.segment(shortName, this);
return;
}
Name firstSegment = Name.guess(fqName.substring(0, pos));
FqNameUnsafe last = new FqNameUnsafe(firstSegment.asString(), FqName.ROOT.toUnsafe(), firstSegment);
callback.segment(firstSegment, last);
while (true) {
int next = fqName.indexOf('.', pos + 1);
if (next < 0) {
if (this.parent == null) {
this.parent = last;
}
Name shortName = Name.guess(fqName.substring(pos + 1));
if (this.shortName == null) {
this.shortName = shortName;
}
callback.segment(shortName, this);
return;
}
Name shortName = Name.guess(fqName.substring(pos + 1, next));
last = new FqNameUnsafe(fqName.substring(0, next), last, shortName);
callback.segment(shortName, last);
pos = next;
}
return isRoot() ? Collections.<Name>emptyList() :
ArraysKt.map(fqName.split("\\."), new Function1<String, Name>() {
@Override
public Name invoke(String name) {
return Name.guess(name);
}
});
}
public boolean startsWith(@NotNull Name segment) {
@@ -208,8 +208,10 @@ public final class StaticContext {
JsNameRef result = null;
JsNameRef qualifier = null;
for (FqName pathElement : ContainerUtil.reverse(packageFqName.path())) {
JsNameRef ref = getNameForPackage(pathElement).makeRef();
FqName fqName = packageFqName;
while (true) {
JsNameRef ref = getNameForPackage(fqName).makeRef();
if (qualifier == null) {
result = ref;
@@ -219,9 +221,11 @@ public final class StaticContext {
}
qualifier = ref;
if (fqName.isRoot()) break;
fqName = fqName.parent();
}
assert result != null : "didn't iterate: " + packageFqName;
return result;
}