|
30 | 30 | import com.google.errorprone.util.ASTHelpers; |
31 | 31 | import com.sun.source.tree.ExpressionTree; |
32 | 32 | import com.sun.source.tree.MethodInvocationTree; |
33 | | -import com.sun.tools.javac.code.Symbol.MethodSymbol; |
34 | 33 | import java.util.ArrayList; |
35 | 34 | import java.util.List; |
36 | 35 |
|
@@ -105,31 +104,39 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState |
105 | 104 | return Description.NO_MATCH; |
106 | 105 | } |
107 | 106 |
|
108 | | - MethodSymbol method = ASTHelpers.getSymbol(tree); |
109 | | - String replacementMethod = method.name.toString(); |
110 | | - |
111 | | - // we special case Clock because the replacement isn't just an overload, but a new API entirely |
112 | | - if (CLOCK_MATCHER.matches(tree, state)) { |
113 | | - replacementMethod = "system"; |
114 | | - } |
115 | | - |
116 | 107 | String idealReplacementCode = "ZoneId.of(\"America/Los_Angeles\")"; |
117 | 108 |
|
118 | 109 | SuggestedFix.Builder fixBuilder = SuggestedFix.builder(); |
119 | 110 | String zoneIdName = SuggestedFixes.qualifyType(state, fixBuilder, "java.time.ZoneId"); |
120 | 111 | String replacementCode = zoneIdName + ".systemDefault()"; |
121 | 112 |
|
122 | | - fixBuilder.replace( |
123 | | - state.getEndPosition(ASTHelpers.getReceiver(tree)), |
124 | | - state.getEndPosition(tree), |
125 | | - "." + replacementMethod + "(" + replacementCode + ")"); |
| 113 | + // The method could be statically imported and have no receiver: if so, just swap out the whole |
| 114 | + // tree as opposed to surgically replacing the post-receiver part.. |
| 115 | + ExpressionTree receiver = ASTHelpers.getReceiver(tree); |
| 116 | + // we special case Clock because the replacement isn't just an overload, but a new API entirely |
| 117 | + boolean systemDefaultZoneClockMethod = CLOCK_MATCHER.matches(tree, state); |
| 118 | + String replacementMethod = |
| 119 | + systemDefaultZoneClockMethod ? "system" : ASTHelpers.getSymbol(tree).name.toString(); |
| 120 | + if (receiver != null) { |
| 121 | + fixBuilder.replace( |
| 122 | + state.getEndPosition(receiver), |
| 123 | + state.getEndPosition(tree), |
| 124 | + "." + replacementMethod + "(" + replacementCode + ")"); |
| 125 | + } else { |
| 126 | + if (systemDefaultZoneClockMethod) { |
| 127 | + fixBuilder.addStaticImport("java.time.Clock.systemDefaultZone"); |
| 128 | + } |
| 129 | + fixBuilder.replace(tree, replacementMethod + "(" + replacementCode + ")"); |
| 130 | + } |
126 | 131 |
|
127 | 132 | return buildDescription(tree) |
128 | 133 | .setMessage( |
129 | 134 | String.format( |
130 | 135 | "%s.%s is not allowed because it silently uses the system default time-zone. You " |
131 | 136 | + "must pass an explicit time-zone (e.g., %s) to this method.", |
132 | | - method.owner.getSimpleName(), method, idealReplacementCode)) |
| 137 | + ASTHelpers.getSymbol(tree).owner.getSimpleName(), |
| 138 | + ASTHelpers.getSymbol(tree), |
| 139 | + idealReplacementCode)) |
133 | 140 | .addFix(fixBuilder.build()) |
134 | 141 | .build(); |
135 | 142 | } |
|
0 commit comments