Daniel Sun created GROOVY-12448:
-----------------------------------
Summary: Wire Groovy Console and groovysh to the in-process
language engine
Key: GROOVY-12448
URL: https://issues.apache.org/jira/browse/GROOVY-12448
Project: Groovy
Issue Type: Improvement
Reporter: Daniel Sun
h2. Context
GROOVY-12411 added {{groovy-lsp}} and an in-process {{GroovyLanguageEngine}}.
That work left Groovy Console and groovysh unconnected. This change attaches
those two hosts to the same engine so an unsaved buffer can be queried for
diagnostics, completion, hover, and signatures without generating class files.
Scripts still run through {{GroovyShell}} in the console and {{GroovyEngine}}
in groovysh.
h2. User-visible behavior
* *Groovy Console.* The editor compiles the unsaved buffer in the background
and highlights compiler diagnostics. {{Ctrl+Space}} offers compiler-backed
completions. Adding a jar or directory to the classpath is picked up on the
next compile.
* *groovysh.* Tab completion and tail-tip descriptions consult the compiler for
the current buffer (imports, types, methods, and binding variables). Syntax
tail-tips report diagnostics and do not evaluate the line. {{/grab}} remains
the way to add Maven artifacts; the next completion or tail-tip notices the
loader change.
h2. Design
* {{groovy-console}} and {{groovy-groovysh}} take an {{implementation}}
dependency on {{groovy-lsp}}.
* Adapters stay in the host trees: {{ConsoleLanguageHost}} (buffer URI
{{groovy-buffer:console}}) and {{GroovyshLanguageSession}} (buffer URI
{{groovy-buffer:repl}}). The engine does not assign those names. Both adapters
are {{{}@Internal{}}} and are not an embedding API.
* Queries return JDK records. Host source does not import LSP4J. Feature
services inside {{groovy-lsp}} still use LSP4J types, so LSP4J remains a
runtime dependency of these hosts.
* Positions are 0-based UTF-16.
* The compile fingerprint includes {{URLClassLoader}} URLs, so an in-place
{{addURL}} (console classpath menu, groovysh {{/grab}}) is visible on the next
compile.
* groovysh composes {{GroovyEngine.getBuffer()}}, declaration-only binding
types for names the buffer does not already introduce, and the current line.
Those names come from the compiled AST ({{GroovyLanguageEngine.declaredNames}}).
* groovysh {{SYNTAX}} tail-tips return compiler diagnostics and do not fall
through to Inspector {{checkSyntax}}, which evaluates. {{METHOD}} signatures
use the full {{CmdLine.line}} so an unclosed opening parenthesis is visible.
Inspector is used only when the compiler has no signatures.
h2. Out of scope
* Replacing SmartDocumentFilter or the nanorc highlighter with semantic tokens.
* Driving AstBrowser from an LSP snapshot.
* A public embedding API for the adapters.
* Splitting a protocol-free engine module out of {{groovy-lsp}}.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)