Make filename-to-module-name derivation consistent across compiler and Rewatch
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
- Tipo di issue
- Refactoring
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- javascript, ocaml
- Ambito
- build-system, compilers
Direzione di ricerca
Start by tracing Ext_filename.module_name, Js_implementation.module_of_filename, Rewatch’s filename conversion, Ext_char.is_lower_case, and the generated JavaScript dependency filename logic. Compare their handling of ASCII, non-ASCII names, extensions, namespaces, paired .res/.resi files, and -o overrides. Done means the supported contract is explicit, all paths agree, and unsupported filenames receive consistent diagnostics with regression coverage.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Problem
Filename-to-module-name conversion currently follows different rules across the compiler, build system, and generated import paths.
- Implementation compilation uses
Ext_filename.module_name, which applies legacy Latin-1 byte capitalization throughExt_string.capitalize_ascii/capitalize_sub. - Interface compilation uses
Js_implementation.module_of_filename, which appliesString.capitalize_ascii. - Rewatch uses Unicode uppercasing of the first character.
.cmjfilename-case metadata usesExt_char.is_lower_case, with the same legacy Latin-1 byte ranges.- JavaScript dependency filenames are reconstructed with ASCII-only uncapitalization.
For ordinary ASCII filenames these rules agree. For non-ASCII input they can disagree or corrupt the module name.
Confirmed examples
| Filename stem | Implementation conversion | Interface conversion | Rewatch conversion |
|---|---|---|---|
foo |
Foo |
Foo |
Foo |
éclair |
éclair |
éclair |
Éclair |
ßeta |
ßeta |
ßeta |
SSeta |
中文 |
Invalid UTF-8 | Unchanged | Unchanged |
😀foo |
Invalid UTF-8 | Unchanged | Unchanged |
The invalid UTF-8 results occur because the legacy implementation subtracts 32 from the first byte, treating a UTF-8 leading byte as a Latin-1 lowercase character.
The compiler accepts these non-ASCII filenames without an early naming diagnostic. However, Éclair is not an ordinary ReScript module identifier, and quoting it does not make it valid in a module alias.
Ext_filename.as_module has ASCII-oriented validation, but the compilation paths above do not use it. Rewatch’s is_non_exotic_module_name filters generated namespace aliases rather than rejecting source filenames during discovery.
Why this matters
Inconsistent derivation can make the build graph disagree with compiler module identities. Inconsistent case metadata and filename reconstruction can also produce dependency imports that do not match emitted files.
Unicode uppercasing is not generally reversible: for example, ß becomes SS. A binary upper/lower case flag cannot recover the original filename from such a transformation.
Proposed direction
Define the supported filename-to-module-name contract explicitly and apply it consistently:
- Use ASCII-only capitalization for conventional module filenames.
- Decide how unsupported or exotic filenames should be handled, and report a clear diagnostic where appropriate.
- Share compiler derivation between implementations and interfaces, returning the module name and filename-case metadata together.
- Make Rewatch follow the same contract.
- Remove
Ext_charand the legacy Latin-1 capitalization once their responsibilities have been replaced.
Also reconcile extension stripping: interface derivation stops at the first dot, implementation derivation at the last dot, and Rewatch removes the final source extension. Any change must preserve intended handling of generated filenames.
Regression coverage
Cover lowercase/uppercase ASCII names, non-ASCII first and subsequent characters, Unicode case expansion, multiple dots, namespaces and namespace entries, paired .res/.resi files, and compiler output overrides (-o).
For supported names, verify that compiler identities, Rewatch dependency keys, emitted filenames, and generated imports agree. For unsupported names, verify consistent diagnostics before compilation artifacts are produced.
- Lingua principale
- OCaml
- Stelle
- 7.5k
- Fork
- 484
- Merge medio
- 19h 40m
- PR unite (30g)
- 54
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rescript-lang/rescript
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 22/100
rescript-lang/rescript#8733 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
rescript-lang/rescript#8727 ·
I maintainer di solito rispondono entro 1 giorno
-
Integer range patterns ending at 2147483647 generate incorrect JavaScriptForse già presa @fhammerschmidt l’ha presa 6 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 70/100
rescript-lang/rescript#8716 ·
I maintainer di solito rispondono entro 1 giorno
-
Integer range patterns on record fields match values below the rangeForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 76/100
rescript-lang/rescript#8713 ·
I maintainer di solito rispondono entro 1 giorno
-
A regex literal that starts a statement is parsed as division, and the formatter removes the parentheses that prevent itForse già presa @fhammerschmidt l’ha presa 6 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
rescript-lang/rescript#8688 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di rescript-lang/rescript
Issue simili
-
status:needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
? - Needs Triage bot_watch bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
NVIDIA/cudf-spark-jni#5267 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
good first issue
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
danielbchurchill/legato#317 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
aks129/HealthClawGuardrails#917 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement good first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100