Support subtyping in SpringIndexer

This commit is contained in:
Kris De Volder
2017-11-16 15:02:06 -08:00
parent 147f2548ae
commit 7c117828c5
20 changed files with 511 additions and 70 deletions

View File

@@ -23,6 +23,7 @@ import org.eclipse.lsp4j.SymbolInformation;
import org.junit.Before;
import org.junit.Test;
import org.springframework.ide.vscode.boot.java.Annotations;
import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchyAwareFactoryManager;
import org.springframework.ide.vscode.boot.java.beans.BeansSymbolProvider;
import org.springframework.ide.vscode.boot.java.beans.ComponentSymbolProvider;
import org.springframework.ide.vscode.boot.java.beans.test.SpringIndexerHarness.TestSymbolInfo;
@@ -37,15 +38,15 @@ import org.springframework.ide.vscode.project.harness.ProjectsHarness;
*/
public class SpringIndexerBeansTest {
private Map<String, SymbolProvider> symbolProviders;
private AnnotationHierarchyAwareFactoryManager<SymbolProvider> symbolProviders;
private BootLanguageServerHarness harness;
private JavaProjectFinder projectFinder;
@Before
public void setup() throws Exception {
symbolProviders = new HashMap<>();
symbolProviders = new AnnotationHierarchyAwareFactoryManager<>();
symbolProviders.put(Annotations.BEAN, new BeansSymbolProvider());
symbolProviders.put(Annotations.COMPONENT, new ComponentSymbolProvider());
symbolProviders.putFactory(Annotations.COMPONENT, ComponentSymbolProvider::new);
harness = BootLanguageServerHarness.builder().build();
projectFinder = harness.getProjectFinder();
@@ -60,13 +61,14 @@ public class SpringIndexerBeansTest {
String uriPrefix = "file://" + directory.getAbsolutePath();
indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/SimpleConfiguration.java",
symbol("@Configuration", "@Configuration"),
symbol("@Configuration", "@+ 'simpleConfiguration' (@+Component) SimpleConfiguration"),
symbol("@Configuration", "@+ 'simpleConfiguration' (@+Configuration) SimpleConfiguration"),
symbol("@Configuration", "@+ 'simpleConfiguration' (@Configuration) SimpleConfiguration"),
symbol("@Bean", "@+ 'simpleBean' (@Bean) BeanClass")
);
}
@Test
public void testScanSpecialConfigurationClass() throws Exception {
@Test public void testScanSpecialConfigurationClass() throws Exception {
SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders);
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.initialize(directory.toPath());
@@ -74,7 +76,9 @@ public class SpringIndexerBeansTest {
String uriPrefix = "file://" + directory.getAbsolutePath();
String docUri = uriPrefix + "/src/main/java/org/test/SpecialConfiguration.java";
indexer.assertDocumentSymbols(docUri,
symbol("@Configuration", "@Configuration"),
symbol("@Configuration", "@+ 'specialConfiguration' (@+Component) SpecialConfiguration"),
symbol("@Configuration", "@+ 'specialConfiguration' (@+Configuration) SpecialConfiguration"),
symbol("@Configuration", "@+ 'specialConfiguration' (@Configuration) SpecialConfiguration"),
// @Bean("implicitNamedBean")
symbol("implicitNamedBean", "@+ 'implicitNamedBean' (@Bean) BeanClass"),
@@ -97,28 +101,66 @@ public class SpringIndexerBeansTest {
@Test
public void testScanSimpleFunctionBean() throws Exception {
SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders);
SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders);
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.initialize(directory.toPath());
String uriPrefix = "file://" + directory.getAbsolutePath();
List<? extends SymbolInformation> symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/FunctionClass.java");
assertEquals(2, symbols.size());
assertTrue(containsSymbol(symbols, "@> 'uppercase' (@Bean) Function<String,String>", uriPrefix + "/src/main/java/org/test/FunctionClass.java", 10, 1, 10, 6));
indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/FunctionClass.java",
symbol("@Configuration", "@+ 'functionClass' (@+Component) FunctionClass"),
symbol("@Configuration", "@+ 'functionClass' (@+Configuration) FunctionClass"),
symbol("@Configuration", "@+ 'functionClass' (@Configuration) FunctionClass"),
symbol("@Bean", "@> 'uppercase' (@Bean) Function<String,String>")
);
}
@Test
public void testScanSimpleComponentClass() throws Exception {
SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders);
SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders);
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.initialize(directory.toPath());
String uriPrefix = "file://" + directory.getAbsolutePath();
List<? extends SymbolInformation> symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java");
assertEquals(1, symbols.size());
assertTrue(containsSymbol(symbols, "@+ 'simpleComponent' (@Component) SimpleComponent", uriPrefix + "/src/main/java/org/test/SimpleComponent.java", 4, 0, 4, 10));
indexer.assertDocumentSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java",
symbol("@Component", "@+ 'simpleComponent' (@+Component) SimpleComponent"),
symbol("@Component", "@+ 'simpleComponent' (@Component) SimpleComponent")
);
// List<? extends SymbolInformation> symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java");
// assertEquals(1, symbols.size());
// assertTrue(containsSymbol(symbols, "@+ 'simpleComponent' (@Component) SimpleComponent", uriPrefix + "/src/main/java/org/test/SimpleComponent.java", 4, 0, 4, 10));
}
@Test public void testScanSimpleControllerClass() throws Exception {
SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders);
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.initialize(directory.toPath());
String uriPrefix = "file://" + directory.getAbsolutePath();
String docUri = uriPrefix + "/src/main/java/org/test/SimpleController.java";
indexer.assertDocumentSymbols(docUri,
symbol("@Controller", "@+ 'simpleController' (@+Component) SimpleController"),
symbol("@Controller", "@+ 'simpleController' (@+Controller) SimpleController"),
symbol("@Controller", "@+ 'simpleController' (@Controller) SimpleController")
);
}
@Test public void testScanRestControllerClass() throws Exception {
SpringIndexerHarness indexer = new SpringIndexerHarness(harness.getServer(), projectFinder, symbolProviders);
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.initialize(directory.toPath());
String uriPrefix = "file://" + directory.getAbsolutePath();
String docUri = uriPrefix + "/src/main/java/org/test/SimpleRestController.java";
indexer.assertDocumentSymbols(docUri,
symbol("@RestController", "@+ 'simpleRestController' (@+Component) SimpleRestController"),
symbol("@RestController", "@+ 'simpleRestController' (@+Controller) SimpleRestController"),
symbol("@RestController", "@+ 'simpleRestController' (@+RestController) SimpleRestController"),
symbol("@RestController", "@+ 'simpleRestController' (@RestController) SimpleRestController")
);
}
////////////////////////////////
// harness code

View File

@@ -25,6 +25,7 @@ import org.apache.commons.io.IOUtils;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.SymbolInformation;
import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer;
import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchyAwareFactoryManager;
import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider;
import org.springframework.ide.vscode.boot.java.utils.SpringIndexer;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
@@ -104,7 +105,7 @@ public class SpringIndexerHarness {
private SpringIndexer indexer;
public SpringIndexerHarness(BootJavaLanguageServer server, JavaProjectFinder projectFinder, Map<String, SymbolProvider> symbolProviders) {
public SpringIndexerHarness(BootJavaLanguageServer server, JavaProjectFinder projectFinder, AnnotationHierarchyAwareFactoryManager<SymbolProvider> symbolProviders) {
this.indexer = new SpringIndexer(server, projectFinder, symbolProviders);
}

View File

@@ -65,11 +65,11 @@ public class SpringIndexerTest {
List<? extends SymbolInformation> allSymbols = indexer().getAllSymbols("");
assertEquals(6, allSymbols.size());
assertEquals(10, allSymbols.size());
String uriPrefix = "file://" + directory.getAbsolutePath();
assertTrue(containsSymbol(allSymbols, "@SpringBootApplication", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@+ 'mainClass' (@SpringBootApplication) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@/embedded-foo-mapping -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 17, 1, 17, 41));
assertTrue(containsSymbol(allSymbols, "@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 27, 1, 27, 51));
assertTrue(containsSymbol(allSymbols, "@/mapping1 -- (no method defined)", uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java", 6, 1, 6, 28));
@@ -85,8 +85,12 @@ public class SpringIndexerTest {
String uriPrefix = "file://" + directory.getAbsolutePath();
List<? extends SymbolInformation> symbols = indexer().getSymbols(uriPrefix + "/src/main/java/org/test/MainClass.java");
assertEquals(3, symbols.size());
assertTrue(containsSymbol(symbols, "@SpringBootApplication", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertEquals(7, symbols.size());
assertTrue(containsSymbol(symbols, "@+ 'mainClass' (@SpringBootApplication) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(symbols, "@+ 'mainClass' (@+SpringBootApplication) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(symbols, "@+ 'mainClass' (@+SpringBootConfiguration) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(symbols, "@+ 'mainClass' (@+Component) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(symbols, "@+ 'mainClass' (@+Configuration) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(symbols, "@/embedded-foo-mapping -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 17, 1, 17, 41));
assertTrue(containsSymbol(symbols, "@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 27, 1, 27, 51));
@@ -108,11 +112,11 @@ public class SpringIndexerTest {
List<? extends SymbolInformation> allSymbols = indexer().getAllSymbols("");
assertEquals(6, allSymbols.size());
assertEquals(10, allSymbols.size());
String uriPrefix = "file://" + directory.getAbsolutePath() + "/test-annotation-indexing";
assertTrue(containsSymbol(allSymbols, "@SpringBootApplication", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@+ 'mainClass' (@SpringBootApplication) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@/embedded-foo-mapping -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 17, 1, 17, 41));
assertTrue(containsSymbol(allSymbols, "@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 27, 1, 27, 51));
assertTrue(containsSymbol(allSymbols, "@/mapping1 -- (no method defined)", uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java", 6, 1, 6, 28));
@@ -141,11 +145,14 @@ public class SpringIndexerTest {
// check for updated index in all symbols
List<? extends SymbolInformation> allSymbols = indexer().getAllSymbols("");
assertEquals(6, allSymbols.size());
assertEquals(10, allSymbols.size());
String uriPrefix = "file://" + directory.getAbsolutePath();
assertTrue(containsSymbol(allSymbols, "@SpringBootApplication", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@+ 'mainClass' (@+Component) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@+ 'mainClass' (@+SpringBootApplication) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@+ 'mainClass' (@SpringBootApplication) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@+ 'mainClass' (@+Configuration) MainClass", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22));
assertTrue(containsSymbol(allSymbols, "@/embedded-foo-mapping -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 17, 1, 17, 41));
assertTrue(containsSymbol(allSymbols, "@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 27, 1, 27, 51));
assertTrue(containsSymbol(allSymbols, "@/mapping1-CHANGED -- (no method defined)", uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java", 6, 1, 6, 36));
@@ -161,7 +168,7 @@ public class SpringIndexerTest {
List<? extends SymbolInformation> allSymbols = indexer().getAllSymbols("mapp");
assertEquals(5, allSymbols.size());
assertEquals(7, allSymbols.size());
String uriPrefix = "file://" + directory.getAbsolutePath();
@@ -226,7 +233,7 @@ public class SpringIndexerTest {
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI());
List<? extends SymbolInformation> allSymbols = indexer().getAllSymbols("");
assertEquals(6, allSymbols.size());
assertEquals(10, allSymbols.size());
File pomFile = directory.toPath().resolve(MavenCore.POM_XML).toFile();
@@ -237,7 +244,7 @@ public class SpringIndexerTest {
allSymbols = indexer().getAllSymbols("");
assertFalse(indexer().isInitializing());
assertEquals(6, allSymbols.size());
assertEquals(10, allSymbols.size());
}
}

View File

@@ -0,0 +1,7 @@
package org.test;
import org.springframework.stereotype.Controller;
@Controller
public class SimpleController {
}

View File

@@ -0,0 +1,7 @@
package org.test;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SimpleRestController {
}