blob: f1813f219acac5fece32ee5b98850bea80445097 [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* 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.facebook.buck.dalvik.firstorder;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import org.objectweb.asm.Handle;
import org.objectweb.asm.Type;
import java.util.Set;
import javax.annotation.Nullable;
class FirstOrderTypeInfo {
final Type type;
final Type superType;
final ImmutableSet<Type> interfaceTypes;
final ImmutableSet<Type> observedDependencies;
private FirstOrderTypeInfo(
Type type,
Type superType,
Iterable<Type> interfaceTypes,
Iterable<Type> observedDependencies) {
this.type = type;
this.superType = superType;
this.interfaceTypes = ImmutableSet.copyOf(interfaceTypes);
this.observedDependencies = ImmutableSet.copyOf(observedDependencies);
}
static Builder builder() {
return new Builder();
}
static class Builder {
@Nullable
private Type mType;
@Nullable
private Type mSuperType;
private final Set<Type> mInterfaceTypes = Sets.newHashSet();
private final Set<Type> mObservedDependencies = Sets.newHashSet();
FirstOrderTypeInfo build() {
Preconditions.checkNotNull(mType);
Preconditions.checkNotNull(mSuperType);
return new FirstOrderTypeInfo(
mType,
mSuperType,
mInterfaceTypes,
mObservedDependencies);
}
Builder setTypeInternalName(String internalName) {
Preconditions.checkState(mType == null);
mType = Type.getObjectType(internalName);
return this;
}
Builder setSuperTypeInternalName(String internalName) {
Preconditions.checkState(mSuperType == null);
Type type = Type.getObjectType(internalName);
mSuperType = type;
mObservedDependencies.add(type);
return this;
}
Builder addValue(Object value) {
if (value instanceof Type) {
addDependency((Type) value);
} else if (value instanceof Handle) {
Handle h = (Handle) value;
addDependencyInternalName(h.getOwner());
addDependencyDesc(h.getDesc());
}
return this;
}
Builder addInterfaceTypeInternalName(String internalName) {
Type type = Type.getObjectType(internalName);
mInterfaceTypes.add(type);
mObservedDependencies.add(type);
return this;
}
Builder addDependencyDesc(String desc) {
if (desc != null) {
addDependency(Type.getType(desc));
}
return this;
}
Builder addDependencyInternalName(String internalName) {
if (internalName != null) {
addDependency(Type.getObjectType(internalName));
}
return this;
}
Builder addDependency(Type type) {
switch (type.getSort()) {
case Type.OBJECT:
mObservedDependencies.add(type);
break;
case Type.ARRAY:
addDependency(type.getElementType());
break;
case Type.METHOD:
addDependency(type.getReturnType());
for (Type argumentType : type.getArgumentTypes()) {
addDependency(argumentType);
}
break;
default:
break;
}
return this;
}
}
}