-
-
Notifications
You must be signed in to change notification settings - Fork 347
/
MinimalImportScanner.java
104 lines (90 loc) · 3 KB
/
MinimalImportScanner.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* Copyright (C) 2006-2019 INRIA and contributors
*
* Spoon is available either under the terms of the MIT License (see LICENSE-MIT.txt) of the Cecill-C License (see LICENSE-CECILL-C.txt). You as the user are entitled to choose the terms under which to adopt Spoon.
*/
package spoon.reflect.visitor;
import spoon.reflect.reference.CtExecutableReference;
import spoon.reflect.reference.CtFieldReference;
import spoon.reflect.reference.CtReference;
import spoon.reflect.reference.CtTypeReference;
/**
* A scanner dedicated to import only the necessary packages, @see spoon.test.variable.AccessFullyQualifiedTest
*
*/
@Deprecated
public class MinimalImportScanner extends ImportScannerImpl implements ImportScanner {
/**
* This method use @link{ImportScannerImpl#isTypeInCollision} to import a ref only if there is a collision
* @param ref: the type we are testing, it can be a CtTypeReference, a CtFieldReference or a CtExecutableReference
*
* @return true if the ref should be imported.
*/
private boolean shouldTypeBeImported(CtReference ref) {
// we import the targetType by default to simplify and avoid conclict in inner classes
if (ref.equals(targetType)) {
return true;
}
return isTypeInCollision(ref, true);
}
@Override
protected boolean addClassImport(CtTypeReference<?> ref) {
boolean shouldTypeBeImported = this.shouldTypeBeImported(ref);
if (shouldTypeBeImported) {
return super.addClassImport(ref);
} else {
return false;
}
}
@Override
protected boolean addFieldImport(CtFieldReference ref) {
if (ref.getDeclaringType() != null) {
if (isImportedInClassImports(ref.getDeclaringType())) {
return false;
}
}
boolean shouldTypeBeImported = this.shouldTypeBeImported(ref);
if (shouldTypeBeImported) {
if (this.fieldImports.containsKey(ref.getSimpleName())) {
return isImportedInFieldImports(ref);
}
fieldImports.put(ref.getSimpleName(), ref);
return true;
} else {
return false;
}
}
@Override
protected boolean addMethodImport(CtExecutableReference ref) {
if (ref.getDeclaringType() != null) {
if (isImportedInClassImports(ref.getDeclaringType())) {
return false;
}
}
boolean shouldTypeBeImported = this.shouldTypeBeImported(ref);
if (shouldTypeBeImported) {
if (this.methodImports.containsKey(ref.getSimpleName())) {
return isImportedInMethodImports(ref);
}
methodImports.put(ref.getSimpleName(), ref);
if (ref.getDeclaringType() != null) {
if (ref.getDeclaringType().getPackage() != null) {
if (ref.getDeclaringType().getPackage().equals(this.targetType.getPackage())) {
addClassImport(ref.getDeclaringType());
}
}
}
return true;
} else {
return false;
}
}
@Override
protected boolean isImportedInClassImports(CtTypeReference<?> ref) {
if (!(ref.isImplicit()) && classImports.containsKey(ref.getSimpleName())) {
CtTypeReference<?> exist = classImports.get(ref.getSimpleName());
return exist.getQualifiedName().equals(ref.getQualifiedName());
}
return false;
}
}