Skip to content

Commit 29b7828

Browse files
committed
more spring bean resolving/navigation
1 parent 825bc31 commit 29b7828

3 files changed

Lines changed: 66 additions & 40 deletions

File tree

plugin/src/main/java/com/intellij/spring/impl/ide/gutter/SpringClassAnnotator.java

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,16 @@ private static void annotateMethod(final PsiMethod method, final AnnotationHolde
166166
if (list.size() > 0) {
167167
addPropertiesGutterIcon(holder, method);
168168
}
169-
final List<DomSpringBeanPointer> pointers = info.getMappedBeans();
170-
for (DomSpringBeanPointer pointer : pointers) {
171-
final DomSpringBean springBean = pointer.getSpringBean();
172-
if (springBean instanceof SpringBean) {
173-
final Autowire autowire = ((SpringBean)springBean).getBeanAutowire();
174-
if (autowire.isAutowired()) {
175-
autowired = true;
176-
break;
169+
final List<SpringBaseBeanPointer> pointers = info.getMappedBeans();
170+
for (SpringBaseBeanPointer pointer : pointers) {
171+
if (pointer instanceof DomSpringBeanPointer domPointer) {
172+
final DomSpringBean springBean = domPointer.getSpringBean();
173+
if (springBean instanceof SpringBean) {
174+
final Autowire autowire = ((SpringBean)springBean).getBeanAutowire();
175+
if (autowire.isAutowired()) {
176+
autowired = true;
177+
break;
178+
}
177179
}
178180
}
179181
}
@@ -213,7 +215,21 @@ else if (AnnotationUtil.isAnnotated(method, SpringAnnotationsConstants.SPRING_BE
213215

214216
@RequiredReadAction
215217
private static void processAnnotatedMethod(final PsiMethod method, final AnnotationHolder holder) {
216-
if (SpringAutowireUtil.isAutowiredByAnnotation(method)) {
218+
boolean isAutowired = SpringAutowireUtil.isAutowiredByAnnotation(method);
219+
220+
// implicit autowiring: single constructor of a Spring bean doesn't need @Autowired
221+
if (!isAutowired && method.isConstructor()) {
222+
PsiClass containingClass = method.getContainingClass();
223+
if (containingClass != null) {
224+
PsiMethod[] constructors = containingClass.getConstructors();
225+
if (constructors.length == 1) {
226+
SpringJavaClassInfo info = SpringJavaClassInfo.getSpringJavaClassInfo(containingClass);
227+
isAutowired = info.isMapped();
228+
}
229+
}
230+
}
231+
232+
if (isAutowired) {
217233
final Module module = method.getModule();
218234
final SpringModel model = SpringManager.getInstance(method.getProject()).getCombinedModel(module);
219235
if (model != null) {
@@ -285,11 +301,21 @@ private static void addSpringBeanGutterIcon(final AnnotationHolder holder,
285301
final PsiIdentifier psiIdentifier,
286302
final NotNullLazyValue<Collection<? extends SpringBaseBeanPointer>> targets) {
287303

304+
String tooltip = SpringBundle.message("spring.bean.class.tooltip.navigate.declaration");
305+
Collection<? extends SpringBaseBeanPointer> resolvedTargets = targets.getValue();
306+
if (!resolvedTargets.isEmpty()) {
307+
SpringBaseBeanPointer first = resolvedTargets.iterator().next();
308+
String beanName = first.getName();
309+
if (beanName != null && !beanName.isEmpty()) {
310+
tooltip = "Spring Bean: '" + beanName + "'";
311+
}
312+
}
313+
288314
NavigationGutterIconBuilder.create(SpringIcons.SPRING_BEAN_ICON, BEAN_POINTER_CONVERTOR).
289315
setTargets(targets).
290316
setPopupTitle(SpringBundle.message("spring.bean.class.navigate.choose.class.title")).
291-
setCellRenderer(DOM_RENDERER).
292-
setTooltipText(SpringBundle.message("spring.bean.class.tooltip.navigate.declaration")).
317+
setCellRenderer(BEAN_RENDERER).
318+
setTooltipText(tooltip).
293319
install(holder, psiIdentifier);
294320
}
295321
}

plugin/src/main/java/com/intellij/spring/impl/ide/java/SpringJavaClassInfo.java

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,57 +29,54 @@ public class SpringJavaClassInfo {
2929
private static final Key<SpringJavaClassInfo> KEY = new Key<SpringJavaClassInfo>("Spring Java Class Info");
3030

3131
private final PsiClass myPsiClass;
32-
private final CachedValue<List<DomSpringBeanPointer>> myBeans;
32+
private final CachedValue<List<SpringBaseBeanPointer>> myBeans;
3333
private final CachedValue<MultiMap<String, SpringPropertyDefinition>> myProperties;
3434

3535
private SpringJavaClassInfo(final PsiClass psiClass) {
3636

3737
myPsiClass = psiClass;
3838
final Project project = psiClass.getProject();
3939

40-
myBeans = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider<List<DomSpringBeanPointer>>() {
41-
public Result<List<DomSpringBeanPointer>> compute() {
40+
myBeans = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider<List<SpringBaseBeanPointer>>() {
41+
public Result<List<SpringBaseBeanPointer>> compute() {
4242
final consulo.module.Module module = ModuleUtilCore.findModuleForPsiElement(myPsiClass);
4343
if (module == null) {
4444
return null;
4545
}
46-
final List<DomSpringBeanPointer> result = new ArrayList<DomSpringBeanPointer>();
46+
final List<SpringBaseBeanPointer> result = new ArrayList<>();
4747
ModuleUtilCore.visitMeAndDependentModules(module, new Processor<Module>() {
4848
public boolean process(final Module module) {
4949
final SpringModel model = SpringManager.getInstance(project).getCombinedModel(module);
5050
if (model != null) {
51-
final List<SpringBaseBeanPointer> list = model.findBeansByEffectivePsiClassWithInheritance(myPsiClass);
52-
for (SpringBaseBeanPointer pointer : list) {
53-
if (pointer instanceof DomSpringBeanPointer) {
54-
result.add((DomSpringBeanPointer)pointer);
55-
}
56-
}
51+
result.addAll(model.findBeansByEffectivePsiClassWithInheritance(myPsiClass));
5752
return true;
5853
}
5954
return true;
6055
}
6156
});
62-
return new Result<List<DomSpringBeanPointer>>(result, DomManager.getDomManager(project));
57+
return new Result<>(result, DomManager.getDomManager(project));
6358
}
6459
}, false);
6560

6661
myProperties = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider<MultiMap<String, SpringPropertyDefinition>>() {
6762
public Result<MultiMap<String, SpringPropertyDefinition>> compute() {
68-
final List<DomSpringBeanPointer> list = getMappedBeans();
63+
final List<SpringBaseBeanPointer> list = getMappedBeans();
6964
final MultiMap<String, SpringPropertyDefinition> map = MultiMap.createConcurrent();
70-
for (DomSpringBeanPointer beanPointer : list) {
71-
final DomSpringBean bean = beanPointer.getSpringBean();
72-
if (bean instanceof SpringBean) {
73-
final List<SpringPropertyDefinition> properties = ((SpringBean)bean).getAllProperties();
74-
for (SpringPropertyDefinition property : properties) {
75-
final String propertyName = property.getPropertyName();
76-
if (propertyName != null) {
77-
map.putValue(propertyName, property);
65+
for (SpringBaseBeanPointer beanPointer : list) {
66+
if (beanPointer instanceof DomSpringBeanPointer domPointer) {
67+
final DomSpringBean bean = domPointer.getSpringBean();
68+
if (bean instanceof SpringBean) {
69+
final List<SpringPropertyDefinition> properties = ((SpringBean)bean).getAllProperties();
70+
for (SpringPropertyDefinition property : properties) {
71+
final String propertyName = property.getPropertyName();
72+
if (propertyName != null) {
73+
map.putValue(propertyName, property);
74+
}
7875
}
7976
}
8077
}
8178
}
82-
return new Result<MultiMap<String, SpringPropertyDefinition>>(map, DomManager.getDomManager(project));
79+
return new Result<>(map, DomManager.getDomManager(project));
8380
}
8481
}, false);
8582
}
@@ -99,9 +96,9 @@ public boolean isMapped() {
9996
}
10097

10198
@Nonnull
102-
public List<DomSpringBeanPointer> getMappedBeans() {
103-
final List<DomSpringBeanPointer> list = myBeans.getValue();
104-
return list == null ? Collections.<DomSpringBeanPointer>emptyList() : list;
99+
public List<SpringBaseBeanPointer> getMappedBeans() {
100+
final List<SpringBaseBeanPointer> list = myBeans.getValue();
101+
return list == null ? Collections.emptyList() : list;
105102
}
106103

107104
@Nonnull

plugin/src/main/java/com/intellij/spring/impl/ide/model/highlighting/SpringRequiredAnnotationInspection.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.intellij.spring.impl.ide.java.SpringJavaClassInfo;
1111
import com.intellij.spring.impl.ide.model.xml.DomSpringBean;
1212
import com.intellij.spring.impl.ide.model.xml.beans.DomSpringBeanPointer;
13+
import com.intellij.spring.impl.ide.model.xml.beans.SpringBaseBeanPointer;
1314
import com.intellij.spring.impl.ide.model.xml.beans.SpringBean;
1415
import com.intellij.spring.impl.ide.model.xml.beans.SpringPropertyDefinition;
1516
import consulo.annotation.component.ExtensionImpl;
@@ -53,12 +54,14 @@ public ProblemDescriptor[] checkMethod(
5354
final String property = PropertyUtil.getPropertyNameBySetter(method);
5455
final Collection<SpringPropertyDefinition> mappedProperties = info.getMappedProperties(property);
5556
if (mappedProperties.isEmpty()) {
56-
final List<DomSpringBeanPointer> list = info.getMappedBeans();
57+
final List<SpringBaseBeanPointer> list = info.getMappedBeans();
5758
final List<SpringBean> beans = new ArrayList<>(list.size());
58-
for (DomSpringBeanPointer pointer : list) {
59-
final DomSpringBean springBean = pointer.getSpringBean();
60-
if (springBean instanceof SpringBean && !((SpringBean) springBean).isAbstract()) {
61-
beans.add((SpringBean) springBean);
59+
for (SpringBaseBeanPointer pointer : list) {
60+
if (pointer instanceof DomSpringBeanPointer domPointer) {
61+
final DomSpringBean springBean = domPointer.getSpringBean();
62+
if (springBean instanceof SpringBean && !((SpringBean) springBean).isAbstract()) {
63+
beans.add((SpringBean) springBean);
64+
}
6265
}
6366
}
6467
if (beans.isEmpty()) {

0 commit comments

Comments
 (0)