Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

use constant documents for javascript module

author
Giacomo Cavalieri
committer
Louis Pilfold
date (Jun 22, 2026, 2:33 PM +0100) commit 25165434 parent 9dfb501a change-id upyzmsqv
+176 -98
+122 -98
compiler-core/src/javascript.rs
··· 172 172 173 173 docvec![ 174 174 arena, 175 - "/// <reference types=\"./", 175 + REFERENCE_TYPES_DOCUMENT, 176 176 module, 177 - ".d.mts\" />", 177 + DOT_D_DOT_MTS_CLOSE_QUOTE_CLOSE_TAG_DOCUMENT, 178 178 LINE_DOCUMENT 179 179 ] 180 180 } ··· 194 194 195 195 docvec![ 196 196 arena, 197 - "//# sourceMappingURL=", 197 + SOURCE_MAPPING_URL_EQUAL_DOCUMENT, 198 198 module, 199 - ".mjs.map", 199 + DOT_MJS_DOT_MAP_DOCUMENT, 200 200 LINE_DOCUMENT 201 201 ] 202 202 } ··· 387 387 sourcemap_reference, 388 388 type_reference, 389 389 filepath_definition, 390 - "export {}", 390 + EXPORT_SPACE_OPEN_CLOSE_CURLY_DOCUMENT, 391 391 LINE_DOCUMENT, 392 392 echo_definition 393 393 ] ··· 608 608 publicity: Publicity, 609 609 ) -> Document<'a, 'doc> { 610 610 let keyword = if publicity.is_importable() { 611 - "export const " 611 + EXPORT_CONST_SPACE_DOCUMENT 612 612 } else { 613 - "const " 613 + CONST_SPACE_DOCUMENT 614 614 }; 615 615 docvec![ 616 616 arena, 617 617 self.source_map_tracker(arena, constructor.location.start), 618 618 keyword, 619 619 type_name, 620 - "$", 620 + DOLLAR_DOCUMENT, 621 621 constructor.name.as_str(), 622 - "$const", 623 - " =", 622 + DOLLAR_CONST_DOCUMENT, 623 + SPACE_EQUAL_DOCUMENT, 624 624 docvec![ 625 625 arena, 626 - arena.break_("", " "), 627 - "new ", 626 + BREAKABLE_SPACE_DOCUMENT, 627 + NEW_SPACE_DOCUMENT, 628 628 constructor.name.as_str(), 629 - "();" 629 + OPEN_CLOSE_PAREN_SEMICOLON_DOCUMENT, 630 630 ] 631 631 .group(arena) 632 632 .nest(arena, INDENT) ··· 644 644 if constructor.arguments.is_empty() { 645 645 return docvec![ 646 646 arena, 647 - "export const ", 647 + EXPORT_CONST_SPACE_DOCUMENT, 648 648 type_name, 649 - "$", 649 + DOLLAR_DOCUMENT, 650 650 constructor.name.as_str(), 651 - " = () =>", 651 + SPACE_EQUAL_OPEN_CLOSE_PAREN_SPACE_ARROW_DOCUMENT, 652 652 docvec![ 653 653 arena, 654 - arena.break_("", " "), 654 + BREAKABLE_SPACE_DOCUMENT, 655 655 type_name, 656 - "$", 656 + DOLLAR_DOCUMENT, 657 657 constructor.name.as_str(), 658 - "$const;" 658 + DOLLAR_CONST_SEMICOLON_DOCUMENT 659 659 ] 660 660 .group(arena) 661 661 .nest(arena, INDENT), ··· 674 674 675 675 let construction = docvec![ 676 676 arena, 677 - arena.break_("", " "), 678 - "new ", 677 + BREAKABLE_SPACE_DOCUMENT, 678 + NEW_SPACE_DOCUMENT, 679 679 constructor.name.as_str(), 680 - "(", 680 + OPEN_PAREN_DOCUMENT, 681 681 arena 682 - .join(arguments.clone(), arena.break_(",", ", ")) 682 + .join(arguments.clone(), COMMA_BREAK_DOCUMENT) 683 683 .group(arena), 684 - ");" 684 + CLOSE_PAREN_SEMICOLON_DOCUMENT, 685 685 ] 686 686 .group(arena); 687 687 688 688 docvec![ 689 689 arena, 690 690 self.source_map_tracker(arena, constructor.location.start), 691 - "export const ", 691 + EXPORT_CONST_SPACE_DOCUMENT, 692 692 type_name, 693 - "$", 693 + DOLLAR_DOCUMENT, 694 694 constructor.name.as_str(), 695 - " = (", 696 - arena.join(arguments, arena.break_(",", ", ")), 697 - ") =>", 695 + SPACE_EQUAL_SPACE_OPEN_PAREN_DOCUMENT, 696 + arena.join(arguments, COMMA_BREAK_DOCUMENT), 697 + CLOSE_PAREN_ARROW_DOCUMENT, 698 698 construction.nest(arena, INDENT), 699 699 ] 700 700 } ··· 707 707 ) -> Document<'a, 'doc> { 708 708 let construction = docvec![ 709 709 arena, 710 - arena.break_("", " "), 711 - "value instanceof ", 710 + BREAKABLE_SPACE_DOCUMENT, 711 + VALUE_INSTANCE_OF_SPACE_DOCUMENT, 712 712 constructor.name.as_str(), 713 - ";" 713 + SEMICOLON_DOCUMENT 714 714 ] 715 715 .group(arena); 716 716 717 717 docvec![ 718 718 arena, 719 719 self.source_map_tracker(arena, constructor.location.start), 720 - "export const ", 720 + EXPORT_CONST_SPACE_DOCUMENT, 721 721 type_name, 722 - "$is", 722 + DOLLAR_IS_DOCUMENT, 723 723 constructor.name.as_str(), 724 - " = (value) =>", 724 + SPACE_EQUAL_SPACE_VALUE_SPACE_ARROW, 725 725 construction.nest(arena, INDENT), 726 726 ] 727 727 } ··· 758 758 759 759 contents = docvec![ 760 760 arena, 761 - arena.break_("", " "), 762 - "value.", 761 + BREAKABLE_SPACE_DOCUMENT, 762 + VALUE_DOT_DOCUMENT, 763 763 maybe_escape_property(label), 764 - ";" 764 + SEMICOLON_DOCUMENT 765 765 ] 766 766 .group(arena); 767 767 ··· 769 769 arena, 770 770 LINE_DOCUMENT, 771 771 self.source_map_tracker(arena, constructor.location.start), 772 - "export const ", 772 + EXPORT_CONST_SPACE_DOCUMENT, 773 773 function_name, 774 - " = (value) =>", 774 + SPACE_EQUAL_SPACE_VALUE_SPACE_ARROW, 775 775 contents.clone().nest(arena, INDENT), 776 776 ]); 777 777 } else { 778 - contents = docvec![arena, arena.break_("", " "), "value[", index, "];"].group(arena) 778 + contents = docvec![ 779 + arena, 780 + BREAKABLE_SPACE_DOCUMENT, 781 + VALUE_OPEN_SQUARE_DOCUMENT, 782 + index, 783 + CLOSE_SQUARE_SEMICOLON_DOCUMENT 784 + ] 785 + .group(arena) 779 786 } 780 787 781 788 functions.push(docvec![ 782 789 arena, 783 790 LINE_DOCUMENT, 784 791 self.source_map_tracker(arena, constructor.location.start), 785 - "export const ", 792 + EXPORT_CONST_SPACE_DOCUMENT, 786 793 function_name, 787 - " = (value) =>", 794 + SPACE_EQUAL_SPACE_VALUE_SPACE_ARROW, 788 795 contents.nest(arena, INDENT), 789 796 ]); 790 797 } ··· 803 810 804 811 let contents = docvec![ 805 812 arena, 806 - arena.break_("", " "), 807 - "value.", 813 + BREAKABLE_SPACE_DOCUMENT, 814 + VALUE_DOT_DOCUMENT, 808 815 maybe_escape_property(field), 809 - ";" 816 + SEMICOLON_DOCUMENT 810 817 ] 811 818 .group(arena); 812 819 813 820 docvec![ 814 821 arena, 815 - "export const ", 822 + EXPORT_CONST_SPACE_DOCUMENT, 816 823 function_name, 817 - " = (value) =>", 824 + SPACE_EQUAL_SPACE_VALUE_SPACE_ARROW, 818 825 contents.nest(arena, INDENT), 819 826 ] 820 827 }); ··· 853 860 }; 854 861 855 862 let head = if publicity.is_public() { 856 - "export class " 863 + EXPORT_CLASS_SPACE_DOCUMENT 857 864 } else { 858 - "class " 865 + CLASS_SPACE_DOCUMENT 859 866 }; 860 867 861 868 let head = docvec![ ··· 863 870 self.source_map_tracker(arena, constructor.location.start), 864 871 head, 865 872 &constructor.name, 866 - " extends $CustomType {" 873 + SPACE_EXTENDS_CUSTOM_TYPE_OPEN_CURLY_DOCUMENT 867 874 ]; 868 875 869 876 if constructor.arguments.is_empty() { 870 - return docvec![arena, doc, head, "}"]; 877 + return docvec![arena, doc, head, CLOSE_CURLY_DOCUMENT]; 871 878 }; 872 879 873 880 let parameters = arena.join( ··· 876 883 .iter() 877 884 .enumerate() 878 885 .map(|argument| parameter(arena, argument)), 879 - arena.break_(",", ", "), 886 + COMMA_BREAK_DOCUMENT, 880 887 ); 881 888 882 889 let constructor_body = arena.join( 883 890 constructor.arguments.iter().enumerate().map(|(i, arg)| { 884 891 let var = parameter(arena, (i, arg)); 885 892 match &arg.label { 886 - None => docvec![arena, "this[", i, "] = ", var, ";"], 893 + None => docvec![ 894 + arena, 895 + THIS_OPEN_SQUARE_DOCUMENT, 896 + i, 897 + CLOSE_SQUARE_SPACE_EQUAL_SPACE_DOCUMENT, 898 + var, 899 + SEMICOLON_DOCUMENT 900 + ], 887 901 Some((_, name)) => { 888 - docvec![arena, "this.", maybe_escape_property(name), " = ", var, ";"] 902 + docvec![ 903 + arena, 904 + THIS_DOT_DOCUMENT, 905 + maybe_escape_property(name), 906 + SPACE_EQUAL_SPACE_DOCUMENT, 907 + var, 908 + SEMICOLON_DOCUMENT 909 + ] 889 910 } 890 911 } 891 912 }), ··· 895 916 let class_body = docvec![ 896 917 arena, 897 918 LINE_DOCUMENT, 898 - "constructor(", 919 + CONSTRUCTOR_OPEN_PAREN_DOCUMENT, 899 920 parameters, 900 - ") {", 921 + CLOSE_PAREN_SPACE_OPEN_CURLY_DOCUMENT, 901 922 docvec![ 902 923 arena, 903 924 LINE_DOCUMENT, 904 - "super();", 925 + SUPER_CALL_SEMICOLON_DOCUMENT, 905 926 LINE_DOCUMENT, 906 927 constructor_body 907 928 ] 908 929 .nest(arena, INDENT), 909 930 LINE_DOCUMENT, 910 - "}", 931 + CLOSE_CURLY_DOCUMENT, 911 932 ] 912 933 .nest(arena, INDENT); 913 934 ··· 1083 1104 } 1084 1105 1085 1106 let head = if publicity.is_private() { 1086 - "const " 1107 + CONST_SPACE_DOCUMENT 1087 1108 } else { 1088 - "export const " 1109 + EXPORT_CONST_SPACE_DOCUMENT 1089 1110 }; 1090 1111 1091 1112 let mut generator = expression::Generator::new( ··· 1121 1142 self.source_map_tracker(arena, location.start), 1122 1143 head, 1123 1144 maybe_escape_identifier(name), 1124 - " = ", 1145 + SPACE_EQUAL_SPACE_DOCUMENT, 1125 1146 document, 1126 - ";", 1147 + SEMICOLON_DOCUMENT, 1127 1148 self.source_map_tracker(arena, value.location().end), 1128 1149 ]) 1129 1150 } ··· 1196 1217 ); 1197 1218 1198 1219 let head = if function.publicity.is_private() { 1199 - "function " 1220 + FUNCTION_SPACE_DOCUMENT 1200 1221 } else { 1201 - "export function " 1222 + EXPORT_FUNCTION_SPACE_DOCUMENT 1202 1223 }; 1203 1224 1204 1225 let body = generator.function_body( ··· 1218 1239 function.arguments.as_slice(), 1219 1240 generator.tail_recursion_used 1220 1241 ), 1221 - " {", 1242 + SPACE_OPEN_CURLY_DOCUMENT, 1222 1243 docvec![arena, LINE_DOCUMENT, body] 1223 1244 .nest(arena, INDENT) 1224 1245 .group(arena), 1225 1246 LINE_DOCUMENT, 1226 - "}", 1247 + CLOSE_CURLY_DOCUMENT, 1227 1248 self.source_map_tracker(arena, function.end_position), 1228 1249 ]) 1229 1250 } ··· 1253 1274 1254 1275 docvec![ 1255 1276 arena, 1256 - "const FILEPATH = ", 1277 + CONST_FILEPATH_EQUALS_DOCUMENT, 1257 1278 self.src_path.clone(), 1258 - ';', 1279 + SEMICOLON_DOCUMENT, 1259 1280 TWO_LINES_DOCUMENT 1260 1281 ] 1261 1282 } ··· 1279 1300 documentation: &EcoString, 1280 1301 publicity: Publicity, 1281 1302 ) -> Document<'a, 'doc> { 1282 - let doc_lines = documentation 1283 - .trim_end() 1284 - .split('\n') 1285 - .map(|line| eco_format!(" *{line}", line = line.replace("*/", "*\\/")).to_doc(arena)) 1286 - .collect_vec(); 1287 - 1288 1303 // We start with the documentation of the function 1289 - let doc_body = arena.join(doc_lines, LINE_DOCUMENT); 1290 - let mut doc = docvec![arena, "/**", LINE_DOCUMENT, doc_body, LINE_DOCUMENT]; 1304 + let doc_body = arena.join( 1305 + documentation 1306 + .trim_end() 1307 + .split('\n') 1308 + .map(|line| eco_format!(" *{}", line.replace("*/", "*\\/")).to_doc(arena)), 1309 + LINE_DOCUMENT, 1310 + ); 1311 + 1312 + let mut doc = docvec![ 1313 + arena, 1314 + SLASH_TIMES_TIMES_DOCUMENT, 1315 + LINE_DOCUMENT, 1316 + doc_body, 1317 + LINE_DOCUMENT 1318 + ]; 1291 1319 if !publicity.is_public() { 1292 1320 // If the function is not public we hide the documentation using 1293 1321 // the `@ignore` tag: https://jsdoc.app/tags-ignore 1294 1322 doc = docvec![ 1295 1323 arena, 1296 1324 doc, 1297 - " * ", 1325 + SPACE_TIMES_SPACE_DOCUMENT, 1298 1326 LINE_DOCUMENT, 1299 - " * @ignore", 1327 + SPACE_TIMES_AT_IGNORE_DOCUMENT, 1300 1328 LINE_DOCUMENT 1301 1329 ]; 1302 1330 } 1303 1331 // And finally we close the doc comment 1304 - docvec![arena, doc, " */"] 1332 + docvec![arena, doc, SPACE_TIMES_SLASH_DOCUMENT] 1305 1333 } 1306 1334 1307 1335 #[derive(Debug)] ··· 1372 1400 .map(|argument| match argument.get_variable_name() { 1373 1401 None => { 1374 1402 let doc = if discards == 0 { 1375 - "_".to_doc(arena) 1403 + UNDERSCORE_DOCUMENT 1376 1404 } else { 1377 1405 eco_format!("_{discards}").to_doc(arena) 1378 1406 }; ··· 1385 1413 ) 1386 1414 } 1387 1415 1388 - fn wrap_arguments<'a, 'doc, I>( 1416 + fn wrap_arguments<'a, 'doc>( 1389 1417 arena: &'doc DocumentArena<'a, 'doc>, 1390 - arguments: I, 1391 - ) -> Document<'a, 'doc> 1392 - where 1393 - I: IntoIterator<Item = Document<'a, 'doc>>, 1394 - { 1395 - arena 1396 - .break_("", "") 1397 - .append(arena, arena.join(arguments, arena.break_(",", ", "))) 1418 + arguments: impl IntoIterator<Item = Document<'a, 'doc>>, 1419 + ) -> Document<'a, 'doc> { 1420 + EMPTY_BREAK_DOCUMENT 1421 + .append(arena, arena.join(arguments, COMMA_BREAK_DOCUMENT)) 1398 1422 .nest(arena, INDENT) 1399 - .append(arena, arena.break_("", "")) 1400 - .surround(arena, "(", ")") 1423 + .append(arena, EMPTY_BREAK_DOCUMENT) 1424 + .surround(arena, OPEN_PAREN_DOCUMENT, CLOSE_PAREN_DOCUMENT) 1401 1425 .group(arena) 1402 1426 } 1403 1427 ··· 1409 1433 let fields = items.into_iter().map(|(key, value)| { 1410 1434 empty = false; 1411 1435 match value { 1412 - Some(value) => docvec![arena, key, ": ", value], 1436 + Some(value) => docvec![arena, key, COLON_SPACE_DOCUMENT, value], 1413 1437 None => key.to_doc(arena), 1414 1438 } 1415 1439 }); 1416 - let fields = arena.join(fields, arena.break_(",", ", ")); 1440 + let fields = arena.join(fields, COMMA_BREAK_DOCUMENT); 1417 1441 1418 1442 if empty { 1419 - "{}".to_doc(arena) 1443 + OPEN_CLOSE_CURLY_DOCUMENT 1420 1444 } else { 1421 1445 docvec![ 1422 1446 arena, 1423 - docvec![arena, "{", arena.break_("", " "), fields] 1447 + docvec![arena, OPEN_CURLY_DOCUMENT, BREAKABLE_SPACE_DOCUMENT, fields] 1424 1448 .nest(arena, INDENT) 1425 - .append(arena, arena.break_("", " ")) 1449 + .append(arena, BREAKABLE_SPACE_DOCUMENT) 1426 1450 .group(arena), 1427 - "}" 1451 + CLOSE_CURLY_DOCUMENT 1428 1452 ] 1429 1453 } 1430 1454 }
+54
pretty-arena/src/lib.rs
··· 702 702 const_str!(INTERNAL_ATTRIBUTE_DOCUMENT, "@internal", 9); 703 703 const_str!(TRUE_LOWERCASE_DOCUMENT, "true", 4); 704 704 const_str!(FALSE_LOWERCASE_DOCUMENT, "false", 5); 705 + const_str!(OPEN_CLOSE_CURLY_DOCUMENT, "{}", 2); 706 + const_str!(SPACE_TIMES_AT_IGNORE_DOCUMENT, " * @ignore", 10); 707 + const_str!(SLASH_TIMES_TIMES_DOCUMENT, "/**", 3); 708 + const_str!(SPACE_TIMES_SLASH_DOCUMENT, " */", 3); 709 + const_str!(CONST_FILEPATH_EQUALS_DOCUMENT, "const FILEPATH = ", 17); 710 + const_str!(SEMICOLON_DOCUMENT, ";", 1); 711 + const_str!(FUNCTION_SPACE_DOCUMENT, "function ", 9); 712 + const_str!(EXPORT_FUNCTION_SPACE_DOCUMENT, "export function ", 16); 713 + const_str!(EXPORT_CONST_SPACE_DOCUMENT, "export const ", 13); 714 + const_str!(SUPER_CALL_SEMICOLON_DOCUMENT, "super();", 8); 715 + const_str!(CONSTRUCTOR_OPEN_PAREN_DOCUMENT, "constructor(", 12); 716 + const_str!(CLOSE_PAREN_SPACE_OPEN_CURLY_DOCUMENT, ") {", 3); 717 + const_str!(THIS_DOT_DOCUMENT, "this.", 5); 718 + const_str!(THIS_OPEN_SQUARE_DOCUMENT, "this[", 5); 719 + const_str!(CLOSE_SQUARE_SPACE_EQUAL_SPACE_DOCUMENT, "] = ", 4); 720 + const_str!( 721 + SPACE_EXTENDS_CUSTOM_TYPE_OPEN_CURLY_DOCUMENT, 722 + " extends $CustomType {", 723 + 22 724 + ); 725 + const_str!(CLASS_SPACE_DOCUMENT, "class ", 6); 726 + const_str!(EXPORT_CLASS_SPACE_DOCUMENT, "export class ", 13); 727 + const_str!(VALUE_DOT_DOCUMENT, "value.", 6); 728 + const_str!(SPACE_EQUAL_SPACE_VALUE_SPACE_ARROW, " = (value) =>", 13); 729 + const_str!( 730 + SPACE_EQUAL_OPEN_CLOSE_PAREN_SPACE_ARROW_DOCUMENT, 731 + " = () =>", 732 + 8 733 + ); 734 + const_str!(CLOSE_PAREN_SEMICOLON_DOCUMENT, ");", 2); 735 + const_str!(NEW_SPACE_DOCUMENT, "new ", 4); 736 + const_str!(VALUE_OPEN_SQUARE_DOCUMENT, "value[", 6); 737 + const_str!(CLOSE_SQUARE_SEMICOLON_DOCUMENT, "];", 2); 738 + const_str!(DOLLAR_IS_DOCUMENT, "$is", 3); 739 + const_str!(VALUE_INSTANCE_OF_SPACE_DOCUMENT, "value instanceof ", 17); 740 + const_str!(DOLLAR_DOCUMENT, "$", 1); 741 + const_str!(CLOSE_PAREN_ARROW_DOCUMENT, ") =>", 4); 742 + const_str!(SPACE_EQUAL_SPACE_OPEN_PAREN_DOCUMENT, " = (", 4); 743 + const_str!(DOLLAR_CONST_SEMICOLON_DOCUMENT, "$const;", 7); 744 + const_str!(DOLLAR_CONST_DOCUMENT, "$const", 6); 745 + const_str!(OPEN_CLOSE_PAREN_SEMICOLON_DOCUMENT, "();", 3); 746 + const_str!(EXPORT_SPACE_OPEN_CLOSE_CURLY_DOCUMENT, "export {}", 9); 747 + const_str!(DOT_MJS_DOT_MAP_DOCUMENT, ".mjs.map", 8); 748 + const_str!( 749 + DOT_D_DOT_MTS_CLOSE_QUOTE_CLOSE_TAG_DOCUMENT, 750 + ".d.mts\" />", 751 + 10 752 + ); 753 + const_str!( 754 + SOURCE_MAPPING_URL_EQUAL_DOCUMENT, 755 + "//# sourceMappingURL=", 756 + 21 757 + ); 758 + const_str!(REFERENCE_TYPES_DOCUMENT, "/// <reference types=\"./", 24); 705 759 706 760 const_break!(EMPTY_BREAK_DOCUMENT, "", ""); 707 761 const_break!(BREAKABLE_SPACE_DOCUMENT, "", " ");