Eclipse Java помощник по содержимому не работает для файлов с лямбда-выражениями - PullRequest
2 голосов
/ 11 февраля 2020

Мой вопрос:

Что можно сделать, чтобы не допустить взлома помощника по содержимому при записи файлов большего размера , которые содержат лямбда-выражения?

Проблема (описание):

В течение некоторого времени помощник по содержимому Eclipse для Java перестал работать должным образом для больших файлов в моей среде IDE при использовании лямбды выражения. Я никогда не сталкиваюсь с этой проблемой при написании файлов меньшего размера, но когда я пишу файлы с 1500–2000 + строками кода, это похоже на то, что помощник по контенту неожиданно сдается и становится нестабильным. Когда я активирую помощник по контенту рядом с В верхней части файла проблем нет:

content-assist working

На приведенном выше рисунке помощник по содержимому работает точно так, как я ожидаю. Однако, когда я активирую помощник по содержимому ближе к нижней части, он перестает отвечать на запросы (не активируется, когда я набираю .), а активация его вручную с помощью ctrl + space вызывает пустой список:

content-assist not working

Для этого конкретного файла помощник по содержимому перестает работать в любой части файла после строки 1540, то есть сразу после лямбда-выражения. Удаление лямбда-выражения не решает проблему, но вместо этого распространяет его дальше по файлу к следующему лямбда-выражению.

Следующее сообщение также отображается на панели инструментов, когда это происходит:

toolbar message

То, что я пробовал:

  • Использование чистой Eclipse IDE с существующим рабочим пространством, а также новым рабочим пространством .
  • Очистка кэша индекса в workspace/.metadata/.plugins/org.eclipse.jdt.core.
  • Включение всех видов предложений в Preferences > Java > Editor > Content Assist > Advanced.
  • Восстановление значений по умолчанию на странице настроек, только что упомянутой выше.
  • Увеличение объема памяти, выделенной для Eclipse IDE, на eclipse.ini до 2 гигабайт, а также увеличение объема памяти, первоначально выделенного до 1 гигабайта.
  • Добавление -vmargs -Dorg.eclipse.jdt.ui.codeAssistTimeout=60000 к eclipse.ini

Edit # 1

Как уже упоминалось, проблема возникает только для больших файлов Java. Ниже приведен рисунок меньшего файла Java с 3 различными лямбда-выражениями и помощником по содержимому, как и ожидалось: См. Edit # 2

Edit # 2

Ниже приведен Java SCF для воспроизведения проблемы. Я старался изо всех сил, чтобы сделать его как можно меньше. В этом случае проблема возникает при использовании лямбда-выражения в сочетании с for-l oop, но я думаю, что возможно воспроизвести проблему и с другими управляющими операторами.

import java.util.ArrayList;
public class Foo {
    public Foo() {
        foo(() -> {
            final ArrayList<Object> list = new ArrayList<>();
            for (final Object o : list)
                ;
            /* works until here */ } /* no longer working */
        );
    } // <--- content assist works again after end bracket of constructor/method
    void foo(final Runnable r) { r.run(); }
}

Примечания:

  • Заключение этой проблемы в фигурные скобки для l oop.
  • Эта проблема возникает только с for-each вариант цикла for; использование варианта for(;;) устраняет проблему.
...