package dk.brics.jsrefactoring.evaluate;
import java.io.File;
import java.util.Set;
import org.junit.Test;
import dk.brics.jscontrolflow.Function;
import dk.brics.jsparser.AstUtil;
import dk.brics.jsparser.node.ANewExp;
import dk.brics.jsparser.node.APropertyExp;
import dk.brics.jsparser.node.EExp;
import dk.brics.jsparser.node.IFunction;
import dk.brics.jspointers.lattice.values.FunctionValue;
import dk.brics.jspointers.lattice.values.UserFunctionValue;
import dk.brics.jsrefactoring.InputFile;
import dk.brics.jsrefactoring.Master;
import dk.brics.jsrefactoring.NodeFinder;
import dk.brics.jsrefactoring.encapsulateprty.EncapsulateProperty;
public class EncapsulateEveryProperty {
private void encapsulate(File benchmark) {
int numRef = 0, numFail = 0;
System.out.println(benchmark);
Master input = new Master(benchmark);
NodeFinder finder = new NodeFinder(input, APropertyExp.class, ANewExp.class);
for(APropertyExp exp : finder.getAllNodesOfType(APropertyExp.class)) {
if(input.isNativeCode(exp))
continue;
if(exp.getBase().kindPExp() != EExp.THIS || !AstUtil.isLValue(exp))
continue;
IFunction fun = exp.getAncestor(IFunction.class);
if(fun == null)
continue;
if(!invokedAsConstructor(fun, input, finder))
continue;
File sourceFile = input.getSourceFile(exp);
int sourceLine = input.getTranslatedLineNumber(exp);
System.out.print("Refactoring " + AstUtil.toSourceString(exp) + " in file " + sourceFile + " at line " + sourceLine + "...");
EncapsulateProperty refactoring = new EncapsulateProperty(input, exp);
refactoring.getChanges();
++numRef;
//Assert.assertEquals(dump(new Master(benchmark)), dump(input));
if(refactoring.getDiagnostics().isEmpty()) {
System.out.println(" success.");
} else {
++numFail;
System.out.println(" error: " + refactoring.getDiagnostics().get(0).getMessage() + ".");
}
}
//System.out.println(benchmark.getName() + ": " + numRef + " attempts, " + (numRef-numFail) + " successes");
}
private boolean invokedAsConstructor(IFunction fun, Master input, NodeFinder finder) {
Set<Function> funs = input.getFunctions(fun);
for(ANewExp exp : finder.getAllNodesOfType(ANewExp.class))
for(FunctionValue target : input.getCalledFunctions(exp))
if(target instanceof UserFunctionValue && funs.contains(((UserFunctionValue)target).getFunction()))
return true;
return false;
}
public String dump(Master input) {
StringBuffer buf = new StringBuffer();
for(InputFile f : input.getUserFiles())
buf.append(AstUtil.toSourceString(f.getAst()));
String s = buf.toString();
return s;
}
@Test public void test() {
encapsulate(Benchmarks.getBenchmark("msie", "mrpotatogun.html"));
}
public static void main(String[] args) {
EncapsulateEveryProperty e = new EncapsulateEveryProperty();
for(File benchmark : Benchmarks.getBenchmarks())
e.encapsulate(benchmark);
}
}