This commit is contained in:
BoykoAlex
2018-02-21 14:50:23 -05:00
116 changed files with 1508 additions and 717 deletions

View File

@@ -12,12 +12,12 @@ else
echo "!!!This may slow down the build!!!"
fi
cd ${sources}/../commons-vscode
npm install
#cd ${sources}/../commons-vscode
#npm install
cd "$sources"
npm install ../commons-vscode
#npm install ../commons-vscode
timestamp=`date -u +%Y%m%d%H%M`

View File

@@ -82,8 +82,7 @@ openFile</programArgs>
<feature id="org.springframework.boot.ide.branding.feature" installMode="root"/>
<feature id="org.springframework.boot.ide.main.feature" installMode="root"/>
<!-- <feature id="org.springframework.tooling.properties.ls.feature" installMode="root"/> -->
<feature id="org.springframework.tooling.boot.java.ls.feature" installMode="root"/>
<feature id="org.springframework.tooling.boot.ls.feature" installMode="root"/>
<feature id="org.springframework.tooling.cloudfoundry.manifest.ls.integration.feature" installMode="root"/>
<feature id="org.springframework.tooling.cloudfoundry.manifest.ls.feature" installMode="root"/>

View File

@@ -82,8 +82,7 @@ openFile</programArgs>
<feature id="org.springframework.boot.ide.branding.feature" installMode="root"/>
<feature id="org.springframework.boot.ide.main.feature" installMode="root"/>
<!-- <feature id="org.springframework.tooling.properties.ls.feature" installMode="root"/> -->
<feature id="org.springframework.tooling.boot.java.ls.feature" installMode="root"/>
<feature id="org.springframework.tooling.boot.ls.feature" installMode="root"/>
<feature id="org.springframework.tooling.cloudfoundry.manifest.ls.integration.feature" installMode="root"/>
<feature id="org.springframework.tooling.cloudfoundry.manifest.ls.feature" installMode="root"/>

View File

@@ -74,12 +74,7 @@
</feature>
<feature
id="org.springframework.tooling.properties.ls.feature" version="0.0.0">
<category name="Spring Tool Suite 4 Language Server Integrations for Eclipse" />
</feature>
<feature
id="org.springframework.tooling.boot.java.ls.feature" version="0.0.0">
id="org.springframework.tooling.boot.ls.feature" version="0.0.0">
<category name="Spring Tool Suite 4 Language Server Integrations for Eclipse" />
</feature>

View File

@@ -74,12 +74,7 @@
</feature>
<feature
id="org.springframework.tooling.properties.ls.feature" version="0.0.0">
<category name="Spring Tool Suite 4 Language Server Integrations for Eclipse" />
</feature>
<feature
id="org.springframework.tooling.boot.java.ls.feature" version="0.0.0">
id="org.springframework.tooling.boot.ls.feature" version="0.0.0">
<category name="Spring Tool Suite 4 Language Server Integrations for Eclipse" />
</feature>

View File

@@ -1,6 +0,0 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
servers/

View File

@@ -1,61 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.lsp4e.languageServer">
<server
class="org.springframework.tooling.boot.java.ls.DelegatingStreamConnectionProvider"
id="org.eclipse.languageserver.languages.springbootjava"
clientImpl="org.springframework.tooling.ls.eclipse.commons.STS4LanguageClientImpl"
label="Spring Boot Java Language Server">
</server>
<contentTypeMapping
contentType="org.eclipse.jdt.core.javaSource"
id="org.eclipse.languageserver.languages.springbootjava">
</contentTypeMapping>
</extension>
<extension
id="springbootjava-completion-computer"
point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
<javaCompletionProposalComputer
activate="true"
categoryId="org.eclipse.jdt.ui.defaultProposalCategory"
class="org.springframework.tooling.boot.java.ls.jdt.SpringBootJavaCompletionProposalComputer"
needsSortingAfterFiltering="false">
</javaCompletionProposalComputer>
</extension>
<extension
id="springbootjava-hover-provider"
point="org.eclipse.jdt.ui.javaEditorTextHovers">
<hover
activate="true"
class="org.springframework.tooling.boot.java.ls.jdt.SpringBootJavaHoverProvider"
id="org.springframework.boot.ide.java.servers.hoverprovider">
</hover>
</extension>
<extension
point="org.eclipse.core.filebuffers.documentSetup">
<participant
class="org.eclipse.lsp4e.ConnectDocumentToLanguageServerSetupParticipant"
contentTypeId="org.eclipse.jdt.core.javaSource">
</participant>
</extension>
<extension
point="org.eclipse.ui.preferencePages">
<page
category="org.springsource.ide.eclipse.commons.preferencePage"
class="org.springframework.tooling.boot.java.ls.BootJavaPreferencesPage"
id="org.springframework.tooling.boot.java.ls.page1"
name="Boot Java Language Server Extension">
</page>
</extension>
<extension
point="org.eclipse.core.runtime.preferences">
<initializer
class="org.springframework.tooling.boot.java.ls.PrefsInitializer">
</initializer>
</extension>
</plugin>

View File

@@ -0,0 +1,2 @@
bin.includes=feature.xml,\
p2.inf

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="org.springframework.tooling.boot.java.ls.feature"
label="Spring Boot Java Language Server Feature"
id="org.springframework.tooling.boot.ls.feature"
label="Spring Boot Language Server Feature"
version="4.0.0.qualifier"
provider-name="Pivotal, Inc.">
@@ -12,7 +12,7 @@
</requires>
<plugin
id="org.springframework.tooling.boot.java.ls"
id="org.springframework.tooling.boot.ls"
download-size="0"
install-size="0"
version="0.0.0"

View File

@@ -0,0 +1,8 @@
requires.0.namespace = org.eclipse.equinox.p2.iu
requires.0.name = org.springframework.tooling.boot.java.ls.feature.feature.group
requires.0.min = 0
requires.0.max = 0
requires.1.namespace = org.eclipse.equinox.p2.iu
requires.1.name = org.springframework.tooling.properties.ls.feature.feature.group
requires.1.min = 0
requires.1.max = 0

View File

@@ -9,7 +9,7 @@
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>org.springframework.tooling.boot.java.ls.feature</artifactId>
<artifactId>org.springframework.tooling.boot.ls.feature</artifactId>
<packaging>eclipse-feature</packaging>
</project>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.springframework.tooling.boot.ls</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -1,8 +1,8 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Spring Boot Java Language Server
Bundle-Name: Spring Boot Language Server
Bundle-Vendor: Pivotal, Inc.
Bundle-SymbolicName: org.springframework.tooling.boot.java.ls;singleton:=true
Bundle-SymbolicName: org.springframework.tooling.boot.ls;singleton:=true
Bundle-Version: 0.1.4.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.9.0",
@@ -10,6 +10,8 @@ Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.9.0",
org.eclipse.ui.genericeditor;bundle-version="1.0.0",
org.eclipse.jface.text;bundle-version="3.11.100",
org.eclipse.jdt.ui;bundle-version="3.13.0",
org.eclipse.tm4e.core;bundle-version="0.1.0",
org.eclipse.tm4e.ui;bundle-version="0.1.0",
org.eclipse.lsp4e;bundle-version="0.5.0",
org.eclipse.lsp4j;bundle-version="0.4.0",
org.eclipse.lsp4j.jsonrpc;bundle-version="0.4.0",
@@ -22,5 +24,5 @@ Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.9.0",
Import-Package: com.google.gson;version="2.7.0",
org.eclipse.jface.preference,
org.osgi.framework
Bundle-Activator: org.springframework.tooling.boot.java.ls.BootJavaLanguageServerPlugin
Bundle-Activator: org.springframework.tooling.boot.ls.BootLanguageServerPlugin
Bundle-ActivationPolicy: lazy

View File

@@ -2,6 +2,30 @@
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.eclipse.lsp4e.languageServer">
<server
class="org.springframework.tooling.boot.ls.DelegatingStreamConnectionProvider"
id="org.eclipse.languageserver.languages.springboot"
clientImpl="org.springframework.tooling.ls.eclipse.commons.STS4LanguageClientImpl"
label="Spring Boot Language Server">
</server>
<contentTypeMapping
contentType="org.eclipse.jdt.core.javaSource"
id="org.eclipse.languageserver.languages.springboot">
</contentTypeMapping>
<contentTypeMapping
contentType="org.springframework.boot.ide.properties.application.properties"
id="org.eclipse.languageserver.languages.springboot"
languageId="spring-boot-properties">
</contentTypeMapping>
<contentTypeMapping
contentType="org.springframework.boot.ide.properties.application.yml"
id="org.eclipse.languageserver.languages.springboot"
languageId="spring-boot-properties-yaml">
</contentTypeMapping>
</extension>
<extension
point="org.eclipse.core.contenttype.contentTypes">
<content-type
@@ -30,6 +54,52 @@
</file-association>
</extension>
<extension
id="springbootjava-completion-computer"
point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
<javaCompletionProposalComputer
activate="true"
categoryId="org.eclipse.jdt.ui.defaultProposalCategory"
class="org.springframework.tooling.boot.ls.jdt.SpringBootJavaCompletionProposalComputer"
needsSortingAfterFiltering="false">
</javaCompletionProposalComputer>
</extension>
<extension
id="springbootjava-hover-provider"
point="org.eclipse.jdt.ui.javaEditorTextHovers">
<hover
activate="true"
class="org.springframework.tooling.boot.ls.jdt.SpringBootJavaHoverProvider"
id="org.springframework.boot.ide.java.servers.hoverprovider">
</hover>
</extension>
<extension
point="org.eclipse.core.filebuffers.documentSetup">
<participant
class="org.eclipse.lsp4e.ConnectDocumentToLanguageServerSetupParticipant"
contentTypeId="org.eclipse.jdt.core.javaSource">
</participant>
</extension>
<extension
point="org.eclipse.ui.preferencePages">
<page
category="org.springsource.ide.eclipse.commons.preferencePage"
class="org.springframework.tooling.boot.ls.BootLanguageServerPreferencesPage"
id="org.springframework.tooling.boot.java.ls.page1"
name="Boot Language Server Extension">
</page>
</extension>
<extension
point="org.eclipse.core.runtime.preferences">
<initializer
class="org.springframework.tooling.boot.ls.PrefsInitializer">
</initializer>
</extension>
<extension
point="org.eclipse.ui.editors">
<editorContentTypeBinding
@@ -49,7 +119,7 @@
<extension
point="org.eclipse.ui.genericeditor.presentationReconcilers">
<presentationReconciler
class="org.springframework.tooling.properties.ls.SpringPropertiesPresentationReconciler"
class="org.springframework.tooling.boot.ls.SpringPropertiesPresentationReconciler"
contentType="org.springframework.boot.ide.properties.application.properties">
</presentationReconciler>
</extension>
@@ -73,23 +143,6 @@
scopeName="source.yaml">
</scopeNameContentTypeBinding>
</extension>
<extension
point="org.eclipse.lsp4e.languageServer">
<server
class="org.springframework.tooling.properties.ls.SpringBootPropertiesLanguageServer"
id="org.eclipse.languageserver.languages.springbootproperties"
clientImpl="org.springframework.tooling.ls.eclipse.commons.STS4LanguageClientImpl"
label="Spring Boot Properties Language Server">
</server>
<contentTypeMapping
contentType="org.springframework.boot.ide.properties.application.properties"
id="org.eclipse.languageserver.languages.springbootproperties">
</contentTypeMapping>
<contentTypeMapping
contentType="org.springframework.boot.ide.properties.application.yml"
id="org.eclipse.languageserver.languages.springbootproperties">
</contentTypeMapping>
</extension>
</plugin>

View File

@@ -11,14 +11,14 @@
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>org.springframework.tooling.boot.java.ls</artifactId>
<artifactId>org.springframework.tooling.boot.ls</artifactId>
<version>0.1.4-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.ide.vscode</groupId>
<artifactId>boot-java-language-server</artifactId>
<artifactId>spring-boot-language-server</artifactId>
<version>0.1.4-SNAPSHOT</version>
</dependency>
</dependencies>
@@ -40,7 +40,7 @@
<artifactItems>
<artifactItem>
<groupId>org.springframework.ide.vscode</groupId>
<artifactId>boot-java-language-server</artifactId>
<artifactId>spring-boot-language-server</artifactId>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}/../servers</outputDirectory>
</artifactItem>

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import java.io.IOException;
import java.util.ArrayList;
@@ -26,16 +26,16 @@ import org.osgi.framework.BundleContext;
* @author Alex Boyko
*
*/
public class BootJavaLanguageServerPlugin extends AbstractUIPlugin {
public class BootLanguageServerPlugin extends AbstractUIPlugin {
public static final String ID = "org.springframework.tooling.boot.java.ls";
private static final Object LSP4E_COMMAND_SYMBOL_IN_WORKSPACE = "org.eclipse.lsp4e.symbolinworkspace";
// The shared instance
private static BootJavaLanguageServerPlugin plugin;
private static BootLanguageServerPlugin plugin;
public BootJavaLanguageServerPlugin() {
public BootLanguageServerPlugin() {
// Empty
}
@@ -53,7 +53,7 @@ public class BootJavaLanguageServerPlugin extends AbstractUIPlugin {
plugin = null;
}
public static BootJavaLanguageServerPlugin getDefault() {
public static BootLanguageServerPlugin getDefault() {
return plugin;
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
@@ -21,15 +21,15 @@ import org.eclipse.ui.IWorkbenchPreferencePage;
* @author Alex Boyko
*
*/
public class BootJavaPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
public class BootLanguageServerPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
public BootJavaPreferencesPage() {
public BootLanguageServerPreferencesPage() {
}
@Override
public void init(IWorkbench workbench) {
setDescription("Settings for Boot-Java language server extension");
setPreferenceStore(BootJavaLanguageServerPlugin.getDefault().getPreferenceStore());
setPreferenceStore(BootLanguageServerPlugin.getDefault().getPreferenceStore());
}
@Override

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,14 +8,14 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
/**
* @author Martin Lippert
*/
public class Constants {
public static final String PLUGIN_ID = "org.springframework.tooling.boot.java.ls";
public static final String PLUGIN_ID = "org.springframework.tooling.boot.ls";
public static final String LANGUAGE_SERVER_VERSION = "0.1.4-SNAPSHOT.jar";
public static final String PREF_BOOT_HINTS = "boot-java.boot-hints.on";

View File

@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import java.io.IOException;
import java.io.InputStream;
@@ -56,10 +56,10 @@ public class DelegatingStreamConnectionProvider implements StreamConnectionProvi
public DelegatingStreamConnectionProvider() {
String port = System.getProperty("boot-java-ls-port");
if (port != null) {
this.provider = new SpringBootJavaLanguageServerViaSocket(Integer.parseInt(port));
this.provider = new SpringBootLanguageServerViaSocket(Integer.parseInt(port));
}
else {
this.provider = new SpringBootJavaLanguageServer();
this.provider = new SpringBootLanguageServer();
}
}
@@ -95,7 +95,7 @@ public class DelegatingStreamConnectionProvider implements StreamConnectionProvi
ResourcesPlugin.getWorkspace().removeResourceChangeListener(fResourceListener);
fResourceListener = null;
}
BootJavaLanguageServerPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(configListener);
BootLanguageServerPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(configListener);
}
@Override
@@ -108,7 +108,7 @@ public class DelegatingStreamConnectionProvider implements StreamConnectionProvi
sendConfiguration();
// Add config listener
BootJavaLanguageServerPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(configListener);
BootLanguageServerPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(configListener);
// Add resource listener
ResourcesPlugin.getWorkspace().addResourceChangeListener(fResourceListener = new ResourceListener(languageServer, Arrays.asList(
@@ -124,7 +124,7 @@ public class DelegatingStreamConnectionProvider implements StreamConnectionProvi
Map<String, Object> settings = new HashMap<>();
Map<String, Object> bootJavaObj = new HashMap<>();
Map<String, Object> bootHint = new HashMap<>();
bootHint.put("on", BootJavaLanguageServerPlugin.getDefault().getPreferenceStore().getBoolean(Constants.PREF_BOOT_HINTS));
bootHint.put("on", BootLanguageServerPlugin.getDefault().getPreferenceStore().getBoolean(Constants.PREF_BOOT_HINTS));
bootJavaObj.put("boot-hints", bootHint);
settings.put("boot-java", bootJavaObj);
this.languageServer.getWorkspaceService().didChangeConfiguration(new DidChangeConfigurationParams(settings));

View File

@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import java.io.File;

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
@@ -25,7 +25,7 @@ public class PrefsInitializer extends AbstractPreferenceInitializer {
@Override
public void initializeDefaultPreferences() {
BootJavaLanguageServerPlugin.getDefault().getPreferenceStore().setDefault(Constants.PREF_BOOT_HINTS, true);
BootLanguageServerPlugin.getDefault().getPreferenceStore().setDefault(Constants.PREF_BOOT_HINTS, true);
}
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import java.net.URI;
import java.nio.file.PathMatcher;

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,9 +8,9 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import static org.springframework.tooling.ls.eclipse.commons.console.preferences.LanguageServerConsolePreferenceConstants.BOOT_JAVA_SERVER;
import static org.springframework.tooling.ls.eclipse.commons.console.preferences.LanguageServerConsolePreferenceConstants.SPRING_BOOT_SERVER;
import java.io.File;
import java.io.InputStream;
@@ -30,10 +30,10 @@ import org.springframework.tooling.ls.eclipse.commons.STS4LanguageServerProcessS
/**
* @author Martin Lippert
*/
public class SpringBootJavaLanguageServer extends STS4LanguageServerProcessStreamConnector {
public class SpringBootLanguageServer extends STS4LanguageServerProcessStreamConnector {
public SpringBootJavaLanguageServer() {
super(BOOT_JAVA_SERVER);
public SpringBootLanguageServer() {
super(SPRING_BOOT_SERVER);
List<String> commands = new ArrayList<>();
JRE jre = getJRE();
commands.add(jre.getJavaExecutable());
@@ -68,7 +68,7 @@ public class SpringBootJavaLanguageServer extends STS4LanguageServerProcessStrea
}
protected String getLanguageServerJARLocation() {
String languageServer = "boot-java-language-server-" + Constants.LANGUAGE_SERVER_VERSION;
String languageServer = "spring-boot-language-server-" + Constants.LANGUAGE_SERVER_VERSION;
Bundle bundle = Platform.getBundle(Constants.PLUGIN_ID);
String bundleVersion = bundle.getVersion().toString();
@@ -89,7 +89,7 @@ public class SpringBootJavaLanguageServer extends STS4LanguageServerProcessStrea
File userHome = new File(System.getProperty("user.home"));
File locallyBuiltJar = new File(
userHome,
"git/sts4/headless-services/boot-java-language-server/target/boot-java-language-server-"+Constants.LANGUAGE_SERVER_VERSION
"git/sts4/headless-services/spring-boot-language-server/target/spring-boot-language-server-"+Constants.LANGUAGE_SERVER_VERSION
);
if (locallyBuiltJar.exists()) {
return locallyBuiltJar.getAbsolutePath();

View File

@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls;
package org.springframework.tooling.boot.ls;
import java.io.IOException;
import java.io.InputStream;
@@ -17,14 +17,14 @@ import java.net.Socket;
import org.eclipse.lsp4e.server.StreamConnectionProvider;
public class SpringBootJavaLanguageServerViaSocket implements StreamConnectionProvider {
public class SpringBootLanguageServerViaSocket implements StreamConnectionProvider {
private OutputStream outputStream;
private InputStream inputStream;
private Socket socket;
private int port;
public SpringBootJavaLanguageServerViaSocket(int port) {
public SpringBootLanguageServerViaSocket(int port) {
this.port = port;
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2016 Pivotal, Inc.
* Copyright (c) 2016, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.properties.ls;
package org.springframework.tooling.boot.ls;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.propertiesfileeditor.IPropertiesFilePartitions;

View File

@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls.jdt;
package org.springframework.tooling.boot.ls.jdt;
import java.util.Arrays;
import java.util.Collections;

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,7 +8,7 @@
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.boot.java.ls.jdt;
package org.springframework.tooling.boot.ls.jdt;
import org.eclipse.jdt.ui.text.java.hover.IJavaEditorTextHover;
import org.eclipse.jface.text.IInformationControlCreator;

View File

@@ -15,20 +15,17 @@ public class LanguageServerConsolePreferenceConstants {
public static final boolean ENABLE_BY_DEFAULT = true;
public static final String PREF_BOOT_JAVA_CONSOLE_ENABLED = "boot-java.console.enabled";
public static final String PREF_BOOT_PROPS_CONSOLE_ENABLED = "boot-properties.console.enabled";
public static final String PREF_CONCOURSE_CONSOLE_ENABLED = "concourse.console.enabled";
public static final String PREF_CLOUDFOUNDRY_CONSOLE_ENABLED = "cloudfoundry.console.enabled";
public static final String PREF_BOSH_CONSOLE_ENABLED = "bosh.console.enabled";
public static final ServerInfo BOOT_JAVA_SERVER = new ServerInfo(PREF_BOOT_JAVA_CONSOLE_ENABLED, "Boot Java");
public static final ServerInfo BOOT_PROPS_SERVER = new ServerInfo(PREF_BOOT_PROPS_CONSOLE_ENABLED, "Boot Properties");
public static final ServerInfo SPRING_BOOT_SERVER = new ServerInfo(PREF_BOOT_JAVA_CONSOLE_ENABLED, "Spring Boot");
public static final ServerInfo CLOUDFOUNDRY_SERVER = new ServerInfo(PREF_CLOUDFOUNDRY_CONSOLE_ENABLED, "Cloudfoundry");
public static final ServerInfo CONCOURSE_SERVER = new ServerInfo(PREF_CONCOURSE_CONSOLE_ENABLED, "Concourse");
public static final ServerInfo BOSH_SERVER = new ServerInfo(PREF_BOSH_CONSOLE_ENABLED, "Bosh");
public static final ServerInfo[] ALL_SERVERS = {
BOOT_JAVA_SERVER,
BOOT_PROPS_SERVER,
SPRING_BOOT_SERVER,
CLOUDFOUNDRY_SERVER,
CONCOURSE_SERVER,
BOSH_SERVER

View File

@@ -2,11 +2,7 @@
<site>
<category-def name="Spring Tools 4 Language Server Integrations for Eclipse" label="Spring Tools 4 Language Server Integrations for Eclipse"/>
<feature id="org.springframework.tooling.properties.ls.feature">
<category name="Spring Tools 4 Language Server Integrations for Eclipse"/>
</feature>
<feature id="org.springframework.tooling.boot.java.ls.feature">
<feature id="org.springframework.tooling.boot.ls.feature">
<category name="Spring Tools 4 Language Server Integrations for Eclipse"/>
</feature>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.springframework.tooling.properties.ls.feature</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="org.springframework.tooling.properties.ls.feature"
label="Spring Boot Property Editing Language Server Feature"
version="4.0.0.qualifier"
provider-name="Pivotal, Inc.">
<requires>
<import plugin="org.eclipse.ui.genericeditor"/>
<import plugin="org.eclipse.lsp4e"/>
</requires>
<plugin
id="org.springframework.tooling.properties.ls"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false">
</plugin>
</feature>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot.ide</groupId>
<artifactId>org.springframework.boot.ide.servers</artifactId>
<version>4.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>org.springframework.tooling.properties.ls.feature</artifactId>
<packaging>eclipse-feature</packaging>
</project>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@@ -1,7 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

View File

@@ -1,22 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Spring Boot Properties Language Server
Bundle-Vendor: Pivotal, Inc.
Bundle-SymbolicName: org.springframework.tooling.properties.ls;singleton:=true
Bundle-Version: 0.1.4.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.9.0",
org.eclipse.core.runtime;bundle-version="3.12.0",
org.eclipse.ui.genericeditor;bundle-version="1.0.0",
org.eclipse.jface.text;bundle-version="3.11.100",
org.eclipse.jdt.ui;bundle-version="3.13.0",
org.eclipse.tm4e.core;bundle-version="0.1.0",
org.eclipse.tm4e.ui;bundle-version="0.1.0",
org.eclipse.lsp4e;bundle-version="0.5.0",
org.eclipse.lsp4j;bundle-version="0.4.0",
org.eclipse.ui.workbench,
org.eclipse.jface,
org.springframework.tooling.ls.eclipse.commons;bundle-version="4.0.0"
Import-Package: com.google.gson;version="2.7.0",
org.eclipse.jface.preference,
org.osgi.framework

View File

@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot.ide</groupId>
<artifactId>org.springframework.boot.ide.servers</artifactId>
<version>4.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>org.springframework.tooling.properties.ls</artifactId>
<version>0.1.4-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.ide.vscode</groupId>
<artifactId>boot-properties-language-server</artifactId>
<version>0.1.4-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.springframework.ide.eclipse</groupId>
<artifactId>org.json</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.springframework.ide.vscode</groupId>
<artifactId>boot-properties-language-server</artifactId>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}/../servers</outputDirectory>
</artifactItem>
</artifactItems>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,21 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016, 2017 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.properties.ls;
/**
* @author Martin Lippert
*/
public class Constants {
public static final String PLUGIN_ID = "org.springframework.tooling.properties.ls";
public static final String LANGUAGE_SERVER_VERSION = "0.1.4-SNAPSHOT";
}

View File

@@ -1,91 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016, 2017 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.tooling.properties.ls;
import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import org.springframework.tooling.ls.eclipse.commons.JRE;
import org.springframework.tooling.ls.eclipse.commons.STS4LanguageServerProcessStreamConnector;
import static org.springframework.tooling.ls.eclipse.commons.console.preferences.LanguageServerConsolePreferenceConstants.*;
/**
* @author Martin Lippert
*/
public class SpringBootPropertiesLanguageServer extends STS4LanguageServerProcessStreamConnector {
public SpringBootPropertiesLanguageServer() {
super(BOOT_PROPS_SERVER);
List<String> commands = new ArrayList<>();
commands.add(JRE.currentJRE().getJavaExecutable());
// commands.add("-Xdebug");
// commands.add("-agentlib:jdwp=transport=dt_socket,address=8899,server=y,suspend=n");
commands.add("-Dlsp.lazy.completions.disable=true");
commands.add("-Dlsp.completions.indentation.enable=true");
commands.add("-jar");
commands.add(getLanguageServerJARLocation());
String workingDir = getWorkingDirLocation();
setCommands(commands);
setWorkingDirectory(workingDir);
}
protected String getLanguageServerJARLocation() {
String languageServer = "boot-properties-language-server-" + Constants.LANGUAGE_SERVER_VERSION + ".jar";
Bundle bundle = Platform.getBundle(Constants.PLUGIN_ID);
File dataFile = bundle.getDataFile(languageServer);
Exception error = null;
try {
copyLanguageServerJAR(languageServer);
}
catch (Exception e) {
error = e;
}
if (!dataFile.exists()) {
File userHome = new File(System.getProperty("user.home"));
File locallyBuiltJar = new File(
userHome,
"git/sts4/headless-services/boot-properties-language-server/target/boot-properties-language-server-"+Constants.LANGUAGE_SERVER_VERSION + ".jar"
);
if (locallyBuiltJar.exists()) {
return locallyBuiltJar.getAbsolutePath();
}
if (error!=null) {
error.printStackTrace();
}
}
return dataFile.getAbsolutePath();
}
protected void copyLanguageServerJAR(String languageServerJarName) throws Exception {
Bundle bundle = Platform.getBundle(Constants.PLUGIN_ID);
InputStream stream = FileLocator.openStream( bundle, new Path("servers/" + languageServerJarName), false );
File dataFile = bundle.getDataFile(languageServerJarName);
Files.copy(stream, dataFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}

View File

@@ -36,12 +36,9 @@
<module>org.springframework.tooling.cloudfoundry.manifest.ls.integration</module>
<module>org.springframework.tooling.cloudfoundry.manifest.ls.integration.feature</module>
<module>org.springframework.tooling.properties.ls</module>
<module>org.springframework.tooling.properties.ls.feature</module>
<module>org.springframework.tooling.ls.eclipse.gotosymbol</module>
<module>org.springframework.tooling.boot.java.ls</module>
<module>org.springframework.tooling.boot.java.ls.feature</module>
<module>org.springframework.tooling.boot.ls</module>
<module>org.springframework.tooling.boot.ls.feature</module>
<module>org.springframework.tooling.bosh.ls</module>
<module>org.springframework.tooling.bosh.ls.feature</module>

View File

@@ -44,12 +44,12 @@ public class LiveConditionalParser {
public Optional<List<LiveConditional>> parse() {
try {
List<LiveConditional> allConditionals = new ArrayList<>();
JSONObject autoConfigReport = new JSONObject(autoConfigRecord);
if (autoConfigReport.has("contexts")) {
//more recently the report is nested inside the 'application' context.
autoConfigReport = autoConfigReport.getJSONObject("contexts").getJSONObject("application");
}
if (StringUtil.hasText(autoConfigRecord)) {
JSONObject autoConfigReport = new JSONObject(autoConfigRecord);
if (autoConfigReport.has("contexts")) {
//more recently the report is nested inside the 'application' context.
autoConfigReport = autoConfigReport.getJSONObject("contexts").getJSONObject("application");
}
for (LiveConditional c : getConditionalsFromPositiveMatches(autoConfigReport)) {
allConditionals.add(c);
}

View File

@@ -27,10 +27,10 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeParser;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode;
import org.springframework.ide.vscode.boot.properties.reconcile.PropertyNavigator;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.CollectionUtil;
import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
@@ -69,7 +69,7 @@ public class CommonLanguageTools {
public static Collection<StsValueHint> getValueHints(FuzzyMap<PropertyInfo> index, TypeUtil typeUtil, String query, String propertyName, EnumCaseMode caseMode) {
Type type = getValueType(index, typeUtil, propertyName);
if (TypeUtil.isArray(type) || TypeUtil.isList(type)) {
if (TypeUtil.isSequencable(type)) {
//It is useful to provide content assist for the values in the list when entering a list
type = TypeUtil.getDomainType(type);
}

View File

@@ -18,7 +18,11 @@ package org.springframework.ide.vscode.boot.java;
public class Annotations {
public static final String BEAN = "org.springframework.context.annotation.Bean";
public static final String PROFILE = "org.springframework.context.annotation.Profile";
public static final String CONDITIONAL = "org.springframework.context.annotation.Conditional";
public static final String COMPONENT = "org.springframework.stereotype.Component";
public static final String REPOSITORY = "org.springframework.stereotype.Repository";
public static final String AUTOWIRED = "org.springframework.beans.factory.annotation.Autowired";
public static final String SPRING_REQUEST_MAPPING = "org.springframework.web.bind.annotation.RequestMapping";
@@ -28,7 +32,6 @@ public class Annotations {
public static final String SPRING_DELETE_MAPPING = "org.springframework.web.bind.annotation.DeleteMapping";
public static final String SPRING_PATCH_MAPPING = "org.springframework.web.bind.annotation.PatchMapping";
public static final String CONDITIONAL = "org.springframework.context.annotation.Conditional";
public static final String CONDITIONAL_ON_BEAN = "org.springframework.boot.autoconfigure.condition.ConditionalOnBean";
public static final String CONDITIONAL_ON_MISSING_BEAN = "org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean";
public static final String CONDITIONAL_ON_PROPERTY = "org.springframework.boot.autoconfigure.condition.ConditionalOnProperty";

View File

@@ -10,25 +10,19 @@
*******************************************************************************/
package org.springframework.ide.vscode.boot.java;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import org.eclipse.lsp4j.CompletionItemKind;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.Registration;
import org.eclipse.lsp4j.RegistrationParams;
import org.springframework.ide.vscode.boot.BootLanguageServerParams;
import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchyAwareLookup;
import org.springframework.ide.vscode.boot.java.autowired.AutowiredHoverProvider;
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.conditionals.ConditionalsLiveHoverProvider;
import org.springframework.ide.vscode.boot.java.data.DataRepositorySymbolProvider;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaCodeLensEngine;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaCompletionEngine;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaDocumentSymbolHandler;
@@ -61,12 +55,10 @@ import org.springframework.ide.vscode.commons.languageserver.completion.IComplet
import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine;
import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler;
import org.springframework.ide.vscode.commons.languageserver.util.LSFactory;
import org.springframework.ide.vscode.commons.languageserver.util.ReferencesHandler;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServerWrapper;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
@@ -287,6 +279,8 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent
providers.put(Annotations.BEAN, new BeansSymbolProvider());
providers.put(Annotations.COMPONENT, new ComponentSymbolProvider());
providers.put(Annotations.REPOSITORY, new DataRepositorySymbolProvider());
return new SpringIndexer(server, params, providers);
}

View File

@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -14,6 +14,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.jdt.core.dom.Annotation;
@@ -60,7 +61,7 @@ public abstract class AnnotationHierarchies {
public static Set<String> getTransitiveSuperAnnotations(ITypeBinding typeBinding) {
Set<String> seen = new HashSet<>();
findTransitiveSupers(typeBinding, seen);
findTransitiveSupers(typeBinding, seen).collect(Collectors.toList());
return seen;
}

View File

@@ -26,9 +26,9 @@ import org.eclipse.lsp4j.SymbolKind;
import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider;
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
import org.springframework.ide.vscode.boot.java.utils.FunctionUtils;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;

View File

@@ -0,0 +1,142 @@
/*******************************************************************************
* Copyright (c) 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.boot.java.data;
import java.util.Collection;
import org.eclipse.jdt.core.dom.Annotation;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.SymbolInformation;
import org.eclipse.lsp4j.SymbolKind;
import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider;
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;
import reactor.util.function.Tuple4;
import reactor.util.function.Tuples;
/**
* @author Martin Lippert
*/
public class DataRepositorySymbolProvider implements SymbolProvider {
private static final String REPOSITORY_TYPE = "org.springframework.data.repository.Repository";
@Override
public Collection<SymbolInformation> getSymbols(Annotation node, ITypeBinding annotationType, Collection<ITypeBinding> metaAnnotations, TextDocument doc) {
return null;
}
@Override
public Collection<SymbolInformation> getSymbols(TypeDeclaration typeDeclaration, TextDocument doc) {
// this checks spring data repository beans that are defined as extensions of the repository interface
Tuple4<String, String, String, DocumentRegion> repositoryBean = getRepositoryBean(typeDeclaration, doc);
if (repositoryBean != null) {
try {
SymbolInformation symbol = new SymbolInformation(
beanLabel(true, repositoryBean.getT1(), repositoryBean.getT2(), repositoryBean.getT3()),
SymbolKind.Interface,
new Location(doc.getUri(), doc.toRange(repositoryBean.getT4())));
return ImmutableList.of(symbol);
} catch (BadLocationException e) {
Log.log(e);
}
}
return ImmutableList.of();
}
protected String beanLabel(boolean isFunctionBean, String beanName, String beanType, String markerString) {
StringBuilder symbolLabel = new StringBuilder();
symbolLabel.append("@+");
symbolLabel.append(' ');
symbolLabel.append('\'');
symbolLabel.append(beanName);
symbolLabel.append('\'');
markerString = markerString != null && markerString.length() > 0 ? " (" + markerString + ") " : " ";
symbolLabel.append(markerString);
symbolLabel.append(beanType);
return symbolLabel.toString();
}
private static Tuple4<String, String, String, DocumentRegion> getRepositoryBean(TypeDeclaration typeDeclaration, TextDocument doc) {
ITypeBinding resolvedType = typeDeclaration.resolveBinding();
if (resolvedType != null) {
return getRepositoryBean(typeDeclaration, doc, resolvedType);
}
else {
return null;
}
}
private static Tuple4<String, String, String, DocumentRegion> getRepositoryBean(TypeDeclaration typeDeclaration, TextDocument doc,
ITypeBinding resolvedType) {
ITypeBinding[] interfaces = resolvedType.getInterfaces();
for (ITypeBinding resolvedInterface : interfaces) {
String simplifiedType = null;
if (resolvedInterface.isParameterizedType()) {
simplifiedType = resolvedInterface.getBinaryName();
}
else {
simplifiedType = resolvedType.getQualifiedName();
}
if (REPOSITORY_TYPE.equals(simplifiedType)) {
String beanName = getBeanName(typeDeclaration);
String beanType = resolvedInterface.getName();
String domainType = null;
if (resolvedInterface.isParameterizedType()) {
ITypeBinding[] typeParameters = resolvedInterface.getTypeArguments();
if (typeParameters != null && typeParameters.length > 0) {
domainType = typeParameters[0].getName();
}
}
DocumentRegion region = ASTUtils.nodeRegion(doc, typeDeclaration.getName());
return Tuples.of(beanName, beanType, domainType, region);
}
else {
Tuple4<String, String, String, DocumentRegion> result = getRepositoryBean(typeDeclaration, doc, resolvedInterface);
if (result != null) {
return result;
}
}
}
ITypeBinding superclass = resolvedType.getSuperclass();
if (superclass != null) {
return getRepositoryBean(typeDeclaration, doc, superclass);
}
else {
return null;
}
}
private static String getBeanName(TypeDeclaration typeDeclaration) {
String beanName = typeDeclaration.getName().toString();
if (beanName.length() > 0 && Character.isUpperCase(beanName.charAt(0))) {
beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1);
}
return beanName;
}
}

View File

@@ -37,10 +37,10 @@ import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
import org.springframework.ide.vscode.commons.java.IClasspath;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.TextDocument;

View File

@@ -13,6 +13,7 @@ package org.springframework.ide.vscode.boot.java.livehover;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -27,21 +28,18 @@ import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.springframework.ide.vscode.boot.java.Annotations;
import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents;
import org.springframework.ide.vscode.boot.java.annotations.AnnotationHierarchies;
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
import org.springframework.ide.vscode.boot.java.utils.FunctionUtils;
import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean;
import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;
import reactor.util.function.Tuple3;
public class ComponentInjectionsHoverProvider extends AbstractInjectedIntoHoverProvider {
public ComponentInjectionsHoverProvider(BootJavaLanguageServerComponents server) {
@@ -135,8 +133,7 @@ public class ComponentInjectionsHoverProvider extends AbstractInjectedIntoHoverP
@Override
public Collection<Range> getLiveHoverHints(TypeDeclaration typeDeclaration, TextDocument doc,
SpringBootApp[] runningApps) {
Tuple3<String, String, DocumentRegion> functionBean = FunctionUtils.getFunctionBean(typeDeclaration, doc);
if (functionBean != null && runningApps.length > 0) {
if (runningApps.length > 0 && !isComponentAnnotatedType(typeDeclaration)) {
try {
LiveBean definedBean = getDefinedBeanForType(typeDeclaration, null);
if (definedBean != null) {
@@ -157,8 +154,8 @@ public class ComponentInjectionsHoverProvider extends AbstractInjectedIntoHoverP
@Override
public Hover provideHover(ASTNode node, TypeDeclaration typeDeclaration, ITypeBinding type, int offset,
TextDocument doc, IJavaProject project, SpringBootApp[] runningApps) {
Tuple3<String, String, DocumentRegion> functionBean = FunctionUtils.getFunctionBean(typeDeclaration, doc);
if (functionBean != null && runningApps.length > 0) {
if (runningApps.length > 0 && !isComponentAnnotatedType(typeDeclaration)) {
LiveBean definedBean = getDefinedBeanForType(typeDeclaration, null);
if (definedBean != null) {
@@ -191,4 +188,26 @@ public class ComponentInjectionsHoverProvider extends AbstractInjectedIntoHoverP
return null;
}
private boolean isComponentAnnotatedType(TypeDeclaration typeDeclaration) {
List<?> modifiers = typeDeclaration.modifiers();
for (Object modifier : modifiers) {
if (modifier instanceof Annotation) {
ITypeBinding typeBinding = ((Annotation) modifier).resolveTypeBinding();
return isComponentAnnotation(typeBinding);
}
}
return false;
}
private boolean isComponentAnnotation(ITypeBinding type) {
Set<String> transitiveSuperAnnotations = AnnotationHierarchies.getTransitiveSuperAnnotations(type);
for (String annotationType : transitiveSuperAnnotations) {
if (Annotations.COMPONENT.equals(annotationType)) {
return true;
}
}
return false;
}
}

View File

@@ -17,8 +17,8 @@ import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.lsp4j.CompletionItemKind;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import com.google.common.base.Supplier;

View File

@@ -15,8 +15,8 @@ import java.util.regex.Pattern;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.IndentUtil;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import com.google.common.base.Supplier;

View File

@@ -17,10 +17,10 @@ import org.eclipse.lsp4j.CompletionItemKind;
import org.springframework.ide.vscode.boot.java.jdt.imports.ImportRewrite;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.Renderables;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import com.google.common.base.Supplier;

View File

@@ -17,10 +17,10 @@ import java.util.List;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.FuzzyMatcher;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import com.google.common.base.Supplier;

View File

@@ -31,9 +31,9 @@ import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.lsp4j.Range;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.CollectorUtil;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;

View File

@@ -18,7 +18,7 @@ import java.util.function.Supplier;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import reactor.util.function.Tuple3;

View File

@@ -0,0 +1,72 @@
/*******************************************************************************
* Copyright (c) 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.boot.metadata.types;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.ValueParseException;
import org.springframework.ide.vscode.commons.util.ValueParser;
import com.google.common.collect.ImmutableList;
/**
* Parser that is capable of parsing comma-separated lists. The parser
* is constructed from another parser which is used to parse the elements.
*/
public class DelimitedStringParser implements ValueParser {
private static final Pattern COMMA = Pattern.compile("(\\s)*\\,(\\s)*");;
private Pattern SEPARATOR = COMMA;
private ValueParser elementParser;
public DelimitedStringParser(ValueParser elementParser) {
super();
this.elementParser = elementParser;
}
@Override
public Object parse(String str) throws Exception {
if (!StringUtil.hasText(str)) {
return ImmutableList.of();
}
int offset = 0;
Matcher matcher = SEPARATOR.matcher(str);
ArrayList<Object> parsed = new ArrayList<>();
while (matcher.find()) {
parseOne(str, offset, matcher.start(), parsed);
offset = matcher.end();
}
//parse last piece too!
parseOne(str, offset, str.length(), parsed);
return parsed;
}
private void parseOne(String input, int start, int end, ArrayList<Object> parsed) throws Exception {
String piece = input.substring(start, end);
try {
Object parsedPiece = elementParser.parse(piece);
parsed.add(parsedPiece);
} catch (Exception e) {
if (e instanceof ValueParseException) {
((ValueParseException) e).adjustHighlight(start, end, piece);
} else {
e = new ValueParseException(ExceptionUtil.getMessage(e), start, end, piece);
}
throw e;
}
}
}

View File

@@ -254,6 +254,17 @@ public class TypeUtil {
// provide a parser that allows throws
return new AlwaysFailingParser(niceTypeName(type));
}
if (isSequencable(type)) {
//Trying to parse list from scalars is possible if the domain type is parseable. Spring boot
// will try to interpret the string as a comma-separated list
Type elType = getDomainType(type);
if (elType!=null) {
ValueParser elParser = getValueParser(elType);
if (elParser!=null) {
return new DelimitedStringParser(elParser);
}
}
}
return null;
}
@@ -418,11 +429,13 @@ public class TypeUtil {
//However...
//Seems that in Boot 1.3 arrays are now 'Bracketable' and funcion much equivalnt to list (even including 'autogrowing' them).
//This is actually more logical too.
//So '[' notation in props file can be used for either list or arrays (at leats in recent versions of boot).
return isArray(type) || isList(type);
//So '[' notation in props file can be used for either list or arrays (at least in recent versions of boot).
//Note also 'Set' are now considered bracketable. See: https://www.pivotaltracker.com/story/show/154644992
return isArray(type) || isCollection(List.class, type) || isCollection(Set.class, type);
}
public static boolean isList(Type type) {
@SuppressWarnings("rawtypes")
private static boolean isCollection( Class<? extends Collection> klass, Type type) {
//Note: to be really correct we should use JDT infrastructure to resolve
//type in project classpath instead of using Java reflection.
//However, use reflection here is okay assuming types we care about
@@ -432,7 +445,7 @@ public class TypeUtil {
String erasure = type.getErasure();
try {
Class<?> erasureClass = Class.forName(erasure);
return List.class.isAssignableFrom(erasureClass);
return klass.isAssignableFrom(erasureClass);
} catch (Exception e) {
//type not resolveable assume its not 'array like'
}
@@ -444,10 +457,10 @@ public class TypeUtil {
* Check if type can be treated / represented as a sequence node in .yml file
*/
public static boolean isSequencable(Type type) {
return isList(type) || isArray(type);
return isBracketable(type);
}
public static boolean isArray(Type type) {
private static boolean isArray(Type type) {
return type!=null && type.getErasure().endsWith("[]");
}
@@ -518,12 +531,10 @@ public class TypeUtil {
public boolean isAssignableType(Type type) {
return ASSIGNABLE_TYPES.contains(type.getErasure())
|| isEnum(type)
|| isAssignableList(type);
|| isAssignableCollection(type);
}
private boolean isAssignableList(Type type) {
//TODO: isBracketable means 'isList' right now, but this may not be
// the case in the future.
private boolean isAssignableCollection(Type type) {
if (isBracketable(type)) {
Type domainType = getDomainType(type);
return isAtomic(domainType);

View File

@@ -39,7 +39,6 @@ import org.springframework.ide.vscode.boot.properties.reconcile.PropertyNavigato
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.completion.LazyProposalApplier;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.CollectionUtil;
@@ -47,6 +46,7 @@ import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.FuzzyMap.Match;
import org.springframework.ide.vscode.commons.util.FuzzyMatcher;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser;
import org.springframework.ide.vscode.java.properties.parser.ParseResults;

View File

@@ -30,10 +30,10 @@ import org.springframework.ide.vscode.boot.metadata.types.Type;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.IRegion;
import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser;
@@ -103,7 +103,7 @@ class PropertiesHoverCalculator {
String valueString = valueRegion.toString();
String propertyName = value.getParent().getKey().decode();
Type type = getValueType(index, typeUtil, propertyName);
if (TypeUtil.isArray(type) || TypeUtil.isList(type)) {
if (TypeUtil.isSequencable(type)) {
//It is useful to provide content assist for the values in the list when entering a list
type = TypeUtil.getDomainType(type);
}

View File

@@ -1,63 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016-2017 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.boot.properties.reconcile;
import java.util.Arrays;
import java.util.regex.Pattern;
import org.springframework.ide.vscode.boot.metadata.types.Type;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
/**
* Helper class to reconcile text contained in a document region as a comma-separated list.
*
* @author Kris De Volder
*/
public class DelimitedListReconciler {
interface TypeBasedReconciler {
void reconcile(DocumentRegion region, Type expectType, IProblemCollector problems);
}
private final TypeBasedReconciler valueReconciler;
private final Pattern delimiter;
public DelimitedListReconciler(Pattern delimiter, TypeBasedReconciler valueReconciler) {
this.valueReconciler = valueReconciler;
this.delimiter = delimiter;
}
public void reconcile(DocumentRegion region, Type listType, IProblemCollector problems) {
Type elType = getElementType(listType);
//Its pointless to reconcile list of we can't determine value type.
if (elType!=null) {
Arrays.stream(region.split(delimiter)).forEach(entry -> {
valueReconciler.reconcile(entry, elType, problems);
});
}
}
private Type getElementType(Type listType) {
Type elType = TypeUtil.getDomainType(listType);
if (elType!=null) {
Type nestedElType = getElementType(elType);
if (nestedElType!=null) {
return nestedElType;
}
return elType;
}
return null;
}
}

View File

@@ -18,7 +18,7 @@ import java.util.HashMap;
import java.util.Map;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.java.properties.parser.PropertiesFileEscapes;
/**

View File

@@ -23,10 +23,10 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.BeanPropertyN
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.ValueParser;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
/**

View File

@@ -27,11 +27,13 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeUtil;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtilProvider;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.ValueParseException;
import org.springframework.ide.vscode.commons.util.ValueParser;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser;
import org.springframework.ide.vscode.java.properties.parser.ParseResults;
@@ -64,7 +66,6 @@ public class SpringPropertiesReconcileEngine implements IReconcileEngine {
private SpringPropertyIndexProvider fIndexProvider;
private TypeUtilProvider typeUtilProvider;
private final DelimitedListReconciler commaListReconciler = new DelimitedListReconciler(COMMA, this::reconcileType);
private Parser parser = new AntlrParser();
public SpringPropertiesReconcileEngine(SpringPropertyIndexProvider provider, TypeUtilProvider typeUtilProvider) {
@@ -171,23 +172,26 @@ public class SpringPropertiesReconcileEngine implements IReconcileEngine {
return new DocumentRegion(doc, value.getOffset(), value.getOffset() + length);
}
private void reconcileType(DocumentRegion region, Type expectType, IProblemCollector problems) {
TypeUtil typeUtil = typeUtilProvider.getTypeUtil(region.getDocument());
private void reconcileType(DocumentRegion escapedValue, Type expectType, IProblemCollector problems) {
TypeUtil typeUtil = typeUtilProvider.getTypeUtil(escapedValue.getDocument());
ValueParser parser = typeUtil.getValueParser(expectType);
if (parser!=null) {
try {
String valueStr = PropertiesFileEscapes.unescape(region.toString());
String valueStr = PropertiesFileEscapes.unescape(escapedValue.toString());
if (!valueStr.contains("${")) {
//Don't check strings that look like they use variable substitution.
parser.parse(valueStr);
}
} catch (ValueParseException e) {
problems.accept(problem(ApplicationPropertiesProblemType.PROP_VALUE_TYPE_MISMATCH,
ExceptionUtil.getMessage(e),
e.getHighlightRegion(escapedValue)));
} catch (Exception e) {
problems.accept(problem(ApplicationPropertiesProblemType.PROP_VALUE_TYPE_MISMATCH,
"Expecting '"+typeUtil.niceTypeName(expectType)+"'",
region));
escapedValue));
}
} else if (TypeUtil.isList(expectType)||TypeUtil.isArray(expectType)) {
commaListReconciler.reconcile(region, expectType, problems);
}
}

View File

@@ -15,7 +15,7 @@ import org.springframework.ide.vscode.boot.metadata.PropertyInfo;
//import org.springframework.ide.vscode.commons.languageserver.quickfix.ProblemFixer;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemType;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
// TODO: Move to a common project shared between YAML and Properties

View File

@@ -41,10 +41,10 @@ import org.springframework.ide.vscode.commons.languageserver.completion.Document
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.completion.LazyProposalApplier;
import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.CollectionUtil;
import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.FuzzyMap.Match;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.FuzzyMatcher;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.Renderable;

View File

@@ -31,8 +31,12 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.BeanPropertyN
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode;
import org.springframework.ide.vscode.boot.metadata.types.TypedProperty;
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.ValueParseException;
import org.springframework.ide.vscode.commons.util.ValueParser;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.yaml.ast.NodeRef;
import org.springframework.ide.vscode.commons.yaml.ast.NodeRef.Kind;
import org.springframework.ide.vscode.commons.yaml.ast.NodeRef.TupleValueRef;
@@ -66,21 +70,21 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
reconcile(ast, nav);
}
protected void reconcile(YamlFileAST ast, IndexNavigator nav) {
List<Node> nodes = ast.getNodes();
protected void reconcile(YamlFileAST root, IndexNavigator nav) {
List<Node> nodes = root.getNodes();
if (nodes!=null && !nodes.isEmpty()) {
for (Node node : nodes) {
reconcile(node, nav);
reconcile(root, node, nav);
}
}
}
protected void reconcile(Node node, IndexNavigator nav) {
protected void reconcile(YamlFileAST root, Node node, IndexNavigator nav) {
switch (node.getNodeId()) {
case mapping:
checkForDuplicateKeys((MappingNode)node);
for (NodeTuple entry : ((MappingNode)node).getValue()) {
reconcile(entry, nav);
reconcile(root, entry, nav);
}
break;
case scalar:
@@ -121,7 +125,7 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
return propName!=null && propName.equals("spring.profiles");
}
private void reconcile(NodeTuple entry, IndexNavigator nav) {
private void reconcile(YamlFileAST root, NodeTuple entry, IndexNavigator nav) {
Node keyNode = entry.getKeyNode();
String key = asScalar(keyNode);
if (key==null) {
@@ -153,12 +157,12 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
if (match.isDeprecated()) {
deprecatedProperty(match, keyNode);
}
reconcile(entry.getValueNode(), type);
reconcile(root, entry.getValueNode(), type);
} else if (extension!=null) {
//We don't really care about the extension only about the fact that it
// exists and so it is meaningful to continue checking...
Node valueNode = entry.getValueNode();
reconcile(valueNode, subNav);
reconcile(root, valueNode, subNav);
} else {
//both are null, this means there's no valid property with the current prefix
//whether exact or extending it with further navigation
@@ -170,17 +174,17 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
/**
* Reconcile a node given the type that we expect the node to be.
*/
private void reconcile(Node node, Type type) {
private void reconcile(YamlFileAST root, Node node, Type type) {
if (type!=null) {
switch (node.getNodeId()) {
case scalar:
reconcile((ScalarNode)node, type);
reconcile(root, (ScalarNode)node, type);
break;
case sequence:
reconcile((SequenceNode)node, type);
reconcile(root, (SequenceNode)node, type);
break;
case mapping:
reconcile((MappingNode)node, type);
reconcile(root, (MappingNode)node, type);
break;
case anchor:
//TODO: what should we do with anchor nodes
@@ -191,7 +195,7 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
}
}
private void reconcile(MappingNode mapping, Type type) {
private void reconcile(YamlFileAST root, MappingNode mapping, Type type) {
checkForDuplicateKeys(mapping);
if (typeUtil.isAtomic(type)) {
expectTypeFoundMapping(type, mapping);
@@ -200,7 +204,7 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
Type valueType = TypeUtil.getDomainType(type);
if (keyType!=null) {
for (NodeTuple entry : mapping.getValue()) {
reconcile(entry.getKeyNode(), keyType);
reconcile(root, entry.getKeyNode(), keyType);
}
}
if (valueType!=null) {
@@ -217,7 +221,7 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
nestedValueType = type;
}
}
reconcile(entry.getValueNode(), nestedValueType);
reconcile(root, entry.getValueNode(), nestedValueType);
}
}
} else {
@@ -239,7 +243,7 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
if (typedProperty.isDeprecated()) {
deprecatedProperty(type, typedProperty, keyNode);
}
reconcile(valNode, typedProperty.getType());
reconcile(root, valNode, typedProperty.getType());
}
}
}
@@ -248,14 +252,14 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
}
}
private void reconcile(SequenceNode seq, Type type) {
private void reconcile(YamlFileAST root, SequenceNode seq, Type type) {
if (typeUtil.isAtomic(type)) {
expectTypeFoundSequence(type, seq);
} else if (TypeUtil.isSequencable(type)) {
Type domainType = TypeUtil.getDomainType(type);
if (domainType!=null) {
for (Node element : seq.getValue()) {
reconcile(element, domainType);
reconcile(root, element, domainType);
}
}
} else {
@@ -264,7 +268,7 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
}
private void reconcile(ScalarNode scalar, Type type) {
private void reconcile(YamlFileAST root, ScalarNode scalar, Type type) {
String stringValue = scalar.getValue();
if (!hasPlaceHolder(stringValue)) { //don't check anything with placeholder expressions in it
ValueParser valueParser = typeUtil.getValueParser(type);
@@ -274,6 +278,8 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
// expected type
try {
valueParser.parse(stringValue);
} catch (ValueParseException e) {
valueParseError(root, scalar, e);
} catch (Exception e) {
//Couldn't parse
valueTypeMismatch(type, scalar);
@@ -300,6 +306,12 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
expectType(ApplicationYamlProblemType.YAML_VALUE_TYPE_MISMATCH, type, scalar);
}
private void valueParseError(YamlFileAST root, ScalarNode scalar, ValueParseException e) {
IDocument doc = root.getDocument();
DocumentRegion containingRegion = new DocumentRegion(doc, scalar.getStartMark().getIndex(), scalar.getEndMark().getIndex());
problems.accept(problem(ApplicationYamlProblemType.YAML_VALUE_TYPE_MISMATCH, e.getHighlightRegion(containingRegion), ExceptionUtil.getMessage(e)));
}
private void unkownProperty(Node node, String name, NodeTuple entry) {
SpringPropertyProblem p = problem(ApplicationYamlProblemType.YAML_UNKNOWN_PROPERTY, node, "Unknown property '"+name+"'");
p.setPropertyName(extendForQuickfix(StringUtil.camelCaseToHyphens(name), entry.getValueNode()));
@@ -378,6 +390,10 @@ public class ApplicationYamlASTReconciler implements YamlASTReconciler {
return SpringPropertyProblem.problem(type, msg, start, end-start);
}
private SpringPropertyProblem problem(ApplicationYamlProblemType type, DocumentRegion region, String msg) {
return SpringPropertyProblem.problem(type, msg, region.getStart(), region.getLength());
}
private String describe(Node node) {
switch (node.getNodeId()) {
case scalar:

View File

@@ -0,0 +1,69 @@
/*******************************************************************************
* Copyright (c) 2018 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.boot.java.data.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.eclipse.lsp4j.SymbolInformation;
import org.junit.Before;
import org.junit.Test;
import org.springframework.ide.vscode.project.harness.BootJavaLanguageServerHarness;
import org.springframework.ide.vscode.project.harness.ProjectsHarness;
/**
* @author Martin Lippert
*/
public class DataRepositorySymbolProviderTest {
private BootJavaLanguageServerHarness harness;
@Before
public void setup() throws Exception {
harness = BootJavaLanguageServerHarness.builder().build();
}
@Test
public void testSimpleReppositorySymbol() throws Exception {
harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-spring-data-symbols/").toURI()));
File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-spring-data-symbols/").toURI());
String docUri = directory.toPath().resolve("src/main/java/org/test/CustomerRepository.java").toUri().toString();
List<? extends SymbolInformation> symbols = getSymbols(docUri);
assertEquals(1, symbols.size());
assertTrue(containsSymbol(symbols, "@+ 'customerRepository' (Customer) Repository<Customer,Long>", docUri, 6, 17, 6, 35));
}
private boolean containsSymbol(List<? extends SymbolInformation> symbols, String name, String uri, int startLine, int startCHaracter, int endLine, int endCharacter) {
for (Iterator<? extends SymbolInformation> iterator = symbols.iterator(); iterator.hasNext();) {
SymbolInformation symbol = iterator.next();
if (symbol.getName().equals(name)
&& symbol.getLocation().getUri().equals(uri)
&& symbol.getLocation().getRange().getStart().getLine() == startLine
&& symbol.getLocation().getRange().getStart().getCharacter() == startCHaracter
&& symbol.getLocation().getRange().getEnd().getLine() == endLine
&& symbol.getLocation().getRange().getEnd().getCharacter() == endCharacter) {
return true;
}
}
return false;
}
private List<? extends SymbolInformation> getSymbols(String docUri) {
return harness.getServerWrapper().getComponents().getSpringIndexer().getSymbols(docUri);
}
}

View File

@@ -23,7 +23,7 @@ import org.springframework.ide.vscode.project.harness.BootJavaLanguageServerHarn
import org.springframework.ide.vscode.project.harness.MockRunningAppProvider;
import org.springframework.ide.vscode.project.harness.ProjectsHarness;
public class FunctionInjectionsHoverProviderTest {
public class BeansByTypeHoverProviderTest {
private BootJavaLanguageServerHarness harness;
private ProjectsHarness projects = ProjectsHarness.INSTANCE;
@@ -45,7 +45,53 @@ public class FunctionInjectionsHoverProviderTest {
}
@Test
public void typeButNotAFunction() throws Exception {
public void typeButNotABean() throws Exception {
LiveBeansModel beans = LiveBeansModel.builder()
.add(LiveBean.builder()
.id("scannedRandomClass")
.type("com.example.ScannedRandomClass")
.build()
)
.add(LiveBean.builder()
.id("randomOtherBean")
.type("randomOtherBeanType")
.dependencies("scannedRandomClass")
.build()
)
.add(LiveBean.builder()
.id("irrelevantBean")
.type("com.example.IrrelevantBean")
.dependencies("myController")
.build()
)
.build();
mockAppProvider.builder()
.isSpringBootApp(true)
.processId("111")
.processName("the-app")
.beans(beans)
.build();
Editor editor = harness.newEditor(LanguageId.JAVA,
"package com.example;\n" +
"\n" +
"import java.io.Serializable;\n" +
"\n" +
"public class ClassNoBean implements Serializable {\n" +
"\n" +
" public String apply(String t) {\n" +
" return t.toUpperCase();\n" +
" }\n" +
"\n" +
"}\n" +
""
);
editor.assertHighlights();
editor.assertNoHover("ClassNoBean");
}
@Test
public void typeWithGeneralBean() throws Exception {
LiveBeansModel beans = LiveBeansModel.builder()
.add(LiveBean.builder()
.id("scannedRandomClass")
@@ -86,8 +132,17 @@ public class FunctionInjectionsHoverProviderTest {
"}\n" +
""
);
editor.assertHighlights();
editor.assertNoHover("ScannedRandomClass");
editor.assertHighlights("ScannedRandomClass");
editor.assertTrimmedHover("ScannedRandomClass",
"**Injection report for Bean [id: scannedRandomClass, type: `com.example.ScannedRandomClass`]**\n" +
"\n" +
"Process [PID=111, name=`the-app`]:\n" +
"\n" +
"Bean [id: scannedRandomClass, type: `com.example.ScannedRandomClass`] injected into:\n" +
"\n" +
"- Bean: randomOtherBean \n" +
" Type: `randomOtherBeanType`"
);
}
@Test
@@ -145,4 +200,46 @@ public class FunctionInjectionsHoverProviderTest {
" Type: `org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration`"
);
}
@Test
public void generalBeanLiveHoverAvoidOverlapWithAnnotation() throws Exception {
LiveBeansModel beans = LiveBeansModel.builder()
.add(LiveBean.builder()
.id("fooImplementation")
.type("com.example.FooImplementation")
.build()
)
.build();
mockAppProvider.builder()
.isSpringBootApp(true)
.processId("111")
.processName("the-app")
.beans(beans)
.build();
Editor editor = harness.newEditor(LanguageId.JAVA,
"package com.example;\n" +
"\n" +
"import org.springframework.stereotype.Component;\n" +
"\n" +
"@Component\n" +
"public class FooImplementation implements Foo {\n" +
"\n" +
" @Override\n" +
" public void doSomeFoo() {\n" +
" System.out.println(\"Foo do do do!\");\n" +
" }\n" +
"}\n"
);
editor.assertHighlights("@Component");
editor.assertTrimmedHover("@Component",
"**Injection report for Bean [id: fooImplementation, type: `com.example.FooImplementation`]**\n" +
"\n" +
"Process [PID=111, name=`the-app`]:\n" +
"\n" +
"Bean [id: fooImplementation, type: `com.example.FooImplementation`] exists but is **Not injected anywhere**\n"
);
}
}

View File

@@ -1180,7 +1180,7 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
"test-map.test-list-object.color-list[2]=GREEN\n"
);
editor.assertProblems(
"not-a-color|Expecting 'com.wellsfargo.lendingplatform.web.config.Color"
"not-a-color|com.wellsfargo.lendingplatform.web.config.Color"
);
editor = newEditor(
@@ -1402,21 +1402,37 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
}
@Test public void testCommaListReconcile() throws Exception {
doCommaCollectionReconcileTest("java.util.List");
}
@Test public void testCommaSetReconcile() throws Exception {
doCommaCollectionReconcileTest("java.util.Set");
}
private void doCommaCollectionReconcileTest(String collectionType) throws Exception {
Editor editor;
IJavaProject p = createPredefinedMavenProject("enums-boot-1.3.2-app");
useProject(p);
assertNotNull(p.getClasspath().findType("demo.Color"));
data("my.colors", "java.util.List<demo.Color>", null, "Ooh! nice colors!");
data("my.colors", collectionType+"<demo.Color>", null, "Ooh! nice colors!");
// editor = newEditor(
// "#comment\n" +
// "my.colors=RED, green, not-a-color , BLUE"
// );
// editor.assertProblems(
// "not-a-color|demo.Color"
// );
editor = newEditor(
"#comment\n" +
"my.colors=RED, green, not-a-color , BLUE"
);
editor.assertProblems(
"not-a-color|demo.Color"
);
editor = newEditor(
"my.colors=\\\n" +
" red , \\\n" +
" green,\\\n" +
" bad\n"
);
editor.assertProblems( "bad|demo.Color");
editor = newEditor(
"my.colors=\\\n" +
@@ -1442,14 +1458,6 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
);
editor.assertProblems( "bad|demo.Color");
editor = newEditor(
"my.colors=\\\n" +
" red , \\\n" +
" green,\\\n" +
" bad\n"
);
editor.assertProblems( "bad|demo.Color");
editor = newEditor(
"my.colors=\\\n" +
" red , \\\n" +
@@ -1589,6 +1597,28 @@ public class ApplicationPropertiesEditorTest extends AbstractPropsEditorTest {
editor.assertHoverExactText("debug", "**debug** \n[java.lang.String](null)");
}
@Test public void testSetOfEnumsCompletions() throws Exception {
useProject(createPredefinedMavenProject("enums-boot-1.3.2-app"));
data("my.color-set", "java.util.Set<demo.Color>", null, "Set of colors that can be used.");
assertCompletions("my.colos<*>",
"my.color-set=<*>"
);
assertCompletions("my.color-set=<*>",
"my.color-set=blue<*>",
"my.color-set=green<*>",
"my.color-set=red<*>"
);
assertCompletions("my.color-set=B<*>",
"my.color-set=BLUE<*>"
);
assertCompletions("my.color-set=red,B<*>",
"my.color-set=red,BLUE<*>"
);
}
////////////// harness code below /////////////////////////
@Override
protected SimpleLanguageServer newLanguageServer() {
ComposableLanguageServer<?> server = BootLanguageServer.create(

View File

@@ -17,6 +17,7 @@ import static org.springframework.ide.vscode.languageserver.testharness.Editor.I
import java.time.Duration;
import org.eclipse.core.resources.IProject;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.Diagnostic;
import org.junit.Ignore;
@@ -29,11 +30,11 @@ import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider;
import org.springframework.ide.vscode.boot.java.utils.SpringLiveHoverWatchdog;
import org.springframework.ide.vscode.boot.metadata.CachingValueProvider;
import org.springframework.ide.vscode.boot.metadata.PropertyInfo;
import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.composable.ComposableLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.languageserver.testharness.Editor;
@@ -715,19 +716,9 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest {
);
editor.assertProblems(
"bad: BLUE|Expecting a 'demo.Color",
"Bogus|Expecting a 'demo.Color"
"bad: BLUE|demo.Color",
"Bogus|demo.Color"
);
/*
* TODO: if enums are not sorted by the 3rd party java indexing lib then
* perform the commented out test rather than the above
*/
// editor.assertProblems(
// "bad: BLUE|Expecting a 'demo.Color[RED, GREEN, BLUE]' but got a 'Mapping' node",
// "Bogus|Expecting a 'demo.Color[RED, GREEN, BLUE]' but got 'Bogus'"
// );
}
@Test public void testReconcileSkipIfNoMetadata() throws Exception {
@@ -3459,7 +3450,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest {
" - GREEN\n"
);
editor.assertProblems(
"not-a-color|Expecting a 'com.wellsfargo.lendingplatform.web.config.Color"
"not-a-color|com.wellsfargo.lendingplatform.web.config.Color"
);
editor = newEditor(
@@ -3690,6 +3681,69 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest {
editor.assertProblems("bogus|Unknown property");
}
@Test public void testSetOfEnumReconcile() throws Exception {
String collectionType = "java.util.Set";
doCollectionOfEnumReconcileTest(collectionType);
}
@Test public void testListOfEnumReconcile() throws Exception {
String collectionType = "java.util.List";
doCollectionOfEnumReconcileTest(collectionType);
}
private void doCollectionOfEnumReconcileTest(String collectionType) throws Exception {
useProject(createPredefinedMavenProject("enums-boot-1.3.2-app"));
data("my.colors", collectionType + "<demo.Color>", null, "Ooh! nice colors!");
Editor editor;
//comma-separated string
editor = newEditor(
"my:\n" +
" colors: red,green,BLUE,not-a-color\n"
);
editor.assertProblems("not-a-color|demo.Color");
//comma-separated string
editor = newEditor(
"my:\n" +
" colors: red, green, not-a-color, BLUE\n"
);
editor.assertProblems("not-a-color|demo.Color");
//flow list
editor = newEditor(
"my:\n" +
" colors: [red, green, BLUE, not-a-color]"
);
editor.assertProblems("not-a-color|demo.Color");
//block list
editor = newEditor(
"my:\n" +
" colors:\n" +
" - red\n" +
" - green\n" +
" - BLUE\n" +
" - not-a-color\n"
);
editor.assertProblems("not-a-color|demo.Color");
}
@Test public void testSetOfEnumCompletions() throws Exception {
useProject(createPredefinedMavenProject("enums-boot-1.3.2-app"));
data("my.colors", "java.util.Set<demo.Color>", null, "Ooh! nice colors!");
Editor editor = newEditor(
"my:\n" +
" colors:\n" +
" - <*>"
);
editor.assertContextualCompletions("<*>", "blue<*>", "green<*>", "red<*>");
editor.assertContextualCompletions("b<*>", "blue<*>");
editor.assertContextualCompletions("B<*>", "BLUE<*>");
}
///////////////// cruft ////////////////////////////////////////////////////////
private void generateNestedProperties(int levels, String[] names, String prefix) {

View File

@@ -0,0 +1,233 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
#
# Look for the Apple JDKs first to preserve the existing behaviour, and then look
# for the new JDKs provided by Oracle.
#
if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then
#
# Apple JDKs
#
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
fi
if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then
#
# Apple JDKs
#
export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
fi
if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then
#
# Oracle JDKs
#
export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home
fi
if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then
#
# Apple JDKs
#
export JAVA_HOME=`/usr/libexec/java_home`
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Migwn, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
# TODO classpath?
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
local basedir=$(pwd)
local wdir=$(pwd)
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
wdir=$(cd "$wdir/.."; pwd)
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} "$@"

View File

@@ -0,0 +1,145 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
set MAVEN_CMD_LINE_ARGS=%*
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar""
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS%
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>test-spring-data-symbols</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,55 @@
package org.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a couple of customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// fetch an individual customer by ID
Customer customer = repository.findOne(1L);
log.info("Customer found with findOne(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
for (Customer bauer : repository.findByLastName("Bauer")) {
log.info(bauer.toString());
}
log.info("");
};
}
}

View File

@@ -0,0 +1,46 @@
// tag::sample[]
package org.test;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
protected Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
// end::sample[]
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}

View File

@@ -0,0 +1,10 @@
package org.test;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
}

View File

@@ -10,8 +10,8 @@
*******************************************************************************/
package org.springframework.ide.vscode.commons.languageserver.completion;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.IRegion;

View File

@@ -11,8 +11,8 @@
package org.springframework.ide.vscode.commons.languageserver.completion;
import org.eclipse.lsp4j.CompletionItemKind;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
public class SimpleCompletionFactory {

View File

@@ -15,7 +15,7 @@ import java.util.ArrayList;
import java.util.List;
import org.springframework.ide.vscode.commons.languageserver.quickfix.Quickfix.QuickfixData;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
/**
* An implementation of {@link ReconcileProblem} that is just a simple data object.

View File

@@ -11,6 +11,7 @@
package org.springframework.ide.vscode.commons.languageserver.util;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
public abstract class PrefixFinder {

View File

@@ -78,12 +78,12 @@ public class ExceptionUtil {
// The message of nested exception is usually more interesting than the
// one on top.
Throwable cause = getDeepestCause(e);
if (cause != null) {
String msg = getSimpleError(cause) + ": " + cause.getMessage();
String errorType = cause.getClass().getSimpleName();
String msg = cause.getMessage();
if (ValueParseException.class.isInstance(cause) && msg!=null) {
return msg;
} else {
return "An error occurred: " + getSimpleError(e);
}
return errorType + ": " + msg;
}
public static String getMessageNoAppendedInformation(Throwable e) {

View File

@@ -1,15 +1,17 @@
/*******************************************************************************
* Copyright (c) 2017 Pivotal, Inc.
* Copyright (c) 2017, 2018 Spring IDE Developers
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.commons.util;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
/**
* Exception if there is a failure when parsing a value. It does not wrap
* other exceptions such that when thrown, the parse exception is the "deepest"
@@ -20,16 +22,22 @@ public class ValueParseException extends Exception {
private int startIndex = -1;
private int endIndex = -1;
private String highightString;
/**
*
*
*/
private static final long serialVersionUID = 1L;
public ValueParseException(String message) {
super(message);
}
public ValueParseException(String message, int startIndex, int endIndex, String highlightString) {
this(message, startIndex, endIndex);
this.highightString = highlightString;
}
public ValueParseException(String message, int startIndex, int endIndex) {
this(message);
this.startIndex = startIndex;
@@ -44,4 +52,42 @@ public class ValueParseException extends Exception {
return endIndex;
}
public DocumentRegion getHighlightRegion(DocumentRegion containingRegion) {
int start = startIndex>=0 ? startIndex : 0;
int end = endIndex>=0 ? endIndex : containingRegion.length();
if (highightString!=null) {
//Make a 'best effort' adjusting start and end to highlight the correct string,
// even if positions are screwy because of handling escape sequences before parsing.
String actualHighlight = containingRegion.subSequence(start, end).toString();
if (!actualHighlight.equals(highightString)) {
String containingString = containingRegion.toString();
//Search 'close' to start position first
int found = containingString.indexOf(highightString, start);
if (found>=0) {
return containingRegion.subSequence(found, found+highightString.length());
}
//Second... search whole string
found = containingString.indexOf(highightString);
if (found>=0) {
return containingRegion.subSequence(found, found+highightString.length());
}
//Give up, couldn't find the highlight string... highlight everything
return containingRegion;
}
}
return containingRegion.subSequence(start, end);
}
public void adjustHighlight(int start, int end, String piece) {
if (this.highightString==null || this.highightString.length()>piece.length()) {
this.highightString = piece;
}
if (this.startIndex>=0) {
this.startIndex += start;
} else {
this.startIndex = start;
}
this.endIndex = this.startIndex+this.highightString.length();
}
}

View File

@@ -24,7 +24,7 @@ public class ValueParsers {
throw new ValueParseException("String should not be empty");
}
};
public static final ValueParser POS_INTEGER = integerRange(0, null);
public static ValueParser integerAtLeast(final Integer lowerBound) {

View File

@@ -9,7 +9,7 @@
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.commons.languageserver.util;
package org.springframework.ide.vscode.commons.util.text;
import java.util.ArrayList;
import java.util.List;
@@ -19,9 +19,6 @@ import java.util.regex.Pattern;
import org.eclipse.lsp4j.Range;
import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.IRegion;
import org.springframework.ide.vscode.commons.util.text.Region;
/**
* A non-sucky alternative to {@link IRegion}. Represents a region of text in a document.

View File

@@ -9,11 +9,10 @@
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.vscode.commons.languageserver.util;
package org.springframework.ide.vscode.commons.util.text;
import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.IDocument;
public class DocumentUtil {

View File

@@ -14,7 +14,7 @@ package org.springframework.ide.vscode.commons.yaml.ast;
import java.util.Collections;
import java.util.Set;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;

View File

@@ -10,9 +10,9 @@
*******************************************************************************/
package org.springframework.ide.vscode.commons.yaml.completion;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.yaml.path.YamlPath;
import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument;
import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SDocNode;

View File

@@ -14,8 +14,8 @@ import java.util.Collection;
import java.util.Collections;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment;
import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument;
import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SNode;

View File

@@ -26,7 +26,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.CollectionUtil;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
import org.springframework.ide.vscode.commons.util.FuzzyMatcher;
@@ -34,6 +33,7 @@ import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.PartialCollection;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.ValueParseException;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.yaml.completion.DefaultCompletionFactory.ValueProposal;
import org.springframework.ide.vscode.commons.yaml.hover.YPropertyInfoTemplates;
import org.springframework.ide.vscode.commons.yaml.path.YamlPath;

View File

@@ -13,8 +13,8 @@ package org.springframework.ide.vscode.commons.yaml.completion;
import java.util.Collection;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.yaml.path.YamlNavigable;
import org.springframework.ide.vscode.commons.yaml.path.YamlPathSegment;
import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument;

View File

@@ -26,10 +26,10 @@ import org.springframework.ide.vscode.commons.languageserver.completion.Document
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.Unicodes;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import org.springframework.ide.vscode.commons.yaml.path.YamlPath;

View File

@@ -13,9 +13,9 @@ package org.springframework.ide.vscode.commons.yaml.hover;
import java.util.List;
import org.springframework.ide.vscode.commons.languageserver.hover.HoverInfoProvider;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.IRegion;
import org.springframework.ide.vscode.commons.util.text.Region;

View File

@@ -11,8 +11,8 @@
package org.springframework.ide.vscode.commons.yaml.reconcile;
import org.eclipse.lsp4j.TextEdit;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
public class ReplaceStringData {

View File

@@ -30,7 +30,6 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.ProblemTy
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileException;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblemImpl;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReplacementQuickfix;
import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.CollectorUtil;
import org.springframework.ide.vscode.commons.util.ExceptionUtil;
@@ -39,6 +38,7 @@ import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.ValueParseException;
import org.springframework.ide.vscode.commons.util.ValueParser;
import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil;
import org.springframework.ide.vscode.commons.yaml.ast.YamlFileAST;

Some files were not shown because too many files have changed in this diff Show More