diff --git a/lib/cs/diagnosticMessages.generated.json b/lib/cs/diagnosticMessages.generated.json index eec229fdf64..eebd6a5aef9 100644 --- a/lib/cs/diagnosticMessages.generated.json +++ b/lib/cs/diagnosticMessages.generated.json @@ -217,6 +217,7 @@ "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312": "Rozhraní může rozšiřovat jen typ objektu nebo průsečík typů objektů se staticky známými členy.", "An_interface_property_cannot_have_an_initializer_1246": "Vlastnost rozhraní nemůže mít inicializátor.", "An_iterator_must_have_a_next_method_2489": "Iterátor musí mít metodu next().", + "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017": "Při použití direktivy pragma @jsx s fragmenty JSX se vyžaduje direktiva pragma @jsxFrag.", "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118": "Literál objektu nemůže obsahovat několik přístupových objektů get/set se stejným názvem.", "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117": "Literál objektu nemůže mít víc vlastností se stejným názvem ve striktním režimu.", "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119": "Literál objektu nemůže obsahovat vlastnost a přístupový objekt se stejným názvem.", @@ -606,6 +607,7 @@ "Global_type_0_must_have_1_type_parameter_s_2317": "Globální typ {0} musí mít parametry typu {1}.", "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384": "Opakované kompilace --incremental a --watch předpokládají, že změny v souboru budou mít vliv jen na soubory, které na něm přímo závisejí.", "Hexadecimal_digit_expected_1125": "Očekávala se šestnáctková číslice.", + "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262": "Očekával se identifikátor. {0} je vyhrazené slovo na nejvyšší úrovni modulu.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212": "Očekával se identifikátor. Ve striktním režimu je {0} rezervované slovo.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213": "Očekával se identifikátor. Ve striktním režimu je {0} rezervované slovo. Definice tříd jsou automaticky ve striktním režimu.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214": "Očekával se identifikátor. Ve striktním režimu je {0} rezervované slovo. Moduly jsou automaticky ve striktním režimu.", @@ -663,6 +665,7 @@ "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215": "Neplatné použití {0}. Moduly jsou automaticky ve striktním režimu.", "Invalid_use_of_0_in_strict_mode_1100": "Neplatné použití {0} ve striktním režimu", "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067": "Neplatná hodnota pro jsxFactory. {0} není platný identifikátor nebo kvalifikovaný název.", + "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035": "Neplatná hodnota pro jsxFragmentFactory. {0} není platný identifikátor nebo kvalifikovaný název.", "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059": "Neplatná hodnota --reactNamespace. {0} není platný identifikátor.", "Its_element_type_0_is_not_a_valid_JSX_element_2789": "Typ prvku {0} není platný prvek JSX.", "Its_instance_type_0_is_not_a_valid_JSX_element_2788": "Typ instance {0} není platný prvek JSX.", @@ -689,8 +692,6 @@ "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007": "Výrazy JSX nemůžou používat operátor čárky. Nechtěli jste napsat pole?", "JSX_expressions_must_have_one_parent_element_2657": "Výrazy JSX musí mít jeden nadřazený element.", "JSX_fragment_has_no_corresponding_closing_tag_17014": "Fragment JSX nemá odpovídající uzavírací značku.", - "JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma_17017": "Při použití vložené direktivy pragma objektu pro vytváření JSX se nepodporuje fragment JSX.", - "JSX_fragment_is_not_supported_when_using_jsxFactory_17016": "Při použití --jsxFactory se nepodporuje fragment JSX.", "JSX_spread_child_must_be_an_array_type_2609": "Podřízený objekt JSX spread musí být typu pole.", "Jump_target_cannot_cross_function_boundary_1107": "Cíl odkazu nemůže překročit hranici funkce.", "KIND_6034": "DRUH", @@ -945,6 +946,7 @@ "Raise_error_on_this_expressions_with_an_implied_any_type_6115": "Vyvolá chybu u výrazů this s implikovaným typem any.", "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205": "Opětovný export typu ve chvíli, kdy se poskytl příznak --isolatedModules, vyžaduje, aby se použilo export type.", "Redirect_output_structure_to_the_directory_6006": "Přesměrování výstupní struktury do adresáře", + "Referenced_project_0_may_not_disable_emit_6310": "Odkazovaný projekt {0} nemůže zakazovat generování.", "Referenced_project_0_must_have_setting_composite_Colon_true_6306": "Odkazovaný projekt {0} musí mít nastavení \"composite\": true.", "Remove_all_unnecessary_uses_of_await_95087": "Odebrat všechna nepotřebná použití výrazu await", "Remove_all_unreachable_code_95051": "Odebrat veškerý nedosažitelný kód", @@ -954,6 +956,7 @@ "Remove_braces_from_arrow_function_body_95112": "Odebrat složené závorky z těla funkce šipky", "Remove_destructuring_90009": "Odebrat destrukci", "Remove_import_from_0_90005": "Odebrat import z {0}", + "Remove_parentheses_95126": "Odebrat závorky", "Remove_template_tag_90011": "Odebrat značku šablonu", "Remove_type_parameters_90012": "Odebrat parametry typů", "Remove_unnecessary_await_95086": "Odebrat nepotřebné výrazy await", @@ -1044,6 +1047,7 @@ "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226": "Zadejte strategii pro sledování adresáře na platformách, které nepodporují nativně rekurzivní sledování: UseFsEvents (výchozí), FixedPollingInterval, DynamicPriorityPolling", "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225": "Zadejte strategii pro sledování souboru: FixedPollingInterval (výchozí), PriorityPollingInterval, DynamicPriorityPolling, UseFsEvents, UseFsEventsOnParentDirectory", "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146": "Zadejte funkci objektu pro vytváření JSX, která se použije při zaměření na generování JSX react, např. React.createElement nebo h.", + "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034": "Zadejte funkci objektu pro vytváření fragmentů JSX, která se použije při cílení na generování JSX react se zadanou možností kompilátoru jsxFactory, například Fragment.", "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060": "Zdejte sekvenci konce řádku, která se má použít při generování souborů: CRLF (dos) nebo LF (unix).", "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004": "Zadejte umístění, ve kterém by měl ladicí program najít soubory TypeScript namísto umístění zdroje.", "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003": "Zadejte umístění, ve kterém by měl ladicí program najít soubory mapy namísto generovaných umístění.", @@ -1105,6 +1109,7 @@ "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527": "Odvozený typ {0} odkazuje na nepřístupný typ {1}. Musí se použít anotace typu.", "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032": "Průnik {0} se omezil na never, protože vlastnost {1} existuje v několika konstituentech a v některých z nich je privátní.", "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031": "Průnik {0} se omezil na never, protože vlastnost {1} má v některých konstituentech konfliktní typy.", + "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016": "Aby bylo možné použít fragmenty JSX s možností kompilátoru jsxFactory, je třeba zadat možnost kompilátoru jsxFragmentFactory.", "The_last_overload_gave_the_following_error_2770": "Poslední přetížení vrátilo následující chybu.", "The_last_overload_is_declared_here_2771": "Poslední přetížení je deklarované tady.", "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491": "Levá strana příkazu for...in nemůže být destrukturačním vzorem.", @@ -1343,6 +1348,7 @@ "_0_is_declared_here_2728": "{0} je deklarované tady.", "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611": "{0} je definované jako vlastnost ve třídě {1}, ale v {2} se tady přepisuje jako přístupový objekt.", "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610": "{0} je definované jako přístupový objekt ve třídě {1}, ale v {2} se tady přepisuje jako vlastnost instance.", + "_0_is_deprecated_6385": "{0} je zastaralé", "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012": "{0} není platnou metavlastností pro klíčové slovo {1}. Měli jste na mysli {2}?", "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506": "Na {0} se přímo nebo nepřímo odkazuje ve vlastním základním výrazu.", "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502": "Na {0} se odkazuje přímo nebo nepřímo v jeho vlastní anotaci typu.", diff --git a/lib/fr/diagnosticMessages.generated.json b/lib/fr/diagnosticMessages.generated.json index 66ad4e0044a..0ed201151d6 100644 --- a/lib/fr/diagnosticMessages.generated.json +++ b/lib/fr/diagnosticMessages.generated.json @@ -217,6 +217,7 @@ "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312": "Une interface peut étendre uniquement un type d'objet ou une intersection de types d'objet avec des membres connus de manière statique.", "An_interface_property_cannot_have_an_initializer_1246": "Une propriété d'interface ne peut pas avoir d'initialiseur.", "An_iterator_must_have_a_next_method_2489": "Un itérateur doit comporter une méthode 'next()'.", + "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017": "Un pragma @jsxFrag est nécessaire quand un pragma @jsx est utilisé avec des fragments JSX.", "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118": "Un littéral d'objet ne peut pas avoir plusieurs accesseurs get/set portant le même nom.", "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117": "Un littéral d'objet ne peut pas avoir plusieurs propriétés portant le même nom en mode strict.", "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119": "Un littéral d'objet ne peut pas avoir une propriété et un accesseur portant le même nom.", @@ -606,6 +607,7 @@ "Global_type_0_must_have_1_type_parameter_s_2317": "Le type global '{0}' doit avoir {1} paramètre(s) de type.", "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384": "Les recompilations dans '--incremental' et '--watch' supposent que les changements apportés à un fichier affectent uniquement les fichiers qui dépendent directement de ce fichier.", "Hexadecimal_digit_expected_1125": "Chiffre hexadécimal attendu.", + "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262": "Identificateur attendu. '{0}' est un mot réservé au niveau supérieur d'un module.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212": "Identificateur attendu. '{0}' est un mot réservé en mode strict.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213": "Identificateur attendu. '{0}' est un mot réservé en mode strict. Les définitions de classe sont automatiquement en mode strict.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214": "Identificateur attendu. '{0}' est un mot réservé en mode strict. Les modules sont automatiquement en mode strict.", @@ -663,6 +665,7 @@ "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215": "Utilisation non valide de '{0}'. Les modules sont automatiquement en mode strict.", "Invalid_use_of_0_in_strict_mode_1100": "Utilisation non valide de '{0}' en mode strict.", "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067": "Valeur non valide pour 'jsxFactory'. '{0}' n'est pas un identificateur valide ou un nom qualifié.", + "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035": "Valeur non valide pour 'jsxFragmentFactory'. '{0}' n'est pas un identificateur valide ou un nom qualifié.", "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059": "Valeur non valide pour '--reactNamespace'. '{0}' n'est pas un identificateur valide.", "Its_element_type_0_is_not_a_valid_JSX_element_2789": "Son type d'élément '{0}' n'est pas un élément JSX valide.", "Its_instance_type_0_is_not_a_valid_JSX_element_2788": "Son type d'instance '{0}' n'est pas un élément JSX valide.", @@ -689,8 +692,6 @@ "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007": "Les expressions JSX ne peuvent pas utiliser l'opérateur virgule. Est-ce que vous avez voulu écrire un tableau ?", "JSX_expressions_must_have_one_parent_element_2657": "Les expressions JSX doivent avoir un élément parent.", "JSX_fragment_has_no_corresponding_closing_tag_17014": "Le fragment JSX n'a pas de balise de fermeture correspondante.", - "JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma_17017": "Le fragment JSX n'est pas pris en charge quand vous utilisez un pragma de fabrique JSX inline", - "JSX_fragment_is_not_supported_when_using_jsxFactory_17016": "Le fragment JSX n'est pas pris en charge quand --jsxFactory est utilisé", "JSX_spread_child_must_be_an_array_type_2609": "L'enfant spread JSX doit être un type de tableau.", "Jump_target_cannot_cross_function_boundary_1107": "La cible du saut ne peut pas traverser une limite de fonction.", "KIND_6034": "GENRE", @@ -945,6 +946,7 @@ "Raise_error_on_this_expressions_with_an_implied_any_type_6115": "Déclenche une erreur sur les expressions 'this' avec un type 'any' implicite.", "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205": "La réexportation d'un type quand l'indicateur '--isolatedModules' est spécifié nécessite l'utilisation de 'export type'.", "Redirect_output_structure_to_the_directory_6006": "Rediriger la structure de sortie vers le répertoire.", + "Referenced_project_0_may_not_disable_emit_6310": "Le projet référencé '{0}' ne doit pas désactiver l'émission.", "Referenced_project_0_must_have_setting_composite_Colon_true_6306": "Le projet référencé '{0}' doit avoir le paramètre \"composite\" avec la valeur true.", "Remove_all_unnecessary_uses_of_await_95087": "Supprimer toutes les utilisations non nécessaires de 'await'", "Remove_all_unreachable_code_95051": "Supprimer tout le code inaccessible", @@ -954,6 +956,7 @@ "Remove_braces_from_arrow_function_body_95112": "Supprimer les accolades du corps de fonction arrow", "Remove_destructuring_90009": "Supprimer la déstructuration", "Remove_import_from_0_90005": "Supprimer l'importation de '{0}'", + "Remove_parentheses_95126": "Supprimer les parenthèses", "Remove_template_tag_90011": "Supprimer la balise template", "Remove_type_parameters_90012": "Supprimer les paramètres de type", "Remove_unnecessary_await_95086": "Supprimer toute utilisation non nécessaire de 'await'", @@ -1044,6 +1047,7 @@ "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226": "Spécifiez la stratégie de surveillance de répertoire sur les plateformes qui ne prennent pas en charge la surveillance récursive en mode natif : 'UseFsEvents' (par défaut), 'FixedPollingInterval', 'DynamicPriorityPolling'.", "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225": "Spécifiez la stratégie de surveillance de fichier : 'FixedPollingInterval' (valeur par défaut), 'PriorityPollingInterval', 'DynamicPriorityPolling', 'UseFsEvents', 'UseFsEventsOnParentDirectory'.", "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146": "Spécifiez la fonction de fabrique JSX à utiliser pour le ciblage d'une émission JSX 'react', par exemple 'React.createElement' ou 'h'.", + "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034": "Spécifiez la fonction de fabrique de fragments JSX à utiliser durant le ciblage de l'émission JSX 'react' avec l'option de compilateur 'jsxFactory', par exemple 'Fragment'.", "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060": "Spécifiez la séquence de fin de ligne à utiliser durant l'émission des fichiers : 'CRLF' (Dos) ou 'LF' (Unix).", "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004": "Spécifiez l'emplacement dans lequel le débogueur doit localiser les fichiers TypeScript au lieu des emplacements sources.", "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003": "Spécifiez l'emplacement dans lequel le débogueur doit localiser les fichiers de mappage au lieu des emplacements générés.", @@ -1105,6 +1109,7 @@ "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527": "Le type déduit de '{0}' référence un type '{1}' inaccessible. Une annotation de type est nécessaire.", "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032": "L'intersection '{0}' a été réduite à 'never', car la propriété '{1}' existe dans plusieurs constituants et est privée dans certains d'entre eux.", "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031": "L'intersection '{0}' a été réduite à 'never', car la propriété '{1}' a des types en conflit dans certains constituants.", + "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016": "L'option de compilateur 'jsxFragmentFactory' doit être fournie pour permettre l'utilisation des fragments JSX avec l'option de compilateur 'jsxFactory'.", "The_last_overload_gave_the_following_error_2770": "La dernière surcharge a généré l'erreur suivante.", "The_last_overload_is_declared_here_2771": "La dernière surcharge est déclarée ici.", "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491": "La partie gauche d'une instruction 'for...in' ne peut pas être un modèle de déstructuration.", @@ -1343,6 +1348,7 @@ "_0_is_declared_here_2728": "'{0}' est déclaré ici.", "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611": "'{0}' est défini en tant que propriété dans la classe '{1}', mais il est remplacé ici dans '{2}' en tant qu'accesseur.", "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610": "'{0}' est défini en tant qu'accesseur dans la classe '{1}', mais il est remplacé ici dans '{2}' en tant que propriété d'instance.", + "_0_is_deprecated_6385": "'{0}' est déprécié", "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012": "'{0}' n'est pas une métapropriété valide pour le mot clé '{1}'. Est-ce qu'il ne s'agit pas plutôt de '{2}' ?", "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506": "'{0}' est référencé directement ou indirectement dans sa propre expression de base.", "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502": "'{0}' est référencé directement ou indirectement dans sa propre annotation de type.", diff --git a/lib/it/diagnosticMessages.generated.json b/lib/it/diagnosticMessages.generated.json index 2c83c3ccb22..11014c0d07d 100644 --- a/lib/it/diagnosticMessages.generated.json +++ b/lib/it/diagnosticMessages.generated.json @@ -217,6 +217,7 @@ "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312": "Un'interfaccia può estendere solo un tipo di oggetto o un'intersezione di tipi di oggetto con membri noti in modo statico.", "An_interface_property_cannot_have_an_initializer_1246": "Una proprietà di interfaccia non può contenere un inizializzatore.", "An_iterator_must_have_a_next_method_2489": "Un iteratore deve contenere un metodo 'next()'.", + "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017": "Quando si usa un'istruzione @jsx con frammenti JSX, è necessaria un'istruzione pragma @jsxFrag.", "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118": "Un valore letterale di oggetto non può contenere più funzioni di accesso get/set con lo stesso nome.", "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117": "Un valore letterale di oggetto non può contenere più proprietà con lo stesso nome in modalità strict.", "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119": "Un valore letterale di oggetto non può contenere proprietà e funzioni di accesso con lo stesso nome.", @@ -606,6 +607,7 @@ "Global_type_0_must_have_1_type_parameter_s_2317": "Il tipo globale '{0}' deve contenere {1} parametro/i di tipo.", "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384": "Impostare le ricompilazioni in '--incremental' e '--watch' in modo che le modifiche all'interno di un file interessino solo i file che dipendono direttamente da esso.", "Hexadecimal_digit_expected_1125": "È prevista la cifra esadecimale.", + "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262": "È previsto un identificatore. '{0}' è una parola riservata al livello principale di un modulo.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212": "È previsto un identificatore. '{0}' è una parola riservata in modalità strict.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213": "È previsto un identificatore. '{0}' è una parola riservata in modalità strict. Le definizioni di classe sono automaticamente impostate sulla modalità strict.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214": "È previsto un identificatore. '{0}' è una parola riservata in modalità strict. I moduli vengono impostati automaticamente in modalità strict.", @@ -663,6 +665,7 @@ "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215": "Uso non valido di '{0}'. I moduli vengono impostati automaticamente in modalità strict.", "Invalid_use_of_0_in_strict_mode_1100": "Uso non valido di '{0}' in modalità strict.", "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067": "Il valore non è valido per 'jsxFactory'. '{0}' non è un identificatore o un nome qualificato valido.", + "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035": "Il valore non è valido per 'jsxFragmentFactory'. '{0}' non è un identificatore o un nome qualificato valido.", "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059": "Il valore di '--reactNamespace' non è valido. '{0}' non è un identificatore valido", "Its_element_type_0_is_not_a_valid_JSX_element_2789": "Il relativo tipo di elemento '{0}' non è un elemento JSX valido.", "Its_instance_type_0_is_not_a_valid_JSX_element_2788": "Il relativo tipo di istanza '{0}' non è un elemento JSX valido.", @@ -689,8 +692,6 @@ "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007": "Nelle espressioni JSX non si può usare l'operatore virgola. Si intendeva scrivere una matrice?", "JSX_expressions_must_have_one_parent_element_2657": "Le espressioni JSX devono contenere un solo elemento padre.", "JSX_fragment_has_no_corresponding_closing_tag_17014": "Per il frammento JSX non esiste alcun tag di chiusura corrispondente.", - "JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma_17017": "Il frammento JSX non è supportato quando si usa una direttiva pragma factory JSX inline", - "JSX_fragment_is_not_supported_when_using_jsxFactory_17016": "Il frammento JSX non è supportato quando si usa --jsxFactory", "JSX_spread_child_must_be_an_array_type_2609": "L'elemento figlio dell'attributo spread JSX deve essere un tipo di matrice.", "Jump_target_cannot_cross_function_boundary_1107": "La destinazione di collegamento non può oltrepassare il limite della funzione.", "KIND_6034": "TIPOLOGIA", @@ -945,6 +946,7 @@ "Raise_error_on_this_expressions_with_an_implied_any_type_6115": "Genera un errore in caso di espressioni 'this con un tipo 'any' implicito.", "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205": "Per riesportare un tipo quando è specificato il flag '--isolatedModules', è necessario usare 'export type'.", "Redirect_output_structure_to_the_directory_6006": "Reindirizza la struttura di output alla directory.", + "Referenced_project_0_may_not_disable_emit_6310": "Il progetto di riferimento '{0}' non può disabilitare la creazione.", "Referenced_project_0_must_have_setting_composite_Colon_true_6306": "Il progetto di riferimento '{0}' deve includere l'impostazione \"composite\": true.", "Remove_all_unnecessary_uses_of_await_95087": "Rimuovere tutti gli utilizzi non necessari di 'await'", "Remove_all_unreachable_code_95051": "Rimuovere tutto il codice non eseguibile", @@ -954,6 +956,7 @@ "Remove_braces_from_arrow_function_body_95112": "Rimuovere le parentesi graffe dal corpo della funzione arrow", "Remove_destructuring_90009": "Rimuovere la destrutturazione", "Remove_import_from_0_90005": "Rimuovere l'importazione da '{0}'", + "Remove_parentheses_95126": "Rimuovere le parentesi", "Remove_template_tag_90011": "Rimuovere il tag template", "Remove_type_parameters_90012": "Rimuovere i parametri di tipo", "Remove_unnecessary_await_95086": "Rimuovere l'elemento 'await' non necessario", @@ -1044,6 +1047,7 @@ "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226": "Specificare la strategia per il controllo della directory in piattaforme che non supportano il controllo ricorsivo in modo nativo: 'UseFsEvents' (impostazione predefinita), 'FixedPollingInterval', 'DynamicPriorityPolling'.", "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225": "Specificare la strategia per il controllo del file: 'FixedPollingInterval' (impostazione predefinita), 'PriorityPollingInterval', 'DynamicPriorityPolling', 'UseFsEvents', 'UseFsEventsOnParentDirectory'.", "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146": "Consente di specificare la funzione della factory JSX da usare quando la destinazione è la creazione JSX 'react', ad esempio 'React.createElement' o 'h'.", + "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034": "Specificare la funzione della factory di frammenti JSX da usare quando la destinazione è la creazione JSX 'react' quando è specificata l'opzione del compilatore 'jsxFactory', ad esempio 'Fragment'.", "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060": "Specifica la sequenza di fine riga da usare per la creazione dei file, ovvero 'CRLF' (in DOS) o 'LF' (in UNIX).", "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004": "Specifica il percorso in cui il debugger deve trovare i file TypeScript invece dei percorsi di origine.", "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003": "Specifica il percorso in cui il debugger deve trovare i file map invece dei percorsi generati.", @@ -1105,6 +1109,7 @@ "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527": "Il tipo dedotto di '{0}' fa riferimento a un tipo '{1}' non accessibile. È necessaria un'annotazione di tipo.", "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032": "L'intersezione '{0}' è stata ridotta a 'never' perché la proprietà '{1}' esiste in più costituenti ed è privata in alcuni.", "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031": "L'intersezione '{0}' è stata ridotta a 'never' perché in alcuni costituenti della proprietà '{1}' sono presenti tipi in conflitto.", + "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016": "Per usare frammenti JSX con l'opzione del compilatore 'jsxFactory', è necessario specificare l'opzione del compilatore 'jsxFragmentFactory'.", "The_last_overload_gave_the_following_error_2770": "L'ultimo overload ha restituito l'errore seguente.", "The_last_overload_is_declared_here_2771": "In questo punto viene dichiarato l'ultimo overload.", "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491": "La parte sinistra di un'espressione 'for...in' non può essere un criterio di destrutturazione.", @@ -1343,6 +1348,7 @@ "_0_is_declared_here_2728": "In questo punto viene dichiarato '{0}'.", "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611": "'{0}' è definito come proprietà nella classe '{1}', ma in questo punto ne viene eseguito l'override in '{2}' come funzione di accesso.", "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610": "'{0}' è definito come funzione di accesso nella classe '{1}', ma in questo punto ne viene eseguito l'override in '{2}' come proprietà di istanza.", + "_0_is_deprecated_6385": "'{0}' è deprecato", "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012": "'{0}' non è una metaproprietà valida per la parola chiave '{1}'. Si intendeva '{2}'?", "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506": "'{0}' viene usato come riferimento diretto o indiretto nella relativa espressione di base.", "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502": "'{0}' viene usato come riferimento diretto o indiretto nella relativa annotazione di tipo.", diff --git a/lib/lib.es2020.bigint.d.ts b/lib/lib.es2020.bigint.d.ts index 171b6c2c7e2..6dc8b25acf2 100644 --- a/lib/lib.es2020.bigint.d.ts +++ b/lib/lib.es2020.bigint.d.ts @@ -18,6 +18,92 @@ and limitations under the License. /// +interface BigIntToLocaleStringOptions { + /** + * The locale matching algorithm to use.The default is "best fit". For information about this option, see the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation Intl page}. + */ + localeMatcher?: string; + /** + * The formatting style to use , the default is "decimal". + */ + style?: string; + + numberingSystem?: string; + /** + * The unit to use in unit formatting, Possible values are core unit identifiers, defined in UTS #35, Part 2, Section 6. A subset of units from the full list was selected for use in ECMAScript. Pairs of simple units can be concatenated with "-per-" to make a compound unit. There is no default value; if the style is "unit", the unit property must be provided. + */ + unit?: string; + + /** + * The unit formatting style to use in unit formatting, the defaults is "short". + */ + unitDisplay?: string; + + /** + * The currency to use in currency formatting. Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro, or "CNY" for the Chinese RMB — see the Current currency & funds code list. There is no default value; if the style is "currency", the currency property must be provided. It is only used when [[Style]] has the value "currency". + */ + currency?: string; + + /** + * How to display the currency in currency formatting. It is only used when [[Style]] has the value "currency". The default is "symbol". + * + * "symbol" to use a localized currency symbol such as €, + * + * "code" to use the ISO currency code, + * + * "name" to use a localized currency name such as "dollar" + */ + currencyDisplay?: string; + + /** + * Whether to use grouping separators, such as thousands separators or thousand/lakh/crore separators. The default is true. + */ + useGrouping?: boolean; + + /** + * The minimum number of integer digits to use. Possible values are from 1 to 21; the default is 1. + */ + minimumIntegerDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21; + + /** + * The minimum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number and percent formatting is 0; the default for currency formatting is the number of minor unit digits provided by the {@link http://www.currency-iso.org/en/home/tables/table-a1.html ISO 4217 currency codes list} (2 if the list doesn't provide that information). + */ + minimumFractionDigits?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20; + + /** + * The maximum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number formatting is the larger of minimumFractionDigits and 3; the default for currency formatting is the larger of minimumFractionDigits and the number of minor unit digits provided by the {@link http://www.currency-iso.org/en/home/tables/table-a1.html ISO 4217 currency codes list} (2 if the list doesn't provide that information); the default for percent formatting is the larger of minimumFractionDigits and 0. + */ + maximumFractionDigits?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20; + + /** + * The minimum number of significant digits to use. Possible values are from 1 to 21; the default is 1. + */ + minimumSignificantDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21; + + /** + * The maximum number of significant digits to use. Possible values are from 1 to 21; the default is 21. + */ + maximumSignificantDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21; + + /** + * The formatting that should be displayed for the number, the defaults is "standard" + * + * "standard" plain number formatting + * + * "scientific" return the order-of-magnitude for formatted number. + * + * "engineering" return the exponent of ten when divisible by three + * + * "compact" string representing exponent, defaults is using the "short" form + */ + notation?: string; + + /** + * used only when notation is "compact" + */ + compactDisplay?: string; +} + interface BigInt { /** * Returns a string representation of an object. @@ -26,7 +112,7 @@ interface BigInt { toString(radix?: number): string; /** Returns a string representation appropriate to the host environment's current locale. */ - toLocaleString(): string; + toLocaleString(locales?: string, options?: BigIntToLocaleStringOptions): string; /** Returns the primitive value of the specified object. */ valueOf(): bigint; @@ -633,3 +719,10 @@ interface DataView { */ setBigUint64(byteOffset: number, value: bigint, littleEndian?: boolean): void; } + +declare namespace Intl{ + interface NumberFormat { + format(value: number | bigint): string; + resolvedOptions(): ResolvedNumberFormatOptions; + } +} diff --git a/lib/pl/diagnosticMessages.generated.json b/lib/pl/diagnosticMessages.generated.json index c8561c1e0da..fd3c51622a0 100644 --- a/lib/pl/diagnosticMessages.generated.json +++ b/lib/pl/diagnosticMessages.generated.json @@ -217,6 +217,7 @@ "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312": "Interfejs może rozszerzać tylko typ obiektu lub część wspólną typów obiektów ze statycznie znanymi elementami członkowskimi.", "An_interface_property_cannot_have_an_initializer_1246": "Właściwość interfejsu nie może mieć inicjatora.", "An_iterator_must_have_a_next_method_2489": "Iterator musi zawierać metodę „next()”.", + "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017": "W przypadku używania dyrektywy pragma @jsx z fragmentami JSX jest wymagana dyrektywa pragma @jsxFrag.", "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118": "Literał obiektu nie może mieć wielu metod dostępu pobierania/ustawiania o takiej samej nazwie.", "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117": "Literał obiektu nie może mieć wielu właściwości o takiej samej nazwie w trybie z ograniczeniami.", "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119": "Literał obiektu nie może mieć właściwości i metody dostępu o takiej samej nazwie.", @@ -606,6 +607,7 @@ "Global_type_0_must_have_1_type_parameter_s_2317": "Typ globalny „{0}” musi mieć następującą liczbę parametrów typu: {1}.", "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384": "W przypadku ponownego kompilowania w parametrach „--incremental” i „--watch” przyjmuje się, że zmiany w pliku będą miały wpływ tylko na pliki bezpośrednio od niego zależne.", "Hexadecimal_digit_expected_1125": "Oczekiwano cyfry szesnastkowej.", + "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262": "Oczekiwano identyfikatora. „{0}” jest słowem zastrzeżonym na najwyższym poziomie modułu.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212": "Oczekiwano identyfikatora. „{0}” jest wyrazem zastrzeżonym w trybie z ograniczeniami.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213": "Oczekiwano identyfikatora. „{0}” jest wyrazem zastrzeżonym w trybie z ograniczeniami. Definicje klas są określane automatycznie w trybie z ograniczeniami.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214": "Oczekiwano identyfikatora. Element „{0}” jest wyrazem zastrzeżonym w trybie z ograniczeniami. Moduły są określane automatycznie w trybie z ograniczeniami.", @@ -663,6 +665,7 @@ "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215": "Nieprawidłowe użycie elementu „{0}”. Moduły są określane automatycznie w trybie z ograniczeniami.", "Invalid_use_of_0_in_strict_mode_1100": "Nieprawidłowe użycie elementu „{0}” w trybie z ograniczeniami.", "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067": "Nieprawidłowa wartość elementu „jsxFactory”. „{0}” to nie jest prawidłowy identyfikator ani kwalifikowana nazwa.", + "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035": "Nieprawidłowa wartość elementu „jsxFragmentFactory”. „{0}” nie jest prawidłowym identyfikatorem ani kwalifikowaną nazwą.", "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059": "Nieprawidłowa wartość opcji „--reactNamespace”. Element „{0}” nie jest prawidłowym identyfikatorem.", "Its_element_type_0_is_not_a_valid_JSX_element_2789": "Jego typ elementu „{0}” nie jest prawidłowym elementem JSX.", "Its_instance_type_0_is_not_a_valid_JSX_element_2788": "Jego typ wystąpienia „{0}” nie jest prawidłowym elementem JSX.", @@ -689,8 +692,6 @@ "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007": "Wyrażenia JSX nie mogą używać operatora przecinka. Czy chodziło Ci o zapisanie tablicy?", "JSX_expressions_must_have_one_parent_element_2657": "Wyrażenia JSX muszą mieć jeden element nadrzędny.", "JSX_fragment_has_no_corresponding_closing_tag_17014": "Fragment kodu JSX nie ma odpowiedniego tagu zamykającego.", - "JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma_17017": "Fragment JSX nie jest obsługiwany podczas używania śródwierszowej dyrektywy pragma fabryki JSX", - "JSX_fragment_is_not_supported_when_using_jsxFactory_17016": "W przypadku korzystania z opcji --jsxFactory fragment kodu JSX nie jest obsługiwany", "JSX_spread_child_must_be_an_array_type_2609": "Element podrzędny rozkładu JSX musi być typem tablicy.", "Jump_target_cannot_cross_function_boundary_1107": "Cel skoku nie może przekraczać granicy funkcji.", "KIND_6034": "RODZAJ", @@ -945,6 +946,7 @@ "Raise_error_on_this_expressions_with_an_implied_any_type_6115": "Zgłaszaj błąd w przypadku wyrażeń „this” z niejawnym typem „any”.", "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205": "Ponowne eksportowanie typu, gdy podano flagę „--isolatedModules”, wymaga użycia aliasu „export type”.", "Redirect_output_structure_to_the_directory_6006": "Przekieruj strukturę wyjściową do katalogu.", + "Referenced_project_0_may_not_disable_emit_6310": "Przywoływany projekt „{0}” nie może wyłączać emisji.", "Referenced_project_0_must_have_setting_composite_Colon_true_6306": "Przywoływany projekt „{0}” musi mieć ustawienie „composite” o wartości true.", "Remove_all_unnecessary_uses_of_await_95087": "Usuń wszystkie niepotrzebne użycia operatora „await”", "Remove_all_unreachable_code_95051": "Usuń cały nieosiągalny kod", @@ -954,6 +956,7 @@ "Remove_braces_from_arrow_function_body_95112": "Usuń nawiasy klamrowe z treści funkcji strzałkowej", "Remove_destructuring_90009": "Usuń usuwanie struktury", "Remove_import_from_0_90005": "Usuń import z „{0}”", + "Remove_parentheses_95126": "Usuń nawiasy", "Remove_template_tag_90011": "Usuń znacznik szablonu", "Remove_type_parameters_90012": "Usuń parametry typu", "Remove_unnecessary_await_95086": "Usuń niepotrzebny operator „await”", @@ -1044,6 +1047,7 @@ "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226": "Określ strategię obserwowania katalogu na platformach, które nie obsługują natywnego obserwowania rekursywnego: „UseFsEvents” (domyślna), „FixedPollingInterval”, „DynamicPriorityPolling”.", "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225": "Określ strategię obserwowania pliku: „FixedPollingInterval” (domyślna), „PriorityPollingInterval”, „DynamicPriorityPolling”, „UseFsEvents”, „UseFsEventsOnParentDirectory”.", "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146": "Określ funkcję fabryki JSX do użycia, gdy elementem docelowym jest emisja elementu JSX „react”, np. „React.createElement” lub „h”.", + "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034": "Określ funkcję fabryki fragmentów JSX, która ma być używana po ukierunkowaniu na emisję JSX „react” za pomocą opcji kompilatora „jsxFactory”, na przykład „Fragment”.", "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060": "Określ sekwencję końca wiersza, która ma być używana podczas emitowania plików: „CRLF” (dos) lub „LF” (unix).", "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004": "Określ lokalizację, w której debuger ma szukać plików TypeScript zamiast szukania w lokalizacjach źródłowych.", "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003": "Określ lokalizację, w której debuger ma szukać plików map zamiast szukania w wygenerowanych lokalizacjach.", @@ -1105,6 +1109,7 @@ "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527": "Wnioskowany typ „{0}” przywołuje niedostępny typ „{1}”. Adnotacja typu jest konieczna.", "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032": "Przecięcie „{0}” zostało zredukowane do wartości „never”, ponieważ właściwość „{1}” istnieje w wielu elementach składowych i w części z nich jest prywatna.", "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031": "Przecięcie „{0}” zostało zredukowane do wartości „never”, ponieważ właściwość „{1}” zawiera typy powodujące konflikt w niektórych elementach składowych.", + "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016": "Należy podać opcję kompilatora „jsxFragmentFactory”, aby używać fragmentów JSX z opcją kompilatora „jsxFactory”.", "The_last_overload_gave_the_following_error_2770": "Ostatnie przeciążenie dało następujący błąd.", "The_last_overload_is_declared_here_2771": "Ostatnie przeciążenie jest zadeklarowane tutaj.", "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491": "Lewa strona instrukcji „for...in” nie może być wzorcem usuwającym strukturę.", @@ -1343,6 +1348,7 @@ "_0_is_declared_here_2728": "Element „{0}” jest zadeklarowany tutaj.", "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611": "Element „{0}” jest zdefiniowany jako właściwość w klasie „{1}”, ale jest przesłaniany tutaj w elemencie „{2}” jako metoda dostępu.", "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610": "Element „{0}” jest zdefiniowany jako metoda dostępu w klasie „{1}”, ale jest przesłaniany tutaj w elemencie „{2}” jako właściwość wystąpienia.", + "_0_is_deprecated_6385": "Element „{0}” jest przestarzały", "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012": "„{0}” nie jest prawidłową metawłaściwością słowa kluczowego „{1}”. Czy miał to być element „{2}”?", "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506": "Element „{0}” jest przywoływany bezpośrednio lub pośrednio w jego własnym wyrażeniu podstawowym.", "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502": "Element „{0}” jest przywoływany bezpośrednio lub pośrednio w jego własnej adnotacji typu.", diff --git a/lib/protocol.d.ts b/lib/protocol.d.ts index 647b9b55d20..c3f4572eac8 100644 --- a/lib/protocol.d.ts +++ b/lib/protocol.d.ts @@ -156,6 +156,10 @@ declare namespace ts.server.protocol { * Time spent updating the program graph, in milliseconds. */ updateGraphDurationMs?: number; + /** + * The time spent creating or updating the auto-import program, in milliseconds. + */ + createAutoImportProviderProgramDurationMs?: number; } /** * Arguments for FileRequest messages. @@ -1597,6 +1601,11 @@ declare namespace ts.server.protocol { * and therefore may not be accurate. */ isFromUncheckedFile?: true; + /** + * If true, this completion was for an auto-import of a module not yet in the program, but listed + * in the project package.json. + */ + isPackageJsonImport?: true; } /** * Additional completion entry details, available on demand @@ -2445,6 +2454,7 @@ declare namespace ts.server.protocol { readonly lazyConfiguredProjectsFromExternalProject?: boolean; readonly providePrefixAndSuffixTextForRename?: boolean; readonly allowRenameOfImportPath?: boolean; + readonly includePackageJsonAutoImports?: "exclude-dev" | "all" | "none"; } interface CompilerOptions { allowJs?: boolean; diff --git a/lib/pt-br/diagnosticMessages.generated.json b/lib/pt-br/diagnosticMessages.generated.json index d327de5cda5..2f07d619f15 100644 --- a/lib/pt-br/diagnosticMessages.generated.json +++ b/lib/pt-br/diagnosticMessages.generated.json @@ -217,6 +217,7 @@ "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312": "Uma interface só pode estender um tipo de objeto ou interseção de tipos de objeto com membros estaticamente conhecidos.", "An_interface_property_cannot_have_an_initializer_1246": "Uma propriedade de interface não pode ter um inicializador.", "An_iterator_must_have_a_next_method_2489": "Um iterador deve ter um método 'next()'.", + "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017": "Um pragma @jsxFrag é necessário ao usar um pragma @jsx com fragmentos JSX.", "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118": "Um literal de objeto não pode ter vários acessadores get/set com o mesmo nome.", "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117": "Um literal de objeto não pode ter várias propriedades com o mesmo nome no modo estrito.", "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119": "Um literal de objeto não pode ter propriedade e acessador com o mesmo nome.", @@ -606,6 +607,7 @@ "Global_type_0_must_have_1_type_parameter_s_2317": "O tipo global '{0}' deve ter {1} parâmetro(s) de tipo.", "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384": "Faça com que as recompilações em '--incremental' e '--watch' presumam que as alterações dentro de um arquivo só afetarão os arquivos que dependem diretamente dele.", "Hexadecimal_digit_expected_1125": "Dígito hexadecimal esperado.", + "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262": "Um identificador é esperado. '{0}' é uma palavra reservada no nível superior de um módulo.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212": "Identificador esperado. '{0}' é uma palavra reservada no modo estrito.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213": "Identificador esperado. '{0}' é uma palavra reservada no modo estrito. Definições de classe estão automaticamente no modo estrito.", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214": "Identificador esperado. '{0}' é uma palavra reservada em modo estrito. Os módulos ficam automaticamente em modo estrito.", @@ -663,6 +665,7 @@ "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215": "Uso inválido de '{0}'. Os módulos ficam automaticamente em modo estrito.", "Invalid_use_of_0_in_strict_mode_1100": "Uso inválido de '{0}' no modo estrito.", "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067": "Valor inválido para 'jsxFactory'. '{0}' não é um identificador válido ou nome qualificado.", + "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035": "Valor inválido para 'jsxFragmentFactory'. '{0}' não é um identificador válido ou nome qualificado.", "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059": "Valor inválido para '--reactNamespace'. '{0}' não é um identificador válido.", "Its_element_type_0_is_not_a_valid_JSX_element_2789": "Seu tipo de elemento '{0}' não é um elemento JSX válido.", "Its_instance_type_0_is_not_a_valid_JSX_element_2788": "Seu tipo de instância '{0}' não é um elemento JSX válido.", @@ -689,8 +692,6 @@ "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007": "Expressões JSX não podem usar o operador vírgula. Você quis escrever uma matriz?", "JSX_expressions_must_have_one_parent_element_2657": "As expressões JSX devem ter um elemento pai.", "JSX_fragment_has_no_corresponding_closing_tag_17014": "O fragmento JSX não tem uma marcação de fechamento correspondente.", - "JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma_17017": "O fragmento de JSX não é compatível ao se utilizar um pragma de fábrica JSX embutido", - "JSX_fragment_is_not_supported_when_using_jsxFactory_17016": "O fragmento JSX não é compatível com o uso de --jsxFactory", "JSX_spread_child_must_be_an_array_type_2609": "O filho do espalhamento JSX deve ser um tipo de matriz.", "Jump_target_cannot_cross_function_boundary_1107": "O destino do salto não pode ultrapassar o limite de função.", "KIND_6034": "TIPO", @@ -945,6 +946,7 @@ "Raise_error_on_this_expressions_with_an_implied_any_type_6115": "Gerar erro em expressões 'this' com um tipo 'any' implícito.", "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205": "Exportar novamente um tipo quando o sinalizador '--isolatedModules' é fornecido requer o uso de 'export type'.", "Redirect_output_structure_to_the_directory_6006": "Redirecione a estrutura de saída para o diretório.", + "Referenced_project_0_may_not_disable_emit_6310": "O projeto referenciado '{0}' pode não desabilitar a emissão.", "Referenced_project_0_must_have_setting_composite_Colon_true_6306": "O projeto referenciado '{0}' deve ter a configuração de \"composite\": true.", "Remove_all_unnecessary_uses_of_await_95087": "Remover todos os usos desnecessários de 'await'", "Remove_all_unreachable_code_95051": "Remover todo o código inacessível", @@ -954,6 +956,7 @@ "Remove_braces_from_arrow_function_body_95112": "Remover as chaves do corpo de função de seta", "Remove_destructuring_90009": "Remover desestruturação", "Remove_import_from_0_90005": "Remover importação de '{0}'", + "Remove_parentheses_95126": "Remover os parênteses", "Remove_template_tag_90011": "Remover marca de modelo", "Remove_type_parameters_90012": "Remover parâmetros de tipo", "Remove_unnecessary_await_95086": "Remover 'await' desnecessário", @@ -1044,6 +1047,7 @@ "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226": "Especifique a estratégia para assistir ao diretório em plataformas que não têm suporte à observação recursiva nativamente: 'UseFsEvents' (padrão), 'FixedPollingInterval', 'DynamicPriorityPolling'.", "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225": "Especifique a estratégia para assistir ao arquivo: 'FixedPollingInterval' (padrão), 'PriorityPollingInterval', 'DynamicPriorityPolling', 'UseFsEvents', 'UseFsEventsOnParentDirectory'.", "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146": "Especifique a função de fábrica JSX a ser usada ao direcionar a emissão 'react' do JSX, por ex., 'React.createElement' ou 'h'.", + "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034": "Especifique a função de alocador do fragmento JSX a ser usada no direcionamento de uma emissão de JSX 'react' com a opção do compilador 'jsxFactory' especificada, por exemplo, 'Fragment'.", "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060": "Especifique o fim da sequência de linha a ser usado ao emitir arquivos: 'CRLF' (dos) ou 'LF' (unix).", "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004": "Especifique o local onde o depurador deve localizar arquivos TypeScript em vez de locais de origem.", "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003": "Especifique o local onde o depurador deve localizar arquivos de mapa em vez de locais gerados.", @@ -1105,6 +1109,7 @@ "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527": "O tipo inferido de '{0}' faz referência a um tipo '{1}' inacessível. Uma anotação de tipo é necessária.", "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032": "A interseção '{0}' foi reduzida para 'never' porque a propriedade '{1}' existe em vários constituintes e é privada em alguns.", "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031": "A interseção '{0}' foi reduzida para 'never' porque a propriedade '{1}' tem tipos conflitantes em alguns constituintes.", + "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016": "A opção do compilador 'jsxFragmentFactory' precisa ser fornecida para que se possa usar fragmentos JSX com a opção do compilador 'jsxFactory'.", "The_last_overload_gave_the_following_error_2770": "A última sobrecarga gerou o seguinte erro.", "The_last_overload_is_declared_here_2771": "A última sobrecarga é declarada aqui.", "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491": "O lado esquerdo de uma instrução 'for...in' não pode ser um padrão de desestruturação.", @@ -1343,6 +1348,7 @@ "_0_is_declared_here_2728": "'{0}' é declarado aqui.", "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611": "'{0}' está definido como uma propriedade na classe '{1}', mas é substituído aqui em '{2}' como um acessador.", "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610": "'{0}' está definido como um acessador na classe '{1}', mas é substituído aqui em '{2}' como uma propriedade de instância.", + "_0_is_deprecated_6385": "'{0}' foi preterido", "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012": "'{0}' não é uma metapropriedade para a palavra-chave '{1}'. Você quis dizer '{2}'?", "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506": "'{0}' é referenciado direta ou indiretamente em sua própria expressão base.", "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502": "'{0}' é referenciado direta ou indiretamente em sua própria anotação de tipo.", diff --git a/lib/tsc.js b/lib/tsc.js index 0c650eda425..a2fe86e1943 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -67,7 +67,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) { var ts; (function (ts) { ts.versionMajorMinor = "4.0"; - ts.version = ts.versionMajorMinor + ".0-dev"; + ts.version = ts.versionMajorMinor + ".0-beta"; function tryGetNativeMap() { return typeof Map !== "undefined" && "entries" in Map.prototype ? Map : undefined; } @@ -1022,6 +1022,14 @@ var ts; return values; } ts.getOwnValues = getOwnValues; + function arrayOf(count, f) { + var result = new Array(count); + for (var i = 0; i < count; i++) { + result[i] = f(i); + } + return result; + } + ts.arrayOf = arrayOf; function arrayFrom(iterator, map) { var result = []; for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) { @@ -4897,6 +4905,11 @@ var ts; Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), + Source_has_0_element_s_but_target_requires_1: diag(2618, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), + Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), + Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), + Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), + Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other: diag(2622, ts.DiagnosticCategory.Error, "Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other_2622", "Element at index {0} is variadic in one type but not in the other."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), @@ -5727,6 +5740,17 @@ var ts; Convert_to_named_function: diag(95124, ts.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: diag(95125, ts.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: diag(95126, ts.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"), + Could_not_find_a_containing_arrow_function: diag(95127, ts.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), + Containing_function_is_not_an_arrow_function: diag(95128, ts.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), + Could_not_find_export_statement: diag(95129, ts.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"), + This_file_already_has_a_default_export: diag(95130, ts.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"), + Could_not_find_import_clause: diag(95131, ts.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"), + Could_not_find_namespace_import_or_named_imports: diag(95132, ts.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), + Selection_is_not_a_valid_type_node: diag(95133, ts.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), + No_type_could_be_extracted_from_this_type_node: diag(95134, ts.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), + Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), + Name_is_not_valid: diag(95136, ts.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"), + Can_only_convert_property_with_modifier: diag(95137, ts.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: diag(18006, ts.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), @@ -29722,7 +29746,7 @@ var ts; includeSpecs = ["**/*"]; } var result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile); - if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) { + if (shouldReportNoInputFiles(result, canJsonReportNoInputFiles(raw), resolutionStack)) { errors.push(getErrorForNoInputFiles(result.spec, configFileName)); } if (ts.hasProperty(raw, "references") && !isNullOrUndefined(raw.references)) { @@ -29764,10 +29788,10 @@ var ts; function shouldReportNoInputFiles(result, canJsonReportNoInutFiles, resolutionStack) { return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0); } - function canJsonReportNoInutFiles(raw) { + function canJsonReportNoInputFiles(raw) { return !ts.hasProperty(raw, "files") && !ts.hasProperty(raw, "references"); } - ts.canJsonReportNoInutFiles = canJsonReportNoInutFiles; + ts.canJsonReportNoInputFiles = canJsonReportNoInputFiles; function updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) { var existingErrors = configParseDiagnostics.length; if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles)) { @@ -34558,6 +34582,7 @@ var ts; getAllPossiblePropertiesOfTypes: getAllPossiblePropertiesOfTypes, getSuggestedSymbolForNonexistentProperty: getSuggestedSymbolForNonexistentProperty, getSuggestionForNonexistentProperty: getSuggestionForNonexistentProperty, + getSuggestedSymbolForNonexistentJSXAttribute: getSuggestedSymbolForNonexistentJSXAttribute, getSuggestedSymbolForNonexistentSymbol: function (location, name, meaning) { return getSuggestedSymbolForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestionForNonexistentSymbol: function (location, name, meaning) { return getSuggestionForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestedSymbolForNonexistentModule: getSuggestedSymbolForNonexistentModule, @@ -37777,21 +37802,21 @@ var ts; if (typeArguments.length > 0) { var arity = getTypeReferenceArity(type); var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context); - var hasRestElement = type.target.hasRestElement; if (tupleConstituentNodes) { if (type.target.labeledElementDeclarations) { for (var i = 0; i < tupleConstituentNodes.length; i++) { - var isOptionalOrRest = i >= type.target.minLength; - var isRest = isOptionalOrRest && hasRestElement && i === arity - 1; - var isOptional = isOptionalOrRest && !isRest; - tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(isRest ? ts.factory.createToken(25) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), isOptional ? ts.factory.createToken(57) : undefined, isRest ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]); + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(flags & 12 ? ts.factory.createToken(25) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), flags & 2 ? ts.factory.createToken(57) : undefined, flags & 4 ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]); } } else { - for (var i = type.target.minLength; i < Math.min(arity, tupleConstituentNodes.length); i++) { - tupleConstituentNodes[i] = hasRestElement && i === arity - 1 ? - ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(tupleConstituentNodes[i])) : - ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]); + for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) { + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = + flags & 12 ? ts.factory.createRestTypeNode(flags & 4 ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : + flags & 2 ? ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]; } } var tupleTypeNode = ts.setEmitFlags(ts.factory.createTupleTypeNode(tupleConstituentNodes), 1); @@ -40440,13 +40465,14 @@ var ts; function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) { var elements = pattern.elements; var lastElement = ts.lastOrUndefined(elements); - var hasRestElement = !!(lastElement && lastElement.kind === 195 && lastElement.dotDotDotToken); - if (elements.length === 0 || elements.length === 1 && hasRestElement) { + var restElement = lastElement && lastElement.kind === 195 && lastElement.dotDotDotToken ? lastElement : undefined; + if (elements.length === 0 || elements.length === 1 && restElement) { return languageVersion >= 2 ? createIterableType(anyType) : anyArrayType; } var elementTypes = ts.map(elements, function (e) { return ts.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors); }); - var minLength = ts.findLastIndex(elements, function (e) { return !ts.isOmittedExpression(e) && !hasDefaultValue(e); }, elements.length - (hasRestElement ? 2 : 1)) + 1; - var result = createTupleType(elementTypes, minLength, hasRestElement); + var minLength = ts.findLastIndex(elements, function (e) { return !(e === restElement || ts.isOmittedExpression(e) || hasDefaultValue(e)); }, elements.length - 1) + 1; + var elementFlags = ts.map(elements, function (e, i) { return e === restElement ? 4 : i >= minLength ? 2 : 1; }); + var result = createTupleType(elementTypes, elementFlags); if (includePatternInType) { result = cloneTypeReference(result); result.pattern = pattern; @@ -41021,7 +41047,7 @@ var ts; function getBaseTypes(type) { if (!type.resolvedBaseTypes) { if (type.objectFlags & 8) { - type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters || ts.emptyArray), type.readonly)]; + type.resolvedBaseTypes = [getTupleBaseType(type)]; } else if (type.symbol.flags & (32 | 64)) { if (type.symbol.flags & 32) { @@ -41037,6 +41063,10 @@ var ts; } return type.resolvedBaseTypes; } + function getTupleBaseType(type) { + var elementTypes = ts.sameMap(type.typeParameters, function (t, i) { return type.elementFlags[i] & 8 ? getIndexedAccessType(t, numberType) : t; }); + return createArrayType(getUnionType(elementTypes || ts.emptyArray), type.readonly); + } function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = ts.resolvingEmptyArray; var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); @@ -41698,16 +41728,15 @@ var ts; return [sig.parameters]; function expandSignatureParametersWithTupleMembers(restType, restIndex) { var elementTypes = getTypeArguments(restType); - var minLength = restType.target.minLength; - var tupleRestIndex = restType.target.hasRestElement ? elementTypes.length - 1 : -1; var associatedNames = restType.target.labeledElementDeclarations; var restParams = ts.map(elementTypes, function (t, i) { var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]); var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i); - var checkFlags = i === tupleRestIndex ? 32768 : - i >= minLength ? 16384 : 0; + var flags = restType.target.elementFlags[i]; + var checkFlags = flags & 12 ? 32768 : + flags & 2 ? 16384 : 0; var symbol = createSymbol(1, name, checkFlags); - symbol.type = i === tupleRestIndex ? createArrayType(t) : t; + symbol.type = flags & 4 ? createArrayType(t) : t; return symbol; }); return ts.concatenate(sig.parameters.slice(0, restIndex), restParams); @@ -42330,6 +42359,9 @@ var ts; return indexedAccess; } } + if (isGenericTupleType(type.objectType)) { + return getIndexTypeOfType(type.objectType, 1); + } var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType); if (objectConstraint && objectConstraint !== type.objectType) { return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType); @@ -42475,6 +42507,9 @@ var ts; return keyofConstraintType; } if (t.flags & 8388608) { + if (isGenericTupleType(t.objectType)) { + return getIndexTypeOfType(t.objectType, 1); + } var baseObjectType = getBaseConstraint(t.objectType); var baseIndexType = getBaseConstraint(t.indexType); var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType); @@ -43286,7 +43321,9 @@ var ts; } } } - else if (grandParent.kind === 159 && grandParent.dotDotDotToken) { + else if (grandParent.kind === 159 && grandParent.dotDotDotToken || + grandParent.kind === 180 || + grandParent.kind === 191 && grandParent.dotDotDotToken) { inferences = ts.append(inferences, createArrayType(unknownType)); } } @@ -43401,9 +43438,7 @@ var ts; } else { type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function () { return errorType; })) || ts.emptyArray; - error(type.node || currentNode, type.target.symbol - ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves - : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); + error(type.node || currentNode, type.target.symbol ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); } } return type.resolvedTypeArguments; @@ -43799,22 +43834,32 @@ var ts; function createArrayType(elementType, readonly) { return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]); } - function isTupleRestElement(node) { - return node.kind === 180 || (node.kind === 191 && !!node.dotDotDotToken); + function getTupleElementFlags(node) { + switch (node.kind) { + case 179: + return 2; + case 180: + return getRestTypeElementFlags(node); + case 191: + return node.questionToken ? 2 : + node.dotDotDotToken ? getRestTypeElementFlags(node) : + 1; + default: + return 1; + } } - function isTupleOptionalElement(node) { - return node.kind === 179 || (node.kind === 191 && !!node.questionToken); + function getRestTypeElementFlags(node) { + return getArrayElementTypeNode(node.type) ? 4 : 8; } function getArrayOrTupleTargetType(node) { var readonly = isReadonlyTypeOperator(node.parent); - if (node.kind === 177 || node.elements.length === 1 && isTupleRestElement(node.elements[0])) { + var elementType = getArrayElementTypeNode(node); + if (elementType) { return readonly ? globalReadonlyArrayType : globalArrayType; } - var lastElement = ts.lastOrUndefined(node.elements); - var restElement = lastElement && isTupleRestElement(lastElement) ? lastElement : undefined; - var minLength = ts.findLastIndex(node.elements, function (n) { return !isTupleOptionalElement(n) && n !== restElement; }) + 1; + var elementFlags = ts.map(node.elements, getTupleElementFlags); var missingName = ts.some(node.elements, function (e) { return e.kind !== 191; }); - return getTupleTypeOfArity(node.elements.length, minLength, !!restElement, readonly, missingName ? undefined : node.elements); + return getTupleTargetType(elementFlags, readonly, missingName ? undefined : node.elements); } function isDeferredTypeReferenceNode(node, hasDefaultTypeArguments) { return !!getAliasSymbolForTypeNode(node) || isResolvedByTypeAlias(node) && (node.kind === 177 ? mayResolveTypeAlias(node.elementType) : @@ -43876,13 +43921,13 @@ var ts; if (target === emptyGenericType) { links.resolvedType = emptyObjectType; } - else if (isDeferredTypeReferenceNode(node)) { + else if (!(node.kind === 178 && ts.some(node.elements, function (e) { return !!(getTupleElementFlags(e) & 8); })) && isDeferredTypeReferenceNode(node)) { links.resolvedType = node.kind === 178 && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, undefined); } else { var elementTypes = node.kind === 177 ? [getTypeFromTypeNode(node.elementType)] : ts.map(node.elements, getTypeFromTypeNode); - links.resolvedType = createTypeReference(target, elementTypes); + links.resolvedType = createNormalizedTypeReference(target, elementTypes); } } return links.resolvedType; @@ -43890,27 +43935,57 @@ var ts; function isReadonlyTypeOperator(node) { return ts.isTypeOperatorNode(node) && node.operator === 141; } - function createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { + function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) { + if (readonly === void 0) { readonly = false; } + var tupleTarget = getTupleTargetType(elementFlags || ts.map(elementTypes, function (_) { return 1; }), readonly, namedMemberDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : + tupleTarget; + } + function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + if (elementFlags.length === 1 && elementFlags[0] & 4) { + return readonly ? globalReadonlyArrayType : globalArrayType; + } + var key = ts.map(elementFlags, function (f) { return f & 1 ? "#" : f & 2 ? "?" : f & 4 ? "." : "*"; }).join() + + (readonly ? "R" : "") + + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); + var type = tupleTypes.get(key); + if (!type) { + tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations)); + } + return type; + } + function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + var arity = elementFlags.length; + var minLength = ts.findLastIndex(elementFlags, function (f) { return !!(f & (1 | 8)); }) + 1; var typeParameters; var properties = []; - var maxLength = hasRestElement ? arity - 1 : arity; + var combinedFlags = 0; if (arity) { typeParameters = new Array(arity); for (var i = 0; i < arity; i++) { var typeParameter = typeParameters[i] = createTypeParameter(); - if (i < maxLength) { - var property = createSymbol(4 | (i >= minLength ? 16777216 : 0), "" + i, readonly ? 8 : 0); + var flags = elementFlags[i]; + combinedFlags |= flags; + if (!(combinedFlags & 12)) { + var property = createSymbol(4 | (flags & 2 ? 16777216 : 0), "" + i, readonly ? 8 : 0); property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i]; property.type = typeParameter; properties.push(property); } } } - var literalTypes = []; - for (var i = minLength; i <= maxLength; i++) - literalTypes.push(getLiteralType(i)); + var fixedLength = properties.length; var lengthSymbol = createSymbol(4, "length"); - lengthSymbol.type = hasRestElement ? numberType : getUnionType(literalTypes); + if (combinedFlags & 12) { + lengthSymbol.type = numberType; + } + else { + var literalTypes_1 = []; + for (var i = minLength; i <= arity; i++) + literalTypes_1.push(getLiteralType(i)); + lengthSymbol.type = getUnionType(literalTypes_1); + } properties.push(lengthSymbol); var type = createObjectType(8 | 4); type.typeParameters = typeParameters; @@ -43928,37 +44003,98 @@ var ts; type.declaredConstructSignatures = ts.emptyArray; type.declaredStringIndexInfo = undefined; type.declaredNumberIndexInfo = undefined; + type.elementFlags = elementFlags; type.minLength = minLength; - type.hasRestElement = hasRestElement; + type.fixedLength = fixedLength; + type.hasRestElement = !!(combinedFlags & 12); + type.combinedFlags = combinedFlags; type.readonly = readonly; type.labeledElementDeclarations = namedMemberDeclarations; return type; } - function getTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { - var key = arity + (hasRestElement ? "+" : ",") + minLength + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); - var type = tupleTypes.get(key); - if (!type) { - tupleTypes.set(key, type = createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations)); - } - return type; + function createNormalizedTypeReference(target, typeArguments) { + return target.objectFlags & 8 && target.combinedFlags & 8 ? + createNormalizedTupleType(target, typeArguments) : + createTypeReference(target, typeArguments); } - function createTupleType(elementTypes, minLength, hasRestElement, readonly, namedMemberDeclarations) { - if (minLength === void 0) { minLength = elementTypes.length; } - if (hasRestElement === void 0) { hasRestElement = false; } - if (readonly === void 0) { readonly = false; } - var arity = elementTypes.length; - if (arity === 1 && hasRestElement) { - return createArrayType(elementTypes[0], readonly); + function createNormalizedTupleType(target, elementTypes) { + var _a, _b, _c; + var unionIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 && t.flags & (131072 | 1048576)); }); + if (unionIndex >= 0) { + return mapType(elementTypes[unionIndex], function (t) { return createNormalizedTupleType(target, ts.replaceElement(elementTypes, unionIndex, t)); }); + } + var spreadIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8) && !(t.flags & 58982400) && !isGenericMappedType(t); }); + if (spreadIndex < 0) { + return createTypeReference(target, elementTypes); + } + var expandedTypes = []; + var expandedFlags = []; + var expandedDeclarations = []; + var optionalIndex = -1; + var restTypes; + var _loop_12 = function (i) { + var type = elementTypes[i]; + var flags = target.elementFlags[i]; + if (flags & 8) { + if (type.flags & 58982400 || isGenericMappedType(type)) { + addElementOrRest(type, 8, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + } + else if (isTupleType(type)) { + ts.forEach(getTypeArguments(type), function (t, n) { var _a; return addElementOrRest(t, type.target.elementFlags[n], (_a = type.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[n]); }); + } + else { + addElementOrRest(isArrayLikeType(type) && getIndexTypeOfType(type, 1) || errorType, 4, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i]); + } + } + else { + addElementOrRest(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i]); + } + }; + for (var i = 0; i < elementTypes.length; i++) { + _loop_12(i); + } + if (restTypes) { + expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); + } + var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : + tupleTarget; + function addElementOrRest(type, flags, declaration) { + if (restTypes) { + restTypes.push(flags & 8 ? getIndexedAccessType(type, numberType) : type); + } + else { + if (flags & 1 && optionalIndex >= 0) { + for (var i = optionalIndex; i < expandedFlags.length; i++) { + if (expandedFlags[i] & 2) + expandedFlags[i] = 1; + } + optionalIndex = -1; + } + else if (flags & 2 && optionalIndex < 0) { + optionalIndex = expandedFlags.length; + } + else if (flags & 4) { + restTypes = [type]; + } + expandedTypes.push(type); + expandedFlags.push(flags); + if (expandedDeclarations && declaration) { + expandedDeclarations.push(declaration); + } + else { + expandedDeclarations = undefined; + } + } } - var tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, namedMemberDeclarations); - return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType; } - function sliceTupleType(type, index) { - var tuple = type.target; - if (tuple.hasRestElement) { - index = Math.min(index, getTypeReferenceArity(type) - 1); - } - return createTupleType(getTypeArguments(type).slice(index), Math.max(0, tuple.minLength - index), tuple.hasRestElement, tuple.readonly, tuple.labeledElementDeclarations && tuple.labeledElementDeclarations.slice(index)); + function sliceTupleType(type, index, endSkipCount) { + if (endSkipCount === void 0) { endSkipCount = 0; } + var target = type.target; + var endIndex = getTypeReferenceArity(type) - endSkipCount; + return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts.emptyArray) : + createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex)); } function getTypeFromOptionalTypeNode(node) { var type = getTypeFromTypeNode(node.type); @@ -44406,7 +44542,7 @@ var ts; type = getReducedType(type); return type.flags & 1048576 ? getIntersectionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : type.flags & 2097152 ? getUnionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : - maybeTypeOfKind(type, 58982400) ? getIndexTypeForGenericType(type, stringsOnly) : + type.flags & 58982400 || isGenericTupleType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts.getObjectFlags(type) & 32 ? filterType(getConstraintTypeFromMappedType(type), function (t) { return !(noIndexSignatures && t.flags & (1 | 4)); }) : type === wildcardType ? wildcardType : type.flags & 2 ? neverType : @@ -44643,7 +44779,7 @@ var ts; } return !!(type.objectFlags & 8388608); } - return !!(type.flags & 58982400) || isGenericMappedType(type); + return !!(type.flags & 58982400) || isGenericMappedType(type) || isGenericTupleType(type); } function isGenericIndexType(type) { if (type.flags & 3145728) { @@ -44699,6 +44835,12 @@ var ts; return type[cache] = distributedOverObject; } } + if (isGenericTupleType(objectType) && indexType.flags & 296) { + var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 ? 0 : objectType.target.fixedLength, 0, writing); + if (elementType) { + return type[cache] = elementType; + } + } if (isGenericMappedType(objectType)) { return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), function (t) { return getSimplifiedType(t, writing); }); } @@ -44738,6 +44880,18 @@ var ts; function getIndexedAccessType(objectType, indexType, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, 0, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } + function indexTypeLessThan(indexType, limit) { + return everyType(indexType, function (t) { + if (t.flags & 384) { + var propName = getPropertyNameFromType(t); + if (isNumericLiteralName(propName)) { + var index = +propName; + return index >= 0 && index < limit; + } + } + return false; + }); + } function getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, accessFlags, aliasSymbol, aliasTypeArguments) { if (accessFlags === void 0) { accessFlags = 0; } if (objectType === wildcardType || indexType === wildcardType) { @@ -44746,7 +44900,9 @@ var ts; if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304) && isTypeAssignableToKind(indexType, 4 | 8)) { indexType = stringType; } - if (isGenericIndexType(indexType) || !(accessNode && accessNode.kind !== 188) && isGenericObjectType(objectType)) { + if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 188 ? + isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : + isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) { if (objectType.flags & 3) { return objectType; } @@ -44820,7 +44976,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_12 = function () { + var _loop_13 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -44869,7 +45025,7 @@ var ts; return "break"; }; while (true) { - var state_4 = _loop_12(); + var state_4 = _loop_13(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -45285,19 +45441,32 @@ var ts; } return links.resolvedType; } + function getTypeFromRestTypeNode(node) { + return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type); + } + function getArrayElementTypeNode(node) { + switch (node.kind) { + case 185: + return getArrayElementTypeNode(node.type); + case 178: + if (node.elements.length === 1) { + node = node.elements[0]; + if (node.kind === 180 || node.kind === 191 && node.dotDotDotToken) { + return getArrayElementTypeNode(node.type); + } + } + break; + case 177: + return node.elementType; + } + return undefined; + } function getTypeFromNamedTupleTypeNode(node) { var links = getNodeLinks(node); - if (!links.resolvedType) { - var type = getTypeFromTypeNode(node.type); - if (node.dotDotDotToken) { - type = getElementTypeOfArrayType(type) || errorType; - } - if (node.questionToken && strictNullChecks) { - type = getOptionalType(type); - } - links.resolvedType = type; - } - return links.resolvedType; + return links.resolvedType || (links.resolvedType = + node.dotDotDotToken ? getTypeFromRestTypeNode(node) : + node.questionToken && strictNullChecks ? getOptionalType(getTypeFromTypeNode(node.type)) : + getTypeFromTypeNode(node.type)); } function getTypeFromTypeNode(node) { return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node); @@ -45363,7 +45532,7 @@ var ts; case 298: return getTypeFromTypeNode(node.type); case 180: - return getElementTypeOfArrayType(getTypeFromTypeNode(node.type)) || errorType; + return getTypeFromRestTypeNode(node); case 305: return getTypeFromJSDocVariadicType(node); case 173: @@ -45613,6 +45782,9 @@ var ts; if (typeVariable !== mappedTypeVariable) { return mapType(getReducedType(mappedTypeVariable), function (t) { if (t.flags & (3 | 58982400 | 524288 | 2097152) && t !== wildcardType && t !== errorType) { + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } var replacementMapper = prependTypeMapping(typeVariable, t, mapper); return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) : isTupleType(t) ? instantiateMappedTupleType(t, type, replacementMapper) : @@ -45627,23 +45799,34 @@ var ts; function getModifiedReadonlyState(state, modifiers) { return modifiers & 1 ? true : modifiers & 2 ? false : state; } + function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) { + var elementFlags = tupleType.target.elementFlags; + var elementTypes = ts.map(getTypeArguments(tupleType), function (t, i) { + var singleton = elementFlags[i] & 8 ? t : + elementFlags[i] & 4 ? createArrayType(t) : + createTupleType([t], [elementFlags[i]]); + return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); + }); + var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); + return createTupleType(elementTypes, ts.map(elementTypes, function (_) { return 8; }), newReadonly); + } function instantiateMappedArrayType(arrayType, mappedType, mapper) { var elementType = instantiateMappedTypeTemplate(mappedType, numberType, true, mapper); return elementType === errorType ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); } function instantiateMappedTupleType(tupleType, mappedType, mapper) { - var minLength = tupleType.target.minLength; + var elementFlags = tupleType.target.elementFlags; var elementTypes = ts.map(getTypeArguments(tupleType), function (_, i) { - return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), i >= minLength, mapper); + return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), !!(elementFlags[i] & 2), mapper); }); var modifiers = getMappedTypeModifiers(mappedType); - var newMinLength = modifiers & 4 ? 0 : - modifiers & 8 ? getTypeReferenceArity(tupleType) - (tupleType.target.hasRestElement ? 1 : 0) : - minLength; + var newTupleModifiers = modifiers & 4 ? ts.map(elementFlags, function (f) { return f & 1 ? 2 : f; }) : + modifiers & 8 ? ts.map(elementFlags, function (f) { return f & 2 ? 1 : f; }) : + elementFlags; var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); return ts.contains(elementTypes, errorType) ? errorType : - createTupleType(elementTypes, newMinLength, tupleType.target.hasRestElement, newReadonly, tupleType.target.labeledElementDeclarations); + createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); } function instantiateMappedTypeTemplate(type, key, isOptional, mapper) { var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); @@ -45726,7 +45909,7 @@ var ts; if (objectFlags & 4 && !(type.node)) { var resolvedTypeArguments = type.resolvedTypeArguments; var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper); - return newTypeArguments !== resolvedTypeArguments ? createTypeReference(type.target, newTypeArguments) : type; + return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type; } return getObjectTypeInstantiation(type, mapper); } @@ -47033,7 +47216,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 ? reducedTarget.types : [reducedTarget]; } - var _loop_13 = function (prop) { + var _loop_14 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -47044,7 +47227,15 @@ var ts; if (prop.valueDeclaration && ts.isJsxAttribute(prop.valueDeclaration) && ts.getSourceFileOfNode(errorNode) === ts.getSourceFileOfNode(prop.valueDeclaration.name)) { errorNode = prop.valueDeclaration.name; } - reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(errorTarget)); + var propName = symbolToString(prop); + var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget); + var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined; + if (suggestion) { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion); + } + else { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget)); + } } else { var objectLiteralDeclaration_1 = source.symbol && ts.firstOrUndefined(source.symbol.declarations); @@ -47078,7 +47269,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_13(prop); + var state_5 = _loop_14(prop); if (typeof state_5 === "object") return state_5.value; } @@ -47339,6 +47530,10 @@ var ts; return varianceResult; } } + if (isSingleElementGenericTupleType(source) && getTypeArguments(source)[0] === target && !source.target.readonly || + isSingleElementGenericTupleType(target) && getTypeArguments(target)[0] === source && (target.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source) || source))) { + return -1; + } if (target.flags & 262144) { if (ts.getObjectFlags(source) & 32 && isRelatedTo(getIndexType(target), getConstraintTypeFromMappedType(source))) { if (!(getMappedTypeModifiers(source) & 4)) { @@ -47626,11 +47821,11 @@ var ts; } var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_14 = function (combination) { + var _loop_15 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_15 = function (i) { + var _loop_16 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -47643,7 +47838,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_15(i); + var state_7 = _loop_16(i); switch (state_7) { case "continue-outer": continue outer; } @@ -47657,7 +47852,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_14(combination); + var state_6 = _loop_15(combination); if (typeof state_6 === "object") return state_6.value; } @@ -47828,6 +48023,80 @@ var ts; if (relation === identityRelation) { return propertiesIdenticalTo(source, target, excludedProperties); } + var result = -1; + if (isTupleType(target)) { + if (isArrayType(source) || isTupleType(source)) { + if (!target.target.readonly && (isReadonlyArrayType(source) || isTupleType(source) && source.target.readonly)) { + return 0; + } + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var sourceRestFlag = isTupleType(source) ? source.target.combinedFlags & 4 : 4; + var targetRestFlag = target.target.combinedFlags & 4; + var sourceMinLength = isTupleType(source) ? source.target.minLength : 0; + var targetMinLength = target.target.minLength; + if (!sourceRestFlag && sourceArity < targetMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength); + } + return 0; + } + if (!targetRestFlag && targetArity < sourceMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity); + } + return 0; + } + if (!targetRestFlag && sourceRestFlag) { + if (reportErrors) { + if (sourceMinLength < targetMinLength) { + reportError(ts.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength); + } + else { + reportError(ts.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity); + } + } + return 0; + } + var maxArity = Math.max(sourceArity, targetArity); + for (var i = 0; i < maxArity; i++) { + var targetFlags = i < targetArity ? target.target.elementFlags[i] : targetRestFlag; + var sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag; + if (sourceFlags && targetFlags) { + if (targetFlags & 8 && !(sourceFlags & 8) || + (sourceFlags & 8 && !(targetFlags & 12))) { + if (reportErrors) { + reportError(ts.Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i); + } + return 0; + } + if (targetFlags & 1) { + if (!(sourceFlags & 1)) { + if (reportErrors) { + reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, i, typeToString(source), typeToString(target)); + } + return 0; + } + } + var sourceType = getTypeArguments(source)[Math.min(i, sourceArity - 1)]; + var targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)]; + var targetCheckType = sourceFlags & 8 && targetFlags & 4 ? createArrayType(targetType) : targetType; + var related = isRelatedTo(sourceType, targetCheckType, reportErrors, undefined, intersectionState); + if (!related) { + if (reportErrors) { + reportIncompatibleError(ts.Diagnostics.Types_of_property_0_are_incompatible, i); + } + return 0; + } + result &= related; + } + } + return result; + } + if (target.target.combinedFlags & 12) { + return 0; + } + } var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source) && !isEmptyArrayLiteralType(source) && !isTupleType(source); var unmatchedProperty = getUnmatchedProperty(source, target, requireOptionalProperties, false); if (unmatchedProperty) { @@ -47850,35 +48119,6 @@ var ts; } } } - var result = -1; - if (isTupleType(target)) { - var targetRestType = getRestTypeOfTupleType(target); - if (targetRestType) { - if (!isTupleType(source)) { - return 0; - } - var sourceRestType = getRestTypeOfTupleType(source); - if (sourceRestType && !isRelatedTo(sourceRestType, targetRestType, reportErrors)) { - if (reportErrors) { - reportError(ts.Diagnostics.Rest_signatures_are_incompatible); - } - return 0; - } - var targetCount = getTypeReferenceArity(target) - 1; - var sourceCount = getTypeReferenceArity(source) - (sourceRestType ? 1 : 0); - var sourceTypeArguments = getTypeArguments(source); - for (var i = targetCount; i < sourceCount; i++) { - var related = isRelatedTo(sourceTypeArguments[i], targetRestType, reportErrors); - if (!related) { - if (reportErrors) { - reportError(ts.Diagnostics.Property_0_is_incompatible_with_rest_element_type, "" + i); - } - return 0; - } - result &= related; - } - } - } var properties = getPropertiesOfType(target); var numericNamesOnly = isTupleType(source) && isTupleType(target); for (var _b = 0, _c = excludeProperties(properties, excludedProperties); _b < _c.length; _b++) { @@ -48193,7 +48433,7 @@ var ts; if (!variances) { cache.variances = ts.emptyArray; variances = []; - var _loop_16 = function (tp) { + var _loop_17 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -48218,7 +48458,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_16(tp); + _loop_17(tp); } cache.variances = variances; } @@ -48585,15 +48825,40 @@ var ts; function isTupleType(type) { return !!(ts.getObjectFlags(type) & 4 && type.target.objectFlags & 8); } + function isGenericTupleType(type) { + return isTupleType(type) && !!(type.target.combinedFlags & 8); + } + function isSingleElementGenericTupleType(type) { + return isGenericTupleType(type) && type.target.elementFlags.length === 1; + } function getRestTypeOfTupleType(type) { - return type.target.hasRestElement ? getTypeArguments(type)[type.target.typeParameters.length - 1] : undefined; + return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength); } function getRestArrayTypeOfTupleType(type) { var restType = getRestTypeOfTupleType(type); return restType && createArrayType(restType); } - function getLengthOfTupleType(type) { - return getTypeReferenceArity(type) - (type.target.hasRestElement ? 1 : 0); + function getEndLengthOfType(type) { + return isTupleType(type) ? getTypeReferenceArity(type) - ts.findLastIndex(type.target.elementFlags, function (f) { return !!(f & 12); }) - 1 : 0; + } + function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) { + if (endSkipCount === void 0) { endSkipCount = 0; } + if (writing === void 0) { writing = false; } + var length = getTypeReferenceArity(type) - endSkipCount; + if (index < length) { + var typeArguments = getTypeArguments(type); + var elementTypes = []; + for (var i = index; i < length; i++) { + var t = typeArguments[i]; + elementTypes.push(type.target.elementFlags[i] & 8 ? getIndexedAccessType(t, numberType) : t); + } + return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes); + } + return undefined; + } + function isTupleTypeStructureMatching(t1, t2) { + return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && + ts.every(t1.target.elementFlags, function (f, i) { return (f & 12) === (t2.target.elementFlags[i] & 12); }); } function isZeroBigInt(_a) { var value = _a.value; @@ -49025,7 +49290,8 @@ var ts; inferredType: undefined, priority: undefined, topLevel: true, - isFixed: false + isFixed: false, + impliedArity: undefined }; } function cloneInferenceInfo(inference) { @@ -49036,7 +49302,8 @@ var ts; inferredType: inference.inferredType, priority: inference.priority, topLevel: inference.topLevel, - isFixed: inference.isFixed + isFixed: inference.isFixed, + impliedArity: inference.impliedArity }; } function cloneInferredPartOfContext(context) { @@ -49121,9 +49388,10 @@ var ts; } if (isTupleType(source)) { var elementTypes = ts.map(getTypeArguments(source), function (t) { return inferReverseMappedType(t, target, constraint); }); - var minLength = getMappedTypeModifiers(target) & 4 ? - getTypeReferenceArity(source) - (source.target.hasRestElement ? 1 : 0) : source.target.minLength; - return createTupleType(elementTypes, minLength, source.target.hasRestElement, source.target.readonly, source.target.labeledElementDeclarations); + var elementFlags = getMappedTypeModifiers(target) & 4 ? + ts.sameMap(source.target.elementFlags, function (f) { return f & 2 ? 1 : f; }) : + source.target.elementFlags; + return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations); } var reversed = createObjectType(2048 | 16, undefined); reversed.source = source; @@ -49185,11 +49453,11 @@ var ts; return result.value; } function tupleTypesDefinitelyUnrelated(source, target) { - return target.target.minLength > source.target.minLength || - !getRestTypeOfTupleType(target) && (!!getRestTypeOfTupleType(source) || getLengthOfTupleType(target) < getLengthOfTupleType(source)); + return !(target.target.combinedFlags & 8) && target.target.minLength > source.target.minLength || + !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength); } function typesDefinitelyUnrelated(source, target) { - return isTupleType(source) && isTupleType(target) && tupleTypesDefinitelyUnrelated(source, target) || + return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, false, true) && !!getUnmatchedProperty(target, source, false, true); } @@ -49590,22 +49858,52 @@ var ts; if (!typesDefinitelyUnrelated(source, target)) { if (isArrayType(source) || isTupleType(source)) { if (isTupleType(target)) { - var sourceLength = isTupleType(source) ? getLengthOfTupleType(source) : 0; - var targetLength = getLengthOfTupleType(target); - var sourceRestType = isTupleType(source) ? getRestTypeOfTupleType(source) : getElementTypeOfArrayType(source); - var targetRestType = getRestTypeOfTupleType(target); - var fixedLength = targetLength < sourceLength || sourceRestType ? targetLength : sourceLength; - for (var i = 0; i < fixedLength; i++) { - inferFromTypes(i < sourceLength ? getTypeArguments(source)[i] : sourceRestType, getTypeArguments(target)[i]); + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var elementTypes = getTypeArguments(target); + var elementFlags = target.target.elementFlags; + if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { + for (var i = 0; i < targetArity; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + return; } - if (targetRestType) { - var types = fixedLength < sourceLength ? getTypeArguments(source).slice(fixedLength, sourceLength) : []; - if (sourceRestType) { - types.push(sourceRestType); + var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; + var sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & 4 ? + getTypeArguments(source)[sourceArity - 1] : undefined; + var endLength = !(target.target.combinedFlags & 12) ? 0 : + sourceRestType ? getEndLengthOfType(target) : + Math.min(getEndLengthOfType(source), getEndLengthOfType(target)); + var sourceEndLength = sourceRestType ? 0 : endLength; + for (var i = 0; i < startLength; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + if (sourceRestType && sourceArity - startLength === 1) { + for (var i = startLength; i < targetArity - endLength; i++) { + inferFromTypes(elementFlags[i] & 8 ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]); } - if (types.length) { - inferFromTypes(getUnionType(types), targetRestType); + } + else { + var middleLength = targetArity - startLength - endLength; + if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 && isTupleType(source)) { + var targetInfo = getInferenceInfoForType(elementTypes[startLength]); + if (targetInfo && targetInfo.impliedArity !== undefined) { + inferFromTypes(sliceTupleType(source, startLength, sourceEndLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]); + inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, sourceEndLength), elementTypes[startLength + 1]); + } } + else if (middleLength === 1 && elementFlags[startLength] & 8) { + inferFromTypes(isTupleType(source) ? sliceTupleType(source, startLength, sourceEndLength) : createArrayType(sourceRestType), elementTypes[startLength]); + } + else if (middleLength === 1 && elementFlags[startLength] & 4) { + var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, sourceEndLength) : sourceRestType; + if (restType) { + inferFromTypes(restType, elementTypes[startLength]); + } + } + } + for (var i = 0; i < endLength; i++) { + inferFromTypes(sourceRestType || getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]); } return; } @@ -50484,7 +50782,7 @@ var ts; var signature = getEffectsSignature(flow.node); if (signature) { var predicate = getTypePredicateOfSignature(signature); - if (predicate && predicate.kind === 3) { + if (predicate && predicate.kind === 3 && !predicate.type) { var predicateArgument = flow.node.arguments[predicate.parameterIndex]; if (predicateArgument && isFalseExpression(predicateArgument)) { return false; @@ -52042,7 +52340,7 @@ var ts; var args = getEffectiveCallArguments(iife); var indexOfParameter = func.parameters.indexOf(parameter); if (parameter.dotDotDotToken) { - return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, undefined); + return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, undefined, 0); } var links = getNodeLinks(iife); var cached = links.resolvedSignature; @@ -52704,6 +53002,9 @@ var ts; var arrayOrIterableType = checkExpression(node.expression, checkMode); return checkIteratedTypeOrElementType(33, arrayOrIterableType, undefinedType, node.expression); } + function checkSyntheticExpression(node) { + return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type; + } function hasDefaultValue(node) { return (node.kind === 195 && !!node.initializer) || (node.kind === 213 && node.operatorToken.kind === 62); @@ -52712,62 +53013,48 @@ var ts; var elements = node.elements; var elementCount = elements.length; var elementTypes = []; - var hasEndingSpreadElement = false; - var hasNonEndingSpreadElement = false; + var elementFlags = []; var contextualType = getApparentTypeOfContextualType(node); var inDestructuringPattern = ts.isAssignmentTarget(node); var inConstContext = isConstContext(node); for (var i = 0; i < elementCount; i++) { var e = elements[i]; - var spread = e.kind === 217 && e.expression; - var spreadType = spread && checkExpression(spread, checkMode, forceTuple); - if (spreadType && isTupleType(spreadType)) { - elementTypes.push.apply(elementTypes, getTypeArguments(spreadType)); - if (spreadType.target.hasRestElement) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + if (e.kind === 217) { + if (languageVersion < 2) { + checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 : 2048); + } + var spreadType = checkExpression(e.expression, checkMode, forceTuple); + if (isArrayLikeType(spreadType)) { + elementTypes.push(spreadType); + elementFlags.push(8); + } + else if (inDestructuringPattern) { + var restElementType = getIndexTypeOfType(spreadType, 1) || + getIteratedTypeOrElementType(65, spreadType, undefinedType, undefined, false) || + unknownType; + elementTypes.push(restElementType); + elementFlags.push(4); + } + else { + elementTypes.push(checkIteratedTypeOrElementType(33, spreadType, undefinedType, e.expression)); + elementFlags.push(4); } } else { - if (inDestructuringPattern && spreadType) { - var restElementType = getIndexTypeOfType(spreadType, 1) || - getIteratedTypeOrElementType(65, spreadType, undefinedType, undefined, false); - if (restElementType) { - elementTypes.push(restElementType); - } - } - else { - var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); - var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); - elementTypes.push(type); - } - if (spread) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; - } + var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); + var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); + elementTypes.push(type); + elementFlags.push(1); } } - if (!hasNonEndingSpreadElement) { - var minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0); - var tupleResult = void 0; - if (inDestructuringPattern && minLength > 0) { - var type = cloneTypeReference(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - type.pattern = node; - return type; - } - else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) { - return createArrayLiteralType(tupleResult); - } - else if (forceTuple) { - return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - } + if (inDestructuringPattern) { + return createTupleType(elementTypes, elementFlags); + } + if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) { + return createArrayLiteralType(createTupleType(elementTypes, elementFlags, inConstContext)); } return createArrayLiteralType(createArrayType(elementTypes.length ? - getUnionType(elementTypes, 2) : + getUnionType(ts.sameMap(elementTypes, function (t, i) { return elementFlags[i] & 8 ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t; }), 2) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext)); } function createArrayLiteralType(type) { @@ -52781,13 +53068,6 @@ var ts; } return literalType; } - function getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, readonly) { - if (elementCount === void 0) { elementCount = elementTypes.length; } - if (readonly === void 0) { readonly = false; } - if (readonly || (contextualType && forEachType(contextualType, isTupleLikeType))) { - return createTupleType(elementTypes, elementCount - (hasRestElement ? 1 : 0), hasRestElement, readonly); - } - } function isNumericName(name) { switch (name.kind) { case 157: @@ -53134,9 +53414,9 @@ var ts; var contextualType = getApparentTypeOfContextualType(openingLikeElement.attributes); var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName); var childrenPropSymbol = createSymbol(4 | 33554432, jsxChildrenPropertyName); - childrenPropSymbol.type = childrenTypes.length === 1 ? - childrenTypes[0] : - (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, false) || createArrayType(getUnionType(childrenTypes))); + childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : + childrenContextualType && forEachType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : + createArrayType(getUnionType(childrenTypes)); childrenPropSymbol.valueDeclaration = ts.factory.createPropertySignature(undefined, ts.unescapeLeadingUnderscores(jsxChildrenPropertyName), undefined, undefined); ts.setParent(childrenPropSymbol.valueDeclaration, attributes); childrenPropSymbol.valueDeclaration.symbol = childrenPropSymbol; @@ -53878,6 +54158,14 @@ var ts; function getSuggestedSymbolForNonexistentProperty(name, containingType) { return getSpellingSuggestionForName(ts.isString(name) ? name : ts.idText(name), getPropertiesOfType(containingType), 111551); } + function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) { + var strName = ts.isString(name) ? name : ts.idText(name); + var properties = getPropertiesOfType(containingType); + var jsxSpecific = strName === "for" ? ts.find(properties, function (x) { return ts.symbolName(x) === "htmlFor"; }) + : strName === "class" ? ts.find(properties, function (x) { return ts.symbolName(x) === "className"; }) + : undefined; + return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551); + } function getSuggestionForNonexistentProperty(name, containingType) { var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType); return suggestion && ts.symbolName(suggestion); @@ -54193,25 +54481,9 @@ var ts; else { argCount = signatureHelpTrailingComma ? args.length + 1 : args.length; callIsIncomplete = node.arguments.end === node.end; - var firstSpreadArgIndex = getSpreadArgumentIndex(args); - if (firstSpreadArgIndex >= 0) { - if (firstSpreadArgIndex === args.length - 1) { - return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature)); - } - var totalCount = firstSpreadArgIndex; - for (var i = firstSpreadArgIndex; i < args.length; i++) { - var arg = args[i]; - if (!isSpreadArgument(arg)) { - totalCount += 1; - } - else { - var argType = flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression); - totalCount += isTupleType(argType) ? getTypeArguments(argType).length - : isArrayType(argType) ? 0 - : 1; - } - } - return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount <= getParameterCount(signature)); + var spreadArgIndex = getSpreadArgumentIndex(args); + if (spreadArgIndex >= 0) { + return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature)); } } if (!hasEffectiveRestParameter(signature) && argCount > effectiveParameterCount) { @@ -54306,6 +54578,12 @@ var ts; } var restType = getNonArrayRestType(signature); var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; + if (restType && restType.flags & 262144) { + var info = ts.find(context.inferences, function (info) { return info.typeParameter === restType; }); + if (info) { + info.impliedArity = ts.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : undefined; + } + } for (var i = 0; i < argCount; i++) { var arg = args[i]; if (arg.kind !== 219) { @@ -54315,44 +54593,53 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode); inferTypes(context.inferences, spreadType, restType); } return getInferredTypes(context); } - function getArrayifiedType(type) { - return type.flags & 1048576 ? mapType(type, getArrayifiedType) : - type.flags & (1 | 63176704) || isMutableArrayOrTuple(type) ? type : - isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.minLength, type.target.hasRestElement, false, type.target.labeledElementDeclarations) : - createArrayType(getIndexedAccessType(type, numberType)); + function getMutableArrayOrTupleType(type) { + return type.flags & 1048576 ? mapType(type, getMutableArrayOrTupleType) : + type.flags & 1 || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : + isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, false, type.target.labeledElementDeclarations) : + createTupleType([type], [8]); } - function getSpreadArgumentType(args, index, argCount, restType, context) { + function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) { if (index >= argCount - 1) { var arg = args[argCount - 1]; if (isSpreadArgument(arg)) { - return arg.kind === 224 ? - createArrayType(arg.type) : - getArrayifiedType(checkExpressionWithContextualType(arg.expression, restType, context, 0)); + return getMutableArrayOrTupleType(arg.kind === 224 ? arg.type : + checkExpressionWithContextualType(arg.expression, restType, context, checkMode)); } } var types = []; + var flags = []; var names = []; - var spreadIndex = -1; for (var i = index; i < argCount; i++) { - var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); - var argType = checkExpressionWithContextualType(args[i], contextualType, context, 0); - if (spreadIndex < 0 && isSpreadArgument(args[i])) { - spreadIndex = i - index; + var arg = args[i]; + if (isSpreadArgument(arg)) { + var spreadType = arg.kind === 224 ? arg.type : checkExpression(arg.expression); + if (isArrayLikeType(spreadType)) { + types.push(spreadType); + flags.push(8); + } + else { + types.push(checkIteratedTypeOrElementType(33, spreadType, undefinedType, arg.kind === 217 ? arg.expression : arg)); + flags.push(4); + } } - if (args[i].kind === 224 && args[i].tupleNameSource) { - names.push(args[i].tupleNameSource); + else { + var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); + var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); + var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 | 4194304); + types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); + flags.push(1); + } + if (arg.kind === 224 && arg.tupleNameSource) { + names.push(arg.tupleNameSource); } - var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 | 4194304); - types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); } - return spreadIndex < 0 ? - createTupleType(types, undefined, undefined, undefined, ts.length(names) === ts.length(types) ? names : undefined) : - createTupleType(ts.append(types.slice(0, spreadIndex), getUnionType(types.slice(spreadIndex))), spreadIndex, true, undefined); + return createTupleType(types, flags, false, ts.length(names) === ts.length(types) ? names : undefined); } function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) { var isJavascript = ts.isInJSFile(signature.declaration); @@ -54515,7 +54802,7 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, undefined); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, undefined, checkMode); var errorNode = reportErrors ? argCount < args.length ? args[argCount] : node : undefined; if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, undefined, errorOutputContainer)) { ts.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors"); @@ -54568,16 +54855,28 @@ var ts; return node.attributes.properties.length > 0 || (ts.isJsxOpeningElement(node) && node.parent.children.length > 0) ? [node.attributes] : ts.emptyArray; } var args = node.arguments || ts.emptyArray; - var length = args.length; - if (length && isSpreadArgument(args[length - 1]) && getSpreadArgumentIndex(args) === length - 1) { - var spreadArgument_1 = args[length - 1]; - var type_4 = flowLoopCount ? checkExpression(spreadArgument_1.expression) : checkExpressionCached(spreadArgument_1.expression); - if (isTupleType(type_4)) { - var typeArguments = getTypeArguments(type_4); - var restIndex_2 = type_4.target.hasRestElement ? typeArguments.length - 1 : -1; - var syntheticArgs = ts.map(typeArguments, function (t, i) { var _a; return createSyntheticExpression(spreadArgument_1, t, i === restIndex_2, (_a = type_4.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); }); - return ts.concatenate(args.slice(0, length - 1), syntheticArgs); + var spreadIndex = getSpreadArgumentIndex(args); + if (spreadIndex >= 0) { + var effectiveArgs_1 = args.slice(0, spreadIndex); + var _loop_18 = function (i) { + var arg = args[i]; + var spreadType = arg.kind === 217 && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); + if (spreadType && isTupleType(spreadType)) { + ts.forEach(getTypeArguments(spreadType), function (t, i) { + var _a; + var flags = spreadType.target.elementFlags[i]; + var syntheticArg = createSyntheticExpression(arg, flags & 4 ? createArrayType(t) : t, !!(flags & 12), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + effectiveArgs_1.push(syntheticArg); + }); + } + else { + effectiveArgs_1.push(arg); + } + }; + for (var i = spreadIndex; i < args.length; i++) { + _loop_18(i); } + return effectiveArgs_1; } return args; } @@ -54810,7 +55109,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_17 = function (c) { + var _loop_19 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0, true, chain_2); if (diags_2) { @@ -54828,7 +55127,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_17(c); + _loop_19(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -54949,7 +55248,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_18 = function (i) { + var _loop_20 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -54957,7 +55256,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_18(i); + _loop_20(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0; @@ -55792,51 +56091,44 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[paramCount]); var index = pos - paramCount; - if (!isTupleType(restType) || restType.target.hasRestElement || index < getTypeArguments(restType).length) { + if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) { return getIndexedAccessType(restType, getLiteralType(index)); } } return undefined; } function getRestTypeAtPosition(source, pos) { - var paramCount = getParameterCount(source); + var parameterCount = getParameterCount(source); + var minArgumentCount = getMinArgumentCount(source); var restType = getEffectiveRestType(source); - var nonRestCount = paramCount - (restType ? 1 : 0); - if (restType && pos === nonRestCount) { - return restType; + if (restType && pos >= parameterCount - 1) { + return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType)); } var types = []; + var flags = []; var names = []; - for (var i = pos; i < nonRestCount; i++) { - types.push(getTypeAtPosition(source, i)); + for (var i = pos; i < parameterCount; i++) { + if (!restType || i < parameterCount - 1) { + types.push(getTypeAtPosition(source, i)); + flags.push(i < minArgumentCount ? 1 : 2); + } + else { + types.push(restType); + flags.push(8); + } var name = getNameableDeclarationAtPosition(source, i); - if (name && names) { + if (name) { names.push(name); } - else { - names = undefined; - } } - if (restType) { - types.push(getIndexedAccessType(restType, numberType)); - var name = getNameableDeclarationAtPosition(source, nonRestCount); - if (name && names) { - names.push(name); - } - else { - names = undefined; - } - } - var minArgumentCount = getMinArgumentCount(source); - var minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos; - return createTupleType(types, minLength, !!restType, false, names); + return createTupleType(types, flags, false, ts.length(names) === ts.length(types) ? names : undefined); } function getParameterCount(signature) { var length = signature.parameters.length; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[length - 1]); if (isTupleType(restType)) { - return length + getTypeArguments(restType).length - 1; + return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1); } } return length; @@ -55845,9 +56137,10 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (isTupleType(restType)) { - var minLength = restType.target.minLength; - if (minLength > 0) { - return signature.parameters.length - 1 + minLength; + var firstOptionalIndex = ts.findIndex(restType.target.elementFlags, function (f) { return !(f & 1); }); + var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex; + if (requiredCount > 0) { + return signature.parameters.length - 1 + requiredCount; } } } @@ -55866,7 +56159,12 @@ var ts; function getEffectiveRestType(signature) { if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); - return isTupleType(restType) ? getRestArrayTypeOfTupleType(restType) : restType; + if (!isTupleType(restType)) { + return restType; + } + if (restType.target.hasRestElement) { + return sliceTupleType(restType, restType.target.fixedLength); + } } return undefined; } @@ -56157,8 +56455,8 @@ var ts; var operandType = getTypeOfExpression(node.expression.expression); var witnesses = getSwitchClauseTypeOfWitnesses(node, false); var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, true); - var type_5 = getBaseConstraintOfType(operandType) || operandType; - return !!(filterType(type_5, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072); + var type_4 = getBaseConstraintOfType(operandType) || operandType; + return !!(filterType(type_4, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072); } var type = getTypeOfExpression(node.expression); if (!isLiteralType(type)) { @@ -56440,7 +56738,7 @@ var ts; error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference); return booleanType; } - if (expr.kind === 198 && ts.isPrivateIdentifier(expr.name)) { + if (ts.isPropertyAccessExpression(expr) && ts.isPrivateIdentifier(expr.name)) { error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } var links = getNodeLinks(expr); @@ -57384,18 +57682,19 @@ var ts; } function padTupleType(type, pattern) { var patternElements = pattern.elements; - var arity = getTypeReferenceArity(type); - var elementTypes = arity ? getTypeArguments(type).slice() : []; - for (var i = arity; i < patternElements.length; i++) { + var elementTypes = getTypeArguments(type).slice(); + var elementFlags = type.target.elementFlags.slice(); + for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) { var e = patternElements[i]; if (i < patternElements.length - 1 || !(e.kind === 195 && e.dotDotDotToken)) { elementTypes.push(!ts.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, false, false) : anyType); + elementFlags.push(2); if (!ts.isOmittedExpression(e) && !hasDefaultValue(e)) { reportImplicitAny(e, anyType); } } } - return createTupleType(elementTypes, type.target.minLength, false, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration, type) { var widened = ts.getCombinedNodeFlags(declaration) & 2 || ts.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type); @@ -57761,7 +58060,7 @@ var ts; case 216: return checkYieldExpression(node); case 224: - return node.type; + return checkSyntheticExpression(node); case 280: return checkJsxExpression(node, checkMode); case 270: @@ -58348,16 +58647,20 @@ var ts; grammarErrorOnNode(e, ts.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names); break; } - if (isTupleRestElement(e)) { + var flags = getTupleElementFlags(e); + if (flags & 8) { + if (!isArrayLikeType(getTypeFromTypeNode(e.type))) { + error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); + break; + } + } + else if (flags & 4) { if (i !== elementTypes.length - 1) { grammarErrorOnNode(e, ts.Diagnostics.A_rest_element_must_be_last_in_a_tuple_type); break; } - if (!isArrayType(getTypeFromTypeNode(e.type))) { - error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); - } } - else if (isTupleOptionalElement(e)) { + else if (flags & 2) { seenOptionalElement = true; } else if (seenOptionalElement) { @@ -60805,7 +61108,7 @@ var ts; } function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { var issuedMemberError = false; - var _loop_19 = function (member) { + var _loop_21 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -60823,7 +61126,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_19(member); + _loop_21(member); } if (!issuedMemberError) { checkTypeAssignableTo(typeWithThis, baseWithThis, node.name || node, broadDiag); @@ -87664,7 +87967,7 @@ var ts; importedFileFromNodeModules = importedFileFromNodeModules || ts.pathContainsNodeModules(path); }); var sortedPaths = []; - var _loop_20 = function (directory) { + var _loop_22 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -87689,7 +87992,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_20(directory); + var state_8 = _loop_22(directory); directory = out_directory_1; if (state_8 === "break") break; @@ -88660,7 +88963,7 @@ var ts; configFileSpecs = configFileParseResult.configFileSpecs; projectReferences = configFileParseResult.projectReferences; configFileParsingDiagnostics = ts.getConfigFileParsingDiagnostics(configFileParseResult).slice(); - canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(configFileParseResult.raw); + canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function onSourceFileChange(fileName, eventKind, path) { @@ -89468,7 +89771,7 @@ var ts; } else if (reloadLevel === ts.ConfigFileProgramReloadLevel.Partial) { var result = ts.getFileNamesFromConfigSpecs(config.configFileSpecs, ts.getDirectoryPath(project), config.options, state.parseConfigFileHost); - ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInutFiles(config.raw)); + ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInputFiles(config.raw)); config.fileNames = result.fileNames; watchInputFiles(state, project, projectPath, config); } @@ -89597,7 +89900,7 @@ var ts; newestInputFileTime = inputTime; } } - if (!project.fileNames.length && !ts.canJsonReportNoInutFiles(project.raw)) { + if (!project.fileNames.length && !ts.canJsonReportNoInputFiles(project.raw)) { return { type: ts.UpToDateStatusType.ContainerOnly }; diff --git a/lib/tsserver.js b/lib/tsserver.js index a9d5e00c589..39d2ef5eab3 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -94,7 +94,7 @@ var ts; // If changing the text in this section, be sure to test `configurePrerelease` too. ts.versionMajorMinor = "4.0"; /** The version of the TypeScript compiler release */ - ts.version = ts.versionMajorMinor + ".0-dev"; + ts.version = ts.versionMajorMinor + ".0-beta"; /** * Returns the native Map implementation if it is available and compatible (i.e. supports iteration). */ @@ -1202,6 +1202,14 @@ var ts; return values; } ts.getOwnValues = getOwnValues; + function arrayOf(count, f) { + var result = new Array(count); + for (var i = 0; i < count; i++) { + result[i] = f(i); + } + return result; + } + ts.arrayOf = arrayOf; function arrayFrom(iterator, map) { var result = []; for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) { @@ -4138,6 +4146,14 @@ var ts; VarianceFlags[VarianceFlags["Unreliable"] = 16] = "Unreliable"; VarianceFlags[VarianceFlags["AllowsStructuralFallback"] = 24] = "AllowsStructuralFallback"; })(VarianceFlags = ts.VarianceFlags || (ts.VarianceFlags = {})); + var ElementFlags; + (function (ElementFlags) { + ElementFlags[ElementFlags["Required"] = 1] = "Required"; + ElementFlags[ElementFlags["Optional"] = 2] = "Optional"; + ElementFlags[ElementFlags["Rest"] = 4] = "Rest"; + ElementFlags[ElementFlags["Variadic"] = 8] = "Variadic"; + ElementFlags[ElementFlags["Variable"] = 12] = "Variable"; + })(ElementFlags = ts.ElementFlags || (ts.ElementFlags = {})); /* @internal */ var JsxReferenceKind; (function (JsxReferenceKind) { @@ -7430,6 +7446,11 @@ var ts; Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), + Source_has_0_element_s_but_target_requires_1: diag(2618, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), + Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), + Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), + Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), + Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other: diag(2622, ts.DiagnosticCategory.Error, "Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other_2622", "Element at index {0} is variadic in one type but not in the other."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), @@ -8260,6 +8281,17 @@ var ts; Convert_to_named_function: diag(95124, ts.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: diag(95125, ts.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: diag(95126, ts.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"), + Could_not_find_a_containing_arrow_function: diag(95127, ts.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), + Containing_function_is_not_an_arrow_function: diag(95128, ts.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), + Could_not_find_export_statement: diag(95129, ts.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"), + This_file_already_has_a_default_export: diag(95130, ts.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"), + Could_not_find_import_clause: diag(95131, ts.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"), + Could_not_find_namespace_import_or_named_imports: diag(95132, ts.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), + Selection_is_not_a_valid_type_node: diag(95133, ts.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), + No_type_could_be_extracted_from_this_type_node: diag(95134, ts.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), + Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), + Name_is_not_valid: diag(95136, ts.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"), + Can_only_convert_property_with_modifier: diag(95137, ts.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: diag(18006, ts.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), @@ -29765,7 +29797,7 @@ var ts; type = finishNode(factory.createJSDocNonNullableType(type), pos); break; case 57 /* QuestionToken */: - // If not in JSDoc and next token is start of a type we have a conditional type + // If next token is start of a type we have a conditional type if (lookAhead(nextTokenIsStartOfType)) { return type; } @@ -36570,7 +36602,7 @@ var ts; includeSpecs = ["**/*"]; } var result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile); - if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) { + if (shouldReportNoInputFiles(result, canJsonReportNoInputFiles(raw), resolutionStack)) { errors.push(getErrorForNoInputFiles(result.spec, configFileName)); } if (ts.hasProperty(raw, "references") && !isNullOrUndefined(raw.references)) { @@ -36613,10 +36645,10 @@ var ts; return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0); } /*@internal*/ - function canJsonReportNoInutFiles(raw) { + function canJsonReportNoInputFiles(raw) { return !ts.hasProperty(raw, "files") && !ts.hasProperty(raw, "references"); } - ts.canJsonReportNoInutFiles = canJsonReportNoInutFiles; + ts.canJsonReportNoInputFiles = canJsonReportNoInputFiles; /*@internal*/ function updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) { var existingErrors = configParseDiagnostics.length; @@ -42422,6 +42454,7 @@ var ts; getAllPossiblePropertiesOfTypes: getAllPossiblePropertiesOfTypes, getSuggestedSymbolForNonexistentProperty: getSuggestedSymbolForNonexistentProperty, getSuggestionForNonexistentProperty: getSuggestionForNonexistentProperty, + getSuggestedSymbolForNonexistentJSXAttribute: getSuggestedSymbolForNonexistentJSXAttribute, getSuggestedSymbolForNonexistentSymbol: function (location, name, meaning) { return getSuggestedSymbolForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestionForNonexistentSymbol: function (location, name, meaning) { return getSuggestionForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestedSymbolForNonexistentModule: getSuggestedSymbolForNonexistentModule, @@ -46103,21 +46136,21 @@ var ts; if (typeArguments.length > 0) { var arity = getTypeReferenceArity(type); var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context); - var hasRestElement = type.target.hasRestElement; if (tupleConstituentNodes) { if (type.target.labeledElementDeclarations) { for (var i = 0; i < tupleConstituentNodes.length; i++) { - var isOptionalOrRest = i >= type.target.minLength; - var isRest = isOptionalOrRest && hasRestElement && i === arity - 1; - var isOptional = isOptionalOrRest && !isRest; - tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(isRest ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), isOptional ? ts.factory.createToken(57 /* QuestionToken */) : undefined, isRest ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]); + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(flags & 12 /* Variable */ ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), flags & 2 /* Optional */ ? ts.factory.createToken(57 /* QuestionToken */) : undefined, flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]); } } else { - for (var i = type.target.minLength; i < Math.min(arity, tupleConstituentNodes.length); i++) { - tupleConstituentNodes[i] = hasRestElement && i === arity - 1 ? - ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(tupleConstituentNodes[i])) : - ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]); + for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) { + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = + flags & 12 /* Variable */ ? ts.factory.createRestTypeNode(flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : + flags & 2 /* Optional */ ? ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]; } } var tupleTypeNode = ts.setEmitFlags(ts.factory.createTupleTypeNode(tupleConstituentNodes), 1 /* SingleLine */); @@ -49228,13 +49261,14 @@ var ts; function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) { var elements = pattern.elements; var lastElement = ts.lastOrUndefined(elements); - var hasRestElement = !!(lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken); - if (elements.length === 0 || elements.length === 1 && hasRestElement) { + var restElement = lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken ? lastElement : undefined; + if (elements.length === 0 || elements.length === 1 && restElement) { return languageVersion >= 2 /* ES2015 */ ? createIterableType(anyType) : anyArrayType; } var elementTypes = ts.map(elements, function (e) { return ts.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors); }); - var minLength = ts.findLastIndex(elements, function (e) { return !ts.isOmittedExpression(e) && !hasDefaultValue(e); }, elements.length - (hasRestElement ? 2 : 1)) + 1; - var result = createTupleType(elementTypes, minLength, hasRestElement); + var minLength = ts.findLastIndex(elements, function (e) { return !(e === restElement || ts.isOmittedExpression(e) || hasDefaultValue(e)); }, elements.length - 1) + 1; + var elementFlags = ts.map(elements, function (e, i) { return e === restElement ? 4 /* Rest */ : i >= minLength ? 2 /* Optional */ : 1 /* Required */; }); + var result = createTupleType(elementTypes, elementFlags); if (includePatternInType) { result = cloneTypeReference(result); result.pattern = pattern; @@ -49880,7 +49914,7 @@ var ts; function getBaseTypes(type) { if (!type.resolvedBaseTypes) { if (type.objectFlags & 8 /* Tuple */) { - type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters || ts.emptyArray), type.readonly)]; + type.resolvedBaseTypes = [getTupleBaseType(type)]; } else if (type.symbol.flags & (32 /* Class */ | 64 /* Interface */)) { if (type.symbol.flags & 32 /* Class */) { @@ -49896,6 +49930,10 @@ var ts; } return type.resolvedBaseTypes; } + function getTupleBaseType(type) { + var elementTypes = ts.sameMap(type.typeParameters, function (t, i) { return type.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t; }); + return createArrayType(getUnionType(elementTypes || ts.emptyArray), type.readonly); + } function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = ts.resolvingEmptyArray; var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); @@ -50696,17 +50734,16 @@ var ts; return [sig.parameters]; function expandSignatureParametersWithTupleMembers(restType, restIndex) { var elementTypes = getTypeArguments(restType); - var minLength = restType.target.minLength; - var tupleRestIndex = restType.target.hasRestElement ? elementTypes.length - 1 : -1; var associatedNames = restType.target.labeledElementDeclarations; var restParams = ts.map(elementTypes, function (t, i) { // Lookup the label from the individual tuple passed in before falling back to the signature `rest` parameter name var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]); var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i); - var checkFlags = i === tupleRestIndex ? 32768 /* RestParameter */ : - i >= minLength ? 16384 /* OptionalParameter */ : 0; + var flags = restType.target.elementFlags[i]; + var checkFlags = flags & 12 /* Variable */ ? 32768 /* RestParameter */ : + flags & 2 /* Optional */ ? 16384 /* OptionalParameter */ : 0; var symbol = createSymbol(1 /* FunctionScopedVariable */, name, checkFlags); - symbol.type = i === tupleRestIndex ? createArrayType(t) : t; + symbol.type = flags & 4 /* Rest */ ? createArrayType(t) : t; return symbol; }); return ts.concatenate(sig.parameters.slice(0, restIndex), restParams); @@ -51395,6 +51432,9 @@ var ts; return indexedAccess; } } + if (isGenericTupleType(type.objectType)) { + return getIndexTypeOfType(type.objectType, 1 /* Number */); + } var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType); if (objectConstraint && objectConstraint !== type.objectType) { return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType); @@ -51574,6 +51614,9 @@ var ts; return keyofConstraintType; } if (t.flags & 8388608 /* IndexedAccess */) { + if (isGenericTupleType(t.objectType)) { + return getIndexTypeOfType(t.objectType, 1 /* Number */); + } var baseObjectType = getBaseConstraint(t.objectType); var baseIndexType = getBaseConstraint(t.indexType); var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType); @@ -52492,9 +52535,11 @@ var ts; } } } - // When an 'infer T' declaration is immediately contained in a rest parameter - // declaration, we infer an 'unknown[]' constraint. - else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken) { + // When an 'infer T' declaration is immediately contained in a rest parameter declaration, a rest type + // or a named rest tuple element, we infer an 'unknown[]' constraint. + else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken || + grandParent.kind === 180 /* RestType */ || + grandParent.kind === 191 /* NamedTupleMember */ && grandParent.dotDotDotToken) { inferences = ts.append(inferences, createArrayType(unknownType)); } } @@ -52616,9 +52661,7 @@ var ts; } else { type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function () { return errorType; })) || ts.emptyArray; - error(type.node || currentNode, type.target.symbol - ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves - : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); + error(type.node || currentNode, type.target.symbol ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); } } return type.resolvedTypeArguments; @@ -53049,22 +53092,32 @@ var ts; function createArrayType(elementType, readonly) { return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]); } - function isTupleRestElement(node) { - return node.kind === 180 /* RestType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.dotDotDotToken); + function getTupleElementFlags(node) { + switch (node.kind) { + case 179 /* OptionalType */: + return 2 /* Optional */; + case 180 /* RestType */: + return getRestTypeElementFlags(node); + case 191 /* NamedTupleMember */: + return node.questionToken ? 2 /* Optional */ : + node.dotDotDotToken ? getRestTypeElementFlags(node) : + 1 /* Required */; + default: + return 1 /* Required */; + } } - function isTupleOptionalElement(node) { - return node.kind === 179 /* OptionalType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.questionToken); + function getRestTypeElementFlags(node) { + return getArrayElementTypeNode(node.type) ? 4 /* Rest */ : 8 /* Variadic */; } function getArrayOrTupleTargetType(node) { var readonly = isReadonlyTypeOperator(node.parent); - if (node.kind === 177 /* ArrayType */ || node.elements.length === 1 && isTupleRestElement(node.elements[0])) { + var elementType = getArrayElementTypeNode(node); + if (elementType) { return readonly ? globalReadonlyArrayType : globalArrayType; } - var lastElement = ts.lastOrUndefined(node.elements); - var restElement = lastElement && isTupleRestElement(lastElement) ? lastElement : undefined; - var minLength = ts.findLastIndex(node.elements, function (n) { return !isTupleOptionalElement(n) && n !== restElement; }) + 1; + var elementFlags = ts.map(node.elements, getTupleElementFlags); var missingName = ts.some(node.elements, function (e) { return e.kind !== 191 /* NamedTupleMember */; }); - return getTupleTypeOfArity(node.elements.length, minLength, !!restElement, readonly, /*associatedNames*/ missingName ? undefined : node.elements); + return getTupleTargetType(elementFlags, readonly, /*associatedNames*/ missingName ? undefined : node.elements); } // Return true if the given type reference node is directly aliased or if it needs to be deferred // because it is possibly contained in a circular chain of eagerly resolved types. @@ -53133,13 +53186,13 @@ var ts; if (target === emptyGenericType) { links.resolvedType = emptyObjectType; } - else if (isDeferredTypeReferenceNode(node)) { + else if (!(node.kind === 178 /* TupleType */ && ts.some(node.elements, function (e) { return !!(getTupleElementFlags(e) & 8 /* Variadic */); })) && isDeferredTypeReferenceNode(node)) { links.resolvedType = node.kind === 178 /* TupleType */ && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, /*mapper*/ undefined); } else { var elementTypes = node.kind === 177 /* ArrayType */ ? [getTypeFromTypeNode(node.elementType)] : ts.map(node.elements, getTypeFromTypeNode); - links.resolvedType = createTypeReference(target, elementTypes); + links.resolvedType = createNormalizedTypeReference(target, elementTypes); } } return links.resolvedType; @@ -53147,6 +53200,27 @@ var ts; function isReadonlyTypeOperator(node) { return ts.isTypeOperatorNode(node) && node.operator === 141 /* ReadonlyKeyword */; } + function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) { + if (readonly === void 0) { readonly = false; } + var tupleTarget = getTupleTargetType(elementFlags || ts.map(elementTypes, function (_) { return 1 /* Required */; }), readonly, namedMemberDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : + tupleTarget; + } + function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + if (elementFlags.length === 1 && elementFlags[0] & 4 /* Rest */) { + // [...X[]] is equivalent to just X[] + return readonly ? globalReadonlyArrayType : globalArrayType; + } + var key = ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? "#" : f & 2 /* Optional */ ? "?" : f & 4 /* Rest */ ? "." : "*"; }).join() + + (readonly ? "R" : "") + + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); + var type = tupleTypes.get(key); + if (!type) { + tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations)); + } + return type; + } // We represent tuple types as type references to synthesized generic interface types created by // this function. The types are of the form: // @@ -53154,27 +53228,37 @@ var ts; // // Note that the generic type created by this function has no symbol associated with it. The same // is true for each of the synthesized type parameters. - function createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { + function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + var arity = elementFlags.length; + var minLength = ts.findLastIndex(elementFlags, function (f) { return !!(f & (1 /* Required */ | 8 /* Variadic */)); }) + 1; var typeParameters; var properties = []; - var maxLength = hasRestElement ? arity - 1 : arity; + var combinedFlags = 0; if (arity) { typeParameters = new Array(arity); for (var i = 0; i < arity; i++) { var typeParameter = typeParameters[i] = createTypeParameter(); - if (i < maxLength) { - var property = createSymbol(4 /* Property */ | (i >= minLength ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); + var flags = elementFlags[i]; + combinedFlags |= flags; + if (!(combinedFlags & 12 /* Variable */)) { + var property = createSymbol(4 /* Property */ | (flags & 2 /* Optional */ ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i]; property.type = typeParameter; properties.push(property); } } } - var literalTypes = []; - for (var i = minLength; i <= maxLength; i++) - literalTypes.push(getLiteralType(i)); + var fixedLength = properties.length; var lengthSymbol = createSymbol(4 /* Property */, "length"); - lengthSymbol.type = hasRestElement ? numberType : getUnionType(literalTypes); + if (combinedFlags & 12 /* Variable */) { + lengthSymbol.type = numberType; + } + else { + var literalTypes_1 = []; + for (var i = minLength; i <= arity; i++) + literalTypes_1.push(getLiteralType(i)); + lengthSymbol.type = getUnionType(literalTypes_1); + } properties.push(lengthSymbol); var type = createObjectType(8 /* Tuple */ | 4 /* Reference */); type.typeParameters = typeParameters; @@ -53192,38 +53276,110 @@ var ts; type.declaredConstructSignatures = ts.emptyArray; type.declaredStringIndexInfo = undefined; type.declaredNumberIndexInfo = undefined; + type.elementFlags = elementFlags; type.minLength = minLength; - type.hasRestElement = hasRestElement; + type.fixedLength = fixedLength; + type.hasRestElement = !!(combinedFlags & 12 /* Variable */); + type.combinedFlags = combinedFlags; type.readonly = readonly; type.labeledElementDeclarations = namedMemberDeclarations; return type; } - function getTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { - var key = arity + (hasRestElement ? "+" : ",") + minLength + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); - var type = tupleTypes.get(key); - if (!type) { - tupleTypes.set(key, type = createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations)); - } - return type; + function createNormalizedTypeReference(target, typeArguments) { + return target.objectFlags & 8 /* Tuple */ && target.combinedFlags & 8 /* Variadic */ ? + createNormalizedTupleType(target, typeArguments) : + createTypeReference(target, typeArguments); } - function createTupleType(elementTypes, minLength, hasRestElement, readonly, namedMemberDeclarations) { - if (minLength === void 0) { minLength = elementTypes.length; } - if (hasRestElement === void 0) { hasRestElement = false; } - if (readonly === void 0) { readonly = false; } - var arity = elementTypes.length; - if (arity === 1 && hasRestElement) { - return createArrayType(elementTypes[0], readonly); + function createNormalizedTupleType(target, elementTypes) { + var _a, _b, _c; + // Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z] + var unionIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (131072 /* Never */ | 1048576 /* Union */)); }); + if (unionIndex >= 0) { + return mapType(elementTypes[unionIndex], function (t) { return createNormalizedTupleType(target, ts.replaceElement(elementTypes, unionIndex, t)); }); + } + // If there are no variadic elements with non-generic types, just create a type reference with the same target type. + var spreadIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */) && !(t.flags & 58982400 /* InstantiableNonPrimitive */) && !isGenericMappedType(t); }); + if (spreadIndex < 0) { + return createTypeReference(target, elementTypes); + } + // We have non-generic variadic elements that need normalization. + var expandedTypes = []; + var expandedFlags = []; + var expandedDeclarations = []; + var optionalIndex = -1; + var restTypes; + var _loop_12 = function (i) { + var type = elementTypes[i]; + var flags = target.elementFlags[i]; + if (flags & 8 /* Variadic */) { + if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + // Generic variadic elements stay as they are (except following a rest element). + addElementOrRest(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + } + else if (isTupleType(type)) { + // Spread variadic elements with tuple types into the resulting tuple. + ts.forEach(getTypeArguments(type), function (t, n) { var _a; return addElementOrRest(t, type.target.elementFlags[n], (_a = type.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[n]); }); + } + else { + // Treat everything else as an array type and create a rest element. + addElementOrRest(isArrayLikeType(type) && getIndexTypeOfType(type, 1 /* Number */) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i]); + } + } + else { + // Copy other element kinds with no change. + addElementOrRest(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i]); + } + }; + for (var i = 0; i < elementTypes.length; i++) { + _loop_12(i); + } + if (restTypes) { + // Create a union of the collected rest element types. + expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); + } + var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : + tupleTarget; + function addElementOrRest(type, flags, declaration) { + if (restTypes) { + // A rest element was previously added, so simply collect the type of this element. + restTypes.push(flags & 8 /* Variadic */ ? getIndexedAccessType(type, numberType) : type); + } + else { + if (flags & 1 /* Required */ && optionalIndex >= 0) { + // Turn preceding optional elements into required elements + for (var i = optionalIndex; i < expandedFlags.length; i++) { + if (expandedFlags[i] & 2 /* Optional */) + expandedFlags[i] = 1 /* Required */; + } + optionalIndex = -1; + } + else if (flags & 2 /* Optional */ && optionalIndex < 0) { + optionalIndex = expandedFlags.length; + } + else if (flags & 4 /* Rest */) { + // Start collecting element types when a rest element is added. + restTypes = [type]; + } + expandedTypes.push(type); + expandedFlags.push(flags); + if (expandedDeclarations && declaration) { + expandedDeclarations.push(declaration); + } + else { + expandedDeclarations = undefined; + } + } } - var tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, namedMemberDeclarations); - return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType; } - function sliceTupleType(type, index) { - var tuple = type.target; - if (tuple.hasRestElement) { - // don't slice off rest element - index = Math.min(index, getTypeReferenceArity(type) - 1); - } - return createTupleType(getTypeArguments(type).slice(index), Math.max(0, tuple.minLength - index), tuple.hasRestElement, tuple.readonly, tuple.labeledElementDeclarations && tuple.labeledElementDeclarations.slice(index)); + function sliceTupleType(type, index, endSkipCount) { + if (endSkipCount === void 0) { endSkipCount = 0; } + var target = type.target; + var endIndex = getTypeReferenceArity(type) - endSkipCount; + return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts.emptyArray) : + createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), + /*readonly*/ false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex)); } function getTypeFromOptionalTypeNode(node) { var type = getTypeFromTypeNode(node.type); @@ -53737,7 +53893,7 @@ var ts; type = getReducedType(type); return type.flags & 1048576 /* Union */ ? getIntersectionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : type.flags & 2097152 /* Intersection */ ? getUnionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : - maybeTypeOfKind(type, 58982400 /* InstantiableNonPrimitive */) ? getIndexTypeForGenericType(type, stringsOnly) : + type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericTupleType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts.getObjectFlags(type) & 32 /* Mapped */ ? filterType(getConstraintTypeFromMappedType(type), function (t) { return !(noIndexSignatures && t.flags & (1 /* Any */ | 4 /* String */)); }) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : @@ -53984,7 +54140,7 @@ var ts; } return !!(type.objectFlags & 8388608 /* IsGenericObjectType */); } - return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type); + return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type) || isGenericTupleType(type); } function isGenericIndexType(type) { if (type.flags & 3145728 /* UnionOrIntersection */) { @@ -54058,6 +54214,15 @@ var ts; } // So ultimately (reading): // ((A & B) | C)[K1 | K2] -> ((A & B) | C)[K1] | ((A & B) | C)[K2] -> (A & B)[K1] | C[K1] | (A & B)[K2] | C[K2] -> (A[K1] & B[K1]) | C[K1] | (A[K2] & B[K2]) | C[K2] + // A generic tuple type indexed by a number exists only when the index type doesn't select a + // fixed element. We simplify to either the combined type of all elements (when the index type + // the actual number type) or to the combined type of all non-fixed elements. + if (isGenericTupleType(objectType) && indexType.flags & 296 /* NumberLike */) { + var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 /* Number */ ? 0 : objectType.target.fixedLength, /*endSkipCount*/ 0, writing); + if (elementType) { + return type[cache] = elementType; + } + } // If the object type is a mapped type { [P in K]: E }, where K is generic, instantiate E using a mapper // that substitutes the index type for P. For example, for an index access { [P in K]: Box }[X], we // construct the type Box. @@ -54104,6 +54269,18 @@ var ts; function getIndexedAccessType(objectType, indexType, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, 0 /* None */, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } + function indexTypeLessThan(indexType, limit) { + return everyType(indexType, function (t) { + if (t.flags & 384 /* StringOrNumberLiteral */) { + var propName = getPropertyNameFromType(t); + if (isNumericLiteralName(propName)) { + var index = +propName; + return index >= 0 && index < limit; + } + } + return false; + }); + } function getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, accessFlags, aliasSymbol, aliasTypeArguments) { if (accessFlags === void 0) { accessFlags = 0 /* None */; } if (objectType === wildcardType || indexType === wildcardType) { @@ -54114,12 +54291,15 @@ var ts; if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { indexType = stringType; } - // If the index type is generic, or if the object type is generic and doesn't originate in an expression, - // we are performing a higher-order index access where we cannot meaningfully access the properties of the - // object type. Note that for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in - // an expression. This is to preserve backwards compatibility. For example, an element access 'this["foo"]' - // has always been resolved eagerly using the constraint type of 'this' at the given location. - if (isGenericIndexType(indexType) || !(accessNode && accessNode.kind !== 188 /* IndexedAccessType */) && isGenericObjectType(objectType)) { + // If the index type is generic, or if the object type is generic and doesn't originate in an expression and + // the operation isn't exclusively indexing the fixed (non-variadic) portion of a tuple type, we are performing + // a higher-order index access where we cannot meaningfully access the properties of the object type. Note that + // for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in an expression. This is to + // preserve backwards compatibility. For example, an element access 'this["foo"]' has always been resolved + // eagerly using the constraint type of 'this' at the given location. + if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 188 /* IndexedAccessType */ ? + isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : + isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) { if (objectType.flags & 3 /* AnyOrUnknown */) { return objectType; } @@ -54201,7 +54381,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_12 = function () { + var _loop_13 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54275,7 +54455,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_12(); + var state_4 = _loop_13(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -54713,19 +54893,32 @@ var ts; } return links.resolvedType; } + function getTypeFromRestTypeNode(node) { + return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type); + } + function getArrayElementTypeNode(node) { + switch (node.kind) { + case 185 /* ParenthesizedType */: + return getArrayElementTypeNode(node.type); + case 178 /* TupleType */: + if (node.elements.length === 1) { + node = node.elements[0]; + if (node.kind === 180 /* RestType */ || node.kind === 191 /* NamedTupleMember */ && node.dotDotDotToken) { + return getArrayElementTypeNode(node.type); + } + } + break; + case 177 /* ArrayType */: + return node.elementType; + } + return undefined; + } function getTypeFromNamedTupleTypeNode(node) { var links = getNodeLinks(node); - if (!links.resolvedType) { - var type = getTypeFromTypeNode(node.type); - if (node.dotDotDotToken) { - type = getElementTypeOfArrayType(type) || errorType; - } - if (node.questionToken && strictNullChecks) { - type = getOptionalType(type); - } - links.resolvedType = type; - } - return links.resolvedType; + return links.resolvedType || (links.resolvedType = + node.dotDotDotToken ? getTypeFromRestTypeNode(node) : + node.questionToken && strictNullChecks ? getOptionalType(getTypeFromTypeNode(node.type)) : + getTypeFromTypeNode(node.type)); } function getTypeFromTypeNode(node) { return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node); @@ -54793,7 +54986,7 @@ var ts; case 298 /* JSDocTypeExpression */: return getTypeFromTypeNode(node.type); case 180 /* RestType */: - return getElementTypeOfArrayType(getTypeFromTypeNode(node.type)) || errorType; + return getTypeFromRestTypeNode(node); case 305 /* JSDocVariadicType */: return getTypeFromJSDocVariadicType(node); case 173 /* FunctionType */: @@ -55085,6 +55278,9 @@ var ts; if (typeVariable !== mappedTypeVariable) { return mapType(getReducedType(mappedTypeVariable), function (t) { if (t.flags & (3 /* AnyOrUnknown */ | 58982400 /* InstantiableNonPrimitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && t !== wildcardType && t !== errorType) { + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } var replacementMapper = prependTypeMapping(typeVariable, t, mapper); return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) : isTupleType(t) ? instantiateMappedTupleType(t, type, replacementMapper) : @@ -55099,23 +55295,39 @@ var ts; function getModifiedReadonlyState(state, modifiers) { return modifiers & 1 /* IncludeReadonly */ ? true : modifiers & 2 /* ExcludeReadonly */ ? false : state; } + function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) { + // When a tuple type is generic (i.e. when it contains variadic elements), we want to eagerly map the + // non-generic elements and defer mapping the generic elements. In order to facilitate this, we transform + // M<[A, B?, ...T, ...C[]] into [...M<[A]>, ...M<[B?]>, ...M, ...M] and then rely on tuple type + // normalization to resolve the non-generic parts of the resulting tuple. + var elementFlags = tupleType.target.elementFlags; + var elementTypes = ts.map(getTypeArguments(tupleType), function (t, i) { + var singleton = elementFlags[i] & 8 /* Variadic */ ? t : + elementFlags[i] & 4 /* Rest */ ? createArrayType(t) : + createTupleType([t], [elementFlags[i]]); + // The singleton is never a generic tuple type, so it is safe to recurse here. + return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); + }); + var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); + return createTupleType(elementTypes, ts.map(elementTypes, function (_) { return 8 /* Variadic */; }), newReadonly); + } function instantiateMappedArrayType(arrayType, mappedType, mapper) { var elementType = instantiateMappedTypeTemplate(mappedType, numberType, /*isOptional*/ true, mapper); return elementType === errorType ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); } function instantiateMappedTupleType(tupleType, mappedType, mapper) { - var minLength = tupleType.target.minLength; + var elementFlags = tupleType.target.elementFlags; var elementTypes = ts.map(getTypeArguments(tupleType), function (_, i) { - return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), i >= minLength, mapper); + return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), !!(elementFlags[i] & 2 /* Optional */), mapper); }); var modifiers = getMappedTypeModifiers(mappedType); - var newMinLength = modifiers & 4 /* IncludeOptional */ ? 0 : - modifiers & 8 /* ExcludeOptional */ ? getTypeReferenceArity(tupleType) - (tupleType.target.hasRestElement ? 1 : 0) : - minLength; + var newTupleModifiers = modifiers & 4 /* IncludeOptional */ ? ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? 2 /* Optional */ : f; }) : + modifiers & 8 /* ExcludeOptional */ ? ts.map(elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + elementFlags; var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); return ts.contains(elementTypes, errorType) ? errorType : - createTupleType(elementTypes, newMinLength, tupleType.target.hasRestElement, newReadonly, tupleType.target.labeledElementDeclarations); + createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); } function instantiateMappedTypeTemplate(type, key, isOptional, mapper) { var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); @@ -55212,7 +55424,7 @@ var ts; if (objectFlags & 4 /* Reference */ && !(type.node)) { var resolvedTypeArguments = type.resolvedTypeArguments; var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper); - return newTypeArguments !== resolvedTypeArguments ? createTypeReference(type.target, newTypeArguments) : type; + return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type; } return getObjectTypeInstantiation(type, mapper); } @@ -56721,7 +56933,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_13 = function (prop) { + var _loop_14 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56736,13 +56948,20 @@ var ts; if (ts.isJsxAttributes(errorNode) || ts.isJsxOpeningLikeElement(errorNode) || ts.isJsxOpeningLikeElement(errorNode.parent)) { // JsxAttributes has an object-literal flag and undergo same type-assignablity check as normal object-literal. // However, using an object-literal error message will be very confusing to the users so we give different a message. - // TODO: Spelling suggestions for excess jsx attributes (needs new diagnostic messages) if (prop.valueDeclaration && ts.isJsxAttribute(prop.valueDeclaration) && ts.getSourceFileOfNode(errorNode) === ts.getSourceFileOfNode(prop.valueDeclaration.name)) { // Note that extraneous children (as in `extra`) don't pass this check, // since `children` is a SyntaxKind.PropertySignature instead of a SyntaxKind.JsxAttribute. errorNode = prop.valueDeclaration.name; } - reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(errorTarget)); + var propName = symbolToString(prop); + var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget); + var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined; + if (suggestion) { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion); + } + else { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget)); + } } else { // use the property's value declaration if the property is assigned inside the literal itself @@ -56777,7 +56996,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_13(prop); + var state_5 = _loop_14(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57068,6 +57287,12 @@ var ts; return varianceResult; } } + // For a generic type T, [...T] is assignable to T, T is assignable to readonly [...T], and T is assignable + // to [...T] when T is constrained to a mutable array or tuple type. + if (isSingleElementGenericTupleType(source) && getTypeArguments(source)[0] === target && !source.target.readonly || + isSingleElementGenericTupleType(target) && getTypeArguments(target)[0] === source && (target.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source) || source))) { + return -1 /* True */; + } if (target.flags & 262144 /* TypeParameter */) { // A source type { [P in Q]: X } is related to a target type T if keyof T is related to Q and X is related to T[Q]. if (ts.getObjectFlags(source) & 32 /* Mapped */ && isRelatedTo(getIndexType(target), getConstraintTypeFromMappedType(source))) { @@ -57444,11 +57669,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_14 = function (combination) { + var _loop_15 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_15 = function (i) { + var _loop_16 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57464,7 +57689,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_15(i); + var state_7 = _loop_16(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57478,7 +57703,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_14(combination); + var state_6 = _loop_15(combination); if (typeof state_6 === "object") return state_6.value; } @@ -57667,6 +57892,80 @@ var ts; if (relation === identityRelation) { return propertiesIdenticalTo(source, target, excludedProperties); } + var result = -1 /* True */; + if (isTupleType(target)) { + if (isArrayType(source) || isTupleType(source)) { + if (!target.target.readonly && (isReadonlyArrayType(source) || isTupleType(source) && source.target.readonly)) { + return 0 /* False */; + } + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var sourceRestFlag = isTupleType(source) ? source.target.combinedFlags & 4 /* Rest */ : 4 /* Rest */; + var targetRestFlag = target.target.combinedFlags & 4 /* Rest */; + var sourceMinLength = isTupleType(source) ? source.target.minLength : 0; + var targetMinLength = target.target.minLength; + if (!sourceRestFlag && sourceArity < targetMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength); + } + return 0 /* False */; + } + if (!targetRestFlag && targetArity < sourceMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity); + } + return 0 /* False */; + } + if (!targetRestFlag && sourceRestFlag) { + if (reportErrors) { + if (sourceMinLength < targetMinLength) { + reportError(ts.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength); + } + else { + reportError(ts.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity); + } + } + return 0 /* False */; + } + var maxArity = Math.max(sourceArity, targetArity); + for (var i = 0; i < maxArity; i++) { + var targetFlags = i < targetArity ? target.target.elementFlags[i] : targetRestFlag; + var sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag; + if (sourceFlags && targetFlags) { + if (targetFlags & 8 /* Variadic */ && !(sourceFlags & 8 /* Variadic */) || + (sourceFlags & 8 /* Variadic */ && !(targetFlags & 12 /* Variable */))) { + if (reportErrors) { + reportError(ts.Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i); + } + return 0 /* False */; + } + if (targetFlags & 1 /* Required */) { + if (!(sourceFlags & 1 /* Required */)) { + if (reportErrors) { + reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, i, typeToString(source), typeToString(target)); + } + return 0 /* False */; + } + } + var sourceType = getTypeArguments(source)[Math.min(i, sourceArity - 1)]; + var targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)]; + var targetCheckType = sourceFlags & 8 /* Variadic */ && targetFlags & 4 /* Rest */ ? createArrayType(targetType) : targetType; + var related = isRelatedTo(sourceType, targetCheckType, reportErrors, /*headMessage*/ undefined, intersectionState); + if (!related) { + if (reportErrors) { + reportIncompatibleError(ts.Diagnostics.Types_of_property_0_are_incompatible, i); + } + return 0 /* False */; + } + result &= related; + } + } + return result; + } + if (target.target.combinedFlags & 12 /* Variable */) { + return 0 /* False */; + } + } var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source) && !isEmptyArrayLiteralType(source) && !isTupleType(source); var unmatchedProperty = getUnmatchedProperty(source, target, requireOptionalProperties, /*matchDiscriminantProperties*/ false); if (unmatchedProperty) { @@ -57689,35 +57988,6 @@ var ts; } } } - var result = -1 /* True */; - if (isTupleType(target)) { - var targetRestType = getRestTypeOfTupleType(target); - if (targetRestType) { - if (!isTupleType(source)) { - return 0 /* False */; - } - var sourceRestType = getRestTypeOfTupleType(source); - if (sourceRestType && !isRelatedTo(sourceRestType, targetRestType, reportErrors)) { - if (reportErrors) { - reportError(ts.Diagnostics.Rest_signatures_are_incompatible); - } - return 0 /* False */; - } - var targetCount = getTypeReferenceArity(target) - 1; - var sourceCount = getTypeReferenceArity(source) - (sourceRestType ? 1 : 0); - var sourceTypeArguments = getTypeArguments(source); - for (var i = targetCount; i < sourceCount; i++) { - var related = isRelatedTo(sourceTypeArguments[i], targetRestType, reportErrors); - if (!related) { - if (reportErrors) { - reportError(ts.Diagnostics.Property_0_is_incompatible_with_rest_element_type, "" + i); - } - return 0 /* False */; - } - result &= related; - } - } - } // We only call this for union target types when we're attempting to do excess property checking - in those cases, we want to get _all possible props_ // from the target union, across all members var properties = getPropertiesOfType(target); @@ -58075,7 +58345,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_16 = function (tp) { + var _loop_17 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58107,7 +58377,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_16(tp); + _loop_17(tp); } cache.variances = variances; } @@ -58530,15 +58800,40 @@ var ts; function isTupleType(type) { return !!(ts.getObjectFlags(type) & 4 /* Reference */ && type.target.objectFlags & 8 /* Tuple */); } + function isGenericTupleType(type) { + return isTupleType(type) && !!(type.target.combinedFlags & 8 /* Variadic */); + } + function isSingleElementGenericTupleType(type) { + return isGenericTupleType(type) && type.target.elementFlags.length === 1; + } function getRestTypeOfTupleType(type) { - return type.target.hasRestElement ? getTypeArguments(type)[type.target.typeParameters.length - 1] : undefined; + return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength); } function getRestArrayTypeOfTupleType(type) { var restType = getRestTypeOfTupleType(type); return restType && createArrayType(restType); } - function getLengthOfTupleType(type) { - return getTypeReferenceArity(type) - (type.target.hasRestElement ? 1 : 0); + function getEndLengthOfType(type) { + return isTupleType(type) ? getTypeReferenceArity(type) - ts.findLastIndex(type.target.elementFlags, function (f) { return !!(f & 12 /* Variable */); }) - 1 : 0; + } + function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) { + if (endSkipCount === void 0) { endSkipCount = 0; } + if (writing === void 0) { writing = false; } + var length = getTypeReferenceArity(type) - endSkipCount; + if (index < length) { + var typeArguments = getTypeArguments(type); + var elementTypes = []; + for (var i = index; i < length; i++) { + var t = typeArguments[i]; + elementTypes.push(type.target.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t); + } + return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes); + } + return undefined; + } + function isTupleTypeStructureMatching(t1, t2) { + return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && + ts.every(t1.target.elementFlags, function (f, i) { return (f & 12 /* Variable */) === (t2.target.elementFlags[i] & 12 /* Variable */); }); } function isZeroBigInt(_a) { var value = _a.value; @@ -59027,7 +59322,8 @@ var ts; inferredType: undefined, priority: undefined, topLevel: true, - isFixed: false + isFixed: false, + impliedArity: undefined }; } function cloneInferenceInfo(inference) { @@ -59038,7 +59334,8 @@ var ts; inferredType: inference.inferredType, priority: inference.priority, topLevel: inference.topLevel, - isFixed: inference.isFixed + isFixed: inference.isFixed, + impliedArity: inference.impliedArity }; } function cloneInferredPartOfContext(context) { @@ -59141,9 +59438,10 @@ var ts; } if (isTupleType(source)) { var elementTypes = ts.map(getTypeArguments(source), function (t) { return inferReverseMappedType(t, target, constraint); }); - var minLength = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? - getTypeReferenceArity(source) - (source.target.hasRestElement ? 1 : 0) : source.target.minLength; - return createTupleType(elementTypes, minLength, source.target.hasRestElement, source.target.readonly, source.target.labeledElementDeclarations); + var elementFlags = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? + ts.sameMap(source.target.elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + source.target.elementFlags; + return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations); } // For all other object types we infer a new object type where the reverse mapping has been // applied to the type of each property. @@ -59208,13 +59506,13 @@ var ts; return result.value; } function tupleTypesDefinitelyUnrelated(source, target) { - return target.target.minLength > source.target.minLength || - !getRestTypeOfTupleType(target) && (!!getRestTypeOfTupleType(source) || getLengthOfTupleType(target) < getLengthOfTupleType(source)); + return !(target.target.combinedFlags & 8 /* Variadic */) && target.target.minLength > source.target.minLength || + !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength); } function typesDefinitelyUnrelated(source, target) { // Two tuple types with incompatible arities are definitely unrelated. // Two object types that each have a property that is unmatched in the other are definitely unrelated. - return isTupleType(source) && isTupleType(target) && tupleTypesDefinitelyUnrelated(source, target) || + return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true) && !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true); } @@ -59704,22 +60002,61 @@ var ts; if (!typesDefinitelyUnrelated(source, target)) { if (isArrayType(source) || isTupleType(source)) { if (isTupleType(target)) { - var sourceLength = isTupleType(source) ? getLengthOfTupleType(source) : 0; - var targetLength = getLengthOfTupleType(target); - var sourceRestType = isTupleType(source) ? getRestTypeOfTupleType(source) : getElementTypeOfArrayType(source); - var targetRestType = getRestTypeOfTupleType(target); - var fixedLength = targetLength < sourceLength || sourceRestType ? targetLength : sourceLength; - for (var i = 0; i < fixedLength; i++) { - inferFromTypes(i < sourceLength ? getTypeArguments(source)[i] : sourceRestType, getTypeArguments(target)[i]); + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var elementTypes = getTypeArguments(target); + var elementFlags = target.target.elementFlags; + // When source and target are tuple types with the same structure (fixed, variadic, and rest are matched + // to the same kind in each position), simply infer between the element types. + if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { + for (var i = 0; i < targetArity; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + return; } - if (targetRestType) { - var types = fixedLength < sourceLength ? getTypeArguments(source).slice(fixedLength, sourceLength) : []; - if (sourceRestType) { - types.push(sourceRestType); + var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; + var sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & 4 /* Rest */ ? + getTypeArguments(source)[sourceArity - 1] : undefined; + var endLength = !(target.target.combinedFlags & 12 /* Variable */) ? 0 : + sourceRestType ? getEndLengthOfType(target) : + Math.min(getEndLengthOfType(source), getEndLengthOfType(target)); + var sourceEndLength = sourceRestType ? 0 : endLength; + // Infer between starting fixed elements. + for (var i = 0; i < startLength; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + if (sourceRestType && sourceArity - startLength === 1) { + // Single rest element remains in source, infer from that to every element in target + for (var i = startLength; i < targetArity - endLength; i++) { + inferFromTypes(elementFlags[i] & 8 /* Variadic */ ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]); } - if (types.length) { - inferFromTypes(getUnionType(types), targetRestType); + } + else { + var middleLength = targetArity - startLength - endLength; + if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 /* Variadic */ && isTupleType(source)) { + // Middle of target is [...T, ...U] and source is tuple type + var targetInfo = getInferenceInfoForType(elementTypes[startLength]); + if (targetInfo && targetInfo.impliedArity !== undefined) { + // Infer slices from source based on implied arity of T. + inferFromTypes(sliceTupleType(source, startLength, sourceEndLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]); + inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, sourceEndLength), elementTypes[startLength + 1]); + } } + else if (middleLength === 1 && elementFlags[startLength] & 8 /* Variadic */) { + // Middle of target is exactly one variadic element. Infer the slice between the fixed parts in the source. + inferFromTypes(isTupleType(source) ? sliceTupleType(source, startLength, sourceEndLength) : createArrayType(sourceRestType), elementTypes[startLength]); + } + else if (middleLength === 1 && elementFlags[startLength] & 4 /* Rest */) { + // Middle of target is exactly one rest element. If middle of source is not empty, infer union of middle element types. + var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, sourceEndLength) : sourceRestType; + if (restType) { + inferFromTypes(restType, elementTypes[startLength]); + } + } + } + // Infer between ending fixed elements + for (var i = 0; i < endLength; i++) { + inferFromTypes(sourceRestType || getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]); } return; } @@ -60664,7 +61001,7 @@ var ts; var signature = getEffectsSignature(flow.node); if (signature) { var predicate = getTypePredicateOfSignature(signature); - if (predicate && predicate.kind === 3 /* AssertsIdentifier */) { + if (predicate && predicate.kind === 3 /* AssertsIdentifier */ && !predicate.type) { var predicateArgument = flow.node.arguments[predicate.parameterIndex]; if (predicateArgument && isFalseExpression(predicateArgument)) { return false; @@ -62562,7 +62899,7 @@ var ts; var args = getEffectiveCallArguments(iife); var indexOfParameter = func.parameters.indexOf(parameter); if (parameter.dotDotDotToken) { - return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined); + return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined, 0 /* Normal */); } var links = getNodeLinks(iife); var cached = links.resolvedSignature; @@ -63328,6 +63665,9 @@ var ts; var arrayOrIterableType = checkExpression(node.expression, checkMode); return checkIteratedTypeOrElementType(33 /* Spread */, arrayOrIterableType, undefinedType, node.expression); } + function checkSyntheticExpression(node) { + return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type; + } function hasDefaultValue(node) { return (node.kind === 195 /* BindingElement */ && !!node.initializer) || (node.kind === 213 /* BinaryExpression */ && node.operatorToken.kind === 62 /* EqualsToken */); @@ -63336,26 +63676,22 @@ var ts; var elements = node.elements; var elementCount = elements.length; var elementTypes = []; - var hasEndingSpreadElement = false; - var hasNonEndingSpreadElement = false; + var elementFlags = []; var contextualType = getApparentTypeOfContextualType(node); var inDestructuringPattern = ts.isAssignmentTarget(node); var inConstContext = isConstContext(node); for (var i = 0; i < elementCount; i++) { var e = elements[i]; - var spread = e.kind === 217 /* SpreadElement */ && e.expression; - var spreadType = spread && checkExpression(spread, checkMode, forceTuple); - if (spreadType && isTupleType(spreadType)) { - elementTypes.push.apply(elementTypes, getTypeArguments(spreadType)); - if (spreadType.target.hasRestElement) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + if (e.kind === 217 /* SpreadElement */) { + if (languageVersion < 2 /* ES2015 */) { + checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 /* SpreadIncludes */ : 2048 /* SpreadArrays */); } - } - else { - if (inDestructuringPattern && spreadType) { + var spreadType = checkExpression(e.expression, checkMode, forceTuple); + if (isArrayLikeType(spreadType)) { + elementTypes.push(spreadType); + elementFlags.push(8 /* Variadic */); + } + else if (inDestructuringPattern) { // Given the following situation: // var c: {}; // [...c] = ["", 0]; @@ -63369,43 +63705,31 @@ var ts; // getContextualTypeForElementExpression, which will crucially not error // if there is no index type / iterated type. var restElementType = getIndexTypeOfType(spreadType, 1 /* Number */) || - getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false); - if (restElementType) { - elementTypes.push(restElementType); - } + getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false) || + unknownType; + elementTypes.push(restElementType); + elementFlags.push(4 /* Rest */); } else { - var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); - var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); - elementTypes.push(type); - } - if (spread) { // tuples are done above, so these are only arrays - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + elementTypes.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, e.expression)); + elementFlags.push(4 /* Rest */); } } + else { + var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); + var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); + elementTypes.push(type); + elementFlags.push(1 /* Required */); + } } - if (!hasNonEndingSpreadElement) { - var minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0); - // If array literal is actually a destructuring pattern, mark it as an implied type. We do this such - // that we get the same behavior for "var [x, y] = []" and "[x, y] = []". - var tupleResult = void 0; - if (inDestructuringPattern && minLength > 0) { - var type = cloneTypeReference(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - type.pattern = node; - return type; - } - else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) { - return createArrayLiteralType(tupleResult); - } - else if (forceTuple) { - return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - } + if (inDestructuringPattern) { + return createTupleType(elementTypes, elementFlags); + } + if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) { + return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext)); } return createArrayLiteralType(createArrayType(elementTypes.length ? - getUnionType(elementTypes, 2 /* Subtype */) : + getUnionType(ts.sameMap(elementTypes, function (t, i) { return elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t; }), 2 /* Subtype */) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext)); } function createArrayLiteralType(type) { @@ -63419,14 +63743,6 @@ var ts; } return literalType; } - function getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, readonly) { - if (elementCount === void 0) { elementCount = elementTypes.length; } - if (readonly === void 0) { readonly = false; } - // Infer a tuple type when the contextual type is or contains a tuple-like type - if (readonly || (contextualType && forEachType(contextualType, isTupleLikeType))) { - return createTupleType(elementTypes, elementCount - (hasRestElement ? 1 : 0), hasRestElement, readonly); - } - } function isNumericName(name) { switch (name.kind) { case 157 /* ComputedPropertyName */: @@ -63842,9 +64158,9 @@ var ts; var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName); // If there are children in the body of JSX element, create dummy attribute "children" with the union of children types so that it will pass the attribute checking process var childrenPropSymbol = createSymbol(4 /* Property */ | 33554432 /* Transient */, jsxChildrenPropertyName); - childrenPropSymbol.type = childrenTypes.length === 1 ? - childrenTypes[0] : - (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, /*hasRestElement*/ false) || createArrayType(getUnionType(childrenTypes))); + childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : + childrenContextualType && forEachType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : + createArrayType(getUnionType(childrenTypes)); // Fake up a property declaration for the children childrenPropSymbol.valueDeclaration = ts.factory.createPropertySignature(/*modifiers*/ undefined, ts.unescapeLeadingUnderscores(jsxChildrenPropertyName), /*questionToken*/ undefined, /*type*/ undefined); ts.setParent(childrenPropSymbol.valueDeclaration, attributes); @@ -64723,6 +65039,14 @@ var ts; function getSuggestedSymbolForNonexistentProperty(name, containingType) { return getSpellingSuggestionForName(ts.isString(name) ? name : ts.idText(name), getPropertiesOfType(containingType), 111551 /* Value */); } + function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) { + var strName = ts.isString(name) ? name : ts.idText(name); + var properties = getPropertiesOfType(containingType); + var jsxSpecific = strName === "for" ? ts.find(properties, function (x) { return ts.symbolName(x) === "htmlFor"; }) + : strName === "class" ? ts.find(properties, function (x) { return ts.symbolName(x) === "className"; }) + : undefined; + return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551 /* Value */); + } function getSuggestionForNonexistentProperty(name, containingType) { var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType); return suggestion && ts.symbolName(suggestion); @@ -65099,28 +65423,10 @@ var ts; argCount = signatureHelpTrailingComma ? args.length + 1 : args.length; // If we are missing the close parenthesis, the call is incomplete. callIsIncomplete = node.arguments.end === node.end; - // If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range. - var firstSpreadArgIndex = getSpreadArgumentIndex(args); - if (firstSpreadArgIndex >= 0) { - if (firstSpreadArgIndex === args.length - 1) { - // Special case, handles the munged arguments that we receive in case of a spread in the end (breaks the arg.expression below) - // (see below for code that starts with "const spreadArgument") - return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature)); - } - var totalCount = firstSpreadArgIndex; // count previous arguments - for (var i = firstSpreadArgIndex; i < args.length; i++) { - var arg = args[i]; - if (!isSpreadArgument(arg)) { - totalCount += 1; - } - else { - var argType = flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression); - totalCount += isTupleType(argType) ? getTypeArguments(argType).length - : isArrayType(argType) ? 0 - : 1; - } - } - return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount <= getParameterCount(signature)); + // If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range. + var spreadArgIndex = getSpreadArgumentIndex(args); + if (spreadArgIndex >= 0) { + return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature)); } } // Too many arguments implies incorrect arity. @@ -65245,6 +65551,12 @@ var ts; } var restType = getNonArrayRestType(signature); var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; + if (restType && restType.flags & 262144 /* TypeParameter */) { + var info = ts.find(context.inferences, function (info) { return info.typeParameter === restType; }); + if (info) { + info.impliedArity = ts.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : undefined; + } + } for (var i = 0; i < argCount; i++) { var arg = args[i]; if (arg.kind !== 219 /* OmittedExpression */) { @@ -65254,46 +65566,55 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode); inferTypes(context.inferences, spreadType, restType); } return getInferredTypes(context); } - function getArrayifiedType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, getArrayifiedType) : - type.flags & (1 /* Any */ | 63176704 /* Instantiable */) || isMutableArrayOrTuple(type) ? type : - isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.minLength, type.target.hasRestElement, /*readonly*/ false, type.target.labeledElementDeclarations) : - createArrayType(getIndexedAccessType(type, numberType)); + function getMutableArrayOrTupleType(type) { + return type.flags & 1048576 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : + type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : + isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, /*readonly*/ false, type.target.labeledElementDeclarations) : + createTupleType([type], [8 /* Variadic */]); } - function getSpreadArgumentType(args, index, argCount, restType, context) { + function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) { if (index >= argCount - 1) { var arg = args[argCount - 1]; if (isSpreadArgument(arg)) { // We are inferring from a spread expression in the last argument position, i.e. both the parameter // and the argument are ...x forms. - return arg.kind === 224 /* SyntheticExpression */ ? - createArrayType(arg.type) : - getArrayifiedType(checkExpressionWithContextualType(arg.expression, restType, context, 0 /* Normal */)); + return getMutableArrayOrTupleType(arg.kind === 224 /* SyntheticExpression */ ? arg.type : + checkExpressionWithContextualType(arg.expression, restType, context, checkMode)); } } var types = []; + var flags = []; var names = []; - var spreadIndex = -1; for (var i = index; i < argCount; i++) { - var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); - var argType = checkExpressionWithContextualType(args[i], contextualType, context, 0 /* Normal */); - if (spreadIndex < 0 && isSpreadArgument(args[i])) { - spreadIndex = i - index; + var arg = args[i]; + if (isSpreadArgument(arg)) { + var spreadType = arg.kind === 224 /* SyntheticExpression */ ? arg.type : checkExpression(arg.expression); + if (isArrayLikeType(spreadType)) { + types.push(spreadType); + flags.push(8 /* Variadic */); + } + else { + types.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, arg.kind === 217 /* SpreadElement */ ? arg.expression : arg)); + flags.push(4 /* Rest */); + } } - if (args[i].kind === 224 /* SyntheticExpression */ && args[i].tupleNameSource) { - names.push(args[i].tupleNameSource); + else { + var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); + var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); + var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); + types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); + flags.push(1 /* Required */); + } + if (arg.kind === 224 /* SyntheticExpression */ && arg.tupleNameSource) { + names.push(arg.tupleNameSource); } - var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); - types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); } - return spreadIndex < 0 ? - createTupleType(types, /*minLength*/ undefined, /*hasRestElement*/ undefined, /*readonly*/ undefined, ts.length(names) === ts.length(types) ? names : undefined) : - createTupleType(ts.append(types.slice(0, spreadIndex), getUnionType(types.slice(spreadIndex))), spreadIndex, /*hasRestElement*/ true, /*readonly*/ undefined); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) { var isJavascript = ts.isInJSFile(signature.declaration); @@ -65475,7 +65796,7 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined, checkMode); var errorNode = reportErrors ? argCount < args.length ? args[argCount] : node : undefined; if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, /*containingMessageChain*/ undefined, errorOutputContainer)) { ts.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors"); @@ -65535,19 +65856,30 @@ var ts; return node.attributes.properties.length > 0 || (ts.isJsxOpeningElement(node) && node.parent.children.length > 0) ? [node.attributes] : ts.emptyArray; } var args = node.arguments || ts.emptyArray; - var length = args.length; - if (length && isSpreadArgument(args[length - 1]) && getSpreadArgumentIndex(args) === length - 1) { - // We have a spread argument in the last position and no other spread arguments. If the type - // of the argument is a tuple type, spread the tuple elements into the argument list. We can - // call checkExpressionCached because spread expressions never have a contextual type. - var spreadArgument_1 = args[length - 1]; - var type_4 = flowLoopCount ? checkExpression(spreadArgument_1.expression) : checkExpressionCached(spreadArgument_1.expression); - if (isTupleType(type_4)) { - var typeArguments = getTypeArguments(type_4); - var restIndex_2 = type_4.target.hasRestElement ? typeArguments.length - 1 : -1; - var syntheticArgs = ts.map(typeArguments, function (t, i) { var _a; return createSyntheticExpression(spreadArgument_1, t, /*isSpread*/ i === restIndex_2, (_a = type_4.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); }); - return ts.concatenate(args.slice(0, length - 1), syntheticArgs); + var spreadIndex = getSpreadArgumentIndex(args); + if (spreadIndex >= 0) { + // Create synthetic arguments from spreads of tuple types. + var effectiveArgs_1 = args.slice(0, spreadIndex); + var _loop_18 = function (i) { + var arg = args[i]; + // We can call checkExpressionCached because spread expressions never have a contextual type. + var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); + if (spreadType && isTupleType(spreadType)) { + ts.forEach(getTypeArguments(spreadType), function (t, i) { + var _a; + var flags = spreadType.target.elementFlags[i]; + var syntheticArg = createSyntheticExpression(arg, flags & 4 /* Rest */ ? createArrayType(t) : t, !!(flags & 12 /* Variable */), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + effectiveArgs_1.push(syntheticArg); + }); + } + else { + effectiveArgs_1.push(arg); + } + }; + for (var i = spreadIndex; i < args.length; i++) { + _loop_18(i); } + return effectiveArgs_1; } return args; } @@ -65847,7 +66179,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_17 = function (c) { + var _loop_19 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -65865,7 +66197,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_17(c); + _loop_19(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -65999,7 +66331,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_18 = function (i) { + var _loop_20 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66007,7 +66339,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_18(i); + _loop_20(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -66979,51 +67311,44 @@ var ts; // otherwise would return the type 'undefined'). var restType = getTypeOfSymbol(signature.parameters[paramCount]); var index = pos - paramCount; - if (!isTupleType(restType) || restType.target.hasRestElement || index < getTypeArguments(restType).length) { + if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) { return getIndexedAccessType(restType, getLiteralType(index)); } } return undefined; } function getRestTypeAtPosition(source, pos) { - var paramCount = getParameterCount(source); + var parameterCount = getParameterCount(source); + var minArgumentCount = getMinArgumentCount(source); var restType = getEffectiveRestType(source); - var nonRestCount = paramCount - (restType ? 1 : 0); - if (restType && pos === nonRestCount) { - return restType; + if (restType && pos >= parameterCount - 1) { + return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType)); } var types = []; + var flags = []; var names = []; - for (var i = pos; i < nonRestCount; i++) { - types.push(getTypeAtPosition(source, i)); + for (var i = pos; i < parameterCount; i++) { + if (!restType || i < parameterCount - 1) { + types.push(getTypeAtPosition(source, i)); + flags.push(i < minArgumentCount ? 1 /* Required */ : 2 /* Optional */); + } + else { + types.push(restType); + flags.push(8 /* Variadic */); + } var name = getNameableDeclarationAtPosition(source, i); - if (name && names) { + if (name) { names.push(name); } - else { - names = undefined; - } } - if (restType) { - types.push(getIndexedAccessType(restType, numberType)); - var name = getNameableDeclarationAtPosition(source, nonRestCount); - if (name && names) { - names.push(name); - } - else { - names = undefined; - } - } - var minArgumentCount = getMinArgumentCount(source); - var minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos; - return createTupleType(types, minLength, !!restType, /*readonly*/ false, names); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function getParameterCount(signature) { var length = signature.parameters.length; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[length - 1]); if (isTupleType(restType)) { - return length + getTypeArguments(restType).length - 1; + return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1); } } return length; @@ -67032,9 +67357,10 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (isTupleType(restType)) { - var minLength = restType.target.minLength; - if (minLength > 0) { - return signature.parameters.length - 1 + minLength; + var firstOptionalIndex = ts.findIndex(restType.target.elementFlags, function (f) { return !(f & 1 /* Required */); }); + var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex; + if (requiredCount > 0) { + return signature.parameters.length - 1 + requiredCount; } } } @@ -67053,7 +67379,12 @@ var ts; function getEffectiveRestType(signature) { if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); - return isTupleType(restType) ? getRestArrayTypeOfTupleType(restType) : restType; + if (!isTupleType(restType)) { + return restType; + } + if (restType.target.hasRestElement) { + return sliceTupleType(restType, restType.target.fixedLength); + } } return undefined; } @@ -67392,8 +67723,8 @@ var ts; var witnesses = getSwitchClauseTypeOfWitnesses(node, /*retainDefault*/ false); // notEqualFacts states that the type of the switched value is not equal to every type in the switch. var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, /*hasDefault*/ true); - var type_5 = getBaseConstraintOfType(operandType) || operandType; - return !!(filterType(type_5, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); + var type_4 = getBaseConstraintOfType(operandType) || operandType; + return !!(filterType(type_4, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); } var type = getTypeOfExpression(node.expression); if (!isLiteralType(type)) { @@ -67733,7 +68064,7 @@ var ts; error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference); return booleanType; } - if (expr.kind === 198 /* PropertyAccessExpression */ && ts.isPrivateIdentifier(expr.name)) { + if (ts.isPropertyAccessExpression(expr) && ts.isPrivateIdentifier(expr.name)) { error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } var links = getNodeLinks(expr); @@ -68777,18 +69108,19 @@ var ts; } function padTupleType(type, pattern) { var patternElements = pattern.elements; - var arity = getTypeReferenceArity(type); - var elementTypes = arity ? getTypeArguments(type).slice() : []; - for (var i = arity; i < patternElements.length; i++) { + var elementTypes = getTypeArguments(type).slice(); + var elementFlags = type.target.elementFlags.slice(); + for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) { var e = patternElements[i]; if (i < patternElements.length - 1 || !(e.kind === 195 /* BindingElement */ && e.dotDotDotToken)) { elementTypes.push(!ts.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, /*includePatternInType*/ false, /*reportErrors*/ false) : anyType); + elementFlags.push(2 /* Optional */); if (!ts.isOmittedExpression(e) && !hasDefaultValue(e)) { reportImplicitAny(e, anyType); } } } - return createTupleType(elementTypes, type.target.minLength, /*hasRestElement*/ false, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration, type) { var widened = ts.getCombinedNodeFlags(declaration) & 2 /* Const */ || ts.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type); @@ -69209,7 +69541,7 @@ var ts; case 216 /* YieldExpression */: return checkYieldExpression(node); case 224 /* SyntheticExpression */: - return node.type; + return checkSyntheticExpression(node); case 280 /* JsxExpression */: return checkJsxExpression(node, checkMode); case 270 /* JsxElement */: @@ -69865,16 +70197,20 @@ var ts; grammarErrorOnNode(e, ts.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names); break; } - if (isTupleRestElement(e)) { + var flags = getTupleElementFlags(e); + if (flags & 8 /* Variadic */) { + if (!isArrayLikeType(getTypeFromTypeNode(e.type))) { + error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); + break; + } + } + else if (flags & 4 /* Rest */) { if (i !== elementTypes.length - 1) { grammarErrorOnNode(e, ts.Diagnostics.A_rest_element_must_be_last_in_a_tuple_type); break; } - if (!isArrayType(getTypeFromTypeNode(e.type))) { - error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); - } } - else if (isTupleOptionalElement(e)) { + else if (flags & 2 /* Optional */) { seenOptionalElement = true; } else if (seenOptionalElement) { @@ -72926,7 +73262,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_19 = function (member) { + var _loop_21 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -72945,7 +73281,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_19(member); + _loop_21(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -106865,7 +107201,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_20 = function (directory) { + var _loop_22 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -106891,7 +107227,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_20(directory); + var state_8 = _loop_22(directory); directory = out_directory_1; if (state_8 === "break") break; @@ -107958,7 +108294,7 @@ var ts; configFileSpecs = configFileParseResult.configFileSpecs; // TODO: GH#18217 projectReferences = configFileParseResult.projectReferences; configFileParsingDiagnostics = ts.getConfigFileParsingDiagnostics(configFileParseResult).slice(); - canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(configFileParseResult.raw); + canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function onSourceFileChange(fileName, eventKind, path) { @@ -108827,7 +109163,7 @@ var ts; else if (reloadLevel === ts.ConfigFileProgramReloadLevel.Partial) { // Update file names var result = ts.getFileNamesFromConfigSpecs(config.configFileSpecs, ts.getDirectoryPath(project), config.options, state.parseConfigFileHost); - ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInutFiles(config.raw)); + ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInputFiles(config.raw)); config.fileNames = result.fileNames; watchInputFiles(state, project, projectPath, config); } @@ -108966,7 +109302,7 @@ var ts; } } // Container if no files are specified in the project - if (!project.fileNames.length && !ts.canJsonReportNoInutFiles(project.raw)) { + if (!project.fileNames.length && !ts.canJsonReportNoInputFiles(project.raw)) { return { type: ts.UpToDateStatusType.ContainerOnly }; @@ -109588,6 +109924,13 @@ var ts; PackageJsonDependencyGroup[PackageJsonDependencyGroup["All"] = 15] = "All"; })(PackageJsonDependencyGroup = ts.PackageJsonDependencyGroup || (ts.PackageJsonDependencyGroup = {})); /* @internal */ + var PackageJsonAutoImportPreference; + (function (PackageJsonAutoImportPreference) { + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["None"] = 0] = "None"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["ExcludeDevDependencies"] = 1] = "ExcludeDevDependencies"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["All"] = 2] = "All"; + })(PackageJsonAutoImportPreference = ts.PackageJsonAutoImportPreference || (ts.PackageJsonAutoImportPreference = {})); + /* @internal */ ts.emptyOptions = {}; var HighlightSpanKind; (function (HighlightSpanKind) { @@ -111886,19 +112229,10 @@ var ts; return !!location.parent && ts.isImportOrExportSpecifier(location.parent) && location.parent.propertyName === location; } ts.isImportOrExportSpecifierName = isImportOrExportSpecifierName; - function scriptKindIs(fileName, host) { - var scriptKinds = []; - for (var _i = 2; _i < arguments.length; _i++) { - scriptKinds[_i - 2] = arguments[_i]; - } - var scriptKind = getScriptKind(fileName, host); - return ts.some(scriptKinds, function (k) { return k === scriptKind; }); - } - ts.scriptKindIs = scriptKindIs; function getScriptKind(fileName, host) { // First check to see if the script kind was specified by the host. Chances are the host // may override the default script kind for the file extension. - return ts.ensureScriptKind(fileName, host && host.getScriptKind && host.getScriptKind(fileName)); + return ts.ensureScriptKind(fileName, host.getScriptKind && host.getScriptKind(fileName)); } ts.getScriptKind = getScriptKind; function getSymbolTarget(symbol, checker) { @@ -112429,20 +112763,20 @@ var ts; if (!stringContent) return undefined; var content = tryParseJson(stringContent); - if (!content) - return false; var info = {}; - for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { - var key = dependencyKeys_1[_i]; - var dependencies = content[key]; - if (!dependencies) { - continue; + if (content) { + for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { + var key = dependencyKeys_1[_i]; + var dependencies = content[key]; + if (!dependencies) { + continue; + } + var dependencyMap = ts.createMap(); + for (var packageName in dependencies) { + dependencyMap.set(packageName, dependencies[packageName]); + } + info[key] = dependencyMap; } - var dependencyMap = ts.createMap(); - for (var packageName in dependencies) { - dependencyMap.set(packageName, dependencies[packageName]); - } - info[key] = dependencyMap; } var dependencyGroups = [ [1 /* Dependencies */, info.dependencies], @@ -112450,7 +112784,7 @@ var ts; [8 /* OptionalDependencies */, info.optionalDependencies], [4 /* PeerDependencies */, info.peerDependencies], ]; - return __assign(__assign({}, info), { fileName: fileName, + return __assign(__assign({}, info), { parseable: !!content, fileName: fileName, get: get, has: function (dependencyName, inGroups) { return !!get(dependencyName, inGroups); @@ -114237,6 +114571,9 @@ var ts; function originIsExport(origin) { return !!(origin && origin.kind & 4 /* Export */); } + function originIsPackageJsonImport(origin) { + return originIsExport(origin) && !!origin.isFromPackageJson; + } function originIsPromise(origin) { return !!(origin.kind & 8 /* Promise */); } @@ -114496,6 +114833,7 @@ var ts; isRecommended: isRecommendedCompletionMatch(symbol, recommendedCompletion, typeChecker) || undefined, insertText: insertText, replacementSpan: replacementSpan, + isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, }; } function quotePropertyName(name, preferences) { @@ -115457,11 +115795,12 @@ var ts; var results = []; /** Ids present in `results` for faster lookup */ var resultSymbolIds = ts.createMap(); - ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, function (moduleSymbol) { + ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, /*useAutoImportProvider*/ true, function (moduleSymbol, _, program, isFromPackageJson) { // Perf -- ignore other modules if this is a request for details if (detailsEntryId && detailsEntryId.source && ts.stripQuotes(moduleSymbol.name) !== detailsEntryId.source) { return; } + var typeChecker = program.getTypeChecker(); var resolvedModuleSymbol = typeChecker.resolveExternalModuleSymbol(moduleSymbol); // resolvedModuleSymbol may be a namespace. A namespace may be `export =` by multiple module declarations, but only keep the first one. if (!ts.addToSeen(seenResolvedModules, ts.getSymbolId(resolvedModuleSymbol))) { @@ -115470,7 +115809,7 @@ var ts; // Don't add another completion for `export =` of a symbol that's already global. // So in `declare namespace foo {} declare module "foo" { export = foo; }`, there will just be the global completion for `foo`. if (resolvedModuleSymbol !== moduleSymbol && ts.every(resolvedModuleSymbol.declarations, ts.isNonGlobalDeclaration)) { - pushSymbol(resolvedModuleSymbol, moduleSymbol, /*skipFilter*/ true); + pushSymbol(resolvedModuleSymbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ true); } for (var _i = 0, _a = typeChecker.getExportsAndPropertiesOfModule(moduleSymbol); _i < _a.length; _i++) { var symbol = _a[_i]; @@ -115495,7 +115834,7 @@ var ts; var nearestExportSymbolId = ts.getSymbolId(nearestExportSymbol).toString(); var symbolHasBeenSeen = resultSymbolIds.has(nearestExportSymbolId) || aliasesToAlreadyIncludedSymbols.has(nearestExportSymbolId); if (!symbolHasBeenSeen) { - aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol }); + aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol, isFromPackageJson: isFromPackageJson }); aliasesToAlreadyIncludedSymbols.set(symbolId, true); } else { @@ -115507,20 +115846,19 @@ var ts; else { // This is not a re-export, so see if we have any aliases pending and remove them (step 3 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.delete(symbolId); - pushSymbol(symbol, moduleSymbol); + pushSymbol(symbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); } } }); // By this point, any potential duplicates that were actually duplicates have been // removed, so the rest need to be added. (Step 4 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.forEach(function (_a) { - var alias = _a.alias, moduleSymbol = _a.moduleSymbol; - return pushSymbol(alias, moduleSymbol); + var alias = _a.alias, moduleSymbol = _a.moduleSymbol, isFromPackageJson = _a.isFromPackageJson; + return pushSymbol(alias, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); }); log("getSymbolsFromOtherSourceFileExports: " + (ts.timestamp() - startTime)); return results; - function pushSymbol(symbol, moduleSymbol, skipFilter) { - if (skipFilter === void 0) { skipFilter = false; } + function pushSymbol(symbol, moduleSymbol, isFromPackageJson, skipFilter) { var isDefaultExport = symbol.escapedName === "default" /* Default */; if (isDefaultExport) { symbol = ts.getLocalSymbolForExportDefault(symbol) || symbol; @@ -115529,7 +115867,7 @@ var ts; return; } ts.addToSeen(resultSymbolIds, ts.getSymbolId(symbol)); - var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport }; + var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport, isFromPackageJson: isFromPackageJson }; results.push({ symbol: symbol, symbolName: ts.getNameForExportedSymbol(symbol, target), @@ -131879,7 +132217,7 @@ var ts; errorCodes: errorCodes, getCodeActions: function (context) { var errorCode = context.errorCode, preferences = context.preferences, sourceFile = context.sourceFile, span = context.span; - var info = getFixesInfo(context, errorCode, span.start); + var info = getFixesInfo(context, errorCode, span.start, /*useAutoImportProvider*/ true); if (!info) return undefined; var fixes = info.fixes, symbolName = info.symbolName; @@ -131889,12 +132227,16 @@ var ts; fixIds: [importFixId], getAllCodeActions: function (context) { var sourceFile = context.sourceFile, program = context.program, preferences = context.preferences, host = context.host; - var importAdder = createImportAdder(sourceFile, program, preferences, host); + var importAdder = createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ true, preferences, host); codefix.eachDiagnostic(context, errorCodes, function (diag) { return importAdder.addImportFromDiagnostic(diag, context); }); return codefix.createCombinedCodeActions(ts.textChanges.ChangeTracker.with(context, importAdder.writeFixes)); }, }); function createImportAdder(sourceFile, program, preferences, host) { + return createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ false, preferences, host); + } + codefix.createImportAdder = createImportAdder; + function createImportAdderWorker(sourceFile, program, useAutoImportProvider, preferences, host) { var compilerOptions = program.getCompilerOptions(); // Namespace fixes don't conflict, so just build a list. var addToNamespace = []; @@ -131904,7 +132246,7 @@ var ts; var newImports = ts.createMap(); return { addImportFromDiagnostic: addImportFromDiagnostic, addImportFromExportedSymbol: addImportFromExportedSymbol, writeFixes: writeFixes }; function addImportFromDiagnostic(diagnostic, context) { - var info = getFixesInfo(context, diagnostic.code, diagnostic.start); + var info = getFixesInfo(context, diagnostic.code, diagnostic.start, useAutoImportProvider); if (!info || !info.fixes.length) return; addImport(info); @@ -131914,7 +132256,7 @@ var ts; var symbolName = ts.getNameForExportedSymbol(exportedSymbol, ts.getEmitScriptTarget(compilerOptions)); var checker = program.getTypeChecker(); var symbol = checker.getMergedSymbol(ts.skipAlias(exportedSymbol, checker)); - var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, sourceFile, compilerOptions, checker, program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, host, program, useAutoImportProvider); var preferTypeOnlyImport = !!usageIsTypeOnly && compilerOptions.importsNotUsedAsValues === 2 /* Error */; var useRequire = shouldUseRequire(sourceFile, compilerOptions); var fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, /*position*/ undefined, preferTypeOnlyImport, useRequire, host, preferences); @@ -132001,7 +132343,6 @@ var ts; } } } - codefix.createImportAdder = createImportAdder; // Sorted with the preferred fix coming first. var ImportFixKind; (function (ImportFixKind) { @@ -132019,7 +132360,7 @@ var ts; })(ImportKind || (ImportKind = {})); function getImportCompletionAction(exportedSymbol, moduleSymbol, sourceFile, symbolName, host, program, formatContext, position, preferences) { var compilerOptions = program.getCompilerOptions(); - var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, sourceFile, compilerOptions, program.getTypeChecker(), program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, host, program, /*useAutoImportProvider*/ true); var useRequire = shouldUseRequire(sourceFile, compilerOptions); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && !ts.isSourceFileJS(sourceFile) && ts.isValidTypeOnlyAliasUseSite(ts.getTokenAtPosition(sourceFile, position)); var moduleSpecifier = ts.first(getNewImportInfos(program, sourceFile, position, preferTypeOnlyImport, useRequire, exportInfos, host, preferences)).moduleSpecifier; @@ -132036,11 +132377,13 @@ var ts; var description = _a.description, changes = _a.changes, commands = _a.commands; return { description: description, changes: changes, commands: commands }; } - function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, sourceFile, compilerOptions, checker, allSourceFiles) { + function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, host, program, useAutoImportProvider) { var result = []; - forEachExternalModule(checker, allSourceFiles, function (moduleSymbol, moduleFile) { + var compilerOptions = program.getCompilerOptions(); + forEachExternalModuleToImportFrom(program, host, importingFile, /*filterByPackageJson*/ false, useAutoImportProvider, function (moduleSymbol, moduleFile, program) { + var checker = program.getTypeChecker(); // Don't import from a re-export when looking "up" like to `./index` or `../index`. - if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(sourceFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { + if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(importingFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { return; } var defaultInfo = getDefaultLikeExportInfo(importingFile, moduleSymbol, checker, compilerOptions); @@ -132202,11 +132545,11 @@ var ts; ? { kind: 3 /* AddNew */, moduleSpecifier: moduleSpecifier.text, importKind: importKind, typeOnly: preferTypeOnlyImport, useRequire: useRequire } : undefined; } - function getFixesInfo(context, errorCode, pos) { + function getFixesInfo(context, errorCode, pos, useAutoImportProvider) { var symbolToken = ts.getTokenAtPosition(context.sourceFile, pos); var info = errorCode === ts.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code ? getFixesInfoForUMDImport(context, symbolToken) - : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken) : undefined; + : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken, useAutoImportProvider) : undefined; return info && __assign(__assign({}, info), { fixes: ts.sort(info.fixes, function (a, b) { return a.kind - b.kind; }) }); } function getFixesInfoForUMDImport(_a, token) { @@ -132259,7 +132602,7 @@ var ts; return ts.Debug.assertNever(moduleKind, "Unexpected moduleKind " + moduleKind); } } - function getFixesInfoForNonUMDImport(_a, symbolToken) { + function getFixesInfoForNonUMDImport(_a, symbolToken, useAutoImportProvider) { var sourceFile = _a.sourceFile, program = _a.program, cancellationToken = _a.cancellationToken, host = _a.host, preferences = _a.preferences; var checker = program.getTypeChecker(); // If we're at ``, we must check if `Foo` is already in scope, and if so, get an import for `React` instead. @@ -132273,7 +132616,7 @@ var ts; var compilerOptions = program.getCompilerOptions(); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && ts.isValidTypeOnlyAliasUseSite(symbolToken); var useRequire = shouldUseRequire(sourceFile, compilerOptions); - var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, host); + var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, useAutoImportProvider, host); var fixes = ts.arrayFrom(ts.flatMapIterator(exportInfos.entries(), function (_a) { var _ = _a[0], exportInfos = _a[1]; return getFixForImport(exportInfos, symbolName, symbolToken.getStart(sourceFile), preferTypeOnlyImport, useRequire, program, sourceFile, host, preferences); @@ -132281,14 +132624,14 @@ var ts; return { fixes: fixes, symbolName: symbolName }; } // Returns a map from an exported symbol's ID to a list of every way it's (re-)exported. - function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, host) { + function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, useAutoImportProvider, host) { // For each original symbol, keep all re-exports of that symbol together so we can call `getCodeActionsForImport` on the whole group at once. // Maps symbol id to info for modules providing that symbol (original export + re-exports). var originalSymbolToExportInfos = ts.createMultiMap(); function addSymbol(moduleSymbol, exportedSymbol, importKind) { originalSymbolToExportInfos.add(ts.getUniqueSymbolId(exportedSymbol, checker).toString(), { moduleSymbol: moduleSymbol, importKind: importKind, exportedSymbolIsTypeOnly: isTypeOnlySymbol(exportedSymbol, checker) }); } - forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, function (moduleSymbol) { + forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, useAutoImportProvider, function (moduleSymbol) { cancellationToken.throwIfCancellationRequested(); var defaultInfo = getDefaultLikeExportInfo(sourceFile, moduleSymbol, checker, program.getCompilerOptions()); if (defaultInfo && defaultInfo.name === symbolName && symbolHasMeaning(defaultInfo.symbolForMeaning, currentTokenMeaning)) { @@ -132520,14 +132863,26 @@ var ts; var declarations = _a.declarations; return ts.some(declarations, function (decl) { return !!(ts.getMeaningFromDeclaration(decl) & meaning); }); } - function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, cb) { + function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, useAutoImportProvider, cb) { + var _a, _b; + forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, function (module, file) { return cb(module, file, program, /*isFromPackageJson*/ false); }); + var autoImportProvider = useAutoImportProvider && ((_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host)); + if (autoImportProvider) { + var start = ts.timestamp(); + forEachExternalModuleToImportFromInProgram(autoImportProvider, host, from, filterByPackageJson, function (module, file) { return cb(module, file, autoImportProvider, /*isFromPackageJson*/ true); }); + (_b = host.log) === null || _b === void 0 ? void 0 : _b.call(host, "forEachExternalModuleToImportFrom autoImportProvider: " + (ts.timestamp() - start)); + } + } + codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; + function forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, cb) { + var _a; var filteredCount = 0; var moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); var packageJson = filterByPackageJson && createAutoImportFilter(from, program, host, moduleSpecifierResolutionHost); forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), function (module, sourceFile) { if (sourceFile === undefined) { if (!packageJson || packageJson.allowsImportingAmbientModule(module)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; @@ -132537,18 +132892,15 @@ var ts; sourceFile !== from && isImportableFile(program, from, sourceFile, moduleSpecifierResolutionHost)) { if (!packageJson || packageJson.allowsImportingSourceFile(sourceFile)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; } } }); - if (host.log) { - host.log("forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); - } + (_a = host.log) === null || _a === void 0 ? void 0 : _a.call(host, "forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); } - codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; function forEachExternalModule(checker, allSourceFiles, cb) { for (var _i = 0, _a = checker.getAmbientModules(); _i < _a.length; _i++) { var ambient = _a[_i]; @@ -132619,15 +132971,14 @@ var ts; codefix.moduleSpecifierToValidIdentifier = moduleSpecifierToValidIdentifier; function createAutoImportFilter(fromFile, program, host, moduleSpecifierResolutionHost) { if (moduleSpecifierResolutionHost === void 0) { moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); } - var packageJsons = host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host); - var dependencyGroups = 1 /* Dependencies */ | 2 /* DevDependencies */ | 8 /* OptionalDependencies */; + var packageJsons = ((host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName)) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host)).filter(function (p) { return p.parseable; }); var usesNodeCoreModules; return { allowsImportingAmbientModule: allowsImportingAmbientModule, allowsImportingSourceFile: allowsImportingSourceFile, allowsImportingSpecifier: allowsImportingSpecifier, moduleSpecifierResolutionHost: moduleSpecifierResolutionHost }; function moduleSpecifierIsCoveredByPackageJson(specifier) { var packageName = getNodeModuleRootSpecifier(specifier); for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) { var packageJson = packageJsons_1[_i]; - if (packageJson.has(packageName, dependencyGroups) || packageJson.has(ts.getTypesPackageName(packageName), dependencyGroups)) { + if (packageJson.has(packageName) || packageJson.has(ts.getTypesPackageName(packageName))) { return true; } } @@ -132835,12 +133186,16 @@ var ts; ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, ts.Diagnostics.Module_0_has_no_exported_member_1_Did_you_mean_2.code, + // for JSX class components + ts.Diagnostics.No_overload_matches_this_call.code, + // for JSX FC + ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code, ]; codefix.registerCodeFix({ errorCodes: errorCodes, getCodeActions: function (context) { - var sourceFile = context.sourceFile; - var info = getInfo(sourceFile, context.span.start, context); + var sourceFile = context.sourceFile, errorCode = context.errorCode; + var info = getInfo(sourceFile, context.span.start, context, errorCode); if (!info) return undefined; var node = info.node, suggestedSymbol = info.suggestedSymbol; @@ -132850,18 +133205,23 @@ var ts; }, fixIds: [fixId], getAllCodeActions: function (context) { return codefix.codeFixAll(context, errorCodes, function (changes, diag) { - var info = getInfo(diag.file, diag.start, context); + var info = getInfo(diag.file, diag.start, context, diag.code); var target = context.host.getCompilationSettings().target; if (info) doChange(changes, context.sourceFile, info.node, info.suggestedSymbol, target); }); }, }); - function getInfo(sourceFile, pos, context) { + function getInfo(sourceFile, pos, context, errorCode) { // This is the identifier of the misspelled word. eg: // this.speling = 1; // ^^^^^^^ var node = ts.getTokenAtPosition(sourceFile, pos); var parent = node.parent; + // Only fix spelling for No_overload_matches_this_call emitted on the React class component + if ((errorCode === ts.Diagnostics.No_overload_matches_this_call.code || + errorCode === ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code) && + !ts.isJsxAttribute(parent)) + return undefined; var checker = context.program.getTypeChecker(); var suggestedSymbol; if (ts.isPropertyAccessExpression(parent) && parent.name === node) { @@ -132880,6 +133240,12 @@ var ts; suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol); } } + else if (ts.isJsxAttribute(parent) && parent.name === node) { + ts.Debug.assertNode(node, ts.isIdentifier, "Expected an identifier for JSX attribute"); + var tag = ts.findAncestor(node, ts.isJsxOpeningLikeElement); + var props = checker.getContextualTypeForArgumentAtIndex(tag, 0); + suggestedSymbol = checker.getSuggestedSymbolForNonexistentJSXAttribute(node, props); + } else { var meaning = ts.getMeaningFromLocation(node); var name = ts.getTextOfNode(node); @@ -136021,10 +136387,10 @@ var ts; (function (codefix) { function generateAccessorFromProperty(file, start, end, context, _actionName) { var fieldInfo = getAccessorConvertiblePropertyAtPosition(file, start, end); - if (!fieldInfo) + if (!fieldInfo || !fieldInfo.info) return undefined; var changeTracker = ts.textChanges.ChangeTracker.fromContext(context); - var isStatic = fieldInfo.isStatic, isReadonly = fieldInfo.isReadonly, fieldName = fieldInfo.fieldName, accessorName = fieldInfo.accessorName, originalName = fieldInfo.originalName, type = fieldInfo.type, container = fieldInfo.container, declaration = fieldInfo.declaration; + var _a = fieldInfo.info, isStatic = _a.isStatic, isReadonly = _a.isReadonly, fieldName = _a.fieldName, accessorName = _a.accessorName, originalName = _a.originalName, type = _a.type, container = _a.container, declaration = _a.declaration; ts.suppressLeadingAndTrailingTrivia(fieldName); ts.suppressLeadingAndTrailingTrivia(accessorName); ts.suppressLeadingAndTrailingTrivia(declaration); @@ -136099,23 +136465,37 @@ var ts; var declaration = ts.findAncestor(node.parent, isAcceptedDeclaration); // make sure declaration have AccessibilityModifier or Static Modifier or Readonly Modifier var meaning = 28 /* AccessibilityModifier */ | 32 /* Static */ | 64 /* Readonly */; - if (!declaration || !(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest) - || !isConvertibleName(declaration.name) || (ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) - return undefined; + if (!declaration || (!(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest))) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_property_for_which_to_generate_accessor) + }; + } + if (!isConvertibleName(declaration.name)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Name_is_not_valid) + }; + } + if ((ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Can_only_convert_property_with_modifier) + }; + } var name = declaration.name.text; var startWithUnderscore = ts.startsWithUnderscore(name); var fieldName = createPropertyName(startWithUnderscore ? name : ts.getUniqueName("_" + name, file), declaration.name); var accessorName = createPropertyName(startWithUnderscore ? ts.getUniqueName(name.substring(1), file) : name, declaration.name); return { - isStatic: ts.hasStaticModifier(declaration), - isReadonly: ts.hasEffectiveReadonlyModifier(declaration), - type: ts.getTypeAnnotationNode(declaration), - container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, - originalName: declaration.name.text, - declaration: declaration, - fieldName: fieldName, - accessorName: accessorName, - renameAccessor: startWithUnderscore + info: { + isStatic: ts.hasStaticModifier(declaration), + isReadonly: ts.hasEffectiveReadonlyModifier(declaration), + type: ts.getTypeAnnotationNode(declaration), + container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, + originalName: declaration.name.text, + declaration: declaration, + fieldName: fieldName, + accessorName: accessorName, + renameAccessor: startWithUnderscore + } }; } codefix.getAccessorConvertiblePropertyAtPosition = getAccessorConvertiblePropertyAtPosition; @@ -136899,13 +137279,22 @@ var ts; var info = getInfo(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - var description = info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; - var actionName = info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (info.error === undefined) { + var description = info.info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; + var actionName = info.info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_default_export_to_named_export.message, actions: [{ name: actionNameDefaultToNamed, description: ts.Diagnostics.Convert_default_export_to_named_export.message, notApplicableReason: info.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_export_to_default_export.message, actions: [{ name: actionNameNamedToDefault, description: ts.Diagnostics.Convert_named_export_to_default_export.message, notApplicableReason: info.error }] }, + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameDefaultToNamed || actionName === actionNameNamedToDefault, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, ts.Debug.checkDefined(getInfo(context), "context must have info"), t, context.cancellationToken); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, ts.Debug.checkDefined((_a = getInfo(context)) === null || _a === void 0 ? void 0 : _a.info, "context must have info"), t, context.cancellationToken); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; }, }); @@ -136916,14 +137305,14 @@ var ts; var token = ts.getTokenAtPosition(file, span.start); var exportNode = !!(token.parent && ts.getSyntacticModifierFlags(token.parent) & 1 /* Export */) && considerPartialSpans ? token.parent : ts.getParentNodeInSpan(token, file, span); if (!exportNode || (!ts.isSourceFile(exportNode.parent) && !(ts.isModuleBlock(exportNode.parent) && ts.isAmbientModule(exportNode.parent.parent)))) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_export_statement) }; } var exportingModuleSymbol = ts.isSourceFile(exportNode.parent) ? exportNode.parent.symbol : exportNode.parent.parent.symbol; var flags = ts.getSyntacticModifierFlags(exportNode); var wasDefault = !!(flags & 512 /* Default */); // If source file already has a default export, don't offer refactor. if (!(flags & 1 /* Export */) || !wasDefault && exportingModuleSymbol.exports.has("default" /* Default */)) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.This_file_already_has_a_default_export) }; } switch (exportNode.kind) { case 248 /* FunctionDeclaration */: @@ -136933,7 +137322,7 @@ var ts; case 251 /* TypeAliasDeclaration */: case 253 /* ModuleDeclaration */: { var node = exportNode; - return node.name && ts.isIdentifier(node.name) ? { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return node.name && ts.isIdentifier(node.name) ? { info: { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } case 229 /* VariableStatement */: { var vs = exportNode; @@ -136945,7 +137334,7 @@ var ts; if (!decl.initializer) return undefined; ts.Debug.assert(!wasDefault, "Can't have a default flag here"); - return ts.isIdentifier(decl.name) ? { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return ts.isIdentifier(decl.name) ? { info: { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } default: return undefined; @@ -137096,13 +137485,22 @@ var ts; var i = getImportToConvert(context, context.triggerReason === "invoked"); if (!i) return ts.emptyArray; - var description = i.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; - var actionName = i.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (i.error === undefined) { + var description = i.info.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; + var actionName = i.info.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, actions: [{ name: actionNameNamespaceToNamed, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, notApplicableReason: i.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, actions: [{ name: actionNameNamedToNamespace, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, notApplicableReason: i.error }] } + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameNamespaceToNamed || actionName === actionNameNamedToNamespace, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, t, ts.Debug.checkDefined(getImportToConvert(context), "Context must provide an import to convert")); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, t, ts.Debug.checkDefined((_a = getImportToConvert(context)) === null || _a === void 0 ? void 0 : _a.info, "Context must provide an import to convert")); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; } }); @@ -137113,10 +137511,18 @@ var ts; var span = ts.getRefactorContextSpan(context); var token = ts.getTokenAtPosition(file, span.start); var importDecl = considerPartialSpans ? ts.findAncestor(token, ts.isImportDeclaration) : ts.getParentNodeInSpan(token, file, span); - if (!importDecl || !ts.isImportDeclaration(importDecl) || (importDecl.getEnd() < span.start + span.length)) + if (!importDecl || !ts.isImportDeclaration(importDecl)) + return { error: "Selection is not an import declaration." }; + if (importDecl.getEnd() < span.start + span.length) return undefined; var importClause = importDecl.importClause; - return importClause && importClause.namedBindings; + if (!importClause) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_import_clause) }; + } + if (!importClause.namedBindings) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_namespace_import_or_named_imports) }; + } + return { info: importClause.namedBindings }; } function doChange(sourceFile, program, changes, toConvert) { var checker = program.getTypeChecker(); @@ -137385,7 +137791,27 @@ var ts; var rangeToExtract = getRangeToExtract(context.file, ts.getRefactorContextSpan(context), context.triggerReason === "invoked"); var targetRange = rangeToExtract.targetRange; if (targetRange === undefined) { - return ts.emptyArray; + if (!rangeToExtract.errors || rangeToExtract.errors.length === 0 || !context.preferences.provideRefactorNotApplicableReason) { + return ts.emptyArray; + } + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + name: "function_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }, + { + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + name: "constant_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }]; } var extractions = getPossibleExtractions(targetRange, context); if (extractions === undefined) { @@ -137394,17 +137820,18 @@ var ts; } var functionActions = []; var usedFunctionNames = ts.createMap(); + var innermostErrorFunctionAction; var constantActions = []; var usedConstantNames = ts.createMap(); + var innermostErrorConstantAction; var i = 0; for (var _i = 0, extractions_1 = extractions; _i < extractions_1.length; _i++) { var _a = extractions_1[_i], functionExtraction = _a.functionExtraction, constantExtraction = _a.constantExtraction; - // Skip these since we don't have a way to report errors yet + var description = functionExtraction.description; if (functionExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = functionExtraction.description; if (!usedFunctionNames.has(description)) { usedFunctionNames.set(description, true); functionActions.push({ @@ -137413,32 +137840,39 @@ var ts; }); } } + else if (!innermostErrorFunctionAction) { + innermostErrorFunctionAction = { + description: description, + name: "function_scope_" + i, + notApplicableReason: getStringError(functionExtraction.errors) + }; + } // Skip these since we don't have a way to report errors yet if (constantExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = constantExtraction.description; - if (!usedConstantNames.has(description)) { - usedConstantNames.set(description, true); + var description_1 = constantExtraction.description; + if (!usedConstantNames.has(description_1)) { + usedConstantNames.set(description_1, true); constantActions.push({ - description: description, + description: description_1, name: "constant_scope_" + i }); } } + else if (!innermostErrorConstantAction) { + innermostErrorConstantAction = { + description: description, + name: "constant_scope_" + i, + notApplicableReason: getStringError(constantExtraction.errors) + }; + } // *do* increment i anyway because we'll look for the i-th scope // later when actually doing the refactoring if the user requests it i++; } var infos = []; - if (constantActions.length) { - infos.push({ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), - actions: constantActions - }); - } if (functionActions.length) { infos.push({ name: refactorName, @@ -137446,7 +137880,35 @@ var ts; actions: functionActions }); } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorFunctionAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [innermostErrorFunctionAction] + }); + } + if (constantActions.length) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: constantActions + }); + } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorConstantAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [innermostErrorConstantAction] + }); + } return infos.length ? infos : ts.emptyArray; + function getStringError(errors) { + var error = errors[0].messageText; + if (typeof error !== "string") { + error = error.messageText; + } + return error; + } } extractSymbol.getAvailableActions = getAvailableActions; /* Exported for tests */ @@ -138987,21 +139449,36 @@ var ts; var info = getRangeToExtract(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), - actions: info.isJS ? [{ - name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) - }] : ts.append([{ - name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) - }], info.typeElements && { - name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) - }) - }]; + if (info.error === undefined) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: info.info.isJS ? [{ + name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) + }] : ts.append([{ + name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) + }], info.info.typeElements && { + name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) + }) + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: [ + { name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef), notApplicableReason: info.error }, + { name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias), notApplicableReason: info.error }, + { name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface), notApplicableReason: info.error }, + ] + }]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { + var _a; var file = context.file; - var info = ts.Debug.checkDefined(getRangeToExtract(context), "Expected to find a range to extract"); + var info = ts.Debug.checkDefined((_a = getRangeToExtract(context)) === null || _a === void 0 ? void 0 : _a.info, "Expected to find a range to extract"); var name = ts.getUniqueName("NewType", file); var edits = ts.textChanges.ChangeTracker.with(context, function (changes) { switch (actionName) { @@ -139033,14 +139510,14 @@ var ts; var selection = ts.findAncestor(current, (function (node) { return node.parent && ts.isTypeNode(node) && !rangeContainsSkipTrivia(range, node.parent, file) && (cursorRequest || ts.nodeOverlapsWithStartEnd(current, file, range.pos, range.end)); })); if (!selection || !ts.isTypeNode(selection)) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Selection_is_not_a_valid_type_node) }; var checker = context.program.getTypeChecker(); var firstStatement = ts.Debug.checkDefined(ts.findAncestor(selection, ts.isStatement), "Should find a statement"); var typeParameters = collectTypeParameters(checker, selection, firstStatement, file); if (!typeParameters) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.No_type_could_be_extracted_from_this_type_node) }; var typeElements = flattenTypeLiteralNodeReference(checker, selection); - return { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements }; + return { info: { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements } }; } function flattenTypeLiteralNodeReference(checker, node) { if (!node) @@ -139161,32 +139638,47 @@ var ts; if (!context.endPosition) return undefined; var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition); - if (!info) + if (!info || !info.info) return undefined; var edits = ts.codefix.generateAccessorFromProperty(context.file, context.startPosition, context.endPosition, context, actionName); if (!edits) return undefined; var renameFilename = context.file.fileName; - var nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName; + var nameNeedRename = info.info.renameAccessor ? info.info.accessorName : info.info.fieldName; var renameLocationOffset = ts.isIdentifier(nameNeedRename) ? 0 : -1; - var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.declaration)); + var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.info.declaration)); return { renameFilename: renameFilename, renameLocation: renameLocation, edits: edits }; }, getAvailableActions: function (context) { if (!context.endPosition) return ts.emptyArray; - if (!ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked")) + var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked"); + if (!info) return ts.emptyArray; - return [{ - name: actionName, - description: actionDescription, - actions: [ - { - name: actionName, - description: actionDescription - } - ] - }]; + if (!info.error) { + return [{ + name: actionName, + description: actionDescription, + actions: [ + { + name: actionName, + description: actionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: actionName, + description: actionDescription, + actions: [{ + name: actionName, + description: actionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } }); })(generateGetAccessorAndSetAccessor = refactor.generateGetAccessorAndSetAccessor || (refactor.generateGetAccessorAndSetAccessor = {})); @@ -139917,27 +140409,45 @@ var ts; var info = getConvertibleArrowFunctionAtPosition(file, startPosition, triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: refactorDescription, - actions: [ - info.addBraces ? - { + if (info.error === undefined) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [ + info.info.addBraces ? + { + name: addBracesActionName, + description: addBracesActionDescription + } : { + name: removeBracesActionName, + description: removeBracesActionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [{ name: addBracesActionName, - description: addBracesActionDescription - } : { - name: removeBracesActionName, - description: removeBracesActionDescription - } - ] - }]; + description: addBracesActionDescription, + notApplicableReason: info.error + }, { + name: removeBracesActionName, + description: removeBracesActionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } function getEditsForAction(context, actionName) { var file = context.file, startPosition = context.startPosition; var info = getConvertibleArrowFunctionAtPosition(file, startPosition); - if (!info) + if (!info || !info.info) return undefined; - var expression = info.expression, returnStatement = info.returnStatement, func = info.func; + var _a = info.info, expression = _a.expression, returnStatement = _a.returnStatement, func = _a.func; var body; if (actionName === addBracesActionName) { var returnStatement_1 = ts.factory.createReturnStatement(expression); @@ -139965,25 +140475,38 @@ var ts; if (considerFunctionBodies === void 0) { considerFunctionBodies = true; } var node = ts.getTokenAtPosition(file, startPosition); var func = ts.getContainingFunction(node); - // Only offer a refactor in the function body on explicit refactor requests. - if (!func || !ts.isArrowFunction(func) || (!ts.rangeContainsRange(func, node) - || (ts.rangeContainsRange(func.body, node) && !considerFunctionBodies))) + if (!func) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_a_containing_arrow_function) + }; + } + if (!ts.isArrowFunction(func)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Containing_function_is_not_an_arrow_function) + }; + } + if ((!ts.rangeContainsRange(func, node) || ts.rangeContainsRange(func.body, node) && !considerFunctionBodies)) { return undefined; + } if (ts.isExpression(func.body)) { return { - func: func, - addBraces: true, - expression: func.body + info: { + func: func, + addBraces: true, + expression: func.body + } }; } else if (func.body.statements.length === 1) { var firstStatement = ts.first(func.body.statements); if (ts.isReturnStatement(firstStatement)) { return { - func: func, - addBraces: false, - expression: firstStatement.expression, - returnStatement: firstStatement + info: { + func: func, + addBraces: false, + expression: firstStatement.expression, + returnStatement: firstStatement + } }; } } @@ -141968,6 +142491,10 @@ var ts; synchronizeHostData(); return program; } + function getAutoImportProvider() { + var _a; + return (_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host); + } function cleanupSemanticCache() { program = undefined; // TODO: GH#18217 } @@ -142636,6 +143163,7 @@ var ts; getEmitOutput: getEmitOutput, getNonBoundSourceFile: getNonBoundSourceFile, getProgram: getProgram, + getAutoImportProvider: getAutoImportProvider, getApplicableRefactors: getApplicableRefactors, getEditsForRefactor: getEditsForRefactor, toLineColumnOffset: sourceMapper.toLineColumnOffset, @@ -144705,6 +145233,11 @@ var ts; return "/dev/null/inferredProject" + counter + "*"; } server.makeInferredProjectName = makeInferredProjectName; + /*@internal*/ + function makeAutoImportProviderProjectName(counter) { + return "/dev/null/autoImportProviderProject" + counter + "*"; + } + server.makeAutoImportProviderProjectName = makeAutoImportProviderProjectName; function createSortedArray() { return []; // TODO: GH#19873 } @@ -145431,7 +145964,7 @@ var ts; case 0: return server.Errors.ThrowNoProject(); case 1: - return this.containingProjects[0]; + return ensureNotAutoImportProvider(this.containingProjects[0]); default: // If this file belongs to multiple projects, below is the order in which default project is used // - for open script info, its default configured project during opening is default if info is part of it @@ -145441,6 +145974,7 @@ var ts; // - first inferred project var firstExternalProject = void 0; var firstConfiguredProject = void 0; + var firstInferredProject = void 0; var firstNonSourceOfProjectReferenceRedirect = void 0; var defaultConfiguredProject = void 0; for (var index = 0; index < this.containingProjects.length; index++) { @@ -145464,12 +145998,15 @@ var ts; else if (!firstExternalProject && server.isExternalProject(project)) { firstExternalProject = project; } + else if (!firstInferredProject && server.isInferredProject(project)) { + firstInferredProject = project; + } } - return defaultConfiguredProject || + return ensureNotAutoImportProvider(defaultConfiguredProject || firstNonSourceOfProjectReferenceRedirect || firstConfiguredProject || firstExternalProject || - this.containingProjects[0]; + firstInferredProject); } }; ScriptInfo.prototype.registerFileUpdate = function () { @@ -145540,6 +146077,10 @@ var ts; ScriptInfo.prototype.isOrphan = function () { return !ts.forEach(this.containingProjects, function (p) { return !p.isOrphan(); }); }; + /*@internal*/ + ScriptInfo.prototype.isContainedByAutoImportProvider = function () { + return ts.some(this.containingProjects, function (p) { return p.projectKind === server.ProjectKind.AutoImportProvider; }); + }; /** * @param line 1 based index */ @@ -145572,6 +146113,12 @@ var ts; return ScriptInfo; }()); server.ScriptInfo = ScriptInfo; + function ensureNotAutoImportProvider(project) { + if (!project || project.projectKind === server.ProjectKind.AutoImportProvider) { + return server.Errors.ThrowNoProject(); + } + return project; + } function failIfInvalidPosition(position) { ts.Debug.assert(typeof position === "number", "Expected position " + position + " to be a number."); ts.Debug.assert(position >= 0, "Expected position to be non-negative."); @@ -145706,6 +146253,7 @@ var ts; ProjectKind[ProjectKind["Inferred"] = 0] = "Inferred"; ProjectKind[ProjectKind["Configured"] = 1] = "Configured"; ProjectKind[ProjectKind["External"] = 2] = "External"; + ProjectKind[ProjectKind["AutoImportProvider"] = 3] = "AutoImportProvider"; })(ProjectKind = server.ProjectKind || (server.ProjectKind = {})); /* @internal */ function countEachFileTypes(infos, includeSizes) { @@ -145857,8 +146405,9 @@ var ts; this.disableLanguageService(lastFileExceededProgramSize); } this.markAsDirty(); - this.projectService.pendingEnsureProjectForOpenFiles = true; - this.packageJsonCache = server.createPackageJsonCache(this); + if (projectKind !== ProjectKind.AutoImportProvider) { + this.projectService.pendingEnsureProjectForOpenFiles = true; + } } /*@internal*/ Project.prototype.getResolvedProjectReferenceToRedirect = function (_fileName) { @@ -146168,6 +146717,10 @@ var ts; this.languageServiceEnabled = false; this.lastFileExceededProgramSize = lastFileExceededProgramSize; this.builderState = undefined; + if (this.autoImportProviderHost) { + this.autoImportProviderHost.close(); + } + this.autoImportProviderHost = undefined; this.resolutionCache.closeTypeRootsWatch(); this.clearGeneratedFileWatch(); this.projectService.onUpdateLanguageServiceStateForProject(this, /*languageServiceEnabled*/ false); @@ -146247,12 +146800,12 @@ var ts; ts.clearMap(this.missingFilesMap, ts.closeFileWatcher); this.missingFilesMap = undefined; } - if (this.packageJsonFilesMap) { - ts.clearMap(this.packageJsonFilesMap, ts.closeFileWatcher); - this.packageJsonFilesMap = undefined; - } this.clearGeneratedFileWatch(); this.clearInvalidateResolutionOfFailedLookupTimer(); + if (this.autoImportProviderHost) { + this.autoImportProviderHost.close(); + } + this.autoImportProviderHost = undefined; // signal language service to release source files acquired from document registry this.languageService.dispose(); this.languageService = undefined; @@ -146430,6 +146983,15 @@ var ts; this.dirty = true; } }; + /*@internal*/ + Project.prototype.markAutoImportProviderAsDirty = function () { + var _a; + if (this.autoImportProviderHost === false) { + this.autoImportProviderHost = undefined; + } + (_a = this.autoImportProviderHost) === null || _a === void 0 ? void 0 : _a.markAsDirty(); + this.importSuggestionsCache.clear(); + }; /* @internal */ Project.prototype.onFileAddedOrRemoved = function () { this.hasAddedorRemovedFiles = true; @@ -146439,6 +147001,7 @@ var ts; * @returns: true if set of files in the project stays the same and false - otherwise. */ Project.prototype.updateGraph = function () { + var _a; ts.perfLogger.logStartUpdateGraph(); this.resolutionCache.startRecordingFilesWithChangedResolutions(); var hasNewProgram = this.updateGraphWorker(); @@ -146467,9 +147030,19 @@ var ts; else { this.lastCachedUnresolvedImportsList = undefined; } + var isFirstLoad = this.projectProgramVersion === 0; if (hasNewProgram) { this.projectProgramVersion++; } + if (hasAddedorRemovedFiles) { + if (!this.autoImportProviderHost) + this.autoImportProviderHost = undefined; + (_a = this.autoImportProviderHost) === null || _a === void 0 ? void 0 : _a.markAsDirty(); + } + if (isFirstLoad) { + // Preload auto import provider so it's not created during completions request + this.getPackageJsonAutoImportProvider(); + } ts.perfLogger.logStopUpdateGraph(); return !hasNewProgram; }; @@ -146590,7 +147163,7 @@ var ts; scriptInfo.attachToProject(_this); }, function (removed) { return _this.detachScriptInfoFromProject(removed); }); var elapsed = ts.timestamp() - start; - this.projectService.sendUpdateGraphPerformanceEvent(elapsed); + this.sendPerformanceEvent("UpdateGraph", elapsed); this.writeLog("Finishing updateGraphWorker: Project: " + this.getProjectName() + " Version: " + this.getProjectVersion() + " structureChanged: " + hasNewProgram + " Elapsed: " + elapsed + "ms"); if (this.hasAddedorRemovedFiles) { this.print(/*writeProjectFileNames*/ true); @@ -146600,6 +147173,10 @@ var ts; } return hasNewProgram; }; + /* @internal */ + Project.prototype.sendPerformanceEvent = function (kind, durationMs) { + this.projectService.sendPerformanceEvent(kind, durationMs); + }; /*@internal*/ Project.prototype.sourceFileHasChangedOwnImportSuggestions = function (oldSourceFile, newSourceFile) { if (!oldSourceFile && !newSourceFile) { @@ -146754,6 +147331,9 @@ var ts; this.writeLog("Project '" + this.projectName + "' (" + ProjectKind[this.projectKind] + ")"); this.writeLog(this.filesToString(writeProjectFileNames && this.projectService.logger.hasLevel(server.LogLevel.verbose))); this.writeLog("-----------------------------------------------"); + if (this.autoImportProviderHost) { + this.autoImportProviderHost.print(/*writeProjectFileNames*/ false); + } }; Project.prototype.setCompilerOptions = function (compilerOptions) { if (compilerOptions) { @@ -146981,60 +147561,55 @@ var ts; }; /*@internal*/ Project.prototype.getPackageJsonsVisibleToFile = function (fileName, rootDir) { - var packageJsonCache = this.packageJsonCache; - var watchPackageJsonFile = this.watchPackageJsonFile.bind(this); - var toPath = this.toPath.bind(this); - var rootPath = rootDir && toPath(rootDir); - var filePath = toPath(fileName); - var result = []; - ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), function processDirectory(directory) { - switch (packageJsonCache.directoryHasPackageJson(directory)) { - // Sync and check same directory again - case 1 /* Maybe */: - packageJsonCache.searchDirectoryAndAncestors(directory); - return processDirectory(directory); - // Check package.json - case -1 /* True */: - var packageJsonFileName = ts.combinePaths(directory, "package.json"); - watchPackageJsonFile(packageJsonFileName); - var info = packageJsonCache.getInDirectory(directory); - if (info) - result.push(info); - } - if (rootPath && rootPath === toPath(directory)) { - return true; - } - }); - return result; + return this.projectService.getPackageJsonsVisibleToFile(fileName, rootDir); }; /*@internal*/ - Project.prototype.onAddPackageJson = function (path) { - this.packageJsonCache.addOrUpdate(path); - this.watchPackageJsonFile(path); + Project.prototype.getPackageJsonsForAutoImport = function (rootDir) { + var packageJsons = this.getPackageJsonsVisibleToFile(ts.combinePaths(this.currentDirectory, ts.inferredTypesContainingFile), rootDir); + this.packageJsonsForAutoImport = ts.arrayToSet(packageJsons.map(function (p) { return p.fileName; })); + return packageJsons; }; /*@internal*/ Project.prototype.getImportSuggestionsCache = function () { return this.importSuggestionsCache; }; - Project.prototype.watchPackageJsonFile = function (path) { - var _this = this; - var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = ts.createMap()); - if (!watchers.has(path)) { - watchers.set(path, this.projectService.watchFactory.watchFile(this.projectService.host, path, function (fileName, eventKind) { - var path = _this.toPath(fileName); - switch (eventKind) { - case ts.FileWatcherEventKind.Created: - return ts.Debug.fail(); - case ts.FileWatcherEventKind.Changed: - _this.packageJsonCache.addOrUpdate(path); - break; - case ts.FileWatcherEventKind.Deleted: - _this.packageJsonCache.delete(path); - watchers.get(path).close(); - watchers.delete(path); - } - }, ts.PollingInterval.Low, this.projectService.getWatchOptions(this), ts.WatchType.PackageJsonFile)); + /*@internal*/ + Project.prototype.includePackageJsonAutoImports = function () { + if (this.projectService.includePackageJsonAutoImports() === 0 /* None */ || + !this.languageServiceEnabled || + ts.isInsideNodeModules(this.currentDirectory) || + !this.isDefaultProjectForOpenFiles()) { + return 0 /* None */; } + return this.projectService.includePackageJsonAutoImports(); + }; + /*@internal*/ + Project.prototype.getPackageJsonAutoImportProvider = function () { + if (this.autoImportProviderHost === false) { + return undefined; + } + if (this.autoImportProviderHost) { + server.updateProjectIfDirty(this.autoImportProviderHost); + if (!this.autoImportProviderHost.hasRoots()) { + this.autoImportProviderHost.close(); + this.autoImportProviderHost = undefined; + return undefined; + } + return this.autoImportProviderHost.getCurrentProgram(); + } + var dependencySelection = this.includePackageJsonAutoImports(); + if (dependencySelection) { + this.autoImportProviderHost = AutoImportProviderProject.create(dependencySelection, this, this.projectService.host, this.documentRegistry); + if (this.autoImportProviderHost) { + server.updateProjectIfDirty(this.autoImportProviderHost); + return this.autoImportProviderHost.getCurrentProgram(); + } + } + }; + /*@internal*/ + Project.prototype.isDefaultProjectForOpenFiles = function () { + var _this = this; + return !!ts.forEachEntry(this.projectService.openFiles, function (_, fileName) { return _this.projectService.tryGetDefaultProjectForFile(server.toNormalizedPath(fileName)) === _this; }); }; return Project; }()); @@ -147061,6 +147636,10 @@ var ts; return unresolvedImports || server.emptyArray; }); } + function createProjectNameFactoryWithCounter(nameFactory) { + var nextId = 1; + return function () { return nameFactory(nextId++); }; + } /** * If a file is opened and no tsconfig (or jsconfig) is found, * the file and its imports/references are put into an InferredProject. @@ -147139,21 +147718,109 @@ var ts; InferredProject.prototype.getTypeAcquisition = function () { return { enable: allRootFilesAreJsOrDts(this), - include: [], - exclude: [] + include: ts.emptyArray, + exclude: ts.emptyArray }; }; - InferredProject.newName = (function () { - var nextId = 1; - return function () { - var id = nextId; - nextId++; - return server.makeInferredProjectName(id); - }; - })(); + InferredProject.newName = createProjectNameFactoryWithCounter(server.makeInferredProjectName); return InferredProject; }(Project)); server.InferredProject = InferredProject; + var AutoImportProviderProject = /** @class */ (function (_super) { + __extends(AutoImportProviderProject, _super); + /*@internal*/ + function AutoImportProviderProject(hostProject, initialRootNames, documentRegistry, compilerOptions) { + var _this = _super.call(this, AutoImportProviderProject.newName(), ProjectKind.AutoImportProvider, hostProject.projectService, documentRegistry, + /*hasExplicitListOfFiles*/ false, + /*lastFileExceededProgramSize*/ undefined, compilerOptions, + /*compileOnSaveEnabled*/ false, hostProject.getWatchOptions(), hostProject.projectService.host, hostProject.currentDirectory) || this; + _this.hostProject = hostProject; + _this.rootFileNames = initialRootNames; + return _this; + } + /*@internal*/ + AutoImportProviderProject.getRootFileNames = function (dependencySelection, hostProject, moduleResolutionHost, compilerOptions) { + var _a, _b, _c, _d; + if (!dependencySelection) { + return ts.emptyArray; + } + var dependencyNames; + var rootNames; + var rootFileName = ts.combinePaths(hostProject.currentDirectory, ts.inferredTypesContainingFile); + var packageJsons = hostProject.getPackageJsonsForAutoImport(ts.combinePaths(hostProject.currentDirectory, rootFileName)); + for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) { + var packageJson = packageJsons_1[_i]; + (_a = packageJson.dependencies) === null || _a === void 0 ? void 0 : _a.forEach(function (_, dependenyName) { return addDependency(dependenyName); }); + (_b = packageJson.peerDependencies) === null || _b === void 0 ? void 0 : _b.forEach(function (_, dependencyName) { return addDependency(dependencyName); }); + if (dependencySelection === 2 /* All */) { + (_c = packageJson.devDependencies) === null || _c === void 0 ? void 0 : _c.forEach(function (_, dependencyName) { return addDependency(dependencyName); }); + } + } + if (dependencyNames) { + var resolutions = ts.map(ts.arrayFrom(dependencyNames.keys()), function (name) { return ts.resolveTypeReferenceDirective(name, rootFileName, compilerOptions, moduleResolutionHost); }); + for (var _e = 0, resolutions_1 = resolutions; _e < resolutions_1.length; _e++) { + var resolution = resolutions_1[_e]; + if (((_d = resolution.resolvedTypeReferenceDirective) === null || _d === void 0 ? void 0 : _d.resolvedFileName) && !hostProject.getCurrentProgram().getSourceFile(resolution.resolvedTypeReferenceDirective.resolvedFileName)) { + rootNames = ts.append(rootNames, resolution.resolvedTypeReferenceDirective.resolvedFileName); + } + } + } + return rootNames || ts.emptyArray; + function addDependency(dependency) { + if (!ts.startsWith(dependency, "@types/")) { + (dependencyNames || (dependencyNames = ts.createMap())).set(dependency, true); + } + } + }; + /*@internal*/ + AutoImportProviderProject.create = function (dependencySelection, hostProject, moduleResolutionHost, documentRegistry) { + if (dependencySelection === 0 /* None */) { + return undefined; + } + var compilerOptions = __assign(__assign({}, hostProject.getCompilerOptions()), { noLib: true, diagnostics: false, skipLibCheck: true, types: ts.emptyArray, lib: ts.emptyArray, sourceMap: false }); + var rootNames = this.getRootFileNames(dependencySelection, hostProject, moduleResolutionHost, compilerOptions); + if (!rootNames.length) { + return undefined; + } + return new AutoImportProviderProject(hostProject, rootNames, documentRegistry, compilerOptions); + }; + AutoImportProviderProject.prototype.isOrphan = function () { + return true; + }; + AutoImportProviderProject.prototype.updateGraph = function () { + var rootFileNames = this.rootFileNames; + if (!rootFileNames) { + rootFileNames = AutoImportProviderProject.getRootFileNames(this.hostProject.includePackageJsonAutoImports(), this.hostProject, this.projectService.host, this.getCompilationSettings()); + } + this.projectService.setFileNamesOfAutoImportProviderProject(this, rootFileNames); + this.rootFileNames = rootFileNames; + this.hostProject.getImportSuggestionsCache().clear(); + return _super.prototype.updateGraph.call(this); + }; + AutoImportProviderProject.prototype.markAsDirty = function () { + this.rootFileNames = undefined; + _super.prototype.markAsDirty.call(this); + }; + AutoImportProviderProject.prototype.getScriptFileNames = function () { + return this.rootFileNames || ts.emptyArray; + }; + AutoImportProviderProject.prototype.getLanguageService = function () { + throw new Error("AutoImportProviderProject language service should never be used. To get the program, use `project.getCurrentProgram()`."); + }; + AutoImportProviderProject.prototype.markAutoImportProviderAsDirty = function () { + throw new Error("AutoImportProviderProject is an auto import provider; use `markAsDirty()` instead."); + }; + /*@internal*/ + AutoImportProviderProject.prototype.includePackageJsonAutoImports = function () { + return 0 /* None */; + }; + AutoImportProviderProject.prototype.getTypeAcquisition = function () { + return { enable: false }; + }; + AutoImportProviderProject.newName = createProjectNameFactoryWithCounter(server.makeAutoImportProviderProjectName); + return AutoImportProviderProject; + }(Project)); + server.AutoImportProviderProject = AutoImportProviderProject; /** * If a file is opened, the server will look for a tsconfig (or jsconfig) * and if successful create a ConfiguredProject for it. @@ -147817,6 +148484,7 @@ var ts; var watchLogLevel = this.logger.hasLevel(server.LogLevel.verbose) ? ts.WatchLogLevel.Verbose : this.logger.loggingEnabled() ? ts.WatchLogLevel.TriggerOnly : ts.WatchLogLevel.None; var log = watchLogLevel !== ts.WatchLogLevel.None ? (function (s) { return _this.logger.info(s); }) : ts.noop; + this.packageJsonCache = server.createPackageJsonCache(this); this.watchFactory = this.syntaxOnly ? { watchFile: ts.returnNoopFileWatcher, @@ -147992,9 +148660,9 @@ var ts; this.eventHandler(event); }; /* @internal */ - ProjectService.prototype.sendUpdateGraphPerformanceEvent = function (durationMs) { + ProjectService.prototype.sendPerformanceEvent = function (kind, durationMs) { if (this.performanceEventHandler) { - this.performanceEventHandler({ kind: "UpdateGraph", durationMs: durationMs }); + this.performanceEventHandler({ kind: kind, durationMs: durationMs }); } }; /* @internal */ @@ -148207,6 +148875,7 @@ var ts; /*@internal*/ ProjectService.prototype.watchWildcardDirectory = function (directory, flags, project) { var _this = this; + var watchOptions = this.getWatchOptions(project); return this.watchFactory.watchDirectory(this.host, directory, function (fileOrDirectory) { var fileOrDirectoryPath = _this.toPath(fileOrDirectory); var fsResult = project.getCachedDirectoryStructureHost().addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath); @@ -148214,7 +148883,7 @@ var ts; if (ts.getBaseFileName(fileOrDirectoryPath) === "package.json" && !ts.isInsideNodeModules(fileOrDirectoryPath) && (fsResult && fsResult.fileExists || !fsResult && _this.host.fileExists(fileOrDirectoryPath))) { _this.logger.info("Project: " + configFileName + " Detected new package.json: " + fileOrDirectory); - project.onAddPackageJson(fileOrDirectoryPath); + _this.onAddPackageJson(fileOrDirectoryPath); } if (ts.isIgnoredFileFromWildCardWatching({ watchedDirPath: directory, @@ -148249,7 +148918,7 @@ var ts; project.pendingReload = ts.ConfigFileProgramReloadLevel.Partial; _this.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(project); } - }, flags, this.getWatchOptions(project), ts.WatchType.WildcardDirectory, project); + }, flags, watchOptions, ts.WatchType.WildcardDirectory, project); }; /** Gets the config file existence info for the configured project */ /*@internal*/ @@ -148941,7 +149610,7 @@ var ts; }; } project.configFileSpecs = parsedCommandLine.configFileSpecs; - project.canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(parsedCommandLine.raw); + project.canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(parsedCommandLine.raw); project.setProjectErrors(configFileErrors); project.updateReferences(parsedCommandLine.projectReferences); var lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, compilerOptions, parsedCommandLine.fileNames, fileNamePropertyReader); @@ -149045,6 +149714,10 @@ var ts; this.updateNonInferredProjectFiles(project, fileNamesResult.fileNames.concat(project.getExternalFiles()), fileNamePropertyReader); return project.updateGraph(); }; + /*@internal*/ + ProjectService.prototype.setFileNamesOfAutoImportProviderProject = function (project, fileNames) { + this.updateNonInferredProjectFiles(project, fileNames, fileNamePropertyReader); + }; /** * Read the config file of the project again by clearing the cache and update the project graph */ @@ -149532,7 +150205,7 @@ var ts; this.logger.info("Format host information updated"); } if (args.preferences) { - var lazyConfiguredProjectsFromExternalProject = this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject; + var _a = this.hostConfiguration.preferences, lazyConfiguredProjectsFromExternalProject = _a.lazyConfiguredProjectsFromExternalProject, includePackageJsonAutoImports = _a.includePackageJsonAutoImports; this.hostConfiguration.preferences = __assign(__assign({}, this.hostConfiguration.preferences), args.preferences); if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) { // Load configured projects for external projects that are pending reload @@ -149544,6 +150217,9 @@ var ts; } }); } + if (includePackageJsonAutoImports !== args.preferences.includePackageJsonAutoImports) { + this.invalidateProjectAutoImports(/*packageJsonPath*/ undefined); + } } if (args.extraFileExtensions) { this.hostConfiguration.extraFileExtensions = args.extraFileExtensions; @@ -149975,7 +150651,7 @@ var ts; var toRemoveScriptInfos = ts.cloneMap(this.filenameToScriptInfo); this.filenameToScriptInfo.forEach(function (info) { // If script info is open or orphan, retain it and its dependencies - if (!info.isScriptOpen() && info.isOrphan()) { + if (!info.isScriptOpen() && info.isOrphan() && !info.isContainedByAutoImportProvider()) { // Otherwise if there is any source info that is alive, this alive too if (!info.sourceMapFilePath) return; @@ -150431,6 +151107,85 @@ var ts; this.currentPluginConfigOverrides = this.currentPluginConfigOverrides || ts.createMap(); this.currentPluginConfigOverrides.set(args.pluginName, args.configuration); }; + /*@internal*/ + ProjectService.prototype.getPackageJsonsVisibleToFile = function (fileName, rootDir) { + var packageJsonCache = this.packageJsonCache; + var watchPackageJsonFile = this.watchPackageJsonFile.bind(this); + var toPath = this.toPath.bind(this); + var rootPath = rootDir && toPath(rootDir); + var filePath = toPath(fileName); + var result = []; + ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), function processDirectory(directory) { + switch (packageJsonCache.directoryHasPackageJson(directory)) { + // Sync and check same directory again + case 1 /* Maybe */: + packageJsonCache.searchDirectoryAndAncestors(directory); + return processDirectory(directory); + // Check package.json + case -1 /* True */: + var packageJsonFileName = ts.combinePaths(directory, "package.json"); + watchPackageJsonFile(packageJsonFileName); + var info = packageJsonCache.getInDirectory(directory); + if (info) + result.push(info); + } + if (rootPath && rootPath === toPath(directory)) { + return true; + } + }); + return result; + }; + /*@internal*/ + ProjectService.prototype.watchPackageJsonFile = function (path) { + var _this = this; + var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = ts.createMap()); + if (!watchers.has(path)) { + this.invalidateProjectAutoImports(path); + watchers.set(path, this.watchFactory.watchFile(this.host, path, function (fileName, eventKind) { + var path = _this.toPath(fileName); + switch (eventKind) { + case ts.FileWatcherEventKind.Created: + return ts.Debug.fail(); + case ts.FileWatcherEventKind.Changed: + _this.packageJsonCache.addOrUpdate(path); + _this.invalidateProjectAutoImports(path); + break; + case ts.FileWatcherEventKind.Deleted: + _this.packageJsonCache.delete(path); + _this.invalidateProjectAutoImports(path); + watchers.get(path).close(); + watchers.delete(path); + } + }, ts.PollingInterval.Low, this.hostConfiguration.watchOptions, ts.WatchType.PackageJsonFile)); + } + }; + /*@internal*/ + ProjectService.prototype.onAddPackageJson = function (path) { + this.packageJsonCache.addOrUpdate(path); + this.watchPackageJsonFile(path); + }; + /*@internal*/ + ProjectService.prototype.includePackageJsonAutoImports = function () { + switch (this.hostConfiguration.preferences.includePackageJsonAutoImports) { + case "none": return 0 /* None */; + case "all": return 2 /* All */; + default: return 1 /* ExcludeDevDependencies */; + } + }; + /*@internal*/ + ProjectService.prototype.invalidateProjectAutoImports = function (packageJsonPath) { + if (this.includePackageJsonAutoImports()) { + this.configuredProjects.forEach(invalidate); + this.inferredProjects.forEach(invalidate); + this.externalProjects.forEach(invalidate); + } + function invalidate(project) { + var _a; + if (!packageJsonPath || ((_a = project.packageJsonsForAutoImport) === null || _a === void 0 ? void 0 : _a.has(packageJsonPath))) { + project.markAutoImportProviderAsDirty(); + } + } + }; /** Makes a filename safe to insert in a RegExp */ ProjectService.filenameEscapeRegexp = /[-\/\\^$*+?.()|[\]{}]/g; return ProjectService; @@ -150451,11 +151206,13 @@ var ts; (function (ts) { var server; (function (server) { - function createPackageJsonCache(project) { + function createPackageJsonCache(host) { var packageJsons = ts.createMap(); var directoriesWithoutPackageJson = ts.createMap(); return { addOrUpdate: addOrUpdate, + forEach: packageJsons.forEach.bind(packageJsons), + get: packageJsons.get.bind(packageJsons), delete: function (fileName) { packageJsons.delete(fileName); directoriesWithoutPackageJson.set(ts.getDirectoryPath(fileName), true); @@ -150469,8 +151226,8 @@ var ts; if (directoryHasPackageJson(ancestor) !== 1 /* Maybe */) { return true; } - var packageJsonFileName = project.toPath(ts.combinePaths(ancestor, "package.json")); - if (ts.tryFileExists(project, packageJsonFileName)) { + var packageJsonFileName = host.toPath(ts.combinePaths(ancestor, "package.json")); + if (ts.tryFileExists(host, packageJsonFileName)) { addOrUpdate(packageJsonFileName); } else { @@ -150480,7 +151237,7 @@ var ts; }, }; function addOrUpdate(fileName) { - var packageJsonInfo = ts.createPackageJsonInfo(fileName, project); + var packageJsonInfo = ts.createPackageJsonInfo(fileName, host.host); if (packageJsonInfo !== undefined) { packageJsons.set(fileName, packageJsonInfo); directoriesWithoutPackageJson.delete(ts.getDirectoryPath(fileName)); @@ -151359,12 +152116,21 @@ var ts; Session.prototype.sendRequestCompletedEvent = function (requestId) { this.event({ request_seq: requestId }, "requestCompleted"); }; + Session.prototype.addPerformanceData = function (key, value) { + var _a; + if (!this.performanceData) { + this.performanceData = {}; + } + this.performanceData[key] = ((_a = this.performanceData[key]) !== null && _a !== void 0 ? _a : 0) + value; + }; Session.prototype.performanceEventHandler = function (event) { switch (event.kind) { - case "UpdateGraph": { - this.updateGraphDurationMs = (this.updateGraphDurationMs || 0) + event.durationMs; + case "UpdateGraph": + this.addPerformanceData("updateGraphDurationMs", event.durationMs); + break; + case "CreatePackageJsonAutoImportProvider": + this.addPerformanceData("createAutoImportProviderProgramDurationMs", event.durationMs); break; - } } }; Session.prototype.defaultEventHandler = function (event) { @@ -151492,11 +152258,7 @@ var ts; command: cmdName, request_seq: reqSeq, success: success, - performanceData: !this.updateGraphDurationMs - ? undefined - : { - updateGraphDurationMs: this.updateGraphDurationMs, - }, + performanceData: this.performanceData }; if (success) { var metadata = void 0; @@ -152201,10 +152963,10 @@ var ts; var prefix = args.prefix || ""; var entries = ts.mapDefined(completions.entries, function (entry) { if (completions.isMemberCompletion || ts.startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) { - var name = entry.name, kind_1 = entry.kind, kindModifiers = entry.kindModifiers, sortText = entry.sortText, insertText = entry.insertText, replacementSpan = entry.replacementSpan, hasAction = entry.hasAction, source = entry.source, isRecommended = entry.isRecommended; + var name = entry.name, kind_1 = entry.kind, kindModifiers = entry.kindModifiers, sortText = entry.sortText, insertText = entry.insertText, replacementSpan = entry.replacementSpan, hasAction = entry.hasAction, source = entry.source, isRecommended = entry.isRecommended, isPackageJsonImport = entry.isPackageJsonImport; var convertedSpan = replacementSpan ? toProtocolTextSpan(replacementSpan, scriptInfo) : undefined; // Use `hasAction || undefined` to avoid serializing `false`. - return { name: name, kind: kind_1, kindModifiers: kindModifiers, sortText: sortText, insertText: insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source: source, isRecommended: isRecommended }; + return { name: name, kind: kind_1, kindModifiers: kindModifiers, sortText: sortText, insertText: insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source: source, isRecommended: isRecommended, isPackageJsonImport: isPackageJsonImport }; } }).sort(function (a, b) { return ts.compareStringsCaseSensitiveUI(a.name, b.name); }); if (kind === "completions" /* Completions */) { @@ -152782,7 +153544,7 @@ var ts; }; Session.prototype.onMessage = function (message) { this.gcTimer.scheduleCollect(); - this.updateGraphDurationMs = undefined; + this.performanceData = undefined; var start; if (this.logger.hasLevel(server.LogLevel.requestTime)) { start = this.hrtime(); diff --git a/lib/tsserverlibrary.d.ts b/lib/tsserverlibrary.d.ts index cf6a6f941eb..4e3003e58c1 100644 --- a/lib/tsserverlibrary.d.ts +++ b/lib/tsserverlibrary.d.ts @@ -2538,9 +2538,19 @@ declare namespace ts { } export interface GenericType extends InterfaceType, TypeReference { } + export enum ElementFlags { + Required = 1, + Optional = 2, + Rest = 4, + Variadic = 8, + Variable = 12 + } export interface TupleType extends GenericType { + elementFlags: readonly ElementFlags[]; minLength: number; + fixedLength: number; hasRestElement: boolean; + combinedFlags: ElementFlags; readonly: boolean; labeledElementDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[]; } @@ -3789,6 +3799,8 @@ declare namespace ts { readonly importModuleSpecifierEnding?: "auto" | "minimal" | "index" | "js"; readonly allowTextChangesInNewFiles?: boolean; readonly providePrefixAndSuffixTextForRename?: boolean; + readonly includePackageJsonAutoImports?: "exclude-dev" | "all" | "none"; + readonly provideRefactorNotApplicableReason?: boolean; } /** Represents a bigint literal value without requiring bigint support */ export interface PseudoBigInt { @@ -5278,6 +5290,10 @@ declare namespace ts { fileName: Path; packageName: string; } + interface PerformanceEvent { + kind: "UpdateGraph" | "CreatePackageJsonAutoImportProvider"; + durationMs: number; + } interface LanguageServiceHost extends GetEffectiveTypeRootsHost { getCompilationSettings(): CompilerOptions; getNewLine?(): string; @@ -5660,6 +5676,11 @@ declare namespace ts { * so this description should make sense by itself if the parent is inlineable=true */ description: string; + /** + * A message to show to the user if the refactoring cannot be applied in + * the current context. + */ + notApplicableReason?: string; } /** * A set of edits to make in response to a refactor action, plus an optional @@ -5937,6 +5958,7 @@ declare namespace ts { source?: string; isRecommended?: true; isFromUncheckedFile?: true; + isPackageJsonImport?: true; } interface CompletionEntryDetails { name: string; @@ -6533,6 +6555,10 @@ declare namespace ts.server.protocol { * Time spent updating the program graph, in milliseconds. */ updateGraphDurationMs?: number; + /** + * The time spent creating or updating the auto-import program, in milliseconds. + */ + createAutoImportProviderProgramDurationMs?: number; } /** * Arguments for FileRequest messages. @@ -7974,6 +8000,11 @@ declare namespace ts.server.protocol { * and therefore may not be accurate. */ isFromUncheckedFile?: true; + /** + * If true, this completion was for an auto-import of a module not yet in the program, but listed + * in the project package.json. + */ + isPackageJsonImport?: true; } /** * Additional completion entry details, available on demand @@ -8822,6 +8853,7 @@ declare namespace ts.server.protocol { readonly lazyConfiguredProjectsFromExternalProject?: boolean; readonly providePrefixAndSuffixTextForRename?: boolean; readonly allowRenameOfImportPath?: boolean; + readonly includePackageJsonAutoImports?: "exclude-dev" | "all" | "none"; } interface CompilerOptions { allowJs?: boolean; @@ -9004,7 +9036,8 @@ declare namespace ts.server { enum ProjectKind { Inferred = 0, Configured = 1, - External = 2 + External = 2, + AutoImportProvider = 3 } function allRootFilesAreJsOrDts(project: Project): boolean; function allFilesAreJsOrDts(project: Project): boolean; @@ -9165,7 +9198,6 @@ declare namespace ts.server { private enableProxy; /** Starts a new check for diagnostics. Call this if some file has updated that would cause diagnostics to be changed. */ refreshDiagnostics(): void; - private watchPackageJsonFile; } /** * If a file is opened and no tsconfig (or jsconfig) is found, @@ -9184,6 +9216,18 @@ declare namespace ts.server { close(): void; getTypeAcquisition(): TypeAcquisition; } + class AutoImportProviderProject extends Project { + private hostProject; + private static readonly newName; + private rootFileNames; + isOrphan(): boolean; + updateGraph(): boolean; + markAsDirty(): void; + getScriptFileNames(): string[]; + getLanguageService(): never; + markAutoImportProviderAsDirty(): never; + getTypeAcquisition(): TypeAcquisition; + } /** * If a file is opened, the server will look for a tsconfig (or jsconfig) * and if successful create a ConfiguredProject for it. @@ -9694,7 +9738,7 @@ declare namespace ts.server { private readonly gcTimer; protected projectService: ProjectService; private changeSeq; - private updateGraphDurationMs; + private performanceData; private currentRequestId; private errorCheck; protected host: ServerHost; @@ -9709,6 +9753,7 @@ declare namespace ts.server { private readonly noGetErrOnBackgroundUpdate?; constructor(opts: SessionOptions); private sendRequestCompletedEvent; + private addPerformanceData; private performanceEventHandler; private defaultEventHandler; private projectsUpdatedInBackgroundEvent; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index 8370d328434..ca693e9bad0 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -244,7 +244,7 @@ var ts; // If changing the text in this section, be sure to test `configurePrerelease` too. ts.versionMajorMinor = "4.0"; /** The version of the TypeScript compiler release */ - ts.version = ts.versionMajorMinor + ".0-dev"; + ts.version = ts.versionMajorMinor + ".0-beta"; /** * Returns the native Map implementation if it is available and compatible (i.e. supports iteration). */ @@ -1352,6 +1352,14 @@ var ts; return values; } ts.getOwnValues = getOwnValues; + function arrayOf(count, f) { + var result = new Array(count); + for (var i = 0; i < count; i++) { + result[i] = f(i); + } + return result; + } + ts.arrayOf = arrayOf; function arrayFrom(iterator, map) { var result = []; for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) { @@ -4288,6 +4296,14 @@ var ts; VarianceFlags[VarianceFlags["Unreliable"] = 16] = "Unreliable"; VarianceFlags[VarianceFlags["AllowsStructuralFallback"] = 24] = "AllowsStructuralFallback"; })(VarianceFlags = ts.VarianceFlags || (ts.VarianceFlags = {})); + var ElementFlags; + (function (ElementFlags) { + ElementFlags[ElementFlags["Required"] = 1] = "Required"; + ElementFlags[ElementFlags["Optional"] = 2] = "Optional"; + ElementFlags[ElementFlags["Rest"] = 4] = "Rest"; + ElementFlags[ElementFlags["Variadic"] = 8] = "Variadic"; + ElementFlags[ElementFlags["Variable"] = 12] = "Variable"; + })(ElementFlags = ts.ElementFlags || (ts.ElementFlags = {})); /* @internal */ var JsxReferenceKind; (function (JsxReferenceKind) { @@ -7580,6 +7596,11 @@ var ts; Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), + Source_has_0_element_s_but_target_requires_1: diag(2618, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), + Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), + Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), + Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), + Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other: diag(2622, ts.DiagnosticCategory.Error, "Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other_2622", "Element at index {0} is variadic in one type but not in the other."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), @@ -8410,6 +8431,17 @@ var ts; Convert_to_named_function: diag(95124, ts.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: diag(95125, ts.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: diag(95126, ts.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"), + Could_not_find_a_containing_arrow_function: diag(95127, ts.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), + Containing_function_is_not_an_arrow_function: diag(95128, ts.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), + Could_not_find_export_statement: diag(95129, ts.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"), + This_file_already_has_a_default_export: diag(95130, ts.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"), + Could_not_find_import_clause: diag(95131, ts.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"), + Could_not_find_namespace_import_or_named_imports: diag(95132, ts.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), + Selection_is_not_a_valid_type_node: diag(95133, ts.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), + No_type_could_be_extracted_from_this_type_node: diag(95134, ts.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), + Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), + Name_is_not_valid: diag(95136, ts.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"), + Can_only_convert_property_with_modifier: diag(95137, ts.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: diag(18006, ts.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), @@ -29915,7 +29947,7 @@ var ts; type = finishNode(factory.createJSDocNonNullableType(type), pos); break; case 57 /* QuestionToken */: - // If not in JSDoc and next token is start of a type we have a conditional type + // If next token is start of a type we have a conditional type if (lookAhead(nextTokenIsStartOfType)) { return type; } @@ -36720,7 +36752,7 @@ var ts; includeSpecs = ["**/*"]; } var result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile); - if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) { + if (shouldReportNoInputFiles(result, canJsonReportNoInputFiles(raw), resolutionStack)) { errors.push(getErrorForNoInputFiles(result.spec, configFileName)); } if (ts.hasProperty(raw, "references") && !isNullOrUndefined(raw.references)) { @@ -36763,10 +36795,10 @@ var ts; return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0); } /*@internal*/ - function canJsonReportNoInutFiles(raw) { + function canJsonReportNoInputFiles(raw) { return !ts.hasProperty(raw, "files") && !ts.hasProperty(raw, "references"); } - ts.canJsonReportNoInutFiles = canJsonReportNoInutFiles; + ts.canJsonReportNoInputFiles = canJsonReportNoInputFiles; /*@internal*/ function updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) { var existingErrors = configParseDiagnostics.length; @@ -42572,6 +42604,7 @@ var ts; getAllPossiblePropertiesOfTypes: getAllPossiblePropertiesOfTypes, getSuggestedSymbolForNonexistentProperty: getSuggestedSymbolForNonexistentProperty, getSuggestionForNonexistentProperty: getSuggestionForNonexistentProperty, + getSuggestedSymbolForNonexistentJSXAttribute: getSuggestedSymbolForNonexistentJSXAttribute, getSuggestedSymbolForNonexistentSymbol: function (location, name, meaning) { return getSuggestedSymbolForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestionForNonexistentSymbol: function (location, name, meaning) { return getSuggestionForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestedSymbolForNonexistentModule: getSuggestedSymbolForNonexistentModule, @@ -46253,21 +46286,21 @@ var ts; if (typeArguments.length > 0) { var arity = getTypeReferenceArity(type); var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context); - var hasRestElement = type.target.hasRestElement; if (tupleConstituentNodes) { if (type.target.labeledElementDeclarations) { for (var i = 0; i < tupleConstituentNodes.length; i++) { - var isOptionalOrRest = i >= type.target.minLength; - var isRest = isOptionalOrRest && hasRestElement && i === arity - 1; - var isOptional = isOptionalOrRest && !isRest; - tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(isRest ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), isOptional ? ts.factory.createToken(57 /* QuestionToken */) : undefined, isRest ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]); + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(flags & 12 /* Variable */ ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), flags & 2 /* Optional */ ? ts.factory.createToken(57 /* QuestionToken */) : undefined, flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]); } } else { - for (var i = type.target.minLength; i < Math.min(arity, tupleConstituentNodes.length); i++) { - tupleConstituentNodes[i] = hasRestElement && i === arity - 1 ? - ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(tupleConstituentNodes[i])) : - ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]); + for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) { + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = + flags & 12 /* Variable */ ? ts.factory.createRestTypeNode(flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : + flags & 2 /* Optional */ ? ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]; } } var tupleTypeNode = ts.setEmitFlags(ts.factory.createTupleTypeNode(tupleConstituentNodes), 1 /* SingleLine */); @@ -49378,13 +49411,14 @@ var ts; function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) { var elements = pattern.elements; var lastElement = ts.lastOrUndefined(elements); - var hasRestElement = !!(lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken); - if (elements.length === 0 || elements.length === 1 && hasRestElement) { + var restElement = lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken ? lastElement : undefined; + if (elements.length === 0 || elements.length === 1 && restElement) { return languageVersion >= 2 /* ES2015 */ ? createIterableType(anyType) : anyArrayType; } var elementTypes = ts.map(elements, function (e) { return ts.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors); }); - var minLength = ts.findLastIndex(elements, function (e) { return !ts.isOmittedExpression(e) && !hasDefaultValue(e); }, elements.length - (hasRestElement ? 2 : 1)) + 1; - var result = createTupleType(elementTypes, minLength, hasRestElement); + var minLength = ts.findLastIndex(elements, function (e) { return !(e === restElement || ts.isOmittedExpression(e) || hasDefaultValue(e)); }, elements.length - 1) + 1; + var elementFlags = ts.map(elements, function (e, i) { return e === restElement ? 4 /* Rest */ : i >= minLength ? 2 /* Optional */ : 1 /* Required */; }); + var result = createTupleType(elementTypes, elementFlags); if (includePatternInType) { result = cloneTypeReference(result); result.pattern = pattern; @@ -50030,7 +50064,7 @@ var ts; function getBaseTypes(type) { if (!type.resolvedBaseTypes) { if (type.objectFlags & 8 /* Tuple */) { - type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters || ts.emptyArray), type.readonly)]; + type.resolvedBaseTypes = [getTupleBaseType(type)]; } else if (type.symbol.flags & (32 /* Class */ | 64 /* Interface */)) { if (type.symbol.flags & 32 /* Class */) { @@ -50046,6 +50080,10 @@ var ts; } return type.resolvedBaseTypes; } + function getTupleBaseType(type) { + var elementTypes = ts.sameMap(type.typeParameters, function (t, i) { return type.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t; }); + return createArrayType(getUnionType(elementTypes || ts.emptyArray), type.readonly); + } function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = ts.resolvingEmptyArray; var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); @@ -50846,17 +50884,16 @@ var ts; return [sig.parameters]; function expandSignatureParametersWithTupleMembers(restType, restIndex) { var elementTypes = getTypeArguments(restType); - var minLength = restType.target.minLength; - var tupleRestIndex = restType.target.hasRestElement ? elementTypes.length - 1 : -1; var associatedNames = restType.target.labeledElementDeclarations; var restParams = ts.map(elementTypes, function (t, i) { // Lookup the label from the individual tuple passed in before falling back to the signature `rest` parameter name var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]); var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i); - var checkFlags = i === tupleRestIndex ? 32768 /* RestParameter */ : - i >= minLength ? 16384 /* OptionalParameter */ : 0; + var flags = restType.target.elementFlags[i]; + var checkFlags = flags & 12 /* Variable */ ? 32768 /* RestParameter */ : + flags & 2 /* Optional */ ? 16384 /* OptionalParameter */ : 0; var symbol = createSymbol(1 /* FunctionScopedVariable */, name, checkFlags); - symbol.type = i === tupleRestIndex ? createArrayType(t) : t; + symbol.type = flags & 4 /* Rest */ ? createArrayType(t) : t; return symbol; }); return ts.concatenate(sig.parameters.slice(0, restIndex), restParams); @@ -51545,6 +51582,9 @@ var ts; return indexedAccess; } } + if (isGenericTupleType(type.objectType)) { + return getIndexTypeOfType(type.objectType, 1 /* Number */); + } var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType); if (objectConstraint && objectConstraint !== type.objectType) { return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType); @@ -51724,6 +51764,9 @@ var ts; return keyofConstraintType; } if (t.flags & 8388608 /* IndexedAccess */) { + if (isGenericTupleType(t.objectType)) { + return getIndexTypeOfType(t.objectType, 1 /* Number */); + } var baseObjectType = getBaseConstraint(t.objectType); var baseIndexType = getBaseConstraint(t.indexType); var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType); @@ -52642,9 +52685,11 @@ var ts; } } } - // When an 'infer T' declaration is immediately contained in a rest parameter - // declaration, we infer an 'unknown[]' constraint. - else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken) { + // When an 'infer T' declaration is immediately contained in a rest parameter declaration, a rest type + // or a named rest tuple element, we infer an 'unknown[]' constraint. + else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken || + grandParent.kind === 180 /* RestType */ || + grandParent.kind === 191 /* NamedTupleMember */ && grandParent.dotDotDotToken) { inferences = ts.append(inferences, createArrayType(unknownType)); } } @@ -52766,9 +52811,7 @@ var ts; } else { type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function () { return errorType; })) || ts.emptyArray; - error(type.node || currentNode, type.target.symbol - ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves - : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); + error(type.node || currentNode, type.target.symbol ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); } } return type.resolvedTypeArguments; @@ -53199,22 +53242,32 @@ var ts; function createArrayType(elementType, readonly) { return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]); } - function isTupleRestElement(node) { - return node.kind === 180 /* RestType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.dotDotDotToken); + function getTupleElementFlags(node) { + switch (node.kind) { + case 179 /* OptionalType */: + return 2 /* Optional */; + case 180 /* RestType */: + return getRestTypeElementFlags(node); + case 191 /* NamedTupleMember */: + return node.questionToken ? 2 /* Optional */ : + node.dotDotDotToken ? getRestTypeElementFlags(node) : + 1 /* Required */; + default: + return 1 /* Required */; + } } - function isTupleOptionalElement(node) { - return node.kind === 179 /* OptionalType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.questionToken); + function getRestTypeElementFlags(node) { + return getArrayElementTypeNode(node.type) ? 4 /* Rest */ : 8 /* Variadic */; } function getArrayOrTupleTargetType(node) { var readonly = isReadonlyTypeOperator(node.parent); - if (node.kind === 177 /* ArrayType */ || node.elements.length === 1 && isTupleRestElement(node.elements[0])) { + var elementType = getArrayElementTypeNode(node); + if (elementType) { return readonly ? globalReadonlyArrayType : globalArrayType; } - var lastElement = ts.lastOrUndefined(node.elements); - var restElement = lastElement && isTupleRestElement(lastElement) ? lastElement : undefined; - var minLength = ts.findLastIndex(node.elements, function (n) { return !isTupleOptionalElement(n) && n !== restElement; }) + 1; + var elementFlags = ts.map(node.elements, getTupleElementFlags); var missingName = ts.some(node.elements, function (e) { return e.kind !== 191 /* NamedTupleMember */; }); - return getTupleTypeOfArity(node.elements.length, minLength, !!restElement, readonly, /*associatedNames*/ missingName ? undefined : node.elements); + return getTupleTargetType(elementFlags, readonly, /*associatedNames*/ missingName ? undefined : node.elements); } // Return true if the given type reference node is directly aliased or if it needs to be deferred // because it is possibly contained in a circular chain of eagerly resolved types. @@ -53283,13 +53336,13 @@ var ts; if (target === emptyGenericType) { links.resolvedType = emptyObjectType; } - else if (isDeferredTypeReferenceNode(node)) { + else if (!(node.kind === 178 /* TupleType */ && ts.some(node.elements, function (e) { return !!(getTupleElementFlags(e) & 8 /* Variadic */); })) && isDeferredTypeReferenceNode(node)) { links.resolvedType = node.kind === 178 /* TupleType */ && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, /*mapper*/ undefined); } else { var elementTypes = node.kind === 177 /* ArrayType */ ? [getTypeFromTypeNode(node.elementType)] : ts.map(node.elements, getTypeFromTypeNode); - links.resolvedType = createTypeReference(target, elementTypes); + links.resolvedType = createNormalizedTypeReference(target, elementTypes); } } return links.resolvedType; @@ -53297,6 +53350,27 @@ var ts; function isReadonlyTypeOperator(node) { return ts.isTypeOperatorNode(node) && node.operator === 141 /* ReadonlyKeyword */; } + function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) { + if (readonly === void 0) { readonly = false; } + var tupleTarget = getTupleTargetType(elementFlags || ts.map(elementTypes, function (_) { return 1 /* Required */; }), readonly, namedMemberDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : + tupleTarget; + } + function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + if (elementFlags.length === 1 && elementFlags[0] & 4 /* Rest */) { + // [...X[]] is equivalent to just X[] + return readonly ? globalReadonlyArrayType : globalArrayType; + } + var key = ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? "#" : f & 2 /* Optional */ ? "?" : f & 4 /* Rest */ ? "." : "*"; }).join() + + (readonly ? "R" : "") + + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); + var type = tupleTypes.get(key); + if (!type) { + tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations)); + } + return type; + } // We represent tuple types as type references to synthesized generic interface types created by // this function. The types are of the form: // @@ -53304,27 +53378,37 @@ var ts; // // Note that the generic type created by this function has no symbol associated with it. The same // is true for each of the synthesized type parameters. - function createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { + function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + var arity = elementFlags.length; + var minLength = ts.findLastIndex(elementFlags, function (f) { return !!(f & (1 /* Required */ | 8 /* Variadic */)); }) + 1; var typeParameters; var properties = []; - var maxLength = hasRestElement ? arity - 1 : arity; + var combinedFlags = 0; if (arity) { typeParameters = new Array(arity); for (var i = 0; i < arity; i++) { var typeParameter = typeParameters[i] = createTypeParameter(); - if (i < maxLength) { - var property = createSymbol(4 /* Property */ | (i >= minLength ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); + var flags = elementFlags[i]; + combinedFlags |= flags; + if (!(combinedFlags & 12 /* Variable */)) { + var property = createSymbol(4 /* Property */ | (flags & 2 /* Optional */ ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i]; property.type = typeParameter; properties.push(property); } } } - var literalTypes = []; - for (var i = minLength; i <= maxLength; i++) - literalTypes.push(getLiteralType(i)); + var fixedLength = properties.length; var lengthSymbol = createSymbol(4 /* Property */, "length"); - lengthSymbol.type = hasRestElement ? numberType : getUnionType(literalTypes); + if (combinedFlags & 12 /* Variable */) { + lengthSymbol.type = numberType; + } + else { + var literalTypes_1 = []; + for (var i = minLength; i <= arity; i++) + literalTypes_1.push(getLiteralType(i)); + lengthSymbol.type = getUnionType(literalTypes_1); + } properties.push(lengthSymbol); var type = createObjectType(8 /* Tuple */ | 4 /* Reference */); type.typeParameters = typeParameters; @@ -53342,38 +53426,110 @@ var ts; type.declaredConstructSignatures = ts.emptyArray; type.declaredStringIndexInfo = undefined; type.declaredNumberIndexInfo = undefined; + type.elementFlags = elementFlags; type.minLength = minLength; - type.hasRestElement = hasRestElement; + type.fixedLength = fixedLength; + type.hasRestElement = !!(combinedFlags & 12 /* Variable */); + type.combinedFlags = combinedFlags; type.readonly = readonly; type.labeledElementDeclarations = namedMemberDeclarations; return type; } - function getTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { - var key = arity + (hasRestElement ? "+" : ",") + minLength + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); - var type = tupleTypes.get(key); - if (!type) { - tupleTypes.set(key, type = createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations)); - } - return type; + function createNormalizedTypeReference(target, typeArguments) { + return target.objectFlags & 8 /* Tuple */ && target.combinedFlags & 8 /* Variadic */ ? + createNormalizedTupleType(target, typeArguments) : + createTypeReference(target, typeArguments); } - function createTupleType(elementTypes, minLength, hasRestElement, readonly, namedMemberDeclarations) { - if (minLength === void 0) { minLength = elementTypes.length; } - if (hasRestElement === void 0) { hasRestElement = false; } - if (readonly === void 0) { readonly = false; } - var arity = elementTypes.length; - if (arity === 1 && hasRestElement) { - return createArrayType(elementTypes[0], readonly); + function createNormalizedTupleType(target, elementTypes) { + var _a, _b, _c; + // Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z] + var unionIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (131072 /* Never */ | 1048576 /* Union */)); }); + if (unionIndex >= 0) { + return mapType(elementTypes[unionIndex], function (t) { return createNormalizedTupleType(target, ts.replaceElement(elementTypes, unionIndex, t)); }); + } + // If there are no variadic elements with non-generic types, just create a type reference with the same target type. + var spreadIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */) && !(t.flags & 58982400 /* InstantiableNonPrimitive */) && !isGenericMappedType(t); }); + if (spreadIndex < 0) { + return createTypeReference(target, elementTypes); + } + // We have non-generic variadic elements that need normalization. + var expandedTypes = []; + var expandedFlags = []; + var expandedDeclarations = []; + var optionalIndex = -1; + var restTypes; + var _loop_12 = function (i) { + var type = elementTypes[i]; + var flags = target.elementFlags[i]; + if (flags & 8 /* Variadic */) { + if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + // Generic variadic elements stay as they are (except following a rest element). + addElementOrRest(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + } + else if (isTupleType(type)) { + // Spread variadic elements with tuple types into the resulting tuple. + ts.forEach(getTypeArguments(type), function (t, n) { var _a; return addElementOrRest(t, type.target.elementFlags[n], (_a = type.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[n]); }); + } + else { + // Treat everything else as an array type and create a rest element. + addElementOrRest(isArrayLikeType(type) && getIndexTypeOfType(type, 1 /* Number */) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i]); + } + } + else { + // Copy other element kinds with no change. + addElementOrRest(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i]); + } + }; + for (var i = 0; i < elementTypes.length; i++) { + _loop_12(i); + } + if (restTypes) { + // Create a union of the collected rest element types. + expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); + } + var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : + tupleTarget; + function addElementOrRest(type, flags, declaration) { + if (restTypes) { + // A rest element was previously added, so simply collect the type of this element. + restTypes.push(flags & 8 /* Variadic */ ? getIndexedAccessType(type, numberType) : type); + } + else { + if (flags & 1 /* Required */ && optionalIndex >= 0) { + // Turn preceding optional elements into required elements + for (var i = optionalIndex; i < expandedFlags.length; i++) { + if (expandedFlags[i] & 2 /* Optional */) + expandedFlags[i] = 1 /* Required */; + } + optionalIndex = -1; + } + else if (flags & 2 /* Optional */ && optionalIndex < 0) { + optionalIndex = expandedFlags.length; + } + else if (flags & 4 /* Rest */) { + // Start collecting element types when a rest element is added. + restTypes = [type]; + } + expandedTypes.push(type); + expandedFlags.push(flags); + if (expandedDeclarations && declaration) { + expandedDeclarations.push(declaration); + } + else { + expandedDeclarations = undefined; + } + } } - var tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, namedMemberDeclarations); - return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType; } - function sliceTupleType(type, index) { - var tuple = type.target; - if (tuple.hasRestElement) { - // don't slice off rest element - index = Math.min(index, getTypeReferenceArity(type) - 1); - } - return createTupleType(getTypeArguments(type).slice(index), Math.max(0, tuple.minLength - index), tuple.hasRestElement, tuple.readonly, tuple.labeledElementDeclarations && tuple.labeledElementDeclarations.slice(index)); + function sliceTupleType(type, index, endSkipCount) { + if (endSkipCount === void 0) { endSkipCount = 0; } + var target = type.target; + var endIndex = getTypeReferenceArity(type) - endSkipCount; + return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts.emptyArray) : + createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), + /*readonly*/ false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex)); } function getTypeFromOptionalTypeNode(node) { var type = getTypeFromTypeNode(node.type); @@ -53887,7 +54043,7 @@ var ts; type = getReducedType(type); return type.flags & 1048576 /* Union */ ? getIntersectionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : type.flags & 2097152 /* Intersection */ ? getUnionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : - maybeTypeOfKind(type, 58982400 /* InstantiableNonPrimitive */) ? getIndexTypeForGenericType(type, stringsOnly) : + type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericTupleType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts.getObjectFlags(type) & 32 /* Mapped */ ? filterType(getConstraintTypeFromMappedType(type), function (t) { return !(noIndexSignatures && t.flags & (1 /* Any */ | 4 /* String */)); }) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : @@ -54134,7 +54290,7 @@ var ts; } return !!(type.objectFlags & 8388608 /* IsGenericObjectType */); } - return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type); + return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type) || isGenericTupleType(type); } function isGenericIndexType(type) { if (type.flags & 3145728 /* UnionOrIntersection */) { @@ -54208,6 +54364,15 @@ var ts; } // So ultimately (reading): // ((A & B) | C)[K1 | K2] -> ((A & B) | C)[K1] | ((A & B) | C)[K2] -> (A & B)[K1] | C[K1] | (A & B)[K2] | C[K2] -> (A[K1] & B[K1]) | C[K1] | (A[K2] & B[K2]) | C[K2] + // A generic tuple type indexed by a number exists only when the index type doesn't select a + // fixed element. We simplify to either the combined type of all elements (when the index type + // the actual number type) or to the combined type of all non-fixed elements. + if (isGenericTupleType(objectType) && indexType.flags & 296 /* NumberLike */) { + var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 /* Number */ ? 0 : objectType.target.fixedLength, /*endSkipCount*/ 0, writing); + if (elementType) { + return type[cache] = elementType; + } + } // If the object type is a mapped type { [P in K]: E }, where K is generic, instantiate E using a mapper // that substitutes the index type for P. For example, for an index access { [P in K]: Box }[X], we // construct the type Box. @@ -54254,6 +54419,18 @@ var ts; function getIndexedAccessType(objectType, indexType, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, 0 /* None */, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } + function indexTypeLessThan(indexType, limit) { + return everyType(indexType, function (t) { + if (t.flags & 384 /* StringOrNumberLiteral */) { + var propName = getPropertyNameFromType(t); + if (isNumericLiteralName(propName)) { + var index = +propName; + return index >= 0 && index < limit; + } + } + return false; + }); + } function getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, accessFlags, aliasSymbol, aliasTypeArguments) { if (accessFlags === void 0) { accessFlags = 0 /* None */; } if (objectType === wildcardType || indexType === wildcardType) { @@ -54264,12 +54441,15 @@ var ts; if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { indexType = stringType; } - // If the index type is generic, or if the object type is generic and doesn't originate in an expression, - // we are performing a higher-order index access where we cannot meaningfully access the properties of the - // object type. Note that for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in - // an expression. This is to preserve backwards compatibility. For example, an element access 'this["foo"]' - // has always been resolved eagerly using the constraint type of 'this' at the given location. - if (isGenericIndexType(indexType) || !(accessNode && accessNode.kind !== 188 /* IndexedAccessType */) && isGenericObjectType(objectType)) { + // If the index type is generic, or if the object type is generic and doesn't originate in an expression and + // the operation isn't exclusively indexing the fixed (non-variadic) portion of a tuple type, we are performing + // a higher-order index access where we cannot meaningfully access the properties of the object type. Note that + // for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in an expression. This is to + // preserve backwards compatibility. For example, an element access 'this["foo"]' has always been resolved + // eagerly using the constraint type of 'this' at the given location. + if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 188 /* IndexedAccessType */ ? + isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : + isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) { if (objectType.flags & 3 /* AnyOrUnknown */) { return objectType; } @@ -54351,7 +54531,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_12 = function () { + var _loop_13 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54425,7 +54605,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_12(); + var state_4 = _loop_13(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -54863,19 +55043,32 @@ var ts; } return links.resolvedType; } + function getTypeFromRestTypeNode(node) { + return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type); + } + function getArrayElementTypeNode(node) { + switch (node.kind) { + case 185 /* ParenthesizedType */: + return getArrayElementTypeNode(node.type); + case 178 /* TupleType */: + if (node.elements.length === 1) { + node = node.elements[0]; + if (node.kind === 180 /* RestType */ || node.kind === 191 /* NamedTupleMember */ && node.dotDotDotToken) { + return getArrayElementTypeNode(node.type); + } + } + break; + case 177 /* ArrayType */: + return node.elementType; + } + return undefined; + } function getTypeFromNamedTupleTypeNode(node) { var links = getNodeLinks(node); - if (!links.resolvedType) { - var type = getTypeFromTypeNode(node.type); - if (node.dotDotDotToken) { - type = getElementTypeOfArrayType(type) || errorType; - } - if (node.questionToken && strictNullChecks) { - type = getOptionalType(type); - } - links.resolvedType = type; - } - return links.resolvedType; + return links.resolvedType || (links.resolvedType = + node.dotDotDotToken ? getTypeFromRestTypeNode(node) : + node.questionToken && strictNullChecks ? getOptionalType(getTypeFromTypeNode(node.type)) : + getTypeFromTypeNode(node.type)); } function getTypeFromTypeNode(node) { return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node); @@ -54943,7 +55136,7 @@ var ts; case 298 /* JSDocTypeExpression */: return getTypeFromTypeNode(node.type); case 180 /* RestType */: - return getElementTypeOfArrayType(getTypeFromTypeNode(node.type)) || errorType; + return getTypeFromRestTypeNode(node); case 305 /* JSDocVariadicType */: return getTypeFromJSDocVariadicType(node); case 173 /* FunctionType */: @@ -55235,6 +55428,9 @@ var ts; if (typeVariable !== mappedTypeVariable) { return mapType(getReducedType(mappedTypeVariable), function (t) { if (t.flags & (3 /* AnyOrUnknown */ | 58982400 /* InstantiableNonPrimitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && t !== wildcardType && t !== errorType) { + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } var replacementMapper = prependTypeMapping(typeVariable, t, mapper); return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) : isTupleType(t) ? instantiateMappedTupleType(t, type, replacementMapper) : @@ -55249,23 +55445,39 @@ var ts; function getModifiedReadonlyState(state, modifiers) { return modifiers & 1 /* IncludeReadonly */ ? true : modifiers & 2 /* ExcludeReadonly */ ? false : state; } + function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) { + // When a tuple type is generic (i.e. when it contains variadic elements), we want to eagerly map the + // non-generic elements and defer mapping the generic elements. In order to facilitate this, we transform + // M<[A, B?, ...T, ...C[]] into [...M<[A]>, ...M<[B?]>, ...M, ...M] and then rely on tuple type + // normalization to resolve the non-generic parts of the resulting tuple. + var elementFlags = tupleType.target.elementFlags; + var elementTypes = ts.map(getTypeArguments(tupleType), function (t, i) { + var singleton = elementFlags[i] & 8 /* Variadic */ ? t : + elementFlags[i] & 4 /* Rest */ ? createArrayType(t) : + createTupleType([t], [elementFlags[i]]); + // The singleton is never a generic tuple type, so it is safe to recurse here. + return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); + }); + var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); + return createTupleType(elementTypes, ts.map(elementTypes, function (_) { return 8 /* Variadic */; }), newReadonly); + } function instantiateMappedArrayType(arrayType, mappedType, mapper) { var elementType = instantiateMappedTypeTemplate(mappedType, numberType, /*isOptional*/ true, mapper); return elementType === errorType ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); } function instantiateMappedTupleType(tupleType, mappedType, mapper) { - var minLength = tupleType.target.minLength; + var elementFlags = tupleType.target.elementFlags; var elementTypes = ts.map(getTypeArguments(tupleType), function (_, i) { - return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), i >= minLength, mapper); + return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), !!(elementFlags[i] & 2 /* Optional */), mapper); }); var modifiers = getMappedTypeModifiers(mappedType); - var newMinLength = modifiers & 4 /* IncludeOptional */ ? 0 : - modifiers & 8 /* ExcludeOptional */ ? getTypeReferenceArity(tupleType) - (tupleType.target.hasRestElement ? 1 : 0) : - minLength; + var newTupleModifiers = modifiers & 4 /* IncludeOptional */ ? ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? 2 /* Optional */ : f; }) : + modifiers & 8 /* ExcludeOptional */ ? ts.map(elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + elementFlags; var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); return ts.contains(elementTypes, errorType) ? errorType : - createTupleType(elementTypes, newMinLength, tupleType.target.hasRestElement, newReadonly, tupleType.target.labeledElementDeclarations); + createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); } function instantiateMappedTypeTemplate(type, key, isOptional, mapper) { var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); @@ -55362,7 +55574,7 @@ var ts; if (objectFlags & 4 /* Reference */ && !(type.node)) { var resolvedTypeArguments = type.resolvedTypeArguments; var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper); - return newTypeArguments !== resolvedTypeArguments ? createTypeReference(type.target, newTypeArguments) : type; + return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type; } return getObjectTypeInstantiation(type, mapper); } @@ -56871,7 +57083,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_13 = function (prop) { + var _loop_14 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56886,13 +57098,20 @@ var ts; if (ts.isJsxAttributes(errorNode) || ts.isJsxOpeningLikeElement(errorNode) || ts.isJsxOpeningLikeElement(errorNode.parent)) { // JsxAttributes has an object-literal flag and undergo same type-assignablity check as normal object-literal. // However, using an object-literal error message will be very confusing to the users so we give different a message. - // TODO: Spelling suggestions for excess jsx attributes (needs new diagnostic messages) if (prop.valueDeclaration && ts.isJsxAttribute(prop.valueDeclaration) && ts.getSourceFileOfNode(errorNode) === ts.getSourceFileOfNode(prop.valueDeclaration.name)) { // Note that extraneous children (as in `extra`) don't pass this check, // since `children` is a SyntaxKind.PropertySignature instead of a SyntaxKind.JsxAttribute. errorNode = prop.valueDeclaration.name; } - reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(errorTarget)); + var propName = symbolToString(prop); + var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget); + var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined; + if (suggestion) { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion); + } + else { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget)); + } } else { // use the property's value declaration if the property is assigned inside the literal itself @@ -56927,7 +57146,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_13(prop); + var state_5 = _loop_14(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57218,6 +57437,12 @@ var ts; return varianceResult; } } + // For a generic type T, [...T] is assignable to T, T is assignable to readonly [...T], and T is assignable + // to [...T] when T is constrained to a mutable array or tuple type. + if (isSingleElementGenericTupleType(source) && getTypeArguments(source)[0] === target && !source.target.readonly || + isSingleElementGenericTupleType(target) && getTypeArguments(target)[0] === source && (target.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source) || source))) { + return -1 /* True */; + } if (target.flags & 262144 /* TypeParameter */) { // A source type { [P in Q]: X } is related to a target type T if keyof T is related to Q and X is related to T[Q]. if (ts.getObjectFlags(source) & 32 /* Mapped */ && isRelatedTo(getIndexType(target), getConstraintTypeFromMappedType(source))) { @@ -57594,11 +57819,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_14 = function (combination) { + var _loop_15 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_15 = function (i) { + var _loop_16 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57614,7 +57839,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_15(i); + var state_7 = _loop_16(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57628,7 +57853,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_14(combination); + var state_6 = _loop_15(combination); if (typeof state_6 === "object") return state_6.value; } @@ -57817,6 +58042,80 @@ var ts; if (relation === identityRelation) { return propertiesIdenticalTo(source, target, excludedProperties); } + var result = -1 /* True */; + if (isTupleType(target)) { + if (isArrayType(source) || isTupleType(source)) { + if (!target.target.readonly && (isReadonlyArrayType(source) || isTupleType(source) && source.target.readonly)) { + return 0 /* False */; + } + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var sourceRestFlag = isTupleType(source) ? source.target.combinedFlags & 4 /* Rest */ : 4 /* Rest */; + var targetRestFlag = target.target.combinedFlags & 4 /* Rest */; + var sourceMinLength = isTupleType(source) ? source.target.minLength : 0; + var targetMinLength = target.target.minLength; + if (!sourceRestFlag && sourceArity < targetMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength); + } + return 0 /* False */; + } + if (!targetRestFlag && targetArity < sourceMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity); + } + return 0 /* False */; + } + if (!targetRestFlag && sourceRestFlag) { + if (reportErrors) { + if (sourceMinLength < targetMinLength) { + reportError(ts.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength); + } + else { + reportError(ts.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity); + } + } + return 0 /* False */; + } + var maxArity = Math.max(sourceArity, targetArity); + for (var i = 0; i < maxArity; i++) { + var targetFlags = i < targetArity ? target.target.elementFlags[i] : targetRestFlag; + var sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag; + if (sourceFlags && targetFlags) { + if (targetFlags & 8 /* Variadic */ && !(sourceFlags & 8 /* Variadic */) || + (sourceFlags & 8 /* Variadic */ && !(targetFlags & 12 /* Variable */))) { + if (reportErrors) { + reportError(ts.Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i); + } + return 0 /* False */; + } + if (targetFlags & 1 /* Required */) { + if (!(sourceFlags & 1 /* Required */)) { + if (reportErrors) { + reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, i, typeToString(source), typeToString(target)); + } + return 0 /* False */; + } + } + var sourceType = getTypeArguments(source)[Math.min(i, sourceArity - 1)]; + var targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)]; + var targetCheckType = sourceFlags & 8 /* Variadic */ && targetFlags & 4 /* Rest */ ? createArrayType(targetType) : targetType; + var related = isRelatedTo(sourceType, targetCheckType, reportErrors, /*headMessage*/ undefined, intersectionState); + if (!related) { + if (reportErrors) { + reportIncompatibleError(ts.Diagnostics.Types_of_property_0_are_incompatible, i); + } + return 0 /* False */; + } + result &= related; + } + } + return result; + } + if (target.target.combinedFlags & 12 /* Variable */) { + return 0 /* False */; + } + } var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source) && !isEmptyArrayLiteralType(source) && !isTupleType(source); var unmatchedProperty = getUnmatchedProperty(source, target, requireOptionalProperties, /*matchDiscriminantProperties*/ false); if (unmatchedProperty) { @@ -57839,35 +58138,6 @@ var ts; } } } - var result = -1 /* True */; - if (isTupleType(target)) { - var targetRestType = getRestTypeOfTupleType(target); - if (targetRestType) { - if (!isTupleType(source)) { - return 0 /* False */; - } - var sourceRestType = getRestTypeOfTupleType(source); - if (sourceRestType && !isRelatedTo(sourceRestType, targetRestType, reportErrors)) { - if (reportErrors) { - reportError(ts.Diagnostics.Rest_signatures_are_incompatible); - } - return 0 /* False */; - } - var targetCount = getTypeReferenceArity(target) - 1; - var sourceCount = getTypeReferenceArity(source) - (sourceRestType ? 1 : 0); - var sourceTypeArguments = getTypeArguments(source); - for (var i = targetCount; i < sourceCount; i++) { - var related = isRelatedTo(sourceTypeArguments[i], targetRestType, reportErrors); - if (!related) { - if (reportErrors) { - reportError(ts.Diagnostics.Property_0_is_incompatible_with_rest_element_type, "" + i); - } - return 0 /* False */; - } - result &= related; - } - } - } // We only call this for union target types when we're attempting to do excess property checking - in those cases, we want to get _all possible props_ // from the target union, across all members var properties = getPropertiesOfType(target); @@ -58225,7 +58495,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_16 = function (tp) { + var _loop_17 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58257,7 +58527,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_16(tp); + _loop_17(tp); } cache.variances = variances; } @@ -58680,15 +58950,40 @@ var ts; function isTupleType(type) { return !!(ts.getObjectFlags(type) & 4 /* Reference */ && type.target.objectFlags & 8 /* Tuple */); } + function isGenericTupleType(type) { + return isTupleType(type) && !!(type.target.combinedFlags & 8 /* Variadic */); + } + function isSingleElementGenericTupleType(type) { + return isGenericTupleType(type) && type.target.elementFlags.length === 1; + } function getRestTypeOfTupleType(type) { - return type.target.hasRestElement ? getTypeArguments(type)[type.target.typeParameters.length - 1] : undefined; + return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength); } function getRestArrayTypeOfTupleType(type) { var restType = getRestTypeOfTupleType(type); return restType && createArrayType(restType); } - function getLengthOfTupleType(type) { - return getTypeReferenceArity(type) - (type.target.hasRestElement ? 1 : 0); + function getEndLengthOfType(type) { + return isTupleType(type) ? getTypeReferenceArity(type) - ts.findLastIndex(type.target.elementFlags, function (f) { return !!(f & 12 /* Variable */); }) - 1 : 0; + } + function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) { + if (endSkipCount === void 0) { endSkipCount = 0; } + if (writing === void 0) { writing = false; } + var length = getTypeReferenceArity(type) - endSkipCount; + if (index < length) { + var typeArguments = getTypeArguments(type); + var elementTypes = []; + for (var i = index; i < length; i++) { + var t = typeArguments[i]; + elementTypes.push(type.target.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t); + } + return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes); + } + return undefined; + } + function isTupleTypeStructureMatching(t1, t2) { + return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && + ts.every(t1.target.elementFlags, function (f, i) { return (f & 12 /* Variable */) === (t2.target.elementFlags[i] & 12 /* Variable */); }); } function isZeroBigInt(_a) { var value = _a.value; @@ -59177,7 +59472,8 @@ var ts; inferredType: undefined, priority: undefined, topLevel: true, - isFixed: false + isFixed: false, + impliedArity: undefined }; } function cloneInferenceInfo(inference) { @@ -59188,7 +59484,8 @@ var ts; inferredType: inference.inferredType, priority: inference.priority, topLevel: inference.topLevel, - isFixed: inference.isFixed + isFixed: inference.isFixed, + impliedArity: inference.impliedArity }; } function cloneInferredPartOfContext(context) { @@ -59291,9 +59588,10 @@ var ts; } if (isTupleType(source)) { var elementTypes = ts.map(getTypeArguments(source), function (t) { return inferReverseMappedType(t, target, constraint); }); - var minLength = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? - getTypeReferenceArity(source) - (source.target.hasRestElement ? 1 : 0) : source.target.minLength; - return createTupleType(elementTypes, minLength, source.target.hasRestElement, source.target.readonly, source.target.labeledElementDeclarations); + var elementFlags = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? + ts.sameMap(source.target.elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + source.target.elementFlags; + return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations); } // For all other object types we infer a new object type where the reverse mapping has been // applied to the type of each property. @@ -59358,13 +59656,13 @@ var ts; return result.value; } function tupleTypesDefinitelyUnrelated(source, target) { - return target.target.minLength > source.target.minLength || - !getRestTypeOfTupleType(target) && (!!getRestTypeOfTupleType(source) || getLengthOfTupleType(target) < getLengthOfTupleType(source)); + return !(target.target.combinedFlags & 8 /* Variadic */) && target.target.minLength > source.target.minLength || + !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength); } function typesDefinitelyUnrelated(source, target) { // Two tuple types with incompatible arities are definitely unrelated. // Two object types that each have a property that is unmatched in the other are definitely unrelated. - return isTupleType(source) && isTupleType(target) && tupleTypesDefinitelyUnrelated(source, target) || + return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true) && !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true); } @@ -59854,22 +60152,61 @@ var ts; if (!typesDefinitelyUnrelated(source, target)) { if (isArrayType(source) || isTupleType(source)) { if (isTupleType(target)) { - var sourceLength = isTupleType(source) ? getLengthOfTupleType(source) : 0; - var targetLength = getLengthOfTupleType(target); - var sourceRestType = isTupleType(source) ? getRestTypeOfTupleType(source) : getElementTypeOfArrayType(source); - var targetRestType = getRestTypeOfTupleType(target); - var fixedLength = targetLength < sourceLength || sourceRestType ? targetLength : sourceLength; - for (var i = 0; i < fixedLength; i++) { - inferFromTypes(i < sourceLength ? getTypeArguments(source)[i] : sourceRestType, getTypeArguments(target)[i]); + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var elementTypes = getTypeArguments(target); + var elementFlags = target.target.elementFlags; + // When source and target are tuple types with the same structure (fixed, variadic, and rest are matched + // to the same kind in each position), simply infer between the element types. + if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { + for (var i = 0; i < targetArity; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + return; } - if (targetRestType) { - var types = fixedLength < sourceLength ? getTypeArguments(source).slice(fixedLength, sourceLength) : []; - if (sourceRestType) { - types.push(sourceRestType); + var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; + var sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & 4 /* Rest */ ? + getTypeArguments(source)[sourceArity - 1] : undefined; + var endLength = !(target.target.combinedFlags & 12 /* Variable */) ? 0 : + sourceRestType ? getEndLengthOfType(target) : + Math.min(getEndLengthOfType(source), getEndLengthOfType(target)); + var sourceEndLength = sourceRestType ? 0 : endLength; + // Infer between starting fixed elements. + for (var i = 0; i < startLength; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + if (sourceRestType && sourceArity - startLength === 1) { + // Single rest element remains in source, infer from that to every element in target + for (var i = startLength; i < targetArity - endLength; i++) { + inferFromTypes(elementFlags[i] & 8 /* Variadic */ ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]); } - if (types.length) { - inferFromTypes(getUnionType(types), targetRestType); + } + else { + var middleLength = targetArity - startLength - endLength; + if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 /* Variadic */ && isTupleType(source)) { + // Middle of target is [...T, ...U] and source is tuple type + var targetInfo = getInferenceInfoForType(elementTypes[startLength]); + if (targetInfo && targetInfo.impliedArity !== undefined) { + // Infer slices from source based on implied arity of T. + inferFromTypes(sliceTupleType(source, startLength, sourceEndLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]); + inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, sourceEndLength), elementTypes[startLength + 1]); + } } + else if (middleLength === 1 && elementFlags[startLength] & 8 /* Variadic */) { + // Middle of target is exactly one variadic element. Infer the slice between the fixed parts in the source. + inferFromTypes(isTupleType(source) ? sliceTupleType(source, startLength, sourceEndLength) : createArrayType(sourceRestType), elementTypes[startLength]); + } + else if (middleLength === 1 && elementFlags[startLength] & 4 /* Rest */) { + // Middle of target is exactly one rest element. If middle of source is not empty, infer union of middle element types. + var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, sourceEndLength) : sourceRestType; + if (restType) { + inferFromTypes(restType, elementTypes[startLength]); + } + } + } + // Infer between ending fixed elements + for (var i = 0; i < endLength; i++) { + inferFromTypes(sourceRestType || getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]); } return; } @@ -60814,7 +61151,7 @@ var ts; var signature = getEffectsSignature(flow.node); if (signature) { var predicate = getTypePredicateOfSignature(signature); - if (predicate && predicate.kind === 3 /* AssertsIdentifier */) { + if (predicate && predicate.kind === 3 /* AssertsIdentifier */ && !predicate.type) { var predicateArgument = flow.node.arguments[predicate.parameterIndex]; if (predicateArgument && isFalseExpression(predicateArgument)) { return false; @@ -62712,7 +63049,7 @@ var ts; var args = getEffectiveCallArguments(iife); var indexOfParameter = func.parameters.indexOf(parameter); if (parameter.dotDotDotToken) { - return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined); + return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined, 0 /* Normal */); } var links = getNodeLinks(iife); var cached = links.resolvedSignature; @@ -63478,6 +63815,9 @@ var ts; var arrayOrIterableType = checkExpression(node.expression, checkMode); return checkIteratedTypeOrElementType(33 /* Spread */, arrayOrIterableType, undefinedType, node.expression); } + function checkSyntheticExpression(node) { + return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type; + } function hasDefaultValue(node) { return (node.kind === 195 /* BindingElement */ && !!node.initializer) || (node.kind === 213 /* BinaryExpression */ && node.operatorToken.kind === 62 /* EqualsToken */); @@ -63486,26 +63826,22 @@ var ts; var elements = node.elements; var elementCount = elements.length; var elementTypes = []; - var hasEndingSpreadElement = false; - var hasNonEndingSpreadElement = false; + var elementFlags = []; var contextualType = getApparentTypeOfContextualType(node); var inDestructuringPattern = ts.isAssignmentTarget(node); var inConstContext = isConstContext(node); for (var i = 0; i < elementCount; i++) { var e = elements[i]; - var spread = e.kind === 217 /* SpreadElement */ && e.expression; - var spreadType = spread && checkExpression(spread, checkMode, forceTuple); - if (spreadType && isTupleType(spreadType)) { - elementTypes.push.apply(elementTypes, getTypeArguments(spreadType)); - if (spreadType.target.hasRestElement) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + if (e.kind === 217 /* SpreadElement */) { + if (languageVersion < 2 /* ES2015 */) { + checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 /* SpreadIncludes */ : 2048 /* SpreadArrays */); } - } - else { - if (inDestructuringPattern && spreadType) { + var spreadType = checkExpression(e.expression, checkMode, forceTuple); + if (isArrayLikeType(spreadType)) { + elementTypes.push(spreadType); + elementFlags.push(8 /* Variadic */); + } + else if (inDestructuringPattern) { // Given the following situation: // var c: {}; // [...c] = ["", 0]; @@ -63519,43 +63855,31 @@ var ts; // getContextualTypeForElementExpression, which will crucially not error // if there is no index type / iterated type. var restElementType = getIndexTypeOfType(spreadType, 1 /* Number */) || - getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false); - if (restElementType) { - elementTypes.push(restElementType); - } + getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false) || + unknownType; + elementTypes.push(restElementType); + elementFlags.push(4 /* Rest */); } else { - var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); - var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); - elementTypes.push(type); - } - if (spread) { // tuples are done above, so these are only arrays - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + elementTypes.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, e.expression)); + elementFlags.push(4 /* Rest */); } } + else { + var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); + var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); + elementTypes.push(type); + elementFlags.push(1 /* Required */); + } } - if (!hasNonEndingSpreadElement) { - var minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0); - // If array literal is actually a destructuring pattern, mark it as an implied type. We do this such - // that we get the same behavior for "var [x, y] = []" and "[x, y] = []". - var tupleResult = void 0; - if (inDestructuringPattern && minLength > 0) { - var type = cloneTypeReference(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - type.pattern = node; - return type; - } - else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) { - return createArrayLiteralType(tupleResult); - } - else if (forceTuple) { - return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - } + if (inDestructuringPattern) { + return createTupleType(elementTypes, elementFlags); + } + if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) { + return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext)); } return createArrayLiteralType(createArrayType(elementTypes.length ? - getUnionType(elementTypes, 2 /* Subtype */) : + getUnionType(ts.sameMap(elementTypes, function (t, i) { return elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t; }), 2 /* Subtype */) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext)); } function createArrayLiteralType(type) { @@ -63569,14 +63893,6 @@ var ts; } return literalType; } - function getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, readonly) { - if (elementCount === void 0) { elementCount = elementTypes.length; } - if (readonly === void 0) { readonly = false; } - // Infer a tuple type when the contextual type is or contains a tuple-like type - if (readonly || (contextualType && forEachType(contextualType, isTupleLikeType))) { - return createTupleType(elementTypes, elementCount - (hasRestElement ? 1 : 0), hasRestElement, readonly); - } - } function isNumericName(name) { switch (name.kind) { case 157 /* ComputedPropertyName */: @@ -63992,9 +64308,9 @@ var ts; var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName); // If there are children in the body of JSX element, create dummy attribute "children" with the union of children types so that it will pass the attribute checking process var childrenPropSymbol = createSymbol(4 /* Property */ | 33554432 /* Transient */, jsxChildrenPropertyName); - childrenPropSymbol.type = childrenTypes.length === 1 ? - childrenTypes[0] : - (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, /*hasRestElement*/ false) || createArrayType(getUnionType(childrenTypes))); + childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : + childrenContextualType && forEachType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : + createArrayType(getUnionType(childrenTypes)); // Fake up a property declaration for the children childrenPropSymbol.valueDeclaration = ts.factory.createPropertySignature(/*modifiers*/ undefined, ts.unescapeLeadingUnderscores(jsxChildrenPropertyName), /*questionToken*/ undefined, /*type*/ undefined); ts.setParent(childrenPropSymbol.valueDeclaration, attributes); @@ -64873,6 +65189,14 @@ var ts; function getSuggestedSymbolForNonexistentProperty(name, containingType) { return getSpellingSuggestionForName(ts.isString(name) ? name : ts.idText(name), getPropertiesOfType(containingType), 111551 /* Value */); } + function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) { + var strName = ts.isString(name) ? name : ts.idText(name); + var properties = getPropertiesOfType(containingType); + var jsxSpecific = strName === "for" ? ts.find(properties, function (x) { return ts.symbolName(x) === "htmlFor"; }) + : strName === "class" ? ts.find(properties, function (x) { return ts.symbolName(x) === "className"; }) + : undefined; + return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551 /* Value */); + } function getSuggestionForNonexistentProperty(name, containingType) { var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType); return suggestion && ts.symbolName(suggestion); @@ -65249,28 +65573,10 @@ var ts; argCount = signatureHelpTrailingComma ? args.length + 1 : args.length; // If we are missing the close parenthesis, the call is incomplete. callIsIncomplete = node.arguments.end === node.end; - // If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range. - var firstSpreadArgIndex = getSpreadArgumentIndex(args); - if (firstSpreadArgIndex >= 0) { - if (firstSpreadArgIndex === args.length - 1) { - // Special case, handles the munged arguments that we receive in case of a spread in the end (breaks the arg.expression below) - // (see below for code that starts with "const spreadArgument") - return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature)); - } - var totalCount = firstSpreadArgIndex; // count previous arguments - for (var i = firstSpreadArgIndex; i < args.length; i++) { - var arg = args[i]; - if (!isSpreadArgument(arg)) { - totalCount += 1; - } - else { - var argType = flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression); - totalCount += isTupleType(argType) ? getTypeArguments(argType).length - : isArrayType(argType) ? 0 - : 1; - } - } - return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount <= getParameterCount(signature)); + // If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range. + var spreadArgIndex = getSpreadArgumentIndex(args); + if (spreadArgIndex >= 0) { + return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature)); } } // Too many arguments implies incorrect arity. @@ -65395,6 +65701,12 @@ var ts; } var restType = getNonArrayRestType(signature); var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; + if (restType && restType.flags & 262144 /* TypeParameter */) { + var info = ts.find(context.inferences, function (info) { return info.typeParameter === restType; }); + if (info) { + info.impliedArity = ts.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : undefined; + } + } for (var i = 0; i < argCount; i++) { var arg = args[i]; if (arg.kind !== 219 /* OmittedExpression */) { @@ -65404,46 +65716,55 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode); inferTypes(context.inferences, spreadType, restType); } return getInferredTypes(context); } - function getArrayifiedType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, getArrayifiedType) : - type.flags & (1 /* Any */ | 63176704 /* Instantiable */) || isMutableArrayOrTuple(type) ? type : - isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.minLength, type.target.hasRestElement, /*readonly*/ false, type.target.labeledElementDeclarations) : - createArrayType(getIndexedAccessType(type, numberType)); + function getMutableArrayOrTupleType(type) { + return type.flags & 1048576 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : + type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : + isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, /*readonly*/ false, type.target.labeledElementDeclarations) : + createTupleType([type], [8 /* Variadic */]); } - function getSpreadArgumentType(args, index, argCount, restType, context) { + function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) { if (index >= argCount - 1) { var arg = args[argCount - 1]; if (isSpreadArgument(arg)) { // We are inferring from a spread expression in the last argument position, i.e. both the parameter // and the argument are ...x forms. - return arg.kind === 224 /* SyntheticExpression */ ? - createArrayType(arg.type) : - getArrayifiedType(checkExpressionWithContextualType(arg.expression, restType, context, 0 /* Normal */)); + return getMutableArrayOrTupleType(arg.kind === 224 /* SyntheticExpression */ ? arg.type : + checkExpressionWithContextualType(arg.expression, restType, context, checkMode)); } } var types = []; + var flags = []; var names = []; - var spreadIndex = -1; for (var i = index; i < argCount; i++) { - var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); - var argType = checkExpressionWithContextualType(args[i], contextualType, context, 0 /* Normal */); - if (spreadIndex < 0 && isSpreadArgument(args[i])) { - spreadIndex = i - index; + var arg = args[i]; + if (isSpreadArgument(arg)) { + var spreadType = arg.kind === 224 /* SyntheticExpression */ ? arg.type : checkExpression(arg.expression); + if (isArrayLikeType(spreadType)) { + types.push(spreadType); + flags.push(8 /* Variadic */); + } + else { + types.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, arg.kind === 217 /* SpreadElement */ ? arg.expression : arg)); + flags.push(4 /* Rest */); + } } - if (args[i].kind === 224 /* SyntheticExpression */ && args[i].tupleNameSource) { - names.push(args[i].tupleNameSource); + else { + var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); + var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); + var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); + types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); + flags.push(1 /* Required */); + } + if (arg.kind === 224 /* SyntheticExpression */ && arg.tupleNameSource) { + names.push(arg.tupleNameSource); } - var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); - types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); } - return spreadIndex < 0 ? - createTupleType(types, /*minLength*/ undefined, /*hasRestElement*/ undefined, /*readonly*/ undefined, ts.length(names) === ts.length(types) ? names : undefined) : - createTupleType(ts.append(types.slice(0, spreadIndex), getUnionType(types.slice(spreadIndex))), spreadIndex, /*hasRestElement*/ true, /*readonly*/ undefined); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) { var isJavascript = ts.isInJSFile(signature.declaration); @@ -65625,7 +65946,7 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined, checkMode); var errorNode = reportErrors ? argCount < args.length ? args[argCount] : node : undefined; if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, /*containingMessageChain*/ undefined, errorOutputContainer)) { ts.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors"); @@ -65685,19 +66006,30 @@ var ts; return node.attributes.properties.length > 0 || (ts.isJsxOpeningElement(node) && node.parent.children.length > 0) ? [node.attributes] : ts.emptyArray; } var args = node.arguments || ts.emptyArray; - var length = args.length; - if (length && isSpreadArgument(args[length - 1]) && getSpreadArgumentIndex(args) === length - 1) { - // We have a spread argument in the last position and no other spread arguments. If the type - // of the argument is a tuple type, spread the tuple elements into the argument list. We can - // call checkExpressionCached because spread expressions never have a contextual type. - var spreadArgument_1 = args[length - 1]; - var type_4 = flowLoopCount ? checkExpression(spreadArgument_1.expression) : checkExpressionCached(spreadArgument_1.expression); - if (isTupleType(type_4)) { - var typeArguments = getTypeArguments(type_4); - var restIndex_2 = type_4.target.hasRestElement ? typeArguments.length - 1 : -1; - var syntheticArgs = ts.map(typeArguments, function (t, i) { var _a; return createSyntheticExpression(spreadArgument_1, t, /*isSpread*/ i === restIndex_2, (_a = type_4.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); }); - return ts.concatenate(args.slice(0, length - 1), syntheticArgs); + var spreadIndex = getSpreadArgumentIndex(args); + if (spreadIndex >= 0) { + // Create synthetic arguments from spreads of tuple types. + var effectiveArgs_1 = args.slice(0, spreadIndex); + var _loop_18 = function (i) { + var arg = args[i]; + // We can call checkExpressionCached because spread expressions never have a contextual type. + var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); + if (spreadType && isTupleType(spreadType)) { + ts.forEach(getTypeArguments(spreadType), function (t, i) { + var _a; + var flags = spreadType.target.elementFlags[i]; + var syntheticArg = createSyntheticExpression(arg, flags & 4 /* Rest */ ? createArrayType(t) : t, !!(flags & 12 /* Variable */), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + effectiveArgs_1.push(syntheticArg); + }); + } + else { + effectiveArgs_1.push(arg); + } + }; + for (var i = spreadIndex; i < args.length; i++) { + _loop_18(i); } + return effectiveArgs_1; } return args; } @@ -65997,7 +66329,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_17 = function (c) { + var _loop_19 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66015,7 +66347,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_17(c); + _loop_19(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66149,7 +66481,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_18 = function (i) { + var _loop_20 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66157,7 +66489,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_18(i); + _loop_20(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -67129,51 +67461,44 @@ var ts; // otherwise would return the type 'undefined'). var restType = getTypeOfSymbol(signature.parameters[paramCount]); var index = pos - paramCount; - if (!isTupleType(restType) || restType.target.hasRestElement || index < getTypeArguments(restType).length) { + if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) { return getIndexedAccessType(restType, getLiteralType(index)); } } return undefined; } function getRestTypeAtPosition(source, pos) { - var paramCount = getParameterCount(source); + var parameterCount = getParameterCount(source); + var minArgumentCount = getMinArgumentCount(source); var restType = getEffectiveRestType(source); - var nonRestCount = paramCount - (restType ? 1 : 0); - if (restType && pos === nonRestCount) { - return restType; + if (restType && pos >= parameterCount - 1) { + return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType)); } var types = []; + var flags = []; var names = []; - for (var i = pos; i < nonRestCount; i++) { - types.push(getTypeAtPosition(source, i)); + for (var i = pos; i < parameterCount; i++) { + if (!restType || i < parameterCount - 1) { + types.push(getTypeAtPosition(source, i)); + flags.push(i < minArgumentCount ? 1 /* Required */ : 2 /* Optional */); + } + else { + types.push(restType); + flags.push(8 /* Variadic */); + } var name = getNameableDeclarationAtPosition(source, i); - if (name && names) { + if (name) { names.push(name); } - else { - names = undefined; - } } - if (restType) { - types.push(getIndexedAccessType(restType, numberType)); - var name = getNameableDeclarationAtPosition(source, nonRestCount); - if (name && names) { - names.push(name); - } - else { - names = undefined; - } - } - var minArgumentCount = getMinArgumentCount(source); - var minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos; - return createTupleType(types, minLength, !!restType, /*readonly*/ false, names); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function getParameterCount(signature) { var length = signature.parameters.length; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[length - 1]); if (isTupleType(restType)) { - return length + getTypeArguments(restType).length - 1; + return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1); } } return length; @@ -67182,9 +67507,10 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (isTupleType(restType)) { - var minLength = restType.target.minLength; - if (minLength > 0) { - return signature.parameters.length - 1 + minLength; + var firstOptionalIndex = ts.findIndex(restType.target.elementFlags, function (f) { return !(f & 1 /* Required */); }); + var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex; + if (requiredCount > 0) { + return signature.parameters.length - 1 + requiredCount; } } } @@ -67203,7 +67529,12 @@ var ts; function getEffectiveRestType(signature) { if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); - return isTupleType(restType) ? getRestArrayTypeOfTupleType(restType) : restType; + if (!isTupleType(restType)) { + return restType; + } + if (restType.target.hasRestElement) { + return sliceTupleType(restType, restType.target.fixedLength); + } } return undefined; } @@ -67542,8 +67873,8 @@ var ts; var witnesses = getSwitchClauseTypeOfWitnesses(node, /*retainDefault*/ false); // notEqualFacts states that the type of the switched value is not equal to every type in the switch. var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, /*hasDefault*/ true); - var type_5 = getBaseConstraintOfType(operandType) || operandType; - return !!(filterType(type_5, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); + var type_4 = getBaseConstraintOfType(operandType) || operandType; + return !!(filterType(type_4, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); } var type = getTypeOfExpression(node.expression); if (!isLiteralType(type)) { @@ -67883,7 +68214,7 @@ var ts; error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference); return booleanType; } - if (expr.kind === 198 /* PropertyAccessExpression */ && ts.isPrivateIdentifier(expr.name)) { + if (ts.isPropertyAccessExpression(expr) && ts.isPrivateIdentifier(expr.name)) { error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } var links = getNodeLinks(expr); @@ -68927,18 +69258,19 @@ var ts; } function padTupleType(type, pattern) { var patternElements = pattern.elements; - var arity = getTypeReferenceArity(type); - var elementTypes = arity ? getTypeArguments(type).slice() : []; - for (var i = arity; i < patternElements.length; i++) { + var elementTypes = getTypeArguments(type).slice(); + var elementFlags = type.target.elementFlags.slice(); + for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) { var e = patternElements[i]; if (i < patternElements.length - 1 || !(e.kind === 195 /* BindingElement */ && e.dotDotDotToken)) { elementTypes.push(!ts.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, /*includePatternInType*/ false, /*reportErrors*/ false) : anyType); + elementFlags.push(2 /* Optional */); if (!ts.isOmittedExpression(e) && !hasDefaultValue(e)) { reportImplicitAny(e, anyType); } } } - return createTupleType(elementTypes, type.target.minLength, /*hasRestElement*/ false, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration, type) { var widened = ts.getCombinedNodeFlags(declaration) & 2 /* Const */ || ts.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type); @@ -69359,7 +69691,7 @@ var ts; case 216 /* YieldExpression */: return checkYieldExpression(node); case 224 /* SyntheticExpression */: - return node.type; + return checkSyntheticExpression(node); case 280 /* JsxExpression */: return checkJsxExpression(node, checkMode); case 270 /* JsxElement */: @@ -70015,16 +70347,20 @@ var ts; grammarErrorOnNode(e, ts.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names); break; } - if (isTupleRestElement(e)) { + var flags = getTupleElementFlags(e); + if (flags & 8 /* Variadic */) { + if (!isArrayLikeType(getTypeFromTypeNode(e.type))) { + error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); + break; + } + } + else if (flags & 4 /* Rest */) { if (i !== elementTypes.length - 1) { grammarErrorOnNode(e, ts.Diagnostics.A_rest_element_must_be_last_in_a_tuple_type); break; } - if (!isArrayType(getTypeFromTypeNode(e.type))) { - error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); - } } - else if (isTupleOptionalElement(e)) { + else if (flags & 2 /* Optional */) { seenOptionalElement = true; } else if (seenOptionalElement) { @@ -73076,7 +73412,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_19 = function (member) { + var _loop_21 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73095,7 +73431,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_19(member); + _loop_21(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -107015,7 +107351,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_20 = function (directory) { + var _loop_22 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107041,7 +107377,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_20(directory); + var state_8 = _loop_22(directory); directory = out_directory_1; if (state_8 === "break") break; @@ -108108,7 +108444,7 @@ var ts; configFileSpecs = configFileParseResult.configFileSpecs; // TODO: GH#18217 projectReferences = configFileParseResult.projectReferences; configFileParsingDiagnostics = ts.getConfigFileParsingDiagnostics(configFileParseResult).slice(); - canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(configFileParseResult.raw); + canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function onSourceFileChange(fileName, eventKind, path) { @@ -108977,7 +109313,7 @@ var ts; else if (reloadLevel === ts.ConfigFileProgramReloadLevel.Partial) { // Update file names var result = ts.getFileNamesFromConfigSpecs(config.configFileSpecs, ts.getDirectoryPath(project), config.options, state.parseConfigFileHost); - ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInutFiles(config.raw)); + ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInputFiles(config.raw)); config.fileNames = result.fileNames; watchInputFiles(state, project, projectPath, config); } @@ -109116,7 +109452,7 @@ var ts; } } // Container if no files are specified in the project - if (!project.fileNames.length && !ts.canJsonReportNoInutFiles(project.raw)) { + if (!project.fileNames.length && !ts.canJsonReportNoInputFiles(project.raw)) { return { type: ts.UpToDateStatusType.ContainerOnly }; @@ -110111,6 +110447,13 @@ var ts; PackageJsonDependencyGroup[PackageJsonDependencyGroup["All"] = 15] = "All"; })(PackageJsonDependencyGroup = ts.PackageJsonDependencyGroup || (ts.PackageJsonDependencyGroup = {})); /* @internal */ + var PackageJsonAutoImportPreference; + (function (PackageJsonAutoImportPreference) { + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["None"] = 0] = "None"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["ExcludeDevDependencies"] = 1] = "ExcludeDevDependencies"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["All"] = 2] = "All"; + })(PackageJsonAutoImportPreference = ts.PackageJsonAutoImportPreference || (ts.PackageJsonAutoImportPreference = {})); + /* @internal */ ts.emptyOptions = {}; var HighlightSpanKind; (function (HighlightSpanKind) { @@ -112409,19 +112752,10 @@ var ts; return !!location.parent && ts.isImportOrExportSpecifier(location.parent) && location.parent.propertyName === location; } ts.isImportOrExportSpecifierName = isImportOrExportSpecifierName; - function scriptKindIs(fileName, host) { - var scriptKinds = []; - for (var _i = 2; _i < arguments.length; _i++) { - scriptKinds[_i - 2] = arguments[_i]; - } - var scriptKind = getScriptKind(fileName, host); - return ts.some(scriptKinds, function (k) { return k === scriptKind; }); - } - ts.scriptKindIs = scriptKindIs; function getScriptKind(fileName, host) { // First check to see if the script kind was specified by the host. Chances are the host // may override the default script kind for the file extension. - return ts.ensureScriptKind(fileName, host && host.getScriptKind && host.getScriptKind(fileName)); + return ts.ensureScriptKind(fileName, host.getScriptKind && host.getScriptKind(fileName)); } ts.getScriptKind = getScriptKind; function getSymbolTarget(symbol, checker) { @@ -112952,20 +113286,20 @@ var ts; if (!stringContent) return undefined; var content = tryParseJson(stringContent); - if (!content) - return false; var info = {}; - for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { - var key = dependencyKeys_1[_i]; - var dependencies = content[key]; - if (!dependencies) { - continue; + if (content) { + for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { + var key = dependencyKeys_1[_i]; + var dependencies = content[key]; + if (!dependencies) { + continue; + } + var dependencyMap = ts.createMap(); + for (var packageName in dependencies) { + dependencyMap.set(packageName, dependencies[packageName]); + } + info[key] = dependencyMap; } - var dependencyMap = ts.createMap(); - for (var packageName in dependencies) { - dependencyMap.set(packageName, dependencies[packageName]); - } - info[key] = dependencyMap; } var dependencyGroups = [ [1 /* Dependencies */, info.dependencies], @@ -112973,7 +113307,7 @@ var ts; [8 /* OptionalDependencies */, info.optionalDependencies], [4 /* PeerDependencies */, info.peerDependencies], ]; - return __assign(__assign({}, info), { fileName: fileName, + return __assign(__assign({}, info), { parseable: !!content, fileName: fileName, get: get, has: function (dependencyName, inGroups) { return !!get(dependencyName, inGroups); @@ -114760,6 +115094,9 @@ var ts; function originIsExport(origin) { return !!(origin && origin.kind & 4 /* Export */); } + function originIsPackageJsonImport(origin) { + return originIsExport(origin) && !!origin.isFromPackageJson; + } function originIsPromise(origin) { return !!(origin.kind & 8 /* Promise */); } @@ -115019,6 +115356,7 @@ var ts; isRecommended: isRecommendedCompletionMatch(symbol, recommendedCompletion, typeChecker) || undefined, insertText: insertText, replacementSpan: replacementSpan, + isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, }; } function quotePropertyName(name, preferences) { @@ -115980,11 +116318,12 @@ var ts; var results = []; /** Ids present in `results` for faster lookup */ var resultSymbolIds = ts.createMap(); - ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, function (moduleSymbol) { + ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, /*useAutoImportProvider*/ true, function (moduleSymbol, _, program, isFromPackageJson) { // Perf -- ignore other modules if this is a request for details if (detailsEntryId && detailsEntryId.source && ts.stripQuotes(moduleSymbol.name) !== detailsEntryId.source) { return; } + var typeChecker = program.getTypeChecker(); var resolvedModuleSymbol = typeChecker.resolveExternalModuleSymbol(moduleSymbol); // resolvedModuleSymbol may be a namespace. A namespace may be `export =` by multiple module declarations, but only keep the first one. if (!ts.addToSeen(seenResolvedModules, ts.getSymbolId(resolvedModuleSymbol))) { @@ -115993,7 +116332,7 @@ var ts; // Don't add another completion for `export =` of a symbol that's already global. // So in `declare namespace foo {} declare module "foo" { export = foo; }`, there will just be the global completion for `foo`. if (resolvedModuleSymbol !== moduleSymbol && ts.every(resolvedModuleSymbol.declarations, ts.isNonGlobalDeclaration)) { - pushSymbol(resolvedModuleSymbol, moduleSymbol, /*skipFilter*/ true); + pushSymbol(resolvedModuleSymbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ true); } for (var _i = 0, _a = typeChecker.getExportsAndPropertiesOfModule(moduleSymbol); _i < _a.length; _i++) { var symbol = _a[_i]; @@ -116018,7 +116357,7 @@ var ts; var nearestExportSymbolId = ts.getSymbolId(nearestExportSymbol).toString(); var symbolHasBeenSeen = resultSymbolIds.has(nearestExportSymbolId) || aliasesToAlreadyIncludedSymbols.has(nearestExportSymbolId); if (!symbolHasBeenSeen) { - aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol }); + aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol, isFromPackageJson: isFromPackageJson }); aliasesToAlreadyIncludedSymbols.set(symbolId, true); } else { @@ -116030,20 +116369,19 @@ var ts; else { // This is not a re-export, so see if we have any aliases pending and remove them (step 3 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.delete(symbolId); - pushSymbol(symbol, moduleSymbol); + pushSymbol(symbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); } } }); // By this point, any potential duplicates that were actually duplicates have been // removed, so the rest need to be added. (Step 4 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.forEach(function (_a) { - var alias = _a.alias, moduleSymbol = _a.moduleSymbol; - return pushSymbol(alias, moduleSymbol); + var alias = _a.alias, moduleSymbol = _a.moduleSymbol, isFromPackageJson = _a.isFromPackageJson; + return pushSymbol(alias, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); }); log("getSymbolsFromOtherSourceFileExports: " + (ts.timestamp() - startTime)); return results; - function pushSymbol(symbol, moduleSymbol, skipFilter) { - if (skipFilter === void 0) { skipFilter = false; } + function pushSymbol(symbol, moduleSymbol, isFromPackageJson, skipFilter) { var isDefaultExport = symbol.escapedName === "default" /* Default */; if (isDefaultExport) { symbol = ts.getLocalSymbolForExportDefault(symbol) || symbol; @@ -116052,7 +116390,7 @@ var ts; return; } ts.addToSeen(resultSymbolIds, ts.getSymbolId(symbol)); - var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport }; + var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport, isFromPackageJson: isFromPackageJson }; results.push({ symbol: symbol, symbolName: ts.getNameForExportedSymbol(symbol, target), @@ -132402,7 +132740,7 @@ var ts; errorCodes: errorCodes, getCodeActions: function (context) { var errorCode = context.errorCode, preferences = context.preferences, sourceFile = context.sourceFile, span = context.span; - var info = getFixesInfo(context, errorCode, span.start); + var info = getFixesInfo(context, errorCode, span.start, /*useAutoImportProvider*/ true); if (!info) return undefined; var fixes = info.fixes, symbolName = info.symbolName; @@ -132412,12 +132750,16 @@ var ts; fixIds: [importFixId], getAllCodeActions: function (context) { var sourceFile = context.sourceFile, program = context.program, preferences = context.preferences, host = context.host; - var importAdder = createImportAdder(sourceFile, program, preferences, host); + var importAdder = createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ true, preferences, host); codefix.eachDiagnostic(context, errorCodes, function (diag) { return importAdder.addImportFromDiagnostic(diag, context); }); return codefix.createCombinedCodeActions(ts.textChanges.ChangeTracker.with(context, importAdder.writeFixes)); }, }); function createImportAdder(sourceFile, program, preferences, host) { + return createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ false, preferences, host); + } + codefix.createImportAdder = createImportAdder; + function createImportAdderWorker(sourceFile, program, useAutoImportProvider, preferences, host) { var compilerOptions = program.getCompilerOptions(); // Namespace fixes don't conflict, so just build a list. var addToNamespace = []; @@ -132427,7 +132769,7 @@ var ts; var newImports = ts.createMap(); return { addImportFromDiagnostic: addImportFromDiagnostic, addImportFromExportedSymbol: addImportFromExportedSymbol, writeFixes: writeFixes }; function addImportFromDiagnostic(diagnostic, context) { - var info = getFixesInfo(context, diagnostic.code, diagnostic.start); + var info = getFixesInfo(context, diagnostic.code, diagnostic.start, useAutoImportProvider); if (!info || !info.fixes.length) return; addImport(info); @@ -132437,7 +132779,7 @@ var ts; var symbolName = ts.getNameForExportedSymbol(exportedSymbol, ts.getEmitScriptTarget(compilerOptions)); var checker = program.getTypeChecker(); var symbol = checker.getMergedSymbol(ts.skipAlias(exportedSymbol, checker)); - var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, sourceFile, compilerOptions, checker, program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, host, program, useAutoImportProvider); var preferTypeOnlyImport = !!usageIsTypeOnly && compilerOptions.importsNotUsedAsValues === 2 /* Error */; var useRequire = shouldUseRequire(sourceFile, compilerOptions); var fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, /*position*/ undefined, preferTypeOnlyImport, useRequire, host, preferences); @@ -132524,7 +132866,6 @@ var ts; } } } - codefix.createImportAdder = createImportAdder; // Sorted with the preferred fix coming first. var ImportFixKind; (function (ImportFixKind) { @@ -132542,7 +132883,7 @@ var ts; })(ImportKind || (ImportKind = {})); function getImportCompletionAction(exportedSymbol, moduleSymbol, sourceFile, symbolName, host, program, formatContext, position, preferences) { var compilerOptions = program.getCompilerOptions(); - var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, sourceFile, compilerOptions, program.getTypeChecker(), program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, host, program, /*useAutoImportProvider*/ true); var useRequire = shouldUseRequire(sourceFile, compilerOptions); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && !ts.isSourceFileJS(sourceFile) && ts.isValidTypeOnlyAliasUseSite(ts.getTokenAtPosition(sourceFile, position)); var moduleSpecifier = ts.first(getNewImportInfos(program, sourceFile, position, preferTypeOnlyImport, useRequire, exportInfos, host, preferences)).moduleSpecifier; @@ -132559,11 +132900,13 @@ var ts; var description = _a.description, changes = _a.changes, commands = _a.commands; return { description: description, changes: changes, commands: commands }; } - function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, sourceFile, compilerOptions, checker, allSourceFiles) { + function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, host, program, useAutoImportProvider) { var result = []; - forEachExternalModule(checker, allSourceFiles, function (moduleSymbol, moduleFile) { + var compilerOptions = program.getCompilerOptions(); + forEachExternalModuleToImportFrom(program, host, importingFile, /*filterByPackageJson*/ false, useAutoImportProvider, function (moduleSymbol, moduleFile, program) { + var checker = program.getTypeChecker(); // Don't import from a re-export when looking "up" like to `./index` or `../index`. - if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(sourceFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { + if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(importingFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { return; } var defaultInfo = getDefaultLikeExportInfo(importingFile, moduleSymbol, checker, compilerOptions); @@ -132725,11 +133068,11 @@ var ts; ? { kind: 3 /* AddNew */, moduleSpecifier: moduleSpecifier.text, importKind: importKind, typeOnly: preferTypeOnlyImport, useRequire: useRequire } : undefined; } - function getFixesInfo(context, errorCode, pos) { + function getFixesInfo(context, errorCode, pos, useAutoImportProvider) { var symbolToken = ts.getTokenAtPosition(context.sourceFile, pos); var info = errorCode === ts.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code ? getFixesInfoForUMDImport(context, symbolToken) - : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken) : undefined; + : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken, useAutoImportProvider) : undefined; return info && __assign(__assign({}, info), { fixes: ts.sort(info.fixes, function (a, b) { return a.kind - b.kind; }) }); } function getFixesInfoForUMDImport(_a, token) { @@ -132782,7 +133125,7 @@ var ts; return ts.Debug.assertNever(moduleKind, "Unexpected moduleKind " + moduleKind); } } - function getFixesInfoForNonUMDImport(_a, symbolToken) { + function getFixesInfoForNonUMDImport(_a, symbolToken, useAutoImportProvider) { var sourceFile = _a.sourceFile, program = _a.program, cancellationToken = _a.cancellationToken, host = _a.host, preferences = _a.preferences; var checker = program.getTypeChecker(); // If we're at ``, we must check if `Foo` is already in scope, and if so, get an import for `React` instead. @@ -132796,7 +133139,7 @@ var ts; var compilerOptions = program.getCompilerOptions(); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && ts.isValidTypeOnlyAliasUseSite(symbolToken); var useRequire = shouldUseRequire(sourceFile, compilerOptions); - var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, host); + var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, useAutoImportProvider, host); var fixes = ts.arrayFrom(ts.flatMapIterator(exportInfos.entries(), function (_a) { var _ = _a[0], exportInfos = _a[1]; return getFixForImport(exportInfos, symbolName, symbolToken.getStart(sourceFile), preferTypeOnlyImport, useRequire, program, sourceFile, host, preferences); @@ -132804,14 +133147,14 @@ var ts; return { fixes: fixes, symbolName: symbolName }; } // Returns a map from an exported symbol's ID to a list of every way it's (re-)exported. - function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, host) { + function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, useAutoImportProvider, host) { // For each original symbol, keep all re-exports of that symbol together so we can call `getCodeActionsForImport` on the whole group at once. // Maps symbol id to info for modules providing that symbol (original export + re-exports). var originalSymbolToExportInfos = ts.createMultiMap(); function addSymbol(moduleSymbol, exportedSymbol, importKind) { originalSymbolToExportInfos.add(ts.getUniqueSymbolId(exportedSymbol, checker).toString(), { moduleSymbol: moduleSymbol, importKind: importKind, exportedSymbolIsTypeOnly: isTypeOnlySymbol(exportedSymbol, checker) }); } - forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, function (moduleSymbol) { + forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, useAutoImportProvider, function (moduleSymbol) { cancellationToken.throwIfCancellationRequested(); var defaultInfo = getDefaultLikeExportInfo(sourceFile, moduleSymbol, checker, program.getCompilerOptions()); if (defaultInfo && defaultInfo.name === symbolName && symbolHasMeaning(defaultInfo.symbolForMeaning, currentTokenMeaning)) { @@ -133043,14 +133386,26 @@ var ts; var declarations = _a.declarations; return ts.some(declarations, function (decl) { return !!(ts.getMeaningFromDeclaration(decl) & meaning); }); } - function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, cb) { + function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, useAutoImportProvider, cb) { + var _a, _b; + forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, function (module, file) { return cb(module, file, program, /*isFromPackageJson*/ false); }); + var autoImportProvider = useAutoImportProvider && ((_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host)); + if (autoImportProvider) { + var start = ts.timestamp(); + forEachExternalModuleToImportFromInProgram(autoImportProvider, host, from, filterByPackageJson, function (module, file) { return cb(module, file, autoImportProvider, /*isFromPackageJson*/ true); }); + (_b = host.log) === null || _b === void 0 ? void 0 : _b.call(host, "forEachExternalModuleToImportFrom autoImportProvider: " + (ts.timestamp() - start)); + } + } + codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; + function forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, cb) { + var _a; var filteredCount = 0; var moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); var packageJson = filterByPackageJson && createAutoImportFilter(from, program, host, moduleSpecifierResolutionHost); forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), function (module, sourceFile) { if (sourceFile === undefined) { if (!packageJson || packageJson.allowsImportingAmbientModule(module)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; @@ -133060,18 +133415,15 @@ var ts; sourceFile !== from && isImportableFile(program, from, sourceFile, moduleSpecifierResolutionHost)) { if (!packageJson || packageJson.allowsImportingSourceFile(sourceFile)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; } } }); - if (host.log) { - host.log("forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); - } + (_a = host.log) === null || _a === void 0 ? void 0 : _a.call(host, "forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); } - codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; function forEachExternalModule(checker, allSourceFiles, cb) { for (var _i = 0, _a = checker.getAmbientModules(); _i < _a.length; _i++) { var ambient = _a[_i]; @@ -133142,15 +133494,14 @@ var ts; codefix.moduleSpecifierToValidIdentifier = moduleSpecifierToValidIdentifier; function createAutoImportFilter(fromFile, program, host, moduleSpecifierResolutionHost) { if (moduleSpecifierResolutionHost === void 0) { moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); } - var packageJsons = host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host); - var dependencyGroups = 1 /* Dependencies */ | 2 /* DevDependencies */ | 8 /* OptionalDependencies */; + var packageJsons = ((host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName)) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host)).filter(function (p) { return p.parseable; }); var usesNodeCoreModules; return { allowsImportingAmbientModule: allowsImportingAmbientModule, allowsImportingSourceFile: allowsImportingSourceFile, allowsImportingSpecifier: allowsImportingSpecifier, moduleSpecifierResolutionHost: moduleSpecifierResolutionHost }; function moduleSpecifierIsCoveredByPackageJson(specifier) { var packageName = getNodeModuleRootSpecifier(specifier); for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) { var packageJson = packageJsons_1[_i]; - if (packageJson.has(packageName, dependencyGroups) || packageJson.has(ts.getTypesPackageName(packageName), dependencyGroups)) { + if (packageJson.has(packageName) || packageJson.has(ts.getTypesPackageName(packageName))) { return true; } } @@ -133358,12 +133709,16 @@ var ts; ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, ts.Diagnostics.Module_0_has_no_exported_member_1_Did_you_mean_2.code, + // for JSX class components + ts.Diagnostics.No_overload_matches_this_call.code, + // for JSX FC + ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code, ]; codefix.registerCodeFix({ errorCodes: errorCodes, getCodeActions: function (context) { - var sourceFile = context.sourceFile; - var info = getInfo(sourceFile, context.span.start, context); + var sourceFile = context.sourceFile, errorCode = context.errorCode; + var info = getInfo(sourceFile, context.span.start, context, errorCode); if (!info) return undefined; var node = info.node, suggestedSymbol = info.suggestedSymbol; @@ -133373,18 +133728,23 @@ var ts; }, fixIds: [fixId], getAllCodeActions: function (context) { return codefix.codeFixAll(context, errorCodes, function (changes, diag) { - var info = getInfo(diag.file, diag.start, context); + var info = getInfo(diag.file, diag.start, context, diag.code); var target = context.host.getCompilationSettings().target; if (info) doChange(changes, context.sourceFile, info.node, info.suggestedSymbol, target); }); }, }); - function getInfo(sourceFile, pos, context) { + function getInfo(sourceFile, pos, context, errorCode) { // This is the identifier of the misspelled word. eg: // this.speling = 1; // ^^^^^^^ var node = ts.getTokenAtPosition(sourceFile, pos); var parent = node.parent; + // Only fix spelling for No_overload_matches_this_call emitted on the React class component + if ((errorCode === ts.Diagnostics.No_overload_matches_this_call.code || + errorCode === ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code) && + !ts.isJsxAttribute(parent)) + return undefined; var checker = context.program.getTypeChecker(); var suggestedSymbol; if (ts.isPropertyAccessExpression(parent) && parent.name === node) { @@ -133403,6 +133763,12 @@ var ts; suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol); } } + else if (ts.isJsxAttribute(parent) && parent.name === node) { + ts.Debug.assertNode(node, ts.isIdentifier, "Expected an identifier for JSX attribute"); + var tag = ts.findAncestor(node, ts.isJsxOpeningLikeElement); + var props = checker.getContextualTypeForArgumentAtIndex(tag, 0); + suggestedSymbol = checker.getSuggestedSymbolForNonexistentJSXAttribute(node, props); + } else { var meaning = ts.getMeaningFromLocation(node); var name = ts.getTextOfNode(node); @@ -136544,10 +136910,10 @@ var ts; (function (codefix) { function generateAccessorFromProperty(file, start, end, context, _actionName) { var fieldInfo = getAccessorConvertiblePropertyAtPosition(file, start, end); - if (!fieldInfo) + if (!fieldInfo || !fieldInfo.info) return undefined; var changeTracker = ts.textChanges.ChangeTracker.fromContext(context); - var isStatic = fieldInfo.isStatic, isReadonly = fieldInfo.isReadonly, fieldName = fieldInfo.fieldName, accessorName = fieldInfo.accessorName, originalName = fieldInfo.originalName, type = fieldInfo.type, container = fieldInfo.container, declaration = fieldInfo.declaration; + var _a = fieldInfo.info, isStatic = _a.isStatic, isReadonly = _a.isReadonly, fieldName = _a.fieldName, accessorName = _a.accessorName, originalName = _a.originalName, type = _a.type, container = _a.container, declaration = _a.declaration; ts.suppressLeadingAndTrailingTrivia(fieldName); ts.suppressLeadingAndTrailingTrivia(accessorName); ts.suppressLeadingAndTrailingTrivia(declaration); @@ -136622,23 +136988,37 @@ var ts; var declaration = ts.findAncestor(node.parent, isAcceptedDeclaration); // make sure declaration have AccessibilityModifier or Static Modifier or Readonly Modifier var meaning = 28 /* AccessibilityModifier */ | 32 /* Static */ | 64 /* Readonly */; - if (!declaration || !(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest) - || !isConvertibleName(declaration.name) || (ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) - return undefined; + if (!declaration || (!(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest))) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_property_for_which_to_generate_accessor) + }; + } + if (!isConvertibleName(declaration.name)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Name_is_not_valid) + }; + } + if ((ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Can_only_convert_property_with_modifier) + }; + } var name = declaration.name.text; var startWithUnderscore = ts.startsWithUnderscore(name); var fieldName = createPropertyName(startWithUnderscore ? name : ts.getUniqueName("_" + name, file), declaration.name); var accessorName = createPropertyName(startWithUnderscore ? ts.getUniqueName(name.substring(1), file) : name, declaration.name); return { - isStatic: ts.hasStaticModifier(declaration), - isReadonly: ts.hasEffectiveReadonlyModifier(declaration), - type: ts.getTypeAnnotationNode(declaration), - container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, - originalName: declaration.name.text, - declaration: declaration, - fieldName: fieldName, - accessorName: accessorName, - renameAccessor: startWithUnderscore + info: { + isStatic: ts.hasStaticModifier(declaration), + isReadonly: ts.hasEffectiveReadonlyModifier(declaration), + type: ts.getTypeAnnotationNode(declaration), + container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, + originalName: declaration.name.text, + declaration: declaration, + fieldName: fieldName, + accessorName: accessorName, + renameAccessor: startWithUnderscore + } }; } codefix.getAccessorConvertiblePropertyAtPosition = getAccessorConvertiblePropertyAtPosition; @@ -137422,13 +137802,22 @@ var ts; var info = getInfo(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - var description = info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; - var actionName = info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (info.error === undefined) { + var description = info.info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; + var actionName = info.info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_default_export_to_named_export.message, actions: [{ name: actionNameDefaultToNamed, description: ts.Diagnostics.Convert_default_export_to_named_export.message, notApplicableReason: info.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_export_to_default_export.message, actions: [{ name: actionNameNamedToDefault, description: ts.Diagnostics.Convert_named_export_to_default_export.message, notApplicableReason: info.error }] }, + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameDefaultToNamed || actionName === actionNameNamedToDefault, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, ts.Debug.checkDefined(getInfo(context), "context must have info"), t, context.cancellationToken); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, ts.Debug.checkDefined((_a = getInfo(context)) === null || _a === void 0 ? void 0 : _a.info, "context must have info"), t, context.cancellationToken); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; }, }); @@ -137439,14 +137828,14 @@ var ts; var token = ts.getTokenAtPosition(file, span.start); var exportNode = !!(token.parent && ts.getSyntacticModifierFlags(token.parent) & 1 /* Export */) && considerPartialSpans ? token.parent : ts.getParentNodeInSpan(token, file, span); if (!exportNode || (!ts.isSourceFile(exportNode.parent) && !(ts.isModuleBlock(exportNode.parent) && ts.isAmbientModule(exportNode.parent.parent)))) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_export_statement) }; } var exportingModuleSymbol = ts.isSourceFile(exportNode.parent) ? exportNode.parent.symbol : exportNode.parent.parent.symbol; var flags = ts.getSyntacticModifierFlags(exportNode); var wasDefault = !!(flags & 512 /* Default */); // If source file already has a default export, don't offer refactor. if (!(flags & 1 /* Export */) || !wasDefault && exportingModuleSymbol.exports.has("default" /* Default */)) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.This_file_already_has_a_default_export) }; } switch (exportNode.kind) { case 248 /* FunctionDeclaration */: @@ -137456,7 +137845,7 @@ var ts; case 251 /* TypeAliasDeclaration */: case 253 /* ModuleDeclaration */: { var node = exportNode; - return node.name && ts.isIdentifier(node.name) ? { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return node.name && ts.isIdentifier(node.name) ? { info: { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } case 229 /* VariableStatement */: { var vs = exportNode; @@ -137468,7 +137857,7 @@ var ts; if (!decl.initializer) return undefined; ts.Debug.assert(!wasDefault, "Can't have a default flag here"); - return ts.isIdentifier(decl.name) ? { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return ts.isIdentifier(decl.name) ? { info: { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } default: return undefined; @@ -137619,13 +138008,22 @@ var ts; var i = getImportToConvert(context, context.triggerReason === "invoked"); if (!i) return ts.emptyArray; - var description = i.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; - var actionName = i.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (i.error === undefined) { + var description = i.info.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; + var actionName = i.info.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, actions: [{ name: actionNameNamespaceToNamed, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, notApplicableReason: i.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, actions: [{ name: actionNameNamedToNamespace, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, notApplicableReason: i.error }] } + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameNamespaceToNamed || actionName === actionNameNamedToNamespace, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, t, ts.Debug.checkDefined(getImportToConvert(context), "Context must provide an import to convert")); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, t, ts.Debug.checkDefined((_a = getImportToConvert(context)) === null || _a === void 0 ? void 0 : _a.info, "Context must provide an import to convert")); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; } }); @@ -137636,10 +138034,18 @@ var ts; var span = ts.getRefactorContextSpan(context); var token = ts.getTokenAtPosition(file, span.start); var importDecl = considerPartialSpans ? ts.findAncestor(token, ts.isImportDeclaration) : ts.getParentNodeInSpan(token, file, span); - if (!importDecl || !ts.isImportDeclaration(importDecl) || (importDecl.getEnd() < span.start + span.length)) + if (!importDecl || !ts.isImportDeclaration(importDecl)) + return { error: "Selection is not an import declaration." }; + if (importDecl.getEnd() < span.start + span.length) return undefined; var importClause = importDecl.importClause; - return importClause && importClause.namedBindings; + if (!importClause) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_import_clause) }; + } + if (!importClause.namedBindings) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_namespace_import_or_named_imports) }; + } + return { info: importClause.namedBindings }; } function doChange(sourceFile, program, changes, toConvert) { var checker = program.getTypeChecker(); @@ -137908,7 +138314,27 @@ var ts; var rangeToExtract = getRangeToExtract(context.file, ts.getRefactorContextSpan(context), context.triggerReason === "invoked"); var targetRange = rangeToExtract.targetRange; if (targetRange === undefined) { - return ts.emptyArray; + if (!rangeToExtract.errors || rangeToExtract.errors.length === 0 || !context.preferences.provideRefactorNotApplicableReason) { + return ts.emptyArray; + } + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + name: "function_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }, + { + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + name: "constant_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }]; } var extractions = getPossibleExtractions(targetRange, context); if (extractions === undefined) { @@ -137917,17 +138343,18 @@ var ts; } var functionActions = []; var usedFunctionNames = ts.createMap(); + var innermostErrorFunctionAction; var constantActions = []; var usedConstantNames = ts.createMap(); + var innermostErrorConstantAction; var i = 0; for (var _i = 0, extractions_1 = extractions; _i < extractions_1.length; _i++) { var _a = extractions_1[_i], functionExtraction = _a.functionExtraction, constantExtraction = _a.constantExtraction; - // Skip these since we don't have a way to report errors yet + var description = functionExtraction.description; if (functionExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = functionExtraction.description; if (!usedFunctionNames.has(description)) { usedFunctionNames.set(description, true); functionActions.push({ @@ -137936,32 +138363,39 @@ var ts; }); } } + else if (!innermostErrorFunctionAction) { + innermostErrorFunctionAction = { + description: description, + name: "function_scope_" + i, + notApplicableReason: getStringError(functionExtraction.errors) + }; + } // Skip these since we don't have a way to report errors yet if (constantExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = constantExtraction.description; - if (!usedConstantNames.has(description)) { - usedConstantNames.set(description, true); + var description_1 = constantExtraction.description; + if (!usedConstantNames.has(description_1)) { + usedConstantNames.set(description_1, true); constantActions.push({ - description: description, + description: description_1, name: "constant_scope_" + i }); } } + else if (!innermostErrorConstantAction) { + innermostErrorConstantAction = { + description: description, + name: "constant_scope_" + i, + notApplicableReason: getStringError(constantExtraction.errors) + }; + } // *do* increment i anyway because we'll look for the i-th scope // later when actually doing the refactoring if the user requests it i++; } var infos = []; - if (constantActions.length) { - infos.push({ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), - actions: constantActions - }); - } if (functionActions.length) { infos.push({ name: refactorName, @@ -137969,7 +138403,35 @@ var ts; actions: functionActions }); } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorFunctionAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [innermostErrorFunctionAction] + }); + } + if (constantActions.length) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: constantActions + }); + } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorConstantAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [innermostErrorConstantAction] + }); + } return infos.length ? infos : ts.emptyArray; + function getStringError(errors) { + var error = errors[0].messageText; + if (typeof error !== "string") { + error = error.messageText; + } + return error; + } } extractSymbol.getAvailableActions = getAvailableActions; /* Exported for tests */ @@ -139510,21 +139972,36 @@ var ts; var info = getRangeToExtract(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), - actions: info.isJS ? [{ - name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) - }] : ts.append([{ - name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) - }], info.typeElements && { - name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) - }) - }]; + if (info.error === undefined) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: info.info.isJS ? [{ + name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) + }] : ts.append([{ + name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) + }], info.info.typeElements && { + name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) + }) + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: [ + { name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef), notApplicableReason: info.error }, + { name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias), notApplicableReason: info.error }, + { name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface), notApplicableReason: info.error }, + ] + }]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { + var _a; var file = context.file; - var info = ts.Debug.checkDefined(getRangeToExtract(context), "Expected to find a range to extract"); + var info = ts.Debug.checkDefined((_a = getRangeToExtract(context)) === null || _a === void 0 ? void 0 : _a.info, "Expected to find a range to extract"); var name = ts.getUniqueName("NewType", file); var edits = ts.textChanges.ChangeTracker.with(context, function (changes) { switch (actionName) { @@ -139556,14 +140033,14 @@ var ts; var selection = ts.findAncestor(current, (function (node) { return node.parent && ts.isTypeNode(node) && !rangeContainsSkipTrivia(range, node.parent, file) && (cursorRequest || ts.nodeOverlapsWithStartEnd(current, file, range.pos, range.end)); })); if (!selection || !ts.isTypeNode(selection)) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Selection_is_not_a_valid_type_node) }; var checker = context.program.getTypeChecker(); var firstStatement = ts.Debug.checkDefined(ts.findAncestor(selection, ts.isStatement), "Should find a statement"); var typeParameters = collectTypeParameters(checker, selection, firstStatement, file); if (!typeParameters) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.No_type_could_be_extracted_from_this_type_node) }; var typeElements = flattenTypeLiteralNodeReference(checker, selection); - return { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements }; + return { info: { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements } }; } function flattenTypeLiteralNodeReference(checker, node) { if (!node) @@ -139684,32 +140161,47 @@ var ts; if (!context.endPosition) return undefined; var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition); - if (!info) + if (!info || !info.info) return undefined; var edits = ts.codefix.generateAccessorFromProperty(context.file, context.startPosition, context.endPosition, context, actionName); if (!edits) return undefined; var renameFilename = context.file.fileName; - var nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName; + var nameNeedRename = info.info.renameAccessor ? info.info.accessorName : info.info.fieldName; var renameLocationOffset = ts.isIdentifier(nameNeedRename) ? 0 : -1; - var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.declaration)); + var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.info.declaration)); return { renameFilename: renameFilename, renameLocation: renameLocation, edits: edits }; }, getAvailableActions: function (context) { if (!context.endPosition) return ts.emptyArray; - if (!ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked")) + var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked"); + if (!info) return ts.emptyArray; - return [{ - name: actionName, - description: actionDescription, - actions: [ - { - name: actionName, - description: actionDescription - } - ] - }]; + if (!info.error) { + return [{ + name: actionName, + description: actionDescription, + actions: [ + { + name: actionName, + description: actionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: actionName, + description: actionDescription, + actions: [{ + name: actionName, + description: actionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } }); })(generateGetAccessorAndSetAccessor = refactor.generateGetAccessorAndSetAccessor || (refactor.generateGetAccessorAndSetAccessor = {})); @@ -140440,27 +140932,45 @@ var ts; var info = getConvertibleArrowFunctionAtPosition(file, startPosition, triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: refactorDescription, - actions: [ - info.addBraces ? - { + if (info.error === undefined) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [ + info.info.addBraces ? + { + name: addBracesActionName, + description: addBracesActionDescription + } : { + name: removeBracesActionName, + description: removeBracesActionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [{ name: addBracesActionName, - description: addBracesActionDescription - } : { - name: removeBracesActionName, - description: removeBracesActionDescription - } - ] - }]; + description: addBracesActionDescription, + notApplicableReason: info.error + }, { + name: removeBracesActionName, + description: removeBracesActionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } function getEditsForAction(context, actionName) { var file = context.file, startPosition = context.startPosition; var info = getConvertibleArrowFunctionAtPosition(file, startPosition); - if (!info) + if (!info || !info.info) return undefined; - var expression = info.expression, returnStatement = info.returnStatement, func = info.func; + var _a = info.info, expression = _a.expression, returnStatement = _a.returnStatement, func = _a.func; var body; if (actionName === addBracesActionName) { var returnStatement_1 = ts.factory.createReturnStatement(expression); @@ -140488,25 +140998,38 @@ var ts; if (considerFunctionBodies === void 0) { considerFunctionBodies = true; } var node = ts.getTokenAtPosition(file, startPosition); var func = ts.getContainingFunction(node); - // Only offer a refactor in the function body on explicit refactor requests. - if (!func || !ts.isArrowFunction(func) || (!ts.rangeContainsRange(func, node) - || (ts.rangeContainsRange(func.body, node) && !considerFunctionBodies))) + if (!func) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_a_containing_arrow_function) + }; + } + if (!ts.isArrowFunction(func)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Containing_function_is_not_an_arrow_function) + }; + } + if ((!ts.rangeContainsRange(func, node) || ts.rangeContainsRange(func.body, node) && !considerFunctionBodies)) { return undefined; + } if (ts.isExpression(func.body)) { return { - func: func, - addBraces: true, - expression: func.body + info: { + func: func, + addBraces: true, + expression: func.body + } }; } else if (func.body.statements.length === 1) { var firstStatement = ts.first(func.body.statements); if (ts.isReturnStatement(firstStatement)) { return { - func: func, - addBraces: false, - expression: firstStatement.expression, - returnStatement: firstStatement + info: { + func: func, + addBraces: false, + expression: firstStatement.expression, + returnStatement: firstStatement + } }; } } @@ -142491,6 +143014,10 @@ var ts; synchronizeHostData(); return program; } + function getAutoImportProvider() { + var _a; + return (_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host); + } function cleanupSemanticCache() { program = undefined; // TODO: GH#18217 } @@ -143159,6 +143686,7 @@ var ts; getEmitOutput: getEmitOutput, getNonBoundSourceFile: getNonBoundSourceFile, getProgram: getProgram, + getAutoImportProvider: getAutoImportProvider, getApplicableRefactors: getApplicableRefactors, getEditsForRefactor: getEditsForRefactor, toLineColumnOffset: sourceMapper.toLineColumnOffset, @@ -144855,6 +145383,11 @@ var ts; return "/dev/null/inferredProject" + counter + "*"; } server.makeInferredProjectName = makeInferredProjectName; + /*@internal*/ + function makeAutoImportProviderProjectName(counter) { + return "/dev/null/autoImportProviderProject" + counter + "*"; + } + server.makeAutoImportProviderProjectName = makeAutoImportProviderProjectName; function createSortedArray() { return []; // TODO: GH#19873 } @@ -145581,7 +146114,7 @@ var ts; case 0: return server.Errors.ThrowNoProject(); case 1: - return this.containingProjects[0]; + return ensureNotAutoImportProvider(this.containingProjects[0]); default: // If this file belongs to multiple projects, below is the order in which default project is used // - for open script info, its default configured project during opening is default if info is part of it @@ -145591,6 +146124,7 @@ var ts; // - first inferred project var firstExternalProject = void 0; var firstConfiguredProject = void 0; + var firstInferredProject = void 0; var firstNonSourceOfProjectReferenceRedirect = void 0; var defaultConfiguredProject = void 0; for (var index = 0; index < this.containingProjects.length; index++) { @@ -145614,12 +146148,15 @@ var ts; else if (!firstExternalProject && server.isExternalProject(project)) { firstExternalProject = project; } + else if (!firstInferredProject && server.isInferredProject(project)) { + firstInferredProject = project; + } } - return defaultConfiguredProject || + return ensureNotAutoImportProvider(defaultConfiguredProject || firstNonSourceOfProjectReferenceRedirect || firstConfiguredProject || firstExternalProject || - this.containingProjects[0]; + firstInferredProject); } }; ScriptInfo.prototype.registerFileUpdate = function () { @@ -145690,6 +146227,10 @@ var ts; ScriptInfo.prototype.isOrphan = function () { return !ts.forEach(this.containingProjects, function (p) { return !p.isOrphan(); }); }; + /*@internal*/ + ScriptInfo.prototype.isContainedByAutoImportProvider = function () { + return ts.some(this.containingProjects, function (p) { return p.projectKind === server.ProjectKind.AutoImportProvider; }); + }; /** * @param line 1 based index */ @@ -145722,6 +146263,12 @@ var ts; return ScriptInfo; }()); server.ScriptInfo = ScriptInfo; + function ensureNotAutoImportProvider(project) { + if (!project || project.projectKind === server.ProjectKind.AutoImportProvider) { + return server.Errors.ThrowNoProject(); + } + return project; + } function failIfInvalidPosition(position) { ts.Debug.assert(typeof position === "number", "Expected position " + position + " to be a number."); ts.Debug.assert(position >= 0, "Expected position to be non-negative."); @@ -145856,6 +146403,7 @@ var ts; ProjectKind[ProjectKind["Inferred"] = 0] = "Inferred"; ProjectKind[ProjectKind["Configured"] = 1] = "Configured"; ProjectKind[ProjectKind["External"] = 2] = "External"; + ProjectKind[ProjectKind["AutoImportProvider"] = 3] = "AutoImportProvider"; })(ProjectKind = server.ProjectKind || (server.ProjectKind = {})); /* @internal */ function countEachFileTypes(infos, includeSizes) { @@ -146007,8 +146555,9 @@ var ts; this.disableLanguageService(lastFileExceededProgramSize); } this.markAsDirty(); - this.projectService.pendingEnsureProjectForOpenFiles = true; - this.packageJsonCache = server.createPackageJsonCache(this); + if (projectKind !== ProjectKind.AutoImportProvider) { + this.projectService.pendingEnsureProjectForOpenFiles = true; + } } /*@internal*/ Project.prototype.getResolvedProjectReferenceToRedirect = function (_fileName) { @@ -146318,6 +146867,10 @@ var ts; this.languageServiceEnabled = false; this.lastFileExceededProgramSize = lastFileExceededProgramSize; this.builderState = undefined; + if (this.autoImportProviderHost) { + this.autoImportProviderHost.close(); + } + this.autoImportProviderHost = undefined; this.resolutionCache.closeTypeRootsWatch(); this.clearGeneratedFileWatch(); this.projectService.onUpdateLanguageServiceStateForProject(this, /*languageServiceEnabled*/ false); @@ -146397,12 +146950,12 @@ var ts; ts.clearMap(this.missingFilesMap, ts.closeFileWatcher); this.missingFilesMap = undefined; } - if (this.packageJsonFilesMap) { - ts.clearMap(this.packageJsonFilesMap, ts.closeFileWatcher); - this.packageJsonFilesMap = undefined; - } this.clearGeneratedFileWatch(); this.clearInvalidateResolutionOfFailedLookupTimer(); + if (this.autoImportProviderHost) { + this.autoImportProviderHost.close(); + } + this.autoImportProviderHost = undefined; // signal language service to release source files acquired from document registry this.languageService.dispose(); this.languageService = undefined; @@ -146580,6 +147133,15 @@ var ts; this.dirty = true; } }; + /*@internal*/ + Project.prototype.markAutoImportProviderAsDirty = function () { + var _a; + if (this.autoImportProviderHost === false) { + this.autoImportProviderHost = undefined; + } + (_a = this.autoImportProviderHost) === null || _a === void 0 ? void 0 : _a.markAsDirty(); + this.importSuggestionsCache.clear(); + }; /* @internal */ Project.prototype.onFileAddedOrRemoved = function () { this.hasAddedorRemovedFiles = true; @@ -146589,6 +147151,7 @@ var ts; * @returns: true if set of files in the project stays the same and false - otherwise. */ Project.prototype.updateGraph = function () { + var _a; ts.perfLogger.logStartUpdateGraph(); this.resolutionCache.startRecordingFilesWithChangedResolutions(); var hasNewProgram = this.updateGraphWorker(); @@ -146617,9 +147180,19 @@ var ts; else { this.lastCachedUnresolvedImportsList = undefined; } + var isFirstLoad = this.projectProgramVersion === 0; if (hasNewProgram) { this.projectProgramVersion++; } + if (hasAddedorRemovedFiles) { + if (!this.autoImportProviderHost) + this.autoImportProviderHost = undefined; + (_a = this.autoImportProviderHost) === null || _a === void 0 ? void 0 : _a.markAsDirty(); + } + if (isFirstLoad) { + // Preload auto import provider so it's not created during completions request + this.getPackageJsonAutoImportProvider(); + } ts.perfLogger.logStopUpdateGraph(); return !hasNewProgram; }; @@ -146740,7 +147313,7 @@ var ts; scriptInfo.attachToProject(_this); }, function (removed) { return _this.detachScriptInfoFromProject(removed); }); var elapsed = ts.timestamp() - start; - this.projectService.sendUpdateGraphPerformanceEvent(elapsed); + this.sendPerformanceEvent("UpdateGraph", elapsed); this.writeLog("Finishing updateGraphWorker: Project: " + this.getProjectName() + " Version: " + this.getProjectVersion() + " structureChanged: " + hasNewProgram + " Elapsed: " + elapsed + "ms"); if (this.hasAddedorRemovedFiles) { this.print(/*writeProjectFileNames*/ true); @@ -146750,6 +147323,10 @@ var ts; } return hasNewProgram; }; + /* @internal */ + Project.prototype.sendPerformanceEvent = function (kind, durationMs) { + this.projectService.sendPerformanceEvent(kind, durationMs); + }; /*@internal*/ Project.prototype.sourceFileHasChangedOwnImportSuggestions = function (oldSourceFile, newSourceFile) { if (!oldSourceFile && !newSourceFile) { @@ -146904,6 +147481,9 @@ var ts; this.writeLog("Project '" + this.projectName + "' (" + ProjectKind[this.projectKind] + ")"); this.writeLog(this.filesToString(writeProjectFileNames && this.projectService.logger.hasLevel(server.LogLevel.verbose))); this.writeLog("-----------------------------------------------"); + if (this.autoImportProviderHost) { + this.autoImportProviderHost.print(/*writeProjectFileNames*/ false); + } }; Project.prototype.setCompilerOptions = function (compilerOptions) { if (compilerOptions) { @@ -147131,60 +147711,55 @@ var ts; }; /*@internal*/ Project.prototype.getPackageJsonsVisibleToFile = function (fileName, rootDir) { - var packageJsonCache = this.packageJsonCache; - var watchPackageJsonFile = this.watchPackageJsonFile.bind(this); - var toPath = this.toPath.bind(this); - var rootPath = rootDir && toPath(rootDir); - var filePath = toPath(fileName); - var result = []; - ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), function processDirectory(directory) { - switch (packageJsonCache.directoryHasPackageJson(directory)) { - // Sync and check same directory again - case 1 /* Maybe */: - packageJsonCache.searchDirectoryAndAncestors(directory); - return processDirectory(directory); - // Check package.json - case -1 /* True */: - var packageJsonFileName = ts.combinePaths(directory, "package.json"); - watchPackageJsonFile(packageJsonFileName); - var info = packageJsonCache.getInDirectory(directory); - if (info) - result.push(info); - } - if (rootPath && rootPath === toPath(directory)) { - return true; - } - }); - return result; + return this.projectService.getPackageJsonsVisibleToFile(fileName, rootDir); }; /*@internal*/ - Project.prototype.onAddPackageJson = function (path) { - this.packageJsonCache.addOrUpdate(path); - this.watchPackageJsonFile(path); + Project.prototype.getPackageJsonsForAutoImport = function (rootDir) { + var packageJsons = this.getPackageJsonsVisibleToFile(ts.combinePaths(this.currentDirectory, ts.inferredTypesContainingFile), rootDir); + this.packageJsonsForAutoImport = ts.arrayToSet(packageJsons.map(function (p) { return p.fileName; })); + return packageJsons; }; /*@internal*/ Project.prototype.getImportSuggestionsCache = function () { return this.importSuggestionsCache; }; - Project.prototype.watchPackageJsonFile = function (path) { - var _this = this; - var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = ts.createMap()); - if (!watchers.has(path)) { - watchers.set(path, this.projectService.watchFactory.watchFile(this.projectService.host, path, function (fileName, eventKind) { - var path = _this.toPath(fileName); - switch (eventKind) { - case ts.FileWatcherEventKind.Created: - return ts.Debug.fail(); - case ts.FileWatcherEventKind.Changed: - _this.packageJsonCache.addOrUpdate(path); - break; - case ts.FileWatcherEventKind.Deleted: - _this.packageJsonCache.delete(path); - watchers.get(path).close(); - watchers.delete(path); - } - }, ts.PollingInterval.Low, this.projectService.getWatchOptions(this), ts.WatchType.PackageJsonFile)); + /*@internal*/ + Project.prototype.includePackageJsonAutoImports = function () { + if (this.projectService.includePackageJsonAutoImports() === 0 /* None */ || + !this.languageServiceEnabled || + ts.isInsideNodeModules(this.currentDirectory) || + !this.isDefaultProjectForOpenFiles()) { + return 0 /* None */; } + return this.projectService.includePackageJsonAutoImports(); + }; + /*@internal*/ + Project.prototype.getPackageJsonAutoImportProvider = function () { + if (this.autoImportProviderHost === false) { + return undefined; + } + if (this.autoImportProviderHost) { + server.updateProjectIfDirty(this.autoImportProviderHost); + if (!this.autoImportProviderHost.hasRoots()) { + this.autoImportProviderHost.close(); + this.autoImportProviderHost = undefined; + return undefined; + } + return this.autoImportProviderHost.getCurrentProgram(); + } + var dependencySelection = this.includePackageJsonAutoImports(); + if (dependencySelection) { + this.autoImportProviderHost = AutoImportProviderProject.create(dependencySelection, this, this.projectService.host, this.documentRegistry); + if (this.autoImportProviderHost) { + server.updateProjectIfDirty(this.autoImportProviderHost); + return this.autoImportProviderHost.getCurrentProgram(); + } + } + }; + /*@internal*/ + Project.prototype.isDefaultProjectForOpenFiles = function () { + var _this = this; + return !!ts.forEachEntry(this.projectService.openFiles, function (_, fileName) { return _this.projectService.tryGetDefaultProjectForFile(server.toNormalizedPath(fileName)) === _this; }); }; return Project; }()); @@ -147211,6 +147786,10 @@ var ts; return unresolvedImports || server.emptyArray; }); } + function createProjectNameFactoryWithCounter(nameFactory) { + var nextId = 1; + return function () { return nameFactory(nextId++); }; + } /** * If a file is opened and no tsconfig (or jsconfig) is found, * the file and its imports/references are put into an InferredProject. @@ -147289,21 +147868,109 @@ var ts; InferredProject.prototype.getTypeAcquisition = function () { return { enable: allRootFilesAreJsOrDts(this), - include: [], - exclude: [] + include: ts.emptyArray, + exclude: ts.emptyArray }; }; - InferredProject.newName = (function () { - var nextId = 1; - return function () { - var id = nextId; - nextId++; - return server.makeInferredProjectName(id); - }; - })(); + InferredProject.newName = createProjectNameFactoryWithCounter(server.makeInferredProjectName); return InferredProject; }(Project)); server.InferredProject = InferredProject; + var AutoImportProviderProject = /** @class */ (function (_super) { + __extends(AutoImportProviderProject, _super); + /*@internal*/ + function AutoImportProviderProject(hostProject, initialRootNames, documentRegistry, compilerOptions) { + var _this = _super.call(this, AutoImportProviderProject.newName(), ProjectKind.AutoImportProvider, hostProject.projectService, documentRegistry, + /*hasExplicitListOfFiles*/ false, + /*lastFileExceededProgramSize*/ undefined, compilerOptions, + /*compileOnSaveEnabled*/ false, hostProject.getWatchOptions(), hostProject.projectService.host, hostProject.currentDirectory) || this; + _this.hostProject = hostProject; + _this.rootFileNames = initialRootNames; + return _this; + } + /*@internal*/ + AutoImportProviderProject.getRootFileNames = function (dependencySelection, hostProject, moduleResolutionHost, compilerOptions) { + var _a, _b, _c, _d; + if (!dependencySelection) { + return ts.emptyArray; + } + var dependencyNames; + var rootNames; + var rootFileName = ts.combinePaths(hostProject.currentDirectory, ts.inferredTypesContainingFile); + var packageJsons = hostProject.getPackageJsonsForAutoImport(ts.combinePaths(hostProject.currentDirectory, rootFileName)); + for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) { + var packageJson = packageJsons_1[_i]; + (_a = packageJson.dependencies) === null || _a === void 0 ? void 0 : _a.forEach(function (_, dependenyName) { return addDependency(dependenyName); }); + (_b = packageJson.peerDependencies) === null || _b === void 0 ? void 0 : _b.forEach(function (_, dependencyName) { return addDependency(dependencyName); }); + if (dependencySelection === 2 /* All */) { + (_c = packageJson.devDependencies) === null || _c === void 0 ? void 0 : _c.forEach(function (_, dependencyName) { return addDependency(dependencyName); }); + } + } + if (dependencyNames) { + var resolutions = ts.map(ts.arrayFrom(dependencyNames.keys()), function (name) { return ts.resolveTypeReferenceDirective(name, rootFileName, compilerOptions, moduleResolutionHost); }); + for (var _e = 0, resolutions_1 = resolutions; _e < resolutions_1.length; _e++) { + var resolution = resolutions_1[_e]; + if (((_d = resolution.resolvedTypeReferenceDirective) === null || _d === void 0 ? void 0 : _d.resolvedFileName) && !hostProject.getCurrentProgram().getSourceFile(resolution.resolvedTypeReferenceDirective.resolvedFileName)) { + rootNames = ts.append(rootNames, resolution.resolvedTypeReferenceDirective.resolvedFileName); + } + } + } + return rootNames || ts.emptyArray; + function addDependency(dependency) { + if (!ts.startsWith(dependency, "@types/")) { + (dependencyNames || (dependencyNames = ts.createMap())).set(dependency, true); + } + } + }; + /*@internal*/ + AutoImportProviderProject.create = function (dependencySelection, hostProject, moduleResolutionHost, documentRegistry) { + if (dependencySelection === 0 /* None */) { + return undefined; + } + var compilerOptions = __assign(__assign({}, hostProject.getCompilerOptions()), { noLib: true, diagnostics: false, skipLibCheck: true, types: ts.emptyArray, lib: ts.emptyArray, sourceMap: false }); + var rootNames = this.getRootFileNames(dependencySelection, hostProject, moduleResolutionHost, compilerOptions); + if (!rootNames.length) { + return undefined; + } + return new AutoImportProviderProject(hostProject, rootNames, documentRegistry, compilerOptions); + }; + AutoImportProviderProject.prototype.isOrphan = function () { + return true; + }; + AutoImportProviderProject.prototype.updateGraph = function () { + var rootFileNames = this.rootFileNames; + if (!rootFileNames) { + rootFileNames = AutoImportProviderProject.getRootFileNames(this.hostProject.includePackageJsonAutoImports(), this.hostProject, this.projectService.host, this.getCompilationSettings()); + } + this.projectService.setFileNamesOfAutoImportProviderProject(this, rootFileNames); + this.rootFileNames = rootFileNames; + this.hostProject.getImportSuggestionsCache().clear(); + return _super.prototype.updateGraph.call(this); + }; + AutoImportProviderProject.prototype.markAsDirty = function () { + this.rootFileNames = undefined; + _super.prototype.markAsDirty.call(this); + }; + AutoImportProviderProject.prototype.getScriptFileNames = function () { + return this.rootFileNames || ts.emptyArray; + }; + AutoImportProviderProject.prototype.getLanguageService = function () { + throw new Error("AutoImportProviderProject language service should never be used. To get the program, use `project.getCurrentProgram()`."); + }; + AutoImportProviderProject.prototype.markAutoImportProviderAsDirty = function () { + throw new Error("AutoImportProviderProject is an auto import provider; use `markAsDirty()` instead."); + }; + /*@internal*/ + AutoImportProviderProject.prototype.includePackageJsonAutoImports = function () { + return 0 /* None */; + }; + AutoImportProviderProject.prototype.getTypeAcquisition = function () { + return { enable: false }; + }; + AutoImportProviderProject.newName = createProjectNameFactoryWithCounter(server.makeAutoImportProviderProjectName); + return AutoImportProviderProject; + }(Project)); + server.AutoImportProviderProject = AutoImportProviderProject; /** * If a file is opened, the server will look for a tsconfig (or jsconfig) * and if successful create a ConfiguredProject for it. @@ -147967,6 +148634,7 @@ var ts; var watchLogLevel = this.logger.hasLevel(server.LogLevel.verbose) ? ts.WatchLogLevel.Verbose : this.logger.loggingEnabled() ? ts.WatchLogLevel.TriggerOnly : ts.WatchLogLevel.None; var log = watchLogLevel !== ts.WatchLogLevel.None ? (function (s) { return _this.logger.info(s); }) : ts.noop; + this.packageJsonCache = server.createPackageJsonCache(this); this.watchFactory = this.syntaxOnly ? { watchFile: ts.returnNoopFileWatcher, @@ -148142,9 +148810,9 @@ var ts; this.eventHandler(event); }; /* @internal */ - ProjectService.prototype.sendUpdateGraphPerformanceEvent = function (durationMs) { + ProjectService.prototype.sendPerformanceEvent = function (kind, durationMs) { if (this.performanceEventHandler) { - this.performanceEventHandler({ kind: "UpdateGraph", durationMs: durationMs }); + this.performanceEventHandler({ kind: kind, durationMs: durationMs }); } }; /* @internal */ @@ -148357,6 +149025,7 @@ var ts; /*@internal*/ ProjectService.prototype.watchWildcardDirectory = function (directory, flags, project) { var _this = this; + var watchOptions = this.getWatchOptions(project); return this.watchFactory.watchDirectory(this.host, directory, function (fileOrDirectory) { var fileOrDirectoryPath = _this.toPath(fileOrDirectory); var fsResult = project.getCachedDirectoryStructureHost().addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath); @@ -148364,7 +149033,7 @@ var ts; if (ts.getBaseFileName(fileOrDirectoryPath) === "package.json" && !ts.isInsideNodeModules(fileOrDirectoryPath) && (fsResult && fsResult.fileExists || !fsResult && _this.host.fileExists(fileOrDirectoryPath))) { _this.logger.info("Project: " + configFileName + " Detected new package.json: " + fileOrDirectory); - project.onAddPackageJson(fileOrDirectoryPath); + _this.onAddPackageJson(fileOrDirectoryPath); } if (ts.isIgnoredFileFromWildCardWatching({ watchedDirPath: directory, @@ -148399,7 +149068,7 @@ var ts; project.pendingReload = ts.ConfigFileProgramReloadLevel.Partial; _this.delayUpdateProjectGraphAndEnsureProjectStructureForOpenFiles(project); } - }, flags, this.getWatchOptions(project), ts.WatchType.WildcardDirectory, project); + }, flags, watchOptions, ts.WatchType.WildcardDirectory, project); }; /** Gets the config file existence info for the configured project */ /*@internal*/ @@ -149091,7 +149760,7 @@ var ts; }; } project.configFileSpecs = parsedCommandLine.configFileSpecs; - project.canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(parsedCommandLine.raw); + project.canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(parsedCommandLine.raw); project.setProjectErrors(configFileErrors); project.updateReferences(parsedCommandLine.projectReferences); var lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, compilerOptions, parsedCommandLine.fileNames, fileNamePropertyReader); @@ -149195,6 +149864,10 @@ var ts; this.updateNonInferredProjectFiles(project, fileNamesResult.fileNames.concat(project.getExternalFiles()), fileNamePropertyReader); return project.updateGraph(); }; + /*@internal*/ + ProjectService.prototype.setFileNamesOfAutoImportProviderProject = function (project, fileNames) { + this.updateNonInferredProjectFiles(project, fileNames, fileNamePropertyReader); + }; /** * Read the config file of the project again by clearing the cache and update the project graph */ @@ -149682,7 +150355,7 @@ var ts; this.logger.info("Format host information updated"); } if (args.preferences) { - var lazyConfiguredProjectsFromExternalProject = this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject; + var _a = this.hostConfiguration.preferences, lazyConfiguredProjectsFromExternalProject = _a.lazyConfiguredProjectsFromExternalProject, includePackageJsonAutoImports = _a.includePackageJsonAutoImports; this.hostConfiguration.preferences = __assign(__assign({}, this.hostConfiguration.preferences), args.preferences); if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) { // Load configured projects for external projects that are pending reload @@ -149694,6 +150367,9 @@ var ts; } }); } + if (includePackageJsonAutoImports !== args.preferences.includePackageJsonAutoImports) { + this.invalidateProjectAutoImports(/*packageJsonPath*/ undefined); + } } if (args.extraFileExtensions) { this.hostConfiguration.extraFileExtensions = args.extraFileExtensions; @@ -150125,7 +150801,7 @@ var ts; var toRemoveScriptInfos = ts.cloneMap(this.filenameToScriptInfo); this.filenameToScriptInfo.forEach(function (info) { // If script info is open or orphan, retain it and its dependencies - if (!info.isScriptOpen() && info.isOrphan()) { + if (!info.isScriptOpen() && info.isOrphan() && !info.isContainedByAutoImportProvider()) { // Otherwise if there is any source info that is alive, this alive too if (!info.sourceMapFilePath) return; @@ -150581,6 +151257,85 @@ var ts; this.currentPluginConfigOverrides = this.currentPluginConfigOverrides || ts.createMap(); this.currentPluginConfigOverrides.set(args.pluginName, args.configuration); }; + /*@internal*/ + ProjectService.prototype.getPackageJsonsVisibleToFile = function (fileName, rootDir) { + var packageJsonCache = this.packageJsonCache; + var watchPackageJsonFile = this.watchPackageJsonFile.bind(this); + var toPath = this.toPath.bind(this); + var rootPath = rootDir && toPath(rootDir); + var filePath = toPath(fileName); + var result = []; + ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), function processDirectory(directory) { + switch (packageJsonCache.directoryHasPackageJson(directory)) { + // Sync and check same directory again + case 1 /* Maybe */: + packageJsonCache.searchDirectoryAndAncestors(directory); + return processDirectory(directory); + // Check package.json + case -1 /* True */: + var packageJsonFileName = ts.combinePaths(directory, "package.json"); + watchPackageJsonFile(packageJsonFileName); + var info = packageJsonCache.getInDirectory(directory); + if (info) + result.push(info); + } + if (rootPath && rootPath === toPath(directory)) { + return true; + } + }); + return result; + }; + /*@internal*/ + ProjectService.prototype.watchPackageJsonFile = function (path) { + var _this = this; + var watchers = this.packageJsonFilesMap || (this.packageJsonFilesMap = ts.createMap()); + if (!watchers.has(path)) { + this.invalidateProjectAutoImports(path); + watchers.set(path, this.watchFactory.watchFile(this.host, path, function (fileName, eventKind) { + var path = _this.toPath(fileName); + switch (eventKind) { + case ts.FileWatcherEventKind.Created: + return ts.Debug.fail(); + case ts.FileWatcherEventKind.Changed: + _this.packageJsonCache.addOrUpdate(path); + _this.invalidateProjectAutoImports(path); + break; + case ts.FileWatcherEventKind.Deleted: + _this.packageJsonCache.delete(path); + _this.invalidateProjectAutoImports(path); + watchers.get(path).close(); + watchers.delete(path); + } + }, ts.PollingInterval.Low, this.hostConfiguration.watchOptions, ts.WatchType.PackageJsonFile)); + } + }; + /*@internal*/ + ProjectService.prototype.onAddPackageJson = function (path) { + this.packageJsonCache.addOrUpdate(path); + this.watchPackageJsonFile(path); + }; + /*@internal*/ + ProjectService.prototype.includePackageJsonAutoImports = function () { + switch (this.hostConfiguration.preferences.includePackageJsonAutoImports) { + case "none": return 0 /* None */; + case "all": return 2 /* All */; + default: return 1 /* ExcludeDevDependencies */; + } + }; + /*@internal*/ + ProjectService.prototype.invalidateProjectAutoImports = function (packageJsonPath) { + if (this.includePackageJsonAutoImports()) { + this.configuredProjects.forEach(invalidate); + this.inferredProjects.forEach(invalidate); + this.externalProjects.forEach(invalidate); + } + function invalidate(project) { + var _a; + if (!packageJsonPath || ((_a = project.packageJsonsForAutoImport) === null || _a === void 0 ? void 0 : _a.has(packageJsonPath))) { + project.markAutoImportProviderAsDirty(); + } + } + }; /** Makes a filename safe to insert in a RegExp */ ProjectService.filenameEscapeRegexp = /[-\/\\^$*+?.()|[\]{}]/g; return ProjectService; @@ -150601,11 +151356,13 @@ var ts; (function (ts) { var server; (function (server) { - function createPackageJsonCache(project) { + function createPackageJsonCache(host) { var packageJsons = ts.createMap(); var directoriesWithoutPackageJson = ts.createMap(); return { addOrUpdate: addOrUpdate, + forEach: packageJsons.forEach.bind(packageJsons), + get: packageJsons.get.bind(packageJsons), delete: function (fileName) { packageJsons.delete(fileName); directoriesWithoutPackageJson.set(ts.getDirectoryPath(fileName), true); @@ -150619,8 +151376,8 @@ var ts; if (directoryHasPackageJson(ancestor) !== 1 /* Maybe */) { return true; } - var packageJsonFileName = project.toPath(ts.combinePaths(ancestor, "package.json")); - if (ts.tryFileExists(project, packageJsonFileName)) { + var packageJsonFileName = host.toPath(ts.combinePaths(ancestor, "package.json")); + if (ts.tryFileExists(host, packageJsonFileName)) { addOrUpdate(packageJsonFileName); } else { @@ -150630,7 +151387,7 @@ var ts; }, }; function addOrUpdate(fileName) { - var packageJsonInfo = ts.createPackageJsonInfo(fileName, project); + var packageJsonInfo = ts.createPackageJsonInfo(fileName, host.host); if (packageJsonInfo !== undefined) { packageJsons.set(fileName, packageJsonInfo); directoriesWithoutPackageJson.delete(ts.getDirectoryPath(fileName)); @@ -151509,12 +152266,21 @@ var ts; Session.prototype.sendRequestCompletedEvent = function (requestId) { this.event({ request_seq: requestId }, "requestCompleted"); }; + Session.prototype.addPerformanceData = function (key, value) { + var _a; + if (!this.performanceData) { + this.performanceData = {}; + } + this.performanceData[key] = ((_a = this.performanceData[key]) !== null && _a !== void 0 ? _a : 0) + value; + }; Session.prototype.performanceEventHandler = function (event) { switch (event.kind) { - case "UpdateGraph": { - this.updateGraphDurationMs = (this.updateGraphDurationMs || 0) + event.durationMs; + case "UpdateGraph": + this.addPerformanceData("updateGraphDurationMs", event.durationMs); + break; + case "CreatePackageJsonAutoImportProvider": + this.addPerformanceData("createAutoImportProviderProgramDurationMs", event.durationMs); break; - } } }; Session.prototype.defaultEventHandler = function (event) { @@ -151642,11 +152408,7 @@ var ts; command: cmdName, request_seq: reqSeq, success: success, - performanceData: !this.updateGraphDurationMs - ? undefined - : { - updateGraphDurationMs: this.updateGraphDurationMs, - }, + performanceData: this.performanceData }; if (success) { var metadata = void 0; @@ -152351,10 +153113,10 @@ var ts; var prefix = args.prefix || ""; var entries = ts.mapDefined(completions.entries, function (entry) { if (completions.isMemberCompletion || ts.startsWith(entry.name.toLowerCase(), prefix.toLowerCase())) { - var name = entry.name, kind_1 = entry.kind, kindModifiers = entry.kindModifiers, sortText = entry.sortText, insertText = entry.insertText, replacementSpan = entry.replacementSpan, hasAction = entry.hasAction, source = entry.source, isRecommended = entry.isRecommended; + var name = entry.name, kind_1 = entry.kind, kindModifiers = entry.kindModifiers, sortText = entry.sortText, insertText = entry.insertText, replacementSpan = entry.replacementSpan, hasAction = entry.hasAction, source = entry.source, isRecommended = entry.isRecommended, isPackageJsonImport = entry.isPackageJsonImport; var convertedSpan = replacementSpan ? toProtocolTextSpan(replacementSpan, scriptInfo) : undefined; // Use `hasAction || undefined` to avoid serializing `false`. - return { name: name, kind: kind_1, kindModifiers: kindModifiers, sortText: sortText, insertText: insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source: source, isRecommended: isRecommended }; + return { name: name, kind: kind_1, kindModifiers: kindModifiers, sortText: sortText, insertText: insertText, replacementSpan: convertedSpan, hasAction: hasAction || undefined, source: source, isRecommended: isRecommended, isPackageJsonImport: isPackageJsonImport }; } }).sort(function (a, b) { return ts.compareStringsCaseSensitiveUI(a.name, b.name); }); if (kind === "completions" /* Completions */) { @@ -152932,7 +153694,7 @@ var ts; }; Session.prototype.onMessage = function (message) { this.gcTimer.scheduleCollect(); - this.updateGraphDurationMs = undefined; + this.performanceData = undefined; var start; if (this.logger.hasLevel(server.LogLevel.requestTime)) { start = this.hrtime(); diff --git a/lib/typescript.d.ts b/lib/typescript.d.ts index dcee9ad7b10..2c90be1c80b 100644 --- a/lib/typescript.d.ts +++ b/lib/typescript.d.ts @@ -2538,9 +2538,19 @@ declare namespace ts { } export interface GenericType extends InterfaceType, TypeReference { } + export enum ElementFlags { + Required = 1, + Optional = 2, + Rest = 4, + Variadic = 8, + Variable = 12 + } export interface TupleType extends GenericType { + elementFlags: readonly ElementFlags[]; minLength: number; + fixedLength: number; hasRestElement: boolean; + combinedFlags: ElementFlags; readonly: boolean; labeledElementDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[]; } @@ -3789,6 +3799,8 @@ declare namespace ts { readonly importModuleSpecifierEnding?: "auto" | "minimal" | "index" | "js"; readonly allowTextChangesInNewFiles?: boolean; readonly providePrefixAndSuffixTextForRename?: boolean; + readonly includePackageJsonAutoImports?: "exclude-dev" | "all" | "none"; + readonly provideRefactorNotApplicableReason?: boolean; } /** Represents a bigint literal value without requiring bigint support */ export interface PseudoBigInt { @@ -5278,6 +5290,10 @@ declare namespace ts { fileName: Path; packageName: string; } + interface PerformanceEvent { + kind: "UpdateGraph" | "CreatePackageJsonAutoImportProvider"; + durationMs: number; + } interface LanguageServiceHost extends GetEffectiveTypeRootsHost { getCompilationSettings(): CompilerOptions; getNewLine?(): string; @@ -5660,6 +5676,11 @@ declare namespace ts { * so this description should make sense by itself if the parent is inlineable=true */ description: string; + /** + * A message to show to the user if the refactoring cannot be applied in + * the current context. + */ + notApplicableReason?: string; } /** * A set of edits to make in response to a refactor action, plus an optional @@ -5937,6 +5958,7 @@ declare namespace ts { source?: string; isRecommended?: true; isFromUncheckedFile?: true; + isPackageJsonImport?: true; } interface CompletionEntryDetails { name: string; diff --git a/lib/typescript.js b/lib/typescript.js index a03b3a6bc45..756858b64d1 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -244,7 +244,7 @@ var ts; // If changing the text in this section, be sure to test `configurePrerelease` too. ts.versionMajorMinor = "4.0"; /** The version of the TypeScript compiler release */ - ts.version = ts.versionMajorMinor + ".0-dev"; + ts.version = ts.versionMajorMinor + ".0-beta"; /** * Returns the native Map implementation if it is available and compatible (i.e. supports iteration). */ @@ -1352,6 +1352,14 @@ var ts; return values; } ts.getOwnValues = getOwnValues; + function arrayOf(count, f) { + var result = new Array(count); + for (var i = 0; i < count; i++) { + result[i] = f(i); + } + return result; + } + ts.arrayOf = arrayOf; function arrayFrom(iterator, map) { var result = []; for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) { @@ -4288,6 +4296,14 @@ var ts; VarianceFlags[VarianceFlags["Unreliable"] = 16] = "Unreliable"; VarianceFlags[VarianceFlags["AllowsStructuralFallback"] = 24] = "AllowsStructuralFallback"; })(VarianceFlags = ts.VarianceFlags || (ts.VarianceFlags = {})); + var ElementFlags; + (function (ElementFlags) { + ElementFlags[ElementFlags["Required"] = 1] = "Required"; + ElementFlags[ElementFlags["Optional"] = 2] = "Optional"; + ElementFlags[ElementFlags["Rest"] = 4] = "Rest"; + ElementFlags[ElementFlags["Variadic"] = 8] = "Variadic"; + ElementFlags[ElementFlags["Variable"] = 12] = "Variable"; + })(ElementFlags = ts.ElementFlags || (ts.ElementFlags = {})); /* @internal */ var JsxReferenceKind; (function (JsxReferenceKind) { @@ -7580,6 +7596,11 @@ var ts; Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), + Source_has_0_element_s_but_target_requires_1: diag(2618, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), + Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), + Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), + Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), + Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other: diag(2622, ts.DiagnosticCategory.Error, "Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other_2622", "Element at index {0} is variadic in one type but not in the other."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), @@ -8410,6 +8431,17 @@ var ts; Convert_to_named_function: diag(95124, ts.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: diag(95125, ts.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: diag(95126, ts.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"), + Could_not_find_a_containing_arrow_function: diag(95127, ts.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), + Containing_function_is_not_an_arrow_function: diag(95128, ts.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), + Could_not_find_export_statement: diag(95129, ts.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"), + This_file_already_has_a_default_export: diag(95130, ts.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"), + Could_not_find_import_clause: diag(95131, ts.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"), + Could_not_find_namespace_import_or_named_imports: diag(95132, ts.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), + Selection_is_not_a_valid_type_node: diag(95133, ts.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), + No_type_could_be_extracted_from_this_type_node: diag(95134, ts.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), + Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), + Name_is_not_valid: diag(95136, ts.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"), + Can_only_convert_property_with_modifier: diag(95137, ts.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: diag(18006, ts.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), @@ -29915,7 +29947,7 @@ var ts; type = finishNode(factory.createJSDocNonNullableType(type), pos); break; case 57 /* QuestionToken */: - // If not in JSDoc and next token is start of a type we have a conditional type + // If next token is start of a type we have a conditional type if (lookAhead(nextTokenIsStartOfType)) { return type; } @@ -36720,7 +36752,7 @@ var ts; includeSpecs = ["**/*"]; } var result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile); - if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) { + if (shouldReportNoInputFiles(result, canJsonReportNoInputFiles(raw), resolutionStack)) { errors.push(getErrorForNoInputFiles(result.spec, configFileName)); } if (ts.hasProperty(raw, "references") && !isNullOrUndefined(raw.references)) { @@ -36763,10 +36795,10 @@ var ts; return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0); } /*@internal*/ - function canJsonReportNoInutFiles(raw) { + function canJsonReportNoInputFiles(raw) { return !ts.hasProperty(raw, "files") && !ts.hasProperty(raw, "references"); } - ts.canJsonReportNoInutFiles = canJsonReportNoInutFiles; + ts.canJsonReportNoInputFiles = canJsonReportNoInputFiles; /*@internal*/ function updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) { var existingErrors = configParseDiagnostics.length; @@ -42572,6 +42604,7 @@ var ts; getAllPossiblePropertiesOfTypes: getAllPossiblePropertiesOfTypes, getSuggestedSymbolForNonexistentProperty: getSuggestedSymbolForNonexistentProperty, getSuggestionForNonexistentProperty: getSuggestionForNonexistentProperty, + getSuggestedSymbolForNonexistentJSXAttribute: getSuggestedSymbolForNonexistentJSXAttribute, getSuggestedSymbolForNonexistentSymbol: function (location, name, meaning) { return getSuggestedSymbolForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestionForNonexistentSymbol: function (location, name, meaning) { return getSuggestionForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestedSymbolForNonexistentModule: getSuggestedSymbolForNonexistentModule, @@ -46253,21 +46286,21 @@ var ts; if (typeArguments.length > 0) { var arity = getTypeReferenceArity(type); var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context); - var hasRestElement = type.target.hasRestElement; if (tupleConstituentNodes) { if (type.target.labeledElementDeclarations) { for (var i = 0; i < tupleConstituentNodes.length; i++) { - var isOptionalOrRest = i >= type.target.minLength; - var isRest = isOptionalOrRest && hasRestElement && i === arity - 1; - var isOptional = isOptionalOrRest && !isRest; - tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(isRest ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), isOptional ? ts.factory.createToken(57 /* QuestionToken */) : undefined, isRest ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]); + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(flags & 12 /* Variable */ ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), flags & 2 /* Optional */ ? ts.factory.createToken(57 /* QuestionToken */) : undefined, flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]); } } else { - for (var i = type.target.minLength; i < Math.min(arity, tupleConstituentNodes.length); i++) { - tupleConstituentNodes[i] = hasRestElement && i === arity - 1 ? - ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(tupleConstituentNodes[i])) : - ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]); + for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) { + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = + flags & 12 /* Variable */ ? ts.factory.createRestTypeNode(flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : + flags & 2 /* Optional */ ? ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]; } } var tupleTypeNode = ts.setEmitFlags(ts.factory.createTupleTypeNode(tupleConstituentNodes), 1 /* SingleLine */); @@ -49378,13 +49411,14 @@ var ts; function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) { var elements = pattern.elements; var lastElement = ts.lastOrUndefined(elements); - var hasRestElement = !!(lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken); - if (elements.length === 0 || elements.length === 1 && hasRestElement) { + var restElement = lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken ? lastElement : undefined; + if (elements.length === 0 || elements.length === 1 && restElement) { return languageVersion >= 2 /* ES2015 */ ? createIterableType(anyType) : anyArrayType; } var elementTypes = ts.map(elements, function (e) { return ts.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors); }); - var minLength = ts.findLastIndex(elements, function (e) { return !ts.isOmittedExpression(e) && !hasDefaultValue(e); }, elements.length - (hasRestElement ? 2 : 1)) + 1; - var result = createTupleType(elementTypes, minLength, hasRestElement); + var minLength = ts.findLastIndex(elements, function (e) { return !(e === restElement || ts.isOmittedExpression(e) || hasDefaultValue(e)); }, elements.length - 1) + 1; + var elementFlags = ts.map(elements, function (e, i) { return e === restElement ? 4 /* Rest */ : i >= minLength ? 2 /* Optional */ : 1 /* Required */; }); + var result = createTupleType(elementTypes, elementFlags); if (includePatternInType) { result = cloneTypeReference(result); result.pattern = pattern; @@ -50030,7 +50064,7 @@ var ts; function getBaseTypes(type) { if (!type.resolvedBaseTypes) { if (type.objectFlags & 8 /* Tuple */) { - type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters || ts.emptyArray), type.readonly)]; + type.resolvedBaseTypes = [getTupleBaseType(type)]; } else if (type.symbol.flags & (32 /* Class */ | 64 /* Interface */)) { if (type.symbol.flags & 32 /* Class */) { @@ -50046,6 +50080,10 @@ var ts; } return type.resolvedBaseTypes; } + function getTupleBaseType(type) { + var elementTypes = ts.sameMap(type.typeParameters, function (t, i) { return type.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t; }); + return createArrayType(getUnionType(elementTypes || ts.emptyArray), type.readonly); + } function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = ts.resolvingEmptyArray; var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); @@ -50846,17 +50884,16 @@ var ts; return [sig.parameters]; function expandSignatureParametersWithTupleMembers(restType, restIndex) { var elementTypes = getTypeArguments(restType); - var minLength = restType.target.minLength; - var tupleRestIndex = restType.target.hasRestElement ? elementTypes.length - 1 : -1; var associatedNames = restType.target.labeledElementDeclarations; var restParams = ts.map(elementTypes, function (t, i) { // Lookup the label from the individual tuple passed in before falling back to the signature `rest` parameter name var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]); var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i); - var checkFlags = i === tupleRestIndex ? 32768 /* RestParameter */ : - i >= minLength ? 16384 /* OptionalParameter */ : 0; + var flags = restType.target.elementFlags[i]; + var checkFlags = flags & 12 /* Variable */ ? 32768 /* RestParameter */ : + flags & 2 /* Optional */ ? 16384 /* OptionalParameter */ : 0; var symbol = createSymbol(1 /* FunctionScopedVariable */, name, checkFlags); - symbol.type = i === tupleRestIndex ? createArrayType(t) : t; + symbol.type = flags & 4 /* Rest */ ? createArrayType(t) : t; return symbol; }); return ts.concatenate(sig.parameters.slice(0, restIndex), restParams); @@ -51545,6 +51582,9 @@ var ts; return indexedAccess; } } + if (isGenericTupleType(type.objectType)) { + return getIndexTypeOfType(type.objectType, 1 /* Number */); + } var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType); if (objectConstraint && objectConstraint !== type.objectType) { return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType); @@ -51724,6 +51764,9 @@ var ts; return keyofConstraintType; } if (t.flags & 8388608 /* IndexedAccess */) { + if (isGenericTupleType(t.objectType)) { + return getIndexTypeOfType(t.objectType, 1 /* Number */); + } var baseObjectType = getBaseConstraint(t.objectType); var baseIndexType = getBaseConstraint(t.indexType); var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType); @@ -52642,9 +52685,11 @@ var ts; } } } - // When an 'infer T' declaration is immediately contained in a rest parameter - // declaration, we infer an 'unknown[]' constraint. - else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken) { + // When an 'infer T' declaration is immediately contained in a rest parameter declaration, a rest type + // or a named rest tuple element, we infer an 'unknown[]' constraint. + else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken || + grandParent.kind === 180 /* RestType */ || + grandParent.kind === 191 /* NamedTupleMember */ && grandParent.dotDotDotToken) { inferences = ts.append(inferences, createArrayType(unknownType)); } } @@ -52766,9 +52811,7 @@ var ts; } else { type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function () { return errorType; })) || ts.emptyArray; - error(type.node || currentNode, type.target.symbol - ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves - : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); + error(type.node || currentNode, type.target.symbol ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); } } return type.resolvedTypeArguments; @@ -53199,22 +53242,32 @@ var ts; function createArrayType(elementType, readonly) { return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]); } - function isTupleRestElement(node) { - return node.kind === 180 /* RestType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.dotDotDotToken); + function getTupleElementFlags(node) { + switch (node.kind) { + case 179 /* OptionalType */: + return 2 /* Optional */; + case 180 /* RestType */: + return getRestTypeElementFlags(node); + case 191 /* NamedTupleMember */: + return node.questionToken ? 2 /* Optional */ : + node.dotDotDotToken ? getRestTypeElementFlags(node) : + 1 /* Required */; + default: + return 1 /* Required */; + } } - function isTupleOptionalElement(node) { - return node.kind === 179 /* OptionalType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.questionToken); + function getRestTypeElementFlags(node) { + return getArrayElementTypeNode(node.type) ? 4 /* Rest */ : 8 /* Variadic */; } function getArrayOrTupleTargetType(node) { var readonly = isReadonlyTypeOperator(node.parent); - if (node.kind === 177 /* ArrayType */ || node.elements.length === 1 && isTupleRestElement(node.elements[0])) { + var elementType = getArrayElementTypeNode(node); + if (elementType) { return readonly ? globalReadonlyArrayType : globalArrayType; } - var lastElement = ts.lastOrUndefined(node.elements); - var restElement = lastElement && isTupleRestElement(lastElement) ? lastElement : undefined; - var minLength = ts.findLastIndex(node.elements, function (n) { return !isTupleOptionalElement(n) && n !== restElement; }) + 1; + var elementFlags = ts.map(node.elements, getTupleElementFlags); var missingName = ts.some(node.elements, function (e) { return e.kind !== 191 /* NamedTupleMember */; }); - return getTupleTypeOfArity(node.elements.length, minLength, !!restElement, readonly, /*associatedNames*/ missingName ? undefined : node.elements); + return getTupleTargetType(elementFlags, readonly, /*associatedNames*/ missingName ? undefined : node.elements); } // Return true if the given type reference node is directly aliased or if it needs to be deferred // because it is possibly contained in a circular chain of eagerly resolved types. @@ -53283,13 +53336,13 @@ var ts; if (target === emptyGenericType) { links.resolvedType = emptyObjectType; } - else if (isDeferredTypeReferenceNode(node)) { + else if (!(node.kind === 178 /* TupleType */ && ts.some(node.elements, function (e) { return !!(getTupleElementFlags(e) & 8 /* Variadic */); })) && isDeferredTypeReferenceNode(node)) { links.resolvedType = node.kind === 178 /* TupleType */ && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, /*mapper*/ undefined); } else { var elementTypes = node.kind === 177 /* ArrayType */ ? [getTypeFromTypeNode(node.elementType)] : ts.map(node.elements, getTypeFromTypeNode); - links.resolvedType = createTypeReference(target, elementTypes); + links.resolvedType = createNormalizedTypeReference(target, elementTypes); } } return links.resolvedType; @@ -53297,6 +53350,27 @@ var ts; function isReadonlyTypeOperator(node) { return ts.isTypeOperatorNode(node) && node.operator === 141 /* ReadonlyKeyword */; } + function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) { + if (readonly === void 0) { readonly = false; } + var tupleTarget = getTupleTargetType(elementFlags || ts.map(elementTypes, function (_) { return 1 /* Required */; }), readonly, namedMemberDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : + tupleTarget; + } + function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + if (elementFlags.length === 1 && elementFlags[0] & 4 /* Rest */) { + // [...X[]] is equivalent to just X[] + return readonly ? globalReadonlyArrayType : globalArrayType; + } + var key = ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? "#" : f & 2 /* Optional */ ? "?" : f & 4 /* Rest */ ? "." : "*"; }).join() + + (readonly ? "R" : "") + + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); + var type = tupleTypes.get(key); + if (!type) { + tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations)); + } + return type; + } // We represent tuple types as type references to synthesized generic interface types created by // this function. The types are of the form: // @@ -53304,27 +53378,37 @@ var ts; // // Note that the generic type created by this function has no symbol associated with it. The same // is true for each of the synthesized type parameters. - function createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { + function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + var arity = elementFlags.length; + var minLength = ts.findLastIndex(elementFlags, function (f) { return !!(f & (1 /* Required */ | 8 /* Variadic */)); }) + 1; var typeParameters; var properties = []; - var maxLength = hasRestElement ? arity - 1 : arity; + var combinedFlags = 0; if (arity) { typeParameters = new Array(arity); for (var i = 0; i < arity; i++) { var typeParameter = typeParameters[i] = createTypeParameter(); - if (i < maxLength) { - var property = createSymbol(4 /* Property */ | (i >= minLength ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); + var flags = elementFlags[i]; + combinedFlags |= flags; + if (!(combinedFlags & 12 /* Variable */)) { + var property = createSymbol(4 /* Property */ | (flags & 2 /* Optional */ ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i]; property.type = typeParameter; properties.push(property); } } } - var literalTypes = []; - for (var i = minLength; i <= maxLength; i++) - literalTypes.push(getLiteralType(i)); + var fixedLength = properties.length; var lengthSymbol = createSymbol(4 /* Property */, "length"); - lengthSymbol.type = hasRestElement ? numberType : getUnionType(literalTypes); + if (combinedFlags & 12 /* Variable */) { + lengthSymbol.type = numberType; + } + else { + var literalTypes_1 = []; + for (var i = minLength; i <= arity; i++) + literalTypes_1.push(getLiteralType(i)); + lengthSymbol.type = getUnionType(literalTypes_1); + } properties.push(lengthSymbol); var type = createObjectType(8 /* Tuple */ | 4 /* Reference */); type.typeParameters = typeParameters; @@ -53342,38 +53426,110 @@ var ts; type.declaredConstructSignatures = ts.emptyArray; type.declaredStringIndexInfo = undefined; type.declaredNumberIndexInfo = undefined; + type.elementFlags = elementFlags; type.minLength = minLength; - type.hasRestElement = hasRestElement; + type.fixedLength = fixedLength; + type.hasRestElement = !!(combinedFlags & 12 /* Variable */); + type.combinedFlags = combinedFlags; type.readonly = readonly; type.labeledElementDeclarations = namedMemberDeclarations; return type; } - function getTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { - var key = arity + (hasRestElement ? "+" : ",") + minLength + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); - var type = tupleTypes.get(key); - if (!type) { - tupleTypes.set(key, type = createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations)); - } - return type; + function createNormalizedTypeReference(target, typeArguments) { + return target.objectFlags & 8 /* Tuple */ && target.combinedFlags & 8 /* Variadic */ ? + createNormalizedTupleType(target, typeArguments) : + createTypeReference(target, typeArguments); } - function createTupleType(elementTypes, minLength, hasRestElement, readonly, namedMemberDeclarations) { - if (minLength === void 0) { minLength = elementTypes.length; } - if (hasRestElement === void 0) { hasRestElement = false; } - if (readonly === void 0) { readonly = false; } - var arity = elementTypes.length; - if (arity === 1 && hasRestElement) { - return createArrayType(elementTypes[0], readonly); + function createNormalizedTupleType(target, elementTypes) { + var _a, _b, _c; + // Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z] + var unionIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (131072 /* Never */ | 1048576 /* Union */)); }); + if (unionIndex >= 0) { + return mapType(elementTypes[unionIndex], function (t) { return createNormalizedTupleType(target, ts.replaceElement(elementTypes, unionIndex, t)); }); + } + // If there are no variadic elements with non-generic types, just create a type reference with the same target type. + var spreadIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */) && !(t.flags & 58982400 /* InstantiableNonPrimitive */) && !isGenericMappedType(t); }); + if (spreadIndex < 0) { + return createTypeReference(target, elementTypes); + } + // We have non-generic variadic elements that need normalization. + var expandedTypes = []; + var expandedFlags = []; + var expandedDeclarations = []; + var optionalIndex = -1; + var restTypes; + var _loop_12 = function (i) { + var type = elementTypes[i]; + var flags = target.elementFlags[i]; + if (flags & 8 /* Variadic */) { + if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + // Generic variadic elements stay as they are (except following a rest element). + addElementOrRest(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + } + else if (isTupleType(type)) { + // Spread variadic elements with tuple types into the resulting tuple. + ts.forEach(getTypeArguments(type), function (t, n) { var _a; return addElementOrRest(t, type.target.elementFlags[n], (_a = type.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[n]); }); + } + else { + // Treat everything else as an array type and create a rest element. + addElementOrRest(isArrayLikeType(type) && getIndexTypeOfType(type, 1 /* Number */) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i]); + } + } + else { + // Copy other element kinds with no change. + addElementOrRest(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i]); + } + }; + for (var i = 0; i < elementTypes.length; i++) { + _loop_12(i); + } + if (restTypes) { + // Create a union of the collected rest element types. + expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); + } + var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : + tupleTarget; + function addElementOrRest(type, flags, declaration) { + if (restTypes) { + // A rest element was previously added, so simply collect the type of this element. + restTypes.push(flags & 8 /* Variadic */ ? getIndexedAccessType(type, numberType) : type); + } + else { + if (flags & 1 /* Required */ && optionalIndex >= 0) { + // Turn preceding optional elements into required elements + for (var i = optionalIndex; i < expandedFlags.length; i++) { + if (expandedFlags[i] & 2 /* Optional */) + expandedFlags[i] = 1 /* Required */; + } + optionalIndex = -1; + } + else if (flags & 2 /* Optional */ && optionalIndex < 0) { + optionalIndex = expandedFlags.length; + } + else if (flags & 4 /* Rest */) { + // Start collecting element types when a rest element is added. + restTypes = [type]; + } + expandedTypes.push(type); + expandedFlags.push(flags); + if (expandedDeclarations && declaration) { + expandedDeclarations.push(declaration); + } + else { + expandedDeclarations = undefined; + } + } } - var tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, namedMemberDeclarations); - return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType; } - function sliceTupleType(type, index) { - var tuple = type.target; - if (tuple.hasRestElement) { - // don't slice off rest element - index = Math.min(index, getTypeReferenceArity(type) - 1); - } - return createTupleType(getTypeArguments(type).slice(index), Math.max(0, tuple.minLength - index), tuple.hasRestElement, tuple.readonly, tuple.labeledElementDeclarations && tuple.labeledElementDeclarations.slice(index)); + function sliceTupleType(type, index, endSkipCount) { + if (endSkipCount === void 0) { endSkipCount = 0; } + var target = type.target; + var endIndex = getTypeReferenceArity(type) - endSkipCount; + return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts.emptyArray) : + createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), + /*readonly*/ false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex)); } function getTypeFromOptionalTypeNode(node) { var type = getTypeFromTypeNode(node.type); @@ -53887,7 +54043,7 @@ var ts; type = getReducedType(type); return type.flags & 1048576 /* Union */ ? getIntersectionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : type.flags & 2097152 /* Intersection */ ? getUnionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : - maybeTypeOfKind(type, 58982400 /* InstantiableNonPrimitive */) ? getIndexTypeForGenericType(type, stringsOnly) : + type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericTupleType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts.getObjectFlags(type) & 32 /* Mapped */ ? filterType(getConstraintTypeFromMappedType(type), function (t) { return !(noIndexSignatures && t.flags & (1 /* Any */ | 4 /* String */)); }) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : @@ -54134,7 +54290,7 @@ var ts; } return !!(type.objectFlags & 8388608 /* IsGenericObjectType */); } - return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type); + return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type) || isGenericTupleType(type); } function isGenericIndexType(type) { if (type.flags & 3145728 /* UnionOrIntersection */) { @@ -54208,6 +54364,15 @@ var ts; } // So ultimately (reading): // ((A & B) | C)[K1 | K2] -> ((A & B) | C)[K1] | ((A & B) | C)[K2] -> (A & B)[K1] | C[K1] | (A & B)[K2] | C[K2] -> (A[K1] & B[K1]) | C[K1] | (A[K2] & B[K2]) | C[K2] + // A generic tuple type indexed by a number exists only when the index type doesn't select a + // fixed element. We simplify to either the combined type of all elements (when the index type + // the actual number type) or to the combined type of all non-fixed elements. + if (isGenericTupleType(objectType) && indexType.flags & 296 /* NumberLike */) { + var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 /* Number */ ? 0 : objectType.target.fixedLength, /*endSkipCount*/ 0, writing); + if (elementType) { + return type[cache] = elementType; + } + } // If the object type is a mapped type { [P in K]: E }, where K is generic, instantiate E using a mapper // that substitutes the index type for P. For example, for an index access { [P in K]: Box }[X], we // construct the type Box. @@ -54254,6 +54419,18 @@ var ts; function getIndexedAccessType(objectType, indexType, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, 0 /* None */, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } + function indexTypeLessThan(indexType, limit) { + return everyType(indexType, function (t) { + if (t.flags & 384 /* StringOrNumberLiteral */) { + var propName = getPropertyNameFromType(t); + if (isNumericLiteralName(propName)) { + var index = +propName; + return index >= 0 && index < limit; + } + } + return false; + }); + } function getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, accessFlags, aliasSymbol, aliasTypeArguments) { if (accessFlags === void 0) { accessFlags = 0 /* None */; } if (objectType === wildcardType || indexType === wildcardType) { @@ -54264,12 +54441,15 @@ var ts; if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { indexType = stringType; } - // If the index type is generic, or if the object type is generic and doesn't originate in an expression, - // we are performing a higher-order index access where we cannot meaningfully access the properties of the - // object type. Note that for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in - // an expression. This is to preserve backwards compatibility. For example, an element access 'this["foo"]' - // has always been resolved eagerly using the constraint type of 'this' at the given location. - if (isGenericIndexType(indexType) || !(accessNode && accessNode.kind !== 188 /* IndexedAccessType */) && isGenericObjectType(objectType)) { + // If the index type is generic, or if the object type is generic and doesn't originate in an expression and + // the operation isn't exclusively indexing the fixed (non-variadic) portion of a tuple type, we are performing + // a higher-order index access where we cannot meaningfully access the properties of the object type. Note that + // for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in an expression. This is to + // preserve backwards compatibility. For example, an element access 'this["foo"]' has always been resolved + // eagerly using the constraint type of 'this' at the given location. + if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 188 /* IndexedAccessType */ ? + isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : + isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) { if (objectType.flags & 3 /* AnyOrUnknown */) { return objectType; } @@ -54351,7 +54531,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_12 = function () { + var _loop_13 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54425,7 +54605,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_12(); + var state_4 = _loop_13(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -54863,19 +55043,32 @@ var ts; } return links.resolvedType; } + function getTypeFromRestTypeNode(node) { + return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type); + } + function getArrayElementTypeNode(node) { + switch (node.kind) { + case 185 /* ParenthesizedType */: + return getArrayElementTypeNode(node.type); + case 178 /* TupleType */: + if (node.elements.length === 1) { + node = node.elements[0]; + if (node.kind === 180 /* RestType */ || node.kind === 191 /* NamedTupleMember */ && node.dotDotDotToken) { + return getArrayElementTypeNode(node.type); + } + } + break; + case 177 /* ArrayType */: + return node.elementType; + } + return undefined; + } function getTypeFromNamedTupleTypeNode(node) { var links = getNodeLinks(node); - if (!links.resolvedType) { - var type = getTypeFromTypeNode(node.type); - if (node.dotDotDotToken) { - type = getElementTypeOfArrayType(type) || errorType; - } - if (node.questionToken && strictNullChecks) { - type = getOptionalType(type); - } - links.resolvedType = type; - } - return links.resolvedType; + return links.resolvedType || (links.resolvedType = + node.dotDotDotToken ? getTypeFromRestTypeNode(node) : + node.questionToken && strictNullChecks ? getOptionalType(getTypeFromTypeNode(node.type)) : + getTypeFromTypeNode(node.type)); } function getTypeFromTypeNode(node) { return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node); @@ -54943,7 +55136,7 @@ var ts; case 298 /* JSDocTypeExpression */: return getTypeFromTypeNode(node.type); case 180 /* RestType */: - return getElementTypeOfArrayType(getTypeFromTypeNode(node.type)) || errorType; + return getTypeFromRestTypeNode(node); case 305 /* JSDocVariadicType */: return getTypeFromJSDocVariadicType(node); case 173 /* FunctionType */: @@ -55235,6 +55428,9 @@ var ts; if (typeVariable !== mappedTypeVariable) { return mapType(getReducedType(mappedTypeVariable), function (t) { if (t.flags & (3 /* AnyOrUnknown */ | 58982400 /* InstantiableNonPrimitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && t !== wildcardType && t !== errorType) { + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } var replacementMapper = prependTypeMapping(typeVariable, t, mapper); return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) : isTupleType(t) ? instantiateMappedTupleType(t, type, replacementMapper) : @@ -55249,23 +55445,39 @@ var ts; function getModifiedReadonlyState(state, modifiers) { return modifiers & 1 /* IncludeReadonly */ ? true : modifiers & 2 /* ExcludeReadonly */ ? false : state; } + function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) { + // When a tuple type is generic (i.e. when it contains variadic elements), we want to eagerly map the + // non-generic elements and defer mapping the generic elements. In order to facilitate this, we transform + // M<[A, B?, ...T, ...C[]] into [...M<[A]>, ...M<[B?]>, ...M, ...M] and then rely on tuple type + // normalization to resolve the non-generic parts of the resulting tuple. + var elementFlags = tupleType.target.elementFlags; + var elementTypes = ts.map(getTypeArguments(tupleType), function (t, i) { + var singleton = elementFlags[i] & 8 /* Variadic */ ? t : + elementFlags[i] & 4 /* Rest */ ? createArrayType(t) : + createTupleType([t], [elementFlags[i]]); + // The singleton is never a generic tuple type, so it is safe to recurse here. + return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); + }); + var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); + return createTupleType(elementTypes, ts.map(elementTypes, function (_) { return 8 /* Variadic */; }), newReadonly); + } function instantiateMappedArrayType(arrayType, mappedType, mapper) { var elementType = instantiateMappedTypeTemplate(mappedType, numberType, /*isOptional*/ true, mapper); return elementType === errorType ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); } function instantiateMappedTupleType(tupleType, mappedType, mapper) { - var minLength = tupleType.target.minLength; + var elementFlags = tupleType.target.elementFlags; var elementTypes = ts.map(getTypeArguments(tupleType), function (_, i) { - return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), i >= minLength, mapper); + return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), !!(elementFlags[i] & 2 /* Optional */), mapper); }); var modifiers = getMappedTypeModifiers(mappedType); - var newMinLength = modifiers & 4 /* IncludeOptional */ ? 0 : - modifiers & 8 /* ExcludeOptional */ ? getTypeReferenceArity(tupleType) - (tupleType.target.hasRestElement ? 1 : 0) : - minLength; + var newTupleModifiers = modifiers & 4 /* IncludeOptional */ ? ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? 2 /* Optional */ : f; }) : + modifiers & 8 /* ExcludeOptional */ ? ts.map(elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + elementFlags; var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); return ts.contains(elementTypes, errorType) ? errorType : - createTupleType(elementTypes, newMinLength, tupleType.target.hasRestElement, newReadonly, tupleType.target.labeledElementDeclarations); + createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); } function instantiateMappedTypeTemplate(type, key, isOptional, mapper) { var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); @@ -55362,7 +55574,7 @@ var ts; if (objectFlags & 4 /* Reference */ && !(type.node)) { var resolvedTypeArguments = type.resolvedTypeArguments; var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper); - return newTypeArguments !== resolvedTypeArguments ? createTypeReference(type.target, newTypeArguments) : type; + return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type; } return getObjectTypeInstantiation(type, mapper); } @@ -56871,7 +57083,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_13 = function (prop) { + var _loop_14 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56886,13 +57098,20 @@ var ts; if (ts.isJsxAttributes(errorNode) || ts.isJsxOpeningLikeElement(errorNode) || ts.isJsxOpeningLikeElement(errorNode.parent)) { // JsxAttributes has an object-literal flag and undergo same type-assignablity check as normal object-literal. // However, using an object-literal error message will be very confusing to the users so we give different a message. - // TODO: Spelling suggestions for excess jsx attributes (needs new diagnostic messages) if (prop.valueDeclaration && ts.isJsxAttribute(prop.valueDeclaration) && ts.getSourceFileOfNode(errorNode) === ts.getSourceFileOfNode(prop.valueDeclaration.name)) { // Note that extraneous children (as in `extra`) don't pass this check, // since `children` is a SyntaxKind.PropertySignature instead of a SyntaxKind.JsxAttribute. errorNode = prop.valueDeclaration.name; } - reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(errorTarget)); + var propName = symbolToString(prop); + var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget); + var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined; + if (suggestion) { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion); + } + else { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget)); + } } else { // use the property's value declaration if the property is assigned inside the literal itself @@ -56927,7 +57146,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_13(prop); + var state_5 = _loop_14(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57218,6 +57437,12 @@ var ts; return varianceResult; } } + // For a generic type T, [...T] is assignable to T, T is assignable to readonly [...T], and T is assignable + // to [...T] when T is constrained to a mutable array or tuple type. + if (isSingleElementGenericTupleType(source) && getTypeArguments(source)[0] === target && !source.target.readonly || + isSingleElementGenericTupleType(target) && getTypeArguments(target)[0] === source && (target.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source) || source))) { + return -1 /* True */; + } if (target.flags & 262144 /* TypeParameter */) { // A source type { [P in Q]: X } is related to a target type T if keyof T is related to Q and X is related to T[Q]. if (ts.getObjectFlags(source) & 32 /* Mapped */ && isRelatedTo(getIndexType(target), getConstraintTypeFromMappedType(source))) { @@ -57594,11 +57819,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_14 = function (combination) { + var _loop_15 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_15 = function (i) { + var _loop_16 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57614,7 +57839,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_15(i); + var state_7 = _loop_16(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57628,7 +57853,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_14(combination); + var state_6 = _loop_15(combination); if (typeof state_6 === "object") return state_6.value; } @@ -57817,6 +58042,80 @@ var ts; if (relation === identityRelation) { return propertiesIdenticalTo(source, target, excludedProperties); } + var result = -1 /* True */; + if (isTupleType(target)) { + if (isArrayType(source) || isTupleType(source)) { + if (!target.target.readonly && (isReadonlyArrayType(source) || isTupleType(source) && source.target.readonly)) { + return 0 /* False */; + } + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var sourceRestFlag = isTupleType(source) ? source.target.combinedFlags & 4 /* Rest */ : 4 /* Rest */; + var targetRestFlag = target.target.combinedFlags & 4 /* Rest */; + var sourceMinLength = isTupleType(source) ? source.target.minLength : 0; + var targetMinLength = target.target.minLength; + if (!sourceRestFlag && sourceArity < targetMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength); + } + return 0 /* False */; + } + if (!targetRestFlag && targetArity < sourceMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity); + } + return 0 /* False */; + } + if (!targetRestFlag && sourceRestFlag) { + if (reportErrors) { + if (sourceMinLength < targetMinLength) { + reportError(ts.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength); + } + else { + reportError(ts.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity); + } + } + return 0 /* False */; + } + var maxArity = Math.max(sourceArity, targetArity); + for (var i = 0; i < maxArity; i++) { + var targetFlags = i < targetArity ? target.target.elementFlags[i] : targetRestFlag; + var sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag; + if (sourceFlags && targetFlags) { + if (targetFlags & 8 /* Variadic */ && !(sourceFlags & 8 /* Variadic */) || + (sourceFlags & 8 /* Variadic */ && !(targetFlags & 12 /* Variable */))) { + if (reportErrors) { + reportError(ts.Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i); + } + return 0 /* False */; + } + if (targetFlags & 1 /* Required */) { + if (!(sourceFlags & 1 /* Required */)) { + if (reportErrors) { + reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, i, typeToString(source), typeToString(target)); + } + return 0 /* False */; + } + } + var sourceType = getTypeArguments(source)[Math.min(i, sourceArity - 1)]; + var targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)]; + var targetCheckType = sourceFlags & 8 /* Variadic */ && targetFlags & 4 /* Rest */ ? createArrayType(targetType) : targetType; + var related = isRelatedTo(sourceType, targetCheckType, reportErrors, /*headMessage*/ undefined, intersectionState); + if (!related) { + if (reportErrors) { + reportIncompatibleError(ts.Diagnostics.Types_of_property_0_are_incompatible, i); + } + return 0 /* False */; + } + result &= related; + } + } + return result; + } + if (target.target.combinedFlags & 12 /* Variable */) { + return 0 /* False */; + } + } var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source) && !isEmptyArrayLiteralType(source) && !isTupleType(source); var unmatchedProperty = getUnmatchedProperty(source, target, requireOptionalProperties, /*matchDiscriminantProperties*/ false); if (unmatchedProperty) { @@ -57839,35 +58138,6 @@ var ts; } } } - var result = -1 /* True */; - if (isTupleType(target)) { - var targetRestType = getRestTypeOfTupleType(target); - if (targetRestType) { - if (!isTupleType(source)) { - return 0 /* False */; - } - var sourceRestType = getRestTypeOfTupleType(source); - if (sourceRestType && !isRelatedTo(sourceRestType, targetRestType, reportErrors)) { - if (reportErrors) { - reportError(ts.Diagnostics.Rest_signatures_are_incompatible); - } - return 0 /* False */; - } - var targetCount = getTypeReferenceArity(target) - 1; - var sourceCount = getTypeReferenceArity(source) - (sourceRestType ? 1 : 0); - var sourceTypeArguments = getTypeArguments(source); - for (var i = targetCount; i < sourceCount; i++) { - var related = isRelatedTo(sourceTypeArguments[i], targetRestType, reportErrors); - if (!related) { - if (reportErrors) { - reportError(ts.Diagnostics.Property_0_is_incompatible_with_rest_element_type, "" + i); - } - return 0 /* False */; - } - result &= related; - } - } - } // We only call this for union target types when we're attempting to do excess property checking - in those cases, we want to get _all possible props_ // from the target union, across all members var properties = getPropertiesOfType(target); @@ -58225,7 +58495,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_16 = function (tp) { + var _loop_17 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58257,7 +58527,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_16(tp); + _loop_17(tp); } cache.variances = variances; } @@ -58680,15 +58950,40 @@ var ts; function isTupleType(type) { return !!(ts.getObjectFlags(type) & 4 /* Reference */ && type.target.objectFlags & 8 /* Tuple */); } + function isGenericTupleType(type) { + return isTupleType(type) && !!(type.target.combinedFlags & 8 /* Variadic */); + } + function isSingleElementGenericTupleType(type) { + return isGenericTupleType(type) && type.target.elementFlags.length === 1; + } function getRestTypeOfTupleType(type) { - return type.target.hasRestElement ? getTypeArguments(type)[type.target.typeParameters.length - 1] : undefined; + return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength); } function getRestArrayTypeOfTupleType(type) { var restType = getRestTypeOfTupleType(type); return restType && createArrayType(restType); } - function getLengthOfTupleType(type) { - return getTypeReferenceArity(type) - (type.target.hasRestElement ? 1 : 0); + function getEndLengthOfType(type) { + return isTupleType(type) ? getTypeReferenceArity(type) - ts.findLastIndex(type.target.elementFlags, function (f) { return !!(f & 12 /* Variable */); }) - 1 : 0; + } + function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) { + if (endSkipCount === void 0) { endSkipCount = 0; } + if (writing === void 0) { writing = false; } + var length = getTypeReferenceArity(type) - endSkipCount; + if (index < length) { + var typeArguments = getTypeArguments(type); + var elementTypes = []; + for (var i = index; i < length; i++) { + var t = typeArguments[i]; + elementTypes.push(type.target.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t); + } + return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes); + } + return undefined; + } + function isTupleTypeStructureMatching(t1, t2) { + return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && + ts.every(t1.target.elementFlags, function (f, i) { return (f & 12 /* Variable */) === (t2.target.elementFlags[i] & 12 /* Variable */); }); } function isZeroBigInt(_a) { var value = _a.value; @@ -59177,7 +59472,8 @@ var ts; inferredType: undefined, priority: undefined, topLevel: true, - isFixed: false + isFixed: false, + impliedArity: undefined }; } function cloneInferenceInfo(inference) { @@ -59188,7 +59484,8 @@ var ts; inferredType: inference.inferredType, priority: inference.priority, topLevel: inference.topLevel, - isFixed: inference.isFixed + isFixed: inference.isFixed, + impliedArity: inference.impliedArity }; } function cloneInferredPartOfContext(context) { @@ -59291,9 +59588,10 @@ var ts; } if (isTupleType(source)) { var elementTypes = ts.map(getTypeArguments(source), function (t) { return inferReverseMappedType(t, target, constraint); }); - var minLength = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? - getTypeReferenceArity(source) - (source.target.hasRestElement ? 1 : 0) : source.target.minLength; - return createTupleType(elementTypes, minLength, source.target.hasRestElement, source.target.readonly, source.target.labeledElementDeclarations); + var elementFlags = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? + ts.sameMap(source.target.elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + source.target.elementFlags; + return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations); } // For all other object types we infer a new object type where the reverse mapping has been // applied to the type of each property. @@ -59358,13 +59656,13 @@ var ts; return result.value; } function tupleTypesDefinitelyUnrelated(source, target) { - return target.target.minLength > source.target.minLength || - !getRestTypeOfTupleType(target) && (!!getRestTypeOfTupleType(source) || getLengthOfTupleType(target) < getLengthOfTupleType(source)); + return !(target.target.combinedFlags & 8 /* Variadic */) && target.target.minLength > source.target.minLength || + !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength); } function typesDefinitelyUnrelated(source, target) { // Two tuple types with incompatible arities are definitely unrelated. // Two object types that each have a property that is unmatched in the other are definitely unrelated. - return isTupleType(source) && isTupleType(target) && tupleTypesDefinitelyUnrelated(source, target) || + return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true) && !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true); } @@ -59854,22 +60152,61 @@ var ts; if (!typesDefinitelyUnrelated(source, target)) { if (isArrayType(source) || isTupleType(source)) { if (isTupleType(target)) { - var sourceLength = isTupleType(source) ? getLengthOfTupleType(source) : 0; - var targetLength = getLengthOfTupleType(target); - var sourceRestType = isTupleType(source) ? getRestTypeOfTupleType(source) : getElementTypeOfArrayType(source); - var targetRestType = getRestTypeOfTupleType(target); - var fixedLength = targetLength < sourceLength || sourceRestType ? targetLength : sourceLength; - for (var i = 0; i < fixedLength; i++) { - inferFromTypes(i < sourceLength ? getTypeArguments(source)[i] : sourceRestType, getTypeArguments(target)[i]); + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var elementTypes = getTypeArguments(target); + var elementFlags = target.target.elementFlags; + // When source and target are tuple types with the same structure (fixed, variadic, and rest are matched + // to the same kind in each position), simply infer between the element types. + if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { + for (var i = 0; i < targetArity; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + return; } - if (targetRestType) { - var types = fixedLength < sourceLength ? getTypeArguments(source).slice(fixedLength, sourceLength) : []; - if (sourceRestType) { - types.push(sourceRestType); + var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; + var sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & 4 /* Rest */ ? + getTypeArguments(source)[sourceArity - 1] : undefined; + var endLength = !(target.target.combinedFlags & 12 /* Variable */) ? 0 : + sourceRestType ? getEndLengthOfType(target) : + Math.min(getEndLengthOfType(source), getEndLengthOfType(target)); + var sourceEndLength = sourceRestType ? 0 : endLength; + // Infer between starting fixed elements. + for (var i = 0; i < startLength; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + if (sourceRestType && sourceArity - startLength === 1) { + // Single rest element remains in source, infer from that to every element in target + for (var i = startLength; i < targetArity - endLength; i++) { + inferFromTypes(elementFlags[i] & 8 /* Variadic */ ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]); } - if (types.length) { - inferFromTypes(getUnionType(types), targetRestType); + } + else { + var middleLength = targetArity - startLength - endLength; + if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 /* Variadic */ && isTupleType(source)) { + // Middle of target is [...T, ...U] and source is tuple type + var targetInfo = getInferenceInfoForType(elementTypes[startLength]); + if (targetInfo && targetInfo.impliedArity !== undefined) { + // Infer slices from source based on implied arity of T. + inferFromTypes(sliceTupleType(source, startLength, sourceEndLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]); + inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, sourceEndLength), elementTypes[startLength + 1]); + } } + else if (middleLength === 1 && elementFlags[startLength] & 8 /* Variadic */) { + // Middle of target is exactly one variadic element. Infer the slice between the fixed parts in the source. + inferFromTypes(isTupleType(source) ? sliceTupleType(source, startLength, sourceEndLength) : createArrayType(sourceRestType), elementTypes[startLength]); + } + else if (middleLength === 1 && elementFlags[startLength] & 4 /* Rest */) { + // Middle of target is exactly one rest element. If middle of source is not empty, infer union of middle element types. + var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, sourceEndLength) : sourceRestType; + if (restType) { + inferFromTypes(restType, elementTypes[startLength]); + } + } + } + // Infer between ending fixed elements + for (var i = 0; i < endLength; i++) { + inferFromTypes(sourceRestType || getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]); } return; } @@ -60814,7 +61151,7 @@ var ts; var signature = getEffectsSignature(flow.node); if (signature) { var predicate = getTypePredicateOfSignature(signature); - if (predicate && predicate.kind === 3 /* AssertsIdentifier */) { + if (predicate && predicate.kind === 3 /* AssertsIdentifier */ && !predicate.type) { var predicateArgument = flow.node.arguments[predicate.parameterIndex]; if (predicateArgument && isFalseExpression(predicateArgument)) { return false; @@ -62712,7 +63049,7 @@ var ts; var args = getEffectiveCallArguments(iife); var indexOfParameter = func.parameters.indexOf(parameter); if (parameter.dotDotDotToken) { - return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined); + return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined, 0 /* Normal */); } var links = getNodeLinks(iife); var cached = links.resolvedSignature; @@ -63478,6 +63815,9 @@ var ts; var arrayOrIterableType = checkExpression(node.expression, checkMode); return checkIteratedTypeOrElementType(33 /* Spread */, arrayOrIterableType, undefinedType, node.expression); } + function checkSyntheticExpression(node) { + return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type; + } function hasDefaultValue(node) { return (node.kind === 195 /* BindingElement */ && !!node.initializer) || (node.kind === 213 /* BinaryExpression */ && node.operatorToken.kind === 62 /* EqualsToken */); @@ -63486,26 +63826,22 @@ var ts; var elements = node.elements; var elementCount = elements.length; var elementTypes = []; - var hasEndingSpreadElement = false; - var hasNonEndingSpreadElement = false; + var elementFlags = []; var contextualType = getApparentTypeOfContextualType(node); var inDestructuringPattern = ts.isAssignmentTarget(node); var inConstContext = isConstContext(node); for (var i = 0; i < elementCount; i++) { var e = elements[i]; - var spread = e.kind === 217 /* SpreadElement */ && e.expression; - var spreadType = spread && checkExpression(spread, checkMode, forceTuple); - if (spreadType && isTupleType(spreadType)) { - elementTypes.push.apply(elementTypes, getTypeArguments(spreadType)); - if (spreadType.target.hasRestElement) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + if (e.kind === 217 /* SpreadElement */) { + if (languageVersion < 2 /* ES2015 */) { + checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 /* SpreadIncludes */ : 2048 /* SpreadArrays */); } - } - else { - if (inDestructuringPattern && spreadType) { + var spreadType = checkExpression(e.expression, checkMode, forceTuple); + if (isArrayLikeType(spreadType)) { + elementTypes.push(spreadType); + elementFlags.push(8 /* Variadic */); + } + else if (inDestructuringPattern) { // Given the following situation: // var c: {}; // [...c] = ["", 0]; @@ -63519,43 +63855,31 @@ var ts; // getContextualTypeForElementExpression, which will crucially not error // if there is no index type / iterated type. var restElementType = getIndexTypeOfType(spreadType, 1 /* Number */) || - getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false); - if (restElementType) { - elementTypes.push(restElementType); - } + getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false) || + unknownType; + elementTypes.push(restElementType); + elementFlags.push(4 /* Rest */); } else { - var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); - var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); - elementTypes.push(type); - } - if (spread) { // tuples are done above, so these are only arrays - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + elementTypes.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, e.expression)); + elementFlags.push(4 /* Rest */); } } + else { + var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); + var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); + elementTypes.push(type); + elementFlags.push(1 /* Required */); + } } - if (!hasNonEndingSpreadElement) { - var minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0); - // If array literal is actually a destructuring pattern, mark it as an implied type. We do this such - // that we get the same behavior for "var [x, y] = []" and "[x, y] = []". - var tupleResult = void 0; - if (inDestructuringPattern && minLength > 0) { - var type = cloneTypeReference(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - type.pattern = node; - return type; - } - else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) { - return createArrayLiteralType(tupleResult); - } - else if (forceTuple) { - return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - } + if (inDestructuringPattern) { + return createTupleType(elementTypes, elementFlags); + } + if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) { + return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext)); } return createArrayLiteralType(createArrayType(elementTypes.length ? - getUnionType(elementTypes, 2 /* Subtype */) : + getUnionType(ts.sameMap(elementTypes, function (t, i) { return elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t; }), 2 /* Subtype */) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext)); } function createArrayLiteralType(type) { @@ -63569,14 +63893,6 @@ var ts; } return literalType; } - function getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, readonly) { - if (elementCount === void 0) { elementCount = elementTypes.length; } - if (readonly === void 0) { readonly = false; } - // Infer a tuple type when the contextual type is or contains a tuple-like type - if (readonly || (contextualType && forEachType(contextualType, isTupleLikeType))) { - return createTupleType(elementTypes, elementCount - (hasRestElement ? 1 : 0), hasRestElement, readonly); - } - } function isNumericName(name) { switch (name.kind) { case 157 /* ComputedPropertyName */: @@ -63992,9 +64308,9 @@ var ts; var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName); // If there are children in the body of JSX element, create dummy attribute "children" with the union of children types so that it will pass the attribute checking process var childrenPropSymbol = createSymbol(4 /* Property */ | 33554432 /* Transient */, jsxChildrenPropertyName); - childrenPropSymbol.type = childrenTypes.length === 1 ? - childrenTypes[0] : - (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, /*hasRestElement*/ false) || createArrayType(getUnionType(childrenTypes))); + childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : + childrenContextualType && forEachType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : + createArrayType(getUnionType(childrenTypes)); // Fake up a property declaration for the children childrenPropSymbol.valueDeclaration = ts.factory.createPropertySignature(/*modifiers*/ undefined, ts.unescapeLeadingUnderscores(jsxChildrenPropertyName), /*questionToken*/ undefined, /*type*/ undefined); ts.setParent(childrenPropSymbol.valueDeclaration, attributes); @@ -64873,6 +65189,14 @@ var ts; function getSuggestedSymbolForNonexistentProperty(name, containingType) { return getSpellingSuggestionForName(ts.isString(name) ? name : ts.idText(name), getPropertiesOfType(containingType), 111551 /* Value */); } + function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) { + var strName = ts.isString(name) ? name : ts.idText(name); + var properties = getPropertiesOfType(containingType); + var jsxSpecific = strName === "for" ? ts.find(properties, function (x) { return ts.symbolName(x) === "htmlFor"; }) + : strName === "class" ? ts.find(properties, function (x) { return ts.symbolName(x) === "className"; }) + : undefined; + return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551 /* Value */); + } function getSuggestionForNonexistentProperty(name, containingType) { var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType); return suggestion && ts.symbolName(suggestion); @@ -65249,28 +65573,10 @@ var ts; argCount = signatureHelpTrailingComma ? args.length + 1 : args.length; // If we are missing the close parenthesis, the call is incomplete. callIsIncomplete = node.arguments.end === node.end; - // If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range. - var firstSpreadArgIndex = getSpreadArgumentIndex(args); - if (firstSpreadArgIndex >= 0) { - if (firstSpreadArgIndex === args.length - 1) { - // Special case, handles the munged arguments that we receive in case of a spread in the end (breaks the arg.expression below) - // (see below for code that starts with "const spreadArgument") - return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature)); - } - var totalCount = firstSpreadArgIndex; // count previous arguments - for (var i = firstSpreadArgIndex; i < args.length; i++) { - var arg = args[i]; - if (!isSpreadArgument(arg)) { - totalCount += 1; - } - else { - var argType = flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression); - totalCount += isTupleType(argType) ? getTypeArguments(argType).length - : isArrayType(argType) ? 0 - : 1; - } - } - return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount <= getParameterCount(signature)); + // If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range. + var spreadArgIndex = getSpreadArgumentIndex(args); + if (spreadArgIndex >= 0) { + return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature)); } } // Too many arguments implies incorrect arity. @@ -65395,6 +65701,12 @@ var ts; } var restType = getNonArrayRestType(signature); var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; + if (restType && restType.flags & 262144 /* TypeParameter */) { + var info = ts.find(context.inferences, function (info) { return info.typeParameter === restType; }); + if (info) { + info.impliedArity = ts.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : undefined; + } + } for (var i = 0; i < argCount; i++) { var arg = args[i]; if (arg.kind !== 219 /* OmittedExpression */) { @@ -65404,46 +65716,55 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode); inferTypes(context.inferences, spreadType, restType); } return getInferredTypes(context); } - function getArrayifiedType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, getArrayifiedType) : - type.flags & (1 /* Any */ | 63176704 /* Instantiable */) || isMutableArrayOrTuple(type) ? type : - isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.minLength, type.target.hasRestElement, /*readonly*/ false, type.target.labeledElementDeclarations) : - createArrayType(getIndexedAccessType(type, numberType)); + function getMutableArrayOrTupleType(type) { + return type.flags & 1048576 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : + type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : + isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, /*readonly*/ false, type.target.labeledElementDeclarations) : + createTupleType([type], [8 /* Variadic */]); } - function getSpreadArgumentType(args, index, argCount, restType, context) { + function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) { if (index >= argCount - 1) { var arg = args[argCount - 1]; if (isSpreadArgument(arg)) { // We are inferring from a spread expression in the last argument position, i.e. both the parameter // and the argument are ...x forms. - return arg.kind === 224 /* SyntheticExpression */ ? - createArrayType(arg.type) : - getArrayifiedType(checkExpressionWithContextualType(arg.expression, restType, context, 0 /* Normal */)); + return getMutableArrayOrTupleType(arg.kind === 224 /* SyntheticExpression */ ? arg.type : + checkExpressionWithContextualType(arg.expression, restType, context, checkMode)); } } var types = []; + var flags = []; var names = []; - var spreadIndex = -1; for (var i = index; i < argCount; i++) { - var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); - var argType = checkExpressionWithContextualType(args[i], contextualType, context, 0 /* Normal */); - if (spreadIndex < 0 && isSpreadArgument(args[i])) { - spreadIndex = i - index; + var arg = args[i]; + if (isSpreadArgument(arg)) { + var spreadType = arg.kind === 224 /* SyntheticExpression */ ? arg.type : checkExpression(arg.expression); + if (isArrayLikeType(spreadType)) { + types.push(spreadType); + flags.push(8 /* Variadic */); + } + else { + types.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, arg.kind === 217 /* SpreadElement */ ? arg.expression : arg)); + flags.push(4 /* Rest */); + } } - if (args[i].kind === 224 /* SyntheticExpression */ && args[i].tupleNameSource) { - names.push(args[i].tupleNameSource); + else { + var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); + var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); + var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); + types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); + flags.push(1 /* Required */); + } + if (arg.kind === 224 /* SyntheticExpression */ && arg.tupleNameSource) { + names.push(arg.tupleNameSource); } - var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); - types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); } - return spreadIndex < 0 ? - createTupleType(types, /*minLength*/ undefined, /*hasRestElement*/ undefined, /*readonly*/ undefined, ts.length(names) === ts.length(types) ? names : undefined) : - createTupleType(ts.append(types.slice(0, spreadIndex), getUnionType(types.slice(spreadIndex))), spreadIndex, /*hasRestElement*/ true, /*readonly*/ undefined); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) { var isJavascript = ts.isInJSFile(signature.declaration); @@ -65625,7 +65946,7 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined, checkMode); var errorNode = reportErrors ? argCount < args.length ? args[argCount] : node : undefined; if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, /*containingMessageChain*/ undefined, errorOutputContainer)) { ts.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors"); @@ -65685,19 +66006,30 @@ var ts; return node.attributes.properties.length > 0 || (ts.isJsxOpeningElement(node) && node.parent.children.length > 0) ? [node.attributes] : ts.emptyArray; } var args = node.arguments || ts.emptyArray; - var length = args.length; - if (length && isSpreadArgument(args[length - 1]) && getSpreadArgumentIndex(args) === length - 1) { - // We have a spread argument in the last position and no other spread arguments. If the type - // of the argument is a tuple type, spread the tuple elements into the argument list. We can - // call checkExpressionCached because spread expressions never have a contextual type. - var spreadArgument_1 = args[length - 1]; - var type_4 = flowLoopCount ? checkExpression(spreadArgument_1.expression) : checkExpressionCached(spreadArgument_1.expression); - if (isTupleType(type_4)) { - var typeArguments = getTypeArguments(type_4); - var restIndex_2 = type_4.target.hasRestElement ? typeArguments.length - 1 : -1; - var syntheticArgs = ts.map(typeArguments, function (t, i) { var _a; return createSyntheticExpression(spreadArgument_1, t, /*isSpread*/ i === restIndex_2, (_a = type_4.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); }); - return ts.concatenate(args.slice(0, length - 1), syntheticArgs); + var spreadIndex = getSpreadArgumentIndex(args); + if (spreadIndex >= 0) { + // Create synthetic arguments from spreads of tuple types. + var effectiveArgs_1 = args.slice(0, spreadIndex); + var _loop_18 = function (i) { + var arg = args[i]; + // We can call checkExpressionCached because spread expressions never have a contextual type. + var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); + if (spreadType && isTupleType(spreadType)) { + ts.forEach(getTypeArguments(spreadType), function (t, i) { + var _a; + var flags = spreadType.target.elementFlags[i]; + var syntheticArg = createSyntheticExpression(arg, flags & 4 /* Rest */ ? createArrayType(t) : t, !!(flags & 12 /* Variable */), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + effectiveArgs_1.push(syntheticArg); + }); + } + else { + effectiveArgs_1.push(arg); + } + }; + for (var i = spreadIndex; i < args.length; i++) { + _loop_18(i); } + return effectiveArgs_1; } return args; } @@ -65997,7 +66329,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_17 = function (c) { + var _loop_19 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66015,7 +66347,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_17(c); + _loop_19(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66149,7 +66481,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_18 = function (i) { + var _loop_20 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66157,7 +66489,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_18(i); + _loop_20(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -67129,51 +67461,44 @@ var ts; // otherwise would return the type 'undefined'). var restType = getTypeOfSymbol(signature.parameters[paramCount]); var index = pos - paramCount; - if (!isTupleType(restType) || restType.target.hasRestElement || index < getTypeArguments(restType).length) { + if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) { return getIndexedAccessType(restType, getLiteralType(index)); } } return undefined; } function getRestTypeAtPosition(source, pos) { - var paramCount = getParameterCount(source); + var parameterCount = getParameterCount(source); + var minArgumentCount = getMinArgumentCount(source); var restType = getEffectiveRestType(source); - var nonRestCount = paramCount - (restType ? 1 : 0); - if (restType && pos === nonRestCount) { - return restType; + if (restType && pos >= parameterCount - 1) { + return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType)); } var types = []; + var flags = []; var names = []; - for (var i = pos; i < nonRestCount; i++) { - types.push(getTypeAtPosition(source, i)); + for (var i = pos; i < parameterCount; i++) { + if (!restType || i < parameterCount - 1) { + types.push(getTypeAtPosition(source, i)); + flags.push(i < minArgumentCount ? 1 /* Required */ : 2 /* Optional */); + } + else { + types.push(restType); + flags.push(8 /* Variadic */); + } var name = getNameableDeclarationAtPosition(source, i); - if (name && names) { + if (name) { names.push(name); } - else { - names = undefined; - } } - if (restType) { - types.push(getIndexedAccessType(restType, numberType)); - var name = getNameableDeclarationAtPosition(source, nonRestCount); - if (name && names) { - names.push(name); - } - else { - names = undefined; - } - } - var minArgumentCount = getMinArgumentCount(source); - var minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos; - return createTupleType(types, minLength, !!restType, /*readonly*/ false, names); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function getParameterCount(signature) { var length = signature.parameters.length; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[length - 1]); if (isTupleType(restType)) { - return length + getTypeArguments(restType).length - 1; + return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1); } } return length; @@ -67182,9 +67507,10 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (isTupleType(restType)) { - var minLength = restType.target.minLength; - if (minLength > 0) { - return signature.parameters.length - 1 + minLength; + var firstOptionalIndex = ts.findIndex(restType.target.elementFlags, function (f) { return !(f & 1 /* Required */); }); + var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex; + if (requiredCount > 0) { + return signature.parameters.length - 1 + requiredCount; } } } @@ -67203,7 +67529,12 @@ var ts; function getEffectiveRestType(signature) { if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); - return isTupleType(restType) ? getRestArrayTypeOfTupleType(restType) : restType; + if (!isTupleType(restType)) { + return restType; + } + if (restType.target.hasRestElement) { + return sliceTupleType(restType, restType.target.fixedLength); + } } return undefined; } @@ -67542,8 +67873,8 @@ var ts; var witnesses = getSwitchClauseTypeOfWitnesses(node, /*retainDefault*/ false); // notEqualFacts states that the type of the switched value is not equal to every type in the switch. var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, /*hasDefault*/ true); - var type_5 = getBaseConstraintOfType(operandType) || operandType; - return !!(filterType(type_5, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); + var type_4 = getBaseConstraintOfType(operandType) || operandType; + return !!(filterType(type_4, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); } var type = getTypeOfExpression(node.expression); if (!isLiteralType(type)) { @@ -67883,7 +68214,7 @@ var ts; error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference); return booleanType; } - if (expr.kind === 198 /* PropertyAccessExpression */ && ts.isPrivateIdentifier(expr.name)) { + if (ts.isPropertyAccessExpression(expr) && ts.isPrivateIdentifier(expr.name)) { error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } var links = getNodeLinks(expr); @@ -68927,18 +69258,19 @@ var ts; } function padTupleType(type, pattern) { var patternElements = pattern.elements; - var arity = getTypeReferenceArity(type); - var elementTypes = arity ? getTypeArguments(type).slice() : []; - for (var i = arity; i < patternElements.length; i++) { + var elementTypes = getTypeArguments(type).slice(); + var elementFlags = type.target.elementFlags.slice(); + for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) { var e = patternElements[i]; if (i < patternElements.length - 1 || !(e.kind === 195 /* BindingElement */ && e.dotDotDotToken)) { elementTypes.push(!ts.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, /*includePatternInType*/ false, /*reportErrors*/ false) : anyType); + elementFlags.push(2 /* Optional */); if (!ts.isOmittedExpression(e) && !hasDefaultValue(e)) { reportImplicitAny(e, anyType); } } } - return createTupleType(elementTypes, type.target.minLength, /*hasRestElement*/ false, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration, type) { var widened = ts.getCombinedNodeFlags(declaration) & 2 /* Const */ || ts.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type); @@ -69359,7 +69691,7 @@ var ts; case 216 /* YieldExpression */: return checkYieldExpression(node); case 224 /* SyntheticExpression */: - return node.type; + return checkSyntheticExpression(node); case 280 /* JsxExpression */: return checkJsxExpression(node, checkMode); case 270 /* JsxElement */: @@ -70015,16 +70347,20 @@ var ts; grammarErrorOnNode(e, ts.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names); break; } - if (isTupleRestElement(e)) { + var flags = getTupleElementFlags(e); + if (flags & 8 /* Variadic */) { + if (!isArrayLikeType(getTypeFromTypeNode(e.type))) { + error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); + break; + } + } + else if (flags & 4 /* Rest */) { if (i !== elementTypes.length - 1) { grammarErrorOnNode(e, ts.Diagnostics.A_rest_element_must_be_last_in_a_tuple_type); break; } - if (!isArrayType(getTypeFromTypeNode(e.type))) { - error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); - } } - else if (isTupleOptionalElement(e)) { + else if (flags & 2 /* Optional */) { seenOptionalElement = true; } else if (seenOptionalElement) { @@ -73076,7 +73412,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_19 = function (member) { + var _loop_21 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73095,7 +73431,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_19(member); + _loop_21(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -107015,7 +107351,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_20 = function (directory) { + var _loop_22 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107041,7 +107377,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_20(directory); + var state_8 = _loop_22(directory); directory = out_directory_1; if (state_8 === "break") break; @@ -108108,7 +108444,7 @@ var ts; configFileSpecs = configFileParseResult.configFileSpecs; // TODO: GH#18217 projectReferences = configFileParseResult.projectReferences; configFileParsingDiagnostics = ts.getConfigFileParsingDiagnostics(configFileParseResult).slice(); - canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(configFileParseResult.raw); + canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function onSourceFileChange(fileName, eventKind, path) { @@ -108977,7 +109313,7 @@ var ts; else if (reloadLevel === ts.ConfigFileProgramReloadLevel.Partial) { // Update file names var result = ts.getFileNamesFromConfigSpecs(config.configFileSpecs, ts.getDirectoryPath(project), config.options, state.parseConfigFileHost); - ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInutFiles(config.raw)); + ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInputFiles(config.raw)); config.fileNames = result.fileNames; watchInputFiles(state, project, projectPath, config); } @@ -109116,7 +109452,7 @@ var ts; } } // Container if no files are specified in the project - if (!project.fileNames.length && !ts.canJsonReportNoInutFiles(project.raw)) { + if (!project.fileNames.length && !ts.canJsonReportNoInputFiles(project.raw)) { return { type: ts.UpToDateStatusType.ContainerOnly }; @@ -110111,6 +110447,13 @@ var ts; PackageJsonDependencyGroup[PackageJsonDependencyGroup["All"] = 15] = "All"; })(PackageJsonDependencyGroup = ts.PackageJsonDependencyGroup || (ts.PackageJsonDependencyGroup = {})); /* @internal */ + var PackageJsonAutoImportPreference; + (function (PackageJsonAutoImportPreference) { + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["None"] = 0] = "None"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["ExcludeDevDependencies"] = 1] = "ExcludeDevDependencies"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["All"] = 2] = "All"; + })(PackageJsonAutoImportPreference = ts.PackageJsonAutoImportPreference || (ts.PackageJsonAutoImportPreference = {})); + /* @internal */ ts.emptyOptions = {}; var HighlightSpanKind; (function (HighlightSpanKind) { @@ -112409,19 +112752,10 @@ var ts; return !!location.parent && ts.isImportOrExportSpecifier(location.parent) && location.parent.propertyName === location; } ts.isImportOrExportSpecifierName = isImportOrExportSpecifierName; - function scriptKindIs(fileName, host) { - var scriptKinds = []; - for (var _i = 2; _i < arguments.length; _i++) { - scriptKinds[_i - 2] = arguments[_i]; - } - var scriptKind = getScriptKind(fileName, host); - return ts.some(scriptKinds, function (k) { return k === scriptKind; }); - } - ts.scriptKindIs = scriptKindIs; function getScriptKind(fileName, host) { // First check to see if the script kind was specified by the host. Chances are the host // may override the default script kind for the file extension. - return ts.ensureScriptKind(fileName, host && host.getScriptKind && host.getScriptKind(fileName)); + return ts.ensureScriptKind(fileName, host.getScriptKind && host.getScriptKind(fileName)); } ts.getScriptKind = getScriptKind; function getSymbolTarget(symbol, checker) { @@ -112952,20 +113286,20 @@ var ts; if (!stringContent) return undefined; var content = tryParseJson(stringContent); - if (!content) - return false; var info = {}; - for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { - var key = dependencyKeys_1[_i]; - var dependencies = content[key]; - if (!dependencies) { - continue; + if (content) { + for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { + var key = dependencyKeys_1[_i]; + var dependencies = content[key]; + if (!dependencies) { + continue; + } + var dependencyMap = ts.createMap(); + for (var packageName in dependencies) { + dependencyMap.set(packageName, dependencies[packageName]); + } + info[key] = dependencyMap; } - var dependencyMap = ts.createMap(); - for (var packageName in dependencies) { - dependencyMap.set(packageName, dependencies[packageName]); - } - info[key] = dependencyMap; } var dependencyGroups = [ [1 /* Dependencies */, info.dependencies], @@ -112973,7 +113307,7 @@ var ts; [8 /* OptionalDependencies */, info.optionalDependencies], [4 /* PeerDependencies */, info.peerDependencies], ]; - return __assign(__assign({}, info), { fileName: fileName, + return __assign(__assign({}, info), { parseable: !!content, fileName: fileName, get: get, has: function (dependencyName, inGroups) { return !!get(dependencyName, inGroups); @@ -114760,6 +115094,9 @@ var ts; function originIsExport(origin) { return !!(origin && origin.kind & 4 /* Export */); } + function originIsPackageJsonImport(origin) { + return originIsExport(origin) && !!origin.isFromPackageJson; + } function originIsPromise(origin) { return !!(origin.kind & 8 /* Promise */); } @@ -115019,6 +115356,7 @@ var ts; isRecommended: isRecommendedCompletionMatch(symbol, recommendedCompletion, typeChecker) || undefined, insertText: insertText, replacementSpan: replacementSpan, + isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, }; } function quotePropertyName(name, preferences) { @@ -115980,11 +116318,12 @@ var ts; var results = []; /** Ids present in `results` for faster lookup */ var resultSymbolIds = ts.createMap(); - ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, function (moduleSymbol) { + ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, /*useAutoImportProvider*/ true, function (moduleSymbol, _, program, isFromPackageJson) { // Perf -- ignore other modules if this is a request for details if (detailsEntryId && detailsEntryId.source && ts.stripQuotes(moduleSymbol.name) !== detailsEntryId.source) { return; } + var typeChecker = program.getTypeChecker(); var resolvedModuleSymbol = typeChecker.resolveExternalModuleSymbol(moduleSymbol); // resolvedModuleSymbol may be a namespace. A namespace may be `export =` by multiple module declarations, but only keep the first one. if (!ts.addToSeen(seenResolvedModules, ts.getSymbolId(resolvedModuleSymbol))) { @@ -115993,7 +116332,7 @@ var ts; // Don't add another completion for `export =` of a symbol that's already global. // So in `declare namespace foo {} declare module "foo" { export = foo; }`, there will just be the global completion for `foo`. if (resolvedModuleSymbol !== moduleSymbol && ts.every(resolvedModuleSymbol.declarations, ts.isNonGlobalDeclaration)) { - pushSymbol(resolvedModuleSymbol, moduleSymbol, /*skipFilter*/ true); + pushSymbol(resolvedModuleSymbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ true); } for (var _i = 0, _a = typeChecker.getExportsAndPropertiesOfModule(moduleSymbol); _i < _a.length; _i++) { var symbol = _a[_i]; @@ -116018,7 +116357,7 @@ var ts; var nearestExportSymbolId = ts.getSymbolId(nearestExportSymbol).toString(); var symbolHasBeenSeen = resultSymbolIds.has(nearestExportSymbolId) || aliasesToAlreadyIncludedSymbols.has(nearestExportSymbolId); if (!symbolHasBeenSeen) { - aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol }); + aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol, isFromPackageJson: isFromPackageJson }); aliasesToAlreadyIncludedSymbols.set(symbolId, true); } else { @@ -116030,20 +116369,19 @@ var ts; else { // This is not a re-export, so see if we have any aliases pending and remove them (step 3 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.delete(symbolId); - pushSymbol(symbol, moduleSymbol); + pushSymbol(symbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); } } }); // By this point, any potential duplicates that were actually duplicates have been // removed, so the rest need to be added. (Step 4 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.forEach(function (_a) { - var alias = _a.alias, moduleSymbol = _a.moduleSymbol; - return pushSymbol(alias, moduleSymbol); + var alias = _a.alias, moduleSymbol = _a.moduleSymbol, isFromPackageJson = _a.isFromPackageJson; + return pushSymbol(alias, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); }); log("getSymbolsFromOtherSourceFileExports: " + (ts.timestamp() - startTime)); return results; - function pushSymbol(symbol, moduleSymbol, skipFilter) { - if (skipFilter === void 0) { skipFilter = false; } + function pushSymbol(symbol, moduleSymbol, isFromPackageJson, skipFilter) { var isDefaultExport = symbol.escapedName === "default" /* Default */; if (isDefaultExport) { symbol = ts.getLocalSymbolForExportDefault(symbol) || symbol; @@ -116052,7 +116390,7 @@ var ts; return; } ts.addToSeen(resultSymbolIds, ts.getSymbolId(symbol)); - var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport }; + var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport, isFromPackageJson: isFromPackageJson }; results.push({ symbol: symbol, symbolName: ts.getNameForExportedSymbol(symbol, target), @@ -132402,7 +132740,7 @@ var ts; errorCodes: errorCodes, getCodeActions: function (context) { var errorCode = context.errorCode, preferences = context.preferences, sourceFile = context.sourceFile, span = context.span; - var info = getFixesInfo(context, errorCode, span.start); + var info = getFixesInfo(context, errorCode, span.start, /*useAutoImportProvider*/ true); if (!info) return undefined; var fixes = info.fixes, symbolName = info.symbolName; @@ -132412,12 +132750,16 @@ var ts; fixIds: [importFixId], getAllCodeActions: function (context) { var sourceFile = context.sourceFile, program = context.program, preferences = context.preferences, host = context.host; - var importAdder = createImportAdder(sourceFile, program, preferences, host); + var importAdder = createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ true, preferences, host); codefix.eachDiagnostic(context, errorCodes, function (diag) { return importAdder.addImportFromDiagnostic(diag, context); }); return codefix.createCombinedCodeActions(ts.textChanges.ChangeTracker.with(context, importAdder.writeFixes)); }, }); function createImportAdder(sourceFile, program, preferences, host) { + return createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ false, preferences, host); + } + codefix.createImportAdder = createImportAdder; + function createImportAdderWorker(sourceFile, program, useAutoImportProvider, preferences, host) { var compilerOptions = program.getCompilerOptions(); // Namespace fixes don't conflict, so just build a list. var addToNamespace = []; @@ -132427,7 +132769,7 @@ var ts; var newImports = ts.createMap(); return { addImportFromDiagnostic: addImportFromDiagnostic, addImportFromExportedSymbol: addImportFromExportedSymbol, writeFixes: writeFixes }; function addImportFromDiagnostic(diagnostic, context) { - var info = getFixesInfo(context, diagnostic.code, diagnostic.start); + var info = getFixesInfo(context, diagnostic.code, diagnostic.start, useAutoImportProvider); if (!info || !info.fixes.length) return; addImport(info); @@ -132437,7 +132779,7 @@ var ts; var symbolName = ts.getNameForExportedSymbol(exportedSymbol, ts.getEmitScriptTarget(compilerOptions)); var checker = program.getTypeChecker(); var symbol = checker.getMergedSymbol(ts.skipAlias(exportedSymbol, checker)); - var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, sourceFile, compilerOptions, checker, program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, host, program, useAutoImportProvider); var preferTypeOnlyImport = !!usageIsTypeOnly && compilerOptions.importsNotUsedAsValues === 2 /* Error */; var useRequire = shouldUseRequire(sourceFile, compilerOptions); var fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, /*position*/ undefined, preferTypeOnlyImport, useRequire, host, preferences); @@ -132524,7 +132866,6 @@ var ts; } } } - codefix.createImportAdder = createImportAdder; // Sorted with the preferred fix coming first. var ImportFixKind; (function (ImportFixKind) { @@ -132542,7 +132883,7 @@ var ts; })(ImportKind || (ImportKind = {})); function getImportCompletionAction(exportedSymbol, moduleSymbol, sourceFile, symbolName, host, program, formatContext, position, preferences) { var compilerOptions = program.getCompilerOptions(); - var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, sourceFile, compilerOptions, program.getTypeChecker(), program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, host, program, /*useAutoImportProvider*/ true); var useRequire = shouldUseRequire(sourceFile, compilerOptions); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && !ts.isSourceFileJS(sourceFile) && ts.isValidTypeOnlyAliasUseSite(ts.getTokenAtPosition(sourceFile, position)); var moduleSpecifier = ts.first(getNewImportInfos(program, sourceFile, position, preferTypeOnlyImport, useRequire, exportInfos, host, preferences)).moduleSpecifier; @@ -132559,11 +132900,13 @@ var ts; var description = _a.description, changes = _a.changes, commands = _a.commands; return { description: description, changes: changes, commands: commands }; } - function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, sourceFile, compilerOptions, checker, allSourceFiles) { + function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, host, program, useAutoImportProvider) { var result = []; - forEachExternalModule(checker, allSourceFiles, function (moduleSymbol, moduleFile) { + var compilerOptions = program.getCompilerOptions(); + forEachExternalModuleToImportFrom(program, host, importingFile, /*filterByPackageJson*/ false, useAutoImportProvider, function (moduleSymbol, moduleFile, program) { + var checker = program.getTypeChecker(); // Don't import from a re-export when looking "up" like to `./index` or `../index`. - if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(sourceFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { + if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(importingFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { return; } var defaultInfo = getDefaultLikeExportInfo(importingFile, moduleSymbol, checker, compilerOptions); @@ -132725,11 +133068,11 @@ var ts; ? { kind: 3 /* AddNew */, moduleSpecifier: moduleSpecifier.text, importKind: importKind, typeOnly: preferTypeOnlyImport, useRequire: useRequire } : undefined; } - function getFixesInfo(context, errorCode, pos) { + function getFixesInfo(context, errorCode, pos, useAutoImportProvider) { var symbolToken = ts.getTokenAtPosition(context.sourceFile, pos); var info = errorCode === ts.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code ? getFixesInfoForUMDImport(context, symbolToken) - : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken) : undefined; + : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken, useAutoImportProvider) : undefined; return info && __assign(__assign({}, info), { fixes: ts.sort(info.fixes, function (a, b) { return a.kind - b.kind; }) }); } function getFixesInfoForUMDImport(_a, token) { @@ -132782,7 +133125,7 @@ var ts; return ts.Debug.assertNever(moduleKind, "Unexpected moduleKind " + moduleKind); } } - function getFixesInfoForNonUMDImport(_a, symbolToken) { + function getFixesInfoForNonUMDImport(_a, symbolToken, useAutoImportProvider) { var sourceFile = _a.sourceFile, program = _a.program, cancellationToken = _a.cancellationToken, host = _a.host, preferences = _a.preferences; var checker = program.getTypeChecker(); // If we're at ``, we must check if `Foo` is already in scope, and if so, get an import for `React` instead. @@ -132796,7 +133139,7 @@ var ts; var compilerOptions = program.getCompilerOptions(); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && ts.isValidTypeOnlyAliasUseSite(symbolToken); var useRequire = shouldUseRequire(sourceFile, compilerOptions); - var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, host); + var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, useAutoImportProvider, host); var fixes = ts.arrayFrom(ts.flatMapIterator(exportInfos.entries(), function (_a) { var _ = _a[0], exportInfos = _a[1]; return getFixForImport(exportInfos, symbolName, symbolToken.getStart(sourceFile), preferTypeOnlyImport, useRequire, program, sourceFile, host, preferences); @@ -132804,14 +133147,14 @@ var ts; return { fixes: fixes, symbolName: symbolName }; } // Returns a map from an exported symbol's ID to a list of every way it's (re-)exported. - function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, host) { + function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, useAutoImportProvider, host) { // For each original symbol, keep all re-exports of that symbol together so we can call `getCodeActionsForImport` on the whole group at once. // Maps symbol id to info for modules providing that symbol (original export + re-exports). var originalSymbolToExportInfos = ts.createMultiMap(); function addSymbol(moduleSymbol, exportedSymbol, importKind) { originalSymbolToExportInfos.add(ts.getUniqueSymbolId(exportedSymbol, checker).toString(), { moduleSymbol: moduleSymbol, importKind: importKind, exportedSymbolIsTypeOnly: isTypeOnlySymbol(exportedSymbol, checker) }); } - forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, function (moduleSymbol) { + forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, useAutoImportProvider, function (moduleSymbol) { cancellationToken.throwIfCancellationRequested(); var defaultInfo = getDefaultLikeExportInfo(sourceFile, moduleSymbol, checker, program.getCompilerOptions()); if (defaultInfo && defaultInfo.name === symbolName && symbolHasMeaning(defaultInfo.symbolForMeaning, currentTokenMeaning)) { @@ -133043,14 +133386,26 @@ var ts; var declarations = _a.declarations; return ts.some(declarations, function (decl) { return !!(ts.getMeaningFromDeclaration(decl) & meaning); }); } - function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, cb) { + function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, useAutoImportProvider, cb) { + var _a, _b; + forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, function (module, file) { return cb(module, file, program, /*isFromPackageJson*/ false); }); + var autoImportProvider = useAutoImportProvider && ((_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host)); + if (autoImportProvider) { + var start = ts.timestamp(); + forEachExternalModuleToImportFromInProgram(autoImportProvider, host, from, filterByPackageJson, function (module, file) { return cb(module, file, autoImportProvider, /*isFromPackageJson*/ true); }); + (_b = host.log) === null || _b === void 0 ? void 0 : _b.call(host, "forEachExternalModuleToImportFrom autoImportProvider: " + (ts.timestamp() - start)); + } + } + codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; + function forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, cb) { + var _a; var filteredCount = 0; var moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); var packageJson = filterByPackageJson && createAutoImportFilter(from, program, host, moduleSpecifierResolutionHost); forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), function (module, sourceFile) { if (sourceFile === undefined) { if (!packageJson || packageJson.allowsImportingAmbientModule(module)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; @@ -133060,18 +133415,15 @@ var ts; sourceFile !== from && isImportableFile(program, from, sourceFile, moduleSpecifierResolutionHost)) { if (!packageJson || packageJson.allowsImportingSourceFile(sourceFile)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; } } }); - if (host.log) { - host.log("forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); - } + (_a = host.log) === null || _a === void 0 ? void 0 : _a.call(host, "forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); } - codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; function forEachExternalModule(checker, allSourceFiles, cb) { for (var _i = 0, _a = checker.getAmbientModules(); _i < _a.length; _i++) { var ambient = _a[_i]; @@ -133142,15 +133494,14 @@ var ts; codefix.moduleSpecifierToValidIdentifier = moduleSpecifierToValidIdentifier; function createAutoImportFilter(fromFile, program, host, moduleSpecifierResolutionHost) { if (moduleSpecifierResolutionHost === void 0) { moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); } - var packageJsons = host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host); - var dependencyGroups = 1 /* Dependencies */ | 2 /* DevDependencies */ | 8 /* OptionalDependencies */; + var packageJsons = ((host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName)) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host)).filter(function (p) { return p.parseable; }); var usesNodeCoreModules; return { allowsImportingAmbientModule: allowsImportingAmbientModule, allowsImportingSourceFile: allowsImportingSourceFile, allowsImportingSpecifier: allowsImportingSpecifier, moduleSpecifierResolutionHost: moduleSpecifierResolutionHost }; function moduleSpecifierIsCoveredByPackageJson(specifier) { var packageName = getNodeModuleRootSpecifier(specifier); for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) { var packageJson = packageJsons_1[_i]; - if (packageJson.has(packageName, dependencyGroups) || packageJson.has(ts.getTypesPackageName(packageName), dependencyGroups)) { + if (packageJson.has(packageName) || packageJson.has(ts.getTypesPackageName(packageName))) { return true; } } @@ -133358,12 +133709,16 @@ var ts; ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, ts.Diagnostics.Module_0_has_no_exported_member_1_Did_you_mean_2.code, + // for JSX class components + ts.Diagnostics.No_overload_matches_this_call.code, + // for JSX FC + ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code, ]; codefix.registerCodeFix({ errorCodes: errorCodes, getCodeActions: function (context) { - var sourceFile = context.sourceFile; - var info = getInfo(sourceFile, context.span.start, context); + var sourceFile = context.sourceFile, errorCode = context.errorCode; + var info = getInfo(sourceFile, context.span.start, context, errorCode); if (!info) return undefined; var node = info.node, suggestedSymbol = info.suggestedSymbol; @@ -133373,18 +133728,23 @@ var ts; }, fixIds: [fixId], getAllCodeActions: function (context) { return codefix.codeFixAll(context, errorCodes, function (changes, diag) { - var info = getInfo(diag.file, diag.start, context); + var info = getInfo(diag.file, diag.start, context, diag.code); var target = context.host.getCompilationSettings().target; if (info) doChange(changes, context.sourceFile, info.node, info.suggestedSymbol, target); }); }, }); - function getInfo(sourceFile, pos, context) { + function getInfo(sourceFile, pos, context, errorCode) { // This is the identifier of the misspelled word. eg: // this.speling = 1; // ^^^^^^^ var node = ts.getTokenAtPosition(sourceFile, pos); var parent = node.parent; + // Only fix spelling for No_overload_matches_this_call emitted on the React class component + if ((errorCode === ts.Diagnostics.No_overload_matches_this_call.code || + errorCode === ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code) && + !ts.isJsxAttribute(parent)) + return undefined; var checker = context.program.getTypeChecker(); var suggestedSymbol; if (ts.isPropertyAccessExpression(parent) && parent.name === node) { @@ -133403,6 +133763,12 @@ var ts; suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol); } } + else if (ts.isJsxAttribute(parent) && parent.name === node) { + ts.Debug.assertNode(node, ts.isIdentifier, "Expected an identifier for JSX attribute"); + var tag = ts.findAncestor(node, ts.isJsxOpeningLikeElement); + var props = checker.getContextualTypeForArgumentAtIndex(tag, 0); + suggestedSymbol = checker.getSuggestedSymbolForNonexistentJSXAttribute(node, props); + } else { var meaning = ts.getMeaningFromLocation(node); var name = ts.getTextOfNode(node); @@ -136544,10 +136910,10 @@ var ts; (function (codefix) { function generateAccessorFromProperty(file, start, end, context, _actionName) { var fieldInfo = getAccessorConvertiblePropertyAtPosition(file, start, end); - if (!fieldInfo) + if (!fieldInfo || !fieldInfo.info) return undefined; var changeTracker = ts.textChanges.ChangeTracker.fromContext(context); - var isStatic = fieldInfo.isStatic, isReadonly = fieldInfo.isReadonly, fieldName = fieldInfo.fieldName, accessorName = fieldInfo.accessorName, originalName = fieldInfo.originalName, type = fieldInfo.type, container = fieldInfo.container, declaration = fieldInfo.declaration; + var _a = fieldInfo.info, isStatic = _a.isStatic, isReadonly = _a.isReadonly, fieldName = _a.fieldName, accessorName = _a.accessorName, originalName = _a.originalName, type = _a.type, container = _a.container, declaration = _a.declaration; ts.suppressLeadingAndTrailingTrivia(fieldName); ts.suppressLeadingAndTrailingTrivia(accessorName); ts.suppressLeadingAndTrailingTrivia(declaration); @@ -136622,23 +136988,37 @@ var ts; var declaration = ts.findAncestor(node.parent, isAcceptedDeclaration); // make sure declaration have AccessibilityModifier or Static Modifier or Readonly Modifier var meaning = 28 /* AccessibilityModifier */ | 32 /* Static */ | 64 /* Readonly */; - if (!declaration || !(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest) - || !isConvertibleName(declaration.name) || (ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) - return undefined; + if (!declaration || (!(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest))) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_property_for_which_to_generate_accessor) + }; + } + if (!isConvertibleName(declaration.name)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Name_is_not_valid) + }; + } + if ((ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Can_only_convert_property_with_modifier) + }; + } var name = declaration.name.text; var startWithUnderscore = ts.startsWithUnderscore(name); var fieldName = createPropertyName(startWithUnderscore ? name : ts.getUniqueName("_" + name, file), declaration.name); var accessorName = createPropertyName(startWithUnderscore ? ts.getUniqueName(name.substring(1), file) : name, declaration.name); return { - isStatic: ts.hasStaticModifier(declaration), - isReadonly: ts.hasEffectiveReadonlyModifier(declaration), - type: ts.getTypeAnnotationNode(declaration), - container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, - originalName: declaration.name.text, - declaration: declaration, - fieldName: fieldName, - accessorName: accessorName, - renameAccessor: startWithUnderscore + info: { + isStatic: ts.hasStaticModifier(declaration), + isReadonly: ts.hasEffectiveReadonlyModifier(declaration), + type: ts.getTypeAnnotationNode(declaration), + container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, + originalName: declaration.name.text, + declaration: declaration, + fieldName: fieldName, + accessorName: accessorName, + renameAccessor: startWithUnderscore + } }; } codefix.getAccessorConvertiblePropertyAtPosition = getAccessorConvertiblePropertyAtPosition; @@ -137422,13 +137802,22 @@ var ts; var info = getInfo(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - var description = info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; - var actionName = info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (info.error === undefined) { + var description = info.info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; + var actionName = info.info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_default_export_to_named_export.message, actions: [{ name: actionNameDefaultToNamed, description: ts.Diagnostics.Convert_default_export_to_named_export.message, notApplicableReason: info.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_export_to_default_export.message, actions: [{ name: actionNameNamedToDefault, description: ts.Diagnostics.Convert_named_export_to_default_export.message, notApplicableReason: info.error }] }, + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameDefaultToNamed || actionName === actionNameNamedToDefault, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, ts.Debug.checkDefined(getInfo(context), "context must have info"), t, context.cancellationToken); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, ts.Debug.checkDefined((_a = getInfo(context)) === null || _a === void 0 ? void 0 : _a.info, "context must have info"), t, context.cancellationToken); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; }, }); @@ -137439,14 +137828,14 @@ var ts; var token = ts.getTokenAtPosition(file, span.start); var exportNode = !!(token.parent && ts.getSyntacticModifierFlags(token.parent) & 1 /* Export */) && considerPartialSpans ? token.parent : ts.getParentNodeInSpan(token, file, span); if (!exportNode || (!ts.isSourceFile(exportNode.parent) && !(ts.isModuleBlock(exportNode.parent) && ts.isAmbientModule(exportNode.parent.parent)))) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_export_statement) }; } var exportingModuleSymbol = ts.isSourceFile(exportNode.parent) ? exportNode.parent.symbol : exportNode.parent.parent.symbol; var flags = ts.getSyntacticModifierFlags(exportNode); var wasDefault = !!(flags & 512 /* Default */); // If source file already has a default export, don't offer refactor. if (!(flags & 1 /* Export */) || !wasDefault && exportingModuleSymbol.exports.has("default" /* Default */)) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.This_file_already_has_a_default_export) }; } switch (exportNode.kind) { case 248 /* FunctionDeclaration */: @@ -137456,7 +137845,7 @@ var ts; case 251 /* TypeAliasDeclaration */: case 253 /* ModuleDeclaration */: { var node = exportNode; - return node.name && ts.isIdentifier(node.name) ? { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return node.name && ts.isIdentifier(node.name) ? { info: { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } case 229 /* VariableStatement */: { var vs = exportNode; @@ -137468,7 +137857,7 @@ var ts; if (!decl.initializer) return undefined; ts.Debug.assert(!wasDefault, "Can't have a default flag here"); - return ts.isIdentifier(decl.name) ? { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return ts.isIdentifier(decl.name) ? { info: { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } default: return undefined; @@ -137619,13 +138008,22 @@ var ts; var i = getImportToConvert(context, context.triggerReason === "invoked"); if (!i) return ts.emptyArray; - var description = i.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; - var actionName = i.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (i.error === undefined) { + var description = i.info.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; + var actionName = i.info.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, actions: [{ name: actionNameNamespaceToNamed, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, notApplicableReason: i.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, actions: [{ name: actionNameNamedToNamespace, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, notApplicableReason: i.error }] } + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameNamespaceToNamed || actionName === actionNameNamedToNamespace, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, t, ts.Debug.checkDefined(getImportToConvert(context), "Context must provide an import to convert")); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, t, ts.Debug.checkDefined((_a = getImportToConvert(context)) === null || _a === void 0 ? void 0 : _a.info, "Context must provide an import to convert")); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; } }); @@ -137636,10 +138034,18 @@ var ts; var span = ts.getRefactorContextSpan(context); var token = ts.getTokenAtPosition(file, span.start); var importDecl = considerPartialSpans ? ts.findAncestor(token, ts.isImportDeclaration) : ts.getParentNodeInSpan(token, file, span); - if (!importDecl || !ts.isImportDeclaration(importDecl) || (importDecl.getEnd() < span.start + span.length)) + if (!importDecl || !ts.isImportDeclaration(importDecl)) + return { error: "Selection is not an import declaration." }; + if (importDecl.getEnd() < span.start + span.length) return undefined; var importClause = importDecl.importClause; - return importClause && importClause.namedBindings; + if (!importClause) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_import_clause) }; + } + if (!importClause.namedBindings) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_namespace_import_or_named_imports) }; + } + return { info: importClause.namedBindings }; } function doChange(sourceFile, program, changes, toConvert) { var checker = program.getTypeChecker(); @@ -137908,7 +138314,27 @@ var ts; var rangeToExtract = getRangeToExtract(context.file, ts.getRefactorContextSpan(context), context.triggerReason === "invoked"); var targetRange = rangeToExtract.targetRange; if (targetRange === undefined) { - return ts.emptyArray; + if (!rangeToExtract.errors || rangeToExtract.errors.length === 0 || !context.preferences.provideRefactorNotApplicableReason) { + return ts.emptyArray; + } + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + name: "function_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }, + { + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + name: "constant_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }]; } var extractions = getPossibleExtractions(targetRange, context); if (extractions === undefined) { @@ -137917,17 +138343,18 @@ var ts; } var functionActions = []; var usedFunctionNames = ts.createMap(); + var innermostErrorFunctionAction; var constantActions = []; var usedConstantNames = ts.createMap(); + var innermostErrorConstantAction; var i = 0; for (var _i = 0, extractions_1 = extractions; _i < extractions_1.length; _i++) { var _a = extractions_1[_i], functionExtraction = _a.functionExtraction, constantExtraction = _a.constantExtraction; - // Skip these since we don't have a way to report errors yet + var description = functionExtraction.description; if (functionExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = functionExtraction.description; if (!usedFunctionNames.has(description)) { usedFunctionNames.set(description, true); functionActions.push({ @@ -137936,32 +138363,39 @@ var ts; }); } } + else if (!innermostErrorFunctionAction) { + innermostErrorFunctionAction = { + description: description, + name: "function_scope_" + i, + notApplicableReason: getStringError(functionExtraction.errors) + }; + } // Skip these since we don't have a way to report errors yet if (constantExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = constantExtraction.description; - if (!usedConstantNames.has(description)) { - usedConstantNames.set(description, true); + var description_1 = constantExtraction.description; + if (!usedConstantNames.has(description_1)) { + usedConstantNames.set(description_1, true); constantActions.push({ - description: description, + description: description_1, name: "constant_scope_" + i }); } } + else if (!innermostErrorConstantAction) { + innermostErrorConstantAction = { + description: description, + name: "constant_scope_" + i, + notApplicableReason: getStringError(constantExtraction.errors) + }; + } // *do* increment i anyway because we'll look for the i-th scope // later when actually doing the refactoring if the user requests it i++; } var infos = []; - if (constantActions.length) { - infos.push({ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), - actions: constantActions - }); - } if (functionActions.length) { infos.push({ name: refactorName, @@ -137969,7 +138403,35 @@ var ts; actions: functionActions }); } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorFunctionAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [innermostErrorFunctionAction] + }); + } + if (constantActions.length) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: constantActions + }); + } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorConstantAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [innermostErrorConstantAction] + }); + } return infos.length ? infos : ts.emptyArray; + function getStringError(errors) { + var error = errors[0].messageText; + if (typeof error !== "string") { + error = error.messageText; + } + return error; + } } extractSymbol.getAvailableActions = getAvailableActions; /* Exported for tests */ @@ -139510,21 +139972,36 @@ var ts; var info = getRangeToExtract(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), - actions: info.isJS ? [{ - name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) - }] : ts.append([{ - name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) - }], info.typeElements && { - name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) - }) - }]; + if (info.error === undefined) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: info.info.isJS ? [{ + name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) + }] : ts.append([{ + name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) + }], info.info.typeElements && { + name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) + }) + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: [ + { name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef), notApplicableReason: info.error }, + { name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias), notApplicableReason: info.error }, + { name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface), notApplicableReason: info.error }, + ] + }]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { + var _a; var file = context.file; - var info = ts.Debug.checkDefined(getRangeToExtract(context), "Expected to find a range to extract"); + var info = ts.Debug.checkDefined((_a = getRangeToExtract(context)) === null || _a === void 0 ? void 0 : _a.info, "Expected to find a range to extract"); var name = ts.getUniqueName("NewType", file); var edits = ts.textChanges.ChangeTracker.with(context, function (changes) { switch (actionName) { @@ -139556,14 +140033,14 @@ var ts; var selection = ts.findAncestor(current, (function (node) { return node.parent && ts.isTypeNode(node) && !rangeContainsSkipTrivia(range, node.parent, file) && (cursorRequest || ts.nodeOverlapsWithStartEnd(current, file, range.pos, range.end)); })); if (!selection || !ts.isTypeNode(selection)) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Selection_is_not_a_valid_type_node) }; var checker = context.program.getTypeChecker(); var firstStatement = ts.Debug.checkDefined(ts.findAncestor(selection, ts.isStatement), "Should find a statement"); var typeParameters = collectTypeParameters(checker, selection, firstStatement, file); if (!typeParameters) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.No_type_could_be_extracted_from_this_type_node) }; var typeElements = flattenTypeLiteralNodeReference(checker, selection); - return { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements }; + return { info: { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements } }; } function flattenTypeLiteralNodeReference(checker, node) { if (!node) @@ -139684,32 +140161,47 @@ var ts; if (!context.endPosition) return undefined; var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition); - if (!info) + if (!info || !info.info) return undefined; var edits = ts.codefix.generateAccessorFromProperty(context.file, context.startPosition, context.endPosition, context, actionName); if (!edits) return undefined; var renameFilename = context.file.fileName; - var nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName; + var nameNeedRename = info.info.renameAccessor ? info.info.accessorName : info.info.fieldName; var renameLocationOffset = ts.isIdentifier(nameNeedRename) ? 0 : -1; - var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.declaration)); + var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.info.declaration)); return { renameFilename: renameFilename, renameLocation: renameLocation, edits: edits }; }, getAvailableActions: function (context) { if (!context.endPosition) return ts.emptyArray; - if (!ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked")) + var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked"); + if (!info) return ts.emptyArray; - return [{ - name: actionName, - description: actionDescription, - actions: [ - { - name: actionName, - description: actionDescription - } - ] - }]; + if (!info.error) { + return [{ + name: actionName, + description: actionDescription, + actions: [ + { + name: actionName, + description: actionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: actionName, + description: actionDescription, + actions: [{ + name: actionName, + description: actionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } }); })(generateGetAccessorAndSetAccessor = refactor.generateGetAccessorAndSetAccessor || (refactor.generateGetAccessorAndSetAccessor = {})); @@ -140440,27 +140932,45 @@ var ts; var info = getConvertibleArrowFunctionAtPosition(file, startPosition, triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: refactorDescription, - actions: [ - info.addBraces ? - { + if (info.error === undefined) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [ + info.info.addBraces ? + { + name: addBracesActionName, + description: addBracesActionDescription + } : { + name: removeBracesActionName, + description: removeBracesActionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [{ name: addBracesActionName, - description: addBracesActionDescription - } : { - name: removeBracesActionName, - description: removeBracesActionDescription - } - ] - }]; + description: addBracesActionDescription, + notApplicableReason: info.error + }, { + name: removeBracesActionName, + description: removeBracesActionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } function getEditsForAction(context, actionName) { var file = context.file, startPosition = context.startPosition; var info = getConvertibleArrowFunctionAtPosition(file, startPosition); - if (!info) + if (!info || !info.info) return undefined; - var expression = info.expression, returnStatement = info.returnStatement, func = info.func; + var _a = info.info, expression = _a.expression, returnStatement = _a.returnStatement, func = _a.func; var body; if (actionName === addBracesActionName) { var returnStatement_1 = ts.factory.createReturnStatement(expression); @@ -140488,25 +140998,38 @@ var ts; if (considerFunctionBodies === void 0) { considerFunctionBodies = true; } var node = ts.getTokenAtPosition(file, startPosition); var func = ts.getContainingFunction(node); - // Only offer a refactor in the function body on explicit refactor requests. - if (!func || !ts.isArrowFunction(func) || (!ts.rangeContainsRange(func, node) - || (ts.rangeContainsRange(func.body, node) && !considerFunctionBodies))) + if (!func) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_a_containing_arrow_function) + }; + } + if (!ts.isArrowFunction(func)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Containing_function_is_not_an_arrow_function) + }; + } + if ((!ts.rangeContainsRange(func, node) || ts.rangeContainsRange(func.body, node) && !considerFunctionBodies)) { return undefined; + } if (ts.isExpression(func.body)) { return { - func: func, - addBraces: true, - expression: func.body + info: { + func: func, + addBraces: true, + expression: func.body + } }; } else if (func.body.statements.length === 1) { var firstStatement = ts.first(func.body.statements); if (ts.isReturnStatement(firstStatement)) { return { - func: func, - addBraces: false, - expression: firstStatement.expression, - returnStatement: firstStatement + info: { + func: func, + addBraces: false, + expression: firstStatement.expression, + returnStatement: firstStatement + } }; } } @@ -142491,6 +143014,10 @@ var ts; synchronizeHostData(); return program; } + function getAutoImportProvider() { + var _a; + return (_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host); + } function cleanupSemanticCache() { program = undefined; // TODO: GH#18217 } @@ -143159,6 +143686,7 @@ var ts; getEmitOutput: getEmitOutput, getNonBoundSourceFile: getNonBoundSourceFile, getProgram: getProgram, + getAutoImportProvider: getAutoImportProvider, getApplicableRefactors: getApplicableRefactors, getEditsForRefactor: getEditsForRefactor, toLineColumnOffset: sourceMapper.toLineColumnOffset, diff --git a/lib/typescriptServices.d.ts b/lib/typescriptServices.d.ts index 0d481a30154..4d70aa1dd0d 100644 --- a/lib/typescriptServices.d.ts +++ b/lib/typescriptServices.d.ts @@ -2538,9 +2538,19 @@ declare namespace ts { } export interface GenericType extends InterfaceType, TypeReference { } + export enum ElementFlags { + Required = 1, + Optional = 2, + Rest = 4, + Variadic = 8, + Variable = 12 + } export interface TupleType extends GenericType { + elementFlags: readonly ElementFlags[]; minLength: number; + fixedLength: number; hasRestElement: boolean; + combinedFlags: ElementFlags; readonly: boolean; labeledElementDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[]; } @@ -3789,6 +3799,8 @@ declare namespace ts { readonly importModuleSpecifierEnding?: "auto" | "minimal" | "index" | "js"; readonly allowTextChangesInNewFiles?: boolean; readonly providePrefixAndSuffixTextForRename?: boolean; + readonly includePackageJsonAutoImports?: "exclude-dev" | "all" | "none"; + readonly provideRefactorNotApplicableReason?: boolean; } /** Represents a bigint literal value without requiring bigint support */ export interface PseudoBigInt { @@ -5278,6 +5290,10 @@ declare namespace ts { fileName: Path; packageName: string; } + interface PerformanceEvent { + kind: "UpdateGraph" | "CreatePackageJsonAutoImportProvider"; + durationMs: number; + } interface LanguageServiceHost extends GetEffectiveTypeRootsHost { getCompilationSettings(): CompilerOptions; getNewLine?(): string; @@ -5660,6 +5676,11 @@ declare namespace ts { * so this description should make sense by itself if the parent is inlineable=true */ description: string; + /** + * A message to show to the user if the refactoring cannot be applied in + * the current context. + */ + notApplicableReason?: string; } /** * A set of edits to make in response to a refactor action, plus an optional @@ -5937,6 +5958,7 @@ declare namespace ts { source?: string; isRecommended?: true; isFromUncheckedFile?: true; + isPackageJsonImport?: true; } interface CompletionEntryDetails { name: string; diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 51b0cbdc0a3..166e171cd3a 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -244,7 +244,7 @@ var ts; // If changing the text in this section, be sure to test `configurePrerelease` too. ts.versionMajorMinor = "4.0"; /** The version of the TypeScript compiler release */ - ts.version = ts.versionMajorMinor + ".0-dev"; + ts.version = ts.versionMajorMinor + ".0-beta"; /** * Returns the native Map implementation if it is available and compatible (i.e. supports iteration). */ @@ -1352,6 +1352,14 @@ var ts; return values; } ts.getOwnValues = getOwnValues; + function arrayOf(count, f) { + var result = new Array(count); + for (var i = 0; i < count; i++) { + result[i] = f(i); + } + return result; + } + ts.arrayOf = arrayOf; function arrayFrom(iterator, map) { var result = []; for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) { @@ -4288,6 +4296,14 @@ var ts; VarianceFlags[VarianceFlags["Unreliable"] = 16] = "Unreliable"; VarianceFlags[VarianceFlags["AllowsStructuralFallback"] = 24] = "AllowsStructuralFallback"; })(VarianceFlags = ts.VarianceFlags || (ts.VarianceFlags = {})); + var ElementFlags; + (function (ElementFlags) { + ElementFlags[ElementFlags["Required"] = 1] = "Required"; + ElementFlags[ElementFlags["Optional"] = 2] = "Optional"; + ElementFlags[ElementFlags["Rest"] = 4] = "Rest"; + ElementFlags[ElementFlags["Variadic"] = 8] = "Variadic"; + ElementFlags[ElementFlags["Variable"] = 12] = "Variable"; + })(ElementFlags = ts.ElementFlags || (ts.ElementFlags = {})); /* @internal */ var JsxReferenceKind; (function (JsxReferenceKind) { @@ -7580,6 +7596,11 @@ var ts; Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), + Source_has_0_element_s_but_target_requires_1: diag(2618, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), + Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), + Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), + Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), + Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other: diag(2622, ts.DiagnosticCategory.Error, "Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other_2622", "Element at index {0} is variadic in one type but not in the other."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), @@ -8410,6 +8431,17 @@ var ts; Convert_to_named_function: diag(95124, ts.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: diag(95125, ts.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: diag(95126, ts.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"), + Could_not_find_a_containing_arrow_function: diag(95127, ts.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), + Containing_function_is_not_an_arrow_function: diag(95128, ts.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), + Could_not_find_export_statement: diag(95129, ts.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"), + This_file_already_has_a_default_export: diag(95130, ts.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"), + Could_not_find_import_clause: diag(95131, ts.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"), + Could_not_find_namespace_import_or_named_imports: diag(95132, ts.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), + Selection_is_not_a_valid_type_node: diag(95133, ts.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), + No_type_could_be_extracted_from_this_type_node: diag(95134, ts.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), + Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), + Name_is_not_valid: diag(95136, ts.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"), + Can_only_convert_property_with_modifier: diag(95137, ts.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: diag(18006, ts.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), @@ -29915,7 +29947,7 @@ var ts; type = finishNode(factory.createJSDocNonNullableType(type), pos); break; case 57 /* QuestionToken */: - // If not in JSDoc and next token is start of a type we have a conditional type + // If next token is start of a type we have a conditional type if (lookAhead(nextTokenIsStartOfType)) { return type; } @@ -36720,7 +36752,7 @@ var ts; includeSpecs = ["**/*"]; } var result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile); - if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) { + if (shouldReportNoInputFiles(result, canJsonReportNoInputFiles(raw), resolutionStack)) { errors.push(getErrorForNoInputFiles(result.spec, configFileName)); } if (ts.hasProperty(raw, "references") && !isNullOrUndefined(raw.references)) { @@ -36763,10 +36795,10 @@ var ts; return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0); } /*@internal*/ - function canJsonReportNoInutFiles(raw) { + function canJsonReportNoInputFiles(raw) { return !ts.hasProperty(raw, "files") && !ts.hasProperty(raw, "references"); } - ts.canJsonReportNoInutFiles = canJsonReportNoInutFiles; + ts.canJsonReportNoInputFiles = canJsonReportNoInputFiles; /*@internal*/ function updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) { var existingErrors = configParseDiagnostics.length; @@ -42572,6 +42604,7 @@ var ts; getAllPossiblePropertiesOfTypes: getAllPossiblePropertiesOfTypes, getSuggestedSymbolForNonexistentProperty: getSuggestedSymbolForNonexistentProperty, getSuggestionForNonexistentProperty: getSuggestionForNonexistentProperty, + getSuggestedSymbolForNonexistentJSXAttribute: getSuggestedSymbolForNonexistentJSXAttribute, getSuggestedSymbolForNonexistentSymbol: function (location, name, meaning) { return getSuggestedSymbolForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestionForNonexistentSymbol: function (location, name, meaning) { return getSuggestionForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestedSymbolForNonexistentModule: getSuggestedSymbolForNonexistentModule, @@ -46253,21 +46286,21 @@ var ts; if (typeArguments.length > 0) { var arity = getTypeReferenceArity(type); var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context); - var hasRestElement = type.target.hasRestElement; if (tupleConstituentNodes) { if (type.target.labeledElementDeclarations) { for (var i = 0; i < tupleConstituentNodes.length; i++) { - var isOptionalOrRest = i >= type.target.minLength; - var isRest = isOptionalOrRest && hasRestElement && i === arity - 1; - var isOptional = isOptionalOrRest && !isRest; - tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(isRest ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), isOptional ? ts.factory.createToken(57 /* QuestionToken */) : undefined, isRest ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]); + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(flags & 12 /* Variable */ ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), flags & 2 /* Optional */ ? ts.factory.createToken(57 /* QuestionToken */) : undefined, flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]); } } else { - for (var i = type.target.minLength; i < Math.min(arity, tupleConstituentNodes.length); i++) { - tupleConstituentNodes[i] = hasRestElement && i === arity - 1 ? - ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(tupleConstituentNodes[i])) : - ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]); + for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) { + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = + flags & 12 /* Variable */ ? ts.factory.createRestTypeNode(flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : + flags & 2 /* Optional */ ? ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]; } } var tupleTypeNode = ts.setEmitFlags(ts.factory.createTupleTypeNode(tupleConstituentNodes), 1 /* SingleLine */); @@ -49378,13 +49411,14 @@ var ts; function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) { var elements = pattern.elements; var lastElement = ts.lastOrUndefined(elements); - var hasRestElement = !!(lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken); - if (elements.length === 0 || elements.length === 1 && hasRestElement) { + var restElement = lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken ? lastElement : undefined; + if (elements.length === 0 || elements.length === 1 && restElement) { return languageVersion >= 2 /* ES2015 */ ? createIterableType(anyType) : anyArrayType; } var elementTypes = ts.map(elements, function (e) { return ts.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors); }); - var minLength = ts.findLastIndex(elements, function (e) { return !ts.isOmittedExpression(e) && !hasDefaultValue(e); }, elements.length - (hasRestElement ? 2 : 1)) + 1; - var result = createTupleType(elementTypes, minLength, hasRestElement); + var minLength = ts.findLastIndex(elements, function (e) { return !(e === restElement || ts.isOmittedExpression(e) || hasDefaultValue(e)); }, elements.length - 1) + 1; + var elementFlags = ts.map(elements, function (e, i) { return e === restElement ? 4 /* Rest */ : i >= minLength ? 2 /* Optional */ : 1 /* Required */; }); + var result = createTupleType(elementTypes, elementFlags); if (includePatternInType) { result = cloneTypeReference(result); result.pattern = pattern; @@ -50030,7 +50064,7 @@ var ts; function getBaseTypes(type) { if (!type.resolvedBaseTypes) { if (type.objectFlags & 8 /* Tuple */) { - type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters || ts.emptyArray), type.readonly)]; + type.resolvedBaseTypes = [getTupleBaseType(type)]; } else if (type.symbol.flags & (32 /* Class */ | 64 /* Interface */)) { if (type.symbol.flags & 32 /* Class */) { @@ -50046,6 +50080,10 @@ var ts; } return type.resolvedBaseTypes; } + function getTupleBaseType(type) { + var elementTypes = ts.sameMap(type.typeParameters, function (t, i) { return type.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t; }); + return createArrayType(getUnionType(elementTypes || ts.emptyArray), type.readonly); + } function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = ts.resolvingEmptyArray; var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); @@ -50846,17 +50884,16 @@ var ts; return [sig.parameters]; function expandSignatureParametersWithTupleMembers(restType, restIndex) { var elementTypes = getTypeArguments(restType); - var minLength = restType.target.minLength; - var tupleRestIndex = restType.target.hasRestElement ? elementTypes.length - 1 : -1; var associatedNames = restType.target.labeledElementDeclarations; var restParams = ts.map(elementTypes, function (t, i) { // Lookup the label from the individual tuple passed in before falling back to the signature `rest` parameter name var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]); var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i); - var checkFlags = i === tupleRestIndex ? 32768 /* RestParameter */ : - i >= minLength ? 16384 /* OptionalParameter */ : 0; + var flags = restType.target.elementFlags[i]; + var checkFlags = flags & 12 /* Variable */ ? 32768 /* RestParameter */ : + flags & 2 /* Optional */ ? 16384 /* OptionalParameter */ : 0; var symbol = createSymbol(1 /* FunctionScopedVariable */, name, checkFlags); - symbol.type = i === tupleRestIndex ? createArrayType(t) : t; + symbol.type = flags & 4 /* Rest */ ? createArrayType(t) : t; return symbol; }); return ts.concatenate(sig.parameters.slice(0, restIndex), restParams); @@ -51545,6 +51582,9 @@ var ts; return indexedAccess; } } + if (isGenericTupleType(type.objectType)) { + return getIndexTypeOfType(type.objectType, 1 /* Number */); + } var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType); if (objectConstraint && objectConstraint !== type.objectType) { return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType); @@ -51724,6 +51764,9 @@ var ts; return keyofConstraintType; } if (t.flags & 8388608 /* IndexedAccess */) { + if (isGenericTupleType(t.objectType)) { + return getIndexTypeOfType(t.objectType, 1 /* Number */); + } var baseObjectType = getBaseConstraint(t.objectType); var baseIndexType = getBaseConstraint(t.indexType); var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType); @@ -52642,9 +52685,11 @@ var ts; } } } - // When an 'infer T' declaration is immediately contained in a rest parameter - // declaration, we infer an 'unknown[]' constraint. - else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken) { + // When an 'infer T' declaration is immediately contained in a rest parameter declaration, a rest type + // or a named rest tuple element, we infer an 'unknown[]' constraint. + else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken || + grandParent.kind === 180 /* RestType */ || + grandParent.kind === 191 /* NamedTupleMember */ && grandParent.dotDotDotToken) { inferences = ts.append(inferences, createArrayType(unknownType)); } } @@ -52766,9 +52811,7 @@ var ts; } else { type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function () { return errorType; })) || ts.emptyArray; - error(type.node || currentNode, type.target.symbol - ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves - : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); + error(type.node || currentNode, type.target.symbol ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); } } return type.resolvedTypeArguments; @@ -53199,22 +53242,32 @@ var ts; function createArrayType(elementType, readonly) { return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]); } - function isTupleRestElement(node) { - return node.kind === 180 /* RestType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.dotDotDotToken); + function getTupleElementFlags(node) { + switch (node.kind) { + case 179 /* OptionalType */: + return 2 /* Optional */; + case 180 /* RestType */: + return getRestTypeElementFlags(node); + case 191 /* NamedTupleMember */: + return node.questionToken ? 2 /* Optional */ : + node.dotDotDotToken ? getRestTypeElementFlags(node) : + 1 /* Required */; + default: + return 1 /* Required */; + } } - function isTupleOptionalElement(node) { - return node.kind === 179 /* OptionalType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.questionToken); + function getRestTypeElementFlags(node) { + return getArrayElementTypeNode(node.type) ? 4 /* Rest */ : 8 /* Variadic */; } function getArrayOrTupleTargetType(node) { var readonly = isReadonlyTypeOperator(node.parent); - if (node.kind === 177 /* ArrayType */ || node.elements.length === 1 && isTupleRestElement(node.elements[0])) { + var elementType = getArrayElementTypeNode(node); + if (elementType) { return readonly ? globalReadonlyArrayType : globalArrayType; } - var lastElement = ts.lastOrUndefined(node.elements); - var restElement = lastElement && isTupleRestElement(lastElement) ? lastElement : undefined; - var minLength = ts.findLastIndex(node.elements, function (n) { return !isTupleOptionalElement(n) && n !== restElement; }) + 1; + var elementFlags = ts.map(node.elements, getTupleElementFlags); var missingName = ts.some(node.elements, function (e) { return e.kind !== 191 /* NamedTupleMember */; }); - return getTupleTypeOfArity(node.elements.length, minLength, !!restElement, readonly, /*associatedNames*/ missingName ? undefined : node.elements); + return getTupleTargetType(elementFlags, readonly, /*associatedNames*/ missingName ? undefined : node.elements); } // Return true if the given type reference node is directly aliased or if it needs to be deferred // because it is possibly contained in a circular chain of eagerly resolved types. @@ -53283,13 +53336,13 @@ var ts; if (target === emptyGenericType) { links.resolvedType = emptyObjectType; } - else if (isDeferredTypeReferenceNode(node)) { + else if (!(node.kind === 178 /* TupleType */ && ts.some(node.elements, function (e) { return !!(getTupleElementFlags(e) & 8 /* Variadic */); })) && isDeferredTypeReferenceNode(node)) { links.resolvedType = node.kind === 178 /* TupleType */ && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, /*mapper*/ undefined); } else { var elementTypes = node.kind === 177 /* ArrayType */ ? [getTypeFromTypeNode(node.elementType)] : ts.map(node.elements, getTypeFromTypeNode); - links.resolvedType = createTypeReference(target, elementTypes); + links.resolvedType = createNormalizedTypeReference(target, elementTypes); } } return links.resolvedType; @@ -53297,6 +53350,27 @@ var ts; function isReadonlyTypeOperator(node) { return ts.isTypeOperatorNode(node) && node.operator === 141 /* ReadonlyKeyword */; } + function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) { + if (readonly === void 0) { readonly = false; } + var tupleTarget = getTupleTargetType(elementFlags || ts.map(elementTypes, function (_) { return 1 /* Required */; }), readonly, namedMemberDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : + tupleTarget; + } + function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + if (elementFlags.length === 1 && elementFlags[0] & 4 /* Rest */) { + // [...X[]] is equivalent to just X[] + return readonly ? globalReadonlyArrayType : globalArrayType; + } + var key = ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? "#" : f & 2 /* Optional */ ? "?" : f & 4 /* Rest */ ? "." : "*"; }).join() + + (readonly ? "R" : "") + + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); + var type = tupleTypes.get(key); + if (!type) { + tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations)); + } + return type; + } // We represent tuple types as type references to synthesized generic interface types created by // this function. The types are of the form: // @@ -53304,27 +53378,37 @@ var ts; // // Note that the generic type created by this function has no symbol associated with it. The same // is true for each of the synthesized type parameters. - function createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { + function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + var arity = elementFlags.length; + var minLength = ts.findLastIndex(elementFlags, function (f) { return !!(f & (1 /* Required */ | 8 /* Variadic */)); }) + 1; var typeParameters; var properties = []; - var maxLength = hasRestElement ? arity - 1 : arity; + var combinedFlags = 0; if (arity) { typeParameters = new Array(arity); for (var i = 0; i < arity; i++) { var typeParameter = typeParameters[i] = createTypeParameter(); - if (i < maxLength) { - var property = createSymbol(4 /* Property */ | (i >= minLength ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); + var flags = elementFlags[i]; + combinedFlags |= flags; + if (!(combinedFlags & 12 /* Variable */)) { + var property = createSymbol(4 /* Property */ | (flags & 2 /* Optional */ ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i]; property.type = typeParameter; properties.push(property); } } } - var literalTypes = []; - for (var i = minLength; i <= maxLength; i++) - literalTypes.push(getLiteralType(i)); + var fixedLength = properties.length; var lengthSymbol = createSymbol(4 /* Property */, "length"); - lengthSymbol.type = hasRestElement ? numberType : getUnionType(literalTypes); + if (combinedFlags & 12 /* Variable */) { + lengthSymbol.type = numberType; + } + else { + var literalTypes_1 = []; + for (var i = minLength; i <= arity; i++) + literalTypes_1.push(getLiteralType(i)); + lengthSymbol.type = getUnionType(literalTypes_1); + } properties.push(lengthSymbol); var type = createObjectType(8 /* Tuple */ | 4 /* Reference */); type.typeParameters = typeParameters; @@ -53342,38 +53426,110 @@ var ts; type.declaredConstructSignatures = ts.emptyArray; type.declaredStringIndexInfo = undefined; type.declaredNumberIndexInfo = undefined; + type.elementFlags = elementFlags; type.minLength = minLength; - type.hasRestElement = hasRestElement; + type.fixedLength = fixedLength; + type.hasRestElement = !!(combinedFlags & 12 /* Variable */); + type.combinedFlags = combinedFlags; type.readonly = readonly; type.labeledElementDeclarations = namedMemberDeclarations; return type; } - function getTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { - var key = arity + (hasRestElement ? "+" : ",") + minLength + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); - var type = tupleTypes.get(key); - if (!type) { - tupleTypes.set(key, type = createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations)); - } - return type; + function createNormalizedTypeReference(target, typeArguments) { + return target.objectFlags & 8 /* Tuple */ && target.combinedFlags & 8 /* Variadic */ ? + createNormalizedTupleType(target, typeArguments) : + createTypeReference(target, typeArguments); } - function createTupleType(elementTypes, minLength, hasRestElement, readonly, namedMemberDeclarations) { - if (minLength === void 0) { minLength = elementTypes.length; } - if (hasRestElement === void 0) { hasRestElement = false; } - if (readonly === void 0) { readonly = false; } - var arity = elementTypes.length; - if (arity === 1 && hasRestElement) { - return createArrayType(elementTypes[0], readonly); + function createNormalizedTupleType(target, elementTypes) { + var _a, _b, _c; + // Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z] + var unionIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (131072 /* Never */ | 1048576 /* Union */)); }); + if (unionIndex >= 0) { + return mapType(elementTypes[unionIndex], function (t) { return createNormalizedTupleType(target, ts.replaceElement(elementTypes, unionIndex, t)); }); + } + // If there are no variadic elements with non-generic types, just create a type reference with the same target type. + var spreadIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */) && !(t.flags & 58982400 /* InstantiableNonPrimitive */) && !isGenericMappedType(t); }); + if (spreadIndex < 0) { + return createTypeReference(target, elementTypes); + } + // We have non-generic variadic elements that need normalization. + var expandedTypes = []; + var expandedFlags = []; + var expandedDeclarations = []; + var optionalIndex = -1; + var restTypes; + var _loop_12 = function (i) { + var type = elementTypes[i]; + var flags = target.elementFlags[i]; + if (flags & 8 /* Variadic */) { + if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + // Generic variadic elements stay as they are (except following a rest element). + addElementOrRest(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + } + else if (isTupleType(type)) { + // Spread variadic elements with tuple types into the resulting tuple. + ts.forEach(getTypeArguments(type), function (t, n) { var _a; return addElementOrRest(t, type.target.elementFlags[n], (_a = type.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[n]); }); + } + else { + // Treat everything else as an array type and create a rest element. + addElementOrRest(isArrayLikeType(type) && getIndexTypeOfType(type, 1 /* Number */) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i]); + } + } + else { + // Copy other element kinds with no change. + addElementOrRest(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i]); + } + }; + for (var i = 0; i < elementTypes.length; i++) { + _loop_12(i); + } + if (restTypes) { + // Create a union of the collected rest element types. + expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); + } + var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : + tupleTarget; + function addElementOrRest(type, flags, declaration) { + if (restTypes) { + // A rest element was previously added, so simply collect the type of this element. + restTypes.push(flags & 8 /* Variadic */ ? getIndexedAccessType(type, numberType) : type); + } + else { + if (flags & 1 /* Required */ && optionalIndex >= 0) { + // Turn preceding optional elements into required elements + for (var i = optionalIndex; i < expandedFlags.length; i++) { + if (expandedFlags[i] & 2 /* Optional */) + expandedFlags[i] = 1 /* Required */; + } + optionalIndex = -1; + } + else if (flags & 2 /* Optional */ && optionalIndex < 0) { + optionalIndex = expandedFlags.length; + } + else if (flags & 4 /* Rest */) { + // Start collecting element types when a rest element is added. + restTypes = [type]; + } + expandedTypes.push(type); + expandedFlags.push(flags); + if (expandedDeclarations && declaration) { + expandedDeclarations.push(declaration); + } + else { + expandedDeclarations = undefined; + } + } } - var tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, namedMemberDeclarations); - return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType; } - function sliceTupleType(type, index) { - var tuple = type.target; - if (tuple.hasRestElement) { - // don't slice off rest element - index = Math.min(index, getTypeReferenceArity(type) - 1); - } - return createTupleType(getTypeArguments(type).slice(index), Math.max(0, tuple.minLength - index), tuple.hasRestElement, tuple.readonly, tuple.labeledElementDeclarations && tuple.labeledElementDeclarations.slice(index)); + function sliceTupleType(type, index, endSkipCount) { + if (endSkipCount === void 0) { endSkipCount = 0; } + var target = type.target; + var endIndex = getTypeReferenceArity(type) - endSkipCount; + return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts.emptyArray) : + createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), + /*readonly*/ false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex)); } function getTypeFromOptionalTypeNode(node) { var type = getTypeFromTypeNode(node.type); @@ -53887,7 +54043,7 @@ var ts; type = getReducedType(type); return type.flags & 1048576 /* Union */ ? getIntersectionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : type.flags & 2097152 /* Intersection */ ? getUnionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : - maybeTypeOfKind(type, 58982400 /* InstantiableNonPrimitive */) ? getIndexTypeForGenericType(type, stringsOnly) : + type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericTupleType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts.getObjectFlags(type) & 32 /* Mapped */ ? filterType(getConstraintTypeFromMappedType(type), function (t) { return !(noIndexSignatures && t.flags & (1 /* Any */ | 4 /* String */)); }) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : @@ -54134,7 +54290,7 @@ var ts; } return !!(type.objectFlags & 8388608 /* IsGenericObjectType */); } - return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type); + return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type) || isGenericTupleType(type); } function isGenericIndexType(type) { if (type.flags & 3145728 /* UnionOrIntersection */) { @@ -54208,6 +54364,15 @@ var ts; } // So ultimately (reading): // ((A & B) | C)[K1 | K2] -> ((A & B) | C)[K1] | ((A & B) | C)[K2] -> (A & B)[K1] | C[K1] | (A & B)[K2] | C[K2] -> (A[K1] & B[K1]) | C[K1] | (A[K2] & B[K2]) | C[K2] + // A generic tuple type indexed by a number exists only when the index type doesn't select a + // fixed element. We simplify to either the combined type of all elements (when the index type + // the actual number type) or to the combined type of all non-fixed elements. + if (isGenericTupleType(objectType) && indexType.flags & 296 /* NumberLike */) { + var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 /* Number */ ? 0 : objectType.target.fixedLength, /*endSkipCount*/ 0, writing); + if (elementType) { + return type[cache] = elementType; + } + } // If the object type is a mapped type { [P in K]: E }, where K is generic, instantiate E using a mapper // that substitutes the index type for P. For example, for an index access { [P in K]: Box }[X], we // construct the type Box. @@ -54254,6 +54419,18 @@ var ts; function getIndexedAccessType(objectType, indexType, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, 0 /* None */, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } + function indexTypeLessThan(indexType, limit) { + return everyType(indexType, function (t) { + if (t.flags & 384 /* StringOrNumberLiteral */) { + var propName = getPropertyNameFromType(t); + if (isNumericLiteralName(propName)) { + var index = +propName; + return index >= 0 && index < limit; + } + } + return false; + }); + } function getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, accessFlags, aliasSymbol, aliasTypeArguments) { if (accessFlags === void 0) { accessFlags = 0 /* None */; } if (objectType === wildcardType || indexType === wildcardType) { @@ -54264,12 +54441,15 @@ var ts; if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { indexType = stringType; } - // If the index type is generic, or if the object type is generic and doesn't originate in an expression, - // we are performing a higher-order index access where we cannot meaningfully access the properties of the - // object type. Note that for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in - // an expression. This is to preserve backwards compatibility. For example, an element access 'this["foo"]' - // has always been resolved eagerly using the constraint type of 'this' at the given location. - if (isGenericIndexType(indexType) || !(accessNode && accessNode.kind !== 188 /* IndexedAccessType */) && isGenericObjectType(objectType)) { + // If the index type is generic, or if the object type is generic and doesn't originate in an expression and + // the operation isn't exclusively indexing the fixed (non-variadic) portion of a tuple type, we are performing + // a higher-order index access where we cannot meaningfully access the properties of the object type. Note that + // for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in an expression. This is to + // preserve backwards compatibility. For example, an element access 'this["foo"]' has always been resolved + // eagerly using the constraint type of 'this' at the given location. + if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 188 /* IndexedAccessType */ ? + isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : + isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) { if (objectType.flags & 3 /* AnyOrUnknown */) { return objectType; } @@ -54351,7 +54531,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_12 = function () { + var _loop_13 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54425,7 +54605,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_12(); + var state_4 = _loop_13(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -54863,19 +55043,32 @@ var ts; } return links.resolvedType; } + function getTypeFromRestTypeNode(node) { + return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type); + } + function getArrayElementTypeNode(node) { + switch (node.kind) { + case 185 /* ParenthesizedType */: + return getArrayElementTypeNode(node.type); + case 178 /* TupleType */: + if (node.elements.length === 1) { + node = node.elements[0]; + if (node.kind === 180 /* RestType */ || node.kind === 191 /* NamedTupleMember */ && node.dotDotDotToken) { + return getArrayElementTypeNode(node.type); + } + } + break; + case 177 /* ArrayType */: + return node.elementType; + } + return undefined; + } function getTypeFromNamedTupleTypeNode(node) { var links = getNodeLinks(node); - if (!links.resolvedType) { - var type = getTypeFromTypeNode(node.type); - if (node.dotDotDotToken) { - type = getElementTypeOfArrayType(type) || errorType; - } - if (node.questionToken && strictNullChecks) { - type = getOptionalType(type); - } - links.resolvedType = type; - } - return links.resolvedType; + return links.resolvedType || (links.resolvedType = + node.dotDotDotToken ? getTypeFromRestTypeNode(node) : + node.questionToken && strictNullChecks ? getOptionalType(getTypeFromTypeNode(node.type)) : + getTypeFromTypeNode(node.type)); } function getTypeFromTypeNode(node) { return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node); @@ -54943,7 +55136,7 @@ var ts; case 298 /* JSDocTypeExpression */: return getTypeFromTypeNode(node.type); case 180 /* RestType */: - return getElementTypeOfArrayType(getTypeFromTypeNode(node.type)) || errorType; + return getTypeFromRestTypeNode(node); case 305 /* JSDocVariadicType */: return getTypeFromJSDocVariadicType(node); case 173 /* FunctionType */: @@ -55235,6 +55428,9 @@ var ts; if (typeVariable !== mappedTypeVariable) { return mapType(getReducedType(mappedTypeVariable), function (t) { if (t.flags & (3 /* AnyOrUnknown */ | 58982400 /* InstantiableNonPrimitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && t !== wildcardType && t !== errorType) { + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } var replacementMapper = prependTypeMapping(typeVariable, t, mapper); return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) : isTupleType(t) ? instantiateMappedTupleType(t, type, replacementMapper) : @@ -55249,23 +55445,39 @@ var ts; function getModifiedReadonlyState(state, modifiers) { return modifiers & 1 /* IncludeReadonly */ ? true : modifiers & 2 /* ExcludeReadonly */ ? false : state; } + function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) { + // When a tuple type is generic (i.e. when it contains variadic elements), we want to eagerly map the + // non-generic elements and defer mapping the generic elements. In order to facilitate this, we transform + // M<[A, B?, ...T, ...C[]] into [...M<[A]>, ...M<[B?]>, ...M, ...M] and then rely on tuple type + // normalization to resolve the non-generic parts of the resulting tuple. + var elementFlags = tupleType.target.elementFlags; + var elementTypes = ts.map(getTypeArguments(tupleType), function (t, i) { + var singleton = elementFlags[i] & 8 /* Variadic */ ? t : + elementFlags[i] & 4 /* Rest */ ? createArrayType(t) : + createTupleType([t], [elementFlags[i]]); + // The singleton is never a generic tuple type, so it is safe to recurse here. + return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); + }); + var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); + return createTupleType(elementTypes, ts.map(elementTypes, function (_) { return 8 /* Variadic */; }), newReadonly); + } function instantiateMappedArrayType(arrayType, mappedType, mapper) { var elementType = instantiateMappedTypeTemplate(mappedType, numberType, /*isOptional*/ true, mapper); return elementType === errorType ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); } function instantiateMappedTupleType(tupleType, mappedType, mapper) { - var minLength = tupleType.target.minLength; + var elementFlags = tupleType.target.elementFlags; var elementTypes = ts.map(getTypeArguments(tupleType), function (_, i) { - return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), i >= minLength, mapper); + return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), !!(elementFlags[i] & 2 /* Optional */), mapper); }); var modifiers = getMappedTypeModifiers(mappedType); - var newMinLength = modifiers & 4 /* IncludeOptional */ ? 0 : - modifiers & 8 /* ExcludeOptional */ ? getTypeReferenceArity(tupleType) - (tupleType.target.hasRestElement ? 1 : 0) : - minLength; + var newTupleModifiers = modifiers & 4 /* IncludeOptional */ ? ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? 2 /* Optional */ : f; }) : + modifiers & 8 /* ExcludeOptional */ ? ts.map(elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + elementFlags; var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); return ts.contains(elementTypes, errorType) ? errorType : - createTupleType(elementTypes, newMinLength, tupleType.target.hasRestElement, newReadonly, tupleType.target.labeledElementDeclarations); + createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); } function instantiateMappedTypeTemplate(type, key, isOptional, mapper) { var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); @@ -55362,7 +55574,7 @@ var ts; if (objectFlags & 4 /* Reference */ && !(type.node)) { var resolvedTypeArguments = type.resolvedTypeArguments; var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper); - return newTypeArguments !== resolvedTypeArguments ? createTypeReference(type.target, newTypeArguments) : type; + return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type; } return getObjectTypeInstantiation(type, mapper); } @@ -56871,7 +57083,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_13 = function (prop) { + var _loop_14 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56886,13 +57098,20 @@ var ts; if (ts.isJsxAttributes(errorNode) || ts.isJsxOpeningLikeElement(errorNode) || ts.isJsxOpeningLikeElement(errorNode.parent)) { // JsxAttributes has an object-literal flag and undergo same type-assignablity check as normal object-literal. // However, using an object-literal error message will be very confusing to the users so we give different a message. - // TODO: Spelling suggestions for excess jsx attributes (needs new diagnostic messages) if (prop.valueDeclaration && ts.isJsxAttribute(prop.valueDeclaration) && ts.getSourceFileOfNode(errorNode) === ts.getSourceFileOfNode(prop.valueDeclaration.name)) { // Note that extraneous children (as in `extra`) don't pass this check, // since `children` is a SyntaxKind.PropertySignature instead of a SyntaxKind.JsxAttribute. errorNode = prop.valueDeclaration.name; } - reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(errorTarget)); + var propName = symbolToString(prop); + var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget); + var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined; + if (suggestion) { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion); + } + else { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget)); + } } else { // use the property's value declaration if the property is assigned inside the literal itself @@ -56927,7 +57146,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_13(prop); + var state_5 = _loop_14(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57218,6 +57437,12 @@ var ts; return varianceResult; } } + // For a generic type T, [...T] is assignable to T, T is assignable to readonly [...T], and T is assignable + // to [...T] when T is constrained to a mutable array or tuple type. + if (isSingleElementGenericTupleType(source) && getTypeArguments(source)[0] === target && !source.target.readonly || + isSingleElementGenericTupleType(target) && getTypeArguments(target)[0] === source && (target.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source) || source))) { + return -1 /* True */; + } if (target.flags & 262144 /* TypeParameter */) { // A source type { [P in Q]: X } is related to a target type T if keyof T is related to Q and X is related to T[Q]. if (ts.getObjectFlags(source) & 32 /* Mapped */ && isRelatedTo(getIndexType(target), getConstraintTypeFromMappedType(source))) { @@ -57594,11 +57819,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_14 = function (combination) { + var _loop_15 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_15 = function (i) { + var _loop_16 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57614,7 +57839,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_15(i); + var state_7 = _loop_16(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57628,7 +57853,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_14(combination); + var state_6 = _loop_15(combination); if (typeof state_6 === "object") return state_6.value; } @@ -57817,6 +58042,80 @@ var ts; if (relation === identityRelation) { return propertiesIdenticalTo(source, target, excludedProperties); } + var result = -1 /* True */; + if (isTupleType(target)) { + if (isArrayType(source) || isTupleType(source)) { + if (!target.target.readonly && (isReadonlyArrayType(source) || isTupleType(source) && source.target.readonly)) { + return 0 /* False */; + } + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var sourceRestFlag = isTupleType(source) ? source.target.combinedFlags & 4 /* Rest */ : 4 /* Rest */; + var targetRestFlag = target.target.combinedFlags & 4 /* Rest */; + var sourceMinLength = isTupleType(source) ? source.target.minLength : 0; + var targetMinLength = target.target.minLength; + if (!sourceRestFlag && sourceArity < targetMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength); + } + return 0 /* False */; + } + if (!targetRestFlag && targetArity < sourceMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity); + } + return 0 /* False */; + } + if (!targetRestFlag && sourceRestFlag) { + if (reportErrors) { + if (sourceMinLength < targetMinLength) { + reportError(ts.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength); + } + else { + reportError(ts.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity); + } + } + return 0 /* False */; + } + var maxArity = Math.max(sourceArity, targetArity); + for (var i = 0; i < maxArity; i++) { + var targetFlags = i < targetArity ? target.target.elementFlags[i] : targetRestFlag; + var sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag; + if (sourceFlags && targetFlags) { + if (targetFlags & 8 /* Variadic */ && !(sourceFlags & 8 /* Variadic */) || + (sourceFlags & 8 /* Variadic */ && !(targetFlags & 12 /* Variable */))) { + if (reportErrors) { + reportError(ts.Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i); + } + return 0 /* False */; + } + if (targetFlags & 1 /* Required */) { + if (!(sourceFlags & 1 /* Required */)) { + if (reportErrors) { + reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, i, typeToString(source), typeToString(target)); + } + return 0 /* False */; + } + } + var sourceType = getTypeArguments(source)[Math.min(i, sourceArity - 1)]; + var targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)]; + var targetCheckType = sourceFlags & 8 /* Variadic */ && targetFlags & 4 /* Rest */ ? createArrayType(targetType) : targetType; + var related = isRelatedTo(sourceType, targetCheckType, reportErrors, /*headMessage*/ undefined, intersectionState); + if (!related) { + if (reportErrors) { + reportIncompatibleError(ts.Diagnostics.Types_of_property_0_are_incompatible, i); + } + return 0 /* False */; + } + result &= related; + } + } + return result; + } + if (target.target.combinedFlags & 12 /* Variable */) { + return 0 /* False */; + } + } var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source) && !isEmptyArrayLiteralType(source) && !isTupleType(source); var unmatchedProperty = getUnmatchedProperty(source, target, requireOptionalProperties, /*matchDiscriminantProperties*/ false); if (unmatchedProperty) { @@ -57839,35 +58138,6 @@ var ts; } } } - var result = -1 /* True */; - if (isTupleType(target)) { - var targetRestType = getRestTypeOfTupleType(target); - if (targetRestType) { - if (!isTupleType(source)) { - return 0 /* False */; - } - var sourceRestType = getRestTypeOfTupleType(source); - if (sourceRestType && !isRelatedTo(sourceRestType, targetRestType, reportErrors)) { - if (reportErrors) { - reportError(ts.Diagnostics.Rest_signatures_are_incompatible); - } - return 0 /* False */; - } - var targetCount = getTypeReferenceArity(target) - 1; - var sourceCount = getTypeReferenceArity(source) - (sourceRestType ? 1 : 0); - var sourceTypeArguments = getTypeArguments(source); - for (var i = targetCount; i < sourceCount; i++) { - var related = isRelatedTo(sourceTypeArguments[i], targetRestType, reportErrors); - if (!related) { - if (reportErrors) { - reportError(ts.Diagnostics.Property_0_is_incompatible_with_rest_element_type, "" + i); - } - return 0 /* False */; - } - result &= related; - } - } - } // We only call this for union target types when we're attempting to do excess property checking - in those cases, we want to get _all possible props_ // from the target union, across all members var properties = getPropertiesOfType(target); @@ -58225,7 +58495,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_16 = function (tp) { + var _loop_17 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58257,7 +58527,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_16(tp); + _loop_17(tp); } cache.variances = variances; } @@ -58680,15 +58950,40 @@ var ts; function isTupleType(type) { return !!(ts.getObjectFlags(type) & 4 /* Reference */ && type.target.objectFlags & 8 /* Tuple */); } + function isGenericTupleType(type) { + return isTupleType(type) && !!(type.target.combinedFlags & 8 /* Variadic */); + } + function isSingleElementGenericTupleType(type) { + return isGenericTupleType(type) && type.target.elementFlags.length === 1; + } function getRestTypeOfTupleType(type) { - return type.target.hasRestElement ? getTypeArguments(type)[type.target.typeParameters.length - 1] : undefined; + return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength); } function getRestArrayTypeOfTupleType(type) { var restType = getRestTypeOfTupleType(type); return restType && createArrayType(restType); } - function getLengthOfTupleType(type) { - return getTypeReferenceArity(type) - (type.target.hasRestElement ? 1 : 0); + function getEndLengthOfType(type) { + return isTupleType(type) ? getTypeReferenceArity(type) - ts.findLastIndex(type.target.elementFlags, function (f) { return !!(f & 12 /* Variable */); }) - 1 : 0; + } + function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) { + if (endSkipCount === void 0) { endSkipCount = 0; } + if (writing === void 0) { writing = false; } + var length = getTypeReferenceArity(type) - endSkipCount; + if (index < length) { + var typeArguments = getTypeArguments(type); + var elementTypes = []; + for (var i = index; i < length; i++) { + var t = typeArguments[i]; + elementTypes.push(type.target.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t); + } + return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes); + } + return undefined; + } + function isTupleTypeStructureMatching(t1, t2) { + return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && + ts.every(t1.target.elementFlags, function (f, i) { return (f & 12 /* Variable */) === (t2.target.elementFlags[i] & 12 /* Variable */); }); } function isZeroBigInt(_a) { var value = _a.value; @@ -59177,7 +59472,8 @@ var ts; inferredType: undefined, priority: undefined, topLevel: true, - isFixed: false + isFixed: false, + impliedArity: undefined }; } function cloneInferenceInfo(inference) { @@ -59188,7 +59484,8 @@ var ts; inferredType: inference.inferredType, priority: inference.priority, topLevel: inference.topLevel, - isFixed: inference.isFixed + isFixed: inference.isFixed, + impliedArity: inference.impliedArity }; } function cloneInferredPartOfContext(context) { @@ -59291,9 +59588,10 @@ var ts; } if (isTupleType(source)) { var elementTypes = ts.map(getTypeArguments(source), function (t) { return inferReverseMappedType(t, target, constraint); }); - var minLength = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? - getTypeReferenceArity(source) - (source.target.hasRestElement ? 1 : 0) : source.target.minLength; - return createTupleType(elementTypes, minLength, source.target.hasRestElement, source.target.readonly, source.target.labeledElementDeclarations); + var elementFlags = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? + ts.sameMap(source.target.elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + source.target.elementFlags; + return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations); } // For all other object types we infer a new object type where the reverse mapping has been // applied to the type of each property. @@ -59358,13 +59656,13 @@ var ts; return result.value; } function tupleTypesDefinitelyUnrelated(source, target) { - return target.target.minLength > source.target.minLength || - !getRestTypeOfTupleType(target) && (!!getRestTypeOfTupleType(source) || getLengthOfTupleType(target) < getLengthOfTupleType(source)); + return !(target.target.combinedFlags & 8 /* Variadic */) && target.target.minLength > source.target.minLength || + !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength); } function typesDefinitelyUnrelated(source, target) { // Two tuple types with incompatible arities are definitely unrelated. // Two object types that each have a property that is unmatched in the other are definitely unrelated. - return isTupleType(source) && isTupleType(target) && tupleTypesDefinitelyUnrelated(source, target) || + return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true) && !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true); } @@ -59854,22 +60152,61 @@ var ts; if (!typesDefinitelyUnrelated(source, target)) { if (isArrayType(source) || isTupleType(source)) { if (isTupleType(target)) { - var sourceLength = isTupleType(source) ? getLengthOfTupleType(source) : 0; - var targetLength = getLengthOfTupleType(target); - var sourceRestType = isTupleType(source) ? getRestTypeOfTupleType(source) : getElementTypeOfArrayType(source); - var targetRestType = getRestTypeOfTupleType(target); - var fixedLength = targetLength < sourceLength || sourceRestType ? targetLength : sourceLength; - for (var i = 0; i < fixedLength; i++) { - inferFromTypes(i < sourceLength ? getTypeArguments(source)[i] : sourceRestType, getTypeArguments(target)[i]); + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var elementTypes = getTypeArguments(target); + var elementFlags = target.target.elementFlags; + // When source and target are tuple types with the same structure (fixed, variadic, and rest are matched + // to the same kind in each position), simply infer between the element types. + if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { + for (var i = 0; i < targetArity; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + return; } - if (targetRestType) { - var types = fixedLength < sourceLength ? getTypeArguments(source).slice(fixedLength, sourceLength) : []; - if (sourceRestType) { - types.push(sourceRestType); + var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; + var sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & 4 /* Rest */ ? + getTypeArguments(source)[sourceArity - 1] : undefined; + var endLength = !(target.target.combinedFlags & 12 /* Variable */) ? 0 : + sourceRestType ? getEndLengthOfType(target) : + Math.min(getEndLengthOfType(source), getEndLengthOfType(target)); + var sourceEndLength = sourceRestType ? 0 : endLength; + // Infer between starting fixed elements. + for (var i = 0; i < startLength; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + if (sourceRestType && sourceArity - startLength === 1) { + // Single rest element remains in source, infer from that to every element in target + for (var i = startLength; i < targetArity - endLength; i++) { + inferFromTypes(elementFlags[i] & 8 /* Variadic */ ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]); } - if (types.length) { - inferFromTypes(getUnionType(types), targetRestType); + } + else { + var middleLength = targetArity - startLength - endLength; + if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 /* Variadic */ && isTupleType(source)) { + // Middle of target is [...T, ...U] and source is tuple type + var targetInfo = getInferenceInfoForType(elementTypes[startLength]); + if (targetInfo && targetInfo.impliedArity !== undefined) { + // Infer slices from source based on implied arity of T. + inferFromTypes(sliceTupleType(source, startLength, sourceEndLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]); + inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, sourceEndLength), elementTypes[startLength + 1]); + } } + else if (middleLength === 1 && elementFlags[startLength] & 8 /* Variadic */) { + // Middle of target is exactly one variadic element. Infer the slice between the fixed parts in the source. + inferFromTypes(isTupleType(source) ? sliceTupleType(source, startLength, sourceEndLength) : createArrayType(sourceRestType), elementTypes[startLength]); + } + else if (middleLength === 1 && elementFlags[startLength] & 4 /* Rest */) { + // Middle of target is exactly one rest element. If middle of source is not empty, infer union of middle element types. + var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, sourceEndLength) : sourceRestType; + if (restType) { + inferFromTypes(restType, elementTypes[startLength]); + } + } + } + // Infer between ending fixed elements + for (var i = 0; i < endLength; i++) { + inferFromTypes(sourceRestType || getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]); } return; } @@ -60814,7 +61151,7 @@ var ts; var signature = getEffectsSignature(flow.node); if (signature) { var predicate = getTypePredicateOfSignature(signature); - if (predicate && predicate.kind === 3 /* AssertsIdentifier */) { + if (predicate && predicate.kind === 3 /* AssertsIdentifier */ && !predicate.type) { var predicateArgument = flow.node.arguments[predicate.parameterIndex]; if (predicateArgument && isFalseExpression(predicateArgument)) { return false; @@ -62712,7 +63049,7 @@ var ts; var args = getEffectiveCallArguments(iife); var indexOfParameter = func.parameters.indexOf(parameter); if (parameter.dotDotDotToken) { - return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined); + return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined, 0 /* Normal */); } var links = getNodeLinks(iife); var cached = links.resolvedSignature; @@ -63478,6 +63815,9 @@ var ts; var arrayOrIterableType = checkExpression(node.expression, checkMode); return checkIteratedTypeOrElementType(33 /* Spread */, arrayOrIterableType, undefinedType, node.expression); } + function checkSyntheticExpression(node) { + return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type; + } function hasDefaultValue(node) { return (node.kind === 195 /* BindingElement */ && !!node.initializer) || (node.kind === 213 /* BinaryExpression */ && node.operatorToken.kind === 62 /* EqualsToken */); @@ -63486,26 +63826,22 @@ var ts; var elements = node.elements; var elementCount = elements.length; var elementTypes = []; - var hasEndingSpreadElement = false; - var hasNonEndingSpreadElement = false; + var elementFlags = []; var contextualType = getApparentTypeOfContextualType(node); var inDestructuringPattern = ts.isAssignmentTarget(node); var inConstContext = isConstContext(node); for (var i = 0; i < elementCount; i++) { var e = elements[i]; - var spread = e.kind === 217 /* SpreadElement */ && e.expression; - var spreadType = spread && checkExpression(spread, checkMode, forceTuple); - if (spreadType && isTupleType(spreadType)) { - elementTypes.push.apply(elementTypes, getTypeArguments(spreadType)); - if (spreadType.target.hasRestElement) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + if (e.kind === 217 /* SpreadElement */) { + if (languageVersion < 2 /* ES2015 */) { + checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 /* SpreadIncludes */ : 2048 /* SpreadArrays */); } - } - else { - if (inDestructuringPattern && spreadType) { + var spreadType = checkExpression(e.expression, checkMode, forceTuple); + if (isArrayLikeType(spreadType)) { + elementTypes.push(spreadType); + elementFlags.push(8 /* Variadic */); + } + else if (inDestructuringPattern) { // Given the following situation: // var c: {}; // [...c] = ["", 0]; @@ -63519,43 +63855,31 @@ var ts; // getContextualTypeForElementExpression, which will crucially not error // if there is no index type / iterated type. var restElementType = getIndexTypeOfType(spreadType, 1 /* Number */) || - getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false); - if (restElementType) { - elementTypes.push(restElementType); - } + getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false) || + unknownType; + elementTypes.push(restElementType); + elementFlags.push(4 /* Rest */); } else { - var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); - var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); - elementTypes.push(type); - } - if (spread) { // tuples are done above, so these are only arrays - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + elementTypes.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, e.expression)); + elementFlags.push(4 /* Rest */); } } + else { + var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); + var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); + elementTypes.push(type); + elementFlags.push(1 /* Required */); + } } - if (!hasNonEndingSpreadElement) { - var minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0); - // If array literal is actually a destructuring pattern, mark it as an implied type. We do this such - // that we get the same behavior for "var [x, y] = []" and "[x, y] = []". - var tupleResult = void 0; - if (inDestructuringPattern && minLength > 0) { - var type = cloneTypeReference(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - type.pattern = node; - return type; - } - else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) { - return createArrayLiteralType(tupleResult); - } - else if (forceTuple) { - return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - } + if (inDestructuringPattern) { + return createTupleType(elementTypes, elementFlags); + } + if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) { + return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext)); } return createArrayLiteralType(createArrayType(elementTypes.length ? - getUnionType(elementTypes, 2 /* Subtype */) : + getUnionType(ts.sameMap(elementTypes, function (t, i) { return elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t; }), 2 /* Subtype */) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext)); } function createArrayLiteralType(type) { @@ -63569,14 +63893,6 @@ var ts; } return literalType; } - function getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, readonly) { - if (elementCount === void 0) { elementCount = elementTypes.length; } - if (readonly === void 0) { readonly = false; } - // Infer a tuple type when the contextual type is or contains a tuple-like type - if (readonly || (contextualType && forEachType(contextualType, isTupleLikeType))) { - return createTupleType(elementTypes, elementCount - (hasRestElement ? 1 : 0), hasRestElement, readonly); - } - } function isNumericName(name) { switch (name.kind) { case 157 /* ComputedPropertyName */: @@ -63992,9 +64308,9 @@ var ts; var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName); // If there are children in the body of JSX element, create dummy attribute "children" with the union of children types so that it will pass the attribute checking process var childrenPropSymbol = createSymbol(4 /* Property */ | 33554432 /* Transient */, jsxChildrenPropertyName); - childrenPropSymbol.type = childrenTypes.length === 1 ? - childrenTypes[0] : - (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, /*hasRestElement*/ false) || createArrayType(getUnionType(childrenTypes))); + childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : + childrenContextualType && forEachType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : + createArrayType(getUnionType(childrenTypes)); // Fake up a property declaration for the children childrenPropSymbol.valueDeclaration = ts.factory.createPropertySignature(/*modifiers*/ undefined, ts.unescapeLeadingUnderscores(jsxChildrenPropertyName), /*questionToken*/ undefined, /*type*/ undefined); ts.setParent(childrenPropSymbol.valueDeclaration, attributes); @@ -64873,6 +65189,14 @@ var ts; function getSuggestedSymbolForNonexistentProperty(name, containingType) { return getSpellingSuggestionForName(ts.isString(name) ? name : ts.idText(name), getPropertiesOfType(containingType), 111551 /* Value */); } + function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) { + var strName = ts.isString(name) ? name : ts.idText(name); + var properties = getPropertiesOfType(containingType); + var jsxSpecific = strName === "for" ? ts.find(properties, function (x) { return ts.symbolName(x) === "htmlFor"; }) + : strName === "class" ? ts.find(properties, function (x) { return ts.symbolName(x) === "className"; }) + : undefined; + return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551 /* Value */); + } function getSuggestionForNonexistentProperty(name, containingType) { var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType); return suggestion && ts.symbolName(suggestion); @@ -65249,28 +65573,10 @@ var ts; argCount = signatureHelpTrailingComma ? args.length + 1 : args.length; // If we are missing the close parenthesis, the call is incomplete. callIsIncomplete = node.arguments.end === node.end; - // If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range. - var firstSpreadArgIndex = getSpreadArgumentIndex(args); - if (firstSpreadArgIndex >= 0) { - if (firstSpreadArgIndex === args.length - 1) { - // Special case, handles the munged arguments that we receive in case of a spread in the end (breaks the arg.expression below) - // (see below for code that starts with "const spreadArgument") - return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature)); - } - var totalCount = firstSpreadArgIndex; // count previous arguments - for (var i = firstSpreadArgIndex; i < args.length; i++) { - var arg = args[i]; - if (!isSpreadArgument(arg)) { - totalCount += 1; - } - else { - var argType = flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression); - totalCount += isTupleType(argType) ? getTypeArguments(argType).length - : isArrayType(argType) ? 0 - : 1; - } - } - return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount <= getParameterCount(signature)); + // If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range. + var spreadArgIndex = getSpreadArgumentIndex(args); + if (spreadArgIndex >= 0) { + return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature)); } } // Too many arguments implies incorrect arity. @@ -65395,6 +65701,12 @@ var ts; } var restType = getNonArrayRestType(signature); var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; + if (restType && restType.flags & 262144 /* TypeParameter */) { + var info = ts.find(context.inferences, function (info) { return info.typeParameter === restType; }); + if (info) { + info.impliedArity = ts.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : undefined; + } + } for (var i = 0; i < argCount; i++) { var arg = args[i]; if (arg.kind !== 219 /* OmittedExpression */) { @@ -65404,46 +65716,55 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode); inferTypes(context.inferences, spreadType, restType); } return getInferredTypes(context); } - function getArrayifiedType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, getArrayifiedType) : - type.flags & (1 /* Any */ | 63176704 /* Instantiable */) || isMutableArrayOrTuple(type) ? type : - isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.minLength, type.target.hasRestElement, /*readonly*/ false, type.target.labeledElementDeclarations) : - createArrayType(getIndexedAccessType(type, numberType)); + function getMutableArrayOrTupleType(type) { + return type.flags & 1048576 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : + type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : + isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, /*readonly*/ false, type.target.labeledElementDeclarations) : + createTupleType([type], [8 /* Variadic */]); } - function getSpreadArgumentType(args, index, argCount, restType, context) { + function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) { if (index >= argCount - 1) { var arg = args[argCount - 1]; if (isSpreadArgument(arg)) { // We are inferring from a spread expression in the last argument position, i.e. both the parameter // and the argument are ...x forms. - return arg.kind === 224 /* SyntheticExpression */ ? - createArrayType(arg.type) : - getArrayifiedType(checkExpressionWithContextualType(arg.expression, restType, context, 0 /* Normal */)); + return getMutableArrayOrTupleType(arg.kind === 224 /* SyntheticExpression */ ? arg.type : + checkExpressionWithContextualType(arg.expression, restType, context, checkMode)); } } var types = []; + var flags = []; var names = []; - var spreadIndex = -1; for (var i = index; i < argCount; i++) { - var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); - var argType = checkExpressionWithContextualType(args[i], contextualType, context, 0 /* Normal */); - if (spreadIndex < 0 && isSpreadArgument(args[i])) { - spreadIndex = i - index; + var arg = args[i]; + if (isSpreadArgument(arg)) { + var spreadType = arg.kind === 224 /* SyntheticExpression */ ? arg.type : checkExpression(arg.expression); + if (isArrayLikeType(spreadType)) { + types.push(spreadType); + flags.push(8 /* Variadic */); + } + else { + types.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, arg.kind === 217 /* SpreadElement */ ? arg.expression : arg)); + flags.push(4 /* Rest */); + } } - if (args[i].kind === 224 /* SyntheticExpression */ && args[i].tupleNameSource) { - names.push(args[i].tupleNameSource); + else { + var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); + var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); + var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); + types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); + flags.push(1 /* Required */); + } + if (arg.kind === 224 /* SyntheticExpression */ && arg.tupleNameSource) { + names.push(arg.tupleNameSource); } - var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); - types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); } - return spreadIndex < 0 ? - createTupleType(types, /*minLength*/ undefined, /*hasRestElement*/ undefined, /*readonly*/ undefined, ts.length(names) === ts.length(types) ? names : undefined) : - createTupleType(ts.append(types.slice(0, spreadIndex), getUnionType(types.slice(spreadIndex))), spreadIndex, /*hasRestElement*/ true, /*readonly*/ undefined); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) { var isJavascript = ts.isInJSFile(signature.declaration); @@ -65625,7 +65946,7 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined, checkMode); var errorNode = reportErrors ? argCount < args.length ? args[argCount] : node : undefined; if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, /*containingMessageChain*/ undefined, errorOutputContainer)) { ts.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors"); @@ -65685,19 +66006,30 @@ var ts; return node.attributes.properties.length > 0 || (ts.isJsxOpeningElement(node) && node.parent.children.length > 0) ? [node.attributes] : ts.emptyArray; } var args = node.arguments || ts.emptyArray; - var length = args.length; - if (length && isSpreadArgument(args[length - 1]) && getSpreadArgumentIndex(args) === length - 1) { - // We have a spread argument in the last position and no other spread arguments. If the type - // of the argument is a tuple type, spread the tuple elements into the argument list. We can - // call checkExpressionCached because spread expressions never have a contextual type. - var spreadArgument_1 = args[length - 1]; - var type_4 = flowLoopCount ? checkExpression(spreadArgument_1.expression) : checkExpressionCached(spreadArgument_1.expression); - if (isTupleType(type_4)) { - var typeArguments = getTypeArguments(type_4); - var restIndex_2 = type_4.target.hasRestElement ? typeArguments.length - 1 : -1; - var syntheticArgs = ts.map(typeArguments, function (t, i) { var _a; return createSyntheticExpression(spreadArgument_1, t, /*isSpread*/ i === restIndex_2, (_a = type_4.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); }); - return ts.concatenate(args.slice(0, length - 1), syntheticArgs); + var spreadIndex = getSpreadArgumentIndex(args); + if (spreadIndex >= 0) { + // Create synthetic arguments from spreads of tuple types. + var effectiveArgs_1 = args.slice(0, spreadIndex); + var _loop_18 = function (i) { + var arg = args[i]; + // We can call checkExpressionCached because spread expressions never have a contextual type. + var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); + if (spreadType && isTupleType(spreadType)) { + ts.forEach(getTypeArguments(spreadType), function (t, i) { + var _a; + var flags = spreadType.target.elementFlags[i]; + var syntheticArg = createSyntheticExpression(arg, flags & 4 /* Rest */ ? createArrayType(t) : t, !!(flags & 12 /* Variable */), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + effectiveArgs_1.push(syntheticArg); + }); + } + else { + effectiveArgs_1.push(arg); + } + }; + for (var i = spreadIndex; i < args.length; i++) { + _loop_18(i); } + return effectiveArgs_1; } return args; } @@ -65997,7 +66329,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_17 = function (c) { + var _loop_19 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -66015,7 +66347,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_17(c); + _loop_19(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -66149,7 +66481,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_18 = function (i) { + var _loop_20 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -66157,7 +66489,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_18(i); + _loop_20(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -67129,51 +67461,44 @@ var ts; // otherwise would return the type 'undefined'). var restType = getTypeOfSymbol(signature.parameters[paramCount]); var index = pos - paramCount; - if (!isTupleType(restType) || restType.target.hasRestElement || index < getTypeArguments(restType).length) { + if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) { return getIndexedAccessType(restType, getLiteralType(index)); } } return undefined; } function getRestTypeAtPosition(source, pos) { - var paramCount = getParameterCount(source); + var parameterCount = getParameterCount(source); + var minArgumentCount = getMinArgumentCount(source); var restType = getEffectiveRestType(source); - var nonRestCount = paramCount - (restType ? 1 : 0); - if (restType && pos === nonRestCount) { - return restType; + if (restType && pos >= parameterCount - 1) { + return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType)); } var types = []; + var flags = []; var names = []; - for (var i = pos; i < nonRestCount; i++) { - types.push(getTypeAtPosition(source, i)); + for (var i = pos; i < parameterCount; i++) { + if (!restType || i < parameterCount - 1) { + types.push(getTypeAtPosition(source, i)); + flags.push(i < minArgumentCount ? 1 /* Required */ : 2 /* Optional */); + } + else { + types.push(restType); + flags.push(8 /* Variadic */); + } var name = getNameableDeclarationAtPosition(source, i); - if (name && names) { + if (name) { names.push(name); } - else { - names = undefined; - } } - if (restType) { - types.push(getIndexedAccessType(restType, numberType)); - var name = getNameableDeclarationAtPosition(source, nonRestCount); - if (name && names) { - names.push(name); - } - else { - names = undefined; - } - } - var minArgumentCount = getMinArgumentCount(source); - var minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos; - return createTupleType(types, minLength, !!restType, /*readonly*/ false, names); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function getParameterCount(signature) { var length = signature.parameters.length; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[length - 1]); if (isTupleType(restType)) { - return length + getTypeArguments(restType).length - 1; + return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1); } } return length; @@ -67182,9 +67507,10 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (isTupleType(restType)) { - var minLength = restType.target.minLength; - if (minLength > 0) { - return signature.parameters.length - 1 + minLength; + var firstOptionalIndex = ts.findIndex(restType.target.elementFlags, function (f) { return !(f & 1 /* Required */); }); + var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex; + if (requiredCount > 0) { + return signature.parameters.length - 1 + requiredCount; } } } @@ -67203,7 +67529,12 @@ var ts; function getEffectiveRestType(signature) { if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); - return isTupleType(restType) ? getRestArrayTypeOfTupleType(restType) : restType; + if (!isTupleType(restType)) { + return restType; + } + if (restType.target.hasRestElement) { + return sliceTupleType(restType, restType.target.fixedLength); + } } return undefined; } @@ -67542,8 +67873,8 @@ var ts; var witnesses = getSwitchClauseTypeOfWitnesses(node, /*retainDefault*/ false); // notEqualFacts states that the type of the switched value is not equal to every type in the switch. var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, /*hasDefault*/ true); - var type_5 = getBaseConstraintOfType(operandType) || operandType; - return !!(filterType(type_5, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); + var type_4 = getBaseConstraintOfType(operandType) || operandType; + return !!(filterType(type_4, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); } var type = getTypeOfExpression(node.expression); if (!isLiteralType(type)) { @@ -67883,7 +68214,7 @@ var ts; error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference); return booleanType; } - if (expr.kind === 198 /* PropertyAccessExpression */ && ts.isPrivateIdentifier(expr.name)) { + if (ts.isPropertyAccessExpression(expr) && ts.isPrivateIdentifier(expr.name)) { error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } var links = getNodeLinks(expr); @@ -68927,18 +69258,19 @@ var ts; } function padTupleType(type, pattern) { var patternElements = pattern.elements; - var arity = getTypeReferenceArity(type); - var elementTypes = arity ? getTypeArguments(type).slice() : []; - for (var i = arity; i < patternElements.length; i++) { + var elementTypes = getTypeArguments(type).slice(); + var elementFlags = type.target.elementFlags.slice(); + for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) { var e = patternElements[i]; if (i < patternElements.length - 1 || !(e.kind === 195 /* BindingElement */ && e.dotDotDotToken)) { elementTypes.push(!ts.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, /*includePatternInType*/ false, /*reportErrors*/ false) : anyType); + elementFlags.push(2 /* Optional */); if (!ts.isOmittedExpression(e) && !hasDefaultValue(e)) { reportImplicitAny(e, anyType); } } } - return createTupleType(elementTypes, type.target.minLength, /*hasRestElement*/ false, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration, type) { var widened = ts.getCombinedNodeFlags(declaration) & 2 /* Const */ || ts.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type); @@ -69359,7 +69691,7 @@ var ts; case 216 /* YieldExpression */: return checkYieldExpression(node); case 224 /* SyntheticExpression */: - return node.type; + return checkSyntheticExpression(node); case 280 /* JsxExpression */: return checkJsxExpression(node, checkMode); case 270 /* JsxElement */: @@ -70015,16 +70347,20 @@ var ts; grammarErrorOnNode(e, ts.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names); break; } - if (isTupleRestElement(e)) { + var flags = getTupleElementFlags(e); + if (flags & 8 /* Variadic */) { + if (!isArrayLikeType(getTypeFromTypeNode(e.type))) { + error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); + break; + } + } + else if (flags & 4 /* Rest */) { if (i !== elementTypes.length - 1) { grammarErrorOnNode(e, ts.Diagnostics.A_rest_element_must_be_last_in_a_tuple_type); break; } - if (!isArrayType(getTypeFromTypeNode(e.type))) { - error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); - } } - else if (isTupleOptionalElement(e)) { + else if (flags & 2 /* Optional */) { seenOptionalElement = true; } else if (seenOptionalElement) { @@ -73076,7 +73412,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_19 = function (member) { + var _loop_21 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -73095,7 +73431,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_19(member); + _loop_21(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -107015,7 +107351,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_20 = function (directory) { + var _loop_22 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -107041,7 +107377,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_20(directory); + var state_8 = _loop_22(directory); directory = out_directory_1; if (state_8 === "break") break; @@ -108108,7 +108444,7 @@ var ts; configFileSpecs = configFileParseResult.configFileSpecs; // TODO: GH#18217 projectReferences = configFileParseResult.projectReferences; configFileParsingDiagnostics = ts.getConfigFileParsingDiagnostics(configFileParseResult).slice(); - canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(configFileParseResult.raw); + canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function onSourceFileChange(fileName, eventKind, path) { @@ -108977,7 +109313,7 @@ var ts; else if (reloadLevel === ts.ConfigFileProgramReloadLevel.Partial) { // Update file names var result = ts.getFileNamesFromConfigSpecs(config.configFileSpecs, ts.getDirectoryPath(project), config.options, state.parseConfigFileHost); - ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInutFiles(config.raw)); + ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInputFiles(config.raw)); config.fileNames = result.fileNames; watchInputFiles(state, project, projectPath, config); } @@ -109116,7 +109452,7 @@ var ts; } } // Container if no files are specified in the project - if (!project.fileNames.length && !ts.canJsonReportNoInutFiles(project.raw)) { + if (!project.fileNames.length && !ts.canJsonReportNoInputFiles(project.raw)) { return { type: ts.UpToDateStatusType.ContainerOnly }; @@ -110111,6 +110447,13 @@ var ts; PackageJsonDependencyGroup[PackageJsonDependencyGroup["All"] = 15] = "All"; })(PackageJsonDependencyGroup = ts.PackageJsonDependencyGroup || (ts.PackageJsonDependencyGroup = {})); /* @internal */ + var PackageJsonAutoImportPreference; + (function (PackageJsonAutoImportPreference) { + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["None"] = 0] = "None"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["ExcludeDevDependencies"] = 1] = "ExcludeDevDependencies"; + PackageJsonAutoImportPreference[PackageJsonAutoImportPreference["All"] = 2] = "All"; + })(PackageJsonAutoImportPreference = ts.PackageJsonAutoImportPreference || (ts.PackageJsonAutoImportPreference = {})); + /* @internal */ ts.emptyOptions = {}; var HighlightSpanKind; (function (HighlightSpanKind) { @@ -112409,19 +112752,10 @@ var ts; return !!location.parent && ts.isImportOrExportSpecifier(location.parent) && location.parent.propertyName === location; } ts.isImportOrExportSpecifierName = isImportOrExportSpecifierName; - function scriptKindIs(fileName, host) { - var scriptKinds = []; - for (var _i = 2; _i < arguments.length; _i++) { - scriptKinds[_i - 2] = arguments[_i]; - } - var scriptKind = getScriptKind(fileName, host); - return ts.some(scriptKinds, function (k) { return k === scriptKind; }); - } - ts.scriptKindIs = scriptKindIs; function getScriptKind(fileName, host) { // First check to see if the script kind was specified by the host. Chances are the host // may override the default script kind for the file extension. - return ts.ensureScriptKind(fileName, host && host.getScriptKind && host.getScriptKind(fileName)); + return ts.ensureScriptKind(fileName, host.getScriptKind && host.getScriptKind(fileName)); } ts.getScriptKind = getScriptKind; function getSymbolTarget(symbol, checker) { @@ -112952,20 +113286,20 @@ var ts; if (!stringContent) return undefined; var content = tryParseJson(stringContent); - if (!content) - return false; var info = {}; - for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { - var key = dependencyKeys_1[_i]; - var dependencies = content[key]; - if (!dependencies) { - continue; + if (content) { + for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) { + var key = dependencyKeys_1[_i]; + var dependencies = content[key]; + if (!dependencies) { + continue; + } + var dependencyMap = ts.createMap(); + for (var packageName in dependencies) { + dependencyMap.set(packageName, dependencies[packageName]); + } + info[key] = dependencyMap; } - var dependencyMap = ts.createMap(); - for (var packageName in dependencies) { - dependencyMap.set(packageName, dependencies[packageName]); - } - info[key] = dependencyMap; } var dependencyGroups = [ [1 /* Dependencies */, info.dependencies], @@ -112973,7 +113307,7 @@ var ts; [8 /* OptionalDependencies */, info.optionalDependencies], [4 /* PeerDependencies */, info.peerDependencies], ]; - return __assign(__assign({}, info), { fileName: fileName, + return __assign(__assign({}, info), { parseable: !!content, fileName: fileName, get: get, has: function (dependencyName, inGroups) { return !!get(dependencyName, inGroups); @@ -114760,6 +115094,9 @@ var ts; function originIsExport(origin) { return !!(origin && origin.kind & 4 /* Export */); } + function originIsPackageJsonImport(origin) { + return originIsExport(origin) && !!origin.isFromPackageJson; + } function originIsPromise(origin) { return !!(origin.kind & 8 /* Promise */); } @@ -115019,6 +115356,7 @@ var ts; isRecommended: isRecommendedCompletionMatch(symbol, recommendedCompletion, typeChecker) || undefined, insertText: insertText, replacementSpan: replacementSpan, + isPackageJsonImport: originIsPackageJsonImport(origin) || undefined, }; } function quotePropertyName(name, preferences) { @@ -115980,11 +116318,12 @@ var ts; var results = []; /** Ids present in `results` for faster lookup */ var resultSymbolIds = ts.createMap(); - ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, function (moduleSymbol) { + ts.codefix.forEachExternalModuleToImportFrom(program, host, sourceFile, !detailsEntryId, /*useAutoImportProvider*/ true, function (moduleSymbol, _, program, isFromPackageJson) { // Perf -- ignore other modules if this is a request for details if (detailsEntryId && detailsEntryId.source && ts.stripQuotes(moduleSymbol.name) !== detailsEntryId.source) { return; } + var typeChecker = program.getTypeChecker(); var resolvedModuleSymbol = typeChecker.resolveExternalModuleSymbol(moduleSymbol); // resolvedModuleSymbol may be a namespace. A namespace may be `export =` by multiple module declarations, but only keep the first one. if (!ts.addToSeen(seenResolvedModules, ts.getSymbolId(resolvedModuleSymbol))) { @@ -115993,7 +116332,7 @@ var ts; // Don't add another completion for `export =` of a symbol that's already global. // So in `declare namespace foo {} declare module "foo" { export = foo; }`, there will just be the global completion for `foo`. if (resolvedModuleSymbol !== moduleSymbol && ts.every(resolvedModuleSymbol.declarations, ts.isNonGlobalDeclaration)) { - pushSymbol(resolvedModuleSymbol, moduleSymbol, /*skipFilter*/ true); + pushSymbol(resolvedModuleSymbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ true); } for (var _i = 0, _a = typeChecker.getExportsAndPropertiesOfModule(moduleSymbol); _i < _a.length; _i++) { var symbol = _a[_i]; @@ -116018,7 +116357,7 @@ var ts; var nearestExportSymbolId = ts.getSymbolId(nearestExportSymbol).toString(); var symbolHasBeenSeen = resultSymbolIds.has(nearestExportSymbolId) || aliasesToAlreadyIncludedSymbols.has(nearestExportSymbolId); if (!symbolHasBeenSeen) { - aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol }); + aliasesToReturnIfOriginalsAreMissing.set(nearestExportSymbolId, { alias: symbol, moduleSymbol: moduleSymbol, isFromPackageJson: isFromPackageJson }); aliasesToAlreadyIncludedSymbols.set(symbolId, true); } else { @@ -116030,20 +116369,19 @@ var ts; else { // This is not a re-export, so see if we have any aliases pending and remove them (step 3 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.delete(symbolId); - pushSymbol(symbol, moduleSymbol); + pushSymbol(symbol, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); } } }); // By this point, any potential duplicates that were actually duplicates have been // removed, so the rest need to be added. (Step 4 in diagrammed example) aliasesToReturnIfOriginalsAreMissing.forEach(function (_a) { - var alias = _a.alias, moduleSymbol = _a.moduleSymbol; - return pushSymbol(alias, moduleSymbol); + var alias = _a.alias, moduleSymbol = _a.moduleSymbol, isFromPackageJson = _a.isFromPackageJson; + return pushSymbol(alias, moduleSymbol, isFromPackageJson, /*skipFilter*/ false); }); log("getSymbolsFromOtherSourceFileExports: " + (ts.timestamp() - startTime)); return results; - function pushSymbol(symbol, moduleSymbol, skipFilter) { - if (skipFilter === void 0) { skipFilter = false; } + function pushSymbol(symbol, moduleSymbol, isFromPackageJson, skipFilter) { var isDefaultExport = symbol.escapedName === "default" /* Default */; if (isDefaultExport) { symbol = ts.getLocalSymbolForExportDefault(symbol) || symbol; @@ -116052,7 +116390,7 @@ var ts; return; } ts.addToSeen(resultSymbolIds, ts.getSymbolId(symbol)); - var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport }; + var origin = { kind: 4 /* Export */, moduleSymbol: moduleSymbol, isDefaultExport: isDefaultExport, isFromPackageJson: isFromPackageJson }; results.push({ symbol: symbol, symbolName: ts.getNameForExportedSymbol(symbol, target), @@ -132402,7 +132740,7 @@ var ts; errorCodes: errorCodes, getCodeActions: function (context) { var errorCode = context.errorCode, preferences = context.preferences, sourceFile = context.sourceFile, span = context.span; - var info = getFixesInfo(context, errorCode, span.start); + var info = getFixesInfo(context, errorCode, span.start, /*useAutoImportProvider*/ true); if (!info) return undefined; var fixes = info.fixes, symbolName = info.symbolName; @@ -132412,12 +132750,16 @@ var ts; fixIds: [importFixId], getAllCodeActions: function (context) { var sourceFile = context.sourceFile, program = context.program, preferences = context.preferences, host = context.host; - var importAdder = createImportAdder(sourceFile, program, preferences, host); + var importAdder = createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ true, preferences, host); codefix.eachDiagnostic(context, errorCodes, function (diag) { return importAdder.addImportFromDiagnostic(diag, context); }); return codefix.createCombinedCodeActions(ts.textChanges.ChangeTracker.with(context, importAdder.writeFixes)); }, }); function createImportAdder(sourceFile, program, preferences, host) { + return createImportAdderWorker(sourceFile, program, /*useAutoImportProvider*/ false, preferences, host); + } + codefix.createImportAdder = createImportAdder; + function createImportAdderWorker(sourceFile, program, useAutoImportProvider, preferences, host) { var compilerOptions = program.getCompilerOptions(); // Namespace fixes don't conflict, so just build a list. var addToNamespace = []; @@ -132427,7 +132769,7 @@ var ts; var newImports = ts.createMap(); return { addImportFromDiagnostic: addImportFromDiagnostic, addImportFromExportedSymbol: addImportFromExportedSymbol, writeFixes: writeFixes }; function addImportFromDiagnostic(diagnostic, context) { - var info = getFixesInfo(context, diagnostic.code, diagnostic.start); + var info = getFixesInfo(context, diagnostic.code, diagnostic.start, useAutoImportProvider); if (!info || !info.fixes.length) return; addImport(info); @@ -132437,7 +132779,7 @@ var ts; var symbolName = ts.getNameForExportedSymbol(exportedSymbol, ts.getEmitScriptTarget(compilerOptions)); var checker = program.getTypeChecker(); var symbol = checker.getMergedSymbol(ts.skipAlias(exportedSymbol, checker)); - var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, sourceFile, compilerOptions, checker, program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, host, program, useAutoImportProvider); var preferTypeOnlyImport = !!usageIsTypeOnly && compilerOptions.importsNotUsedAsValues === 2 /* Error */; var useRequire = shouldUseRequire(sourceFile, compilerOptions); var fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, /*position*/ undefined, preferTypeOnlyImport, useRequire, host, preferences); @@ -132524,7 +132866,6 @@ var ts; } } } - codefix.createImportAdder = createImportAdder; // Sorted with the preferred fix coming first. var ImportFixKind; (function (ImportFixKind) { @@ -132542,7 +132883,7 @@ var ts; })(ImportKind || (ImportKind = {})); function getImportCompletionAction(exportedSymbol, moduleSymbol, sourceFile, symbolName, host, program, formatContext, position, preferences) { var compilerOptions = program.getCompilerOptions(); - var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, sourceFile, compilerOptions, program.getTypeChecker(), program.getSourceFiles()); + var exportInfos = getAllReExportingModules(sourceFile, exportedSymbol, moduleSymbol, symbolName, host, program, /*useAutoImportProvider*/ true); var useRequire = shouldUseRequire(sourceFile, compilerOptions); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && !ts.isSourceFileJS(sourceFile) && ts.isValidTypeOnlyAliasUseSite(ts.getTokenAtPosition(sourceFile, position)); var moduleSpecifier = ts.first(getNewImportInfos(program, sourceFile, position, preferTypeOnlyImport, useRequire, exportInfos, host, preferences)).moduleSpecifier; @@ -132559,11 +132900,13 @@ var ts; var description = _a.description, changes = _a.changes, commands = _a.commands; return { description: description, changes: changes, commands: commands }; } - function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, sourceFile, compilerOptions, checker, allSourceFiles) { + function getAllReExportingModules(importingFile, exportedSymbol, exportingModuleSymbol, symbolName, host, program, useAutoImportProvider) { var result = []; - forEachExternalModule(checker, allSourceFiles, function (moduleSymbol, moduleFile) { + var compilerOptions = program.getCompilerOptions(); + forEachExternalModuleToImportFrom(program, host, importingFile, /*filterByPackageJson*/ false, useAutoImportProvider, function (moduleSymbol, moduleFile, program) { + var checker = program.getTypeChecker(); // Don't import from a re-export when looking "up" like to `./index` or `../index`. - if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(sourceFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { + if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts.startsWith(importingFile.fileName, ts.getDirectoryPath(moduleFile.fileName))) { return; } var defaultInfo = getDefaultLikeExportInfo(importingFile, moduleSymbol, checker, compilerOptions); @@ -132725,11 +133068,11 @@ var ts; ? { kind: 3 /* AddNew */, moduleSpecifier: moduleSpecifier.text, importKind: importKind, typeOnly: preferTypeOnlyImport, useRequire: useRequire } : undefined; } - function getFixesInfo(context, errorCode, pos) { + function getFixesInfo(context, errorCode, pos, useAutoImportProvider) { var symbolToken = ts.getTokenAtPosition(context.sourceFile, pos); var info = errorCode === ts.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code ? getFixesInfoForUMDImport(context, symbolToken) - : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken) : undefined; + : ts.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken, useAutoImportProvider) : undefined; return info && __assign(__assign({}, info), { fixes: ts.sort(info.fixes, function (a, b) { return a.kind - b.kind; }) }); } function getFixesInfoForUMDImport(_a, token) { @@ -132782,7 +133125,7 @@ var ts; return ts.Debug.assertNever(moduleKind, "Unexpected moduleKind " + moduleKind); } } - function getFixesInfoForNonUMDImport(_a, symbolToken) { + function getFixesInfoForNonUMDImport(_a, symbolToken, useAutoImportProvider) { var sourceFile = _a.sourceFile, program = _a.program, cancellationToken = _a.cancellationToken, host = _a.host, preferences = _a.preferences; var checker = program.getTypeChecker(); // If we're at ``, we must check if `Foo` is already in scope, and if so, get an import for `React` instead. @@ -132796,7 +133139,7 @@ var ts; var compilerOptions = program.getCompilerOptions(); var preferTypeOnlyImport = compilerOptions.importsNotUsedAsValues === 2 /* Error */ && ts.isValidTypeOnlyAliasUseSite(symbolToken); var useRequire = shouldUseRequire(sourceFile, compilerOptions); - var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, host); + var exportInfos = getExportInfos(symbolName, ts.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, checker, program, useAutoImportProvider, host); var fixes = ts.arrayFrom(ts.flatMapIterator(exportInfos.entries(), function (_a) { var _ = _a[0], exportInfos = _a[1]; return getFixForImport(exportInfos, symbolName, symbolToken.getStart(sourceFile), preferTypeOnlyImport, useRequire, program, sourceFile, host, preferences); @@ -132804,14 +133147,14 @@ var ts; return { fixes: fixes, symbolName: symbolName }; } // Returns a map from an exported symbol's ID to a list of every way it's (re-)exported. - function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, host) { + function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, sourceFile, checker, program, useAutoImportProvider, host) { // For each original symbol, keep all re-exports of that symbol together so we can call `getCodeActionsForImport` on the whole group at once. // Maps symbol id to info for modules providing that symbol (original export + re-exports). var originalSymbolToExportInfos = ts.createMultiMap(); function addSymbol(moduleSymbol, exportedSymbol, importKind) { originalSymbolToExportInfos.add(ts.getUniqueSymbolId(exportedSymbol, checker).toString(), { moduleSymbol: moduleSymbol, importKind: importKind, exportedSymbolIsTypeOnly: isTypeOnlySymbol(exportedSymbol, checker) }); } - forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, function (moduleSymbol) { + forEachExternalModuleToImportFrom(program, host, sourceFile, /*filterByPackageJson*/ true, useAutoImportProvider, function (moduleSymbol) { cancellationToken.throwIfCancellationRequested(); var defaultInfo = getDefaultLikeExportInfo(sourceFile, moduleSymbol, checker, program.getCompilerOptions()); if (defaultInfo && defaultInfo.name === symbolName && symbolHasMeaning(defaultInfo.symbolForMeaning, currentTokenMeaning)) { @@ -133043,14 +133386,26 @@ var ts; var declarations = _a.declarations; return ts.some(declarations, function (decl) { return !!(ts.getMeaningFromDeclaration(decl) & meaning); }); } - function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, cb) { + function forEachExternalModuleToImportFrom(program, host, from, filterByPackageJson, useAutoImportProvider, cb) { + var _a, _b; + forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, function (module, file) { return cb(module, file, program, /*isFromPackageJson*/ false); }); + var autoImportProvider = useAutoImportProvider && ((_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host)); + if (autoImportProvider) { + var start = ts.timestamp(); + forEachExternalModuleToImportFromInProgram(autoImportProvider, host, from, filterByPackageJson, function (module, file) { return cb(module, file, autoImportProvider, /*isFromPackageJson*/ true); }); + (_b = host.log) === null || _b === void 0 ? void 0 : _b.call(host, "forEachExternalModuleToImportFrom autoImportProvider: " + (ts.timestamp() - start)); + } + } + codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; + function forEachExternalModuleToImportFromInProgram(program, host, from, filterByPackageJson, cb) { + var _a; var filteredCount = 0; var moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); var packageJson = filterByPackageJson && createAutoImportFilter(from, program, host, moduleSpecifierResolutionHost); forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), function (module, sourceFile) { if (sourceFile === undefined) { if (!packageJson || packageJson.allowsImportingAmbientModule(module)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; @@ -133060,18 +133415,15 @@ var ts; sourceFile !== from && isImportableFile(program, from, sourceFile, moduleSpecifierResolutionHost)) { if (!packageJson || packageJson.allowsImportingSourceFile(sourceFile)) { - cb(module); + cb(module, sourceFile); } else if (packageJson) { filteredCount++; } } }); - if (host.log) { - host.log("forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); - } + (_a = host.log) === null || _a === void 0 ? void 0 : _a.call(host, "forEachExternalModuleToImportFrom: filtered out " + filteredCount + " modules by package.json contents"); } - codefix.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom; function forEachExternalModule(checker, allSourceFiles, cb) { for (var _i = 0, _a = checker.getAmbientModules(); _i < _a.length; _i++) { var ambient = _a[_i]; @@ -133142,15 +133494,14 @@ var ts; codefix.moduleSpecifierToValidIdentifier = moduleSpecifierToValidIdentifier; function createAutoImportFilter(fromFile, program, host, moduleSpecifierResolutionHost) { if (moduleSpecifierResolutionHost === void 0) { moduleSpecifierResolutionHost = ts.createModuleSpecifierResolutionHost(program, host); } - var packageJsons = host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host); - var dependencyGroups = 1 /* Dependencies */ | 2 /* DevDependencies */ | 8 /* OptionalDependencies */; + var packageJsons = ((host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName)) || ts.getPackageJsonsVisibleToFile(fromFile.fileName, host)).filter(function (p) { return p.parseable; }); var usesNodeCoreModules; return { allowsImportingAmbientModule: allowsImportingAmbientModule, allowsImportingSourceFile: allowsImportingSourceFile, allowsImportingSpecifier: allowsImportingSpecifier, moduleSpecifierResolutionHost: moduleSpecifierResolutionHost }; function moduleSpecifierIsCoveredByPackageJson(specifier) { var packageName = getNodeModuleRootSpecifier(specifier); for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) { var packageJson = packageJsons_1[_i]; - if (packageJson.has(packageName, dependencyGroups) || packageJson.has(ts.getTypesPackageName(packageName), dependencyGroups)) { + if (packageJson.has(packageName) || packageJson.has(ts.getTypesPackageName(packageName))) { return true; } } @@ -133358,12 +133709,16 @@ var ts; ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code, ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code, ts.Diagnostics.Module_0_has_no_exported_member_1_Did_you_mean_2.code, + // for JSX class components + ts.Diagnostics.No_overload_matches_this_call.code, + // for JSX FC + ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code, ]; codefix.registerCodeFix({ errorCodes: errorCodes, getCodeActions: function (context) { - var sourceFile = context.sourceFile; - var info = getInfo(sourceFile, context.span.start, context); + var sourceFile = context.sourceFile, errorCode = context.errorCode; + var info = getInfo(sourceFile, context.span.start, context, errorCode); if (!info) return undefined; var node = info.node, suggestedSymbol = info.suggestedSymbol; @@ -133373,18 +133728,23 @@ var ts; }, fixIds: [fixId], getAllCodeActions: function (context) { return codefix.codeFixAll(context, errorCodes, function (changes, diag) { - var info = getInfo(diag.file, diag.start, context); + var info = getInfo(diag.file, diag.start, context, diag.code); var target = context.host.getCompilationSettings().target; if (info) doChange(changes, context.sourceFile, info.node, info.suggestedSymbol, target); }); }, }); - function getInfo(sourceFile, pos, context) { + function getInfo(sourceFile, pos, context, errorCode) { // This is the identifier of the misspelled word. eg: // this.speling = 1; // ^^^^^^^ var node = ts.getTokenAtPosition(sourceFile, pos); var parent = node.parent; + // Only fix spelling for No_overload_matches_this_call emitted on the React class component + if ((errorCode === ts.Diagnostics.No_overload_matches_this_call.code || + errorCode === ts.Diagnostics.Type_0_is_not_assignable_to_type_1.code) && + !ts.isJsxAttribute(parent)) + return undefined; var checker = context.program.getTypeChecker(); var suggestedSymbol; if (ts.isPropertyAccessExpression(parent) && parent.name === node) { @@ -133403,6 +133763,12 @@ var ts; suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol); } } + else if (ts.isJsxAttribute(parent) && parent.name === node) { + ts.Debug.assertNode(node, ts.isIdentifier, "Expected an identifier for JSX attribute"); + var tag = ts.findAncestor(node, ts.isJsxOpeningLikeElement); + var props = checker.getContextualTypeForArgumentAtIndex(tag, 0); + suggestedSymbol = checker.getSuggestedSymbolForNonexistentJSXAttribute(node, props); + } else { var meaning = ts.getMeaningFromLocation(node); var name = ts.getTextOfNode(node); @@ -136544,10 +136910,10 @@ var ts; (function (codefix) { function generateAccessorFromProperty(file, start, end, context, _actionName) { var fieldInfo = getAccessorConvertiblePropertyAtPosition(file, start, end); - if (!fieldInfo) + if (!fieldInfo || !fieldInfo.info) return undefined; var changeTracker = ts.textChanges.ChangeTracker.fromContext(context); - var isStatic = fieldInfo.isStatic, isReadonly = fieldInfo.isReadonly, fieldName = fieldInfo.fieldName, accessorName = fieldInfo.accessorName, originalName = fieldInfo.originalName, type = fieldInfo.type, container = fieldInfo.container, declaration = fieldInfo.declaration; + var _a = fieldInfo.info, isStatic = _a.isStatic, isReadonly = _a.isReadonly, fieldName = _a.fieldName, accessorName = _a.accessorName, originalName = _a.originalName, type = _a.type, container = _a.container, declaration = _a.declaration; ts.suppressLeadingAndTrailingTrivia(fieldName); ts.suppressLeadingAndTrailingTrivia(accessorName); ts.suppressLeadingAndTrailingTrivia(declaration); @@ -136622,23 +136988,37 @@ var ts; var declaration = ts.findAncestor(node.parent, isAcceptedDeclaration); // make sure declaration have AccessibilityModifier or Static Modifier or Readonly Modifier var meaning = 28 /* AccessibilityModifier */ | 32 /* Static */ | 64 /* Readonly */; - if (!declaration || !(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest) - || !isConvertibleName(declaration.name) || (ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) - return undefined; + if (!declaration || (!(ts.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest))) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_property_for_which_to_generate_accessor) + }; + } + if (!isConvertibleName(declaration.name)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Name_is_not_valid) + }; + } + if ((ts.getEffectiveModifierFlags(declaration) | meaning) !== meaning) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Can_only_convert_property_with_modifier) + }; + } var name = declaration.name.text; var startWithUnderscore = ts.startsWithUnderscore(name); var fieldName = createPropertyName(startWithUnderscore ? name : ts.getUniqueName("_" + name, file), declaration.name); var accessorName = createPropertyName(startWithUnderscore ? ts.getUniqueName(name.substring(1), file) : name, declaration.name); return { - isStatic: ts.hasStaticModifier(declaration), - isReadonly: ts.hasEffectiveReadonlyModifier(declaration), - type: ts.getTypeAnnotationNode(declaration), - container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, - originalName: declaration.name.text, - declaration: declaration, - fieldName: fieldName, - accessorName: accessorName, - renameAccessor: startWithUnderscore + info: { + isStatic: ts.hasStaticModifier(declaration), + isReadonly: ts.hasEffectiveReadonlyModifier(declaration), + type: ts.getTypeAnnotationNode(declaration), + container: declaration.kind === 159 /* Parameter */ ? declaration.parent.parent : declaration.parent, + originalName: declaration.name.text, + declaration: declaration, + fieldName: fieldName, + accessorName: accessorName, + renameAccessor: startWithUnderscore + } }; } codefix.getAccessorConvertiblePropertyAtPosition = getAccessorConvertiblePropertyAtPosition; @@ -137422,13 +137802,22 @@ var ts; var info = getInfo(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - var description = info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; - var actionName = info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (info.error === undefined) { + var description = info.info.wasDefault ? ts.Diagnostics.Convert_default_export_to_named_export.message : ts.Diagnostics.Convert_named_export_to_default_export.message; + var actionName = info.info.wasDefault ? actionNameDefaultToNamed : actionNameNamedToDefault; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_default_export_to_named_export.message, actions: [{ name: actionNameDefaultToNamed, description: ts.Diagnostics.Convert_default_export_to_named_export.message, notApplicableReason: info.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_export_to_default_export.message, actions: [{ name: actionNameNamedToDefault, description: ts.Diagnostics.Convert_named_export_to_default_export.message, notApplicableReason: info.error }] }, + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameDefaultToNamed || actionName === actionNameNamedToDefault, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, ts.Debug.checkDefined(getInfo(context), "context must have info"), t, context.cancellationToken); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, ts.Debug.checkDefined((_a = getInfo(context)) === null || _a === void 0 ? void 0 : _a.info, "context must have info"), t, context.cancellationToken); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; }, }); @@ -137439,14 +137828,14 @@ var ts; var token = ts.getTokenAtPosition(file, span.start); var exportNode = !!(token.parent && ts.getSyntacticModifierFlags(token.parent) & 1 /* Export */) && considerPartialSpans ? token.parent : ts.getParentNodeInSpan(token, file, span); if (!exportNode || (!ts.isSourceFile(exportNode.parent) && !(ts.isModuleBlock(exportNode.parent) && ts.isAmbientModule(exportNode.parent.parent)))) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_export_statement) }; } var exportingModuleSymbol = ts.isSourceFile(exportNode.parent) ? exportNode.parent.symbol : exportNode.parent.parent.symbol; var flags = ts.getSyntacticModifierFlags(exportNode); var wasDefault = !!(flags & 512 /* Default */); // If source file already has a default export, don't offer refactor. if (!(flags & 1 /* Export */) || !wasDefault && exportingModuleSymbol.exports.has("default" /* Default */)) { - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.This_file_already_has_a_default_export) }; } switch (exportNode.kind) { case 248 /* FunctionDeclaration */: @@ -137456,7 +137845,7 @@ var ts; case 251 /* TypeAliasDeclaration */: case 253 /* ModuleDeclaration */: { var node = exportNode; - return node.name && ts.isIdentifier(node.name) ? { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return node.name && ts.isIdentifier(node.name) ? { info: { exportNode: node, exportName: node.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } case 229 /* VariableStatement */: { var vs = exportNode; @@ -137468,7 +137857,7 @@ var ts; if (!decl.initializer) return undefined; ts.Debug.assert(!wasDefault, "Can't have a default flag here"); - return ts.isIdentifier(decl.name) ? { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } : undefined; + return ts.isIdentifier(decl.name) ? { info: { exportNode: vs, exportName: decl.name, wasDefault: wasDefault, exportingModuleSymbol: exportingModuleSymbol } } : undefined; } default: return undefined; @@ -137619,13 +138008,22 @@ var ts; var i = getImportToConvert(context, context.triggerReason === "invoked"); if (!i) return ts.emptyArray; - var description = i.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; - var actionName = i.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; - return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + if (i.error === undefined) { + var description = i.info.kind === 260 /* NamespaceImport */ ? ts.Diagnostics.Convert_namespace_import_to_named_imports.message : ts.Diagnostics.Convert_named_imports_to_namespace_import.message; + var actionName = i.info.kind === 260 /* NamespaceImport */ ? actionNameNamespaceToNamed : actionNameNamedToNamespace; + return [{ name: refactorName, description: description, actions: [{ name: actionName, description: description }] }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [ + { name: refactorName, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, actions: [{ name: actionNameNamespaceToNamed, description: ts.Diagnostics.Convert_namespace_import_to_named_imports.message, notApplicableReason: i.error }] }, + { name: refactorName, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, actions: [{ name: actionNameNamedToNamespace, description: ts.Diagnostics.Convert_named_imports_to_namespace_import.message, notApplicableReason: i.error }] } + ]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { ts.Debug.assert(actionName === actionNameNamespaceToNamed || actionName === actionNameNamedToNamespace, "Unexpected action name"); - var edits = ts.textChanges.ChangeTracker.with(context, function (t) { return doChange(context.file, context.program, t, ts.Debug.checkDefined(getImportToConvert(context), "Context must provide an import to convert")); }); + var edits = ts.textChanges.ChangeTracker.with(context, function (t) { var _a; return doChange(context.file, context.program, t, ts.Debug.checkDefined((_a = getImportToConvert(context)) === null || _a === void 0 ? void 0 : _a.info, "Context must provide an import to convert")); }); return { edits: edits, renameFilename: undefined, renameLocation: undefined }; } }); @@ -137636,10 +138034,18 @@ var ts; var span = ts.getRefactorContextSpan(context); var token = ts.getTokenAtPosition(file, span.start); var importDecl = considerPartialSpans ? ts.findAncestor(token, ts.isImportDeclaration) : ts.getParentNodeInSpan(token, file, span); - if (!importDecl || !ts.isImportDeclaration(importDecl) || (importDecl.getEnd() < span.start + span.length)) + if (!importDecl || !ts.isImportDeclaration(importDecl)) + return { error: "Selection is not an import declaration." }; + if (importDecl.getEnd() < span.start + span.length) return undefined; var importClause = importDecl.importClause; - return importClause && importClause.namedBindings; + if (!importClause) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_import_clause) }; + } + if (!importClause.namedBindings) { + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_namespace_import_or_named_imports) }; + } + return { info: importClause.namedBindings }; } function doChange(sourceFile, program, changes, toConvert) { var checker = program.getTypeChecker(); @@ -137908,7 +138314,27 @@ var ts; var rangeToExtract = getRangeToExtract(context.file, ts.getRefactorContextSpan(context), context.triggerReason === "invoked"); var targetRange = rangeToExtract.targetRange; if (targetRange === undefined) { - return ts.emptyArray; + if (!rangeToExtract.errors || rangeToExtract.errors.length === 0 || !context.preferences.provideRefactorNotApplicableReason) { + return ts.emptyArray; + } + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + name: "function_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }, + { + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [{ + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + name: "constant_extract_error", + notApplicableReason: getStringError(rangeToExtract.errors) + }] + }]; } var extractions = getPossibleExtractions(targetRange, context); if (extractions === undefined) { @@ -137917,17 +138343,18 @@ var ts; } var functionActions = []; var usedFunctionNames = ts.createMap(); + var innermostErrorFunctionAction; var constantActions = []; var usedConstantNames = ts.createMap(); + var innermostErrorConstantAction; var i = 0; for (var _i = 0, extractions_1 = extractions; _i < extractions_1.length; _i++) { var _a = extractions_1[_i], functionExtraction = _a.functionExtraction, constantExtraction = _a.constantExtraction; - // Skip these since we don't have a way to report errors yet + var description = functionExtraction.description; if (functionExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = functionExtraction.description; if (!usedFunctionNames.has(description)) { usedFunctionNames.set(description, true); functionActions.push({ @@ -137936,32 +138363,39 @@ var ts; }); } } + else if (!innermostErrorFunctionAction) { + innermostErrorFunctionAction = { + description: description, + name: "function_scope_" + i, + notApplicableReason: getStringError(functionExtraction.errors) + }; + } // Skip these since we don't have a way to report errors yet if (constantExtraction.errors.length === 0) { // Don't issue refactorings with duplicated names. // Scopes come back in "innermost first" order, so extractions will // preferentially go into nearer scopes - var description = constantExtraction.description; - if (!usedConstantNames.has(description)) { - usedConstantNames.set(description, true); + var description_1 = constantExtraction.description; + if (!usedConstantNames.has(description_1)) { + usedConstantNames.set(description_1, true); constantActions.push({ - description: description, + description: description_1, name: "constant_scope_" + i }); } } + else if (!innermostErrorConstantAction) { + innermostErrorConstantAction = { + description: description, + name: "constant_scope_" + i, + notApplicableReason: getStringError(constantExtraction.errors) + }; + } // *do* increment i anyway because we'll look for the i-th scope // later when actually doing the refactoring if the user requests it i++; } var infos = []; - if (constantActions.length) { - infos.push({ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), - actions: constantActions - }); - } if (functionActions.length) { infos.push({ name: refactorName, @@ -137969,7 +138403,35 @@ var ts; actions: functionActions }); } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorFunctionAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_function), + actions: [innermostErrorFunctionAction] + }); + } + if (constantActions.length) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: constantActions + }); + } + else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorConstantAction) { + infos.push({ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_constant), + actions: [innermostErrorConstantAction] + }); + } return infos.length ? infos : ts.emptyArray; + function getStringError(errors) { + var error = errors[0].messageText; + if (typeof error !== "string") { + error = error.messageText; + } + return error; + } } extractSymbol.getAvailableActions = getAvailableActions; /* Exported for tests */ @@ -139510,21 +139972,36 @@ var ts; var info = getRangeToExtract(context, context.triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), - actions: info.isJS ? [{ - name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) - }] : ts.append([{ - name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) - }], info.typeElements && { - name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) - }) - }]; + if (info.error === undefined) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: info.info.isJS ? [{ + name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef) + }] : ts.append([{ + name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias) + }], info.info.typeElements && { + name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface) + }) + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_type), + actions: [ + { name: extractToTypeDef, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_typedef), notApplicableReason: info.error }, + { name: extractToTypeAlias, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_type_alias), notApplicableReason: info.error }, + { name: extractToInterface, description: ts.getLocaleSpecificMessage(ts.Diagnostics.Extract_to_interface), notApplicableReason: info.error }, + ] + }]; + } + return ts.emptyArray; }, getEditsForAction: function (context, actionName) { + var _a; var file = context.file; - var info = ts.Debug.checkDefined(getRangeToExtract(context), "Expected to find a range to extract"); + var info = ts.Debug.checkDefined((_a = getRangeToExtract(context)) === null || _a === void 0 ? void 0 : _a.info, "Expected to find a range to extract"); var name = ts.getUniqueName("NewType", file); var edits = ts.textChanges.ChangeTracker.with(context, function (changes) { switch (actionName) { @@ -139556,14 +140033,14 @@ var ts; var selection = ts.findAncestor(current, (function (node) { return node.parent && ts.isTypeNode(node) && !rangeContainsSkipTrivia(range, node.parent, file) && (cursorRequest || ts.nodeOverlapsWithStartEnd(current, file, range.pos, range.end)); })); if (!selection || !ts.isTypeNode(selection)) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.Selection_is_not_a_valid_type_node) }; var checker = context.program.getTypeChecker(); var firstStatement = ts.Debug.checkDefined(ts.findAncestor(selection, ts.isStatement), "Should find a statement"); var typeParameters = collectTypeParameters(checker, selection, firstStatement, file); if (!typeParameters) - return undefined; + return { error: ts.getLocaleSpecificMessage(ts.Diagnostics.No_type_could_be_extracted_from_this_type_node) }; var typeElements = flattenTypeLiteralNodeReference(checker, selection); - return { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements }; + return { info: { isJS: isJS, selection: selection, firstStatement: firstStatement, typeParameters: typeParameters, typeElements: typeElements } }; } function flattenTypeLiteralNodeReference(checker, node) { if (!node) @@ -139684,32 +140161,47 @@ var ts; if (!context.endPosition) return undefined; var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition); - if (!info) + if (!info || !info.info) return undefined; var edits = ts.codefix.generateAccessorFromProperty(context.file, context.startPosition, context.endPosition, context, actionName); if (!edits) return undefined; var renameFilename = context.file.fileName; - var nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName; + var nameNeedRename = info.info.renameAccessor ? info.info.accessorName : info.info.fieldName; var renameLocationOffset = ts.isIdentifier(nameNeedRename) ? 0 : -1; - var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.declaration)); + var renameLocation = renameLocationOffset + ts.getRenameLocation(edits, renameFilename, nameNeedRename.text, /*preferLastLocation*/ ts.isParameter(info.info.declaration)); return { renameFilename: renameFilename, renameLocation: renameLocation, edits: edits }; }, getAvailableActions: function (context) { if (!context.endPosition) return ts.emptyArray; - if (!ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked")) + var info = ts.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.startPosition, context.endPosition, context.triggerReason === "invoked"); + if (!info) return ts.emptyArray; - return [{ - name: actionName, - description: actionDescription, - actions: [ - { - name: actionName, - description: actionDescription - } - ] - }]; + if (!info.error) { + return [{ + name: actionName, + description: actionDescription, + actions: [ + { + name: actionName, + description: actionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: actionName, + description: actionDescription, + actions: [{ + name: actionName, + description: actionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } }); })(generateGetAccessorAndSetAccessor = refactor.generateGetAccessorAndSetAccessor || (refactor.generateGetAccessorAndSetAccessor = {})); @@ -140440,27 +140932,45 @@ var ts; var info = getConvertibleArrowFunctionAtPosition(file, startPosition, triggerReason === "invoked"); if (!info) return ts.emptyArray; - return [{ - name: refactorName, - description: refactorDescription, - actions: [ - info.addBraces ? - { + if (info.error === undefined) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [ + info.info.addBraces ? + { + name: addBracesActionName, + description: addBracesActionDescription + } : { + name: removeBracesActionName, + description: removeBracesActionDescription + } + ] + }]; + } + if (context.preferences.provideRefactorNotApplicableReason) { + return [{ + name: refactorName, + description: refactorDescription, + actions: [{ name: addBracesActionName, - description: addBracesActionDescription - } : { - name: removeBracesActionName, - description: removeBracesActionDescription - } - ] - }]; + description: addBracesActionDescription, + notApplicableReason: info.error + }, { + name: removeBracesActionName, + description: removeBracesActionDescription, + notApplicableReason: info.error + }] + }]; + } + return ts.emptyArray; } function getEditsForAction(context, actionName) { var file = context.file, startPosition = context.startPosition; var info = getConvertibleArrowFunctionAtPosition(file, startPosition); - if (!info) + if (!info || !info.info) return undefined; - var expression = info.expression, returnStatement = info.returnStatement, func = info.func; + var _a = info.info, expression = _a.expression, returnStatement = _a.returnStatement, func = _a.func; var body; if (actionName === addBracesActionName) { var returnStatement_1 = ts.factory.createReturnStatement(expression); @@ -140488,25 +140998,38 @@ var ts; if (considerFunctionBodies === void 0) { considerFunctionBodies = true; } var node = ts.getTokenAtPosition(file, startPosition); var func = ts.getContainingFunction(node); - // Only offer a refactor in the function body on explicit refactor requests. - if (!func || !ts.isArrowFunction(func) || (!ts.rangeContainsRange(func, node) - || (ts.rangeContainsRange(func.body, node) && !considerFunctionBodies))) + if (!func) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Could_not_find_a_containing_arrow_function) + }; + } + if (!ts.isArrowFunction(func)) { + return { + error: ts.getLocaleSpecificMessage(ts.Diagnostics.Containing_function_is_not_an_arrow_function) + }; + } + if ((!ts.rangeContainsRange(func, node) || ts.rangeContainsRange(func.body, node) && !considerFunctionBodies)) { return undefined; + } if (ts.isExpression(func.body)) { return { - func: func, - addBraces: true, - expression: func.body + info: { + func: func, + addBraces: true, + expression: func.body + } }; } else if (func.body.statements.length === 1) { var firstStatement = ts.first(func.body.statements); if (ts.isReturnStatement(firstStatement)) { return { - func: func, - addBraces: false, - expression: firstStatement.expression, - returnStatement: firstStatement + info: { + func: func, + addBraces: false, + expression: firstStatement.expression, + returnStatement: firstStatement + } }; } } @@ -142491,6 +143014,10 @@ var ts; synchronizeHostData(); return program; } + function getAutoImportProvider() { + var _a; + return (_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host); + } function cleanupSemanticCache() { program = undefined; // TODO: GH#18217 } @@ -143159,6 +143686,7 @@ var ts; getEmitOutput: getEmitOutput, getNonBoundSourceFile: getNonBoundSourceFile, getProgram: getProgram, + getAutoImportProvider: getAutoImportProvider, getApplicableRefactors: getApplicableRefactors, getEditsForRefactor: getEditsForRefactor, toLineColumnOffset: sourceMapper.toLineColumnOffset, diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js index 703a7a56a19..7637630c923 100644 --- a/lib/typingsInstaller.js +++ b/lib/typingsInstaller.js @@ -83,7 +83,7 @@ var ts; // If changing the text in this section, be sure to test `configurePrerelease` too. ts.versionMajorMinor = "4.0"; /** The version of the TypeScript compiler release */ - ts.version = ts.versionMajorMinor + ".0-dev"; + ts.version = ts.versionMajorMinor + ".0-beta"; /** * Returns the native Map implementation if it is available and compatible (i.e. supports iteration). */ @@ -1191,6 +1191,14 @@ var ts; return values; } ts.getOwnValues = getOwnValues; + function arrayOf(count, f) { + var result = new Array(count); + for (var i = 0; i < count; i++) { + result[i] = f(i); + } + return result; + } + ts.arrayOf = arrayOf; function arrayFrom(iterator, map) { var result = []; for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) { @@ -4127,6 +4135,14 @@ var ts; VarianceFlags[VarianceFlags["Unreliable"] = 16] = "Unreliable"; VarianceFlags[VarianceFlags["AllowsStructuralFallback"] = 24] = "AllowsStructuralFallback"; })(VarianceFlags = ts.VarianceFlags || (ts.VarianceFlags = {})); + var ElementFlags; + (function (ElementFlags) { + ElementFlags[ElementFlags["Required"] = 1] = "Required"; + ElementFlags[ElementFlags["Optional"] = 2] = "Optional"; + ElementFlags[ElementFlags["Rest"] = 4] = "Rest"; + ElementFlags[ElementFlags["Variadic"] = 8] = "Variadic"; + ElementFlags[ElementFlags["Variable"] = 12] = "Variable"; + })(ElementFlags = ts.ElementFlags || (ts.ElementFlags = {})); /* @internal */ var JsxReferenceKind; (function (JsxReferenceKind) { @@ -7419,6 +7435,11 @@ var ts; Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."), _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."), _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."), + Source_has_0_element_s_but_target_requires_1: diag(2618, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."), + Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."), + Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."), + Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."), + Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other: diag(2622, ts.DiagnosticCategory.Error, "Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other_2622", "Element at index {0} is variadic in one type but not in the other."), Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."), A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."), Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."), @@ -8249,6 +8270,17 @@ var ts; Convert_to_named_function: diag(95124, ts.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"), Convert_to_arrow_function: diag(95125, ts.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"), Remove_parentheses: diag(95126, ts.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"), + Could_not_find_a_containing_arrow_function: diag(95127, ts.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"), + Containing_function_is_not_an_arrow_function: diag(95128, ts.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"), + Could_not_find_export_statement: diag(95129, ts.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"), + This_file_already_has_a_default_export: diag(95130, ts.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"), + Could_not_find_import_clause: diag(95131, ts.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"), + Could_not_find_namespace_import_or_named_imports: diag(95132, ts.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"), + Selection_is_not_a_valid_type_node: diag(95133, ts.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"), + No_type_could_be_extracted_from_this_type_node: diag(95134, ts.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"), + Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"), + Name_is_not_valid: diag(95136, ts.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"), + Can_only_convert_property_with_modifier: diag(95137, ts.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"), No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."), Classes_may_not_have_a_field_named_constructor: diag(18006, ts.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."), JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"), @@ -29754,7 +29786,7 @@ var ts; type = finishNode(factory.createJSDocNonNullableType(type), pos); break; case 57 /* QuestionToken */: - // If not in JSDoc and next token is start of a type we have a conditional type + // If next token is start of a type we have a conditional type if (lookAhead(nextTokenIsStartOfType)) { return type; } @@ -36559,7 +36591,7 @@ var ts; includeSpecs = ["**/*"]; } var result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile); - if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) { + if (shouldReportNoInputFiles(result, canJsonReportNoInputFiles(raw), resolutionStack)) { errors.push(getErrorForNoInputFiles(result.spec, configFileName)); } if (ts.hasProperty(raw, "references") && !isNullOrUndefined(raw.references)) { @@ -36602,10 +36634,10 @@ var ts; return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0); } /*@internal*/ - function canJsonReportNoInutFiles(raw) { + function canJsonReportNoInputFiles(raw) { return !ts.hasProperty(raw, "files") && !ts.hasProperty(raw, "references"); } - ts.canJsonReportNoInutFiles = canJsonReportNoInutFiles; + ts.canJsonReportNoInputFiles = canJsonReportNoInputFiles; /*@internal*/ function updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) { var existingErrors = configParseDiagnostics.length; @@ -42411,6 +42443,7 @@ var ts; getAllPossiblePropertiesOfTypes: getAllPossiblePropertiesOfTypes, getSuggestedSymbolForNonexistentProperty: getSuggestedSymbolForNonexistentProperty, getSuggestionForNonexistentProperty: getSuggestionForNonexistentProperty, + getSuggestedSymbolForNonexistentJSXAttribute: getSuggestedSymbolForNonexistentJSXAttribute, getSuggestedSymbolForNonexistentSymbol: function (location, name, meaning) { return getSuggestedSymbolForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestionForNonexistentSymbol: function (location, name, meaning) { return getSuggestionForNonexistentSymbol(location, ts.escapeLeadingUnderscores(name), meaning); }, getSuggestedSymbolForNonexistentModule: getSuggestedSymbolForNonexistentModule, @@ -46092,21 +46125,21 @@ var ts; if (typeArguments.length > 0) { var arity = getTypeReferenceArity(type); var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context); - var hasRestElement = type.target.hasRestElement; if (tupleConstituentNodes) { if (type.target.labeledElementDeclarations) { for (var i = 0; i < tupleConstituentNodes.length; i++) { - var isOptionalOrRest = i >= type.target.minLength; - var isRest = isOptionalOrRest && hasRestElement && i === arity - 1; - var isOptional = isOptionalOrRest && !isRest; - tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(isRest ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), isOptional ? ts.factory.createToken(57 /* QuestionToken */) : undefined, isRest ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]); + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = ts.factory.createNamedTupleMember(flags & 12 /* Variable */ ? ts.factory.createToken(25 /* DotDotDotToken */) : undefined, ts.factory.createIdentifier(ts.unescapeLeadingUnderscores(getTupleElementLabel(type.target.labeledElementDeclarations[i]))), flags & 2 /* Optional */ ? ts.factory.createToken(57 /* QuestionToken */) : undefined, flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]); } } else { - for (var i = type.target.minLength; i < Math.min(arity, tupleConstituentNodes.length); i++) { - tupleConstituentNodes[i] = hasRestElement && i === arity - 1 ? - ts.factory.createRestTypeNode(ts.factory.createArrayTypeNode(tupleConstituentNodes[i])) : - ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]); + for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) { + var flags = type.target.elementFlags[i]; + tupleConstituentNodes[i] = + flags & 12 /* Variable */ ? ts.factory.createRestTypeNode(flags & 4 /* Rest */ ? ts.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : + flags & 2 /* Optional */ ? ts.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : + tupleConstituentNodes[i]; } } var tupleTypeNode = ts.setEmitFlags(ts.factory.createTupleTypeNode(tupleConstituentNodes), 1 /* SingleLine */); @@ -49217,13 +49250,14 @@ var ts; function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) { var elements = pattern.elements; var lastElement = ts.lastOrUndefined(elements); - var hasRestElement = !!(lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken); - if (elements.length === 0 || elements.length === 1 && hasRestElement) { + var restElement = lastElement && lastElement.kind === 195 /* BindingElement */ && lastElement.dotDotDotToken ? lastElement : undefined; + if (elements.length === 0 || elements.length === 1 && restElement) { return languageVersion >= 2 /* ES2015 */ ? createIterableType(anyType) : anyArrayType; } var elementTypes = ts.map(elements, function (e) { return ts.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors); }); - var minLength = ts.findLastIndex(elements, function (e) { return !ts.isOmittedExpression(e) && !hasDefaultValue(e); }, elements.length - (hasRestElement ? 2 : 1)) + 1; - var result = createTupleType(elementTypes, minLength, hasRestElement); + var minLength = ts.findLastIndex(elements, function (e) { return !(e === restElement || ts.isOmittedExpression(e) || hasDefaultValue(e)); }, elements.length - 1) + 1; + var elementFlags = ts.map(elements, function (e, i) { return e === restElement ? 4 /* Rest */ : i >= minLength ? 2 /* Optional */ : 1 /* Required */; }); + var result = createTupleType(elementTypes, elementFlags); if (includePatternInType) { result = cloneTypeReference(result); result.pattern = pattern; @@ -49869,7 +49903,7 @@ var ts; function getBaseTypes(type) { if (!type.resolvedBaseTypes) { if (type.objectFlags & 8 /* Tuple */) { - type.resolvedBaseTypes = [createArrayType(getUnionType(type.typeParameters || ts.emptyArray), type.readonly)]; + type.resolvedBaseTypes = [getTupleBaseType(type)]; } else if (type.symbol.flags & (32 /* Class */ | 64 /* Interface */)) { if (type.symbol.flags & 32 /* Class */) { @@ -49885,6 +49919,10 @@ var ts; } return type.resolvedBaseTypes; } + function getTupleBaseType(type) { + var elementTypes = ts.sameMap(type.typeParameters, function (t, i) { return type.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t; }); + return createArrayType(getUnionType(elementTypes || ts.emptyArray), type.readonly); + } function resolveBaseTypesOfClass(type) { type.resolvedBaseTypes = ts.resolvingEmptyArray; var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type)); @@ -50685,17 +50723,16 @@ var ts; return [sig.parameters]; function expandSignatureParametersWithTupleMembers(restType, restIndex) { var elementTypes = getTypeArguments(restType); - var minLength = restType.target.minLength; - var tupleRestIndex = restType.target.hasRestElement ? elementTypes.length - 1 : -1; var associatedNames = restType.target.labeledElementDeclarations; var restParams = ts.map(elementTypes, function (t, i) { // Lookup the label from the individual tuple passed in before falling back to the signature `rest` parameter name var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]); var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i); - var checkFlags = i === tupleRestIndex ? 32768 /* RestParameter */ : - i >= minLength ? 16384 /* OptionalParameter */ : 0; + var flags = restType.target.elementFlags[i]; + var checkFlags = flags & 12 /* Variable */ ? 32768 /* RestParameter */ : + flags & 2 /* Optional */ ? 16384 /* OptionalParameter */ : 0; var symbol = createSymbol(1 /* FunctionScopedVariable */, name, checkFlags); - symbol.type = i === tupleRestIndex ? createArrayType(t) : t; + symbol.type = flags & 4 /* Rest */ ? createArrayType(t) : t; return symbol; }); return ts.concatenate(sig.parameters.slice(0, restIndex), restParams); @@ -51384,6 +51421,9 @@ var ts; return indexedAccess; } } + if (isGenericTupleType(type.objectType)) { + return getIndexTypeOfType(type.objectType, 1 /* Number */); + } var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType); if (objectConstraint && objectConstraint !== type.objectType) { return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType); @@ -51563,6 +51603,9 @@ var ts; return keyofConstraintType; } if (t.flags & 8388608 /* IndexedAccess */) { + if (isGenericTupleType(t.objectType)) { + return getIndexTypeOfType(t.objectType, 1 /* Number */); + } var baseObjectType = getBaseConstraint(t.objectType); var baseIndexType = getBaseConstraint(t.indexType); var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType); @@ -52481,9 +52524,11 @@ var ts; } } } - // When an 'infer T' declaration is immediately contained in a rest parameter - // declaration, we infer an 'unknown[]' constraint. - else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken) { + // When an 'infer T' declaration is immediately contained in a rest parameter declaration, a rest type + // or a named rest tuple element, we infer an 'unknown[]' constraint. + else if (grandParent.kind === 159 /* Parameter */ && grandParent.dotDotDotToken || + grandParent.kind === 180 /* RestType */ || + grandParent.kind === 191 /* NamedTupleMember */ && grandParent.dotDotDotToken) { inferences = ts.append(inferences, createArrayType(unknownType)); } } @@ -52605,9 +52650,7 @@ var ts; } else { type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function () { return errorType; })) || ts.emptyArray; - error(type.node || currentNode, type.target.symbol - ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves - : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); + error(type.node || currentNode, type.target.symbol ? ts.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol)); } } return type.resolvedTypeArguments; @@ -53038,22 +53081,32 @@ var ts; function createArrayType(elementType, readonly) { return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]); } - function isTupleRestElement(node) { - return node.kind === 180 /* RestType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.dotDotDotToken); + function getTupleElementFlags(node) { + switch (node.kind) { + case 179 /* OptionalType */: + return 2 /* Optional */; + case 180 /* RestType */: + return getRestTypeElementFlags(node); + case 191 /* NamedTupleMember */: + return node.questionToken ? 2 /* Optional */ : + node.dotDotDotToken ? getRestTypeElementFlags(node) : + 1 /* Required */; + default: + return 1 /* Required */; + } } - function isTupleOptionalElement(node) { - return node.kind === 179 /* OptionalType */ || (node.kind === 191 /* NamedTupleMember */ && !!node.questionToken); + function getRestTypeElementFlags(node) { + return getArrayElementTypeNode(node.type) ? 4 /* Rest */ : 8 /* Variadic */; } function getArrayOrTupleTargetType(node) { var readonly = isReadonlyTypeOperator(node.parent); - if (node.kind === 177 /* ArrayType */ || node.elements.length === 1 && isTupleRestElement(node.elements[0])) { + var elementType = getArrayElementTypeNode(node); + if (elementType) { return readonly ? globalReadonlyArrayType : globalArrayType; } - var lastElement = ts.lastOrUndefined(node.elements); - var restElement = lastElement && isTupleRestElement(lastElement) ? lastElement : undefined; - var minLength = ts.findLastIndex(node.elements, function (n) { return !isTupleOptionalElement(n) && n !== restElement; }) + 1; + var elementFlags = ts.map(node.elements, getTupleElementFlags); var missingName = ts.some(node.elements, function (e) { return e.kind !== 191 /* NamedTupleMember */; }); - return getTupleTypeOfArity(node.elements.length, minLength, !!restElement, readonly, /*associatedNames*/ missingName ? undefined : node.elements); + return getTupleTargetType(elementFlags, readonly, /*associatedNames*/ missingName ? undefined : node.elements); } // Return true if the given type reference node is directly aliased or if it needs to be deferred // because it is possibly contained in a circular chain of eagerly resolved types. @@ -53122,13 +53175,13 @@ var ts; if (target === emptyGenericType) { links.resolvedType = emptyObjectType; } - else if (isDeferredTypeReferenceNode(node)) { + else if (!(node.kind === 178 /* TupleType */ && ts.some(node.elements, function (e) { return !!(getTupleElementFlags(e) & 8 /* Variadic */); })) && isDeferredTypeReferenceNode(node)) { links.resolvedType = node.kind === 178 /* TupleType */ && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, /*mapper*/ undefined); } else { var elementTypes = node.kind === 177 /* ArrayType */ ? [getTypeFromTypeNode(node.elementType)] : ts.map(node.elements, getTypeFromTypeNode); - links.resolvedType = createTypeReference(target, elementTypes); + links.resolvedType = createNormalizedTypeReference(target, elementTypes); } } return links.resolvedType; @@ -53136,6 +53189,27 @@ var ts; function isReadonlyTypeOperator(node) { return ts.isTypeOperatorNode(node) && node.operator === 141 /* ReadonlyKeyword */; } + function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) { + if (readonly === void 0) { readonly = false; } + var tupleTarget = getTupleTargetType(elementFlags || ts.map(elementTypes, function (_) { return 1 /* Required */; }), readonly, namedMemberDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : + tupleTarget; + } + function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + if (elementFlags.length === 1 && elementFlags[0] & 4 /* Rest */) { + // [...X[]] is equivalent to just X[] + return readonly ? globalReadonlyArrayType : globalArrayType; + } + var key = ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? "#" : f & 2 /* Optional */ ? "?" : f & 4 /* Rest */ ? "." : "*"; }).join() + + (readonly ? "R" : "") + + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); + var type = tupleTypes.get(key); + if (!type) { + tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations)); + } + return type; + } // We represent tuple types as type references to synthesized generic interface types created by // this function. The types are of the form: // @@ -53143,27 +53217,37 @@ var ts; // // Note that the generic type created by this function has no symbol associated with it. The same // is true for each of the synthesized type parameters. - function createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { + function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) { + var arity = elementFlags.length; + var minLength = ts.findLastIndex(elementFlags, function (f) { return !!(f & (1 /* Required */ | 8 /* Variadic */)); }) + 1; var typeParameters; var properties = []; - var maxLength = hasRestElement ? arity - 1 : arity; + var combinedFlags = 0; if (arity) { typeParameters = new Array(arity); for (var i = 0; i < arity; i++) { var typeParameter = typeParameters[i] = createTypeParameter(); - if (i < maxLength) { - var property = createSymbol(4 /* Property */ | (i >= minLength ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); + var flags = elementFlags[i]; + combinedFlags |= flags; + if (!(combinedFlags & 12 /* Variable */)) { + var property = createSymbol(4 /* Property */ | (flags & 2 /* Optional */ ? 16777216 /* Optional */ : 0), "" + i, readonly ? 8 /* Readonly */ : 0); property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i]; property.type = typeParameter; properties.push(property); } } } - var literalTypes = []; - for (var i = minLength; i <= maxLength; i++) - literalTypes.push(getLiteralType(i)); + var fixedLength = properties.length; var lengthSymbol = createSymbol(4 /* Property */, "length"); - lengthSymbol.type = hasRestElement ? numberType : getUnionType(literalTypes); + if (combinedFlags & 12 /* Variable */) { + lengthSymbol.type = numberType; + } + else { + var literalTypes_1 = []; + for (var i = minLength; i <= arity; i++) + literalTypes_1.push(getLiteralType(i)); + lengthSymbol.type = getUnionType(literalTypes_1); + } properties.push(lengthSymbol); var type = createObjectType(8 /* Tuple */ | 4 /* Reference */); type.typeParameters = typeParameters; @@ -53181,38 +53265,110 @@ var ts; type.declaredConstructSignatures = ts.emptyArray; type.declaredStringIndexInfo = undefined; type.declaredNumberIndexInfo = undefined; + type.elementFlags = elementFlags; type.minLength = minLength; - type.hasRestElement = hasRestElement; + type.fixedLength = fixedLength; + type.hasRestElement = !!(combinedFlags & 12 /* Variable */); + type.combinedFlags = combinedFlags; type.readonly = readonly; type.labeledElementDeclarations = namedMemberDeclarations; return type; } - function getTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations) { - var key = arity + (hasRestElement ? "+" : ",") + minLength + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts.map(namedMemberDeclarations, getNodeId).join(",") : ""); - var type = tupleTypes.get(key); - if (!type) { - tupleTypes.set(key, type = createTupleTypeOfArity(arity, minLength, hasRestElement, readonly, namedMemberDeclarations)); - } - return type; + function createNormalizedTypeReference(target, typeArguments) { + return target.objectFlags & 8 /* Tuple */ && target.combinedFlags & 8 /* Variadic */ ? + createNormalizedTupleType(target, typeArguments) : + createTypeReference(target, typeArguments); } - function createTupleType(elementTypes, minLength, hasRestElement, readonly, namedMemberDeclarations) { - if (minLength === void 0) { minLength = elementTypes.length; } - if (hasRestElement === void 0) { hasRestElement = false; } - if (readonly === void 0) { readonly = false; } - var arity = elementTypes.length; - if (arity === 1 && hasRestElement) { - return createArrayType(elementTypes[0], readonly); + function createNormalizedTupleType(target, elementTypes) { + var _a, _b, _c; + // Transform [A, ...(X | Y | Z)] into [A, ...X] | [A, ...Y] | [A, ...Z] + var unionIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */ && t.flags & (131072 /* Never */ | 1048576 /* Union */)); }); + if (unionIndex >= 0) { + return mapType(elementTypes[unionIndex], function (t) { return createNormalizedTupleType(target, ts.replaceElement(elementTypes, unionIndex, t)); }); + } + // If there are no variadic elements with non-generic types, just create a type reference with the same target type. + var spreadIndex = ts.findIndex(elementTypes, function (t, i) { return !!(target.elementFlags[i] & 8 /* Variadic */) && !(t.flags & 58982400 /* InstantiableNonPrimitive */) && !isGenericMappedType(t); }); + if (spreadIndex < 0) { + return createTypeReference(target, elementTypes); + } + // We have non-generic variadic elements that need normalization. + var expandedTypes = []; + var expandedFlags = []; + var expandedDeclarations = []; + var optionalIndex = -1; + var restTypes; + var _loop_12 = function (i) { + var type = elementTypes[i]; + var flags = target.elementFlags[i]; + if (flags & 8 /* Variadic */) { + if (type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericMappedType(type)) { + // Generic variadic elements stay as they are (except following a rest element). + addElementOrRest(type, 8 /* Variadic */, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + } + else if (isTupleType(type)) { + // Spread variadic elements with tuple types into the resulting tuple. + ts.forEach(getTypeArguments(type), function (t, n) { var _a; return addElementOrRest(t, type.target.elementFlags[n], (_a = type.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[n]); }); + } + else { + // Treat everything else as an array type and create a rest element. + addElementOrRest(isArrayLikeType(type) && getIndexTypeOfType(type, 1 /* Number */) || errorType, 4 /* Rest */, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i]); + } + } + else { + // Copy other element kinds with no change. + addElementOrRest(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i]); + } + }; + for (var i = 0; i < elementTypes.length; i++) { + _loop_12(i); + } + if (restTypes) { + // Create a union of the collected rest element types. + expandedTypes[expandedTypes.length - 1] = getUnionType(restTypes); + } + var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations); + return tupleTarget === emptyGenericType ? emptyObjectType : + expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : + tupleTarget; + function addElementOrRest(type, flags, declaration) { + if (restTypes) { + // A rest element was previously added, so simply collect the type of this element. + restTypes.push(flags & 8 /* Variadic */ ? getIndexedAccessType(type, numberType) : type); + } + else { + if (flags & 1 /* Required */ && optionalIndex >= 0) { + // Turn preceding optional elements into required elements + for (var i = optionalIndex; i < expandedFlags.length; i++) { + if (expandedFlags[i] & 2 /* Optional */) + expandedFlags[i] = 1 /* Required */; + } + optionalIndex = -1; + } + else if (flags & 2 /* Optional */ && optionalIndex < 0) { + optionalIndex = expandedFlags.length; + } + else if (flags & 4 /* Rest */) { + // Start collecting element types when a rest element is added. + restTypes = [type]; + } + expandedTypes.push(type); + expandedFlags.push(flags); + if (expandedDeclarations && declaration) { + expandedDeclarations.push(declaration); + } + else { + expandedDeclarations = undefined; + } + } } - var tupleType = getTupleTypeOfArity(arity, minLength, arity > 0 && hasRestElement, readonly, namedMemberDeclarations); - return elementTypes.length ? createTypeReference(tupleType, elementTypes) : tupleType; } - function sliceTupleType(type, index) { - var tuple = type.target; - if (tuple.hasRestElement) { - // don't slice off rest element - index = Math.min(index, getTypeReferenceArity(type) - 1); - } - return createTupleType(getTypeArguments(type).slice(index), Math.max(0, tuple.minLength - index), tuple.hasRestElement, tuple.readonly, tuple.labeledElementDeclarations && tuple.labeledElementDeclarations.slice(index)); + function sliceTupleType(type, index, endSkipCount) { + if (endSkipCount === void 0) { endSkipCount = 0; } + var target = type.target; + var endIndex = getTypeReferenceArity(type) - endSkipCount; + return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts.emptyArray) : + createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), + /*readonly*/ false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex)); } function getTypeFromOptionalTypeNode(node) { var type = getTypeFromTypeNode(node.type); @@ -53726,7 +53882,7 @@ var ts; type = getReducedType(type); return type.flags & 1048576 /* Union */ ? getIntersectionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : type.flags & 2097152 /* Intersection */ ? getUnionType(ts.map(type.types, function (t) { return getIndexType(t, stringsOnly, noIndexSignatures); })) : - maybeTypeOfKind(type, 58982400 /* InstantiableNonPrimitive */) ? getIndexTypeForGenericType(type, stringsOnly) : + type.flags & 58982400 /* InstantiableNonPrimitive */ || isGenericTupleType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts.getObjectFlags(type) & 32 /* Mapped */ ? filterType(getConstraintTypeFromMappedType(type), function (t) { return !(noIndexSignatures && t.flags & (1 /* Any */ | 4 /* String */)); }) : type === wildcardType ? wildcardType : type.flags & 2 /* Unknown */ ? neverType : @@ -53973,7 +54129,7 @@ var ts; } return !!(type.objectFlags & 8388608 /* IsGenericObjectType */); } - return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type); + return !!(type.flags & 58982400 /* InstantiableNonPrimitive */) || isGenericMappedType(type) || isGenericTupleType(type); } function isGenericIndexType(type) { if (type.flags & 3145728 /* UnionOrIntersection */) { @@ -54047,6 +54203,15 @@ var ts; } // So ultimately (reading): // ((A & B) | C)[K1 | K2] -> ((A & B) | C)[K1] | ((A & B) | C)[K2] -> (A & B)[K1] | C[K1] | (A & B)[K2] | C[K2] -> (A[K1] & B[K1]) | C[K1] | (A[K2] & B[K2]) | C[K2] + // A generic tuple type indexed by a number exists only when the index type doesn't select a + // fixed element. We simplify to either the combined type of all elements (when the index type + // the actual number type) or to the combined type of all non-fixed elements. + if (isGenericTupleType(objectType) && indexType.flags & 296 /* NumberLike */) { + var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 /* Number */ ? 0 : objectType.target.fixedLength, /*endSkipCount*/ 0, writing); + if (elementType) { + return type[cache] = elementType; + } + } // If the object type is a mapped type { [P in K]: E }, where K is generic, instantiate E using a mapper // that substitutes the index type for P. For example, for an index access { [P in K]: Box }[X], we // construct the type Box. @@ -54093,6 +54258,18 @@ var ts; function getIndexedAccessType(objectType, indexType, accessNode, aliasSymbol, aliasTypeArguments) { return getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, 0 /* None */, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType); } + function indexTypeLessThan(indexType, limit) { + return everyType(indexType, function (t) { + if (t.flags & 384 /* StringOrNumberLiteral */) { + var propName = getPropertyNameFromType(t); + if (isNumericLiteralName(propName)) { + var index = +propName; + return index >= 0 && index < limit; + } + } + return false; + }); + } function getIndexedAccessTypeOrUndefined(objectType, indexType, accessNode, accessFlags, aliasSymbol, aliasTypeArguments) { if (accessFlags === void 0) { accessFlags = 0 /* None */; } if (objectType === wildcardType || indexType === wildcardType) { @@ -54103,12 +54280,15 @@ var ts; if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304 /* Nullable */) && isTypeAssignableToKind(indexType, 4 /* String */ | 8 /* Number */)) { indexType = stringType; } - // If the index type is generic, or if the object type is generic and doesn't originate in an expression, - // we are performing a higher-order index access where we cannot meaningfully access the properties of the - // object type. Note that for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in - // an expression. This is to preserve backwards compatibility. For example, an element access 'this["foo"]' - // has always been resolved eagerly using the constraint type of 'this' at the given location. - if (isGenericIndexType(indexType) || !(accessNode && accessNode.kind !== 188 /* IndexedAccessType */) && isGenericObjectType(objectType)) { + // If the index type is generic, or if the object type is generic and doesn't originate in an expression and + // the operation isn't exclusively indexing the fixed (non-variadic) portion of a tuple type, we are performing + // a higher-order index access where we cannot meaningfully access the properties of the object type. Note that + // for a generic T and a non-generic K, we eagerly resolve T[K] if it originates in an expression. This is to + // preserve backwards compatibility. For example, an element access 'this["foo"]' has always been resolved + // eagerly using the constraint type of 'this' at the given location. + if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 188 /* IndexedAccessType */ ? + isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : + isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) { if (objectType.flags & 3 /* AnyOrUnknown */) { return objectType; } @@ -54190,7 +54370,7 @@ var ts; function getConditionalType(root, mapper) { var result; var extraTypes; - var _loop_12 = function () { + var _loop_13 = function () { var checkType = instantiateType(root.checkType, mapper); var checkTypeInstantiable = isGenericObjectType(checkType) || isGenericIndexType(checkType); var extendsType = instantiateType(root.extendsType, mapper); @@ -54264,7 +54444,7 @@ var ts; // types of the form 'A extends B ? X : C extends D ? Y : E extends F ? Z : ...' as a single construct for // purposes of resolution. This means such types aren't subject to the instatiation depth limiter. while (true) { - var state_4 = _loop_12(); + var state_4 = _loop_13(); if (typeof state_4 === "object") return state_4.value; if (state_4 === "break") @@ -54702,19 +54882,32 @@ var ts; } return links.resolvedType; } + function getTypeFromRestTypeNode(node) { + return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type); + } + function getArrayElementTypeNode(node) { + switch (node.kind) { + case 185 /* ParenthesizedType */: + return getArrayElementTypeNode(node.type); + case 178 /* TupleType */: + if (node.elements.length === 1) { + node = node.elements[0]; + if (node.kind === 180 /* RestType */ || node.kind === 191 /* NamedTupleMember */ && node.dotDotDotToken) { + return getArrayElementTypeNode(node.type); + } + } + break; + case 177 /* ArrayType */: + return node.elementType; + } + return undefined; + } function getTypeFromNamedTupleTypeNode(node) { var links = getNodeLinks(node); - if (!links.resolvedType) { - var type = getTypeFromTypeNode(node.type); - if (node.dotDotDotToken) { - type = getElementTypeOfArrayType(type) || errorType; - } - if (node.questionToken && strictNullChecks) { - type = getOptionalType(type); - } - links.resolvedType = type; - } - return links.resolvedType; + return links.resolvedType || (links.resolvedType = + node.dotDotDotToken ? getTypeFromRestTypeNode(node) : + node.questionToken && strictNullChecks ? getOptionalType(getTypeFromTypeNode(node.type)) : + getTypeFromTypeNode(node.type)); } function getTypeFromTypeNode(node) { return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node); @@ -54782,7 +54975,7 @@ var ts; case 298 /* JSDocTypeExpression */: return getTypeFromTypeNode(node.type); case 180 /* RestType */: - return getElementTypeOfArrayType(getTypeFromTypeNode(node.type)) || errorType; + return getTypeFromRestTypeNode(node); case 305 /* JSDocVariadicType */: return getTypeFromJSDocVariadicType(node); case 173 /* FunctionType */: @@ -55074,6 +55267,9 @@ var ts; if (typeVariable !== mappedTypeVariable) { return mapType(getReducedType(mappedTypeVariable), function (t) { if (t.flags & (3 /* AnyOrUnknown */ | 58982400 /* InstantiableNonPrimitive */ | 524288 /* Object */ | 2097152 /* Intersection */) && t !== wildcardType && t !== errorType) { + if (isGenericTupleType(t)) { + return instantiateMappedGenericTupleType(t, type, typeVariable, mapper); + } var replacementMapper = prependTypeMapping(typeVariable, t, mapper); return isArrayType(t) ? instantiateMappedArrayType(t, type, replacementMapper) : isTupleType(t) ? instantiateMappedTupleType(t, type, replacementMapper) : @@ -55088,23 +55284,39 @@ var ts; function getModifiedReadonlyState(state, modifiers) { return modifiers & 1 /* IncludeReadonly */ ? true : modifiers & 2 /* ExcludeReadonly */ ? false : state; } + function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) { + // When a tuple type is generic (i.e. when it contains variadic elements), we want to eagerly map the + // non-generic elements and defer mapping the generic elements. In order to facilitate this, we transform + // M<[A, B?, ...T, ...C[]] into [...M<[A]>, ...M<[B?]>, ...M, ...M] and then rely on tuple type + // normalization to resolve the non-generic parts of the resulting tuple. + var elementFlags = tupleType.target.elementFlags; + var elementTypes = ts.map(getTypeArguments(tupleType), function (t, i) { + var singleton = elementFlags[i] & 8 /* Variadic */ ? t : + elementFlags[i] & 4 /* Rest */ ? createArrayType(t) : + createTupleType([t], [elementFlags[i]]); + // The singleton is never a generic tuple type, so it is safe to recurse here. + return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper)); + }); + var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType)); + return createTupleType(elementTypes, ts.map(elementTypes, function (_) { return 8 /* Variadic */; }), newReadonly); + } function instantiateMappedArrayType(arrayType, mappedType, mapper) { var elementType = instantiateMappedTypeTemplate(mappedType, numberType, /*isOptional*/ true, mapper); return elementType === errorType ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType))); } function instantiateMappedTupleType(tupleType, mappedType, mapper) { - var minLength = tupleType.target.minLength; + var elementFlags = tupleType.target.elementFlags; var elementTypes = ts.map(getTypeArguments(tupleType), function (_, i) { - return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), i >= minLength, mapper); + return instantiateMappedTypeTemplate(mappedType, getLiteralType("" + i), !!(elementFlags[i] & 2 /* Optional */), mapper); }); var modifiers = getMappedTypeModifiers(mappedType); - var newMinLength = modifiers & 4 /* IncludeOptional */ ? 0 : - modifiers & 8 /* ExcludeOptional */ ? getTypeReferenceArity(tupleType) - (tupleType.target.hasRestElement ? 1 : 0) : - minLength; + var newTupleModifiers = modifiers & 4 /* IncludeOptional */ ? ts.map(elementFlags, function (f) { return f & 1 /* Required */ ? 2 /* Optional */ : f; }) : + modifiers & 8 /* ExcludeOptional */ ? ts.map(elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + elementFlags; var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers); return ts.contains(elementTypes, errorType) ? errorType : - createTupleType(elementTypes, newMinLength, tupleType.target.hasRestElement, newReadonly, tupleType.target.labeledElementDeclarations); + createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations); } function instantiateMappedTypeTemplate(type, key, isOptional, mapper) { var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key); @@ -55201,7 +55413,7 @@ var ts; if (objectFlags & 4 /* Reference */ && !(type.node)) { var resolvedTypeArguments = type.resolvedTypeArguments; var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper); - return newTypeArguments !== resolvedTypeArguments ? createTypeReference(type.target, newTypeArguments) : type; + return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type; } return getObjectTypeInstantiation(type, mapper); } @@ -56710,7 +56922,7 @@ var ts; reducedTarget = findMatchingDiscriminantType(source, target, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target); checkTypes = reducedTarget.flags & 1048576 /* Union */ ? reducedTarget.types : [reducedTarget]; } - var _loop_13 = function (prop) { + var _loop_14 = function (prop) { if (shouldCheckAsExcessProperty(prop, source.symbol) && !isIgnoredJsxProperty(source, prop)) { if (!isKnownProperty(reducedTarget, prop.escapedName, isComparingJsxAttributes)) { if (reportErrors) { @@ -56725,13 +56937,20 @@ var ts; if (ts.isJsxAttributes(errorNode) || ts.isJsxOpeningLikeElement(errorNode) || ts.isJsxOpeningLikeElement(errorNode.parent)) { // JsxAttributes has an object-literal flag and undergo same type-assignablity check as normal object-literal. // However, using an object-literal error message will be very confusing to the users so we give different a message. - // TODO: Spelling suggestions for excess jsx attributes (needs new diagnostic messages) if (prop.valueDeclaration && ts.isJsxAttribute(prop.valueDeclaration) && ts.getSourceFileOfNode(errorNode) === ts.getSourceFileOfNode(prop.valueDeclaration.name)) { // Note that extraneous children (as in `extra`) don't pass this check, // since `children` is a SyntaxKind.PropertySignature instead of a SyntaxKind.JsxAttribute. errorNode = prop.valueDeclaration.name; } - reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(errorTarget)); + var propName = symbolToString(prop); + var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget); + var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : undefined; + if (suggestion) { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion); + } + else { + reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget)); + } } else { // use the property's value declaration if the property is assigned inside the literal itself @@ -56766,7 +56985,7 @@ var ts; }; for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) { var prop = _a[_i]; - var state_5 = _loop_13(prop); + var state_5 = _loop_14(prop); if (typeof state_5 === "object") return state_5.value; } @@ -57057,6 +57276,12 @@ var ts; return varianceResult; } } + // For a generic type T, [...T] is assignable to T, T is assignable to readonly [...T], and T is assignable + // to [...T] when T is constrained to a mutable array or tuple type. + if (isSingleElementGenericTupleType(source) && getTypeArguments(source)[0] === target && !source.target.readonly || + isSingleElementGenericTupleType(target) && getTypeArguments(target)[0] === source && (target.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source) || source))) { + return -1 /* True */; + } if (target.flags & 262144 /* TypeParameter */) { // A source type { [P in Q]: X } is related to a target type T if keyof T is related to Q and X is related to T[Q]. if (ts.getObjectFlags(source) & 32 /* Mapped */ && isRelatedTo(getIndexType(target), getConstraintTypeFromMappedType(source))) { @@ -57433,11 +57658,11 @@ var ts; // constituents of 'target'. If any combination does not have a match then 'source' is not relatable. var discriminantCombinations = ts.cartesianProduct(sourceDiscriminantTypes); var matchingTypes = []; - var _loop_14 = function (combination) { + var _loop_15 = function (combination) { var hasMatch = false; outer: for (var _i = 0, _a = target.types; _i < _a.length; _i++) { var type = _a[_i]; - var _loop_15 = function (i) { + var _loop_16 = function (i) { var sourceProperty = sourcePropertiesFiltered[i]; var targetProperty = getPropertyOfType(type, sourceProperty.escapedName); if (!targetProperty) @@ -57453,7 +57678,7 @@ var ts; } }; for (var i = 0; i < sourcePropertiesFiltered.length; i++) { - var state_7 = _loop_15(i); + var state_7 = _loop_16(i); switch (state_7) { case "continue-outer": continue outer; } @@ -57467,7 +57692,7 @@ var ts; }; for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) { var combination = discriminantCombinations_1[_a]; - var state_6 = _loop_14(combination); + var state_6 = _loop_15(combination); if (typeof state_6 === "object") return state_6.value; } @@ -57656,6 +57881,80 @@ var ts; if (relation === identityRelation) { return propertiesIdenticalTo(source, target, excludedProperties); } + var result = -1 /* True */; + if (isTupleType(target)) { + if (isArrayType(source) || isTupleType(source)) { + if (!target.target.readonly && (isReadonlyArrayType(source) || isTupleType(source) && source.target.readonly)) { + return 0 /* False */; + } + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var sourceRestFlag = isTupleType(source) ? source.target.combinedFlags & 4 /* Rest */ : 4 /* Rest */; + var targetRestFlag = target.target.combinedFlags & 4 /* Rest */; + var sourceMinLength = isTupleType(source) ? source.target.minLength : 0; + var targetMinLength = target.target.minLength; + if (!sourceRestFlag && sourceArity < targetMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength); + } + return 0 /* False */; + } + if (!targetRestFlag && targetArity < sourceMinLength) { + if (reportErrors) { + reportError(ts.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity); + } + return 0 /* False */; + } + if (!targetRestFlag && sourceRestFlag) { + if (reportErrors) { + if (sourceMinLength < targetMinLength) { + reportError(ts.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength); + } + else { + reportError(ts.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity); + } + } + return 0 /* False */; + } + var maxArity = Math.max(sourceArity, targetArity); + for (var i = 0; i < maxArity; i++) { + var targetFlags = i < targetArity ? target.target.elementFlags[i] : targetRestFlag; + var sourceFlags = isTupleType(source) && i < sourceArity ? source.target.elementFlags[i] : sourceRestFlag; + if (sourceFlags && targetFlags) { + if (targetFlags & 8 /* Variadic */ && !(sourceFlags & 8 /* Variadic */) || + (sourceFlags & 8 /* Variadic */ && !(targetFlags & 12 /* Variable */))) { + if (reportErrors) { + reportError(ts.Diagnostics.Element_at_index_0_is_variadic_in_one_type_but_not_in_the_other, i); + } + return 0 /* False */; + } + if (targetFlags & 1 /* Required */) { + if (!(sourceFlags & 1 /* Required */)) { + if (reportErrors) { + reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, i, typeToString(source), typeToString(target)); + } + return 0 /* False */; + } + } + var sourceType = getTypeArguments(source)[Math.min(i, sourceArity - 1)]; + var targetType = getTypeArguments(target)[Math.min(i, targetArity - 1)]; + var targetCheckType = sourceFlags & 8 /* Variadic */ && targetFlags & 4 /* Rest */ ? createArrayType(targetType) : targetType; + var related = isRelatedTo(sourceType, targetCheckType, reportErrors, /*headMessage*/ undefined, intersectionState); + if (!related) { + if (reportErrors) { + reportIncompatibleError(ts.Diagnostics.Types_of_property_0_are_incompatible, i); + } + return 0 /* False */; + } + result &= related; + } + } + return result; + } + if (target.target.combinedFlags & 12 /* Variable */) { + return 0 /* False */; + } + } var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source) && !isEmptyArrayLiteralType(source) && !isTupleType(source); var unmatchedProperty = getUnmatchedProperty(source, target, requireOptionalProperties, /*matchDiscriminantProperties*/ false); if (unmatchedProperty) { @@ -57678,35 +57977,6 @@ var ts; } } } - var result = -1 /* True */; - if (isTupleType(target)) { - var targetRestType = getRestTypeOfTupleType(target); - if (targetRestType) { - if (!isTupleType(source)) { - return 0 /* False */; - } - var sourceRestType = getRestTypeOfTupleType(source); - if (sourceRestType && !isRelatedTo(sourceRestType, targetRestType, reportErrors)) { - if (reportErrors) { - reportError(ts.Diagnostics.Rest_signatures_are_incompatible); - } - return 0 /* False */; - } - var targetCount = getTypeReferenceArity(target) - 1; - var sourceCount = getTypeReferenceArity(source) - (sourceRestType ? 1 : 0); - var sourceTypeArguments = getTypeArguments(source); - for (var i = targetCount; i < sourceCount; i++) { - var related = isRelatedTo(sourceTypeArguments[i], targetRestType, reportErrors); - if (!related) { - if (reportErrors) { - reportError(ts.Diagnostics.Property_0_is_incompatible_with_rest_element_type, "" + i); - } - return 0 /* False */; - } - result &= related; - } - } - } // We only call this for union target types when we're attempting to do excess property checking - in those cases, we want to get _all possible props_ // from the target union, across all members var properties = getPropertiesOfType(target); @@ -58064,7 +58334,7 @@ var ts; // The emptyArray singleton is used to signal a recursive invocation. cache.variances = ts.emptyArray; variances = []; - var _loop_16 = function (tp) { + var _loop_17 = function (tp) { var unmeasurable = false; var unreliable = false; var oldHandler = outofbandVarianceMarkerHandler; @@ -58096,7 +58366,7 @@ var ts; }; for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { var tp = typeParameters_1[_i]; - _loop_16(tp); + _loop_17(tp); } cache.variances = variances; } @@ -58519,15 +58789,40 @@ var ts; function isTupleType(type) { return !!(ts.getObjectFlags(type) & 4 /* Reference */ && type.target.objectFlags & 8 /* Tuple */); } + function isGenericTupleType(type) { + return isTupleType(type) && !!(type.target.combinedFlags & 8 /* Variadic */); + } + function isSingleElementGenericTupleType(type) { + return isGenericTupleType(type) && type.target.elementFlags.length === 1; + } function getRestTypeOfTupleType(type) { - return type.target.hasRestElement ? getTypeArguments(type)[type.target.typeParameters.length - 1] : undefined; + return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength); } function getRestArrayTypeOfTupleType(type) { var restType = getRestTypeOfTupleType(type); return restType && createArrayType(restType); } - function getLengthOfTupleType(type) { - return getTypeReferenceArity(type) - (type.target.hasRestElement ? 1 : 0); + function getEndLengthOfType(type) { + return isTupleType(type) ? getTypeReferenceArity(type) - ts.findLastIndex(type.target.elementFlags, function (f) { return !!(f & 12 /* Variable */); }) - 1 : 0; + } + function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) { + if (endSkipCount === void 0) { endSkipCount = 0; } + if (writing === void 0) { writing = false; } + var length = getTypeReferenceArity(type) - endSkipCount; + if (index < length) { + var typeArguments = getTypeArguments(type); + var elementTypes = []; + for (var i = index; i < length; i++) { + var t = typeArguments[i]; + elementTypes.push(type.target.elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessType(t, numberType) : t); + } + return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes); + } + return undefined; + } + function isTupleTypeStructureMatching(t1, t2) { + return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && + ts.every(t1.target.elementFlags, function (f, i) { return (f & 12 /* Variable */) === (t2.target.elementFlags[i] & 12 /* Variable */); }); } function isZeroBigInt(_a) { var value = _a.value; @@ -59016,7 +59311,8 @@ var ts; inferredType: undefined, priority: undefined, topLevel: true, - isFixed: false + isFixed: false, + impliedArity: undefined }; } function cloneInferenceInfo(inference) { @@ -59027,7 +59323,8 @@ var ts; inferredType: inference.inferredType, priority: inference.priority, topLevel: inference.topLevel, - isFixed: inference.isFixed + isFixed: inference.isFixed, + impliedArity: inference.impliedArity }; } function cloneInferredPartOfContext(context) { @@ -59130,9 +59427,10 @@ var ts; } if (isTupleType(source)) { var elementTypes = ts.map(getTypeArguments(source), function (t) { return inferReverseMappedType(t, target, constraint); }); - var minLength = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? - getTypeReferenceArity(source) - (source.target.hasRestElement ? 1 : 0) : source.target.minLength; - return createTupleType(elementTypes, minLength, source.target.hasRestElement, source.target.readonly, source.target.labeledElementDeclarations); + var elementFlags = getMappedTypeModifiers(target) & 4 /* IncludeOptional */ ? + ts.sameMap(source.target.elementFlags, function (f) { return f & 2 /* Optional */ ? 1 /* Required */ : f; }) : + source.target.elementFlags; + return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations); } // For all other object types we infer a new object type where the reverse mapping has been // applied to the type of each property. @@ -59197,13 +59495,13 @@ var ts; return result.value; } function tupleTypesDefinitelyUnrelated(source, target) { - return target.target.minLength > source.target.minLength || - !getRestTypeOfTupleType(target) && (!!getRestTypeOfTupleType(source) || getLengthOfTupleType(target) < getLengthOfTupleType(source)); + return !(target.target.combinedFlags & 8 /* Variadic */) && target.target.minLength > source.target.minLength || + !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength); } function typesDefinitelyUnrelated(source, target) { // Two tuple types with incompatible arities are definitely unrelated. // Two object types that each have a property that is unmatched in the other are definitely unrelated. - return isTupleType(source) && isTupleType(target) && tupleTypesDefinitelyUnrelated(source, target) || + return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true) && !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true); } @@ -59693,22 +59991,61 @@ var ts; if (!typesDefinitelyUnrelated(source, target)) { if (isArrayType(source) || isTupleType(source)) { if (isTupleType(target)) { - var sourceLength = isTupleType(source) ? getLengthOfTupleType(source) : 0; - var targetLength = getLengthOfTupleType(target); - var sourceRestType = isTupleType(source) ? getRestTypeOfTupleType(source) : getElementTypeOfArrayType(source); - var targetRestType = getRestTypeOfTupleType(target); - var fixedLength = targetLength < sourceLength || sourceRestType ? targetLength : sourceLength; - for (var i = 0; i < fixedLength; i++) { - inferFromTypes(i < sourceLength ? getTypeArguments(source)[i] : sourceRestType, getTypeArguments(target)[i]); + var sourceArity = getTypeReferenceArity(source); + var targetArity = getTypeReferenceArity(target); + var elementTypes = getTypeArguments(target); + var elementFlags = target.target.elementFlags; + // When source and target are tuple types with the same structure (fixed, variadic, and rest are matched + // to the same kind in each position), simply infer between the element types. + if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) { + for (var i = 0; i < targetArity; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + return; } - if (targetRestType) { - var types = fixedLength < sourceLength ? getTypeArguments(source).slice(fixedLength, sourceLength) : []; - if (sourceRestType) { - types.push(sourceRestType); + var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0; + var sourceRestType = !isTupleType(source) || sourceArity > 0 && source.target.elementFlags[sourceArity - 1] & 4 /* Rest */ ? + getTypeArguments(source)[sourceArity - 1] : undefined; + var endLength = !(target.target.combinedFlags & 12 /* Variable */) ? 0 : + sourceRestType ? getEndLengthOfType(target) : + Math.min(getEndLengthOfType(source), getEndLengthOfType(target)); + var sourceEndLength = sourceRestType ? 0 : endLength; + // Infer between starting fixed elements. + for (var i = 0; i < startLength; i++) { + inferFromTypes(getTypeArguments(source)[i], elementTypes[i]); + } + if (sourceRestType && sourceArity - startLength === 1) { + // Single rest element remains in source, infer from that to every element in target + for (var i = startLength; i < targetArity - endLength; i++) { + inferFromTypes(elementFlags[i] & 8 /* Variadic */ ? createArrayType(sourceRestType) : sourceRestType, elementTypes[i]); } - if (types.length) { - inferFromTypes(getUnionType(types), targetRestType); + } + else { + var middleLength = targetArity - startLength - endLength; + if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 /* Variadic */ && isTupleType(source)) { + // Middle of target is [...T, ...U] and source is tuple type + var targetInfo = getInferenceInfoForType(elementTypes[startLength]); + if (targetInfo && targetInfo.impliedArity !== undefined) { + // Infer slices from source based on implied arity of T. + inferFromTypes(sliceTupleType(source, startLength, sourceEndLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]); + inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, sourceEndLength), elementTypes[startLength + 1]); + } } + else if (middleLength === 1 && elementFlags[startLength] & 8 /* Variadic */) { + // Middle of target is exactly one variadic element. Infer the slice between the fixed parts in the source. + inferFromTypes(isTupleType(source) ? sliceTupleType(source, startLength, sourceEndLength) : createArrayType(sourceRestType), elementTypes[startLength]); + } + else if (middleLength === 1 && elementFlags[startLength] & 4 /* Rest */) { + // Middle of target is exactly one rest element. If middle of source is not empty, infer union of middle element types. + var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, sourceEndLength) : sourceRestType; + if (restType) { + inferFromTypes(restType, elementTypes[startLength]); + } + } + } + // Infer between ending fixed elements + for (var i = 0; i < endLength; i++) { + inferFromTypes(sourceRestType || getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]); } return; } @@ -60653,7 +60990,7 @@ var ts; var signature = getEffectsSignature(flow.node); if (signature) { var predicate = getTypePredicateOfSignature(signature); - if (predicate && predicate.kind === 3 /* AssertsIdentifier */) { + if (predicate && predicate.kind === 3 /* AssertsIdentifier */ && !predicate.type) { var predicateArgument = flow.node.arguments[predicate.parameterIndex]; if (predicateArgument && isFalseExpression(predicateArgument)) { return false; @@ -62551,7 +62888,7 @@ var ts; var args = getEffectiveCallArguments(iife); var indexOfParameter = func.parameters.indexOf(parameter); if (parameter.dotDotDotToken) { - return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined); + return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, /*context*/ undefined, 0 /* Normal */); } var links = getNodeLinks(iife); var cached = links.resolvedSignature; @@ -63317,6 +63654,9 @@ var ts; var arrayOrIterableType = checkExpression(node.expression, checkMode); return checkIteratedTypeOrElementType(33 /* Spread */, arrayOrIterableType, undefinedType, node.expression); } + function checkSyntheticExpression(node) { + return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type; + } function hasDefaultValue(node) { return (node.kind === 195 /* BindingElement */ && !!node.initializer) || (node.kind === 213 /* BinaryExpression */ && node.operatorToken.kind === 62 /* EqualsToken */); @@ -63325,26 +63665,22 @@ var ts; var elements = node.elements; var elementCount = elements.length; var elementTypes = []; - var hasEndingSpreadElement = false; - var hasNonEndingSpreadElement = false; + var elementFlags = []; var contextualType = getApparentTypeOfContextualType(node); var inDestructuringPattern = ts.isAssignmentTarget(node); var inConstContext = isConstContext(node); for (var i = 0; i < elementCount; i++) { var e = elements[i]; - var spread = e.kind === 217 /* SpreadElement */ && e.expression; - var spreadType = spread && checkExpression(spread, checkMode, forceTuple); - if (spreadType && isTupleType(spreadType)) { - elementTypes.push.apply(elementTypes, getTypeArguments(spreadType)); - if (spreadType.target.hasRestElement) { - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + if (e.kind === 217 /* SpreadElement */) { + if (languageVersion < 2 /* ES2015 */) { + checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 /* SpreadIncludes */ : 2048 /* SpreadArrays */); } - } - else { - if (inDestructuringPattern && spreadType) { + var spreadType = checkExpression(e.expression, checkMode, forceTuple); + if (isArrayLikeType(spreadType)) { + elementTypes.push(spreadType); + elementFlags.push(8 /* Variadic */); + } + else if (inDestructuringPattern) { // Given the following situation: // var c: {}; // [...c] = ["", 0]; @@ -63358,43 +63694,31 @@ var ts; // getContextualTypeForElementExpression, which will crucially not error // if there is no index type / iterated type. var restElementType = getIndexTypeOfType(spreadType, 1 /* Number */) || - getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false); - if (restElementType) { - elementTypes.push(restElementType); - } + getIteratedTypeOrElementType(65 /* Destructuring */, spreadType, undefinedType, /*errorNode*/ undefined, /*checkAssignability*/ false) || + unknownType; + elementTypes.push(restElementType); + elementFlags.push(4 /* Rest */); } else { - var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); - var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); - elementTypes.push(type); - } - if (spread) { // tuples are done above, so these are only arrays - if (i === elementCount - 1) - hasEndingSpreadElement = true; - else - hasNonEndingSpreadElement = true; + elementTypes.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, e.expression)); + elementFlags.push(4 /* Rest */); } } + else { + var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length); + var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple); + elementTypes.push(type); + elementFlags.push(1 /* Required */); + } } - if (!hasNonEndingSpreadElement) { - var minLength = elementTypes.length - (hasEndingSpreadElement ? 1 : 0); - // If array literal is actually a destructuring pattern, mark it as an implied type. We do this such - // that we get the same behavior for "var [x, y] = []" and "[x, y] = []". - var tupleResult = void 0; - if (inDestructuringPattern && minLength > 0) { - var type = cloneTypeReference(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - type.pattern = node; - return type; - } - else if (tupleResult = getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasEndingSpreadElement, elementTypes.length, inConstContext)) { - return createArrayLiteralType(tupleResult); - } - else if (forceTuple) { - return createArrayLiteralType(createTupleType(elementTypes, minLength, hasEndingSpreadElement)); - } + if (inDestructuringPattern) { + return createTupleType(elementTypes, elementFlags); + } + if (forceTuple || inConstContext || contextualType && forEachType(contextualType, isTupleLikeType)) { + return createArrayLiteralType(createTupleType(elementTypes, elementFlags, /*readonly*/ inConstContext)); } return createArrayLiteralType(createArrayType(elementTypes.length ? - getUnionType(elementTypes, 2 /* Subtype */) : + getUnionType(ts.sameMap(elementTypes, function (t, i) { return elementFlags[i] & 8 /* Variadic */ ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t; }), 2 /* Subtype */) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext)); } function createArrayLiteralType(type) { @@ -63408,14 +63732,6 @@ var ts; } return literalType; } - function getArrayLiteralTupleTypeIfApplicable(elementTypes, contextualType, hasRestElement, elementCount, readonly) { - if (elementCount === void 0) { elementCount = elementTypes.length; } - if (readonly === void 0) { readonly = false; } - // Infer a tuple type when the contextual type is or contains a tuple-like type - if (readonly || (contextualType && forEachType(contextualType, isTupleLikeType))) { - return createTupleType(elementTypes, elementCount - (hasRestElement ? 1 : 0), hasRestElement, readonly); - } - } function isNumericName(name) { switch (name.kind) { case 157 /* ComputedPropertyName */: @@ -63831,9 +64147,9 @@ var ts; var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName); // If there are children in the body of JSX element, create dummy attribute "children" with the union of children types so that it will pass the attribute checking process var childrenPropSymbol = createSymbol(4 /* Property */ | 33554432 /* Transient */, jsxChildrenPropertyName); - childrenPropSymbol.type = childrenTypes.length === 1 ? - childrenTypes[0] : - (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, /*hasRestElement*/ false) || createArrayType(getUnionType(childrenTypes))); + childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : + childrenContextualType && forEachType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : + createArrayType(getUnionType(childrenTypes)); // Fake up a property declaration for the children childrenPropSymbol.valueDeclaration = ts.factory.createPropertySignature(/*modifiers*/ undefined, ts.unescapeLeadingUnderscores(jsxChildrenPropertyName), /*questionToken*/ undefined, /*type*/ undefined); ts.setParent(childrenPropSymbol.valueDeclaration, attributes); @@ -64712,6 +65028,14 @@ var ts; function getSuggestedSymbolForNonexistentProperty(name, containingType) { return getSpellingSuggestionForName(ts.isString(name) ? name : ts.idText(name), getPropertiesOfType(containingType), 111551 /* Value */); } + function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) { + var strName = ts.isString(name) ? name : ts.idText(name); + var properties = getPropertiesOfType(containingType); + var jsxSpecific = strName === "for" ? ts.find(properties, function (x) { return ts.symbolName(x) === "htmlFor"; }) + : strName === "class" ? ts.find(properties, function (x) { return ts.symbolName(x) === "className"; }) + : undefined; + return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551 /* Value */); + } function getSuggestionForNonexistentProperty(name, containingType) { var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType); return suggestion && ts.symbolName(suggestion); @@ -65088,28 +65412,10 @@ var ts; argCount = signatureHelpTrailingComma ? args.length + 1 : args.length; // If we are missing the close parenthesis, the call is incomplete. callIsIncomplete = node.arguments.end === node.end; - // If one or more spread arguments are present, check that they correspond to a rest parameter or at least that they are in the valid range. - var firstSpreadArgIndex = getSpreadArgumentIndex(args); - if (firstSpreadArgIndex >= 0) { - if (firstSpreadArgIndex === args.length - 1) { - // Special case, handles the munged arguments that we receive in case of a spread in the end (breaks the arg.expression below) - // (see below for code that starts with "const spreadArgument") - return firstSpreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || firstSpreadArgIndex < getParameterCount(signature)); - } - var totalCount = firstSpreadArgIndex; // count previous arguments - for (var i = firstSpreadArgIndex; i < args.length; i++) { - var arg = args[i]; - if (!isSpreadArgument(arg)) { - totalCount += 1; - } - else { - var argType = flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression); - totalCount += isTupleType(argType) ? getTypeArguments(argType).length - : isArrayType(argType) ? 0 - : 1; - } - } - return totalCount >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || totalCount <= getParameterCount(signature)); + // If a spread argument is present, check that it corresponds to a rest parameter or at least that it's in the valid range. + var spreadArgIndex = getSpreadArgumentIndex(args); + if (spreadArgIndex >= 0) { + return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature)); } } // Too many arguments implies incorrect arity. @@ -65234,6 +65540,12 @@ var ts; } var restType = getNonArrayRestType(signature); var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length; + if (restType && restType.flags & 262144 /* TypeParameter */) { + var info = ts.find(context.inferences, function (info) { return info.typeParameter === restType; }); + if (info) { + info.impliedArity = ts.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : undefined; + } + } for (var i = 0; i < argCount; i++) { var arg = args[i]; if (arg.kind !== 219 /* OmittedExpression */) { @@ -65243,46 +65555,55 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode); inferTypes(context.inferences, spreadType, restType); } return getInferredTypes(context); } - function getArrayifiedType(type) { - return type.flags & 1048576 /* Union */ ? mapType(type, getArrayifiedType) : - type.flags & (1 /* Any */ | 63176704 /* Instantiable */) || isMutableArrayOrTuple(type) ? type : - isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.minLength, type.target.hasRestElement, /*readonly*/ false, type.target.labeledElementDeclarations) : - createArrayType(getIndexedAccessType(type, numberType)); + function getMutableArrayOrTupleType(type) { + return type.flags & 1048576 /* Union */ ? mapType(type, getMutableArrayOrTupleType) : + type.flags & 1 /* Any */ || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : + isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, /*readonly*/ false, type.target.labeledElementDeclarations) : + createTupleType([type], [8 /* Variadic */]); } - function getSpreadArgumentType(args, index, argCount, restType, context) { + function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) { if (index >= argCount - 1) { var arg = args[argCount - 1]; if (isSpreadArgument(arg)) { // We are inferring from a spread expression in the last argument position, i.e. both the parameter // and the argument are ...x forms. - return arg.kind === 224 /* SyntheticExpression */ ? - createArrayType(arg.type) : - getArrayifiedType(checkExpressionWithContextualType(arg.expression, restType, context, 0 /* Normal */)); + return getMutableArrayOrTupleType(arg.kind === 224 /* SyntheticExpression */ ? arg.type : + checkExpressionWithContextualType(arg.expression, restType, context, checkMode)); } } var types = []; + var flags = []; var names = []; - var spreadIndex = -1; for (var i = index; i < argCount; i++) { - var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); - var argType = checkExpressionWithContextualType(args[i], contextualType, context, 0 /* Normal */); - if (spreadIndex < 0 && isSpreadArgument(args[i])) { - spreadIndex = i - index; + var arg = args[i]; + if (isSpreadArgument(arg)) { + var spreadType = arg.kind === 224 /* SyntheticExpression */ ? arg.type : checkExpression(arg.expression); + if (isArrayLikeType(spreadType)) { + types.push(spreadType); + flags.push(8 /* Variadic */); + } + else { + types.push(checkIteratedTypeOrElementType(33 /* Spread */, spreadType, undefinedType, arg.kind === 217 /* SpreadElement */ ? arg.expression : arg)); + flags.push(4 /* Rest */); + } } - if (args[i].kind === 224 /* SyntheticExpression */ && args[i].tupleNameSource) { - names.push(args[i].tupleNameSource); + else { + var contextualType = getIndexedAccessType(restType, getLiteralType(i - index)); + var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode); + var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); + types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); + flags.push(1 /* Required */); + } + if (arg.kind === 224 /* SyntheticExpression */ && arg.tupleNameSource) { + names.push(arg.tupleNameSource); } - var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 /* Primitive */ | 4194304 /* Index */); - types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType)); } - return spreadIndex < 0 ? - createTupleType(types, /*minLength*/ undefined, /*hasRestElement*/ undefined, /*readonly*/ undefined, ts.length(names) === ts.length(types) ? names : undefined) : - createTupleType(ts.append(types.slice(0, spreadIndex), getUnionType(types.slice(spreadIndex))), spreadIndex, /*hasRestElement*/ true, /*readonly*/ undefined); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) { var isJavascript = ts.isInJSFile(signature.declaration); @@ -65464,7 +65785,7 @@ var ts; } } if (restType) { - var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined); + var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, /*context*/ undefined, checkMode); var errorNode = reportErrors ? argCount < args.length ? args[argCount] : node : undefined; if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, /*containingMessageChain*/ undefined, errorOutputContainer)) { ts.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors"); @@ -65524,19 +65845,30 @@ var ts; return node.attributes.properties.length > 0 || (ts.isJsxOpeningElement(node) && node.parent.children.length > 0) ? [node.attributes] : ts.emptyArray; } var args = node.arguments || ts.emptyArray; - var length = args.length; - if (length && isSpreadArgument(args[length - 1]) && getSpreadArgumentIndex(args) === length - 1) { - // We have a spread argument in the last position and no other spread arguments. If the type - // of the argument is a tuple type, spread the tuple elements into the argument list. We can - // call checkExpressionCached because spread expressions never have a contextual type. - var spreadArgument_1 = args[length - 1]; - var type_4 = flowLoopCount ? checkExpression(spreadArgument_1.expression) : checkExpressionCached(spreadArgument_1.expression); - if (isTupleType(type_4)) { - var typeArguments = getTypeArguments(type_4); - var restIndex_2 = type_4.target.hasRestElement ? typeArguments.length - 1 : -1; - var syntheticArgs = ts.map(typeArguments, function (t, i) { var _a; return createSyntheticExpression(spreadArgument_1, t, /*isSpread*/ i === restIndex_2, (_a = type_4.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); }); - return ts.concatenate(args.slice(0, length - 1), syntheticArgs); + var spreadIndex = getSpreadArgumentIndex(args); + if (spreadIndex >= 0) { + // Create synthetic arguments from spreads of tuple types. + var effectiveArgs_1 = args.slice(0, spreadIndex); + var _loop_18 = function (i) { + var arg = args[i]; + // We can call checkExpressionCached because spread expressions never have a contextual type. + var spreadType = arg.kind === 217 /* SpreadElement */ && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression)); + if (spreadType && isTupleType(spreadType)) { + ts.forEach(getTypeArguments(spreadType), function (t, i) { + var _a; + var flags = spreadType.target.elementFlags[i]; + var syntheticArg = createSyntheticExpression(arg, flags & 4 /* Rest */ ? createArrayType(t) : t, !!(flags & 12 /* Variable */), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i]); + effectiveArgs_1.push(syntheticArg); + }); + } + else { + effectiveArgs_1.push(arg); + } + }; + for (var i = spreadIndex; i < args.length; i++) { + _loop_18(i); } + return effectiveArgs_1; } return args; } @@ -65836,7 +66168,7 @@ var ts; var min_3 = Number.MAX_VALUE; var minIndex = 0; var i_1 = 0; - var _loop_17 = function (c) { + var _loop_19 = function (c) { var chain_2 = function () { return ts.chainDiagnosticMessages(/*details*/ undefined, ts.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c)); }; var diags_2 = getSignatureApplicabilityError(node, args, c, assignableRelation, 0 /* Normal */, /*reportErrors*/ true, chain_2); if (diags_2) { @@ -65854,7 +66186,7 @@ var ts; }; for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) { var c = candidatesForArgumentError_1[_a]; - _loop_17(c); + _loop_19(c); } var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts.flatten(allDiagnostics); ts.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures"); @@ -65988,7 +66320,7 @@ var ts; } var _a = ts.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max; var parameters = []; - var _loop_18 = function (i) { + var _loop_20 = function (i) { var symbols = ts.mapDefined(candidates, function (s) { return signatureHasRestParameter(s) ? i < s.parameters.length - 1 ? s.parameters[i] : ts.last(s.parameters) : i < s.parameters.length ? s.parameters[i] : undefined; }); @@ -65996,7 +66328,7 @@ var ts; parameters.push(createCombinedSymbolFromTypes(symbols, ts.mapDefined(candidates, function (candidate) { return tryGetTypeAtPosition(candidate, i); }))); }; for (var i = 0; i < maxNonRestParam; i++) { - _loop_18(i); + _loop_20(i); } var restParameterSymbols = ts.mapDefined(candidates, function (c) { return signatureHasRestParameter(c) ? ts.last(c.parameters) : undefined; }); var flags = 0 /* None */; @@ -66968,51 +67300,44 @@ var ts; // otherwise would return the type 'undefined'). var restType = getTypeOfSymbol(signature.parameters[paramCount]); var index = pos - paramCount; - if (!isTupleType(restType) || restType.target.hasRestElement || index < getTypeArguments(restType).length) { + if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) { return getIndexedAccessType(restType, getLiteralType(index)); } } return undefined; } function getRestTypeAtPosition(source, pos) { - var paramCount = getParameterCount(source); + var parameterCount = getParameterCount(source); + var minArgumentCount = getMinArgumentCount(source); var restType = getEffectiveRestType(source); - var nonRestCount = paramCount - (restType ? 1 : 0); - if (restType && pos === nonRestCount) { - return restType; + if (restType && pos >= parameterCount - 1) { + return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType)); } var types = []; + var flags = []; var names = []; - for (var i = pos; i < nonRestCount; i++) { - types.push(getTypeAtPosition(source, i)); + for (var i = pos; i < parameterCount; i++) { + if (!restType || i < parameterCount - 1) { + types.push(getTypeAtPosition(source, i)); + flags.push(i < minArgumentCount ? 1 /* Required */ : 2 /* Optional */); + } + else { + types.push(restType); + flags.push(8 /* Variadic */); + } var name = getNameableDeclarationAtPosition(source, i); - if (name && names) { + if (name) { names.push(name); } - else { - names = undefined; - } } - if (restType) { - types.push(getIndexedAccessType(restType, numberType)); - var name = getNameableDeclarationAtPosition(source, nonRestCount); - if (name && names) { - names.push(name); - } - else { - names = undefined; - } - } - var minArgumentCount = getMinArgumentCount(source); - var minLength = minArgumentCount < pos ? 0 : minArgumentCount - pos; - return createTupleType(types, minLength, !!restType, /*readonly*/ false, names); + return createTupleType(types, flags, /*readonly*/ false, ts.length(names) === ts.length(types) ? names : undefined); } function getParameterCount(signature) { var length = signature.parameters.length; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[length - 1]); if (isTupleType(restType)) { - return length + getTypeArguments(restType).length - 1; + return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1); } } return length; @@ -67021,9 +67346,10 @@ var ts; if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); if (isTupleType(restType)) { - var minLength = restType.target.minLength; - if (minLength > 0) { - return signature.parameters.length - 1 + minLength; + var firstOptionalIndex = ts.findIndex(restType.target.elementFlags, function (f) { return !(f & 1 /* Required */); }); + var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex; + if (requiredCount > 0) { + return signature.parameters.length - 1 + requiredCount; } } } @@ -67042,7 +67368,12 @@ var ts; function getEffectiveRestType(signature) { if (signatureHasRestParameter(signature)) { var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]); - return isTupleType(restType) ? getRestArrayTypeOfTupleType(restType) : restType; + if (!isTupleType(restType)) { + return restType; + } + if (restType.target.hasRestElement) { + return sliceTupleType(restType, restType.target.fixedLength); + } } return undefined; } @@ -67381,8 +67712,8 @@ var ts; var witnesses = getSwitchClauseTypeOfWitnesses(node, /*retainDefault*/ false); // notEqualFacts states that the type of the switched value is not equal to every type in the switch. var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, /*hasDefault*/ true); - var type_5 = getBaseConstraintOfType(operandType) || operandType; - return !!(filterType(type_5, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); + var type_4 = getBaseConstraintOfType(operandType) || operandType; + return !!(filterType(type_4, function (t) { return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1; }).flags & 131072 /* Never */); } var type = getTypeOfExpression(node.expression); if (!isLiteralType(type)) { @@ -67722,7 +68053,7 @@ var ts; error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference); return booleanType; } - if (expr.kind === 198 /* PropertyAccessExpression */ && ts.isPrivateIdentifier(expr.name)) { + if (ts.isPropertyAccessExpression(expr) && ts.isPrivateIdentifier(expr.name)) { error(expr, ts.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier); } var links = getNodeLinks(expr); @@ -68766,18 +69097,19 @@ var ts; } function padTupleType(type, pattern) { var patternElements = pattern.elements; - var arity = getTypeReferenceArity(type); - var elementTypes = arity ? getTypeArguments(type).slice() : []; - for (var i = arity; i < patternElements.length; i++) { + var elementTypes = getTypeArguments(type).slice(); + var elementFlags = type.target.elementFlags.slice(); + for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) { var e = patternElements[i]; if (i < patternElements.length - 1 || !(e.kind === 195 /* BindingElement */ && e.dotDotDotToken)) { elementTypes.push(!ts.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, /*includePatternInType*/ false, /*reportErrors*/ false) : anyType); + elementFlags.push(2 /* Optional */); if (!ts.isOmittedExpression(e) && !hasDefaultValue(e)) { reportImplicitAny(e, anyType); } } } - return createTupleType(elementTypes, type.target.minLength, /*hasRestElement*/ false, type.target.readonly); + return createTupleType(elementTypes, elementFlags, type.target.readonly); } function widenTypeInferredFromInitializer(declaration, type) { var widened = ts.getCombinedNodeFlags(declaration) & 2 /* Const */ || ts.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type); @@ -69198,7 +69530,7 @@ var ts; case 216 /* YieldExpression */: return checkYieldExpression(node); case 224 /* SyntheticExpression */: - return node.type; + return checkSyntheticExpression(node); case 280 /* JsxExpression */: return checkJsxExpression(node, checkMode); case 270 /* JsxElement */: @@ -69854,16 +70186,20 @@ var ts; grammarErrorOnNode(e, ts.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names); break; } - if (isTupleRestElement(e)) { + var flags = getTupleElementFlags(e); + if (flags & 8 /* Variadic */) { + if (!isArrayLikeType(getTypeFromTypeNode(e.type))) { + error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); + break; + } + } + else if (flags & 4 /* Rest */) { if (i !== elementTypes.length - 1) { grammarErrorOnNode(e, ts.Diagnostics.A_rest_element_must_be_last_in_a_tuple_type); break; } - if (!isArrayType(getTypeFromTypeNode(e.type))) { - error(e, ts.Diagnostics.A_rest_element_type_must_be_an_array_type); - } } - else if (isTupleOptionalElement(e)) { + else if (flags & 2 /* Optional */) { seenOptionalElement = true; } else if (seenOptionalElement) { @@ -72915,7 +73251,7 @@ var ts; function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) { // iterate over all implemented properties and issue errors on each one which isn't compatible, rather than the class as a whole, if possible var issuedMemberError = false; - var _loop_19 = function (member) { + var _loop_21 = function (member) { if (ts.hasStaticModifier(member)) { return "continue"; } @@ -72934,7 +73270,7 @@ var ts; }; for (var _i = 0, _a = node.members; _i < _a.length; _i++) { var member = _a[_i]; - _loop_19(member); + _loop_21(member); } if (!issuedMemberError) { // check again with diagnostics to generate a less-specific error @@ -106854,7 +107190,7 @@ var ts; }); // Sort by paths closest to importing file Name directory var sortedPaths = []; - var _loop_20 = function (directory) { + var _loop_22 = function (directory) { var directoryStart = ts.ensureTrailingDirectorySeparator(directory); var pathsInDirectory; allFileNames.forEach(function (canonicalFileName, fileName) { @@ -106880,7 +107216,7 @@ var ts; }; var out_directory_1; for (var directory = ts.getDirectoryPath(ts.toPath(importingFileName, cwd, getCanonicalFileName)); allFileNames.size !== 0;) { - var state_8 = _loop_20(directory); + var state_8 = _loop_22(directory); directory = out_directory_1; if (state_8 === "break") break; @@ -107947,7 +108283,7 @@ var ts; configFileSpecs = configFileParseResult.configFileSpecs; // TODO: GH#18217 projectReferences = configFileParseResult.projectReferences; configFileParsingDiagnostics = ts.getConfigFileParsingDiagnostics(configFileParseResult).slice(); - canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInutFiles(configFileParseResult.raw); + canConfigFileJsonReportNoInputFiles = ts.canJsonReportNoInputFiles(configFileParseResult.raw); hasChangedConfigFileParsingErrors = true; } function onSourceFileChange(fileName, eventKind, path) { @@ -108816,7 +109152,7 @@ var ts; else if (reloadLevel === ts.ConfigFileProgramReloadLevel.Partial) { // Update file names var result = ts.getFileNamesFromConfigSpecs(config.configFileSpecs, ts.getDirectoryPath(project), config.options, state.parseConfigFileHost); - ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInutFiles(config.raw)); + ts.updateErrorForNoInputFiles(result, project, config.configFileSpecs, config.errors, ts.canJsonReportNoInputFiles(config.raw)); config.fileNames = result.fileNames; watchInputFiles(state, project, projectPath, config); } @@ -108955,7 +109291,7 @@ var ts; } } // Container if no files are specified in the project - if (!project.fileNames.length && !ts.canJsonReportNoInutFiles(project.raw)) { + if (!project.fileNames.length && !ts.canJsonReportNoInputFiles(project.raw)) { return { type: ts.UpToDateStatusType.ContainerOnly }; diff --git a/lib/zh-cn/diagnosticMessages.generated.json b/lib/zh-cn/diagnosticMessages.generated.json index 40448a04407..b4733713acc 100644 --- a/lib/zh-cn/diagnosticMessages.generated.json +++ b/lib/zh-cn/diagnosticMessages.generated.json @@ -217,6 +217,7 @@ "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312": "接口只能扩展使用静态已知成员的对象类型或对象类型的交集。", "An_interface_property_cannot_have_an_initializer_1246": "接口函数不能具有初始化表达式。", "An_iterator_must_have_a_next_method_2489": "迭代器必须具有 \"next()\" 方法。", + "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017": "将 @jsx 杂注与 JSX 片段一起使用时,需要使用 @jsxFrag 杂注。", "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118": "对象文字不能具有多个具有相同名称的 get/set 访问器。", "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117": "严格模式下,对象文字不能包含多个具有相同名称的属性。", "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119": "对象文字不能包含具有相同名称的属性和访问器。", @@ -606,6 +607,7 @@ "Global_type_0_must_have_1_type_parameter_s_2317": "全局类型“{0}”必须具有 {1} 个类型参数。", "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384": "在 \"--incremental\" 和 \"--watch\" 中有重新编译,假定文件中的更改只会影响直接依赖它的文件。", "Hexadecimal_digit_expected_1125": "应为十六进制数字。", + "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262": "应为标识符。“{0}”是模块顶层的预留字。", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212": "应为标识符。“{0}”在严格模式下是保留字。", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213": "应为标识符。“{0}”在严格模式下是保留字。类定义自动处于严格模式。", "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214": "应为标识符。“{0}”是严格模式下的保留字。模块自动处于严格模式。", @@ -663,6 +665,7 @@ "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215": "“{0}”的使用无效。模块自动处于严格模式。", "Invalid_use_of_0_in_strict_mode_1100": "严格模式下“{0}”的使用无效。", "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067": "\"jsxFactory\" 的值无效。“{0}”不是有效的标识符或限定名称。", + "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035": "\"jsxFragmentFactory\" 的值无效。“{0}”不是有效的标识符或限定名称。", "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059": "\"--reactNamespace\" 的值无效。“{0}”不是有效的标识符。", "Its_element_type_0_is_not_a_valid_JSX_element_2789": "其元素类型 \"{0}\" 不是有效的 JSX 元素。", "Its_instance_type_0_is_not_a_valid_JSX_element_2788": "其实例类型 \"{0}\" 不是有效的 JSX 元素。", @@ -689,8 +692,6 @@ "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007": "JSX 表达式不能使用逗号运算符。你是想写入数组吗?", "JSX_expressions_must_have_one_parent_element_2657": "JSX 表达式必须具有一个父元素。", "JSX_fragment_has_no_corresponding_closing_tag_17014": "JSX 片段没有相应的结束标记。", - "JSX_fragment_is_not_supported_when_using_an_inline_JSX_factory_pragma_17017": "使用内联 JSX 工厂 pragma 时,不支持 JSX 片段", - "JSX_fragment_is_not_supported_when_using_jsxFactory_17016": "使用 --jsxFactory 时不支持 JSX 片段", "JSX_spread_child_must_be_an_array_type_2609": "JSX 扩展子属性必须为数组类型。", "Jump_target_cannot_cross_function_boundary_1107": "跳转目标不能跨越函数边界。", "KIND_6034": "种类", @@ -945,6 +946,7 @@ "Raise_error_on_this_expressions_with_an_implied_any_type_6115": "在带隐式“any\" 类型的 \"this\" 表达式上引发错误。", "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205": "提供 \"--isolatedModules\" 标志时,需要使用 \"export type\" 才能重新导出类型。", "Redirect_output_structure_to_the_directory_6006": "将输出结构重定向到目录。", + "Referenced_project_0_may_not_disable_emit_6310": "引用的项目“{0}”可能不会禁用发出。", "Referenced_project_0_must_have_setting_composite_Colon_true_6306": "引用的项目“{0}”必须拥有设置 \"composite\": true。", "Remove_all_unnecessary_uses_of_await_95087": "删除 \"await\" 的所有不必要的使用", "Remove_all_unreachable_code_95051": "删除所有无法访问的代码", @@ -954,6 +956,7 @@ "Remove_braces_from_arrow_function_body_95112": "从箭头函数主体中删除大括号", "Remove_destructuring_90009": "删除解构", "Remove_import_from_0_90005": "从“{0}”删除导入", + "Remove_parentheses_95126": "删除括号", "Remove_template_tag_90011": "删除模板标记", "Remove_type_parameters_90012": "删除类型参数", "Remove_unnecessary_await_95086": "删除不必要的 \"await\"", @@ -1044,6 +1047,7 @@ "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226": "指定在不支持本机递归监视的平台上监视目录的策略: \"UseFsEvents\" (默认)、\"FixedPollingInterval\"、\"DynamicPriorityPolling\"。", "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225": "指定监视文件的策略: \"FixedPollingInterval\" (默认)、\"PriorityPollingInterval\"、\"DynamicPriorityPolling\"、\"UseFsEvents\"、\"UseFsEventsOnParentDirectory\"。", "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146": "指定在设定 \"react\" JSX 发出目标时要使用的 JSX 工厂函数,例如 \"react.createElement\" 或 \"h\"。", + "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034": "当指定使用 \"jsxFactory\" 编译器选项面向 \"react\" JSX 发出时,指定要使用的 JSX 片段工厂函数,例如 \"Fragment\"。", "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060": "指定发出文件时要使用的行序列结尾: \"CRLF\" (dos)或 \"LF\" (unix)。", "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004": "指定调试调试程序应将 TypeScript 文件放置到的位置而不是源位置。", "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003": "指定调试程序应将映射文件放置到的位置而不是生成的位置。", @@ -1105,6 +1109,7 @@ "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527": "“{0}”的推断类型引用不可访问的“{1}”类型。需要类型批注。", "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032": "由于属性“{1}”存在于多个要素中,但在某些要素中是专用属性,因此已将交集“{0}”缩减为“绝不”。", "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031": "由于属性“{1}”在某些要素中具有存在冲突的类型,因此已将交集“{0}”缩减为“绝不”。", + "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016": "必须提供 \"jsxFragmentFactory\" 编译器选项才能将 JSX 片段与 \"jsxFactory\" 编译器选项一起使用。", "The_last_overload_gave_the_following_error_2770": "最后一个重载给出了以下错误。", "The_last_overload_is_declared_here_2771": "在此处声明最后一个重载。", "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491": "\"for...in\" 语句的左侧不能为析构模式。", @@ -1343,6 +1348,7 @@ "_0_is_declared_here_2728": "在此处声明了 \"{0}\"。", "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611": "\"{0}\" 在类 \"{1}\" 中定义为属性,但这里在 \"{2}\" 中重写为访问器。", "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610": "\"{0}\" 在类 \"{1}\" 中定义为访问器,但这里在 \"{2}\" 中重写为实例属性。", + "_0_is_deprecated_6385": "“{0}”已被弃用", "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012": "“{0}”不是关键字“{1}”的有效元属性。是否是指“{2}”?", "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506": "“{0}”在其自身的基表达式中得到直接或间接引用。", "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502": "“{0}”在其自身的类型批注中得到直接或间接引用。", diff --git a/package.json b/package.json index b8700085ad8..2f7f8aef8be 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "typescript", "author": "Microsoft Corp.", "homepage": "https://www.typescriptlang.org/", - "version": "4.0.0", + "version": "4.0.0-beta", "license": "Apache-2.0", "description": "TypeScript is a language for application scale JavaScript development", "keywords": [ diff --git a/src/compiler/corePublic.ts b/src/compiler/corePublic.ts index f77b4bda4c2..8c7334c1e49 100644 --- a/src/compiler/corePublic.ts +++ b/src/compiler/corePublic.ts @@ -3,7 +3,7 @@ namespace ts { // If changing the text in this section, be sure to test `configurePrerelease` too. export const versionMajorMinor = "4.0"; /** The version of the TypeScript compiler release */ - export const version = `${versionMajorMinor}.0-dev`; + export const version = `${versionMajorMinor}.0-beta`; /** * Type of objects whose values are all of the same type.