Handle duplicates for bean completion proposals

This commit is contained in:
aboyko
2025-04-01 20:27:22 -04:00
parent 3df5d8e048
commit 3a6dd8b012
3 changed files with 27 additions and 2 deletions

View File

@@ -12,6 +12,7 @@ package org.springframework.ide.vscode.boot.java.beans;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import org.apache.commons.text.similarity.JaroWinklerSimilarity;
@@ -201,4 +202,23 @@ public class BeanCompletionProposal implements ICompletionProposalWithScore {
return false;
}
@Override
public int hashCode() {
return Objects.hash(beanId, beanType);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BeanCompletionProposal other = (BeanCompletionProposal) obj;
return Objects.equals(beanId, other.beanId) && Objects.equals(beanType, other.beanType);
}
}

View File

@@ -109,6 +109,8 @@ public class BeanCompletionProvider implements CompletionProvider {
fieldNames.add(vd.getName());
fieldTypes.add(vd.getType().getQualifiedName());
}
// Collect bean completions in a set to exclude possible bean symbol duplications
Set<BeanCompletionProposal> beanCompletions = new HashSet<>();
for (Bean bean : beans) {
// If current class is a bean - ignore it
if (className.equals(bean.getType())) {
@@ -127,9 +129,10 @@ public class BeanCompletionProvider implements CompletionProvider {
bean.getType(), fieldName, className, rewriteRefactorings);
if (proposal.getScore() > 0) {
completions.add(proposal);
beanCompletions.add(proposal);
}
}
completions.addAll(beanCompletions);
}
} catch (Exception e) {
log.error("problem while looking for bean completions", e);

View File

@@ -71,6 +71,7 @@ public class BeanCompletionProviderTest {
private Bean bean5;
private Bean bean6;
private Bean bean7;
private Bean bean8;
@BeforeEach
public void setup() throws Exception {
@@ -97,8 +98,9 @@ public class BeanCompletionProviderTest {
bean5 = new Bean("petService", "org.springframework.samples.petclinic.pet.Inner.PetService", new Location(tempJavaDocUri, new Range(new Position(1,1), new Position(1, 20))), null, null, null, false, "symbolLabel");
bean6 = new Bean("testBeanCompletionClass", "org.sample.test.TestBeanCompletionClass", new Location(tempJavaDocUri, new Range(new Position(1,1), new Position(1, 20))), null, null, null, false, "symbolLabel");
bean7 = new Bean("testIntBean", "java.lang.Integer", new Location(tempJavaDocUri, new Range(new Position(1,1), new Position(1, 20))), null, null, null, false, "symbolLabel");
bean8 = new Bean("testIntBean", "java.lang.Integer", new Location(tempJavaDocUri, new Range(new Position(1,1), new Position(1, 20))), null, null, null, false, "symbolLabelDuplicate");
springIndex.updateBeans(project.getElementName(), new Bean[] {bean1, bean2, bean3, bean4, bean5, bean6, bean7});
springIndex.updateBeans(project.getElementName(), new Bean[] {bean1, bean2, bean3, bean4, bean5, bean6, bean7, bean8});
}
@AfterEach