blob: dc481137f03527c9d78691996eaa0aa62ac7c2da [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* 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 signature.model.util;
import static signature.model.impl.Uninitialized.isInitialized;
import signature.model.IClassReference;
import signature.model.IGenericDeclaration;
import signature.model.ITypeReference;
import signature.model.ITypeVariableReference;
import signature.model.impl.SigArrayType;
import signature.model.impl.SigClassDefinition;
import signature.model.impl.SigClassReference;
import signature.model.impl.SigParameterizedType;
import signature.model.impl.SigTypeVariableDefinition;
import signature.model.impl.SigTypeVariableReference;
import signature.model.impl.SigWildcardType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Pool and factory for all {@link ITypeReference} instances.<br>
* Note: This class is not thread save
*/
public class TypePool implements ITypeFactory {
/**
* Pool for all SigClass objects. Key format: "java.lang.Object", "a.b.C$D
*/
private Map<String, SigClassDefinition> classPool;
/** Pool for all SigTypeVariable objects */
private Map<TypeVariableKey, SigTypeVariableDefinition> typeVariablePool;
public TypePool() {
classPool = new HashMap<String, SigClassDefinition>();
typeVariablePool =
new HashMap<TypeVariableKey, SigTypeVariableDefinition>();
}
public SigClassDefinition getClass(String packageName, String className) {
String key = packageName + "<>" + className;
SigClassDefinition clazz = classPool.get(key);
if (clazz == null) {
clazz = new SigClassDefinition(packageName, className);
classPool.put(key, clazz);
}
return clazz;
}
public IClassReference getClassReference(String packageName,
String className) {
return new SigClassReference(getClass(packageName, className));
}
public SigArrayType getArrayType(ITypeReference componentType) {
assert componentType != null;
return new SigArrayType(componentType);
}
public SigParameterizedType getParameterizedType(ITypeReference ownerType,
IClassReference rawType, List<ITypeReference> typeArguments) {
assert rawType != null;
assert typeArguments != null;
return new SigParameterizedType(ownerType, rawType, typeArguments);
}
private static class TypeVariableKey {
private String name;
private IGenericDeclaration genericDeclaration;
public TypeVariableKey(String name,
IGenericDeclaration genericDeclaration) {
this.genericDeclaration = genericDeclaration;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + genericDeclaration.hashCode();
result = prime * result + name.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
TypeVariableKey other = (TypeVariableKey) obj;
if (genericDeclaration != other.genericDeclaration) {
return false;
}
if (!name.equals(other.name)) {
return false;
}
return true;
}
}
public boolean containsTypeVariableDefinition(String name,
IGenericDeclaration genericDeclaration) {
TypeVariableKey key = new TypeVariableKey(name, genericDeclaration);
return typeVariablePool.get(key) != null;
}
public SigTypeVariableDefinition getTypeVariable(String name,
IGenericDeclaration genericDeclaration) {
assert name != null;
assert genericDeclaration != null;
TypeVariableKey key = new TypeVariableKey(name, genericDeclaration);
SigTypeVariableDefinition sigTypeVariable = typeVariablePool.get(key);
if (sigTypeVariable == null) {
sigTypeVariable = new SigTypeVariableDefinition(name,
genericDeclaration);
typeVariablePool.put(key, sigTypeVariable);
}
return sigTypeVariable;
}
public ITypeVariableReference getTypeVariableReference(String name,
IGenericDeclaration genericDeclaration) {
return new SigTypeVariableReference(getTypeVariable(name,
genericDeclaration));
}
public SigWildcardType getWildcardType(ITypeReference lowerBound,
List<ITypeReference> upperBounds) {
assert upperBounds != null;
SigWildcardType sigWildcardType = new SigWildcardType(lowerBound,
upperBounds);
return sigWildcardType;
}
public void replaceAllUninitialiezWithNull() {
for (SigClassDefinition clazz : classPool.values()) {
replaceUninitializedWithNull(clazz);
}
}
private static void replaceUninitializedWithNull(
SigClassDefinition clazz) {
if (clazz == null) {
return;
}
if (!isInitialized(clazz.getAnnotationFields())) {
clazz.setAnnotationFields(null);
}
if (!isInitialized(clazz.getAnnotations())) {
clazz.setAnnotations(null);
}
if (!isInitialized(clazz.getAnnotations())) {
clazz.setAnnotations(null);
}
if (!isInitialized(clazz.getConstructors())) {
clazz.setConstructors(null);
}
if (!isInitialized(clazz.getDeclaringClass())) {
clazz.setDeclaringClass(null);
}
if (!isInitialized(clazz.getEnumConstants())) {
clazz.setEnumConstants(null);
}
if (!isInitialized(clazz.getFields())) {
clazz.setFields(null);
}
if (!isInitialized(clazz.getInnerClasses())) {
clazz.setInnerClasses(null);
}
if (!isInitialized(clazz.getInterfaces())) {
clazz.setInterfaces(null);
}
if (!isInitialized(clazz.getKind())) {
clazz.setKind(null);
}
if (!isInitialized(clazz.getMethods())) {
clazz.setMethods(null);
}
if (!isInitialized(clazz.getModifiers())) {
clazz.setModifiers(null);
}
if (!isInitialized(clazz.getSuperClass())) {
clazz.setSuperClass(null);
}
if (!isInitialized(clazz.getTypeParameters())) {
clazz.setTypeParameters(null);
}
}
}