diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java index c4143aaaf..198e281ae 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java @@ -5,6 +5,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -18,7 +19,11 @@ import org.jboss.jandex.IndexReader; import org.jboss.jandex.IndexView; import org.jboss.jandex.Indexer; import org.jboss.jandex.JarIndexer; +import org.springframework.ide.vscode.commons.java.IAnnotation; +import org.springframework.ide.vscode.commons.java.IField; +import org.springframework.ide.vscode.commons.java.IJavadoc; import org.springframework.ide.vscode.commons.java.IJavadocProvider; +import org.springframework.ide.vscode.commons.java.IMethod; import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.util.Log; @@ -48,15 +53,37 @@ public class JandexIndex { IJavadocProvider createJavadocProvider(File jarContainer); } + private static final IJavadocProvider ABSENT_JAVADOC_PROVIDER = new IJavadocProvider() { + + @Override + public IJavadoc getJavadoc(IType type) { + return null; + } + + @Override + public IJavadoc getJavadoc(IField field) { + return null; + } + + @Override + public IJavadoc getJavadoc(IMethod method) { + return null; + } + + @Override + public IJavadoc getJavadoc(IAnnotation method) { + return null; + } + + }; + private Supplier>> index; private JavadocProviderFactory javadocProviderFactory; private Cache javadocProvidersCache = CacheBuilder.newBuilder().build(); - - public JandexIndex(Stream classpathEntries, IndexFileFinder indexFileFinder, JavadocProviderFactory javadocProviderFactory) { - this(classpathEntries, indexFileFinder, Optional.empty(), javadocProviderFactory); - } + + private JandexIndex[] baseIndex; public void setJvadocProviderFactory(JavadocProviderFactory sourceContainerProvider) { this.javadocProviderFactory = sourceContainerProvider; @@ -66,14 +93,9 @@ public class JandexIndex { return javadocProviderFactory; } - public JandexIndex(Stream classpathEntries, IndexFileFinder indexFileFinder, Optional baseIndex, JavadocProviderFactory javadocProviderFactory) { - index = Suppliers.memoize(() -> { - List> indices = buildIndex(classpathEntries, indexFileFinder).collect(Collectors.toList()); - if (baseIndex.isPresent()) { - indices.addAll(baseIndex.get().index.get()); - } - return indices; - }); + public JandexIndex(Stream classpathEntries, IndexFileFinder indexFileFinder, JavadocProviderFactory javadocProviderFactory, JandexIndex... baseIndex) { + this.baseIndex = baseIndex; + index = Suppliers.memoize(() -> buildIndex(classpathEntries, indexFileFinder).collect(Collectors.toList())); this.javadocProviderFactory = javadocProviderFactory; } @@ -159,21 +181,34 @@ public class JandexIndex { public IType findType(String fqName) { return getClassByName(DotName.createSimple(fqName)); } - - IType getClassByName(DotName className) { - Optional> pair = index.get().stream().map(e -> new Entry<>(e.key, e.value.getClassByName(className))).filter(e -> e.value != null).findFirst(); - if (pair.isPresent()) { - File classpathResource = pair.get().key; - IJavadocProvider javadocProvider = null; - try { - javadocProvider = javadocProvidersCache.get(pair.get().key, () -> javadocProviderFactory == null ? null : javadocProviderFactory.createJavadocProvider(classpathResource)); - } catch (ExecutionException e) { - Log.log(e); - } - return Wrappers.wrap(this, pair.get().value, javadocProvider); - } else { - return null; - } + + IType getClassByName(DotName fqName) { + // First look for type in the base index array + return (baseIndex == null ? Stream.empty() + : Arrays.stream(baseIndex) + .filter(jandexIndex -> jandexIndex != null) + .map(jandexIndex -> jandexIndex.getClassByName(fqName))) + .filter(type -> type != null) + .findFirst() + // If not found look at indices owned by this JandexIndex instance + .orElseGet(() -> index.get().stream() + .map(e -> new Entry<>(e.key, e.value.getClassByName(fqName))) + .filter(e -> e.value != null) + .map(e -> createType(e)) + .findFirst() + .orElse(null)); + } + private IType createType(Entry match) { + File classpathResource = match.key; + IJavadocProvider javadocProvider = null; + try { + javadocProvider = javadocProvidersCache.get(match.key, () -> javadocProviderFactory == null ? ABSENT_JAVADOC_PROVIDER : javadocProviderFactory.createJavadocProvider(classpathResource)); + } catch (ExecutionException e) { + Log.log(e); + } + return Wrappers.wrap(this, match.value, javadocProvider); + } + } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java index cb1d1d8c6..54aebce25 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java @@ -23,7 +23,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -81,11 +80,11 @@ public class MavenCore { private MavenBridge maven = new MavenBridge(); - private Supplier> javaCoreIndex = Suppliers.memoize(() -> { + private Supplier javaCoreIndex = Suppliers.memoize(() -> { try { - return Optional.of(new JandexIndex(getJreLibs(), jarFile -> findIndexFile(jarFile), null)); + return new JandexIndex(getJreLibs(), jarFile -> findIndexFile(jarFile), null); } catch (MavenException e) { - return Optional.empty(); + return null; } }); @@ -281,7 +280,7 @@ public class MavenCore { return new File(getIndexFolder().toString(), jarFile.getName() + "-" + suffix + ".jdx"); } - public Optional getJavaIndexForJreLibs() { + public JandexIndex getJavaIndexForJreLibs() { return javaCoreIndex.get(); } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java index d32b770c2..ee7a8d576 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java @@ -60,7 +60,7 @@ public class MavenProjectClasspath implements IClasspath { } catch (Exception e) { Log.log(e); } - return new JandexIndex(classpathEntries, jarFile -> findIndexFile(jarFile), maven.getJavaIndexForJreLibs(), classpathResource -> createJavadocProvider(classpathResource)); + return new JandexIndex(classpathEntries, jarFile -> findIndexFile(jarFile), classpathResource -> createJavadocProvider(classpathResource), maven.getJavaIndexForJreLibs()); }); } @@ -85,7 +85,6 @@ public class MavenProjectClasspath implements IClasspath { } private IJavadocProvider createJavadocProvider(File classpathResource) { - System.out.println("--------> creating javadoc provider for " + classpathResource); if (classpathResource.isDirectory()) { if (classpathResource.toString().startsWith(project.getBuild().getOutputDirectory())) { return new SourceFolderJavadocProvider(new File(project.getBuild().getSourceDirectory()));