diff --git a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.java b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.java new file mode 100644 index 000000000..708ff5501 --- /dev/null +++ b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.java @@ -0,0 +1,121 @@ +/** + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.tests.util; + +import java.util.List; + +import org.eclipse.lsp4j.DocumentHighlight; +import org.eclipse.lsp4j.DocumentHighlightKind; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.Range; +import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageIdeInjectorProvider; +import org.eclipse.xtext.ide.util.DocumentHighlightComparator; +import org.eclipse.xtext.testing.InjectWith; +import org.eclipse.xtext.testing.XtextRunner; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.google.common.collect.Lists; +import com.google.inject.Inject; + +/** + * Test for the null-safe {@link DocumentHighlightComparator}. + * + *

+ * This test focuses on the {@link DocumentHighlightKind} and the null-safety. + * Other orderings are checked via the {@link RangeComparatorTest}. + * + * @author akos.kitta - Initial contribution and API + */ +@RunWith(XtextRunner.class) +@InjectWith(TestLanguageIdeInjectorProvider.class) +public class DocumentHighlightComparatorTest extends Assert { + @Inject + private DocumentHighlightComparator comparator; + + @Test + public void withoutNull() { + List input = sort( + Lists.newArrayList(newHighlight(DocumentHighlightKind.Text, newRange(2, 2, 2, 2)), + newHighlight(DocumentHighlightKind.Text, newRange(1, 1, 1, 1)), + newHighlight(DocumentHighlightKind.Write, newRange(2, 2, 2, 2)), + newHighlight(DocumentHighlightKind.Write, newRange(1, 1, 1, 1)), + newHighlight(DocumentHighlightKind.Read, newRange(2, 2, 2, 2)), + newHighlight(DocumentHighlightKind.Read, newRange(1, 1, 1, 1)))); + assertEquals(1, input.get(0).getRange().getStart().getLine()); + assertEquals(1, input.get(0).getRange().getStart().getCharacter()); + assertEquals(1, input.get(0).getRange().getEnd().getLine()); + assertEquals(1, input.get(0).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Text, input.get(0).getKind()); + assertEquals(1, input.get(1).getRange().getStart().getLine()); + assertEquals(1, input.get(1).getRange().getStart().getCharacter()); + assertEquals(1, input.get(1).getRange().getEnd().getLine()); + assertEquals(1, input.get(1).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Read, input.get(1).getKind()); + assertEquals(1, input.get(2).getRange().getStart().getLine()); + assertEquals(1, input.get(2).getRange().getStart().getCharacter()); + assertEquals(1, input.get(2).getRange().getEnd().getLine()); + assertEquals(1, input.get(2).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Write, input.get(2).getKind()); + assertEquals(2, input.get(3).getRange().getStart().getLine()); + assertEquals(2, input.get(3).getRange().getStart().getCharacter()); + assertEquals(2, input.get(3).getRange().getEnd().getLine()); + assertEquals(2, input.get(3).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Text, input.get(3).getKind()); + assertEquals(2, input.get(4).getRange().getStart().getLine()); + assertEquals(2, input.get(4).getRange().getStart().getCharacter()); + assertEquals(2, input.get(4).getRange().getEnd().getLine()); + assertEquals(2, input.get(4).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Read, input.get(4).getKind()); + assertEquals(2, input.get(5).getRange().getStart().getLine()); + assertEquals(2, input.get(5).getRange().getStart().getCharacter()); + assertEquals(2, input.get(5).getRange().getEnd().getLine()); + assertEquals(2, input.get(5).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Write, input.get(5).getKind()); + } + + @Test + public void withNull() { + List input = sort( + Lists.newArrayList(null, newHighlight(DocumentHighlightKind.Text, newRange(1, 1, 1, 1)), + newHighlight(DocumentHighlightKind.Write, newRange(1, 1, 1, 1)), + newHighlight(DocumentHighlightKind.Read, newRange(1, 1, 1, 1)))); + assertEquals(1, input.get(0).getRange().getStart().getLine()); + assertEquals(1, input.get(0).getRange().getStart().getCharacter()); + assertEquals(1, input.get(0).getRange().getEnd().getLine()); + assertEquals(1, input.get(0).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Text, input.get(0).getKind()); + assertEquals(1, input.get(1).getRange().getStart().getLine()); + assertEquals(1, input.get(1).getRange().getStart().getCharacter()); + assertEquals(1, input.get(1).getRange().getEnd().getLine()); + assertEquals(1, input.get(1).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Read, input.get(1).getKind()); + assertEquals(1, input.get(2).getRange().getStart().getLine()); + assertEquals(1, input.get(2).getRange().getStart().getCharacter()); + assertEquals(1, input.get(2).getRange().getEnd().getLine()); + assertEquals(1, input.get(2).getRange().getEnd().getCharacter()); + assertEquals(DocumentHighlightKind.Write, input.get(2).getKind()); + assertNull(IterableExtensions.last(input)); + } + + private DocumentHighlight newHighlight(DocumentHighlightKind kind, Range range) { + return new DocumentHighlight(range, kind); + } + + private Range newRange(int startLine, int startChar, int endLine, int endChar) { + return new Range(new Position(startLine, startChar), new Position(endLine, endChar)); + } + + private List sort(List toSort) { + toSort.sort(comparator); + return toSort; + } +} diff --git a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.xtend b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.xtend deleted file mode 100644 index 9dbea398e..000000000 --- a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.xtend +++ /dev/null @@ -1,125 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.tests.util - -import com.google.inject.Inject -import java.util.List -import org.eclipse.lsp4j.DocumentHighlight -import org.eclipse.lsp4j.DocumentHighlightKind -import org.eclipse.lsp4j.Position -import org.eclipse.lsp4j.Range -import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageIdeInjectorProvider -import org.eclipse.xtext.ide.util.DocumentHighlightComparator -import org.eclipse.xtext.testing.InjectWith -import org.eclipse.xtext.testing.XtextRunner -import org.junit.Assert -import org.junit.Test -import org.junit.runner.RunWith - -import static org.eclipse.lsp4j.DocumentHighlightKind.* - -/** - * Test for the null-safe {@link DocumentHighlightComparator}. - * - *

- * This test focuses on the {@link DocumentHighlightKind} and the null-safety - * other orderings are checked via the {@link RangeComparatorTest}. - * - * @author akos.kitta - Initial contribution and API - */ -@RunWith(XtextRunner) -@InjectWith(TestLanguageIdeInjectorProvider) -class DocumentHighlightComparatorTest extends Assert { - - @Inject - DocumentHighlightComparator comparator; - - @Test - def void withoutNull() { - val input = newArrayList(Text.newHighlight(newRange(2, 2, 2, 2)), Text.newHighlight(newRange(1, 1, 1, 1)), - Write.newHighlight(newRange(2, 2, 2, 2)), Write.newHighlight(newRange(1, 1, 1, 1)), - Read.newHighlight(newRange(2, 2, 2, 2)), Read.newHighlight(newRange(1, 1, 1, 1))).sort; - - assertEquals(1, input.get(0).range.start.line); - assertEquals(1, input.get(0).range.start.character); - assertEquals(1, input.get(0).range.end.line); - assertEquals(1, input.get(0).range.end.character); - assertEquals(Text, input.get(0).kind); - - assertEquals(1, input.get(1).range.start.line); - assertEquals(1, input.get(1).range.start.character); - assertEquals(1, input.get(1).range.end.line); - assertEquals(1, input.get(1).range.end.character); - assertEquals(Read, input.get(1).kind); - - assertEquals(1, input.get(2).range.start.line); - assertEquals(1, input.get(2).range.start.character); - assertEquals(1, input.get(2).range.end.line); - assertEquals(1, input.get(2).range.end.character); - assertEquals(Write, input.get(2).kind); - - assertEquals(2, input.get(3).range.start.line); - assertEquals(2, input.get(3).range.start.character); - assertEquals(2, input.get(3).range.end.line); - assertEquals(2, input.get(3).range.end.character); - assertEquals(Text, input.get(3).kind); - - assertEquals(2, input.get(4).range.start.line); - assertEquals(2, input.get(4).range.start.character); - assertEquals(2, input.get(4).range.end.line); - assertEquals(2, input.get(4).range.end.character); - assertEquals(Read, input.get(4).kind); - - assertEquals(2, input.get(5).range.start.line); - assertEquals(2, input.get(5).range.start.character); - assertEquals(2, input.get(5).range.end.line); - assertEquals(2, input.get(5).range.end.character); - assertEquals(Write, input.get(5).kind); - } - - @Test - def void withNull() { - val input = newArrayList(null, Text.newHighlight(newRange(1, 1, 1, 1)), - Write.newHighlight(newRange(1, 1, 1, 1)), Read.newHighlight(newRange(1, 1, 1, 1))).sort; - - assertEquals(1, input.get(0).range.start.line); - assertEquals(1, input.get(0).range.start.character); - assertEquals(1, input.get(0).range.end.line); - assertEquals(1, input.get(0).range.end.character); - assertEquals(Text, input.get(0).kind); - - assertEquals(1, input.get(1).range.start.line); - assertEquals(1, input.get(1).range.start.character); - assertEquals(1, input.get(1).range.end.line); - assertEquals(1, input.get(1).range.end.character); - assertEquals(Read, input.get(1).kind); - - assertEquals(1, input.get(2).range.start.line); - assertEquals(1, input.get(2).range.start.character); - assertEquals(1, input.get(2).range.end.line); - assertEquals(1, input.get(2).range.end.character); - assertEquals(Write, input.get(2).kind); - - assertNull(input.last); - } - - private def newHighlight(DocumentHighlightKind kind, Range range) { - new DocumentHighlight(range, kind); - } - - private def newRange(int startLine, int startChar, int endLine, int endChar) { - return new Range(new Position(startLine, startChar), new Position(endLine, endChar)); - } - - private def sort(List toSort) { - toSort.sort(comparator); - return toSort; - } - -} diff --git a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.java b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.java new file mode 100644 index 000000000..f60b95633 --- /dev/null +++ b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.tests.util; + +import com.google.common.collect.Lists; +import com.google.inject.Inject; +import java.util.List; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.Range; +import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageIdeInjectorProvider; +import org.eclipse.xtext.ide.util.RangeComparator; +import org.eclipse.xtext.testing.InjectWith; +import org.eclipse.xtext.testing.XtextRunner; +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Test for the null-safe {@link RangeComparator}. + * + * @author akos.kitta - Initial contribution and API + */ +@RunWith(XtextRunner.class) +@InjectWith(TestLanguageIdeInjectorProvider.class) +public class RangeComparatorTest extends Assert { + @Inject + private RangeComparator comparator; + + @Test + public void withoutNull() { + List input = sort(Lists.newArrayList(newRange(1, 2, 1, 2), newRange(1, 1, 2, 1), + newRange(1, 1, 1, 2), newRange(1, 1, 1, 1), newRange(2, 2, 2, 3))); + assertEquals(1, input.get(0).getStart().getLine()); + assertEquals(1, input.get(0).getStart().getCharacter()); + assertEquals(1, input.get(0).getEnd().getLine()); + assertEquals(1, input.get(0).getEnd().getCharacter()); + assertEquals(1, input.get(1).getStart().getLine()); + assertEquals(1, input.get(1).getStart().getCharacter()); + assertEquals(1, input.get(1).getEnd().getLine()); + assertEquals(2, input.get(1).getEnd().getCharacter()); + assertEquals(1, input.get(2).getStart().getLine()); + assertEquals(1, input.get(2).getStart().getCharacter()); + assertEquals(2, input.get(2).getEnd().getLine()); + assertEquals(1, input.get(2).getEnd().getCharacter()); + assertEquals(1, input.get(3).getStart().getLine()); + assertEquals(2, input.get(3).getStart().getCharacter()); + assertEquals(1, input.get(3).getEnd().getLine()); + assertEquals(2, input.get(3).getEnd().getCharacter()); + assertEquals(2, input.get(4).getStart().getLine()); + assertEquals(2, input.get(4).getStart().getCharacter()); + assertEquals(2, input.get(4).getEnd().getLine()); + assertEquals(3, input.get(4).getEnd().getCharacter()); + } + + @Test + public void withNull() { + List input = sort(Lists.newArrayList(newRange(2, 2, 2, 3), null, newRange(1, 1, 1, 1))); + assertEquals(1, input.get(0).getStart().getLine()); + assertEquals(1, input.get(0).getStart().getCharacter()); + assertEquals(1, input.get(0).getEnd().getLine()); + assertEquals(1, input.get(0).getEnd().getCharacter()); + assertEquals(2, input.get(1).getStart().getLine()); + assertEquals(2, input.get(1).getStart().getCharacter()); + assertEquals(2, input.get(1).getEnd().getLine()); + assertEquals(3, input.get(1).getEnd().getCharacter()); + assertNull(IterableExtensions.last(input)); + } + + private Range newRange(int startLine, int startChar, int endLine, int endChar) { + return new Range(new Position(startLine, startChar), new Position(endLine, endChar)); + } + + private List sort(List toSort) { + toSort.sort(comparator); + return toSort; + } +} diff --git a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.xtend b/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.xtend deleted file mode 100644 index 0a264e397..000000000 --- a/org.eclipse.xtext.ide.tests/src/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.xtend +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.tests.util - -import com.google.inject.Inject -import java.util.List -import org.eclipse.lsp4j.Position -import org.eclipse.lsp4j.Range -import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageIdeInjectorProvider -import org.eclipse.xtext.ide.util.RangeComparator -import org.eclipse.xtext.testing.InjectWith -import org.eclipse.xtext.testing.XtextRunner -import org.junit.Assert -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Test for the null-safe {@link RangeComparator}. - * - * @author akos.kitta - Initial contribution and API - */ -@RunWith(XtextRunner) -@InjectWith(TestLanguageIdeInjectorProvider) -class RangeComparatorTest extends Assert { - - @Inject - RangeComparator comparator; - - @Test - def void withoutNull() { - val input = newArrayList(newRange(1, 2, 1, 2), newRange(1, 1, 2, 1), newRange(1, 1, 1, 2), newRange(1, 1, 1, 1), - newRange(2, 2, 2, 3)).sort; - - assertEquals(1, input.get(0).start.line); - assertEquals(1, input.get(0).start.character); - assertEquals(1, input.get(0).end.line); - assertEquals(1, input.get(0).end.character); - - assertEquals(1, input.get(1).start.line); - assertEquals(1, input.get(1).start.character); - assertEquals(1, input.get(1).end.line); - assertEquals(2, input.get(1).end.character); - - assertEquals(1, input.get(2).start.line); - assertEquals(1, input.get(2).start.character); - assertEquals(2, input.get(2).end.line); - assertEquals(1, input.get(2).end.character); - - assertEquals(1, input.get(3).start.line); - assertEquals(2, input.get(3).start.character); - assertEquals(1, input.get(3).end.line); - assertEquals(2, input.get(3).end.character); - - assertEquals(2, input.get(4).start.line); - assertEquals(2, input.get(4).start.character); - assertEquals(2, input.get(4).end.line); - assertEquals(3, input.get(4).end.character); - } - - @Test - def void withNull() { - val input = newArrayList(newRange(2, 2, 2, 3), null, newRange(1, 1, 1, 1)).sort; - - assertEquals(1, input.get(0).start.line); - assertEquals(1, input.get(0).start.character); - assertEquals(1, input.get(0).end.line); - assertEquals(1, input.get(0).end.character); - - assertEquals(2, input.get(1).start.line); - assertEquals(2, input.get(1).start.character); - assertEquals(2, input.get(1).end.line); - assertEquals(3, input.get(1).end.character); - - assertNull(input.last); - } - - private def newRange(int startLine, int startChar, int endLine, int endChar) { - return new Range(new Position(startLine, startChar), new Position(endLine, endChar)); - } - - private def sort(List toSort) { - toSort.sort(comparator); - return toSort; - } - -} diff --git a/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.java b/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.java deleted file mode 100644 index b92ccdfd8..000000000 --- a/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/util/DocumentHighlightComparatorTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.tests.util; - -import com.google.inject.Inject; -import java.util.List; -import org.eclipse.lsp4j.DocumentHighlight; -import org.eclipse.lsp4j.DocumentHighlightKind; -import org.eclipse.lsp4j.Position; -import org.eclipse.lsp4j.Range; -import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageIdeInjectorProvider; -import org.eclipse.xtext.ide.util.DocumentHighlightComparator; -import org.eclipse.xtext.testing.InjectWith; -import org.eclipse.xtext.testing.XtextRunner; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Test for the null-safe {@link DocumentHighlightComparator}. - * - *

- * This test focuses on the {@link DocumentHighlightKind} and the null-safety - * other orderings are checked via the {@link RangeComparatorTest}. - * - * @author akos.kitta - Initial contribution and API - */ -@RunWith(XtextRunner.class) -@InjectWith(TestLanguageIdeInjectorProvider.class) -@SuppressWarnings("all") -public class DocumentHighlightComparatorTest extends Assert { - @Inject - private DocumentHighlightComparator comparator; - - @Test - public void withoutNull() { - final List input = this.sort(CollectionLiterals.newArrayList(this.newHighlight(DocumentHighlightKind.Text, this.newRange(2, 2, 2, 2)), this.newHighlight(DocumentHighlightKind.Text, this.newRange(1, 1, 1, 1)), - this.newHighlight(DocumentHighlightKind.Write, this.newRange(2, 2, 2, 2)), this.newHighlight(DocumentHighlightKind.Write, this.newRange(1, 1, 1, 1)), - this.newHighlight(DocumentHighlightKind.Read, this.newRange(2, 2, 2, 2)), this.newHighlight(DocumentHighlightKind.Read, this.newRange(1, 1, 1, 1)))); - Assert.assertEquals(1, input.get(0).getRange().getStart().getLine()); - Assert.assertEquals(1, input.get(0).getRange().getStart().getCharacter()); - Assert.assertEquals(1, input.get(0).getRange().getEnd().getLine()); - Assert.assertEquals(1, input.get(0).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Text, input.get(0).getKind()); - Assert.assertEquals(1, input.get(1).getRange().getStart().getLine()); - Assert.assertEquals(1, input.get(1).getRange().getStart().getCharacter()); - Assert.assertEquals(1, input.get(1).getRange().getEnd().getLine()); - Assert.assertEquals(1, input.get(1).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Read, input.get(1).getKind()); - Assert.assertEquals(1, input.get(2).getRange().getStart().getLine()); - Assert.assertEquals(1, input.get(2).getRange().getStart().getCharacter()); - Assert.assertEquals(1, input.get(2).getRange().getEnd().getLine()); - Assert.assertEquals(1, input.get(2).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Write, input.get(2).getKind()); - Assert.assertEquals(2, input.get(3).getRange().getStart().getLine()); - Assert.assertEquals(2, input.get(3).getRange().getStart().getCharacter()); - Assert.assertEquals(2, input.get(3).getRange().getEnd().getLine()); - Assert.assertEquals(2, input.get(3).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Text, input.get(3).getKind()); - Assert.assertEquals(2, input.get(4).getRange().getStart().getLine()); - Assert.assertEquals(2, input.get(4).getRange().getStart().getCharacter()); - Assert.assertEquals(2, input.get(4).getRange().getEnd().getLine()); - Assert.assertEquals(2, input.get(4).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Read, input.get(4).getKind()); - Assert.assertEquals(2, input.get(5).getRange().getStart().getLine()); - Assert.assertEquals(2, input.get(5).getRange().getStart().getCharacter()); - Assert.assertEquals(2, input.get(5).getRange().getEnd().getLine()); - Assert.assertEquals(2, input.get(5).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Write, input.get(5).getKind()); - } - - @Test - public void withNull() { - final List input = this.sort(CollectionLiterals.newArrayList(null, this.newHighlight(DocumentHighlightKind.Text, this.newRange(1, 1, 1, 1)), - this.newHighlight(DocumentHighlightKind.Write, this.newRange(1, 1, 1, 1)), this.newHighlight(DocumentHighlightKind.Read, this.newRange(1, 1, 1, 1)))); - Assert.assertEquals(1, input.get(0).getRange().getStart().getLine()); - Assert.assertEquals(1, input.get(0).getRange().getStart().getCharacter()); - Assert.assertEquals(1, input.get(0).getRange().getEnd().getLine()); - Assert.assertEquals(1, input.get(0).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Text, input.get(0).getKind()); - Assert.assertEquals(1, input.get(1).getRange().getStart().getLine()); - Assert.assertEquals(1, input.get(1).getRange().getStart().getCharacter()); - Assert.assertEquals(1, input.get(1).getRange().getEnd().getLine()); - Assert.assertEquals(1, input.get(1).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Read, input.get(1).getKind()); - Assert.assertEquals(1, input.get(2).getRange().getStart().getLine()); - Assert.assertEquals(1, input.get(2).getRange().getStart().getCharacter()); - Assert.assertEquals(1, input.get(2).getRange().getEnd().getLine()); - Assert.assertEquals(1, input.get(2).getRange().getEnd().getCharacter()); - Assert.assertEquals(DocumentHighlightKind.Write, input.get(2).getKind()); - Assert.assertNull(IterableExtensions.last(input)); - } - - private DocumentHighlight newHighlight(final DocumentHighlightKind kind, final Range range) { - return new DocumentHighlight(range, kind); - } - - private Range newRange(final int startLine, final int startChar, final int endLine, final int endChar) { - Position _position = new Position(startLine, startChar); - Position _position_1 = new Position(endLine, endChar); - return new Range(_position, _position_1); - } - - private List sort(final List toSort) { - toSort.sort(this.comparator); - return toSort; - } -} diff --git a/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.java b/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.java deleted file mode 100644 index 77076d8be..000000000 --- a/org.eclipse.xtext.ide.tests/xtend-gen/org/eclipse/xtext/ide/tests/util/RangeComparatorTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.tests.util; - -import com.google.inject.Inject; -import java.util.List; -import org.eclipse.lsp4j.Position; -import org.eclipse.lsp4j.Range; -import org.eclipse.xtext.ide.tests.testlanguage.TestLanguageIdeInjectorProvider; -import org.eclipse.xtext.ide.util.RangeComparator; -import org.eclipse.xtext.testing.InjectWith; -import org.eclipse.xtext.testing.XtextRunner; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Test for the null-safe {@link RangeComparator}. - * - * @author akos.kitta - Initial contribution and API - */ -@RunWith(XtextRunner.class) -@InjectWith(TestLanguageIdeInjectorProvider.class) -@SuppressWarnings("all") -public class RangeComparatorTest extends Assert { - @Inject - private RangeComparator comparator; - - @Test - public void withoutNull() { - final List input = this.sort(CollectionLiterals.newArrayList(this.newRange(1, 2, 1, 2), this.newRange(1, 1, 2, 1), this.newRange(1, 1, 1, 2), this.newRange(1, 1, 1, 1), - this.newRange(2, 2, 2, 3))); - Assert.assertEquals(1, input.get(0).getStart().getLine()); - Assert.assertEquals(1, input.get(0).getStart().getCharacter()); - Assert.assertEquals(1, input.get(0).getEnd().getLine()); - Assert.assertEquals(1, input.get(0).getEnd().getCharacter()); - Assert.assertEquals(1, input.get(1).getStart().getLine()); - Assert.assertEquals(1, input.get(1).getStart().getCharacter()); - Assert.assertEquals(1, input.get(1).getEnd().getLine()); - Assert.assertEquals(2, input.get(1).getEnd().getCharacter()); - Assert.assertEquals(1, input.get(2).getStart().getLine()); - Assert.assertEquals(1, input.get(2).getStart().getCharacter()); - Assert.assertEquals(2, input.get(2).getEnd().getLine()); - Assert.assertEquals(1, input.get(2).getEnd().getCharacter()); - Assert.assertEquals(1, input.get(3).getStart().getLine()); - Assert.assertEquals(2, input.get(3).getStart().getCharacter()); - Assert.assertEquals(1, input.get(3).getEnd().getLine()); - Assert.assertEquals(2, input.get(3).getEnd().getCharacter()); - Assert.assertEquals(2, input.get(4).getStart().getLine()); - Assert.assertEquals(2, input.get(4).getStart().getCharacter()); - Assert.assertEquals(2, input.get(4).getEnd().getLine()); - Assert.assertEquals(3, input.get(4).getEnd().getCharacter()); - } - - @Test - public void withNull() { - final List input = this.sort(CollectionLiterals.newArrayList(this.newRange(2, 2, 2, 3), null, this.newRange(1, 1, 1, 1))); - Assert.assertEquals(1, input.get(0).getStart().getLine()); - Assert.assertEquals(1, input.get(0).getStart().getCharacter()); - Assert.assertEquals(1, input.get(0).getEnd().getLine()); - Assert.assertEquals(1, input.get(0).getEnd().getCharacter()); - Assert.assertEquals(2, input.get(1).getStart().getLine()); - Assert.assertEquals(2, input.get(1).getStart().getCharacter()); - Assert.assertEquals(2, input.get(1).getEnd().getLine()); - Assert.assertEquals(3, input.get(1).getEnd().getCharacter()); - Assert.assertNull(IterableExtensions.last(input)); - } - - private Range newRange(final int startLine, final int startChar, final int endLine, final int endChar) { - Position _position = new Position(startLine, startChar); - Position _position_1 = new Position(endLine, endChar); - return new Range(_position, _position_1); - } - - private List sort(final List toSort) { - toSort.sort(this.comparator); - return toSort; - } -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.java new file mode 100644 index 000000000..227faf005 --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.java @@ -0,0 +1,289 @@ +/** + * Copyright (c) 2015, 2020 itemis AG (http://www.itemis.eu) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.editor.contentassist; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.xtext.util.ReplaceRegion; +import org.eclipse.xtext.util.TextRegion; +import org.eclipse.xtext.xbase.lib.util.ToStringBuilder; + +/** + * @noreference + */ +public class ContentAssistEntry { + + public static final String KIND_TEXT = "TEXT"; + + public static final String KIND_METHOD = "METHOD"; + + public static final String KIND_FUNCTION = "FUNCTION"; + + public static final String KIND_CONSTRUCTOR = "CONSTRUCTOR"; + + public static final String KIND_FIELD = "FIELD"; + + public static final String KIND_VARIABLE = "VARIABLE"; + + public static final String KIND_CLASS = "CLASS"; + + public static final String KIND_INTERFACE = "INTERFACE"; + + public static final String KIND_MODULE = "MODULE"; + + public static final String KIND_PROPERTY = "PROPERTY"; + + public static final String KIND_UNIT = "UNIT"; + + public static final String KIND_VALUE = "VALUE"; + + public static final String KIND_ENUM = "ENUM"; + + public static final String KIND_KEYWORD = "KEYWORD"; + + public static final String KIND_SNIPPET = "SNIPPET"; + + public static final String KIND_COLOR = "COLOR"; + + public static final String KIND_FILE = "FILE"; + + public static final String KIND_REFERENCE = "REFERENCE"; + + public static final String KIND_UNKNOWN = "UNKNOWN"; + + /** + * The prefix that should be replaced with this proposal. + */ + private String prefix; + + /** + * The proposed text to be inserted. + */ + private String proposal; + + /** + * The text seen by the user in the list of proposals. + */ + private String label; + + /** + * Additional description to include in the list of proposals. + *

+ * This property may not be supported by all editor frameworks. + *

+ */ + private String description; + + /** + * Documentation for the proposal proposals. + *

+ * This property may not be supported by all editor frameworks. + *

+ */ + private String documentation; + + /** + * The absolute cursor position to apply after the proposal has been inserted. If omitted, the cursor it set to the + * end of the inserted proposal. + *

+ * This property may not be supported by all editor frameworks. + *

+ */ + private Integer escapePosition; + + /** + * Additional text replacements to apply when this proposal is selected. + *

+ * This property may not be supported by all editor frameworks. + *

+ */ + private final List textReplacements = new ArrayList(); + + /** + * Regions to be edited by the user after the proposal has been inserted. Usually the tab key navigates + * through the edit positions, and enter jumps to the {@code escapePosition}. + *

+ * This property may not be supported by all editor frameworks. + *

+ */ + private final List editPositions = new ArrayList(); + + /** + * The EObject or IEObjectDescription for which this entry has been created, if any. This field is not + * serialized when the entry is sent over a communication channel. + */ + private transient Object source; + + /** + * The kind of element that is proposed. Could be one of the constants below or something specific a concrete client + * understands. Must not be null. + */ + private String kind = ContentAssistEntry.KIND_UNKNOWN; + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + public String getProposal() { + return proposal; + } + + public void setProposal(String proposal) { + this.proposal = proposal; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDocumentation() { + return documentation; + } + + public void setDocumentation(String documentation) { + this.documentation = documentation; + } + + public Integer getEscapePosition() { + return escapePosition; + } + + public void setEscapePosition(Integer escapePosition) { + this.escapePosition = escapePosition; + } + + public List getTextReplacements() { + return textReplacements; + } + + public List getEditPositions() { + return editPositions; + } + + public Object getSource() { + return source; + } + + public void setSource(Object source) { + this.source = source; + } + + public String getKind() { + return kind; + } + + public void setKind(String kind) { + this.kind = kind; + } + + @Override + public String toString() { + ToStringBuilder b = new ToStringBuilder(this); + b.skipNulls(); + b.add("prefix", this.prefix); + b.add("proposal", this.proposal); + b.add("label", this.label); + b.add("description", this.description); + b.add("documentation", this.documentation); + b.add("escapePosition", this.escapePosition); + b.add("textReplacements", this.textReplacements); + b.add("editPositions", this.editPositions); + b.add("kind", this.kind); + return b.toString(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ContentAssistEntry other = (ContentAssistEntry) obj; + if (this.prefix == null) { + if (other.prefix != null) + return false; + } else if (!this.prefix.equals(other.prefix)) + return false; + if (this.proposal == null) { + if (other.proposal != null) + return false; + } else if (!this.proposal.equals(other.proposal)) + return false; + if (this.label == null) { + if (other.label != null) + return false; + } else if (!this.label.equals(other.label)) + return false; + if (this.description == null) { + if (other.description != null) + return false; + } else if (!this.description.equals(other.description)) + return false; + if (this.documentation == null) { + if (other.documentation != null) + return false; + } else if (!this.documentation.equals(other.documentation)) + return false; + if (this.escapePosition == null) { + if (other.escapePosition != null) + return false; + } else if (!this.escapePosition.equals(other.escapePosition)) + return false; + if (this.textReplacements == null) { + if (other.textReplacements != null) + return false; + } else if (!this.textReplacements.equals(other.textReplacements)) + return false; + if (this.editPositions == null) { + if (other.editPositions != null) + return false; + } else if (!this.editPositions.equals(other.editPositions)) + return false; + if (this.kind == null) { + if (other.kind != null) + return false; + } else if (!this.kind.equals(other.kind)) + return false; + return true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((this.prefix == null) ? 0 : this.prefix.hashCode()); + result = prime * result + ((this.proposal == null) ? 0 : this.proposal.hashCode()); + result = prime * result + ((this.label == null) ? 0 : this.label.hashCode()); + result = prime * result + ((this.description == null) ? 0 : this.description.hashCode()); + result = prime * result + ((this.documentation == null) ? 0 : this.documentation.hashCode()); + result = prime * result + ((this.escapePosition == null) ? 0 : this.escapePosition.hashCode()); + result = prime * result + ((this.textReplacements == null) ? 0 : this.textReplacements.hashCode()); + result = prime * result + ((this.editPositions == null) ? 0 : this.editPositions.hashCode()); + return prime * result + ((this.kind == null) ? 0 : this.kind.hashCode()); + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend deleted file mode 100644 index 143709909..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.xtend +++ /dev/null @@ -1,106 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015, 2016 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.contentassist - -import java.util.ArrayList -import org.eclipse.xtend.lib.annotations.Accessors -import org.eclipse.xtend.lib.annotations.EqualsHashCode -import org.eclipse.xtend.lib.annotations.ToString -import org.eclipse.xtext.util.ReplaceRegion -import org.eclipse.xtext.util.TextRegion - -/** - * @noreference - */ -@Accessors -@ToString(skipNulls = true) -@EqualsHashCode -class ContentAssistEntry { - - /** - * The prefix that should be replaced with this proposal. - */ - String prefix - - /** - * The proposed text to be inserted. - */ - String proposal - - /** - * The text seen by the user in the list of proposals. - */ - String label - - /** - * Additional description to include in the list of proposals. - *

This property may not be supported by all editor frameworks.

- */ - String description - - /** - * Documentation for the proposal proposals. - *

This property may not be supported by all editor frameworks.

- */ - String documentation - - /** - * The absolute cursor position to apply after the proposal has been inserted. - * If omitted, the cursor it set to the end of the inserted proposal. - *

This property may not be supported by all editor frameworks.

- */ - Integer escapePosition - - /** - * Additional text replacements to apply when this proposal is selected. - *

This property may not be supported by all editor frameworks.

- */ - val textReplacements = new ArrayList - - /** - * Regions to be edited by the user after the proposal has been inserted. - * Usually the tab key navigates through the edit positions, and enter - * jumps to the {@code escapePosition}. - *

This property may not be supported by all editor frameworks.

- */ - val editPositions = new ArrayList - - /** - * The EObject or IEObjectDescription for which this entry has been created, if any. - * This field is not serialized when the entry is sent over a communication channel. - */ - transient Object source - - /** - * The kind of element that is proposed. Could be one of the constants below or something specific a concrete client understands. - * Must not be null. - */ - String kind = KIND_UNKNOWN - - public static val KIND_TEXT = "TEXT" - public static val KIND_METHOD = "METHOD" - public static val KIND_FUNCTION = "FUNCTION" - public static val KIND_CONSTRUCTOR = "CONSTRUCTOR" - public static val KIND_FIELD = "FIELD" - public static val KIND_VARIABLE = "VARIABLE" - public static val KIND_CLASS = "CLASS" - public static val KIND_INTERFACE = "INTERFACE" - public static val KIND_MODULE = "MODULE" - public static val KIND_PROPERTY = "PROPERTY" - public static val KIND_UNIT = "UNIT" - public static val KIND_VALUE = "VALUE" - public static val KIND_ENUM = "ENUM" - public static val KIND_KEYWORD = "KEYWORD" - public static val KIND_SNIPPET = "SNIPPET" - public static val KIND_COLOR = "COLOR" - public static val KIND_FILE = "FILE" - public static val KIND_REFERENCE = "REFERENCE" - public static val KIND_UNKNOWN = "UNKNOWN" - -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.java new file mode 100644 index 000000000..ec8f5d05d --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.xtext.ide.editor.contentassist; + +import java.util.Comparator; +import java.util.Set; +import java.util.TreeSet; + +import org.eclipse.xtext.xbase.lib.Pair; + +import com.google.common.collect.Iterables; + +/** + * @author Sven Efftinge - Initial contribution and API + * + * @since 2.11 + */ +public class IdeContentProposalAcceptor + implements IIdeContentProposalAcceptor, Comparator> { + + protected final Set> entries = new TreeSet>( + this); + + @Override + public void accept(ContentAssistEntry entry, int priority) { + if (entry != null) { + if (entry.getProposal() == null) + throw new IllegalArgumentException("Proposal must not be null."); + entries.add(Pair.of(priority, entry)); + } + } + + @Override + public boolean canAcceptMoreProposals() { + return entries.size() < 100; + } + + @Override + public int compare(Pair p1, Pair p2) { + int prioResult = p2.getKey().compareTo(p1.getKey()); + if (prioResult != 0) + return prioResult; + String s1 = p1.getValue().getLabel() != null ? p1.getValue().getLabel() : p1.getValue().getProposal(); + String s2 = p2.getValue().getLabel() != null ? p2.getValue().getLabel() : p2.getValue().getProposal(); + int ignoreCase = s1.compareToIgnoreCase(s2); + if (ignoreCase == 0) { + return s1.compareTo(s2); + } + return ignoreCase; + } + + public Iterable getEntries() { + return Iterables.transform(entries, e -> e.getValue()); + } + +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.xtend deleted file mode 100644 index 58c368ced..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.xtend +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.contentassist - -import java.util.Comparator -import java.util.TreeSet - -/** - * @author Sven Efftinge - Initial contribution and API - * - * @since 2.11 - */ -class IdeContentProposalAcceptor implements IIdeContentProposalAcceptor, Comparator> { - - protected val entries = new TreeSet>(this) - - override accept(ContentAssistEntry entry, int priority) { - if (entry !== null) { - if (entry.proposal === null) - throw new IllegalArgumentException('proposal must not be null.') - entries.add(priority -> entry) - } - } - - override canAcceptMoreProposals() { - entries.size < 100 - } - - override compare(Pair p1, Pair p2) { - val prioResult = p2.key.compareTo(p1.key) - if (prioResult != 0) - return prioResult - val s1 = p1.value.label ?: p1.value.proposal - val s2 = p2.value.label ?: p2.value.proposal - val ignoreCase = s1.compareToIgnoreCase(s2) - if (ignoreCase === 0) { - return s1.compareTo(s2) - } - return ignoreCase - } - - def Iterable getEntries() { - entries.map[value] - } - -} \ No newline at end of file diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.java new file mode 100644 index 000000000..e6cb10bea --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.java @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.editor.contentassist; + +import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; + +import com.google.common.base.Strings; +import com.google.inject.Inject; + +/** + * Factory for content assist entries. Whenever possible, you should use this creator instead of building entries + * directly, since prefix matching and conflict handling is done here. + * + * @since 2.10 + * @noreference + */ +public class IdeContentProposalCreator { + @Inject + private IPrefixMatcher prefixMatcher; + + @Inject + private IProposalConflictHelper conflictHelper; + + /** + * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. + */ + public ContentAssistEntry createProposal(String proposal, ContentAssistContext context) { + return createProposal(proposal, context.getPrefix(), context, ContentAssistEntry.KIND_UNKNOWN, null); + } + + /** + * Returns an entry of kind snippet with the given proposal and label and the prefix from the context, or null if + * the proposal is not valid. + * + * @since 2.16 + */ + public ContentAssistEntry createSnippet(String proposal, String label, ContentAssistContext context) { + return createProposal(proposal, context.getPrefix(), context, ContentAssistEntry.KIND_SNIPPET, + (it) -> it.setLabel(label)); + } + + /** + * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. + * If it is valid, the initializer function is applied to it. + */ + public ContentAssistEntry createProposal(String proposal, ContentAssistContext context, + Procedure1 init) { + return createProposal(proposal, context.getPrefix(), context, ContentAssistEntry.KIND_UNKNOWN, init); + } + + /** + * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. + * If it is valid, the initializer function is applied to it. + */ + public ContentAssistEntry createProposal(String proposal, ContentAssistContext context, String kind, + Procedure1 init) { + return createProposal(proposal, context.getPrefix(), context, kind, init); + } + + /** + * Returns an entry with the given proposal and prefix, or null if the proposal is not valid. If it is valid, the + * initializer function is applied to it. + */ + public ContentAssistEntry createProposal(String proposal, String prefix, ContentAssistContext context, String kind, + Procedure1 init) { + if (isValidProposal(proposal, prefix, context)) { + ContentAssistEntry result = new ContentAssistEntry(); + result.setProposal(proposal); + result.setPrefix(prefix); + if (kind != null) { + result.setKind(kind); + } + if (init != null) { + init.apply(result); + } + return result; + } + return null; + } + + public boolean isValidProposal(String proposal, String prefix, ContentAssistContext context) { + return !Strings.isNullOrEmpty(proposal) && prefixMatcher.isCandidateMatchingPrefix(proposal, prefix) + && !conflictHelper.existsConflict(proposal, context); + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.xtend deleted file mode 100644 index 2bb6aa307..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.xtend +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.contentassist - -import com.google.inject.Inject - -/** - * Factory for content assist entries. Whenever possible, you should use this creator instead of building entries - * directly, since prefix matching and conflict handling is done here. - * - * @since 2.10 - * @noreference - */ -class IdeContentProposalCreator { - - @Inject IPrefixMatcher prefixMatcher - - @Inject IProposalConflictHelper conflictHelper - - /** - * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. - */ - def ContentAssistEntry createProposal(String proposal, ContentAssistContext context) { - createProposal(proposal, context.prefix, context, ContentAssistEntry.KIND_UNKNOWN, null) - } - - /** - * Returns an entry of kind snippet with the given proposal and label and the prefix from the context, or null if the proposal is not valid. - * @since 2.16 - */ - def ContentAssistEntry createSnippet(String proposal, String label, ContentAssistContext context) { - createProposal(proposal, context.prefix, context, ContentAssistEntry.KIND_SNIPPET) [ - it.label = label - ] - } - - /** - * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. - * If it is valid, the initializer function is applied to it. - */ - def ContentAssistEntry createProposal(String proposal, ContentAssistContext context, (ContentAssistEntry)=>void init) { - createProposal(proposal, context.prefix, context, ContentAssistEntry.KIND_UNKNOWN, init) - } - - /** - * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. - * If it is valid, the initializer function is applied to it. - */ - def ContentAssistEntry createProposal(String proposal, ContentAssistContext context, String kind, (ContentAssistEntry)=>void init) { - createProposal(proposal, context.prefix, context, kind, init) - } - - /** - * Returns an entry with the given proposal and prefix, or null if the proposal is not valid. - * If it is valid, the initializer function is applied to it. - */ - def ContentAssistEntry createProposal(String proposal, String prefix, ContentAssistContext context, String kind, - (ContentAssistEntry)=>void init) { - if (isValidProposal(proposal, prefix, context)) { - val result = new ContentAssistEntry - result.proposal = proposal - result.prefix = prefix - if (kind !== null) - result.kind = kind - if (init !== null) - init.apply(result) - return result - } - } - - def boolean isValidProposal(String proposal, String prefix, ContentAssistContext context) { - !proposal.nullOrEmpty && prefixMatcher.isCandidateMatchingPrefix(proposal, prefix) - && !conflictHelper.existsConflict(proposal, context) - } - -} \ No newline at end of file diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.java new file mode 100644 index 000000000..4a323991e --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2015, 2020 itemis AG (http://www.itemis.eu) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.editor.contentassist; + +import org.eclipse.xtext.resource.IEObjectDescription; + +import com.google.common.base.Objects; +import com.google.inject.Singleton; + +/** + * Determines priorities for content assist proposal entries. The priorities can be used to sort the list of proposals. + * + * @noreference + */ +@Singleton +public class IdeContentProposalPriorities { + private int crossRefPriority = 500; + + private int defaultPriority = 400; + + private int keywordPriority = 300; + + protected int adjustPriority(ContentAssistEntry entry, int priority) { + if (entry == null) { + return priority; + } + int adjustedPriority = priority; + if (!Character.isLetter(entry.getProposal().charAt(0))) { + adjustedPriority = adjustedPriority - 30; + } + if (Objects.equal(entry.getProposal(), entry.getPrefix())) { + adjustedPriority = adjustedPriority - 20; + } + return adjustedPriority; + } + + public int getCrossRefPriority(IEObjectDescription objectDesc, ContentAssistEntry entry) { + return adjustPriority(entry, this.crossRefPriority); + } + + public int getDefaultPriority(ContentAssistEntry entry) { + return adjustPriority(entry, this.defaultPriority); + } + + public int getKeywordPriority(String keyword, ContentAssistEntry entry) { + return adjustPriority(entry, this.keywordPriority); + } + + protected int getCrossRefPriority() { + return crossRefPriority; + } + + protected void setCrossRefPriority(int crossRefPriority) { + this.crossRefPriority = crossRefPriority; + } + + protected int getDefaultPriority() { + return defaultPriority; + } + + protected void setDefaultPriority(int defaultPriority) { + this.defaultPriority = defaultPriority; + } + + protected int getKeywordPriority() { + return keywordPriority; + } + + protected void setKeywordPriority(int keywordPriority) { + this.keywordPriority = keywordPriority; + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend deleted file mode 100644 index ed794e94b..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.xtend +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.contentassist - -import com.google.inject.Singleton -import org.eclipse.xtend.lib.annotations.Accessors -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry -import org.eclipse.xtext.resource.IEObjectDescription - -/** - * Determines priorities for content assist proposal entries. The priorities can be used - * to sort the list of proposals. - * @noreference - */ -@Singleton -@Accessors(PROTECTED_GETTER, PROTECTED_SETTER) -class IdeContentProposalPriorities { - - int crossRefPriority = 500 - - int defaultPriority = 400 - - int keywordPriority = 300 - - protected def adjustPriority(ContentAssistEntry entry, int priority) { - if (entry === null) - return priority - var adjustedPriority = priority - if (!Character.isLetter(entry.proposal.charAt(0))) - adjustedPriority -= 30 - if (entry.proposal == entry.prefix) - adjustedPriority -= 20 - return adjustedPriority - } - - def int getCrossRefPriority(IEObjectDescription objectDesc, ContentAssistEntry entry) { - adjustPriority(entry, crossRefPriority) - } - - def int getDefaultPriority(ContentAssistEntry entry) { - adjustPriority(entry, defaultPriority) - } - - def int getKeywordPriority(String keyword, ContentAssistEntry entry) { - adjustPriority(entry, keywordPriority) - } - -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.java new file mode 100644 index 000000000..a24a4939b --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright (c) 2015, 2020 itemis AG (http://www.itemis.eu) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.xtext.ide.editor.contentassist; + +import org.apache.log4j.Logger; +import org.eclipse.xtext.CrossReference; +import org.eclipse.xtext.naming.IQualifiedNameConverter; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.scoping.IScope; + +import com.google.common.base.Predicate; +import com.google.inject.Inject; + +/** + * Special content assist proposal provider for cross-references. + * + * @noreference + */ +public class IdeCrossrefProposalProvider { + + private static final Logger LOG = Logger.getLogger(IdeCrossrefProposalProvider.class); + + @Inject + private IQualifiedNameConverter qualifiedNameConverter; + + @Inject + private IdeContentProposalCreator proposalCreator; + + @Inject + private IdeContentProposalPriorities proposalPriorities; + + public void lookupCrossReference(IScope scope, CrossReference crossReference, ContentAssistContext context, + IIdeContentProposalAcceptor acceptor, Predicate filter) { + try { + for (IEObjectDescription candidate : queryScope(scope, crossReference, context)) { + if (!acceptor.canAcceptMoreProposals()) { + return; + } + if (filter.apply(candidate)) { + ContentAssistEntry entry = createProposal(candidate, crossReference, context); + acceptor.accept(entry, proposalPriorities.getCrossRefPriority(candidate, entry)); + } + } + } catch (UnsupportedOperationException uoe) { + LOG.error("Failed to create content assist proposals for cross-reference.", uoe); + } + } + + protected Iterable queryScope(IScope scope, CrossReference crossReference, + ContentAssistContext context) { + return scope.getAllElements(); + } + + protected ContentAssistEntry createProposal(IEObjectDescription candidate, CrossReference crossRef, + ContentAssistContext context) { + return proposalCreator.createProposal(qualifiedNameConverter.toString(candidate.getName()), context, (e) -> { + e.setSource(candidate); + e.setDescription(candidate.getEClass() != null ? candidate.getEClass().getName() : null); + e.setKind(ContentAssistEntry.KIND_REFERENCE); + }); + } + + protected IQualifiedNameConverter getQualifiedNameConverter() { + return qualifiedNameConverter; + } + + protected IdeContentProposalCreator getProposalCreator() { + return proposalCreator; + } + +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend deleted file mode 100644 index 9a0da43bf..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.xtend +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.contentassist - -import com.google.common.base.Predicate -import com.google.inject.Inject -import org.apache.log4j.Logger -import org.eclipse.xtend.lib.annotations.Accessors -import org.eclipse.xtext.CrossReference -import org.eclipse.xtext.naming.IQualifiedNameConverter -import org.eclipse.xtext.resource.IEObjectDescription -import org.eclipse.xtext.scoping.IScope - -/** - * Special content assist proposal provider for cross-references. - * @noreference - */ -class IdeCrossrefProposalProvider { - - static val LOG = Logger.getLogger(IdeCrossrefProposalProvider) - - @Accessors(PROTECTED_GETTER) - @Inject IQualifiedNameConverter qualifiedNameConverter - - @Accessors(PROTECTED_GETTER) - @Inject IdeContentProposalCreator proposalCreator - - @Inject IdeContentProposalPriorities proposalPriorities - - def void lookupCrossReference(IScope scope, CrossReference crossReference, ContentAssistContext context, - IIdeContentProposalAcceptor acceptor, Predicate filter) { - try { - for (candidate : queryScope(scope, crossReference, context)) { - if (!acceptor.canAcceptMoreProposals) { - return - } - if (filter.apply(candidate)) { - val entry = createProposal(candidate, crossReference, context) - acceptor.accept(entry, proposalPriorities.getCrossRefPriority(candidate, entry)) - } - } - } catch (UnsupportedOperationException uoe) { - LOG.error('Failed to create content assist proposals for cross-reference.', uoe) - } - } - - protected def queryScope(IScope scope, CrossReference crossReference, ContentAssistContext context) { - return scope.allElements - } - - protected def ContentAssistEntry createProposal(IEObjectDescription candidate, CrossReference crossRef, ContentAssistContext context) { - proposalCreator.createProposal(qualifiedNameConverter.toString(candidate.name), context) [ - source = candidate - description = candidate.getEClass?.name - kind = ContentAssistEntry.KIND_REFERENCE - ] - } - -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.java new file mode 100644 index 000000000..6e14ccd4d --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.java @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.editor.hierarchy; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.resource.IEObjectDescription; +import org.eclipse.xtext.util.Wrapper; + +import com.google.common.base.Objects; + +/** + * @author kosyakov - Initial contribution and API + * @since 2.10 + */ +public class DefaultHierarchyNode implements IHierarchyNode { + private IHierarchyNode parent; + + private boolean mayHaveChildren; + + private IEObjectDescription element; + + private final List references = new ArrayList<>(); + + private Wrapper recursive; + + @Override + public Object getNavigationElement() { + if (!references.isEmpty()) { + return references.get(0); + } else { + return element; + } + } + + @Override + public boolean isRecursive() { + if (recursive == null) { + recursive = Wrapper.wrap(internalIsRecursive()); + } + return recursive.get().booleanValue(); + } + + protected boolean internalIsRecursive() { + IHierarchyNode node = parent; + while (node != null) { + URI nodeElementUri = node.getElement().getEObjectURI(); + URI elementUri = this.element.getEObjectURI(); + if (Objects.equal(nodeElementUri, elementUri)) { + return true; + } + node = node.getParent(); + } + return false; + } + + @Override + public boolean mayHaveChildren() { + return mayHaveChildren; + } + + public IHierarchyNode getParent() { + return parent; + } + + public void setParent(IHierarchyNode parent) { + this.parent = parent; + } + + public void setMayHaveChildren(boolean mayHaveChildren) { + this.mayHaveChildren = mayHaveChildren; + } + + public IEObjectDescription getElement() { + return element; + } + + public void setElement(IEObjectDescription element) { + this.element = element; + } + + public List getReferences() { + return references; + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.xtend deleted file mode 100644 index 8835d0983..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.xtend +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.hierarchy - -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors -import org.eclipse.xtext.resource.IEObjectDescription -import org.eclipse.xtext.util.Wrapper - -/** - * @author kosyakov - Initial contribution and API - * @since 2.10 - */ -class DefaultHierarchyNode implements IHierarchyNode { - - @Accessors - IHierarchyNode parent - - @Accessors(PUBLIC_SETTER) - boolean mayHaveChildren - - @Accessors - IEObjectDescription element - - @Accessors(PUBLIC_GETTER) - val List references = newArrayList - - Wrapper recursive - - override getNavigationElement() { - return references.head ?: element - } - - override boolean isRecursive() { - if (recursive === null) - recursive = Wrapper.wrap(internalIsRecursive) - return recursive.get - } - - protected def boolean internalIsRecursive() { - var node = parent - while (node !== null) { - if (node.element.EObjectURI == element.EObjectURI) - return true - node = node.parent - } - return false - } - - override mayHaveChildren() { - mayHaveChildren - } - -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.java new file mode 100644 index 000000000..61da8133f --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.editor.hierarchy; + +import org.eclipse.xtext.util.ITextRegion; +import org.eclipse.xtext.util.ITextRegionWithLineInformation; + +/** + * @author kosyakov - Initial contribution and API + * @since 2.10 + */ +public class DefaultHierarchyNodeReference implements IHierarchyNodeReference { + private final String text; + + private final ITextRegionWithLineInformation textRegion; + + private final Object navigationElement; + + public DefaultHierarchyNodeReference(String text, ITextRegionWithLineInformation textRegion, + Object navigationElement) { + this.text = text; + this.textRegion = textRegion; + this.navigationElement = navigationElement; + } + + public String getText() { + return text; + } + + public ITextRegionWithLineInformation getTextRegion() { + return textRegion; + } + + public Object getNavigationElement() { + return navigationElement; + } + + public boolean contains(ITextRegion other) { + return textRegion.contains(other); + } + + public boolean contains(int offset) { + return textRegion.contains(offset); + } + + public int getEndLineNumber() { + return textRegion.getEndLineNumber(); + } + + public int getLength() { + return textRegion.getLength(); + } + + public int getLineNumber() { + return textRegion.getLineNumber(); + } + + public int getOffset() { + return textRegion.getOffset(); + } + + public ITextRegion merge(ITextRegion region) { + return textRegion.merge(region); + } + + public ITextRegionWithLineInformation merge(ITextRegionWithLineInformation other) { + return textRegion.merge(other); + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.xtend deleted file mode 100644 index 1baf085cc..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.xtend +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.hierarchy - -import org.eclipse.xtend.lib.annotations.Accessors -import org.eclipse.xtend.lib.annotations.Delegate -import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor -import org.eclipse.xtext.util.ITextRegionWithLineInformation - -/** - * @author kosyakov - Initial contribution and API - * @since 2.10 - */ -@Accessors -@FinalFieldsConstructor -class DefaultHierarchyNodeReference implements IHierarchyNodeReference { - val String text - @Delegate - val ITextRegionWithLineInformation textRegion - val Object navigationElement -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.java new file mode 100644 index 000000000..e1b527c54 --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.java @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2016, 2020 TypeFox GmbH (http://www.typefox.io) and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.editor.hierarchy; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author kosyakov - Initial contribution and API + * @since 2.10 + */ +public class DefaultHierarchyRoot implements IHierarchyRoot { + private final List roots = new ArrayList<>(); + + public List getRoots() { + return roots; + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.xtend deleted file mode 100644 index ebd47560f..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.xtend +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.editor.hierarchy - -import java.util.List -import org.eclipse.xtend.lib.annotations.Accessors - -/** - * @author kosyakov - Initial contribution and API - * @since 2.10 - */ -@Accessors -class DefaultHierarchyRoot implements IHierarchyRoot { - val List roots = newArrayList -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.java similarity index 74% rename from org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.java rename to org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.java index 7a8ae4682..82cb18106 100644 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.java +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014, 2017 itemis AG (http://www.itemis.eu) and others. + * Copyright (c) 2014, 2020 itemis AG (http://www.itemis.eu) and others. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0. @@ -14,9 +14,8 @@ import org.eclipse.xtext.ide.editor.model.TokenTypeToStringMapper; * @author Anton Kosyakov - Initial contribution and API * @since 2.9 */ -@SuppressWarnings("all") public abstract class AbstractAntlrTokenToAttributeIdMapper extends TokenTypeToStringMapper { - public String getId(final int tokenType) { - return this.getMappedValue(tokenType); - } + public String getId(int tokenType) { + return getMappedValue(tokenType); + } } diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.xtend deleted file mode 100644 index c3c109d92..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/editor/syntaxcoloring/AbstractAntlrTokenToAttributeIdMapper.xtend +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2014, 2017 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.syntaxcoloring - -import org.eclipse.xtext.ide.editor.model.TokenTypeToStringMapper - -/** - * @author Anton Kosyakov - Initial contribution and API - * @since 2.9 - */ -abstract class AbstractAntlrTokenToAttributeIdMapper extends TokenTypeToStringMapper { - - def String getId(int tokenType) { - getMappedValue(tokenType) - } - -} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.java b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.java new file mode 100644 index 000000000..7f0d52ec5 --- /dev/null +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.java @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2018, 2020 TypeFox and others. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.xtext.ide.server.symbol; + +import java.util.ArrayList; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.lsp4j.DocumentSymbol; +import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.SymbolKind; +import org.eclipse.xtext.ide.server.DocumentExtensions; +import org.eclipse.xtext.naming.IQualifiedNameProvider; +import org.eclipse.xtext.naming.QualifiedName; +import org.eclipse.xtext.resource.IEObjectDescription; + +import com.google.common.annotations.Beta; +import com.google.inject.Inject; +import com.google.inject.Singleton; + +/** + * Maps an EObject to the corresponding {@link DocumentSymbol document symbol}. + */ +@Beta +@Singleton +public class DocumentSymbolMapper { + /** + * Provides {@link DocumentSymbol#detail detail} for a {@link DocumentSymbol document symbol}. + *

+ * Always returns an empty string by default. + * + * @see DocumentSymbol#detail + */ + @Beta + @Singleton + public static class DocumentSymbolDetailsProvider { + public String getDetails(EObject object) { + return ""; + } + } + + /** + * Provides a human-readable name for the document symbol. + * + * @see DocumentSymbol#name + */ + @Beta + @Singleton + public static class DocumentSymbolNameProvider { + @Inject + private IQualifiedNameProvider qualifiedNameProvider; + + public String getName(EObject object) { + return getName(object != null ? qualifiedNameProvider.getFullyQualifiedName(object) : null); + } + + public String getName(IEObjectDescription description) { + return getName(description != null ? description.getName() : null); + } + + protected String getName(QualifiedName qualifiedName) { + if (qualifiedName != null) { + return qualifiedName.toString(); + } + return null; + } + } + + /** + * Provides the {@link SymbolKind symbol kind} information for the document symbol. + * + * @see DocumentSymbol#kind + */ + @Beta + @Singleton + public static class DocumentSymbolKindProvider { + public SymbolKind getSymbolKind(EObject object) { + return getSymbolKind(object != null ? object.eClass() : null); + } + + public SymbolKind getSymbolKind(IEObjectDescription description) { + return this.getSymbolKind(description != null ? description.getEClass() : null); + } + + protected SymbolKind getSymbolKind(EClass clazz) { + return SymbolKind.Property; + } + } + + /** + * Provides {@link DocumentSymbol#range range} and {@link DocumentSymbol#selectionRange selection range} for a + * document symbol. + * + * @see DocumentSymbol#range + * @see DocumentSymbol#selectionRange + */ + @Beta + @Singleton + public static class DocumentSymbolRangeProvider { + @Inject + private DocumentExtensions documentExtensions; + + /** + * The range enclosing this symbol not including leading/trailing whitespace but everything else like comments. + */ + public Range getRange(EObject object) { + Location newFullLocation = documentExtensions.newFullLocation(object); + if (newFullLocation != null) { + return newFullLocation.getRange(); + } + return null; + } + + /** + * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. + */ + public Range getSelectionRange(EObject object) { + Location newLocation = documentExtensions.newLocation(object); + if (newLocation != null) { + return newLocation.getRange(); + } + return null; + } + } + + /** + * Determines whether a document symbol can be marked as {@link DocumentSymbol#deprecated deprecated}. + * + * @see DocumentSymbol#deprecated + */ + @Beta + @Singleton + public static class DocumentSymbolDeprecationInfoProvider { + public boolean isDeprecated(EObject object) { + return false; + } + + public boolean isDeprecated(IEObjectDescription description) { + return false; + } + } + + @Inject + private DocumentSymbolMapper.DocumentSymbolNameProvider nameProvider; + + @Inject + private DocumentSymbolMapper.DocumentSymbolKindProvider kindProvider; + + @Inject + private DocumentSymbolMapper.DocumentSymbolRangeProvider rangeProvider; + + @Inject + private DocumentSymbolMapper.DocumentSymbolDetailsProvider detailsProvider; + + @Inject + private DocumentSymbolMapper.DocumentSymbolDeprecationInfoProvider deprecationInfoProvider; + + /** + * Converts the {@code EObject} argument into a {@link DocumentSymbol document symbol} without the + * {@link DocumentSymbol#children children} information filled in. + */ + public DocumentSymbol toDocumentSymbol(EObject object) { + DocumentSymbol documentSymbol = new DocumentSymbol(); + String objectName = nameProvider.getName(object); + if (objectName != null) { + documentSymbol.setName(objectName); + } + SymbolKind objectKind = kindProvider.getSymbolKind(object); + if (objectKind != null) { + documentSymbol.setKind(objectKind); + } + Range objectRange = rangeProvider.getRange(object); + if (objectRange != null) { + documentSymbol.setRange(objectRange); + } + Range objectSelectionRange = rangeProvider.getSelectionRange(object); + if (objectSelectionRange != null) { + documentSymbol.setSelectionRange(objectSelectionRange); + } + documentSymbol.setDetail(detailsProvider.getDetails(object)); + documentSymbol.setDeprecated(deprecationInfoProvider.isDeprecated(object)); + documentSymbol.setChildren(new ArrayList<>()); + return documentSymbol; + } +} diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.xtend deleted file mode 100644 index ef2d8deaf..000000000 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.xtend +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2018 TypeFox and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - *******************************************************************************/ -package org.eclipse.xtext.ide.server.symbol - -import com.google.common.annotations.Beta -import com.google.inject.Inject -import com.google.inject.Singleton -import org.eclipse.emf.ecore.EClass -import org.eclipse.emf.ecore.EObject -import org.eclipse.lsp4j.DocumentSymbol -import org.eclipse.lsp4j.Range -import org.eclipse.lsp4j.SymbolKind -import org.eclipse.xtext.ide.server.DocumentExtensions -import org.eclipse.xtext.naming.IQualifiedNameProvider -import org.eclipse.xtext.naming.QualifiedName -import org.eclipse.xtext.resource.IEObjectDescription - -/** - * Maps an EObject to the corresponding {@link DocumentSymbol document symbol}. - */ -@Beta -@Singleton -class DocumentSymbolMapper { - - @Inject - DocumentSymbolNameProvider nameProvider; - - @Inject - DocumentSymbolKindProvider kindProvider; - - @Inject - DocumentSymbolRangeProvider rangeProvider; - - @Inject - DocumentSymbolDetailsProvider detailsProvider; - - @Inject - DocumentSymbolDeprecationInfoProvider deprecationInfoProvider; - - /** - * Converts the {@code EObject} argument into a {@link DocumentSymbol document symbol} without - * the {@link DocumentSymbol#children children} information filled in. - */ - def DocumentSymbol toDocumentSymbol(EObject object) { - return new DocumentSymbol => [ - val objectName = nameProvider.getName(object) - if (objectName !== null) { - name = objectName; - } - val objectKind = kindProvider.getSymbolKind(object); - if (objectKind !== null) { - kind = objectKind - } - val objectRange = rangeProvider.getRange(object); - if (objectRange !== null) { - range = objectRange - } - val objectSelectionRange = rangeProvider.getSelectionRange(object); - if (objectSelectionRange !== null) { - selectionRange = objectSelectionRange - } - detail = detailsProvider.getDetails(object); - deprecated = deprecationInfoProvider.isDeprecated(object); - children = newArrayList; - ]; - } - - /** - * Provides {@link DocumentSymbol#detail detail} for a {@link DocumentSymbol document symbol}. - *

- * Always returns with an empty string by default. - * - * @see DocumentSymbol#detail - */ - @Beta - @Singleton - static class DocumentSymbolDetailsProvider { - - def String getDetails(EObject object) { - return ''; - } - - } - - /** - * Provides a human-readable name for the document symbol. - * - * @see DocumentSymbol#name - */ - @Beta - @Singleton - static class DocumentSymbolNameProvider { - - @Inject - extension IQualifiedNameProvider; - - def String getName(EObject object) { - return object?.fullyQualifiedName.name; - } - - def String getName(IEObjectDescription description) { - return description?.name.name; - } - - protected def String getName(QualifiedName qualifiedName) { - return qualifiedName?.toString; - } - - } - - /** - * Provides the {@link SymbolKind symbol kind} information for the document symbol. - * - * @see DocumentSymbol#kind - */ - @Beta - @Singleton - static class DocumentSymbolKindProvider { - - def SymbolKind getSymbolKind(EObject object) { - return object?.eClass.symbolKind; - } - - def SymbolKind getSymbolKind(IEObjectDescription description) { - return description?.EClass.symbolKind; - } - - protected def SymbolKind getSymbolKind(EClass clazz) { - return SymbolKind.Property; - } - } - - /** - * Provides {@link DocumentSymbol#range range} and {@link DocumentSymbol#selectionRange selection range} for a document symbol. - * - * @see DocumentSymbol#range - * @see DocumentSymbol#selectionRange - */ - @Beta - @Singleton - static class DocumentSymbolRangeProvider { - - @Inject - extension DocumentExtensions; - - /** - * The range enclosing this symbol not including leading/trailing whitespace but everything else - * like comments. - */ - def Range getRange(EObject object) { - return object.newFullLocation?.range; - } - - /** - * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. - */ - def Range getSelectionRange(EObject object) { - return object.newLocation?.range; - } - - } - - /** - * Determines whether a document symbol can be marked as {@link DocumentSymbol#deprecated deprecated}. - * - * @see DocumentSymbol#deprecated - */ - @Beta - @Singleton - static class DocumentSymbolDeprecationInfoProvider { - - def boolean isDeprecated(EObject object) { - return false; - } - - def boolean isDeprecated(IEObjectDescription description) { - return false; - } - - } - -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/AbstractIdeTemplateProposalProvider.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/AbstractIdeTemplateProposalProvider.java index 5f93e0e9e..7c1321fad 100644 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/AbstractIdeTemplateProposalProvider.java +++ b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/AbstractIdeTemplateProposalProvider.java @@ -114,9 +114,10 @@ public abstract class AbstractIdeTemplateProposalProvider { int _offset = this.context.getReplaceRegion().getOffset(); int _currentOffset = this.getCurrentOffset(); final int offset = (_offset + _currentOffset); + List _editPositions = this.entry.getEditPositions(); int _length = varName.length(); TextRegion _textRegion = new TextRegion(offset, _length); - this.entry.getEditPositions().add(_textRegion); + _editPositions.add(_textRegion); return varName; } else { if ((object instanceof AbstractIdeTemplateProposalProvider.Cursor)) { diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.java deleted file mode 100644 index 6e9c17a81..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/ContentAssistEntry.java +++ /dev/null @@ -1,298 +0,0 @@ -/** - * Copyright (c) 2015, 2016 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.contentassist; - -import java.util.ArrayList; -import org.eclipse.xtend.lib.annotations.Accessors; -import org.eclipse.xtend.lib.annotations.EqualsHashCode; -import org.eclipse.xtend.lib.annotations.ToString; -import org.eclipse.xtext.util.ReplaceRegion; -import org.eclipse.xtext.util.TextRegion; -import org.eclipse.xtext.xbase.lib.Pure; -import org.eclipse.xtext.xbase.lib.util.ToStringBuilder; - -/** - * @noreference - */ -@Accessors -@ToString(skipNulls = true) -@EqualsHashCode -@SuppressWarnings("all") -public class ContentAssistEntry { - /** - * The prefix that should be replaced with this proposal. - */ - private String prefix; - - /** - * The proposed text to be inserted. - */ - private String proposal; - - /** - * The text seen by the user in the list of proposals. - */ - private String label; - - /** - * Additional description to include in the list of proposals. - *

This property may not be supported by all editor frameworks.

- */ - private String description; - - /** - * Documentation for the proposal proposals. - *

This property may not be supported by all editor frameworks.

- */ - private String documentation; - - /** - * The absolute cursor position to apply after the proposal has been inserted. - * If omitted, the cursor it set to the end of the inserted proposal. - *

This property may not be supported by all editor frameworks.

- */ - private Integer escapePosition; - - /** - * Additional text replacements to apply when this proposal is selected. - *

This property may not be supported by all editor frameworks.

- */ - private final ArrayList textReplacements = new ArrayList(); - - /** - * Regions to be edited by the user after the proposal has been inserted. - * Usually the tab key navigates through the edit positions, and enter - * jumps to the {@code escapePosition}. - *

This property may not be supported by all editor frameworks.

- */ - private final ArrayList editPositions = new ArrayList(); - - /** - * The EObject or IEObjectDescription for which this entry has been created, if any. - * This field is not serialized when the entry is sent over a communication channel. - */ - private transient Object source; - - /** - * The kind of element that is proposed. Could be one of the constants below or something specific a concrete client understands. - * Must not be null. - */ - private String kind = ContentAssistEntry.KIND_UNKNOWN; - - public static final String KIND_TEXT = "TEXT"; - - public static final String KIND_METHOD = "METHOD"; - - public static final String KIND_FUNCTION = "FUNCTION"; - - public static final String KIND_CONSTRUCTOR = "CONSTRUCTOR"; - - public static final String KIND_FIELD = "FIELD"; - - public static final String KIND_VARIABLE = "VARIABLE"; - - public static final String KIND_CLASS = "CLASS"; - - public static final String KIND_INTERFACE = "INTERFACE"; - - public static final String KIND_MODULE = "MODULE"; - - public static final String KIND_PROPERTY = "PROPERTY"; - - public static final String KIND_UNIT = "UNIT"; - - public static final String KIND_VALUE = "VALUE"; - - public static final String KIND_ENUM = "ENUM"; - - public static final String KIND_KEYWORD = "KEYWORD"; - - public static final String KIND_SNIPPET = "SNIPPET"; - - public static final String KIND_COLOR = "COLOR"; - - public static final String KIND_FILE = "FILE"; - - public static final String KIND_REFERENCE = "REFERENCE"; - - public static final String KIND_UNKNOWN = "UNKNOWN"; - - @Pure - public String getPrefix() { - return this.prefix; - } - - public void setPrefix(final String prefix) { - this.prefix = prefix; - } - - @Pure - public String getProposal() { - return this.proposal; - } - - public void setProposal(final String proposal) { - this.proposal = proposal; - } - - @Pure - public String getLabel() { - return this.label; - } - - public void setLabel(final String label) { - this.label = label; - } - - @Pure - public String getDescription() { - return this.description; - } - - public void setDescription(final String description) { - this.description = description; - } - - @Pure - public String getDocumentation() { - return this.documentation; - } - - public void setDocumentation(final String documentation) { - this.documentation = documentation; - } - - @Pure - public Integer getEscapePosition() { - return this.escapePosition; - } - - public void setEscapePosition(final Integer escapePosition) { - this.escapePosition = escapePosition; - } - - @Pure - public ArrayList getTextReplacements() { - return this.textReplacements; - } - - @Pure - public ArrayList getEditPositions() { - return this.editPositions; - } - - @Pure - public Object getSource() { - return this.source; - } - - public void setSource(final Object source) { - this.source = source; - } - - @Pure - public String getKind() { - return this.kind; - } - - public void setKind(final String kind) { - this.kind = kind; - } - - @Override - @Pure - public String toString() { - ToStringBuilder b = new ToStringBuilder(this); - b.skipNulls(); - b.add("prefix", this.prefix); - b.add("proposal", this.proposal); - b.add("label", this.label); - b.add("description", this.description); - b.add("documentation", this.documentation); - b.add("escapePosition", this.escapePosition); - b.add("textReplacements", this.textReplacements); - b.add("editPositions", this.editPositions); - b.add("kind", this.kind); - return b.toString(); - } - - @Override - @Pure - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ContentAssistEntry other = (ContentAssistEntry) obj; - if (this.prefix == null) { - if (other.prefix != null) - return false; - } else if (!this.prefix.equals(other.prefix)) - return false; - if (this.proposal == null) { - if (other.proposal != null) - return false; - } else if (!this.proposal.equals(other.proposal)) - return false; - if (this.label == null) { - if (other.label != null) - return false; - } else if (!this.label.equals(other.label)) - return false; - if (this.description == null) { - if (other.description != null) - return false; - } else if (!this.description.equals(other.description)) - return false; - if (this.documentation == null) { - if (other.documentation != null) - return false; - } else if (!this.documentation.equals(other.documentation)) - return false; - if (this.escapePosition == null) { - if (other.escapePosition != null) - return false; - } else if (!this.escapePosition.equals(other.escapePosition)) - return false; - if (this.textReplacements == null) { - if (other.textReplacements != null) - return false; - } else if (!this.textReplacements.equals(other.textReplacements)) - return false; - if (this.editPositions == null) { - if (other.editPositions != null) - return false; - } else if (!this.editPositions.equals(other.editPositions)) - return false; - if (this.kind == null) { - if (other.kind != null) - return false; - } else if (!this.kind.equals(other.kind)) - return false; - return true; - } - - @Override - @Pure - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((this.prefix== null) ? 0 : this.prefix.hashCode()); - result = prime * result + ((this.proposal== null) ? 0 : this.proposal.hashCode()); - result = prime * result + ((this.label== null) ? 0 : this.label.hashCode()); - result = prime * result + ((this.description== null) ? 0 : this.description.hashCode()); - result = prime * result + ((this.documentation== null) ? 0 : this.documentation.hashCode()); - result = prime * result + ((this.escapePosition== null) ? 0 : this.escapePosition.hashCode()); - result = prime * result + ((this.textReplacements== null) ? 0 : this.textReplacements.hashCode()); - result = prime * result + ((this.editPositions== null) ? 0 : this.editPositions.hashCode()); - return prime * result + ((this.kind== null) ? 0 : this.kind.hashCode()); - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.java deleted file mode 100644 index ed4f6dfda..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalAcceptor.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.contentassist; - -import java.util.Comparator; -import java.util.TreeSet; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry; -import org.eclipse.xtext.ide.editor.contentassist.IIdeContentProposalAcceptor; -import org.eclipse.xtext.xbase.lib.Functions.Function1; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.eclipse.xtext.xbase.lib.Pair; - -/** - * @author Sven Efftinge - Initial contribution and API - * - * @since 2.11 - */ -@SuppressWarnings("all") -public class IdeContentProposalAcceptor implements IIdeContentProposalAcceptor, Comparator> { - protected final TreeSet> entries = new TreeSet>(this); - - @Override - public void accept(final ContentAssistEntry entry, final int priority) { - if ((entry != null)) { - String _proposal = entry.getProposal(); - boolean _tripleEquals = (_proposal == null); - if (_tripleEquals) { - throw new IllegalArgumentException("proposal must not be null."); - } - Pair _mappedTo = Pair.of(Integer.valueOf(priority), entry); - this.entries.add(_mappedTo); - } - } - - @Override - public boolean canAcceptMoreProposals() { - int _size = this.entries.size(); - return (_size < 100); - } - - @Override - public int compare(final Pair p1, final Pair p2) { - final int prioResult = p2.getKey().compareTo(p1.getKey()); - if ((prioResult != 0)) { - return prioResult; - } - String _elvis = null; - String _label = p1.getValue().getLabel(); - if (_label != null) { - _elvis = _label; - } else { - String _proposal = p1.getValue().getProposal(); - _elvis = _proposal; - } - final String s1 = _elvis; - String _elvis_1 = null; - String _label_1 = p2.getValue().getLabel(); - if (_label_1 != null) { - _elvis_1 = _label_1; - } else { - String _proposal_1 = p2.getValue().getProposal(); - _elvis_1 = _proposal_1; - } - final String s2 = _elvis_1; - final int ignoreCase = s1.compareToIgnoreCase(s2); - if ((ignoreCase == 0)) { - return s1.compareTo(s2); - } - return ignoreCase; - } - - public Iterable getEntries() { - final Function1, ContentAssistEntry> _function = (Pair it) -> { - return it.getValue(); - }; - return IterableExtensions., ContentAssistEntry>map(this.entries, _function); - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.java deleted file mode 100644 index 4b35bb35c..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalCreator.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.contentassist; - -import com.google.inject.Inject; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry; -import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher; -import org.eclipse.xtext.ide.editor.contentassist.IProposalConflictHelper; -import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; -import org.eclipse.xtext.xbase.lib.StringExtensions; - -/** - * Factory for content assist entries. Whenever possible, you should use this creator instead of building entries - * directly, since prefix matching and conflict handling is done here. - * - * @since 2.10 - * @noreference - */ -@SuppressWarnings("all") -public class IdeContentProposalCreator { - @Inject - private IPrefixMatcher prefixMatcher; - - @Inject - private IProposalConflictHelper conflictHelper; - - /** - * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. - */ - public ContentAssistEntry createProposal(final String proposal, final ContentAssistContext context) { - return this.createProposal(proposal, context.getPrefix(), context, ContentAssistEntry.KIND_UNKNOWN, null); - } - - /** - * Returns an entry of kind snippet with the given proposal and label and the prefix from the context, or null if the proposal is not valid. - * @since 2.16 - */ - public ContentAssistEntry createSnippet(final String proposal, final String label, final ContentAssistContext context) { - final Procedure1 _function = (ContentAssistEntry it) -> { - it.setLabel(label); - }; - return this.createProposal(proposal, context.getPrefix(), context, ContentAssistEntry.KIND_SNIPPET, _function); - } - - /** - * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. - * If it is valid, the initializer function is applied to it. - */ - public ContentAssistEntry createProposal(final String proposal, final ContentAssistContext context, final Procedure1 init) { - return this.createProposal(proposal, context.getPrefix(), context, ContentAssistEntry.KIND_UNKNOWN, init); - } - - /** - * Returns an entry with the given proposal and the prefix from the context, or null if the proposal is not valid. - * If it is valid, the initializer function is applied to it. - */ - public ContentAssistEntry createProposal(final String proposal, final ContentAssistContext context, final String kind, final Procedure1 init) { - return this.createProposal(proposal, context.getPrefix(), context, kind, init); - } - - /** - * Returns an entry with the given proposal and prefix, or null if the proposal is not valid. - * If it is valid, the initializer function is applied to it. - */ - public ContentAssistEntry createProposal(final String proposal, final String prefix, final ContentAssistContext context, final String kind, final Procedure1 init) { - boolean _isValidProposal = this.isValidProposal(proposal, prefix, context); - if (_isValidProposal) { - final ContentAssistEntry result = new ContentAssistEntry(); - result.setProposal(proposal); - result.setPrefix(prefix); - if ((kind != null)) { - result.setKind(kind); - } - if ((init != null)) { - init.apply(result); - } - return result; - } - return null; - } - - public boolean isValidProposal(final String proposal, final String prefix, final ContentAssistContext context) { - return (((!StringExtensions.isNullOrEmpty(proposal)) && this.prefixMatcher.isCandidateMatchingPrefix(proposal, prefix)) && (!this.conflictHelper.existsConflict(proposal, context))); - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.java deleted file mode 100644 index f88844e7c..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalPriorities.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.contentassist; - -import com.google.common.base.Objects; -import com.google.inject.Singleton; -import org.eclipse.xtend.lib.annotations.AccessorType; -import org.eclipse.xtend.lib.annotations.Accessors; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry; -import org.eclipse.xtext.resource.IEObjectDescription; -import org.eclipse.xtext.xbase.lib.Pure; - -/** - * Determines priorities for content assist proposal entries. The priorities can be used - * to sort the list of proposals. - * @noreference - */ -@Singleton -@Accessors({ AccessorType.PROTECTED_GETTER, AccessorType.PROTECTED_SETTER }) -@SuppressWarnings("all") -public class IdeContentProposalPriorities { - private int crossRefPriority = 500; - - private int defaultPriority = 400; - - private int keywordPriority = 300; - - protected int adjustPriority(final ContentAssistEntry entry, final int priority) { - if ((entry == null)) { - return priority; - } - int adjustedPriority = priority; - boolean _isLetter = Character.isLetter(entry.getProposal().charAt(0)); - boolean _not = (!_isLetter); - if (_not) { - int _adjustedPriority = adjustedPriority; - adjustedPriority = (_adjustedPriority - 30); - } - String _proposal = entry.getProposal(); - String _prefix = entry.getPrefix(); - boolean _equals = Objects.equal(_proposal, _prefix); - if (_equals) { - int _adjustedPriority_1 = adjustedPriority; - adjustedPriority = (_adjustedPriority_1 - 20); - } - return adjustedPriority; - } - - public int getCrossRefPriority(final IEObjectDescription objectDesc, final ContentAssistEntry entry) { - return this.adjustPriority(entry, this.crossRefPriority); - } - - public int getDefaultPriority(final ContentAssistEntry entry) { - return this.adjustPriority(entry, this.defaultPriority); - } - - public int getKeywordPriority(final String keyword, final ContentAssistEntry entry) { - return this.adjustPriority(entry, this.keywordPriority); - } - - @Pure - protected int getCrossRefPriority() { - return this.crossRefPriority; - } - - protected void setCrossRefPriority(final int crossRefPriority) { - this.crossRefPriority = crossRefPriority; - } - - @Pure - protected int getDefaultPriority() { - return this.defaultPriority; - } - - protected void setDefaultPriority(final int defaultPriority) { - this.defaultPriority = defaultPriority; - } - - @Pure - protected int getKeywordPriority() { - return this.keywordPriority; - } - - protected void setKeywordPriority(final int keywordPriority) { - this.keywordPriority = keywordPriority; - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.java index 5c2311481..0b36c92d9 100644 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.java +++ b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeContentProposalProvider.java @@ -13,9 +13,9 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.inject.Inject; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.List; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; @@ -128,7 +128,7 @@ public class IdeContentProposalProvider { String _name_1 = rule.getName(); boolean _equals_1 = Objects.equal(_name_1, "STRING"); if (_equals_1) { - ArrayList _editPositions = it.getEditPositions(); + List _editPositions = it.getEditPositions(); int _offset = context.getOffset(); int _plus_1 = (_offset + 1); int _length = proposal.length(); @@ -137,7 +137,7 @@ public class IdeContentProposalProvider { _editPositions.add(_textRegion); it.setKind(ContentAssistEntry.KIND_TEXT); } else { - ArrayList _editPositions_1 = it.getEditPositions(); + List _editPositions_1 = it.getEditPositions(); int _offset_1 = context.getOffset(); int _length_1 = proposal.length(); TextRegion _textRegion_1 = new TextRegion(_offset_1, _length_1); diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.java deleted file mode 100644 index 4981a4ac5..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/contentassist/IdeCrossrefProposalProvider.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.contentassist; - -import com.google.common.base.Predicate; -import com.google.inject.Inject; -import org.apache.log4j.Logger; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.xtend.lib.annotations.AccessorType; -import org.eclipse.xtend.lib.annotations.Accessors; -import org.eclipse.xtext.CrossReference; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext; -import org.eclipse.xtext.ide.editor.contentassist.ContentAssistEntry; -import org.eclipse.xtext.ide.editor.contentassist.IIdeContentProposalAcceptor; -import org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalCreator; -import org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalPriorities; -import org.eclipse.xtext.naming.IQualifiedNameConverter; -import org.eclipse.xtext.resource.IEObjectDescription; -import org.eclipse.xtext.scoping.IScope; -import org.eclipse.xtext.xbase.lib.Exceptions; -import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; -import org.eclipse.xtext.xbase.lib.Pure; - -/** - * Special content assist proposal provider for cross-references. - * @noreference - */ -@SuppressWarnings("all") -public class IdeCrossrefProposalProvider { - private static final Logger LOG = Logger.getLogger(IdeCrossrefProposalProvider.class); - - @Accessors(AccessorType.PROTECTED_GETTER) - @Inject - private IQualifiedNameConverter qualifiedNameConverter; - - @Accessors(AccessorType.PROTECTED_GETTER) - @Inject - private IdeContentProposalCreator proposalCreator; - - @Inject - private IdeContentProposalPriorities proposalPriorities; - - public void lookupCrossReference(final IScope scope, final CrossReference crossReference, final ContentAssistContext context, final IIdeContentProposalAcceptor acceptor, final Predicate filter) { - try { - Iterable _queryScope = this.queryScope(scope, crossReference, context); - for (final IEObjectDescription candidate : _queryScope) { - { - boolean _canAcceptMoreProposals = acceptor.canAcceptMoreProposals(); - boolean _not = (!_canAcceptMoreProposals); - if (_not) { - return; - } - boolean _apply = filter.apply(candidate); - if (_apply) { - final ContentAssistEntry entry = this.createProposal(candidate, crossReference, context); - acceptor.accept(entry, this.proposalPriorities.getCrossRefPriority(candidate, entry)); - } - } - } - } catch (final Throwable _t) { - if (_t instanceof UnsupportedOperationException) { - final UnsupportedOperationException uoe = (UnsupportedOperationException)_t; - IdeCrossrefProposalProvider.LOG.error("Failed to create content assist proposals for cross-reference.", uoe); - } else { - throw Exceptions.sneakyThrow(_t); - } - } - } - - protected Iterable queryScope(final IScope scope, final CrossReference crossReference, final ContentAssistContext context) { - return scope.getAllElements(); - } - - protected ContentAssistEntry createProposal(final IEObjectDescription candidate, final CrossReference crossRef, final ContentAssistContext context) { - final Procedure1 _function = (ContentAssistEntry it) -> { - it.setSource(candidate); - EClass _eClass = candidate.getEClass(); - String _name = null; - if (_eClass!=null) { - _name=_eClass.getName(); - } - it.setDescription(_name); - it.setKind(ContentAssistEntry.KIND_REFERENCE); - }; - return this.proposalCreator.createProposal(this.qualifiedNameConverter.toString(candidate.getName()), context, _function); - } - - @Pure - protected IQualifiedNameConverter getQualifiedNameConverter() { - return this.qualifiedNameConverter; - } - - @Pure - protected IdeContentProposalCreator getProposalCreator() { - return this.proposalCreator; - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.java deleted file mode 100644 index 84c6adaaa..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNode.java +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.hierarchy; - -import com.google.common.base.Objects; -import java.util.List; -import org.eclipse.emf.common.util.URI; -import org.eclipse.xtend.lib.annotations.AccessorType; -import org.eclipse.xtend.lib.annotations.Accessors; -import org.eclipse.xtext.ide.editor.hierarchy.IHierarchyNode; -import org.eclipse.xtext.ide.editor.hierarchy.IHierarchyNodeReference; -import org.eclipse.xtext.resource.IEObjectDescription; -import org.eclipse.xtext.util.Wrapper; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.IterableExtensions; -import org.eclipse.xtext.xbase.lib.Pure; - -/** - * @author kosyakov - Initial contribution and API - * @since 2.10 - */ -@SuppressWarnings("all") -public class DefaultHierarchyNode implements IHierarchyNode { - @Accessors - private IHierarchyNode parent; - - @Accessors(AccessorType.PUBLIC_SETTER) - private boolean mayHaveChildren; - - @Accessors - private IEObjectDescription element; - - @Accessors(AccessorType.PUBLIC_GETTER) - private final List references = CollectionLiterals.newArrayList(); - - private Wrapper recursive; - - @Override - public Object getNavigationElement() { - Object _elvis = null; - IHierarchyNodeReference _head = IterableExtensions.head(this.references); - if (_head != null) { - _elvis = _head; - } else { - _elvis = this.element; - } - return _elvis; - } - - @Override - public boolean isRecursive() { - if ((this.recursive == null)) { - this.recursive = Wrapper.wrap(Boolean.valueOf(this.internalIsRecursive())); - } - return (this.recursive.get()).booleanValue(); - } - - protected boolean internalIsRecursive() { - IHierarchyNode node = this.parent; - while ((node != null)) { - { - URI _eObjectURI = node.getElement().getEObjectURI(); - URI _eObjectURI_1 = this.element.getEObjectURI(); - boolean _equals = Objects.equal(_eObjectURI, _eObjectURI_1); - if (_equals) { - return true; - } - node = node.getParent(); - } - } - return false; - } - - @Override - public boolean mayHaveChildren() { - return this.mayHaveChildren; - } - - @Pure - public IHierarchyNode getParent() { - return this.parent; - } - - public void setParent(final IHierarchyNode parent) { - this.parent = parent; - } - - public void setMayHaveChildren(final boolean mayHaveChildren) { - this.mayHaveChildren = mayHaveChildren; - } - - @Pure - public IEObjectDescription getElement() { - return this.element; - } - - public void setElement(final IEObjectDescription element) { - this.element = element; - } - - @Pure - public List getReferences() { - return this.references; - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.java deleted file mode 100644 index c64d22c6a..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyNodeReference.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.hierarchy; - -import org.eclipse.xtend.lib.annotations.Accessors; -import org.eclipse.xtend.lib.annotations.Delegate; -import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor; -import org.eclipse.xtext.ide.editor.hierarchy.IHierarchyNodeReference; -import org.eclipse.xtext.util.ITextRegion; -import org.eclipse.xtext.util.ITextRegionWithLineInformation; -import org.eclipse.xtext.xbase.lib.Pure; - -/** - * @author kosyakov - Initial contribution and API - * @since 2.10 - */ -@Accessors -@FinalFieldsConstructor -@SuppressWarnings("all") -public class DefaultHierarchyNodeReference implements IHierarchyNodeReference { - private final String text; - - @Delegate - private final ITextRegionWithLineInformation textRegion; - - private final Object navigationElement; - - public DefaultHierarchyNodeReference(final String text, final ITextRegionWithLineInformation textRegion, final Object navigationElement) { - super(); - this.text = text; - this.textRegion = textRegion; - this.navigationElement = navigationElement; - } - - @Pure - public String getText() { - return this.text; - } - - @Pure - public ITextRegionWithLineInformation getTextRegion() { - return this.textRegion; - } - - @Pure - public Object getNavigationElement() { - return this.navigationElement; - } - - public boolean contains(final ITextRegion other) { - return this.textRegion.contains(other); - } - - public boolean contains(final int offset) { - return this.textRegion.contains(offset); - } - - public int getEndLineNumber() { - return this.textRegion.getEndLineNumber(); - } - - public int getLength() { - return this.textRegion.getLength(); - } - - public int getLineNumber() { - return this.textRegion.getLineNumber(); - } - - public int getOffset() { - return this.textRegion.getOffset(); - } - - public ITextRegion merge(final ITextRegion region) { - return this.textRegion.merge(region); - } - - public ITextRegionWithLineInformation merge(final ITextRegionWithLineInformation other) { - return this.textRegion.merge(other); - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.java deleted file mode 100644 index b51cc8514..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/editor/hierarchy/DefaultHierarchyRoot.java +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.editor.hierarchy; - -import java.util.List; -import org.eclipse.xtend.lib.annotations.Accessors; -import org.eclipse.xtext.ide.editor.hierarchy.IHierarchyNode; -import org.eclipse.xtext.ide.editor.hierarchy.IHierarchyRoot; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Pure; - -/** - * @author kosyakov - Initial contribution and API - * @since 2.10 - */ -@Accessors -@SuppressWarnings("all") -public class DefaultHierarchyRoot implements IHierarchyRoot { - private final List roots = CollectionLiterals.newArrayList(); - - @Pure - public List getRoots() { - return this.roots; - } -} diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.java deleted file mode 100644 index 77b16ffe4..000000000 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/symbol/DocumentSymbolMapper.java +++ /dev/null @@ -1,217 +0,0 @@ -/** - * Copyright (c) 2018 TypeFox and others. - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.xtext.ide.server.symbol; - -import com.google.common.annotations.Beta; -import com.google.inject.Inject; -import com.google.inject.Singleton; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.lsp4j.DocumentSymbol; -import org.eclipse.lsp4j.Location; -import org.eclipse.lsp4j.Range; -import org.eclipse.lsp4j.SymbolKind; -import org.eclipse.xtext.ide.server.DocumentExtensions; -import org.eclipse.xtext.naming.IQualifiedNameProvider; -import org.eclipse.xtext.naming.QualifiedName; -import org.eclipse.xtext.resource.IEObjectDescription; -import org.eclipse.xtext.xbase.lib.CollectionLiterals; -import org.eclipse.xtext.xbase.lib.Extension; -import org.eclipse.xtext.xbase.lib.ObjectExtensions; -import org.eclipse.xtext.xbase.lib.Procedures.Procedure1; - -/** - * Maps an EObject to the corresponding {@link DocumentSymbol document symbol}. - */ -@Beta -@Singleton -@SuppressWarnings("all") -public class DocumentSymbolMapper { - /** - * Provides {@link DocumentSymbol#detail detail} for a {@link DocumentSymbol document symbol}. - *

- * Always returns with an empty string by default. - * - * @see DocumentSymbol#detail - */ - @Beta - @Singleton - public static class DocumentSymbolDetailsProvider { - public String getDetails(final EObject object) { - return ""; - } - } - - /** - * Provides a human-readable name for the document symbol. - * - * @see DocumentSymbol#name - */ - @Beta - @Singleton - public static class DocumentSymbolNameProvider { - @Inject - @Extension - private IQualifiedNameProvider _iQualifiedNameProvider; - - public String getName(final EObject object) { - QualifiedName _fullyQualifiedName = null; - if (object!=null) { - _fullyQualifiedName=this._iQualifiedNameProvider.getFullyQualifiedName(object); - } - return this.getName(_fullyQualifiedName); - } - - public String getName(final IEObjectDescription description) { - QualifiedName _name = null; - if (description!=null) { - _name=description.getName(); - } - return this.getName(_name); - } - - protected String getName(final QualifiedName qualifiedName) { - String _string = null; - if (qualifiedName!=null) { - _string=qualifiedName.toString(); - } - return _string; - } - } - - /** - * Provides the {@link SymbolKind symbol kind} information for the document symbol. - * - * @see DocumentSymbol#kind - */ - @Beta - @Singleton - public static class DocumentSymbolKindProvider { - public SymbolKind getSymbolKind(final EObject object) { - EClass _eClass = null; - if (object!=null) { - _eClass=object.eClass(); - } - return this.getSymbolKind(_eClass); - } - - public SymbolKind getSymbolKind(final IEObjectDescription description) { - EClass _eClass = null; - if (description!=null) { - _eClass=description.getEClass(); - } - return this.getSymbolKind(_eClass); - } - - protected SymbolKind getSymbolKind(final EClass clazz) { - return SymbolKind.Property; - } - } - - /** - * Provides {@link DocumentSymbol#range range} and {@link DocumentSymbol#selectionRange selection range} for a document symbol. - * - * @see DocumentSymbol#range - * @see DocumentSymbol#selectionRange - */ - @Beta - @Singleton - public static class DocumentSymbolRangeProvider { - @Inject - @Extension - private DocumentExtensions _documentExtensions; - - /** - * The range enclosing this symbol not including leading/trailing whitespace but everything else - * like comments. - */ - public Range getRange(final EObject object) { - Location _newFullLocation = this._documentExtensions.newFullLocation(object); - Range _range = null; - if (_newFullLocation!=null) { - _range=_newFullLocation.getRange(); - } - return _range; - } - - /** - * The range that should be selected and revealed when this symbol is being picked, e.g the name of a function. - */ - public Range getSelectionRange(final EObject object) { - Location _newLocation = this._documentExtensions.newLocation(object); - Range _range = null; - if (_newLocation!=null) { - _range=_newLocation.getRange(); - } - return _range; - } - } - - /** - * Determines whether a document symbol can be marked as {@link DocumentSymbol#deprecated deprecated}. - * - * @see DocumentSymbol#deprecated - */ - @Beta - @Singleton - public static class DocumentSymbolDeprecationInfoProvider { - public boolean isDeprecated(final EObject object) { - return false; - } - - public boolean isDeprecated(final IEObjectDescription description) { - return false; - } - } - - @Inject - private DocumentSymbolMapper.DocumentSymbolNameProvider nameProvider; - - @Inject - private DocumentSymbolMapper.DocumentSymbolKindProvider kindProvider; - - @Inject - private DocumentSymbolMapper.DocumentSymbolRangeProvider rangeProvider; - - @Inject - private DocumentSymbolMapper.DocumentSymbolDetailsProvider detailsProvider; - - @Inject - private DocumentSymbolMapper.DocumentSymbolDeprecationInfoProvider deprecationInfoProvider; - - /** - * Converts the {@code EObject} argument into a {@link DocumentSymbol document symbol} without - * the {@link DocumentSymbol#children children} information filled in. - */ - public DocumentSymbol toDocumentSymbol(final EObject object) { - DocumentSymbol _documentSymbol = new DocumentSymbol(); - final Procedure1 _function = (DocumentSymbol it) -> { - final String objectName = this.nameProvider.getName(object); - if ((objectName != null)) { - it.setName(objectName); - } - final SymbolKind objectKind = this.kindProvider.getSymbolKind(object); - if ((objectKind != null)) { - it.setKind(objectKind); - } - final Range objectRange = this.rangeProvider.getRange(object); - if ((objectRange != null)) { - it.setRange(objectRange); - } - final Range objectSelectionRange = this.rangeProvider.getSelectionRange(object); - if ((objectSelectionRange != null)) { - it.setSelectionRange(objectSelectionRange); - } - it.setDetail(this.detailsProvider.getDetails(object)); - it.setDeprecated(Boolean.valueOf(this.deprecationInfoProvider.isDeprecated(object))); - it.setChildren(CollectionLiterals.newArrayList()); - }; - return ObjectExtensions.operator_doubleArrow(_documentSymbol, _function); - } -}