package com.example.lawofdemeter.model;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Type {
private Map<String,Field> fields;
private Map<String,Method> methods;
private Set<Type> parents;
public Iterable<Field> fields() {
return fields.values();
}
public Iterable<Method> methods() {
return methods.values();
}
public Iterable<Type> parents() {
return parents;
}
private String name;
public Type() {
this.fields = new HashMap<String,Field>();
this.methods = new HashMap<String,Method>();
this.parents = new HashSet<Type>();
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void putField(String name, Type type) {
Field field = fields.get(name);
if (field == null) fields.put(name, field = new Field());
field.setName(name);
field.setType(type);
}
public void removeField(String name) {
fields.remove(name);
}
public void putMethod(String name, Type returnType, Type... parameterTypes) {
Method method = methods.get(name);
if (method == null) methods.put(name, method = new Method());
method.setName(name);
method.setReturnType(returnType);
method.setParameterTypes(parameterTypes);
}
public Iterable<Type> friends() {
Collection<Type> friends = new HashSet<Type>();
for (Type parent: parents()) {
for (Type friend: parent.friends()) friends.add(friend);
}
for (Field field: fields()) {
friends.add(field.getType());
}
for (Method method: methods()) {
for (Type friend: method.parameterTypes()) friends.add(friend);
}
return friends;
}
}