Skip to content

Commit 75ea892

Browse files
authored
Do not flag overridden bean methods (#1915)
Fixes gh-1911 Signed-off-by: goutamadwant <workwithgoutam@gmail.com>
1 parent 6e4ee1b commit 75ea892

3 files changed

Lines changed: 42 additions & 10 deletions

File tree

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/reconcilers/BeanMethodNotPublicReconciler.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.reconcilers;
1212

13-
import java.lang.reflect.Field;
1413
import java.net.URI;
1514
import java.util.ArrayList;
15+
import java.util.Iterator;
1616
import java.util.List;
1717
import java.util.Optional;
1818

@@ -34,6 +34,7 @@
3434
import org.springframework.ide.vscode.boot.java.jdt.refactoring.ChangeMethodVisibilityRefactoring.Visibility;
3535
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtFixDescriptor;
3636
import org.springframework.ide.vscode.boot.java.jdt.refactoring.JdtRefactorings;
37+
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
3738
import org.springframework.ide.vscode.commons.Version;
3839
import org.springframework.ide.vscode.commons.java.IJavaProject;
3940
import org.springframework.ide.vscode.commons.java.SpringProjectUtil;
@@ -127,7 +128,7 @@ public void endVisit(CompilationUnit node) {
127128
}
128129

129130
public static final boolean isNotOverridingPublicMethod(IMethodBinding methodBinding) {
130-
return !isOverriding(methodBinding) && (methodBinding.getModifiers() & Modifier.PUBLIC) != 0;
131+
return methodBinding != null && (methodBinding.getModifiers() & Modifier.PUBLIC) != 0 && !isOverriding(methodBinding);
131132
}
132133

133134
private void visitAnnotation(IJavaProject project, CompilationUnit cu, URI docUri, Annotation node, IProblemCollector problemCollector, List<Integer> problemOffsets, List<ReconcileProblemImpl> problems) {
@@ -159,15 +160,18 @@ private void visitAnnotation(IJavaProject project, CompilationUnit cu, URI docUr
159160
}
160161

161162
private static final boolean isOverriding(IMethodBinding binding) {
162-
try {
163-
if (binding != null) {
164-
Field f = binding.getClass().getDeclaredField("binding");
165-
f.setAccessible(true);
166-
org.eclipse.jdt.internal.compiler.lookup.MethodBinding value = (org.eclipse.jdt.internal.compiler.lookup.MethodBinding) f.get(binding);
167-
return value.isOverriding();
163+
ITypeBinding declaringClass = binding.getDeclaringClass();
164+
if (declaringClass == null) {
165+
return false;
166+
}
167+
Iterator<ITypeBinding> hierarchy = ASTUtils.getHierarchyTypesBreadthFirstIterator(declaringClass);
168+
hierarchy.next();
169+
while (hierarchy.hasNext()) {
170+
for (IMethodBinding inheritedMethod : hierarchy.next().getDeclaredMethods()) {
171+
if (binding.overrides(inheritedMethod)) {
172+
return true;
173+
}
168174
}
169-
} catch (Exception e) {
170-
log.error("", e);
171175
}
172176
return false;
173177
}

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/reconcilers/test/SpringValidationBeanMethodNotPublicTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,15 @@ void testPublishEmptyDiagnosticsWhenNoProblemsAreFound() throws Exception {
123123
List<Diagnostic> diagnostics = diagnosticsMessage.getDiagnostics();
124124
assertEquals(0, diagnostics.size());
125125
}
126+
127+
@Test
128+
void testDoesNotFlagPublicBeanMethodThatOverridesInterfaceMethod() throws Exception {
129+
String docUri = directory.toPath().resolve("src/main/java/org/test/BeanMethodNotPublicOverride.java").toUri().toString();
130+
131+
PublishDiagnosticsParams diagnosticsMessage = harness.getDiagnostics(docUri);
132+
assertNotNull(diagnosticsMessage);
133+
134+
List<Diagnostic> diagnostics = diagnosticsMessage.getDiagnostics();
135+
assertEquals(0, diagnostics.size());
136+
}
126137
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.test;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.validation.Validator;
6+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
7+
8+
@Configuration
9+
public class BeanMethodNotPublicOverride implements WebMvcConfigurer {
10+
11+
@Bean
12+
@Override
13+
public Validator getValidator() {
14+
return null;
15+
}
16+
17+
}

0 commit comments

Comments
 (0)