package fr.inria.diversify.processor.main;
import spoon.reflect.code.*;
import spoon.reflect.declaration.CtConstructor;
import spoon.reflect.declaration.CtExecutable;
import spoon.reflect.declaration.ModifierKind;
import spoon.reflect.reference.CtFieldReference;
import spoon.reflect.visitor.CtScanner;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by Simon on 16/10/14.
*/
public class FieldReferenceVisitor extends CtScanner {
protected CtExecutable method;
protected Map<CtFieldReference,String> fields;
public FieldReferenceVisitor(CtExecutable method) {
fields = new HashMap<>();
this.method = method;
}
public Map<CtFieldReference, String> getFields() {
return fields;
}
@Override
public <T> void visitCtFieldRead(CtFieldRead<T> fieldRead) {
super.visitCtFieldRead(fieldRead);
String string = fieldRead.toString();
if(!string.startsWith("super")
&& (!string.contains(".") || string.contains("this."))
&& fieldRead.getParent(CtExecutable.class).equals(method)
&& !isFinalInConstructor(fieldRead)) {
fields.put(((CtFieldReference) fieldRead.getVariable()), fieldRead.toString());
}
}
@Override
public <T> void visitCtFieldWrite(CtFieldWrite<T> fieldWrite) {
super.visitCtFieldWrite(fieldWrite);
String string = fieldWrite.toString();
if(!string.startsWith("super")
&& (!string.contains(".") || string.contains("this."))
&& fieldWrite.getParent(CtExecutable.class).equals(method)
&& !isFinalInConstructor(fieldWrite)) {
fields.put(((CtFieldReference) fieldWrite.getVariable()), fieldWrite.toString());
}
}
protected boolean isFinalInConstructor(CtFieldAccess fieldaccess) {
return method instanceof CtConstructor
&& fieldaccess.getVariable().getDeclaration().getModifiers().contains(ModifierKind.FINAL);
}
}