From 8d7e5d9724349aa430bbaa4925d8067c7473156b Mon Sep 17 00:00:00 2001 From: Sven Efftinge Date: Fri, 3 Jun 2016 08:44:44 +0200 Subject: [PATCH] [lsp] added IMimeTypeProvider, only highlight keywords starting with a letter, support non-incrmental updates --- ...torHighlightingConfigurationProvider.xtend | 2 +- .../eclipse/xtext/ide/server/Document.xtend | 10 +++++-- .../xtext/ide/server/LanguageServerImpl.xtend | 3 ++ .../xtext/resource/IMimeTypeProvider.xtend | 28 +++++++++++++++++++ .../xtext/ide/tests/server/DocumentTest.xtend | 21 +++++++++++--- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/IMimeTypeProvider.xtend diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/IEditorHighlightingConfigurationProvider.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/IEditorHighlightingConfigurationProvider.xtend index 7d8ff8bd4..0872ef011 100644 --- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/IEditorHighlightingConfigurationProvider.xtend +++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/IEditorHighlightingConfigurationProvider.xtend @@ -65,7 +65,7 @@ interface IEditorHighlightingConfigurationProvider { def Iterable getKeywords() { GrammarUtil.containedKeywords(grammarAccess.grammar).filter [ - Character.isJavaIdentifierStart(it.value.charAt(0)) + Character.isLetter(it.value.charAt(0)) ].map[value].toSet.sort } diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/Document.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/Document.xtend index e2d7f00ef..6a7d4a396 100644 --- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/Document.xtend +++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/Document.xtend @@ -45,9 +45,13 @@ import org.eclipse.xtend.lib.annotations.Data def Document applyChanges(Iterable changes) { var newContent = contents for (change : changes) { - val start = getOffSet(change.range.start) - val end = getOffSet(change.range.end) - newContent = newContent.substring(0, start) + change.newText + newContent.substring(end) + if (change.range === null) { + newContent = change.newText + } else { + val start = getOffSet(change.range.start) + val end = getOffSet(change.range.end) + newContent = newContent.substring(0, start) + change.newText + newContent.substring(end) + } } return new Document(version + 1, newContent) } diff --git a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/LanguageServerImpl.xtend b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/LanguageServerImpl.xtend index 50787ab57..732e67dbd 100644 --- a/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/LanguageServerImpl.xtend +++ b/plugins/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/LanguageServerImpl.xtend @@ -71,6 +71,7 @@ import org.eclipse.xtext.resource.IResourceServiceProvider import org.eclipse.xtext.validation.Issue import static io.typefox.lsapi.util.LsapiFactories.* +import org.eclipse.xtext.resource.IMimeTypeProvider /** * @@ -117,11 +118,13 @@ import static io.typefox.lsapi.util.LsapiFactories.* result.supportedLanguages = newArrayList() for (serviceProvider : languagesRegistry.extensionToFactoryMap.values.filter(IResourceServiceProvider).toSet) { val extensionProvider = serviceProvider.get(FileExtensionProvider) + val mimeTypesProvider = serviceProvider.get(IMimeTypeProvider) val langInfo = serviceProvider.get(LanguageInfo) val highlightingProvider = serviceProvider.get(IEditorHighlightingConfigurationProvider) val language = new LanguageDescriptionImpl => [ fileExtensions = extensionProvider.fileExtensions.toList languageId = langInfo.languageName + mimeTypes = mimeTypesProvider.mimeTypes if (highlightingProvider !== null) highlightingConfiguration = highlightingProvider.getConfiguration(params.clientName) ] diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/IMimeTypeProvider.xtend b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/IMimeTypeProvider.xtend new file mode 100644 index 000000000..f396708eb --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/IMimeTypeProvider.xtend @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. + * 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 + *******************************************************************************/ +package org.eclipse.xtext.resource + +import com.google.inject.ImplementedBy +import java.util.List + +/** + * @author Sven Efftinge - Initial contribution and API + */ +@ImplementedBy(DefaultImpl) +interface IMimeTypeProvider { + + def List getMimeTypes() + + static class DefaultImpl implements IMimeTypeProvider { + + override getMimeTypes() { + #[] + } + + } +} \ No newline at end of file diff --git a/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/DocumentTest.xtend b/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/DocumentTest.xtend index 7a2292163..93ff1e8ee 100644 --- a/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/DocumentTest.xtend +++ b/tests/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/server/DocumentTest.xtend @@ -96,12 +96,25 @@ class DocumentTest { ] } + @Test def void testUpdate_nonIncrementalChange() { + new Document(1, ''' + hello world + foo + bar''') => [ + assertEquals(' foo ', applyChanges(#[ + change(null, null, " foo ") + ]).contents) + ] + } + private def change(PositionImpl startPos, PositionImpl endPos, String newText) { new TextEditImpl => [ - range = new RangeImpl => [ - start = startPos - end = endPos - ] + if (startPos !== null) { + range = new RangeImpl => [ + start = startPos + end = endPos + ] + } it.newText = newText ] }