All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.bnd.signatures.ClassSignature Maven / Gradle / Ivy

The newest version!
package aQute.bnd.signatures;

import static aQute.bnd.signatures.ClassTypeSignature.parseClassTypeSignature;
import static aQute.bnd.signatures.Signatures.isEmpty;
import static aQute.bnd.signatures.TypeParameter.parseTypeParameters;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import aQute.lib.stringrover.StringRover;

public class ClassSignature implements Signature {
	public final TypeParameter[]		typeParameters;
	public final ClassTypeSignature		superClass;
	public final ClassTypeSignature[]	superInterfaces;

	public static ClassSignature of(String signature) {
		return parseClassSignature(new StringRover(signature));
	}

	public ClassSignature(TypeParameter[] typeParameters, ClassTypeSignature superClass,
		ClassTypeSignature[] superInterfaces) {
		this.typeParameters = typeParameters;
		this.superClass = superClass;
		this.superInterfaces = superInterfaces;
	}

	@Override
	public Set erasedBinaryReferences() {
		Set references = new HashSet<>();
		TypeParameter.erasedBinaryReferences(typeParameters, references);
		Signatures.erasedBinaryReferences(superClass, references);
		for (ClassTypeSignature superInterface : superInterfaces) {
			Signatures.erasedBinaryReferences(superInterface, references);
		}
		return references;
	}

	@Override
	public int hashCode() {
		int result = 1 * 31 + Arrays.hashCode(typeParameters);
		result = result * 31 + superClass.hashCode();
		result = result * 31 + Arrays.hashCode(superInterfaces);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof ClassSignature other)) {
			return false;
		}
		return Objects.equals(superClass, other.superClass) && Arrays.equals(typeParameters, other.typeParameters)
			&& Arrays.equals(superInterfaces, other.superInterfaces);
	}

	@Override
	public String toString() {
		if (isEmpty(typeParameters) && isEmpty(superInterfaces)) {
			return superClass.toString();
		}
		StringBuilder sb = new StringBuilder();
		if (!isEmpty(typeParameters)) {
			sb.append('<');
			for (TypeParameter t : typeParameters) {
				sb.append(t);
			}
			sb.append('>');
		}
		sb.append(superClass);
		for (ClassTypeSignature t : superInterfaces) {
			sb.append(t);
		}
		return sb.toString();
	}

	static ClassSignature parseClassSignature(StringRover signature) {
		TypeParameter[] typeParameters = parseTypeParameters(signature);
		ClassTypeSignature superClass = parseClassTypeSignature(signature);
		if (signature.isEmpty()) {
			return new ClassSignature(typeParameters, superClass, ClassTypeSignature.EMPTY);
		}
		List list = new ArrayList<>();
		do {
			ClassTypeSignature item = parseClassTypeSignature(signature);
			list.add(item);
		} while (!signature.isEmpty());
		return new ClassSignature(typeParameters, superClass, list.toArray(ClassTypeSignature.EMPTY));
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy