JSX preserve mode spreads an `@unboxed` props record (`{..."x"}` instead of `"x"`)
Los mantenedores suelen responder en 1 día
Ya se ha fusionado un pull request relacionado.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 25/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Estancado
- Stack tecnológico
- javascript, ocaml
- Área
- compilers
Línea de trabajo
Start with jsx_props_of in compiler/ml/translcore.ml and jsx_printable in compiler/core/js_dump.ml, then compare the preserve-mode output with the reproduction and expected output in the issue. Done means both @unboxed record examples preserve the string as the props value instead of spreading it. Pull request #8847 is already open for this issue.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Found by adversarial experiments on semantic analysts.
What is broken
jsx_props_of turns every props expression that is not a Record_regular record literal into Jsx_props_spread:
https://github.com/rescript-lang/rescript/blob/8d51b9ce7/compiler/ml/translcore.ml#L1049-L1096
An @unboxed record literal compiles to its single field's value, which is not an object. jsx_printable does not reject this case:
https://github.com/rescript-lang/rescript/blob/8d51b9ce7/compiler/core/js_dump.ml#L176-L190
Reproduction
@@jsxConfig({version: 4, module_: "MyJsx"})
module MyJsx = {
type element = int
type component<'props> = 'props => element
external component: component<'props> => component<'props> = "%identity"
@module("rt") external jsx: (component<'props>, 'props) => element = "jsx"
@module("rt") external jsxs: (component<'props>, 'props) => element = "jsxs"
external array: array<element> => element = "%identity"
}
@unboxed type props = {title: string}
module C = {@module("lib") external make: MyJsx.component<props> = "C"}
module D = {@val external make: MyJsx.component<props> = "lowerD"}
let el = <C title="x" />
let el2 = <D title="y" />
bsc -nopervasives -bs-jsx 4 -bs-jsx-preserve K12.res at master:
let el = <Lib.C
{..."x"}
/>;
let el2 = Rt.jsx(lowerD, {..."y"});
Expected, as printed by bsc -nopervasives -bs-jsx 4 and by preserve mode at ece8b148:
let el = Rt.jsx(Lib.C, "x");
let el2 = Rt.jsx(lowerD, "y");
Introduced
#8754 (a7721303a).
Impact
The component receives {0: "x"} instead of "x": the generated code is wrong, with no error or warning. The case is rare, because the props type must be an @unboxed record.
- Lenguaje dominante
- OCaml
- Estrellas
- 7.5k
- Forks
- 484
- Merge medio
- 20 h 27 min
- PR fusionados (30 d)
- 120
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de rescript-lang/rescript
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
rescript-lang/rescript#8833 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
rewatch watch on Linux stops watching a source folder when an overlapping recursive source folder is removed from rescript.jsonPosiblemente ocupada @cknitt la tomó hace 2 días. Abierto
Dificultad 4/5 1-2 días Aptitud para principiantes 35/100
rescript-lang/rescript#8825 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
rescript-lang/rescript#8806 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
rescript-lang/rescript#8798 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 Medio día Aptitud para principiantes 58/100
rescript-lang/rescript#8757 ·
Los mantenedores suelen responder en 1 día
Todos los issues de rescript-lang/rescript
Issues similares
-
text as float loses precisionAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
NationalSecurityAgency/ghidra#9884 ·
Los mantenedores suelen responder en 2 días
-
llvm.memcpy with destination align but no source align asserts "Missed Source alignment!"Posiblemente ocupada @pvelesko la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
KhronosGroup/SPIRV-LLVM-Translator#4093 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
FStarLang/karamel#784 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
UB: (int) cast of a user double outside int range in dispatch / vm_index_is_int / flat_index_atAbiertoarea:runtime-vm
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
InauguralSystems/EigenScript#1748 ·
Los mantenedores suelen responder en 1 día