package fr.inria.diversify.codeFragment;
import spoon.reflect.reference.CtTypeReference;
import spoon.reflect.reference.CtVariableReference;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class InputContext {
protected Set<CtVariableReference<?>> variableReferences;
protected Integer hashCode = null;
public InputContext(Set<CtVariableReference<?>> inputContext) {
this.variableReferences = inputContext;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof InputContext))
return false;
return this.hashCode() == obj.hashCode();
}
protected Set<String> inputContextToString() {
HashSet<String> result = new HashSet<>();
for (CtVariableReference var : variableReferences) {
result.add(var.getType().toString());
}
return result;
}
public List<CtVariableReference> allCandidate(CtTypeReference<?> type, boolean subType) {
List<CtVariableReference> candidate = new ArrayList<>();
for (CtVariableReference<?> var : variableReferences) {
try {
CtTypeReference<?> varType = var.getType();
if (subType) {
if (type.isSubtypeOf(varType) && varType.getActualTypeArguments().equals(type.getActualTypeArguments())) {
candidate.add(var);
}
} else {
if (varType.equals(type) && varType.getActualTypeArguments().equals(type.getActualTypeArguments())) {
candidate.add(var);
}
}
} catch (Throwable e) {
}
}
return candidate;
}
public CtVariableReference<?> candidate(CtTypeReference<?> type, boolean subType) {
for (CtVariableReference<?> var : variableReferences) {
CtTypeReference<?> varType = var.getType();
try {
if (subType) {
if (type.isSubtypeOf(varType) && varType.getActualTypeArguments().equals(type.getActualTypeArguments())) {
return var;
}
} else {
if (varType.equals(type) && varType.getActualTypeArguments().equals(type.getActualTypeArguments())) {
return var;
}
}
} catch (Throwable e) {
}
}
return null;
}
public boolean containsAll(InputContext other, boolean subType) {
for (CtVariableReference<?> variable : other.variableReferences) {
if (!hasCandidate(variable.getType(), subType)) return false;
}
return true;
// return !other.variableReferences.stream().anyMatch(var -> !hasCandidate(var.getType(), subType));
//
}
public CtVariableReference getVariableOrFieldNamed(String name) {
CtVariableReference o = null;
for ( CtVariableReference vf : getVar() ) {
if ( vf.toString().equals(name) ) o = vf;
}
if (o == null && name.endsWith(")"))
return getVariableOrFieldNamed(name.substring(1, name.length() - 1));
return o;
}
public Set<String> getAllVarName() {
HashSet<String> result = new HashSet<>();
for (CtVariableReference var : variableReferences) result.add(var.getSimpleName());
return result;
/*
return variableReferences.stream()
.map(var -> var.getSimpleName())
.collect(Collectors.toSet());
*/
}
protected boolean hasCandidate(CtTypeReference<?> type, boolean subType) {
return candidate(type, subType) != null;
}
public Set<CtVariableReference<?>> getVar() {
return variableReferences;
}
public String equalString() {
HashSet<String> result = new HashSet<>();
for (CtVariableReference var : variableReferences)
result.add(var.getSimpleName() + ": " + var);
return result.toString();
//return variableReferences.stream()
// .map(var -> var.getSimpleName() + ": " + var)
// .collect(Collectors.toSet())
// .toString();
}
@Override
public String toString() {
return getVar().toString();
}
@Override
public int hashCode() {
if (hashCode == null)
hashCode = inputContextToString().hashCode();
return hashCode;
}
public int size() {
return variableReferences.size();
}
public List<CtTypeReference<?>> getTypes() {
List<CtTypeReference<?>> result = new ArrayList<>();
for (CtVariableReference<?> var : variableReferences)
result.add(var.getType());
return result;
//return variableReferences.stream()
// .map(var -> var.getType())
// .collect(Collectors.toList());
}
}