From 46114199c29a8688a78bd38c5b49ef51f7737b30 Mon Sep 17 00:00:00 2001 From: Stephan Schroevers Date: Sun, 18 Jul 2021 14:45:06 +0200 Subject: [PATCH] Prevent Refaster `UMemberSelect` from matching method parameters See google/error-prone#2456. --- .../errorprone/refaster/UMemberSelect.java | 2 +- .../refaster/TemplateIntegrationTest.java | 5 +++ ...arameterDisambiguationTemplateExample.java | 26 ++++++++++++++ ...arameterDisambiguationTemplateExample.java | 26 ++++++++++++++ ...MethodParameterDisambiguationTemplate.java | 35 +++++++++++++++++++ 5 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/com/google/errorprone/refaster/testdata/input/MemberSelectAndMethodParameterDisambiguationTemplateExample.java create mode 100644 core/src/test/java/com/google/errorprone/refaster/testdata/output/MemberSelectAndMethodParameterDisambiguationTemplateExample.java create mode 100644 core/src/test/java/com/google/errorprone/refaster/testdata/template/MemberSelectAndMethodParameterDisambiguationTemplate.java diff --git a/core/src/main/java/com/google/errorprone/refaster/UMemberSelect.java b/core/src/main/java/com/google/errorprone/refaster/UMemberSelect.java index 6ff2092bcd8..221ff3963d5 100644 --- a/core/src/main/java/com/google/errorprone/refaster/UMemberSelect.java +++ b/core/src/main/java/com/google/errorprone/refaster/UMemberSelect.java @@ -65,7 +65,7 @@ public Choice visitMemberSelect(MemberSelectTree fieldAccess, Unifier u @Override public Choice visitIdentifier(IdentifierTree ident, Unifier unifier) { Symbol sym = ASTHelpers.getSymbol(ident); - if (sym != null && sym.owner.type != null) { + if (sym != null && sym.owner.type != null && sym.owner.type.isReference()) { JCExpression thisIdent = unifier.thisExpression(sym.owner.type); return getIdentifier() .unify(ident.getName(), unifier) diff --git a/core/src/test/java/com/google/errorprone/refaster/TemplateIntegrationTest.java b/core/src/test/java/com/google/errorprone/refaster/TemplateIntegrationTest.java index c928231983e..24047ebf801 100644 --- a/core/src/test/java/com/google/errorprone/refaster/TemplateIntegrationTest.java +++ b/core/src/test/java/com/google/errorprone/refaster/TemplateIntegrationTest.java @@ -369,4 +369,9 @@ public void staticImportClassToken() throws IOException { public void suppressWarnings() throws IOException { runTest("SuppressWarningsTemplate"); } + + @Test + public void memberSelectAndMethodParameterDisambiguation() throws IOException { + runTest("MemberSelectAndMethodParameterDisambiguationTemplate"); + } } diff --git a/core/src/test/java/com/google/errorprone/refaster/testdata/input/MemberSelectAndMethodParameterDisambiguationTemplateExample.java b/core/src/test/java/com/google/errorprone/refaster/testdata/input/MemberSelectAndMethodParameterDisambiguationTemplateExample.java new file mode 100644 index 00000000000..0649db249f2 --- /dev/null +++ b/core/src/test/java/com/google/errorprone/refaster/testdata/input/MemberSelectAndMethodParameterDisambiguationTemplateExample.java @@ -0,0 +1,26 @@ +/* + * Copyright 2021 The Error Prone Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.errorprone.refaster.testdata; + +import java.util.Objects; + +/** Test data for {@code MemberSelectAndMethodParameterDisambiguationTemplate}. */ +public class MemberSelectAndMethodParameterDisambiguationTemplateExample { + int example(int length) { + return Objects.hashCode(length); + } +} diff --git a/core/src/test/java/com/google/errorprone/refaster/testdata/output/MemberSelectAndMethodParameterDisambiguationTemplateExample.java b/core/src/test/java/com/google/errorprone/refaster/testdata/output/MemberSelectAndMethodParameterDisambiguationTemplateExample.java new file mode 100644 index 00000000000..0649db249f2 --- /dev/null +++ b/core/src/test/java/com/google/errorprone/refaster/testdata/output/MemberSelectAndMethodParameterDisambiguationTemplateExample.java @@ -0,0 +1,26 @@ +/* + * Copyright 2021 The Error Prone Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.errorprone.refaster.testdata; + +import java.util.Objects; + +/** Test data for {@code MemberSelectAndMethodParameterDisambiguationTemplate}. */ +public class MemberSelectAndMethodParameterDisambiguationTemplateExample { + int example(int length) { + return Objects.hashCode(length); + } +} diff --git a/core/src/test/java/com/google/errorprone/refaster/testdata/template/MemberSelectAndMethodParameterDisambiguationTemplate.java b/core/src/test/java/com/google/errorprone/refaster/testdata/template/MemberSelectAndMethodParameterDisambiguationTemplate.java new file mode 100644 index 00000000000..808de3a73e9 --- /dev/null +++ b/core/src/test/java/com/google/errorprone/refaster/testdata/template/MemberSelectAndMethodParameterDisambiguationTemplate.java @@ -0,0 +1,35 @@ +/* + * Copyright 2021 The Error Prone Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package com.google.errorprone.refaster.testdata.template; + +import com.google.errorprone.refaster.annotation.AfterTemplate; +import com.google.errorprone.refaster.annotation.BeforeTemplate; +import java.util.Objects; + +/** + * Example template that references a field ("length") with a name which also commonly occurs as a + * method parameter name. + */ +public class MemberSelectAndMethodParameterDisambiguationTemplate { + @BeforeTemplate + public int before(T[] array) { + return Objects.hashCode(array.length); + } + + @AfterTemplate + public int after(T[] array) { + return Objects.hashCode(array); + } +}