]> git.uio.no Git - ifi-stolz-refaktor.git/blob - case-study/refaktor-before/src/no/uio/ifi/refaktor/analyze/ExtractAndMoveMethodCandidate.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / refaktor-before / src / no / uio / ifi / refaktor / analyze / ExtractAndMoveMethodCandidate.java
1 package no.uio.ifi.refaktor.analyze;
2
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;
10
11 import org.eclipse.jdt.core.IMethod;
12 import org.eclipse.jdt.core.dom.IBinding;
13 import org.eclipse.jdt.core.dom.IVariableBinding;
14
15 public class ExtractAndMoveMethodCandidate {
16         private class CandidateDataCalculator {
17                 private final ExtractAndMoveMethodAnalyzer analyzer;
18
19                 public CandidateDataCalculator(ExtractAndMoveMethodAnalyzer analyzer) {
20                         this.analyzer = analyzer;
21                 }
22
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))
28                                         return true;
29                         }
30                         return false;
31                 }
32
33                 public int getTargetFrequency() {
34                         if (hasMoreThanOnePossibleTarget())
35                                 ; // TODO: throw exception?
36                         return analyzer.calculateMostFrequentPrefix().getCount();
37                 }
38
39                 public boolean hasNoUnfixes() {
40                         return analyzer.getUnfixes().isEmpty();
41                 }
42
43                 public String calculateOriginalTargetKey() {
44                         return analyzer.calculateOriginalTarget().getKey();
45                 }
46         }
47
48         public final CompilationUnitTextSelection textSelection;
49         public final int numberOfStatementsAnalyzed;
50         public final int numberOfTextSelectionsAnalyzed;
51         public final IMethod method;
52
53         private final boolean hasMoreThanOnePossibleTarget;
54         private final int targetFrequency;
55         private final boolean hasNoUnfixes;
56         private final String originalTargetKey;
57
58         public ExtractAndMoveMethodCandidate(IMethod method, ExtractAndMoveMethodAnalyzer analyzer, CompilationUnitTextSelection textSelection, int numberOfStatementsAnalyzed, int numberOfTextSelectionsAnalyzed) {
59                 this.method = method;
60                 this.textSelection = new MethodRelativeCompilationUnitTextSelection(method, textSelection);
61                 this.numberOfStatementsAnalyzed = numberOfStatementsAnalyzed;
62                 this.numberOfTextSelectionsAnalyzed = numberOfTextSelectionsAnalyzed;
63
64                 CandidateDataCalculator calculator = new CandidateDataCalculator(analyzer);
65                 hasMoreThanOnePossibleTarget = calculator.hasMoreThanOnePossibleTarget();
66                 targetFrequency = calculator.getTargetFrequency();
67                 hasNoUnfixes = calculator.hasNoUnfixes();
68                 originalTargetKey = calculator.calculateOriginalTargetKey();
69         }
70
71         public boolean hasMoreThanOnePossibleTarget() {
72                 return hasMoreThanOnePossibleTarget;
73         }
74
75         public boolean hasOnlyOnePossibleTarget() {
76                 return !hasMoreThanOnePossibleTarget();
77         }
78
79         public int getTargetFrequency() {
80                 return targetFrequency;
81         }
82
83         public boolean hasNoUnfixes() {
84                 return hasNoUnfixes;
85         }
86
87         public boolean hasUnfixes() {
88                 return !hasNoUnfixes();
89         }
90
91         public IVariableBinding calculateOriginalTarget() {
92                 return restoreOriginalTarget();
93         }
94
95         private IVariableBinding restoreOriginalTarget() {
96                 try {
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) {
103                         // TODO: revisit
104                         throw new RefactoringNotExecutedException(this.getClass().getCanonicalName(), e);
105                 }
106         }
107
108         @Override
109         public String toString() {
110                 return "Result for '" + method.getDeclaringType().getFullyQualifiedName() + "." + method.getElementName() + "' (" + numberOfStatementsAnalyzed + " statements analyzed): < " + textSelection + " >";
111         }
112
113         public String getNewMethodName() {
114                 // TODO: do better
115                 return ExtractAndMoveMethodChanger.generateName();
116         }
117
118         public String getOriginatingMethodName() {
119                 return method.getDeclaringType().getFullyQualifiedName() + "." + method.getElementName();
120         }
121
122         public IMethod getMethod() {
123                 return method;
124         }
125
126         public CompilationUnitTextSelection getTextSelection() {
127                 return textSelection;
128         }
129 }