blob: 7ff4f7c4fd2a6f4c8e719773c06efdc696ee2e5d [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.util;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.stubs.StubInputStream;
import com.intellij.psi.stubs.StubOutputStream;
import com.intellij.util.io.StringRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author yole
*/
public class QualifiedName {
@NotNull private final List<String> myComponents;
private QualifiedName(int count) {
myComponents = new ArrayList<String>(count);
}
public static QualifiedName fromComponents(Collection<String> components) {
QualifiedName qName = new QualifiedName(components.size());
qName.myComponents.addAll(components);
return qName;
}
@NotNull
public static QualifiedName fromComponents(String... components) {
QualifiedName result = new QualifiedName(components.length);
Collections.addAll(result.myComponents, components);
return result;
}
public QualifiedName append(String name) {
QualifiedName result = new QualifiedName(myComponents.size()+1);
result.myComponents.addAll(myComponents);
result.myComponents.add(name);
return result;
}
public QualifiedName append(QualifiedName qName) {
QualifiedName result = new QualifiedName(myComponents.size()+qName.getComponentCount());
result.myComponents.addAll(myComponents);
result.myComponents.addAll(qName.getComponents());
return result;
}
@NotNull
public QualifiedName removeLastComponent() {
return removeTail(1);
}
@NotNull
public QualifiedName removeTail(int count) {
int size = myComponents.size();
QualifiedName result = new QualifiedName(size);
result.myComponents.addAll(myComponents);
for (int i = 0; i < count && !result.myComponents.isEmpty(); i++) {
result.myComponents.remove(result.myComponents.size()-1);
}
return result;
}
@NotNull
public QualifiedName removeHead(int count) {
int size = myComponents.size();
QualifiedName result = new QualifiedName(size);
result.myComponents.addAll(myComponents);
for (int i = 0; i < count && !result.myComponents.isEmpty(); i++) {
result.myComponents.remove(0);
}
return result;
}
@NotNull
public List<String> getComponents() {
return myComponents;
}
public int getComponentCount() {
return myComponents.size();
}
public boolean matches(String... components) {
if (myComponents.size() != components.length) {
return false;
}
for (int i = 0; i < myComponents.size(); i++) {
if (!myComponents.get(i).equals(components[i])) {
return false;
}
}
return true;
}
public boolean matchesPrefix(QualifiedName prefix) {
if (getComponentCount() < prefix.getComponentCount()) {
return false;
}
for (int i = 0; i < prefix.getComponentCount(); i++) {
final String component = getComponents().get(i);
if (component == null || !component.equals(prefix.getComponents().get(i))) {
return false;
}
}
return true;
}
public boolean endsWith(@NotNull String suffix) {
return suffix.equals(getLastComponent());
}
public static void serialize(@Nullable QualifiedName qName, StubOutputStream dataStream) throws IOException {
if (qName == null) {
dataStream.writeVarInt(0);
}
else {
dataStream.writeVarInt(qName.getComponentCount());
for (String s : qName.myComponents) {
dataStream.writeName(s);
}
}
}
@Nullable
public static QualifiedName deserialize(StubInputStream dataStream) throws IOException {
QualifiedName qName;
int size = dataStream.readVarInt();
if (size == 0) {
qName = null;
}
else {
qName = new QualifiedName(size);
for (int i = 0; i < size; i++) {
final StringRef name = dataStream.readName();
qName.myComponents.add(name == null ? null : name.getString());
}
}
return qName;
}
@Nullable
public String getFirstComponent() {
if (myComponents.isEmpty()) {
return null;
}
return myComponents.get(0);
}
@Nullable
public String getLastComponent() {
if (myComponents.isEmpty()) {
return null;
}
return myComponents.get(myComponents.size()-1);
}
@Override
public String toString() {
return join(".");
}
public String join(final String separator) {
return StringUtil.join(myComponents, separator);
}
@NotNull
public static QualifiedName fromDottedString(@NotNull String refName) {
return fromComponents(refName.split("\\."));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
QualifiedName that = (QualifiedName)o;
return myComponents.equals(that.myComponents);
}
@Override
public int hashCode() {
return myComponents.hashCode();
}
public QualifiedName subQualifiedName(int fromIndex, int toIndex) {
return fromComponents(myComponents.subList(fromIndex, toIndex));
}
}