Cider: CIDER не показывает документы для Java

Созданный на 17 апр. 2018  ·  17Комментарии  ·  Источник: clojure-emacs/cider

Ожидаемое поведение

image

Фактическое поведение

image

Информация о среде и версии
Информация о версии CIDER
;; Подключен к серверу nREPL - nrepl: // localhost : 59990
;; Снимок экрана CIDER 0.17.0 (пакет: 20180413.51), nREPL 0.2.13
;; Clojure 1.8.0, Java 9.0.4
Версия Lein / Boot
BOOT_CLOJURE_NAME = org.clojure / clojure
BOOT_CLOJURE_VERSION = 1.8.0
BOOT_VERSION = 2.7.2

Версия Emacs
27.0.50

Операционная система
macOS

bug stale

Все 17 Комментарий

Как видите, символ также ошибочно разрешен для java.lang.Character / toUpperCase вместо lang.String.

Не появляется ли подсказка с вопросом, какую версию выбрать?

@bbatsov Странно, но сегодня это так (что намного лучше 😂):
image

Я проверил и получаю подсказку, когда использую горячую клавишу по умолчанию (в Spacemacs это , h h в плохом-нормальном состоянии), но не тогда, когда я использую эту горячую клавишу, которую я настроил сам:

(key-chord-define-global "fd" '(lambda () (interactive "")
                                   (cond
                                    ((or (eq evil-state 'normal) (eq evil-state 'visual)) (execute-kbd-macro (kbd "<escape> , h h")))
                                    ((eq evil-state 'insert) (execute-kbd-macro(kbd "<escape> l , h h i"))))))

Эта горячая клавиша каким-то образом пропускает подсказку и просто показывает документы для персонажа.

Кстати, подсказка eldoc также может использовать некоторую работу, например, разделение между аргументами разных методов:
image

Хорошего разделения придумать не удалось, поэтому просто смешали подписи всех возможных версий. Это идеально, но, к сожалению, я тоже не вижу, как это можно улучшить. Eldoc должен иметь строковую структуру ver, в противном случае выделение параметров там прервется.

@bbatsov Я только что перезапустил свой Emacs, и Javadocs снова пропали. :(
image

Интересно, что-то изменится для вас, если вы попробуете Java 8 вместо 9. У меня не было много времени, чтобы поиграть с Java 9, и мне интересно, не работает ли некоторая часть манипуляций с путями, которые мы делаем, там или что-то в этом роде. Также - убедитесь, что буфер кода был оценен, прежде чем пробовать eldoc / cider-doc).

@bbatsov Я перешел на Java 8 и до сих пор не испытывал никаких проблем (но с тех пор я мало кодировал, так что кто знает).
И я только что понял, что это вы говорите ^ __ ^ Почему-то ваш аватар показался мне таким агрессивным, и это меня удивило :)) Спасибо за вашу работу;) Я сейчас смотрю ваше выступление Clojure Bad Parts 😊

Ха-ха!

И я подумал, что это мое счастливое лицо! 😄

Привет, (здесь новичок в emacs / сидре)

Где в общей сидре / ДОРОЖНОЙ КАРТЕ позиционируется эта ошибка?

Это больше

  • ни у кого нет времени над этим работать
  • это будет решено садом / садом
  • это работает как задумано
  • это не должно работать прямо сейчас?

Каждый раз, когда я трачу некоторое время на изучение clj / emacs, я в конечном итоге хочу найти какой-нибудь класс и разочаровываться - это полностью на мне, но я все время спрашиваю себя:

Моя установка неправильная или сломанная, или "настоящим" разработчикам Clojure никогда не нужно искать javadoc - что было бы для меня весьма озадачивающим.

Мой тестовый пример - поиск через cider-doc java.util.concurrent.PriorityBlockingQueue что приводит к https://imgur.com/a/TaQXfpS .


Вкратце: это просто сломано для меня или для всех, и как люди справляются без этого?

PPS: я пробовал с java 8-11 с установленными java-doc и java-src


Выходы:

в классе

java.util.concurrent.PriorityBlockingQueue
   Extends: java.util.AbstractQueue
Implements: java.util.concurrent.BlockingQueue
            java.io.Serializable

Not documented.

For additional documentation, see the Javadoc.

Definition location unavailable.

по методу

java.util.concurrent.PriorityBlockingQueue/add
 [this java.lang.Object]
Not documented.

For additional documentation, see the Javadoc.

Definition location unavailable.

Прогресс !

Я думаю происходит следующее


Предпосылка: я использую spacemacs, в котором используется сидр от MELPA, в настоящее время 0.20.0 + cider-nrepl 0.20.0

cider-nrepl 0.20.0 использует фруктовый сад 0.3.1


Проблема:

orchard обнаруживает источники Java с помощью jdk-sources -> jdk-resource-url и критически -> jdk-root

(def jdk-root
  "The JDK root directory (parent of the `java.home` JRE directory)"
  (-> (io/file (System/getProperty "java.home"))
      (.getParentFile)))

(https://github.com/clojure-emacs/orchard/blob/v0.3.1/src/orchard/java.clj#L47)

В моей системе (archlinux) и в пакете ubuntus openjdk-11-jre-headless_11.0.1+13-2ubuntu1_amd64 кажется, что javas расположены в виде папок под /usr/lib/jvm

т.е.

# ~/Downloads/openjdk-11-jre-headless_11.0.1+13-2ubuntu1_amd64/data $ tree usr/lib/jvm/ -L 2
usr/lib/jvm/
├── java-1.11.0-openjdk-amd64 -> java-11-openjdk-amd64
└── java-11-openjdk-amd64

или Archlinux

# ~ $ tree /usr/lib/jvm/ -L 2
/usr/lib/jvm/
├── default -> java-11-openjdk
├── default-runtime -> java-11-openjdk
├── java-11-openjdk
├── java-8-openjdk
└── java-default-runtime -> default

в демонстрационной версии emacs / cider repl java.home - это то есть:

(System/getProperty "java.home") 
; =>  /usr/lib/jvm/java-11-openjdk

_Я не знаю, передает ли это что-то извне или это текущий дом java по умолчанию.

если я не ошибаюсь, это будет означать, что в моей системе jdk-root

(-> (io/file (System/getProperty "java.home"))
      (.getParentFile))) 
; => /usr/lib/jvm/

в результате jdk-resource-url ищет что-то в неправильной (родительской) папке


Заключение:

jdk-roots "Корневой каталог JDK (родительский для каталога java.home JRE)" кажется неправильным (я быстро проверил онлайн и, похоже, не существует "стандартного", как какой java. дом действительно должен быть)

Это кому-нибудь поможет?

Да, помогает! В java 8 системное свойство java.home указывает на JRE в корне JDK. Это ожидается согласно https://docs.oracle.com/javase/7/docs/technotes/tools/linux/jdkfiles.html. Я не могу найти ссылку на javase / 8, но эмпирически наблюдаю (на Debian):

user=> (System/getProperty "java.home")
"/usr/lib/jvm/java-8-openjdk-amd64/jre"

Начиная с java 9 и далее подкаталог JRE отсутствует, а его содержимое объединяется на один уровень выше в корень JDK, на который теперь указывает java.home :

user=> (System/getProperty "java.home")
"/usr/lib/jvm/java-11-openjdk-amd64"

(см. https://docs.oracle.com/en/java/javase/11/install/installed-directory-structure-jdk.html)

Помимо пользователей дистрибутивов, производных от Debian, пакет openjdk-11-source устанавливает неработающую символическую ссылку на src.zip (см. Https://bugs.launchpad.net/ubuntu/+source/openjdk-lts / + bug / 1791219)
После установки у меня есть:

$ pwd
/usr/lib/jvm
$ ls -l java-11-openjdk-amd64/src.zip
lrwxrwxrwx 1 root root 21 Nov 20 04:13 java-11-openjdk-amd64/src.zip -> ../openjdk-11/src.zip
$ find openjdk-11 -type f
openjdk-11/lib/src.zip

Кажется, фруктовый сад должен проверить оба места и проверить, читается ли src.zip . Также было бы неплохо напечатать предупреждение о подавлении для STDERR, если нет.
Я буду рад отправить PR, если это звучит разумно.

А пока вы можете найти свою копию src.zip и добавить ее в путь к классам вручную, например, используя запись :local/root deps.edn (если вы оказались на tools.deps https: / /clojure.org/reference/deps_and_cli#_dependencies).

хм, кажется, что цепочка вызовов jdk-sources -> jdk-root вызывается только в загрузчике загрузочного класса, иначе это (.getContextClassLoader (Thread/currentThread)) ,

Я принудительно заархивировал путь к классам с помощью project.clj

:profiles {:repl {:resource-paths ["/usr/lib/jvm/default/lib/src.zip"]}}

и проверил через

> (System/getProperty "java.class.path") ; in repl buffer
; "/home/_/Projekte/repos/temp/test/test:/_/patrik/Projekte/repos/temp/test/src:
   /usr/lib/jvm/default/lib/src.zip:  <snip>

все еще нет документа

Похоже, что на Java 11 это не работает, пока https://github.com/clojure-emacs/orchard/issues/20 не будет исправлен.
Однако Java 8 должна работать. Вам понадобятся как src.zip и tools.jar в пути к классам, которые должны добавляться автоматически. Тогда вы можете попробовать что-то вроде следующего (на сидре v0.21.1):

(clojure.java.io/resource "java/util/AbstractQueue.java")
;; => #object[java.net.URL 0x2e00bc76 "jar:file:/usr/lib/jvm/java-8-openjdk-amd64/src.zip!/java/util/AbstractQueue.java"]

(require '[mranderson049.orchard.v0v4v0.orchard.java.parser :as ojp])

(keys (ojp/source-info 'java.util.AbstractQueue))
;; => (:class :doc :line :column :members :file :path)

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад и понимание!

@jeffvalk недавно обратился к связанной проблеме Orchard, так что я думаю, мы можем закрыть ее.

В Debian 10 все, что мне нужно было сделать, это установить openjdk-11-source . Я попытался создать символическую ссылку на src.zip и обнаружил, что она уже была создана.

В Ubuntu 18.04 с Emacs 26.3 CIDER 0.24.0 nREPL 0.6.0 Java 1.8.0_242 я добавил каталог, содержащий zip-архив с исходными кодами Java, в качестве ресурса в профиль Leiningen ( ~/.lein/profiles.clj ):

{:user {:resource-paths ["/usr/lib/jvm/openjdk-8"]}}
Была ли эта страница полезной?
1 / 5 - 1 рейтинги