diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/META-INF/MANIFEST.MF b/quarkus.jdt/com.redhat.quarkus.jdt.core/META-INF/MANIFEST.MF
index be91fcba1..9b3385b06 100644
--- a/quarkus.jdt/com.redhat.quarkus.jdt.core/META-INF/MANIFEST.MF
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/META-INF/MANIFEST.MF
@@ -10,7 +10,8 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
org.eclipse.m2e.core,
org.eclipse.m2e.maven.runtime,
- org.eclipse.jdt.ls.core;resolution:=optional
+ org.eclipse.jdt.ls.core;resolution:=optional,
+ org.eclipse.lsp4j
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Export-Package: com.redhat.quarkus.commons,
diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/plugin.xml b/quarkus.jdt/com.redhat.quarkus.jdt.core/plugin.xml
index e0b6b02ca..3bf022a90 100644
--- a/quarkus.jdt/com.redhat.quarkus.jdt.core/plugin.xml
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/plugin.xml
@@ -5,6 +5,7 @@
+
diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/commons/QuarkusPropertyDefinitionParams.java b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/commons/QuarkusPropertyDefinitionParams.java
new file mode 100644
index 000000000..7033f11d9
--- /dev/null
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/commons/QuarkusPropertyDefinitionParams.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+* Copyright (c) 2019 Red Hat Inc. and others.
+* All rights reserved. This program and the accompanying materials
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v20.html
+*
+* Contributors:
+* Red Hat Inc. - initial API and implementation
+*******************************************************************************/
+package com.redhat.quarkus.commons;
+
+/**
+ * Quarkus property definition parameters to retrieve the definition of the
+ * Quarkus property in Java class field.
+ *
+ * @author Angelo ZERR
+ *
+ */
+public class QuarkusPropertyDefinitionParams {
+
+ private String uri;
+
+ private String propertySource;
+
+ /**
+ * Returns the application.properties URI.
+ *
+ * @return the application.properties URI
+ */
+ public String getUri() {
+ return uri;
+ }
+
+ /**
+ * Set the application.properties URI
+ *
+ * @param uri the application.properties URI
+ */
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ /**
+ * Returns the Quarkus property source. This source contains the class name and
+ * field name where Quarkus property is defined like
+ * io.quarkus.deployment.ApplicationConfig#name
.
+ *
+ * @return the Quarkus property source.
+ */
+ public String getPropertySource() {
+ return propertySource;
+ }
+
+ /**
+ * Set the Quarkus property source. This source contains the class name and
+ * field name where Quarkus property is defined like
+ * io.quarkus.deployment.ApplicationConfig#name
.
+ *
+ * @param propertySource the Quarkus property source.
+ */
+ public void setPropertySource(String propertySource) {
+ this.propertySource = propertySource;
+ }
+
+}
diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/core/JDTQuarkusManager.java b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/core/JDTQuarkusManager.java
index 58e89f11d..1fab78443 100644
--- a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/core/JDTQuarkusManager.java
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/core/JDTQuarkusManager.java
@@ -61,6 +61,7 @@
import com.redhat.quarkus.commons.ExtendedConfigDescriptionBuildItem;
import com.redhat.quarkus.commons.QuarkusProjectInfo;
import com.redhat.quarkus.commons.QuarkusPropertiesScope;
+import com.redhat.quarkus.jdt.internal.core.QuarkusDeploymentJavaProject;
import com.redhat.quarkus.jdt.internal.core.utils.JDTQuarkusSearchUtils;
import com.redhat.quarkus.jdt.internal.core.utils.JDTQuarkusUtils;
@@ -90,6 +91,51 @@ private JDTQuarkusManager() {
}
+ /**
+ * Returns the Java field from the given property source
+ *
+ * @param file the application.properties file
+ * @param propertySource the property source to find
+ * @param progress the progress monitor.
+ * @return the Java field from the given property source
+ * @throws JavaModelException
+ * @throws CoreException
+ */
+ public IField findDeclaredQuarkusProperty(IFile file, String propertySource, IProgressMonitor progress)
+ throws JavaModelException, CoreException {
+ String projectName = file.getProject().getName();
+ IJavaProject javaProject = JavaModelManager.getJavaModelManager().getJavaModel().getJavaProject(projectName);
+ return findDeclaredQuarkusProperty(javaProject, propertySource, progress);
+ }
+
+ /**
+ * Returns the Java field from the given property source
+ *
+ * @param javaProject the Java project
+ * @param propertySource the property source to find
+ * @param progress the progress monitor.
+ * @return the Java field from the given property sources
+ * @throws JavaModelException
+ */
+ public IField findDeclaredQuarkusProperty(IJavaProject javaProject, String propertySource,
+ IProgressMonitor progress) throws JavaModelException {
+ int index = propertySource.indexOf('#');
+ if (index == -1) {
+ return null;
+ }
+ String className = propertySource.substring(0, index);
+ String fieldName = propertySource.substring(index + 1, propertySource.length());
+ // Try to find type with standard classpath
+ IType type = javaProject.findType(className, progress);
+ if (type == null) {
+ // Not found, type could be included in deployment JAR which is not in classpath
+ // Try to find type from deployment JAR
+ type = new QuarkusDeploymentJavaProject(javaProject, QuarkusDeploymentJavaProject.MAVEN_ARTIFACT_RESOLVER,
+ false).findType(className, progress);
+ }
+ return type.getField(fieldName);
+ }
+
public QuarkusProjectInfo getQuarkusProjectInfo(IFile file, QuarkusPropertiesScope propertiesScope,
DocumentationConverter converter, IProgressMonitor progress) throws JavaModelException, CoreException {
String projectName = file.getProject().getName();
diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/MavenArtifactResolver.java b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/MavenArtifactResolver.java
new file mode 100644
index 000000000..2dd709a18
--- /dev/null
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/MavenArtifactResolver.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+* Copyright (c) 2019 Red Hat Inc. and others.
+* All rights reserved. This program and the accompanying materials
+* which accompanies this distribution, and is available at
+* http://www.eclipse.org/legal/epl-v20.html
+*
+* Contributors:
+* Red Hat Inc. - initial API and implementation
+*******************************************************************************/
+package com.redhat.quarkus.jdt.internal.core;
+
+import java.io.File;
+
+import com.redhat.quarkus.jdt.internal.core.QuarkusDeploymentJavaProject.ArtifactResolver;
+import com.redhat.quarkus.jdt.internal.core.utils.DependencyUtil;
+
+/**
+ * Maven artifact resolver used to download JAR and JAR sources with maven.
+ *
+ * @author Angelo ZERR
+ *
+ */
+public class MavenArtifactResolver implements ArtifactResolver {
+
+ @Override
+ public String getArtifact(String groupId, String artifactId, String version) {
+ File jarFile = null;
+ try {
+ jarFile = DependencyUtil.getArtifact(groupId, artifactId, version, null);
+ } catch (Exception e) {
+ return null;
+ }
+ return jarFile != null ? jarFile.toString() : null;
+ }
+
+ @Override
+ public String getSources(String groupId, String artifactId, String version) {
+ File jarFile = null;
+ try {
+ jarFile = DependencyUtil.getSources(groupId, artifactId, version);
+ } catch (Exception e) {
+ return null;
+ }
+ return jarFile != null ? jarFile.toString() : null;
+ }
+
+}
diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/QuarkusDeploymentJavaProject.java b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/QuarkusDeploymentJavaProject.java
index 98efdc2d7..d747d6af9 100644
--- a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/QuarkusDeploymentJavaProject.java
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/QuarkusDeploymentJavaProject.java
@@ -11,11 +11,11 @@
import static com.redhat.quarkus.jdt.internal.core.QuarkusConstants.QUARKUS_EXTENSION_PROPERTIES;
-import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJarEntryResource;
@@ -27,7 +27,6 @@
import org.eclipse.jdt.internal.core.ExternalJavaProject;
import com.redhat.quarkus.commons.QuarkusPropertiesScope;
-import com.redhat.quarkus.jdt.internal.core.utils.DependencyUtil;
import com.redhat.quarkus.jdt.internal.core.utils.JDTQuarkusSearchUtils;
/**
@@ -42,26 +41,19 @@ public class QuarkusDeploymentJavaProject extends ExternalJavaProject {
* Artifact resolver API
*
*/
- @FunctionalInterface
public static interface ArtifactResolver {
- String resolve(String groupId, String artifactId, String version);
+ String getArtifact(String groupId, String artifactId, String version);
+
+ String getSources(String groupId, String artifactId, String version);
}
- public static final ArtifactResolver MAVEN_ARTIFACT_RESOLVER = (groupId, artifactId, version) -> {
- File jarFile = null;
- try {
- jarFile = DependencyUtil.getArtifact(groupId, artifactId, version, null);
- } catch (Exception e) {
- return null;
- }
- return jarFile != null ? jarFile.toString() : null;
- };
+ public static final ArtifactResolver MAVEN_ARTIFACT_RESOLVER = new MavenArtifactResolver();
private final IJavaProject rootProject;
- public QuarkusDeploymentJavaProject(IJavaProject rootProject, ArtifactResolver artifactResolver, boolean excludeTestCode)
- throws JavaModelException {
+ public QuarkusDeploymentJavaProject(IJavaProject rootProject, ArtifactResolver artifactResolver,
+ boolean excludeTestCode) throws JavaModelException {
super(createDeploymentClasspath(rootProject, artifactResolver, excludeTestCode));
this.rootProject = rootProject;
}
@@ -72,12 +64,13 @@ public QuarkusDeploymentJavaProject(IJavaProject rootProject, ArtifactResolver a
* @param project the quarkus project
* @param artifactResolver the artifact resolver to use to download deployment
* JARs.
- * @param excludeTestCode
+ * @param excludeTestCode
+ * @param downloadSources
* @return the classpath of deployment JARs.
* @throws JavaModelException
*/
- private static IClasspathEntry[] createDeploymentClasspath(IJavaProject project, ArtifactResolver artifactResolver, boolean excludeTestCode)
- throws JavaModelException {
+ private static IClasspathEntry[] createDeploymentClasspath(IJavaProject project, ArtifactResolver artifactResolver,
+ boolean excludeTestCode) throws JavaModelException {
List externalJarEntries = new ArrayList<>();
IClasspathEntry[] entries = project.getResolvedClasspath(true);
@@ -104,9 +97,17 @@ private static IClasspathEntry[] createDeploymentClasspath(IJavaProject project,
String groupId = result[0];
String artifactId = result[1];
String version = result[2];
- String jarFile = artifactResolver.resolve(groupId, artifactId, version);
+ // Get or download deployment JAR
+ String jarFile = artifactResolver.getArtifact(groupId, artifactId, version);
if (jarFile != null) {
- externalJarEntries.add(JavaCore.newLibraryEntry(new Path(jarFile), null, null));
+ IPath sourceAttachmentPath = null;
+ // Get or download deployment sources JAR
+ String sourceJarFile = artifactResolver.getSources(groupId, artifactId, version);
+ if (sourceJarFile != null) {
+ sourceAttachmentPath = new Path(sourceJarFile);
+ }
+ externalJarEntries
+ .add(JavaCore.newLibraryEntry(new Path(jarFile), sourceAttachmentPath, null));
}
}
}
@@ -153,5 +154,4 @@ public IJavaElement[] getElementsToSearch(QuarkusPropertiesScope propertiesScope
}
return elements;
}
-
}
diff --git a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/ls/QuarkusDelegateCommandHandler.java b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/ls/QuarkusDelegateCommandHandler.java
index 946528fbf..9fa155419 100644
--- a/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/ls/QuarkusDelegateCommandHandler.java
+++ b/quarkus.jdt/com.redhat.quarkus.jdt.core/src/main/java/com/redhat/quarkus/jdt/internal/core/ls/QuarkusDelegateCommandHandler.java
@@ -13,14 +13,23 @@
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.IClassFile;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ls.core.internal.IDelegateCommandHandler;
import org.eclipse.jdt.ls.core.internal.JDTUtils;
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
+import org.eclipse.jdt.ls.core.internal.managers.IBuildSupport;
+import org.eclipse.lsp4j.Location;
+import org.eclipse.m2e.core.embedder.ArtifactKey;
import com.redhat.quarkus.commons.QuarkusPropertiesScope;
import com.redhat.quarkus.jdt.core.DocumentationConverter;
@@ -37,6 +46,8 @@ public class QuarkusDelegateCommandHandler implements IDelegateCommandHandler {
public static final String PROJECT_INFO_COMMAND_ID = "quarkus.java.projectInfo";
+ public static final String PROPERTY_DEFINITION_COMMAND_ID = "quarkus.java.propertyDefinition";
+
private static final IQuarkusPropertiesChangedListener LISTENER = (event) -> {
JavaLanguageServerPlugin.getInstance().getClientConnection()
.executeClientCommand(QUARKUS_PROPERTIES_CHANGED_COMMAND, event);
@@ -57,8 +68,9 @@ public QuarkusDelegateCommandHandler() {
public Object executeCommand(String commandId, List