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

`}

`