Support record destructuring in ArgumentSelectionDefectChecker. · google/error-prone@332cbfa (original) (raw)
`@@ -32,6 +32,7 @@
`
32
32
`import com.sun.source.tree.MemberSelectTree;
`
33
33
`import com.sun.source.tree.MethodInvocationTree;
`
34
34
`import com.sun.source.tree.NewClassTree;
`
``
35
`+
import com.sun.source.tree.Tree;
`
35
36
`import com.sun.source.tree.Tree.Kind;
`
36
37
`import com.sun.source.tree.VariableTree;
`
37
38
`import com.sun.tools.javac.code.Symbol;
`
`@@ -88,14 +89,17 @@ static ImmutableList createListFromVarSymbols(List varSymb
`
88
89
` .collect(toImmutableList());
`
89
90
` }
`
90
91
``
91
``
`-
static ImmutableList createListFromExpressionTrees(
`
92
``
`-
List<? extends ExpressionTree> trees) {
`
``
92
`+
static ImmutableList createListFromExpressionTrees(List<? extends Tree> trees) {
`
93
93
`return Streams.mapWithIndex(
`
94
94
`trees.stream(),
`
95
95
` (t, i) ->
`
96
96
`new AutoValue_Parameter(
`
97
97
`getArgumentName(t),
`
98
``
`-
Optional.ofNullable(ASTHelpers.getResultType(t)).orElse(Type.noType),
`
``
98
`+
Optional.ofNullable(
`
``
99
`+
t instanceof ExpressionTree
`
``
100
`+
? ASTHelpers.getResultType((ExpressionTree) t)
`
``
101
`+
: ASTHelpers.getType(t))
`
``
102
`+
.orElse(Type.noType),
`
99
103
` (int) i,
`
100
104
`t.toString(),
`
101
105
`t.getKind(),
`
`@@ -162,28 +166,25 @@ private static String getClassName(ClassSymbol s) {
`
162
166
` * will return the marker for an unknown name.
`
163
167
` */
`
164
168
`@VisibleForTesting
`
165
``
`-
static String getArgumentName(ExpressionTree expressionTree) {
`
166
``
`-
switch (expressionTree.getKind()) {
`
167
``
`-
case MEMBER_SELECT -> {
`
168
``
`-
return ((MemberSelectTree) expressionTree).getIdentifier().toString();
`
169
``
`-
}
`
170
``
`-
case NULL_LITERAL -> {
`
171
``
`-
// null could match anything pretty well
`
172
``
`-
return NAME_NULL;
`
173
``
`-
}
`
``
169
`+
static String getArgumentName(Tree tree) {
`
``
170
`+
return switch (tree.getKind()) {
`
``
171
`+
case VARIABLE -> ((VariableTree) tree).getName().toString();
`
``
172
`+
case MEMBER_SELECT -> ((MemberSelectTree) tree).getIdentifier().toString();
`
``
173
`+
// null could match anything pretty well
`
``
174
`+
case NULL_LITERAL -> NAME_NULL;
`
174
175
`case IDENTIFIER -> {
`
175
``
`-
IdentifierTree idTree = (IdentifierTree) expressionTree;
`
``
176
`+
IdentifierTree idTree = (IdentifierTree) tree;
`
176
177
`if (idTree.getName().contentEquals("this")) {
`
177
178
`// for the 'this' keyword the argument name is the name of the object's class
`
178
179
`Symbol sym = ASTHelpers.getSymbol(idTree);
`
179
``
`-
return sym != null ? getClassName(ASTHelpers.enclosingClass(sym)) : NAME_NOT_PRESENT;
`
``
180
`+
yield sym != null ? getClassName(ASTHelpers.enclosingClass(sym)) : NAME_NOT_PRESENT;
`
180
181
` } else {
`
181
182
`// if we have a variable, just extract its name
`
182
``
`-
return idTree.getName().toString();
`
``
183
`+
yield idTree.getName().toString();
`
183
184
` }
`
184
185
` }
`
185
186
`case METHOD_INVOCATION -> {
`
186
``
`-
MethodInvocationTree methodInvocationTree = (MethodInvocationTree) expressionTree;
`
``
187
`+
MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree;
`
187
188
`MethodSymbol methodSym = ASTHelpers.getSymbol(methodInvocationTree);
`
188
189
`String name = methodSym.getSimpleName().toString();
`
189
190
`ImmutableList terms = NamingConventions.splitToLowercaseTerms(name);
`
`@@ -192,26 +193,24 @@ static String getArgumentName(ExpressionTree expressionTree) {
`
192
193
`if (terms.size() == 1) {
`
193
194
`ExpressionTree receiver = ASTHelpers.getReceiver(methodInvocationTree);
`
194
195
`if (receiver == null) {
`
195
``
`-
return getClassName(ASTHelpers.enclosingClass(methodSym));
`
``
196
`+
yield getClassName(ASTHelpers.enclosingClass(methodSym));
`
196
197
` }
`
197
198
`// recursively try to get a name from the receiver
`
198
``
`-
return getArgumentName(receiver);
`
``
199
`+
yield getArgumentName(receiver);
`
199
200
` } else {
`
200
``
`-
return name.substring(firstTerm.length());
`
``
201
`+
yield name.substring(firstTerm.length());
`
201
202
` }
`
202
203
` } else {
`
203
``
`-
return name;
`
``
204
`+
yield name;
`
204
205
` }
`
205
206
` }
`
206
207
`case NEW_CLASS -> {
`
207
``
`-
MethodSymbol constructorSym = ASTHelpers.getSymbol((NewClassTree) expressionTree);
`
208
``
`-
return constructorSym.owner != null
`
``
208
`+
MethodSymbol constructorSym = ASTHelpers.getSymbol((NewClassTree) tree);
`
``
209
`+
yield constructorSym.owner != null
`
209
210
` ? getClassName((ClassSymbol) constructorSym.owner)
`
210
211
` : NAME_NOT_PRESENT;
`
211
212
` }
`
212
``
`-
default -> {
`
213
``
`-
return NAME_NOT_PRESENT;
`
214
``
`-
}
`
215
``
`-
}
`
``
213
`+
default -> NAME_NOT_PRESENT;
`
``
214
`+
};
`
216
215
` }
`
217
216
`}
`