Skip to content

Lua 5.3 parser, semantic analysis, JVM interop, and LSP — full feature wave - #2

Merged
dingyi222666 merged 595 commits into
mainfrom
windows-verify
Oct 20, 2026
Merged

dingyi222666 merged 595 commits into
mainfrom
windows-verify

Conversation

@dingyi222666

Copy link
Copy Markdown
Owner

Summary

Consolidates the full multi-month feature wave on windows-verify into main (358 commits, ~1018 files):

  • Parser: Lua 5.3 + AndroLua 5.3 grammar, error recovery, comments/trivia preservation
  • Semantic: SemanticPipeline / SemanticModel / SemanticAnalysisResult public API; legacy SemanticAnalyzer surface retired
  • Workspace: LuaWorkspaceEngine + LuaWorkspaceQueryFacade — module resolution, require/import graphs, cross-file queries
  • JVM interop: JvmWorkspaceEngine reflects JVM/Android classes into synthetic Lua modules; metadata keys jvm.classes, androlua.imports, jvm.classpath, jvm.androidJar, jvm.importPrefixes
  • LSP: lsp4j-based server (runLuaLanguageServer) — diagnostics, hover, completion, goto-definition, workspace symbols, rename, signature help
  • Docs: full docs/ tree — production readiness, Android-Lua matrices, interop model, language-server usage, test strategy
  • Verification: serialized full jvmTest run green (TASK-043, run 29228040252: 5386 tests / 0 failures); README simplified to remove machine-specific paths and finished orchestration notes

Test plan

  • Full serialized jvmTest suite green (5386 tests, run 29228040252)
  • JS compile green
  • E2E rel60 7/7, Monaco smoke verified on final tree
  • Post-merge: CI on main

LuaJava converts a simple Lua table into the vararg component array at
runtime (ObjectAnimator.ofFloat(target, name, float...) called with
{30, 0}), so call ranking keeps vararg signatures viable for TableType
arguments and soft chain recovery accepts table-shaped arguments that
land on a vararg slot. Fixed T[] parameters keep the conservative
TASK-658 container gate.
Lua functions stored as table/module fields (function M.f(), require
export members) completed with FIELD/TEXT kinds, so Monaco rendered
them with the plain text icon. Callable type displays now surface as
CompletionItemKind.FUNCTION across member, lexical, export, and
unknown-symbol paths; value members and JavaBean aliases stay FIELD.
Overlay library expectations updated from FIELD to FUNCTION for
callable members (math.abs, string.*, table.*, coroutine.*).
ALy layout tables are Lua tables whose string keys apply view setters
(loadlayout.lua: k -> view.setCap(k)(value)), so completing a key inside
{ ListView, ... } now suggests the enclosing view class's Lua properties
derived from its reflected set* methods, plus the runtime-special keys
(id/style/onClick/src/items) and the ViewGroup.LayoutParams keys
(layout_width/height, margins, weight, gravity, x/y). The class is
tracked through nested child tables like the ids collector; positions
inside value expressions and non-layout tables keep the regular
completion pipeline. The existing loadlayout ids-table binding
(tab.poplist -> ListView) is regression-covered.
…mbedder metadata

The layout-class walk now keeps the class identifier as written in the
table (LuaLayoutClassMatch), so workspace metadata under
'lua.layout.properties' can contribute extra Lua property keys per class
('ClassName: prop|detail, ...') for project-defined custom views and
AndroLua helpers; extension-class identifiers qualify as layout class
slots even outside the known-view-name heuristics, and extension entries
are matched by source name or Java simple name. .aly layout documents
already parse via the bare-table return wrap, so key-position
completions work there unchanged; both are regression-covered.
Layout-table property values now complete from loadlayout.lua's value
domains: orientation/gravity/visibility/ellipsize/scaleType/inputType/
imeOptions and the rest of the toint keyword table, RelativeLayout rules
as true/false, and layout_width/height sizes incl. -1/-2 and %w/%h
percent forms. Because mid-typing quotes are unterminated (the lexer
emits BAD_CHARACTER, no STRING token), the workspace facade detects the
open quote from the raw source line and answers from the same domains.
require(...)/import "..." strings anywhere in Lua code complete
workspace module names (dotted and basename forms) via the new
WorkspaceModuleResolver.completionModuleNames.
AndroLua .aly layout modules are Lua table files; the demo language
mapper only matched .lua, so .aly tabs opened as plaintext, and the
static mime table served them as octet-stream. Map .aly to the lua
language id (enabling built-in highlighting plus the registered
hover/completion providers) and serve it as text/plain.
An empty property value (layout_gravity = "") produced no indexed
string node — the position index drops zero-content spans — so the
caret between the quotes fell through to property-key suggestions.
Recover through the enclosing table key whose string value range covers
the caret and answer from the same loadlayout value domains. Size values
now lead with the AndroLua-idiomatic wrap/fill/match/-1/-2 forms.
Four-agent adversarial audit findings, applied:

- Soft vararg-arg recovery now accepts only TableType, matching the
  strict checker gate, so chain recovery can no longer invent a return
  type for a ModuleType/ArrayType call the checker rejects.
- Layout view-class resolution tries the document's active imports
  before android.widget/android.view, so a project class shadowing a
  platform simple name wins; derived suggestion lists are memoized per
  class (allInstanceMembers walks the whole hierarchy per keystroke
  otherwise); setter candidates require SetXxx shape (setup() is not a
  setter).
- Provider: outermost-table computation no longer degenerates when the
  caret node is itself a table; named-key value positions keep the
  regular completion pipeline instead of property keys.
- Facade unterminated-string fallback only fires for table-entry keys
  (line start / after { or ,), not local-variable assignments whose
  name collides with a domain key.
- Layout metadata: duplicate class lines merge; FQCN keys also register
  under their simple name.
- LSP wire: didChangeConfiguration/initialize settings now accept
  lua.layout.properties (flat or nested lua section) — previously the
  embedder metadata key had no path from any client; the null snapshot
  contract for unrecognized settings is preserved.
- Import-surface callables complete as FUNCTION instead of TEXT.
- Overload-hover parent walk is hop-bounded.
- Tests: require/import completion asserted without lexical-fallback
  masking (unique needle, exact module names, no jar gate); class-slot
  caret keeps lexical completions; LuaLayoutPropertiesMetadata parser
  corpus (merge, FQCN alias, malformed lines) in commonTest.
Adversarial-review follow-up: Monaco's quickSuggestions.strings default
is off, so every string-literal value completion shipped dead — values
only appeared via explicit Ctrl+Space. Enable string suggestions,
register the quote as a trigger character, and extend the client's
replacement range across ./% continuations so dotted module names and
percent sizes insert without duplicating the typed prefix. Smoke now
maps .aly to the lua language id and asserts an .aly empty-string value
completion over the real bridge+LSP protocol.
- documentHighlight filters cross-file locations (DocumentHighlight has
  no URI; require-backed member locations rendered as garbage ranges).
- onTypeFormatting and codeAction are no longer advertised: the handler
  reformatted the whole buffer on every d/n keystroke and the codeAction
  collector was permanently empty (fail-closed policy; tests updated).
- .aly require resolution drops the unanchored endsWith suffix match
  (mods/myutil.aly no longer hijacks require("util")).
- Export collector: scalar overwrite retires stale nested tables.
- Parser: switch/case/default/when ranges start at the keyword; the
  truncated-member fallback Identifier gets its parent set.
- Evaluator: a nested non-vararg function no longer inherits the
  enclosing vararg element type.
- Engine: metadata-only deltas re-analyze the workspace (layout
  completion extensions are baked per model at analysis time).
- Build: lsp4j is api() (public LuaLanguageService surface) and jvm
  adds -Xjvm-default=all-compatibility so SemanticModel default methods
  do not break Java embedders.
…fication

Signed commit retry failed in headless pinentry; committed unsigned.

Fixer 1 (binder, verified green): non-local function inside a nested
block binds at root scope; local x + function x() re-binds the existing
local; lambda declarations get a FUNCTION scope and bound parameters.
Parser-side fixes did NOT pass verification and were reverted (diff at
tasks/agent-runs/parser-compound-assign-diff.backlog.diff).

Fixer 2 (LSP, verified green): didChange publishes diagnostics for all
affected open documents; ranged didChange without didOpen bases on the
indexed source; semanticTokensCache evicts on close/delete;
selectionRange drops null slots; resolveCompletionItem carries
labelDetails/insertTextMode; colon completion filters non-callable
fields; capability docs regenerated.

Main session: contravariant function-signature assignability with arity
containment; layout value insert-range prefix guard; demo bridge shares
one JVM LSP across clients; metadata deltas re-analyze all documents.
…agnostics policy

Parser: compound assignment (+=" -= *= /= //=) desugars to a plain
assignment with a BinaryExpression RHS; the previous attempt failed
because the *=" token was never consumed before parsing the RHS
(recovery placeholder + AST2Lua Unsupported node). Tests cover shape,
round-trip, member/index targets, strict mode.

Diagnostics policy: unused locals publish as INFORMATION instead of
being dropped unconditionally (still suppressed while the analyzed
snapshot is stale); checker.luajava.target.unresolved is WARNING (a
missing classpath is an environment gap, not a code error); index-path
member diagnostics name the offending key; null/zero-width diagnostic
ranges fall back to a real 1-char span.

Type system: function-signature parameter comparison is contravariant
with arity containment (audit specs to follow for overload dedup,
metadata carry, CustomType match).
…bridge hardening

Types (per spec-agent review): CHAR excluded from the Java numeric
widening rank; JavaSignatureMetadata carried through TypeNormalizer
(varargs spread survives unionTypeOf capture); OverloadedFunctionType
dedupes exact duplicates and signatures subsumed by an earlier kept
one; CustomType and ClassType interoperate by name. Function-parameter
assignability refined after regression audit: a non-vararg source
serves a vararg target (Lua drops extra args), and Java class-typed
parameters are bivariant (Android handlers annotate the concrete
widget while the interface declares the superview).

Tools: the shared-LSP bridge is now single-active-client (a second
connection receives a busy status; the initialize queue, id
collision, and cross-tab didOpen fights are impossible by
construction); the closing-quote trigger spam and insert-range guard
tradeoffs documented in README. Colons keep unknown-typed fields.
…ubsumption, interop robustness, stub accuracy

Types: overload deletion uses STRICT contravariant subsumption (a
dedicated isAssignableForOverloadSubsumption) — reusing the
assignment-relaxed relation deleted vararg siblings that variadic
calls still needed and bivariantly deleted overloads that later calls
still matched. CHAR widening per JLS: byte/short to char requires a
cast, char to int and above widens.

Interop: import-target classloaders are cached (no URLClassLoader leak
per keystroke); per-class reflection failures degrade to a cheap shell
instead of aborting the workspace update; class member surfaces are
bounded (400, deterministic order) with hash-based collision dedupe;
host-android-jar soft fallback now requires deliberate configuration.

Overlays: lua54 io./global drift restored; debug/string/coroutine/
table/math/utf8/os return shapes corrected against the Lua manuals;
AndroLua context gains setContentView/getMenu/getSystemService; phantom
hex encode/decode removed; loader parses bracket-style @field entries.

Tools/workspace: personal QQ contact line scrubbed; bridge busy reason
no longer overwritten by a generic Initialize failed; 4 MiB WebSocket
payload cap; SIGKILL escalation after SIGTERM grace; static stream
error guard.
…, visible skips

LSP: didClose now republishes diagnostics for affected open dependents
(they were re-analyzed against the closed file's disk text but kept
pre-close markers); the multi-response list flows through the
text-document service.

Comments: inline ---@type extraction scans only doc comments, so a
---@type inside a --[[ ]] block comment no longer leaks into the next
statement's type.

Demo: closing a tab with unsaved edits asks for confirmation instead of
silently discarding them.

Tests: layout-completion androidJar gates converted to Assume.assumeTrue
so skips are visible in reports instead of silently passing.

Docs: stale TASK-043 'blocked' banners replaced with the recorded
outcome; recovery-matrix/serialized-verification/concurrency/
member-chain/import-resolution citations of suites deleted in e786c77
annotated as culled; strict-mode default corrected to opt-in;
overlay source-twin row re-pointed to the resource loader.
… demo UX backlog

Comments: a trailing inline ---@type comment no longer mis-attaches to
the NEXT statement (trailing groups attach backward only); inline @type
extraction scans only doc comments (block-comment leakage closed);
positional ---@type boolean, string splits across multi-name locals;
operator-delimited type-prefix recovery caps candidate attempts.

Binder: local-statement initializers are visited before the new
declarations are registered, so
invents a global for the body write instead of rebinding the in-flight
local.

Demo: completion/hover stale-response race guarded by per-provider
sequence counters; closing-quote trigger dropped (in-string completion
is covered by quickSuggestions.strings); markers cleared on disconnect;
log autoscrolls only when already at bottom; README documents the
single-editor-session policy and string-completion behavior.
…ne iteration guards, binder visibility, stub accuracy

Engine: SCC-aware cycle re-analysis pass (cycle members re-bind against
completed peers instead of null providers); iterative Tarjan + iterative
dependency DFS (stack-overflow guards for deep require chains);
5000-chain regression test.

Binder: locals gain visibleFrom (statement-end anchored at the last
initializer character) — the initializer of local x = 1 no longer
resolves to the new x while the declared name stays hoverable; AST
globals are position-independent (file-global environment semantics);
the declared-name span is always visible at its own site. Visibility
predicates updated in ReferenceQueries, SignatureHelpProvider, and
ExpressionUsageChecker.

Interop: import-target classloaders cached (no per-keystroke
URLClassLoader leak); per-class reflection failures degrade to a shell
instead of aborting the update; member surfaces bounded and
hash-deduped; host-jar soft fallback gated on deliberate config.

Overlays: lua54 drift restored, debug/string/coroutine/table/math/utf8/
os return shapes corrected, AndroLua context methods added, phantom hex
members removed, bracket @field parsing.

Tests/docs: Assume-gated skips visible; stale doc claims corrected
(TASK-043 outcome, culled suites, strict-mode default).
…demo providers, binder redo verified

Printer (CRITICAL): AST2Lua now emits exactly one terminal end per
if-statement — formatting any file containing an if used to delete the
end and corrupt the buffer; formatSourceText re-parses its own output
and falls back to the safe normalization when the printed text does not
re-parse. Pinning test flipped, round-trip corpus added.

Demo: documentSymbol (hierarchical + flat shapes), foldingRange, and
semanticTokens providers wired to the already-advertised capabilities
(legend captured at initialize, semanticHighlighting enabled, theme
rules added); file-list refresh prunes ghost tabs; README documents
outline/folding/semantic-color behavior.

Binder redo verified by round-F audit with two predicate refinements
applied: the declaration-name span is always visible at its own site,
and AST globals are position-independent. Types: overload deletion uses
the strict subsumption relation (vararg/bivariance assignment
relaxations are unsound for deletion); CHAR widening per JLS;
CustomType/ClassType name interop; JavaSignatureMetadata survives
normalization.
…n dedup, demo polish

Engine: the cycle re-analysis pass is a bounded fixpoint (up to 3
sweeps with a deterministic snapshot fingerprint), so 3-cycles with
chained derivations converge to concrete types instead of freezing
Unknown mid-chain; identical metadata deltas are a true no-op (same
snapshot instance, zero re-analysis); deleting the last recognized
configuration key now clears prior metadata instead of persisting it
forever.

Types: union normalization collapses doc-declared and reflected twins
of the same Java member (the metadata carrier wins), and the legacy
hierarchy's function-parameter compatibility mirrors the new
contravariant + containment rule so both hierarchies agree.

LSP docs: the callHierarchy row now states prepare resolves same-file
local functions only.

Demo: semantic highlighting uses the correct
semanticHighlighting.enabled option key (the plain key silently
disabled the whole feature); folding ranges convert LSP 0-based lines
to Monaco's 1-based (first-line folds were dropped, others shifted);
the semantic tokens provider disposes before a legend-less
reinitialize and validates 5-int grouping; ghost-tab pruning skips
when the file list came from a fallback instead of the live fetch.
…use, resolver re-pointing, loop-header scoping

Engine: provider global declarations join the public fingerprint
(GLOBAL+AST lines, capped, evaluator-derived type display names), so
editing a provider's non-exported global now dirties consumers;
single-file edge-neutral upserts reuse the previous module graph
instead of rebuilding it every keystroke; every stored document's
workspace context is re-pointed at ONE resolver built over the final
snapshot (no more generation-chain retention of mid-update maps), with
baseResolve* fallbacks preserving JVM target resolution.

Binder: numeric/generic for-loop scopes start at the BODY, not the
header — 'for i = 1, #i do' evaluates the header in the enclosing
scope per Lua scoping while control-variable declarations keep their
header anchors (hover/rename on the name intact via the in-span
visibility rule). Single-change redo of the reverted wave-D attempt:
no position-index fallback hack.
…-import diagnostics

Wildcard-mounted classes (import "android.widget.*") now expose the
same inherited static surface as explicit imports (TextView.VISIBLE
from View works through the wildcard); package aliases key on the full
package name so android.widget.* and android.support.v7.widget.* no
longer collide, and explicit imports beat wildcard members in both
document orders; import(a.*, b.*) collects every string argument; a
wildcard import whose package mounts nothing (typo, case mismatch,
absent jar) now emits the unresolved-target WARNING instead of dying
silently (documented deviation: .* targets stay out of jvmClassLoads
per locked facts tests — the engine scans sourceImports for the
diagnostic instead).
…y memo, resolver generation reuse

Import precedence: a document's own wildcard imports now rank ahead of
the default android prefixes in REVERSE document order (AndroLua
installs imports into _G sequentially, so the last import wins);
defaults remain the fallback for names no import covers.

Performance: reflective classpath discovery (env reads + SDK root
directory walks previously re-run per cache-key build) is memoized per
provider; one WorkspaceModuleResolver is shared across all files of an
analysis pass (path-keyed caches survive, killing the
O(wildcardMembers x extraProviders) per-file scans), with a fresh
generation per cycle-reanalysis sweep so sweep recomputation semantics
stay exactly as before.
…sType declaration identity

checker.global.unresolved (WARNING): reads of identifiers that resolve
through NO surface (no visible local/AST-global/builtin, no import
symbol, no import root) now diagnose, with the AndroLua-corpus-tuned
suppression set: uppercase-first runtime globals, _-prefixed names,
write-covered names, .aly layout documents (runtime-injected ids), and
an allowlist for overlay-missing runtime helpers (apply/int/long).
Demo corpus: exactly one flag — the real free 'h' typo in dingyi.lua.
parent (loadlayout-injected) seeded into the AndroLua globals.

Types: ClassType carries declarationId (resolver-populated, carried
through normalize/substitute), isSameOrSubclass walks superClass AND
raw superType (parent materialization failures no longer break
inheritance matching) with a visited set, and same-named distinct
declarations no longer unify (identity-gated matching; null ids keep
name matching for synthetic/overlay shells).
… identity-gate revert, publish hygiene

Workspace symbols: entry list memoized per facade (one sort/distinct per
workspace build instead of per query under the global lock), capped at
500 after the deterministic sort, body-locals dropped from the
navigable surface (chunk-level symbols only), unindexed __jvm__
providers filtered, pre-initialize symbol requests now quiet-empty
matching text requests, and workspaceSymbol/resolve pre-empted against
the lsp4j UnsupportedOperationException default.

Types (adversarial audit F1 applied): the declarationId identity gate is
REVERTED — binder ids are per-document counters, not workspace
identities, so gating rejected the same logical class across require
boundaries and could falsely unify equal-id distinct classes. Name
matching stays authoritative; the audit-verified superType fallback
(parent materialization failures) and the visited-set walk are kept.

Checker: the AndroLua runtime-helper allowlist (apply/int/long...) is
flavor-gated on the AndroLua overlay so plain-Lua workspaces keep
diagnosing typos of user globals with those plausible names.

Build (publish audit HIGHs): kotlin("test") removed from commonMain —
the published 1.0.3 POM shipped a testing framework as a runtime
dependency; version bumped to 1.0.4 (1.0.3 is burned on Central with
different content).
…e, cycle cap, publish bound

Graph reuse: require/import fact RANGES join the facts signature, so
inserting a line above a require rebuilds the graph instead of reusing
one with stale ranges (latent — no query reads them yet).

Binder/completion: a caret in the tail of a for-loop body (after the
last statement, before end) promotes the loop scope for free-position
completion queries — end-exclusive body ranges previously dropped the
control variable there; header positions keep the outer-binding
contract.

Engine: the cycle re-analysis fingerprint is capped (512 declarations,
256-char fields) matching the provider fingerprint.

LSP: the published diagnostic payload is bounded (300, post-dedup) —
a typo-heavy file could emit hundreds of per-site unresolved-global
warnings.

A per-name resolution memo for the unresolved-global oracle was
attempted and REVERTED: Lua scoping is position-dependent, so name-key
memoization poisoned later sites (parent/animation/list false
positives). The perf finding stands with the corrected design (memoize
only the position-independent import-resolution layer) in the backlog.
…yer memo, ClassType equality

Checker: one scopeId resolution per identifier read shared by the
unused-local bookkeeping and the unresolved-global oracle (both walked
the scope graph twice per read); the POSITION-INDEPENDENT resolution
layers (import targets, import roots) are memoized per name for the
pass — the local-scope walk stays unmemoized (a name-keyed memo there
poisons later sites; the reverted attempt is documented in 2c2c9e1).

Types: ClassType.equals/hashCode exclude declarationId (binder ids are
per-document counters; counting them stopped same-named
materialized/synthetic twins from collapsing in union dedup). The
first equals attempt recursed through copy(); rewritten as explicit
field comparison (1910-test suite confirms).
…r safety

Checker: check() clears the per-pass memos (import roots, imported
symbols, seen diagnostics) so a future double invocation on one
instance cannot suppress diagnostics for imports activated between
runs (adversarial audit hardening).

Demo: semantic-tokens requests debounce 250ms and honor Monaco's
cancellation token — every keystroke previously fired a full-buffer
token request recomputed under the server's global lock; the bridge no
longer forwards unparseable client messages as raw bytes (a Content-
Length framer desync vector) and answers with a JSON-RPC parse error
instead.
…ire coverage, symbol ranking, docs sweep

Diagnostics: dead wildcard imports (pkg.* mounting zero classes) now
diagnose at INFO — a wildcard is declarative scoping whose members may
come from workspace dex the analyzer cannot mount, a different
epistemic state from an explicit bindClass string which stays WARNING.
Demo corpus audit: exactly one INFO (support.v7 wildcard) plus the
real free-h typo catch; every other file clean.

Smoke: documentSymbol/foldingRange/semanticTokens wire coverage added
(legend bounds + %5 validation); workspace symbol results rank prefix
matches ahead of substring matches within the 500 cap.

Docs/build: java-interop-model drift corrected (JavaOverloadType,
Object superclass expansion, multi-root SDK discovery); SemanticModel
and LuaLanguageService position conventions documented (1-based parser
vs 0-based LSP); publish coordinates single-sourced at 1.0.4; workflow
env consolidated and the machine-wide java.exe taskkill replaced with
gradlew --stop; Kotlin >= 2.1 consumer floor documented.
… token debounce, demo diagnostics doc

Completion: while-loop bodies share the for-loop tail gap (their LOOP
scope is built on body.range, end-exclusive), so the free-position
promotion now accepts WhileStatement owners — the audit caught the
wave-N claim ('while tails resolve through getScopeAt') as factually
wrong. Repeat stays excluded (its until-condition is in range).

Demo: the semantic-tokens debounce now truly coalesces per model (a
WeakMap timer answers superseded calls with null and re-checks lspReady
after the wait, closing the Stop-mid-debounce ERR row) instead of
sleeping per call; README documents the intentional INFO on main.lua
and the real h-typo catch in mods/dingyi.lua.
…initialize the overlay compile (4 workers), the framework dex parse (~10s) and the first live analysis raced on the emulator's 6 TCG-emulated cores and the mutual contention inflated every cold stage (builtins 10.0s -> 16.0s across rel44-47 at identical code); the dex warmup now waits on an overlay-compile latch since the first analysis needs builtins first and the dex parse only when the first check resolves framework imports.
… measured 4 compile workers at 10.0-16.2s vs 8.8-10.3s sequential (rel43-49): the workers' allocation rate thrashes the TCG emulator's concurrent-copying GC; the injectable hook stays for real-core hosts.
…moke via remote-built distribution (printJvmLaunchClasspath + classpath-file bridge override), JS-gate regression fix, reverted facade dedup documented.
…n (remote-built dist), JS+corpus gates green; the -12,000-line target remains open (~4,580 lines) with the prioritized cut list.
…nType field, 3x CRLF line-scan loops, digit-scan twins, 28 keyword stanzas, dead block), interop (5x importedSymbolOf assemblies, class-listing walk dedup, dead public APIs, allImportTargets), lsp (dead progress lambda + fields, identity-forwarding did* overrides, statically-dead acceptsRequests policy, unused imports), workspace (re-land of the provably-identical facade merges, isSourceModulePath, fingerprint serializer dedup), checker/model (ReferenceQueries.isVisibleAt adopted onto the shared isVisibleAtPosition predicate, enclosingAstNodeOf cross-file helper, member-surface ladders). Full remote suite 2,929/0/0 + JS compile green.
…59), E2E rel52 7/7, all gates green; remaining-cut map updated.
…ss-throughs inlined, 7x scope scaffolding -> inline inScope{}, shared buildBinderPassResult, dead seeder branch/fallback), types (−125: primitive canonicalization, table/module assignability dispatch, substitution/dropper twins, resolver materialization ladders, JavaTypeName dead surface deprecated), LuaLanguageService (−102: dead reporter/fields, resolveLocalFunctionDeclaration ladder, UnitVisitor base, rename ladders, format-range re-validation, lineSequence-based LSP range), comments (−22), LuaParser (−15). Integrated compile fixes (canonicalByKind receiver style, globals-join typing, stale progressSink tail). Full remote suite 2,929/0/0 + JS compile green.
…transparent TextDocumentService proxy deleted, simpleRequest endpoint collapse, nullFuture merge), AST nodes (−183: toString/clone expression bodies, shared list-clone helpers, Range/Position data-class equals/hashCode — compile+runtime-smoke proven), model second pass (−82: SignatureHelpProvider/ReferenceQueries/CompletionProvider ladders), binder second pass (−25: sliceTagGroups, type-parameter assembly, assignment kind conditional). Workspace second pass (−82) REVERTED: DocumentFactsCollector/ModuleExportCollector merges changed legacy-module-call environment semantics (4 test regressions — the require/alias layer is proven behavior-sensitive three times now). Full remote suite 2,929/0/0 + JS compile green.
…45,258; workspace pass reverted on legacy-module semantics regressions), E2E rel54 7/7; require/alias boundary layer recorded as a hard no-go zone.
…ass (−123: dead write-only generation state, always-true range check, single-caller merges, keyword ladder packing), checker second pass (−102: LuaJava ladder dedup via shared helpers, call-argument materialization, return-collection collapse, rootContextAt prologue, evaluate() subtype-arm merge), workspace safe files + facade compaction (−125: fingerprint import/branch dedup, positional provider construction, dead recompute removal, provably-unreachable hover branches — verified in an isolated HEAD-overlay copy while siblings blocked the shared tree), JvmClassModuleProvider second pass (−86: providerForClass merge, reflected-member builders, jar-entries reuse, cache-key compaction), pipeline/binder/model third pass (−114: SignatureHelpProvider dispatch unification, builtinGlobals param deletion, positional scaffolding). Integrated compile fixes (linkedSetOf SAM resolution, prepareBinding named-arg, globals-join typing, stale progressSink). Full remote suite 2,929/0/0 + JS compile green.
…09), E2E rel54 7/7; isolated-copy verification protocol noted.
…ss (−110: semanticTokens legend, classifyNameToken merge, lsp4j Range.equals adoption, workspace-index twins, format destructure), checker third pass (−97: merged evaluateIdentifier ladder, shared resolveLuaJavaDegradingHelperCall, no-op rebuiltName removal, unified addDiagnostic, integral literal-branch collapse), binder+comments fourth pass (−161: DeclarationFactories packed pass-throughs, BinderPositionQueries comparator chains, parseClassTag reuse, appendDescription in-place mutation with val-to-var tag descriptions, write-only range removal), facade/resolver third pass (−88: preferredHoverType arm merge behind isCallableDisplay, positionOrder comparator, sharedGlobalProviders scaffold, importedSymbol factory, builder addResolved), provider third pass (−98: loadedCandidateOrNull, packageSurfaceProviders, snapshot-call inlining, LRU scaffolding dedup via boundedCache). All agents verified in isolated copies with the standalone Kotlin 2.2.0 compiler. Full remote suite 2,929/0/0 + JS compile green.
…55), E2E rel55 7/7; isolated-copy verification became the default protocol (zero integration compile errors this round).
…ass (−126: callHierarchyTarget twin, inlay visitor 3-hooks-to-1, isLocalFunctionDeclaration fold, producer-invariant guard removals, workspace-index region), facade/resolver fourth (−115: requireBackedLocation, surfaceSymbol adoption, visibleValueDeclarations scope-walk, completionItem assembly, provably-dead bindClass recompute removal), parser/AST2Lua second (−98: 13x comma-join ladder dedup, parseCommaSeparatedExpList lambda-parameterized scaffold, strict/recovery gate collapse verified byte-identical across 83 repo files x 3 versions x 2 recovery modes), provider/lexer/comments fourth (−92: nextToken merge, operator-ladder packing, keyword pair-list, javaTypeParameterFor overload collapse, generic-tag twin arms), evaluator/ReferenceQueries fourth (−91: getSymbolAt hot-path ladder, provable subsumption in isPreferredRichType, dead branch, single-evaluation fixes). All agents verified in isolated copies (standalone Kotlin 2.2.0; annotations-13.0 on the compiler classpath makes the REAL generated mirror compile — no stub needed). Full remote suite 2,929/0/0 + JS compile green.
…33), E2E rel56 7/7; compiler-classpath protocol fix (annotations-13.0) makes the real mirror compile in isolated copies.
…ua third pass (−80 verified byte-identical across 716 differential cases), plus partial fifth-pass edits from four interrupted agents (lexer, binder positions, comments parser, evaluator, facade, provider, model) — full remote suite 2,929/0/0 + JS compile green on the interrupted tree.
…15), E2E rel57 7/7; new directive: all agent verification runs remotely (no local kotlinc/Gradle).
…ss (−134: tautological semantic-token delta comparison, pathFromClientPath dedup, flatMap/collect tails, lsp4j wildcard import consolidation — flagged revertible), LuaParser/AST2Lua third+fourth (−72: LexerScan inner class replacing 3 hand-rolled probe walks, shared comma-loop scaffold, 738 corpus tests green), facade/resolver fifth (−86: shared callableUpgradedCompletionKind with FIELD-policy gating, stringConstantOf, positional compactions — resolution-order zone untouched), interop third (−62: dead normalized() call, implicitClassSymbol delegate, unreachable protocol arms, descriptor ladder), evaluator sixth + SignatureHelpProvider shared argumentSlotAt (−56). All verification remote (per-file HEAD-overlay protocol where siblings blocked the shared tree; full 2,929/0/0 + JS + parser corpus 738 green).
…37 lines; JVM/JS green pre-outage; E2E rel58 pending the remote-host outage (unreachable since 03:24 local).
…32 tree after the ~80-min remote-host outage; 42,637 lines, ~1,075 remain to target.
…(−120: toLspKind/toLspSymbolKind valueOf bridges, URI authority-strip helper, dead insertText guard, rename/highlight folds), parser fifth (−122: androLuaOnly gate x6, parseExpressionTermOrMissing scaffold with LAZY diagnostic messages — the lexerText(true) advancing trap caught and fixed, linkedCallExpression prolog, appendClauseBody preserving elseif's historical extra break), workspace sixth (−366: positional constructions verified against data-class orders, serializeTypes over 12 sites, activeImportTargets order-preserving buildSet, resolvedModuleType twins folded; two unsound simplifications analyzed and rejected in the resolution-order zone), evaluator/ReferenceQueries sixth+fifth (−74: evaluateCallExpression tail fold, rootDeclarationContext, stale KDoc, tautological null checks proven non-null, importedDeclaration factory collapse), interop fourth+binder fifth (−73: LUA_STD_MODULE_NAMES triplication unified, metadataDexFirst gate preserving reflection-before-dex precedence, symbolKindForJavaMember 11-to-2 lines). Full remote suite 2,929/0/0 + JS compile green.
…82, −11,680 cumulative; 320 from the finish line), E2E rel59 7/7.
…ify copies (verify-in6) — parser fifth (2,762), AST2Lua (541), comments (454/227), evaluator sixth (2,566), UsageChecker (579), SignatureHelpProvider/NodePositionIndex/LuaLayoutCompletionProvider, binder fifth (739/174/171), interop fourth (2,186/640/552/209). The earlier single-test failure was an artifact of the bisect mixed state (binder/evaluator at HEAD + LSP eighth), not a regression in the coherent state: full remote suite 2,929/0/0 + JS compile green.
…rchestration notes, and stale verification disclaimers
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-20T23:05:08.918943Z f31adc0 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@dingyi222666
dingyi222666 merged commit 49faae5 into main Oct 20, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant