1 package no.uio.ifi.refaktor.analyze;
3 import no.uio.ifi.refaktor.analyze.analyzers.ExtractAndMoveMethodAnalyzer;
4 import no.uio.ifi.refaktor.change.changers.ExtractAndMoveMethodChanger;
5 import no.uio.ifi.refaktor.change.exceptions.RefactoringNotExecutedException;
6 import no.uio.ifi.refaktor.prefix.Prefix;
7 import no.uio.ifi.refaktor.prefix.PrefixSet;
8 import no.uio.ifi.refaktor.textselection.CompilationUnitTextSelection;
9 import no.uio.ifi.refaktor.textselection.MethodRelativeCompilationUnitTextSelection;
11 import org.eclipse.jdt.core.IMethod;
12 import org.eclipse.jdt.core.dom.IBinding;
13 import org.eclipse.jdt.core.dom.IVariableBinding;
15 public class ExtractAndMoveMethodCandidate {
16 private class CandidateDataCalculator {
17 private final ExtractAndMoveMethodAnalyzer analyzer;
19 public CandidateDataCalculator(ExtractAndMoveMethodAnalyzer analyzer) {
20 this.analyzer = analyzer;
23 public boolean hasMoreThanOnePossibleTarget() {
24 PrefixSet safePrefixes = analyzer.calculateSafePrefixes();
25 IBinding binding = safePrefixes.toList().getFirst().getVariableBindingOfFirstExpression();
26 for (Prefix prefix: safePrefixes) {
27 if (!prefix.getVariableBindingOfFirstExpression().isEqualTo(binding))
33 public int getTargetFrequency() {
34 if (hasMoreThanOnePossibleTarget())
35 ; // TODO: throw exception?
36 return analyzer.calculateMostFrequentPrefix().getCount();
39 public boolean hasNoUnfixes() {
40 return analyzer.getUnfixes().isEmpty();
43 public String calculateOriginalTargetKey() {
44 return analyzer.calculateOriginalTarget().getKey();
48 public final CompilationUnitTextSelection textSelection;
49 public final int numberOfStatementsAnalyzed;
50 public final int numberOfTextSelectionsAnalyzed;
51 public final IMethod method;
53 private final boolean hasMoreThanOnePossibleTarget;
54 private final int targetFrequency;
55 private final boolean hasNoUnfixes;
56 private final String originalTargetKey;
58 public ExtractAndMoveMethodCandidate(IMethod method, ExtractAndMoveMethodAnalyzer analyzer, CompilationUnitTextSelection textSelection, int numberOfStatementsAnalyzed, int numberOfTextSelectionsAnalyzed) {
60 this.textSelection = new MethodRelativeCompilationUnitTextSelection(method, textSelection);
61 this.numberOfStatementsAnalyzed = numberOfStatementsAnalyzed;
62 this.numberOfTextSelectionsAnalyzed = numberOfTextSelectionsAnalyzed;
64 CandidateDataCalculator calculator = new CandidateDataCalculator(analyzer);
65 hasMoreThanOnePossibleTarget = calculator.hasMoreThanOnePossibleTarget();
66 targetFrequency = calculator.getTargetFrequency();
67 hasNoUnfixes = calculator.hasNoUnfixes();
68 originalTargetKey = calculator.calculateOriginalTargetKey();
71 public boolean hasMoreThanOnePossibleTarget() {
72 return hasMoreThanOnePossibleTarget;
75 public boolean hasOnlyOnePossibleTarget() {
76 return !hasMoreThanOnePossibleTarget();
79 public int getTargetFrequency() {
80 return targetFrequency;
83 public boolean hasNoUnfixes() {
87 public boolean hasUnfixes() {
88 return !hasNoUnfixes();
91 public IVariableBinding calculateOriginalTarget() {
92 return restoreOriginalTarget();
95 private IVariableBinding restoreOriginalTarget() {
97 VariableBindingFinder variableBindingFinder = new VariableBindingFinder(originalTargetKey);
98 textSelection.getCoveringNode().accept(variableBindingFinder);
99 String assertMessage = "Text selection: " + textSelection + ", Original target key: " + originalTargetKey;
100 assert variableBindingFinder.getVariableBinding() != null: assertMessage;
101 return variableBindingFinder.getVariableBinding();
102 } catch (NullPointerException e) {
104 throw new RefactoringNotExecutedException(this.getClass().getCanonicalName(), e);
109 public String toString() {
110 return "Result for '" + method.getDeclaringType().getFullyQualifiedName() + "." + method.getElementName() + "' (" + numberOfStatementsAnalyzed + " statements analyzed): < " + textSelection + " >";
113 public String getNewMethodName() {
115 return ExtractAndMoveMethodChanger.generateName();
118 public String getOriginatingMethodName() {
119 return method.getDeclaringType().getFullyQualifiedName() + "." + method.getElementName();
122 public IMethod getMethod() {
126 public CompilationUnitTextSelection getTextSelection() {
127 return textSelection;