package no.uio.ifi.refaktor.analyze; import static no.uio.ifi.refaktor.assertion.RefaktorAssert.assertThat; import static org.hamcrest.CoreMatchers.notNullValue; import no.uio.ifi.refaktor.analyze.analyzers.ExtractAndMoveMethodAnalyzer; import no.uio.ifi.refaktor.change.changers.ExtractAndMoveMethodChanger; import no.uio.ifi.refaktor.prefix.Prefix; import no.uio.ifi.refaktor.prefix.PrefixSet; import no.uio.ifi.refaktor.utils.CompilationUnitTextSelection; import no.uio.ifi.refaktor.utils.MethodRelativeCompilationUnitTextSelection; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IVariableBinding; public class ExtractAndMoveMethodAnalysisResult { private class ResultDataCalculator { private final ExtractAndMoveMethodAnalyzer analyzer; public ResultDataCalculator(ExtractAndMoveMethodAnalyzer analyzer) { this.analyzer = analyzer; } public boolean hasMoreThanOnePossibleTarget() { PrefixSet safePrefixes = analyzer.calculateSafePrefixes(); IBinding binding = safePrefixes.toList().getFirst().getVariableBindingOfFirstExpression(); for (Prefix prefix: safePrefixes) { if (!prefix.getVariableBindingOfFirstExpression().isEqualTo(binding)) return true; } return false; } public int getTargetFrequency() { if (hasMoreThanOnePossibleTarget()) ; // TODO: throw exception? return analyzer.calculateMostFrequentPrefix().getCount(); } public boolean hasNoUnfixes() { return analyzer.getUnfixes().isEmpty(); } public String calculateOriginalTargetKey() { return analyzer.calculateOriginalTarget().getKey(); } } public final CompilationUnitTextSelection textSelection; public final int numberOfStatementsAnalyzed; public final int numberOfTextSelectionsAnalyzed; public final IMethod method; private final boolean hasMoreThanOnePossibleTarget; private final int targetFrequency; private final boolean hasNoUnfixes; private final String originalTargetKey; public ExtractAndMoveMethodAnalysisResult(IMethod method, ExtractAndMoveMethodAnalyzer analyzer, CompilationUnitTextSelection textSelection, int numberOfStatementsAnalyzed, int numberOfTextSelectionsAnalyzed) { this.method = method; this.textSelection = new MethodRelativeCompilationUnitTextSelection(method, textSelection); this.numberOfStatementsAnalyzed = numberOfStatementsAnalyzed; this.numberOfTextSelectionsAnalyzed = numberOfTextSelectionsAnalyzed; ResultDataCalculator calculator = new ResultDataCalculator(analyzer); hasMoreThanOnePossibleTarget = calculator.hasMoreThanOnePossibleTarget(); targetFrequency = calculator.getTargetFrequency(); hasNoUnfixes = calculator.hasNoUnfixes(); originalTargetKey = calculator.calculateOriginalTargetKey(); } public boolean hasMoreThanOnePossibleTarget() { return hasMoreThanOnePossibleTarget; } public boolean hasOnlyOnePossibleTarget() { return !hasMoreThanOnePossibleTarget(); } public int getTargetFrequency() { return targetFrequency; } public boolean hasNoUnfixes() { return hasNoUnfixes; } public boolean hasUnfixes() { return !hasNoUnfixes(); } public IVariableBinding calculateOriginalTarget() { return restoreOriginalTarget(); } private IVariableBinding restoreOriginalTarget() { VariableBindingFinder variableBindingFinder = new VariableBindingFinder(originalTargetKey); textSelection.getCoveringNode().accept(variableBindingFinder); assertThat(variableBindingFinder.getVariableBinding(), notNullValue()); return variableBindingFinder.getVariableBinding(); } @Override public String toString() { return "Result for '" + method.getDeclaringType().getFullyQualifiedName() + "." + method.getElementName() + "' (" + numberOfStatementsAnalyzed + " statements analyzed): < " + textSelection + " >"; } public String getNewMethodName() { // TODO: do better return ExtractAndMoveMethodChanger.generateName(); } public String getOriginatingMethodName() { return method.getDeclaringType().getFullyQualifiedName() + "." + method.getElementName(); } public IMethod getMethod() { return method; } public CompilationUnitTextSelection getTextSelection() { return textSelection; } }