1 line
280 KiB
JSON
1 line
280 KiB
JSON
{"9a6b294ab496650e9f270123730df37030911b55": {"diff": "diff --git a/fs/afs/internal.h b/fs/afs/internal.h\nindex a812952be1c948..7385d62c8cf503 100644\n--- a/fs/afs/internal.h\n+++ b/fs/afs/internal.h\n@@ -586,6 +586,7 @@ struct afs_volume {\n #define AFS_VOLUME_OFFLINE\t4\t/* - T if volume offline notice given */\n #define AFS_VOLUME_BUSY\t\t5\t/* - T if volume busy notice given */\n #define AFS_VOLUME_MAYBE_NO_IBULK 6\t/* - T if some servers don't have InlineBulkStatus */\n+#define AFS_VOLUME_RM_TREE\t7\t/* - Set if volume removed from cell->volumes */\n #ifdef CONFIG_AFS_FSCACHE\n \tstruct fscache_volume\t*cache;\t\t/* Caching cookie */\n #endif\n@@ -1513,6 +1514,7 @@ extern struct afs_vlserver_list *afs_extract_vlserver_list(struct afs_cell *,\n extern struct afs_volume *afs_create_volume(struct afs_fs_context *);\n extern int afs_activate_volume(struct afs_volume *);\n extern void afs_deactivate_volume(struct afs_volume *);\n+bool afs_try_get_volume(struct afs_volume *volume, enum afs_volume_trace reason);\n extern struct afs_volume *afs_get_volume(struct afs_volume *, enum afs_volume_trace);\n extern void afs_put_volume(struct afs_net *, struct afs_volume *, enum afs_volume_trace);\n extern int afs_check_volume_status(struct afs_volume *, struct afs_operation *);\ndiff --git a/fs/afs/volume.c b/fs/afs/volume.c\nindex 29d483c8028130..115c081a8e2ce5 100644\n--- a/fs/afs/volume.c\n+++ b/fs/afs/volume.c\n@@ -32,8 +32,13 @@ static struct afs_volume *afs_insert_volume_into_cell(struct afs_cell *cell,\n \t\t} else if (p->vid > volume->vid) {\n \t\t\tpp = &(*pp)->rb_right;\n \t\t} else {\n-\t\t\tvolume = afs_get_volume(p, afs_volume_trace_get_cell_insert);\n-\t\t\tgoto found;\n+\t\t\tif (afs_try_get_volume(p, afs_volume_trace_get_cell_insert)) {\n+\t\t\t\tvolume = p;\n+\t\t\t\tgoto found;\n+\t\t\t}\n+\n+\t\t\tset_bit(AFS_VOLUME_RM_TREE, &volume->flags);\n+\t\t\trb_replace_node_rcu(&p->cell_node, &volume->cell_node, &cell->volumes);\n \t\t}\n \t}\n \n@@ -56,7 +61,8 @@ static void afs_remove_volume_from_cell(struct afs_volume *volume)\n \t\t\t\t afs_volume_trace_remove);\n \t\twrite_seqlock(&cell->volume_lock);\n \t\thlist_del_rcu(&volume->proc_link);\n-\t\trb_erase(&volume->cell_node, &cell->volumes);\n+\t\tif (!test_and_set_bit(AFS_VOLUME_RM_TREE, &volume->flags))\n+\t\t\trb_erase(&volume->cell_node, &cell->volumes);\n \t\twrite_sequnlock(&cell->volume_lock);\n \t}\n }\n@@ -231,6 +237,20 @@ static void afs_destroy_volume(struct afs_net *net, struct afs_volume *volume)\n \t_leave(\" [destroyed]\");\n }\n \n+/*\n+ * Try to get a reference on a volume record.\n+ */\n+bool afs_try_get_volume(struct afs_volume *volume, enum afs_volume_trace reason)\n+{\n+\tint r;\n+\n+\tif (__refcount_inc_not_zero(&volume->ref, &r)) {\n+\t\ttrace_afs_volume(volume->vid, r + 1, reason);\n+\t\treturn true;\n+\t}\n+\treturn false;\n+}\n+\n /*\n * Get a reference on a volume record.\n */\n", "files": ["fs/afs/internal.h", "fs/afs/volume.c"]}, "39299bdd2546688d92ed9db4948f6219ca1b9542": {"diff": "diff --git a/include/linux/key-type.h b/include/linux/key-type.h\nindex 7d985a1dfe4af9..5caf3ce823733a 100644\n--- a/include/linux/key-type.h\n+++ b/include/linux/key-type.h\n@@ -73,6 +73,7 @@ struct key_type {\n \n \tunsigned int flags;\n #define KEY_TYPE_NET_DOMAIN\t0x00000001 /* Keys of this type have a net namespace domain */\n+#define KEY_TYPE_INSTANT_REAP\t0x00000002 /* Keys of this type don't have a delay after expiring */\n \n \t/* vet a description */\n \tint (*vet_description)(const char *description);\ndiff --git a/net/dns_resolver/dns_key.c b/net/dns_resolver/dns_key.c\nindex 01e54b46ae0b97..2a6d363763a2bc 100644\n--- a/net/dns_resolver/dns_key.c\n+++ b/net/dns_resolver/dns_key.c\n@@ -91,6 +91,7 @@ const struct cred *dns_resolver_cache;\n static int\n dns_resolver_preparse(struct key_preparsed_payload *prep)\n {\n+\tconst struct dns_server_list_v1_header *v1;\n \tconst struct dns_payload_header *bin;\n \tstruct user_key_payload *upayload;\n \tunsigned long derrno;\n@@ -122,6 +123,13 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)\n \t\t\treturn -EINVAL;\n \t\t}\n \n+\t\tv1 = (const struct dns_server_list_v1_header *)bin;\n+\t\tif ((v1->status != DNS_LOOKUP_GOOD &&\n+\t\t v1->status != DNS_LOOKUP_GOOD_WITH_BAD)) {\n+\t\t\tif (prep->expiry == TIME64_MAX)\n+\t\t\t\tprep->expiry = ktime_get_real_seconds() + 1;\n+\t\t}\n+\n \t\tresult_len = datalen;\n \t\tgoto store_result;\n \t}\n@@ -314,7 +322,7 @@ static long dns_resolver_read(const struct key *key,\n \n struct key_type key_type_dns_resolver = {\n \t.name\t\t= \"dns_resolver\",\n-\t.flags\t\t= KEY_TYPE_NET_DOMAIN,\n+\t.flags\t\t= KEY_TYPE_NET_DOMAIN | KEY_TYPE_INSTANT_REAP,\n \t.preparse\t= dns_resolver_preparse,\n \t.free_preparse\t= dns_resolver_free_preparse,\n \t.instantiate\t= generic_key_instantiate,\ndiff --git a/security/keys/gc.c b/security/keys/gc.c\nindex 3c90807476eb0e..eaddaceda14eab 100644\n--- a/security/keys/gc.c\n+++ b/security/keys/gc.c\n@@ -66,6 +66,19 @@ void key_schedule_gc(time64_t gc_at)\n \t}\n }\n \n+/*\n+ * Set the expiration time on a key.\n+ */\n+void key_set_expiry(struct key *key, time64_t expiry)\n+{\n+\tkey->expiry = expiry;\n+\tif (expiry != TIME64_MAX) {\n+\t\tif (!(key->type->flags & KEY_TYPE_INSTANT_REAP))\n+\t\t\texpiry += key_gc_delay;\n+\t\tkey_schedule_gc(expiry);\n+\t}\n+}\n+\n /*\n * Schedule a dead links collection run.\n */\n@@ -176,7 +189,6 @@ static void key_garbage_collector(struct work_struct *work)\n \tstatic u8 gc_state;\t\t/* Internal persistent state */\n #define KEY_GC_REAP_AGAIN\t0x01\t/* - Need another cycle */\n #define KEY_GC_REAPING_LINKS\t0x02\t/* - We need to reap links */\n-#define KEY_GC_SET_TIMER\t0x04\t/* - We need to restart the timer */\n #define KEY_GC_REAPING_DEAD_1\t0x10\t/* - We need to mark dead keys */\n #define KEY_GC_REAPING_DEAD_2\t0x20\t/* - We need to reap dead key links */\n #define KEY_GC_REAPING_DEAD_3\t0x40\t/* - We need to reap dead keys */\n@@ -184,21 +196,17 @@ static void key_garbage_collector(struct work_struct *work)\n \n \tstruct rb_node *cursor;\n \tstruct key *key;\n-\ttime64_t new_timer, limit;\n+\ttime64_t new_timer, limit, expiry;\n \n \tkenter(\"[%lx,%x]\", key_gc_flags, gc_state);\n \n \tlimit = ktime_get_real_seconds();\n-\tif (limit > key_gc_delay)\n-\t\tlimit -= key_gc_delay;\n-\telse\n-\t\tlimit = key_gc_delay;\n \n \t/* Work out what we're going to be doing in this pass */\n \tgc_state &= KEY_GC_REAPING_DEAD_1 | KEY_GC_REAPING_DEAD_2;\n \tgc_state <<= 1;\n \tif (test_and_clear_bit(KEY_GC_KEY_EXPIRED, &key_gc_flags))\n-\t\tgc_state |= KEY_GC_REAPING_LINKS | KEY_GC_SET_TIMER;\n+\t\tgc_state |= KEY_GC_REAPING_LINKS;\n \n \tif (test_and_clear_bit(KEY_GC_REAP_KEYTYPE, &key_gc_flags))\n \t\tgc_state |= KEY_GC_REAPING_DEAD_1;\n@@ -233,8 +241,11 @@ static void key_garbage_collector(struct work_struct *work)\n \t\t\t}\n \t\t}\n \n-\t\tif (gc_state & KEY_GC_SET_TIMER) {\n-\t\t\tif (key->expiry > limit && key->expiry < new_timer) {\n+\t\texpiry = key->expiry;\n+\t\tif (expiry != TIME64_MAX) {\n+\t\t\tif (!(key->type->flags & KEY_TYPE_INSTANT_REAP))\n+\t\t\t\texpiry += key_gc_delay;\n+\t\t\tif (expiry > limit && expiry < new_timer) {\n \t\t\t\tkdebug(\"will expire %x in %lld\",\n \t\t\t\t key_serial(key), key->expiry - limit);\n \t\t\t\tnew_timer = key->expiry;\n@@ -276,7 +287,7 @@ static void key_garbage_collector(struct work_struct *work)\n \t */\n \tkdebug(\"pass complete\");\n \n-\tif (gc_state & KEY_GC_SET_TIMER && new_timer != (time64_t)TIME64_MAX) {\n+\tif (new_timer != TIME64_MAX) {\n \t\tnew_timer += key_gc_delay;\n \t\tkey_schedule_gc(new_timer);\n \t}\ndiff --git a/security/keys/internal.h b/security/keys/internal.h\nindex 471cf36dedc026..2cffa6dc82557b 100644\n--- a/security/keys/internal.h\n+++ b/security/keys/internal.h\n@@ -167,6 +167,7 @@ extern unsigned key_gc_delay;\n extern void keyring_gc(struct key *keyring, time64_t limit);\n extern void keyring_restriction_gc(struct key *keyring,\n \t\t\t\t struct key_type *dead_type);\n+void key_set_expiry(struct key *key, time64_t expiry);\n extern void key_schedule_gc(time64_t gc_at);\n extern void key_schedule_gc_links(void);\n extern void key_gc_keytype(struct key_type *ktype);\n@@ -215,10 +216,18 @@ extern struct key *key_get_instantiation_authkey(key_serial_t target_id);\n */\n static inline bool key_is_dead(const struct key *key, time64_t limit)\n {\n+\ttime64_t expiry = key->expiry;\n+\n+\tif (expiry != TIME64_MAX) {\n+\t\tif (!(key->type->flags & KEY_TYPE_INSTANT_REAP))\n+\t\t\texpiry += key_gc_delay;\n+\t\tif (expiry <= limit)\n+\t\t\treturn true;\n+\t}\n+\n \treturn\n \t\tkey->flags & ((1 << KEY_FLAG_DEAD) |\n \t\t\t (1 << KEY_FLAG_INVALIDATED)) ||\n-\t\t(key->expiry > 0 && key->expiry <= limit) ||\n \t\tkey->domain_tag->removed;\n }\n \ndiff --git a/security/keys/key.c b/security/keys/key.c\nindex 0260a1902922eb..5b10641debd549 100644\n--- a/security/keys/key.c\n+++ b/security/keys/key.c\n@@ -294,6 +294,7 @@ struct key *key_alloc(struct key_type *type, const char *desc,\n \tkey->uid = uid;\n \tkey->gid = gid;\n \tkey->perm = perm;\n+\tkey->expiry = TIME64_MAX;\n \tkey->restrict_link = restrict_link;\n \tkey->last_used_at = ktime_get_real_seconds();\n \n@@ -463,10 +464,7 @@ static int __key_instantiate_and_link(struct key *key,\n \t\t\tif (authkey)\n \t\t\t\tkey_invalidate(authkey);\n \n-\t\t\tif (prep->expiry != TIME64_MAX) {\n-\t\t\t\tkey->expiry = prep->expiry;\n-\t\t\t\tkey_schedule_gc(prep->expiry + key_gc_delay);\n-\t\t\t}\n+\t\t\tkey_set_expiry(key, prep->expiry);\n \t\t}\n \t}\n \n@@ -606,8 +604,7 @@ int key_reject_and_link(struct key *key,\n \t\tatomic_inc(&key->user->nikeys);\n \t\tmark_key_instantiated(key, -error);\n \t\tnotify_key(key, NOTIFY_KEY_INSTANTIATED, -error);\n-\t\tkey->expiry = ktime_get_real_seconds() + timeout;\n-\t\tkey_schedule_gc(key->expiry + key_gc_delay);\n+\t\tkey_set_expiry(key, ktime_get_real_seconds() + timeout);\n \n \t\tif (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))\n \t\t\tawaken = 1;\n@@ -723,16 +720,14 @@ struct key_type *key_type_lookup(const char *type)\n \n void key_set_timeout(struct key *key, unsigned timeout)\n {\n-\ttime64_t expiry = 0;\n+\ttime64_t expiry = TIME64_MAX;\n \n \t/* make the changes with the locks held to prevent races */\n \tdown_write(&key->sem);\n \n \tif (timeout > 0)\n \t\texpiry = ktime_get_real_seconds() + timeout;\n-\n-\tkey->expiry = expiry;\n-\tkey_schedule_gc(key->expiry + key_gc_delay);\n+\tkey_set_expiry(key, expiry);\n \n \tup_write(&key->sem);\n }\ndiff --git a/security/keys/proc.c b/security/keys/proc.c\nindex d0cde6685627f2..4f4e2c1824f18b 100644\n--- a/security/keys/proc.c\n+++ b/security/keys/proc.c\n@@ -198,7 +198,7 @@ static int proc_keys_show(struct seq_file *m, void *v)\n \n \t/* come up with a suitable timeout value */\n \texpiry = READ_ONCE(key->expiry);\n-\tif (expiry == 0) {\n+\tif (expiry == TIME64_MAX) {\n \t\tmemcpy(xbuf, \"perm\", 5);\n \t} else if (now >= expiry) {\n \t\tmemcpy(xbuf, \"expd\", 5);\n", "files": ["include/linux/key-type.h", "net/dns_resolver/dns_key.c", "security/keys/gc.c", "security/keys/internal.h", "security/keys/key.c", "security/keys/proc.c"]}, "513d88a88e0203188a38f4647dd08170aebd85df": {"diff": "diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c\nindex 1bf23611be1221..13a56783830df2 100644\n--- a/drivers/usb/serial/ftdi_sio.c\n+++ b/drivers/usb/serial/ftdi_sio.c\n@@ -1033,9 +1033,9 @@ static const struct usb_device_id id_table_combined[] = {\n \t{ USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) },\n \t{ USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) },\n \t{ USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) },\n-\t{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) },\n-\t{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) },\n-\t{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) },\n+\t{ USB_DEVICE(FTDI_VID, ACTISENSE_UID_PID) },\n+\t{ USB_DEVICE(FTDI_VID, ACTISENSE_USA_PID) },\n+\t{ USB_DEVICE(FTDI_VID, ACTISENSE_NGX_PID) },\n \t{ USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) },\n \t{ USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) },\n \t{ USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) },\ndiff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h\nindex e2099445db708f..21a2b5a25fc097 100644\n--- a/drivers/usb/serial/ftdi_sio_ids.h\n+++ b/drivers/usb/serial/ftdi_sio_ids.h\n@@ -1568,9 +1568,9 @@\n #define ACTISENSE_USG_PID\t\t0xD9A9 /* USG USB Serial Adapter */\n #define ACTISENSE_NGT_PID\t\t0xD9AA /* NGT NMEA2000 Interface */\n #define ACTISENSE_NGW_PID\t\t0xD9AB /* NGW NMEA2000 Gateway */\n-#define ACTISENSE_D9AC_PID\t\t0xD9AC /* Actisense Reserved */\n-#define ACTISENSE_D9AD_PID\t\t0xD9AD /* Actisense Reserved */\n-#define ACTISENSE_D9AE_PID\t\t0xD9AE /* Actisense Reserved */\n+#define ACTISENSE_UID_PID\t\t0xD9AC /* USB Isolating Device */\n+#define ACTISENSE_USA_PID\t\t0xD9AD /* USB to Serial Adapter */\n+#define ACTISENSE_NGX_PID\t\t0xD9AE /* NGX NMEA2000 Gateway */\n #define ACTISENSE_D9AF_PID\t\t0xD9AF /* Actisense Reserved */\n #define CHETCO_SEAGAUGE_PID\t\t0xA548 /* SeaGauge USB Adapter */\n #define CHETCO_SEASWITCH_PID\t\t0xA549 /* SeaSwitch USB Adapter */\n", "files": ["drivers/usb/serial/ftdi_sio.c", "drivers/usb/serial/ftdi_sio_ids.h"]}, "dade3f6a1e4e35a5ae916d5e78b3229ec34c78ec": {"diff": "diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h\nindex 1ba9f4ddf2f6db..9ba6413fd2e3ea 100644\n--- a/include/net/ip6_fib.h\n+++ b/include/net/ip6_fib.h\n@@ -179,9 +179,6 @@ struct fib6_info {\n \n \trefcount_t\t\t\tfib6_ref;\n \tunsigned long\t\t\texpires;\n-\n-\tstruct hlist_node\t\tgc_link;\n-\n \tstruct dst_metrics\t\t*fib6_metrics;\n #define fib6_pmtu\t\tfib6_metrics->metrics[RTAX_MTU-1]\n \n@@ -250,6 +247,19 @@ static inline bool fib6_requires_src(const struct fib6_info *rt)\n \treturn rt->fib6_src.plen > 0;\n }\n \n+static inline void fib6_clean_expires(struct fib6_info *f6i)\n+{\n+\tf6i->fib6_flags &= ~RTF_EXPIRES;\n+\tf6i->expires = 0;\n+}\n+\n+static inline void fib6_set_expires(struct fib6_info *f6i,\n+\t\t\t\t unsigned long expires)\n+{\n+\tf6i->expires = expires;\n+\tf6i->fib6_flags |= RTF_EXPIRES;\n+}\n+\n static inline bool fib6_check_expired(const struct fib6_info *f6i)\n {\n \tif (f6i->fib6_flags & RTF_EXPIRES)\n@@ -257,11 +267,6 @@ static inline bool fib6_check_expired(const struct fib6_info *f6i)\n \treturn false;\n }\n \n-static inline bool fib6_has_expires(const struct fib6_info *f6i)\n-{\n-\treturn f6i->fib6_flags & RTF_EXPIRES;\n-}\n-\n /* Function to safely get fn->fn_sernum for passed in rt\n * and store result in passed in cookie.\n * Return true if we can get cookie safely\n@@ -383,7 +388,6 @@ struct fib6_table {\n \tstruct inet_peer_base\ttb6_peers;\n \tunsigned int\t\tflags;\n \tunsigned int\t\tfib_seq;\n-\tstruct hlist_head tb6_gc_hlist;\t/* GC candidates */\n #define RT6_TABLE_HAS_DFLT_ROUTER\tBIT(0)\n };\n \n@@ -500,48 +504,6 @@ void fib6_gc_cleanup(void);\n \n int fib6_init(void);\n \n-/* fib6_info must be locked by the caller, and fib6_info->fib6_table can be\n- * NULL.\n- */\n-static inline void fib6_set_expires_locked(struct fib6_info *f6i,\n-\t\t\t\t\t unsigned long expires)\n-{\n-\tstruct fib6_table *tb6;\n-\n-\ttb6 = f6i->fib6_table;\n-\tf6i->expires = expires;\n-\tif (tb6 && !fib6_has_expires(f6i))\n-\t\thlist_add_head(&f6i->gc_link, &tb6->tb6_gc_hlist);\n-\tf6i->fib6_flags |= RTF_EXPIRES;\n-}\n-\n-/* fib6_info must be locked by the caller, and fib6_info->fib6_table can be\n- * NULL. If fib6_table is NULL, the fib6_info will no be inserted into the\n- * list of GC candidates until it is inserted into a table.\n- */\n-static inline void fib6_set_expires(struct fib6_info *f6i,\n-\t\t\t\t unsigned long expires)\n-{\n-\tspin_lock_bh(&f6i->fib6_table->tb6_lock);\n-\tfib6_set_expires_locked(f6i, expires);\n-\tspin_unlock_bh(&f6i->fib6_table->tb6_lock);\n-}\n-\n-static inline void fib6_clean_expires_locked(struct fib6_info *f6i)\n-{\n-\tif (fib6_has_expires(f6i))\n-\t\thlist_del_init(&f6i->gc_link);\n-\tf6i->fib6_flags &= ~RTF_EXPIRES;\n-\tf6i->expires = 0;\n-}\n-\n-static inline void fib6_clean_expires(struct fib6_info *f6i)\n-{\n-\tspin_lock_bh(&f6i->fib6_table->tb6_lock);\n-\tfib6_clean_expires_locked(f6i);\n-\tspin_unlock_bh(&f6i->fib6_table->tb6_lock);\n-}\n-\n struct ipv6_route_iter {\n \tstruct seq_net_private p;\n \tstruct fib6_walker w;\ndiff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c\nindex 7772f42ff2b940..4fc2cae0d116c5 100644\n--- a/net/ipv6/ip6_fib.c\n+++ b/net/ipv6/ip6_fib.c\n@@ -160,8 +160,6 @@ struct fib6_info *fib6_info_alloc(gfp_t gfp_flags, bool with_fib6_nh)\n \tINIT_LIST_HEAD(&f6i->fib6_siblings);\n \trefcount_set(&f6i->fib6_ref, 1);\n \n-\tINIT_HLIST_NODE(&f6i->gc_link);\n-\n \treturn f6i;\n }\n \n@@ -248,7 +246,6 @@ static struct fib6_table *fib6_alloc_table(struct net *net, u32 id)\n \t\t\t\t net->ipv6.fib6_null_entry);\n \t\ttable->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;\n \t\tinet_peer_base_init(&table->tb6_peers);\n-\t\tINIT_HLIST_HEAD(&table->tb6_gc_hlist);\n \t}\n \n \treturn table;\n@@ -1060,8 +1057,6 @@ static void fib6_purge_rt(struct fib6_info *rt, struct fib6_node *fn,\n \t\t\t\t lockdep_is_held(&table->tb6_lock));\n \t\t}\n \t}\n-\n-\tfib6_clean_expires_locked(rt);\n }\n \n /*\n@@ -1123,10 +1118,9 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,\n \t\t\t\tif (!(iter->fib6_flags & RTF_EXPIRES))\n \t\t\t\t\treturn -EEXIST;\n \t\t\t\tif (!(rt->fib6_flags & RTF_EXPIRES))\n-\t\t\t\t\tfib6_clean_expires_locked(iter);\n+\t\t\t\t\tfib6_clean_expires(iter);\n \t\t\t\telse\n-\t\t\t\t\tfib6_set_expires_locked(iter,\n-\t\t\t\t\t\t\t\trt->expires);\n+\t\t\t\t\tfib6_set_expires(iter, rt->expires);\n \n \t\t\t\tif (rt->fib6_pmtu)\n \t\t\t\t\tfib6_metric_set(iter, RTAX_MTU,\n@@ -1485,10 +1479,6 @@ int fib6_add(struct fib6_node *root, struct fib6_info *rt,\n \t\tif (rt->nh)\n \t\t\tlist_add(&rt->nh_list, &rt->nh->f6i_list);\n \t\t__fib6_update_sernum_upto_root(rt, fib6_new_sernum(info->nl_net));\n-\n-\t\tif (fib6_has_expires(rt))\n-\t\t\thlist_add_head(&rt->gc_link, &table->tb6_gc_hlist);\n-\n \t\tfib6_start_gc(info->nl_net, rt);\n \t}\n \n@@ -2291,8 +2281,9 @@ static void fib6_flush_trees(struct net *net)\n *\tGarbage collection\n */\n \n-static int fib6_age(struct fib6_info *rt, struct fib6_gc_args *gc_args)\n+static int fib6_age(struct fib6_info *rt, void *arg)\n {\n+\tstruct fib6_gc_args *gc_args = arg;\n \tunsigned long now = jiffies;\n \n \t/*\n@@ -2300,7 +2291,7 @@ static int fib6_age(struct fib6_info *rt, struct fib6_gc_args *gc_args)\n \t *\tRoutes are expired even if they are in use.\n \t */\n \n-\tif (fib6_has_expires(rt) && rt->expires) {\n+\tif (rt->fib6_flags & RTF_EXPIRES && rt->expires) {\n \t\tif (time_after(now, rt->expires)) {\n \t\t\tRT6_TRACE(\"expiring %p\\n\", rt);\n \t\t\treturn -1;\n@@ -2317,40 +2308,6 @@ static int fib6_age(struct fib6_info *rt, struct fib6_gc_args *gc_args)\n \treturn 0;\n }\n \n-static void fib6_gc_table(struct net *net,\n-\t\t\t struct fib6_table *tb6,\n-\t\t\t struct fib6_gc_args *gc_args)\n-{\n-\tstruct fib6_info *rt;\n-\tstruct hlist_node *n;\n-\tstruct nl_info info = {\n-\t\t.nl_net = net,\n-\t\t.skip_notify = false,\n-\t};\n-\n-\thlist_for_each_entry_safe(rt, n, &tb6->tb6_gc_hlist, gc_link)\n-\t\tif (fib6_age(rt, gc_args) == -1)\n-\t\t\tfib6_del(rt, &info);\n-}\n-\n-static void fib6_gc_all(struct net *net, struct fib6_gc_args *gc_args)\n-{\n-\tstruct fib6_table *table;\n-\tstruct hlist_head *head;\n-\tunsigned int h;\n-\n-\trcu_read_lock();\n-\tfor (h = 0; h < FIB6_TABLE_HASHSZ; h++) {\n-\t\thead = &net->ipv6.fib_table_hash[h];\n-\t\thlist_for_each_entry_rcu(table, head, tb6_hlist) {\n-\t\t\tspin_lock_bh(&table->tb6_lock);\n-\t\t\tfib6_gc_table(net, table, gc_args);\n-\t\t\tspin_unlock_bh(&table->tb6_lock);\n-\t\t}\n-\t}\n-\trcu_read_unlock();\n-}\n-\n void fib6_run_gc(unsigned long expires, struct net *net, bool force)\n {\n \tstruct fib6_gc_args gc_args;\n@@ -2366,7 +2323,7 @@ void fib6_run_gc(unsigned long expires, struct net *net, bool force)\n \t\t\t net->ipv6.sysctl.ip6_rt_gc_interval;\n \tgc_args.more = 0;\n \n-\tfib6_gc_all(net, &gc_args);\n+\tfib6_clean_all(net, fib6_age, &gc_args);\n \tnow = jiffies;\n \tnet->ipv6.ip6_rt_last_gc = now;\n \ndiff --git a/net/ipv6/route.c b/net/ipv6/route.c\nindex b132feae3393f3..ea1dec8448fce8 100644\n--- a/net/ipv6/route.c\n+++ b/net/ipv6/route.c\n@@ -3763,10 +3763,10 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,\n \t\trt->dst_nocount = true;\n \n \tif (cfg->fc_flags & RTF_EXPIRES)\n-\t\tfib6_set_expires_locked(rt, jiffies +\n-\t\t\t\t\tclock_t_to_jiffies(cfg->fc_expires));\n+\t\tfib6_set_expires(rt, jiffies +\n+\t\t\t\tclock_t_to_jiffies(cfg->fc_expires));\n \telse\n-\t\tfib6_clean_expires_locked(rt);\n+\t\tfib6_clean_expires(rt);\n \n \tif (cfg->fc_protocol == RTPROT_UNSPEC)\n \t\tcfg->fc_protocol = RTPROT_BOOT;\n", "files": ["include/net/ip6_fib.h", "net/ipv6/ip6_fib.c", "net/ipv6/route.c"]}, "7016ab873eaa68d1dfe1af50198c157e451c784b": {"diff": "diff --git a/ext/ripper/eventids2.c b/ext/ripper/eventids2.c\nindex ac5495585780e..439663f0fd159 100644\n--- a/ext/ripper/eventids2.c\n+++ b/ext/ripper/eventids2.c\n@@ -65,6 +65,8 @@ static ripper_scanner_ids_t ripper_scanner_ids;\n \n #include \"eventids2table.c\"\n \n+STATIC_ASSERT(eventids2_table_size, RIPPER_EVENTIDS2_TABLE_SIZE == sizeof(ripper_scanner_ids)/sizeof(ID));\n+\n void\n ripper_init_eventids2(void)\n {\ndiff --git a/ext/ripper/tools/generate.rb b/ext/ripper/tools/generate.rb\nindex bb64d2fe8b34f..c44b4ba3252ee 100644\n--- a/ext/ripper/tools/generate.rb\n+++ b/ext/ripper/tools/generate.rb\n@@ -136,6 +136,8 @@ def generate_eventids2_table(ids)\n buf << %Q[ rb_hash_aset(h, intern_sym(\"#{id}\"), INT2FIX(1));\\n]\n end\n buf << %Q[}\\n]\n+ buf << %Q[\\n]\n+ buf << %Q[#define RIPPER_EVENTIDS2_TABLE_SIZE #{ids.size}\\n]\n buf\n end\n \n", "files": ["ext/ripper/eventids2.c", "ext/ripper/tools/generate.rb"]}, "4374236e959c1e585611acfc7a2e3d2142265ab0": {"diff": "diff --git a/ruby_parser.c b/ruby_parser.c\nindex 68d45768be4c4..844dbbaa6a48c 100644\n--- a/ruby_parser.c\n+++ b/ruby_parser.c\n@@ -450,6 +450,12 @@ ruby_verbose2(void)\n return ruby_verbose;\n }\n \n+static int *\n+rb_errno_ptr2(void)\n+{\n+ return rb_errno_ptr();\n+}\n+\n static int\n type_p(VALUE obj, int t)\n {\n@@ -724,6 +730,7 @@ rb_parser_config_initialize(rb_parser_config_t *config)\n config->bug = rb_bug;\n config->fatal = rb_fatal;\n config->verbose = ruby_verbose2;\n+ config->errno_ptr = rb_errno_ptr2;\n \n config->make_backtrace = rb_make_backtrace;\n \ndiff --git a/rubyparser.h b/rubyparser.h\nindex 0add750038c54..e6a0a6bc8d521 100644\n--- a/rubyparser.h\n+++ b/rubyparser.h\n@@ -1352,6 +1352,7 @@ typedef struct rb_parser_config_struct {\n void (*bug)(const char *fmt, ...);\n void (*fatal)(const char *fmt, ...);\n VALUE (*verbose)(void);\n+ int *(*errno_ptr)(void);\n \n /* VM */\n VALUE (*make_backtrace)(void);\ndiff --git a/universal_parser.c b/universal_parser.c\nindex 8fc358b14a238..61acaf7e058f0 100644\n--- a/universal_parser.c\n+++ b/universal_parser.c\n@@ -331,6 +331,8 @@ struct rb_imemo_tmpbuf_struct {\n #define rb_fatal p->config->fatal\n #undef ruby_verbose\n #define ruby_verbose p->config->verbose()\n+#undef errno\n+#define errno (*p->config->errno_ptr())\n \n #define rb_make_backtrace p->config->make_backtrace\n \n", "files": ["ruby_parser.c", "rubyparser.h", "universal_parser.c"]}, "73fa3224975c42e1c4e2231212a64ac325054130": {"diff": "diff --git a/ruby_parser.c b/ruby_parser.c\nindex 17fc352bed220..68d45768be4c4 100644\n--- a/ruby_parser.c\n+++ b/ruby_parser.c\n@@ -566,6 +566,7 @@ rb_parser_config_initialize(rb_parser_config_t *config)\n config->ary_join = rb_ary_join;\n config->ary_reverse = rb_ary_reverse;\n config->ary_clear = rb_ary_clear;\n+ config->ary_modify = rb_ary_modify;\n config->array_len = rb_array_len;\n config->array_aref = RARRAY_AREF;\n \ndiff --git a/rubyparser.h b/rubyparser.h\nindex 47b3b9c10b44f..0add750038c54 100644\n--- a/rubyparser.h\n+++ b/rubyparser.h\n@@ -1167,6 +1167,7 @@ typedef struct rb_parser_config_struct {\n VALUE (*ary_join)(VALUE ary, VALUE sep);\n VALUE (*ary_reverse)(VALUE ary);\n VALUE (*ary_clear)(VALUE ary);\n+ void (*ary_modify)(VALUE ary);\n long (*array_len)(VALUE a);\n VALUE (*array_aref)(VALUE, long);\n \ndiff --git a/universal_parser.c b/universal_parser.c\nindex 14759ad56f143..8fc358b14a238 100644\n--- a/universal_parser.c\n+++ b/universal_parser.c\n@@ -147,6 +147,7 @@ struct rb_imemo_tmpbuf_struct {\n #define rb_ary_join p->config->ary_join\n #define rb_ary_reverse p->config->ary_reverse\n #define rb_ary_clear p->config->ary_clear\n+#define rb_ary_modify p->config->ary_modify\n #undef RARRAY_LEN\n #define RARRAY_LEN p->config->array_len\n #define RARRAY_AREF p->config->array_aref\n", "files": ["ruby_parser.c", "rubyparser.h", "universal_parser.c"]}, "2a4a84664a1972c48c4365c29e73be83f8004139": {"diff": "diff --git a/configure.ac b/configure.ac\nindex 9286946fc15f4..8e219b9a81800 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -462,7 +462,7 @@ AC_SUBST(CC_VERSION_MESSAGE, $cc_version_message)\n \n RUBY_UNIVERSAL_ARCH\n AS_IF([test \"$target_cpu\" != \"$host_cpu\" -a \"$GCC\" = yes -a \"${universal_binary:-no}\" = no], [\n- RUBY_DEFAULT_ARCH(\"$target_cpu\")\n+ RUBY_DEFAULT_ARCH($target_cpu)\n ])\n host_os=$target_os\n host_vendor=$target_vendor\ndiff --git a/tool/m4/ruby_default_arch.m4 b/tool/m4/ruby_default_arch.m4\nindex a0f7c6fe2f1ed..2f25ba81ee10c 100644\n--- a/tool/m4/ruby_default_arch.m4\n+++ b/tool/m4/ruby_default_arch.m4\n@@ -10,10 +10,12 @@ AS_CASE([$1:\"$host_cpu\"],\n [[i[3-6]86]:x86_64], [ARCH_FLAG=-m32],\n [ppc64:ppc*], [ARCH_FLAG=-m64],\n [ppc*:ppc64], [ARCH_FLAG=-m32],\n- AS_CASE([$build_os],\n- [darwin*], [ARCH_FLAG=\"-arch \"$1],\n- [ARCH_FLAG=-march=$1]\n- )\n+ [\n+ ARCH_FLAG=\n+ for flag in \"-arch \"$1 -march=$1; do\n+ _RUBY_TRY_CFLAGS([$]flag, [ARCH_FLAG=\"[$]flag\"])\n+ test x\"$ARCH_FLAG\" = x || break\n+ done]\n )\n-AC_MSG_RESULT([$ARCH_FLAG])\n+AC_MSG_RESULT([${ARCH_FLAG:-'(none)'}])\n ])dnl\ndiff --git a/tool/m4/ruby_try_cflags.m4 b/tool/m4/ruby_try_cflags.m4\nindex 672f4f8e51245..b74718fe5e1ce 100644\n--- a/tool/m4/ruby_try_cflags.m4\n+++ b/tool/m4/ruby_try_cflags.m4\n@@ -6,14 +6,19 @@ m4_version_prereq([2.70], [], [\n m4_defun([AC_LANG_PROGRAM(C)], m4_bpatsubst(m4_defn([AC_LANG_PROGRAM(C)]), [main ()], [main (void)]))\n ])dnl\n dnl\n-AC_DEFUN([RUBY_TRY_CFLAGS], [\n- AC_MSG_CHECKING([whether ]$1[ is accepted as CFLAGS])\n+AC_DEFUN([_RUBY_TRY_CFLAGS], [\n RUBY_WERROR_FLAG([\n CFLAGS=\"[$]CFLAGS $1\"\n AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$4]], [[$5]])],\n+\t[$2], [$3])\n+ ])dnl\n+])dnl\n+AC_DEFUN([RUBY_TRY_CFLAGS], [\n+ AC_MSG_CHECKING([whether ]$1[ is accepted as CFLAGS])dnl\n+ _RUBY_TRY_CFLAGS([$1],\n \t[$2\n \tAC_MSG_RESULT(yes)],\n \t[$3\n-\tAC_MSG_RESULT(no)])\n- ])\n+\tAC_MSG_RESULT(no)],\n+\t[$4], [$5])\n ])dnl\ndiff --git a/tool/m4/ruby_universal_arch.m4 b/tool/m4/ruby_universal_arch.m4\nindex 4cbea74c4e8ab..d3e0dd0b47750 100644\n--- a/tool/m4/ruby_universal_arch.m4\n+++ b/tool/m4/ruby_universal_arch.m4\n@@ -40,7 +40,7 @@ AS_IF([test ${target_archs+set}], [\n \t AS_IF([$CC $CFLAGS $ARCH_FLAG -o conftest conftest.c > /dev/null 2>&1], [\n \t\trm -fr conftest.*\n \t ], [test -z \"$ARCH_FLAG\"], [\n-\t\tRUBY_DEFAULT_ARCH(\"$target_archs\")\n+\t\tRUBY_DEFAULT_ARCH($target_archs)\n \t ])\n \t])\n \ttarget_cpu=${target_archs}\n", "files": ["configure.ac", "tool/m4/ruby_default_arch.m4", "tool/m4/ruby_try_cflags.m4", "tool/m4/ruby_universal_arch.m4"]}, "c027dcfde2bf40c45dfb0fe1b79f97b8827d89f3": {"diff": "diff --git a/ext/etc/.document b/ext/etc/.document\nindex 2b0d7eb5c9a99..9bbea23b9299f 100644\n--- a/ext/etc/.document\n+++ b/ext/etc/.document\n@@ -1 +1,2 @@\n etc.c\n+constdefs.h\ndiff --git a/ext/etc/mkconstants.rb b/ext/etc/mkconstants.rb\nindex a752d64519fca..c8ebb677675ef 100644\n--- a/ext/etc/mkconstants.rb\n+++ b/ext/etc/mkconstants.rb\n@@ -35,6 +35,12 @@ def c_str(str)\n \n opt.parse!\n \n+CONST_PREFIXES = {\n+ 'SC' => 'for Etc.sysconf; See <tt>man sysconf</tt>',\n+ 'CS' => 'for Etc.confstr; See <tt>man constr</tt>',\n+ 'PC' => 'for IO#pathconf; See <tt>man fpathconf</tt>',\n+}\n+\n h = {}\n COMMENTS = {}\n \n@@ -49,6 +55,13 @@ def c_str(str)\n next\n end\n h[name] = default_value\n+ if additional = CONST_PREFIXES[name[/\\A_([A-Z]+)_/, 1]]\n+ if comment&.match(/\\w\\z/)\n+ comment << \" \" << additional\n+ else\n+ (comment ||= String.new) << \" \" << additional.sub(/\\A\\w/) {$&.upcase}\n+ end\n+ end\n COMMENTS[name] = comment if comment\n }\n DEFS = h.to_a\n@@ -123,6 +136,9 @@ def each_name(pat)\n static void\n init_constants(VALUE mod)\n {\n+#if 0\n+ mod = rb_define_module(\"Etc\");\n+#endif\n <%= gen_const_defs %>\n }\n EOS\n", "files": ["ext/etc/.document", "ext/etc/mkconstants.rb"]}, "fbcdb8cf4fbbbea0111a9adeb9d0d2983c088b7c": {"diff": "diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts\nindex ceb99b65eefa..3d4f288f1293 100644\n--- a/src/compiler/checker.ts\n+++ b/src/compiler/checker.ts\n@@ -50764,7 +50764,7 @@ export function signatureHasLiteralTypes(s: Signature) {\n return !!(s.flags & SignatureFlags.HasLiteralTypes);\r\n }\r\n \r\n-function createBasicNodeBuilderModuleSpecifierResolutionHost(host: TypeCheckerHost): ModuleSpecifierResolutionHost & { getCommonSourceDirectory(): string; } {\r\n+function createBasicNodeBuilderModuleSpecifierResolutionHost(host: TypeCheckerHost): ModuleSpecifierResolutionHost {\r\n return {\r\n getCommonSourceDirectory: !!(host as Program).getCommonSourceDirectory ? () => (host as Program).getCommonSourceDirectory() : () => \"\",\r\n getCurrentDirectory: () => host.getCurrentDirectory(),\r\ndiff --git a/src/compiler/core.ts b/src/compiler/core.ts\nindex 21eae040ba92..9738920df752 100644\n--- a/src/compiler/core.ts\n+++ b/src/compiler/core.ts\n@@ -2400,9 +2400,13 @@ function levenshteinWithMax(s1: string, s2: string, max: number): number | undef\n }\r\n \r\n /** @internal */\r\n-export function endsWith(str: string, suffix: string): boolean {\r\n+export function endsWith(str: string, suffix: string, ignoreCase?: boolean): boolean {\r\n const expectedPos = str.length - suffix.length;\r\n- return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos;\r\n+ return expectedPos >= 0 && (\r\n+ ignoreCase\r\n+ ? equateStringsCaseInsensitive(str.slice(expectedPos), suffix)\r\n+ : str.indexOf(suffix, expectedPos) === expectedPos\r\n+ );\r\n }\r\n \r\n /** @internal */\r\n@@ -2579,8 +2583,10 @@ export function findBestPatternMatch<T>(values: readonly T[], getPattern: (value\n }\r\n \r\n /** @internal */\r\n-export function startsWith(str: string, prefix: string): boolean {\r\n- return str.lastIndexOf(prefix, 0) === 0;\r\n+export function startsWith(str: string, prefix: string, ignoreCase?: boolean): boolean {\r\n+ return ignoreCase\r\n+ ? equateStringsCaseInsensitive(str.slice(0, prefix.length), prefix)\r\n+ : str.lastIndexOf(prefix, 0) === 0;\r\n }\r\n \r\n /** @internal */\r\ndiff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts\nindex 9e8f97a248c7..3f17986359c3 100644\n--- a/src/compiler/emitter.ts\n+++ b/src/compiler/emitter.ts\n@@ -583,35 +583,50 @@ export function getOutputExtension(fileName: string, options: CompilerOptions):\n Extension.Js;\r\n }\r\n \r\n-function getOutputPathWithoutChangingExt(inputFileName: string, configFile: ParsedCommandLine, ignoreCase: boolean, outputDir: string | undefined, getCommonSourceDirectory?: () => string) {\r\n+function getOutputPathWithoutChangingExt(\r\n+ inputFileName: string,\r\n+ ignoreCase: boolean,\r\n+ outputDir: string | undefined,\r\n+ getCommonSourceDirectory: () => string,\r\n+): string {\r\n return outputDir ?\r\n resolvePath(\r\n outputDir,\r\n- getRelativePathFromDirectory(getCommonSourceDirectory ? getCommonSourceDirectory() : getCommonSourceDirectoryOfConfig(configFile, ignoreCase), inputFileName, ignoreCase),\r\n+ getRelativePathFromDirectory(getCommonSourceDirectory(), inputFileName, ignoreCase),\r\n ) :\r\n inputFileName;\r\n }\r\n \r\n /** @internal */\r\n-export function getOutputDeclarationFileName(inputFileName: string, configFile: ParsedCommandLine, ignoreCase: boolean, getCommonSourceDirectory?: () => string) {\r\n+export function getOutputDeclarationFileName(inputFileName: string, configFile: ParsedCommandLine, ignoreCase: boolean, getCommonSourceDirectory = () => getCommonSourceDirectoryOfConfig(configFile, ignoreCase)) {\r\n+ return getOutputDeclarationFileNameWorker(inputFileName, configFile.options, ignoreCase, getCommonSourceDirectory);\r\n+}\r\n+\r\n+/** @internal */\r\n+export function getOutputDeclarationFileNameWorker(inputFileName: string, options: CompilerOptions, ignoreCase: boolean, getCommonSourceDirectory: () => string) {\r\n return changeExtension(\r\n- getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.declarationDir || configFile.options.outDir, getCommonSourceDirectory),\r\n+ getOutputPathWithoutChangingExt(inputFileName, ignoreCase, options.declarationDir || options.outDir, getCommonSourceDirectory),\r\n getDeclarationEmitExtensionForPath(inputFileName),\r\n );\r\n }\r\n \r\n-function getOutputJSFileName(inputFileName: string, configFile: ParsedCommandLine, ignoreCase: boolean, getCommonSourceDirectory?: () => string) {\r\n+function getOutputJSFileName(inputFileName: string, configFile: ParsedCommandLine, ignoreCase: boolean, getCommonSourceDirectory = () => getCommonSourceDirectoryOfConfig(configFile, ignoreCase)) {\r\n if (configFile.options.emitDeclarationOnly) return undefined;\r\n const isJsonFile = fileExtensionIs(inputFileName, Extension.Json);\r\n- const outputFileName = changeExtension(\r\n- getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.outDir, getCommonSourceDirectory),\r\n- getOutputExtension(inputFileName, configFile.options),\r\n- );\r\n+ const outputFileName = getOutputJSFileNameWorker(inputFileName, configFile.options, ignoreCase, getCommonSourceDirectory);\r\n return !isJsonFile || comparePaths(inputFileName, outputFileName, Debug.checkDefined(configFile.options.configFilePath), ignoreCase) !== Comparison.EqualTo ?\r\n outputFileName :\r\n undefined;\r\n }\r\n \r\n+/** @internal */\r\n+export function getOutputJSFileNameWorker(inputFileName: string, options: CompilerOptions, ignoreCase: boolean, getCommonSourceDirectory: () => string): string {\r\n+ return changeExtension(\r\n+ getOutputPathWithoutChangingExt(inputFileName, ignoreCase, options.outDir, getCommonSourceDirectory),\r\n+ getOutputExtension(inputFileName, options),\r\n+ );\r\n+}\r\n+\r\n function createAddOutput() {\r\n let outputs: string[] | undefined;\r\n return { addOutput, getOutputs };\r\ndiff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts\nindex 67f821b09213..4f128f1e6aa1 100644\n--- a/src/compiler/moduleNameResolver.ts\n+++ b/src/compiler/moduleNameResolver.ts\n@@ -915,6 +915,11 @@ export function isPackageJsonInfo(entry: PackageJsonInfoCacheEntry | undefined):\n return !!(entry as PackageJsonInfo | undefined)?.contents;\r\n }\r\n \r\n+/** @internal */\r\n+export function isMissingPackageJsonInfo(entry: PackageJsonInfoCacheEntry | undefined): entry is MissingPackageJsonInfo {\r\n+ return !!entry && !(entry as PackageJsonInfo).contents;\r\n+}\r\n+\r\n export interface PackageJsonInfoCache {\r\n /** @internal */ getPackageJsonInfo(packageJsonPath: string): PackageJsonInfoCacheEntry | undefined;\r\n /** @internal */ setPackageJsonInfo(packageJsonPath: string, info: PackageJsonInfoCacheEntry): void;\r\ndiff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts\nindex 2dddc47d30c6..1da0c9e834be 100644\n--- a/src/compiler/moduleSpecifiers.ts\n+++ b/src/compiler/moduleSpecifiers.ts\n@@ -42,6 +42,8 @@ import {\n getModuleSpecifierEndingPreference,\r\n getNodeModulePathParts,\r\n getNormalizedAbsolutePath,\r\n+ getOutputDeclarationFileNameWorker,\r\n+ getOutputJSFileNameWorker,\r\n getOwnKeys,\r\n getPackageJsonTypesVersionsPaths,\r\n getPackageNameFromTypesPackageName,\r\n@@ -49,18 +51,21 @@ import {\n getRelativePathFromDirectory,\r\n getRelativePathToDirectoryOrUrl,\r\n getResolvePackageJsonExports,\r\n+ getResolvePackageJsonImports,\r\n getSourceFileOfModule,\r\n getSupportedExtensions,\r\n getTextOfIdentifierOrLiteral,\r\n hasJSFileExtension,\r\n hasTSFileExtension,\r\n hostGetCanonicalFileName,\r\n+ hostUsesCaseSensitiveFileNames,\r\n Identifier,\r\n isAmbientModule,\r\n isApplicableVersionedTypesKey,\r\n isDeclarationFileName,\r\n isExternalModuleAugmentation,\r\n isExternalModuleNameRelative,\r\n+ isMissingPackageJsonInfo,\r\n isModuleBlock,\r\n isModuleDeclaration,\r\n isNonGlobalAmbientModule,\r\n@@ -107,6 +112,7 @@ import {\n SymbolFlags,\r\n toPath,\r\n tryGetExtensionFromPath,\r\n+ tryParseJson,\r\n tryParsePatterns,\r\n TypeChecker,\r\n UserPreferences,\r\n@@ -485,7 +491,7 @@ function getLocalModuleSpecifier(moduleFileName: string, info: Info, compilerOpt\n const allowedEndings = getAllowedEndingsInPrefererredOrder(importMode);\r\n const relativePath = rootDirs && tryGetModuleNameFromRootDirs(rootDirs, moduleFileName, sourceDirectory, getCanonicalFileName, allowedEndings, compilerOptions) ||\r\n processEnding(ensurePathIsNonModuleName(getRelativePathFromDirectory(sourceDirectory, moduleFileName, getCanonicalFileName)), allowedEndings, compilerOptions);\r\n- if (!baseUrl && !paths || relativePreference === RelativePreference.Relative) {\r\n+ if (!baseUrl && !paths && !getResolvePackageJsonImports(compilerOptions) || relativePreference === RelativePreference.Relative) {\r\n return pathsOnly ? undefined : relativePath;\r\n }\r\n \r\n@@ -495,12 +501,14 @@ function getLocalModuleSpecifier(moduleFileName: string, info: Info, compilerOpt\n return pathsOnly ? undefined : relativePath;\r\n }\r\n \r\n- const fromPaths = paths && tryGetModuleNameFromPaths(relativeToBaseUrl, paths, allowedEndings, host, compilerOptions);\r\n+ const fromPackageJsonImports = pathsOnly ? undefined : tryGetModuleNameFromPackageJsonImports(moduleFileName, sourceDirectory, compilerOptions, host, importMode);\r\n+\r\n+ const fromPaths = pathsOnly || fromPackageJsonImports === undefined ? paths && tryGetModuleNameFromPaths(relativeToBaseUrl, paths, allowedEndings, host, compilerOptions) : undefined;\r\n if (pathsOnly) {\r\n return fromPaths;\r\n }\r\n \r\n- const maybeNonRelative = fromPaths === undefined && baseUrl !== undefined ? processEnding(relativeToBaseUrl, allowedEndings, compilerOptions) : fromPaths;\r\n+ const maybeNonRelative = fromPackageJsonImports ?? (fromPaths === undefined && baseUrl !== undefined ? processEnding(relativeToBaseUrl, allowedEndings, compilerOptions) : fromPaths);\r\n if (!maybeNonRelative) {\r\n return relativePath;\r\n }\r\n@@ -567,8 +575,8 @@ function getNearestAncestorDirectoryWithPackageJson(host: ModuleSpecifierResolut\n if (host.getNearestAncestorDirectoryWithPackageJson) {\r\n return host.getNearestAncestorDirectoryWithPackageJson(fileName);\r\n }\r\n- return !!forEachAncestorDirectory(fileName, directory => {\r\n- return host.fileExists(combinePaths(directory, \"package.json\")) ? true : undefined;\r\n+ return forEachAncestorDirectory(fileName, directory => {\r\n+ return host.fileExists(combinePaths(directory, \"package.json\")) ? directory : undefined;\r\n });\r\n }\r\n \r\n@@ -843,64 +851,79 @@ const enum MatchingMode {\n Pattern,\r\n }\r\n \r\n-function tryGetModuleNameFromExports(options: CompilerOptions, targetFilePath: string, packageDirectory: string, packageName: string, exports: unknown, conditions: string[], mode = MatchingMode.Exact): { moduleFileToTry: string; } | undefined {\r\n+function tryGetModuleNameFromExportsOrImports(options: CompilerOptions, host: ModuleSpecifierResolutionHost, targetFilePath: string, packageDirectory: string, packageName: string, exports: unknown, conditions: string[], mode: MatchingMode, isImports: boolean): { moduleFileToTry: string; } | undefined {\r\n if (typeof exports === \"string\") {\r\n+ const ignoreCase = !hostUsesCaseSensitiveFileNames(host);\r\n+ const getCommonSourceDirectory = () => host.getCommonSourceDirectory();\r\n+ const outputFile = isImports && getOutputJSFileNameWorker(targetFilePath, options, ignoreCase, getCommonSourceDirectory);\r\n+ const declarationFile = isImports && getOutputDeclarationFileNameWorker(targetFilePath, options, ignoreCase, getCommonSourceDirectory);\r\n+\r\n const pathOrPattern = getNormalizedAbsolutePath(combinePaths(packageDirectory, exports), /*currentDirectory*/ undefined);\r\n const extensionSwappedTarget = hasTSFileExtension(targetFilePath) ? removeFileExtension(targetFilePath) + tryGetJSExtensionForFile(targetFilePath, options) : undefined;\r\n+\r\n switch (mode) {\r\n case MatchingMode.Exact:\r\n- if (comparePaths(targetFilePath, pathOrPattern) === Comparison.EqualTo || (extensionSwappedTarget && comparePaths(extensionSwappedTarget, pathOrPattern) === Comparison.EqualTo)) {\r\n+ if (\r\n+ extensionSwappedTarget && comparePaths(extensionSwappedTarget, pathOrPattern, ignoreCase) === Comparison.EqualTo ||\r\n+ comparePaths(targetFilePath, pathOrPattern, ignoreCase) === Comparison.EqualTo ||\r\n+ outputFile && comparePaths(outputFile, pathOrPattern, ignoreCase) === Comparison.EqualTo ||\r\n+ declarationFile && comparePaths(declarationFile, pathOrPattern, ignoreCase) === Comparison.EqualTo\r\n+ ) {\r\n return { moduleFileToTry: packageName };\r\n }\r\n break;\r\n case MatchingMode.Directory:\r\n- if (containsPath(pathOrPattern, targetFilePath)) {\r\n+ if (extensionSwappedTarget && containsPath(pathOrPattern, extensionSwappedTarget, ignoreCase)) {\r\n+ const fragment = getRelativePathFromDirectory(pathOrPattern, extensionSwappedTarget, /*ignoreCase*/ false);\r\n+ return { moduleFileToTry: getNormalizedAbsolutePath(combinePaths(combinePaths(packageName, exports), fragment), /*currentDirectory*/ undefined) };\r\n+ }\r\n+ if (containsPath(pathOrPattern, targetFilePath, ignoreCase)) {\r\n const fragment = getRelativePathFromDirectory(pathOrPattern, targetFilePath, /*ignoreCase*/ false);\r\n return { moduleFileToTry: getNormalizedAbsolutePath(combinePaths(combinePaths(packageName, exports), fragment), /*currentDirectory*/ undefined) };\r\n }\r\n+ if (outputFile && containsPath(pathOrPattern, outputFile, ignoreCase)) {\r\n+ const fragment = getRelativePathFromDirectory(pathOrPattern, outputFile, /*ignoreCase*/ false);\r\n+ return { moduleFileToTry: combinePaths(packageName, fragment) };\r\n+ }\r\n+ if (declarationFile && containsPath(pathOrPattern, declarationFile, ignoreCase)) {\r\n+ const fragment = getRelativePathFromDirectory(pathOrPattern, declarationFile, /*ignoreCase*/ false);\r\n+ return { moduleFileToTry: combinePaths(packageName, fragment) };\r\n+ }\r\n break;\r\n case MatchingMode.Pattern:\r\n const starPos = pathOrPattern.indexOf(\"*\");\r\n const leadingSlice = pathOrPattern.slice(0, starPos);\r\n const trailingSlice = pathOrPattern.slice(starPos + 1);\r\n- if (startsWith(targetFilePath, leadingSlice) && endsWith(targetFilePath, trailingSlice)) {\r\n+ if (extensionSwappedTarget && startsWith(extensionSwappedTarget, leadingSlice, ignoreCase) && endsWith(extensionSwappedTarget, trailingSlice, ignoreCase)) {\r\n+ const starReplacement = extensionSwappedTarget.slice(leadingSlice.length, extensionSwappedTarget.length - trailingSlice.length);\r\n+ return { moduleFileToTry: replaceFirstStar(packageName, starReplacement) };\r\n+ }\r\n+ if (startsWith(targetFilePath, leadingSlice, ignoreCase) && endsWith(targetFilePath, trailingSlice, ignoreCase)) {\r\n const starReplacement = targetFilePath.slice(leadingSlice.length, targetFilePath.length - trailingSlice.length);\r\n return { moduleFileToTry: replaceFirstStar(packageName, starReplacement) };\r\n }\r\n- if (extensionSwappedTarget && startsWith(extensionSwappedTarget, leadingSlice) && endsWith(extensionSwappedTarget, trailingSlice)) {\r\n- const starReplacement = extensionSwappedTarget.slice(leadingSlice.length, extensionSwappedTarget.length - trailingSlice.length);\r\n+ if (outputFile && startsWith(outputFile, leadingSlice, ignoreCase) && endsWith(outputFile, trailingSlice, ignoreCase)) {\r\n+ const starReplacement = outputFile.slice(leadingSlice.length, outputFile.length - trailingSlice.length);\r\n+ return { moduleFileToTry: replaceFirstStar(packageName, starReplacement) };\r\n+ }\r\n+ if (declarationFile && startsWith(declarationFile, leadingSlice, ignoreCase) && endsWith(declarationFile, trailingSlice, ignoreCase)) {\r\n+ const starReplacement = declarationFile.slice(leadingSlice.length, declarationFile.length - trailingSlice.length);\r\n return { moduleFileToTry: replaceFirstStar(packageName, starReplacement) };\r\n }\r\n break;\r\n }\r\n }\r\n else if (Array.isArray(exports)) {\r\n- return forEach(exports, e => tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, packageName, e, conditions));\r\n+ return forEach(exports, e => tryGetModuleNameFromExportsOrImports(options, host, targetFilePath, packageDirectory, packageName, e, conditions, mode, isImports));\r\n }\r\n else if (typeof exports === \"object\" && exports !== null) { // eslint-disable-line no-null/no-null\r\n- if (allKeysStartWithDot(exports as MapLike<unknown>)) {\r\n- // sub-mappings\r\n- // 3 cases:\r\n- // * directory mappings (legacyish, key ends with / (technically allows index/extension resolution under cjs mode))\r\n- // * pattern mappings (contains a *)\r\n- // * exact mappings (no *, does not end with /)\r\n- return forEach(getOwnKeys(exports as MapLike<unknown>), k => {\r\n- const subPackageName = getNormalizedAbsolutePath(combinePaths(packageName, k), /*currentDirectory*/ undefined);\r\n- const mode = endsWith(k, \"/\") ? MatchingMode.Directory\r\n- : k.includes(\"*\") ? MatchingMode.Pattern\r\n- : MatchingMode.Exact;\r\n- return tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, subPackageName, (exports as MapLike<unknown>)[k], conditions, mode);\r\n- });\r\n- }\r\n- else {\r\n- // conditional mapping\r\n- for (const key of getOwnKeys(exports as MapLike<unknown>)) {\r\n- if (key === \"default\" || conditions.includes(key) || isApplicableVersionedTypesKey(conditions, key)) {\r\n- const subTarget = (exports as MapLike<unknown>)[key];\r\n- const result = tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, packageName, subTarget, conditions, mode);\r\n- if (result) {\r\n- return result;\r\n- }\r\n+ // conditional mapping\r\n+ for (const key of getOwnKeys(exports as MapLike<unknown>)) {\r\n+ if (key === \"default\" || conditions.indexOf(key) >= 0 || isApplicableVersionedTypesKey(conditions, key)) {\r\n+ const subTarget = (exports as MapLike<unknown>)[key];\r\n+ const result = tryGetModuleNameFromExportsOrImports(options, host, targetFilePath, packageDirectory, packageName, subTarget, conditions, mode, isImports);\r\n+ if (result) {\r\n+ return result;\r\n }\r\n }\r\n }\r\n@@ -908,6 +931,53 @@ function tryGetModuleNameFromExports(options: CompilerOptions, targetFilePath: s\n return undefined;\r\n }\r\n \r\n+function tryGetModuleNameFromExports(options: CompilerOptions, host: ModuleSpecifierResolutionHost, targetFilePath: string, packageDirectory: string, packageName: string, exports: unknown, conditions: string[]): { moduleFileToTry: string; } | undefined {\r\n+ if (typeof exports === \"object\" && exports !== null && !Array.isArray(exports) && allKeysStartWithDot(exports as MapLike<unknown>)) { // eslint-disable-line no-null/no-null\r\n+ // sub-mappings\r\n+ // 3 cases:\r\n+ // * directory mappings (legacyish, key ends with / (technically allows index/extension resolution under cjs mode))\r\n+ // * pattern mappings (contains a *)\r\n+ // * exact mappings (no *, does not end with /)\r\n+ return forEach(getOwnKeys(exports as MapLike<unknown>), k => {\r\n+ const subPackageName = getNormalizedAbsolutePath(combinePaths(packageName, k), /*currentDirectory*/ undefined);\r\n+ const mode = endsWith(k, \"/\") ? MatchingMode.Directory\r\n+ : k.includes(\"*\") ? MatchingMode.Pattern\r\n+ : MatchingMode.Exact;\r\n+ return tryGetModuleNameFromExportsOrImports(options, host, targetFilePath, packageDirectory, subPackageName, (exports as MapLike<unknown>)[k], conditions, mode, /*isImports*/ false);\r\n+ });\r\n+ }\r\n+ return tryGetModuleNameFromExportsOrImports(options, host, targetFilePath, packageDirectory, packageName, exports, conditions, MatchingMode.Exact, /*isImports*/ false);\r\n+}\r\n+\r\n+function tryGetModuleNameFromPackageJsonImports(moduleFileName: string, sourceDirectory: string, options: CompilerOptions, host: ModuleSpecifierResolutionHost, importMode: ResolutionMode) {\r\n+ if (!host.readFile || !getResolvePackageJsonImports(options)) {\r\n+ return undefined;\r\n+ }\r\n+\r\n+ const ancestorDirectoryWithPackageJson = getNearestAncestorDirectoryWithPackageJson(host, sourceDirectory);\r\n+ if (!ancestorDirectoryWithPackageJson) {\r\n+ return undefined;\r\n+ }\r\n+ const packageJsonPath = combinePaths(ancestorDirectoryWithPackageJson, \"package.json\");\r\n+ const cachedPackageJson = host.getPackageJsonInfoCache?.()?.getPackageJsonInfo(packageJsonPath);\r\n+ if (isMissingPackageJsonInfo(cachedPackageJson) || !host.fileExists(packageJsonPath)) {\r\n+ return undefined;\r\n+ }\r\n+ const packageJsonContent = cachedPackageJson?.contents.packageJsonContent || tryParseJson(host.readFile(packageJsonPath)!);\r\n+ const imports = packageJsonContent?.imports;\r\n+ if (!imports) {\r\n+ return undefined;\r\n+ }\r\n+ const conditions = getConditions(options, importMode);\r\n+ return forEach(getOwnKeys(imports as MapLike<unknown>), k => {\r\n+ if (!startsWith(k, \"#\") || k === \"#\" || startsWith(k, \"#/\")) return undefined;\r\n+ const mode = endsWith(k, \"/\") ? MatchingMode.Directory\r\n+ : k.includes(\"*\") ? MatchingMode.Pattern\r\n+ : MatchingMode.Exact;\r\n+ return tryGetModuleNameFromExportsOrImports(options, host, moduleFileName, ancestorDirectoryWithPackageJson, k, (imports as MapLike<unknown>)[k], conditions, mode, /*isImports*/ true);\r\n+ })?.moduleFileToTry;\r\n+}\r\n+\r\n function tryGetModuleNameFromRootDirs(rootDirs: readonly string[], moduleFileName: string, sourceDirectory: string, getCanonicalFileName: (file: string) => string, allowedEndings: readonly ModuleSpecifierEnding[], compilerOptions: CompilerOptions): string | undefined {\r\n const normalizedTargetPaths = getPathsRelativeToRootDirs(moduleFileName, rootDirs, getCanonicalFileName);\r\n if (normalizedTargetPaths === undefined) {\r\n@@ -995,7 +1065,7 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }: ModulePath, { getCan\n let maybeBlockedByTypesVersions = false;\r\n const cachedPackageJson = host.getPackageJsonInfoCache?.()?.getPackageJsonInfo(packageJsonPath);\r\n if (isPackageJsonInfo(cachedPackageJson) || cachedPackageJson === undefined && host.fileExists(packageJsonPath)) {\r\n- const packageJsonContent = cachedPackageJson?.contents.packageJsonContent || JSON.parse(host.readFile!(packageJsonPath)!);\r\n+ const packageJsonContent: Record<string, any> | undefined = cachedPackageJson?.contents.packageJsonContent || tryParseJson(host.readFile!(packageJsonPath)!);\r\n const importMode = overrideMode || importingSourceFile.impliedNodeFormat;\r\n if (getResolvePackageJsonExports(options)) {\r\n // The package name that we found in node_modules could be different from the package\r\n@@ -1004,20 +1074,17 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }: ModulePath, { getCan\n const nodeModulesDirectoryName = packageRootPath.substring(parts.topLevelPackageNameIndex + 1);\r\n const packageName = getPackageNameFromTypesPackageName(nodeModulesDirectoryName);\r\n const conditions = getConditions(options, importMode);\r\n- const fromExports = packageJsonContent.exports\r\n- ? tryGetModuleNameFromExports(options, path, packageRootPath, packageName, packageJsonContent.exports, conditions)\r\n+ const fromExports = packageJsonContent?.exports\r\n+ ? tryGetModuleNameFromExports(options, host, path, packageRootPath, packageName, packageJsonContent.exports, conditions)\r\n : undefined;\r\n if (fromExports) {\r\n- const withJsExtension = !hasTSFileExtension(fromExports.moduleFileToTry)\r\n- ? fromExports\r\n- : { moduleFileToTry: removeFileExtension(fromExports.moduleFileToTry) + tryGetJSExtensionForFile(fromExports.moduleFileToTry, options) };\r\n- return { ...withJsExtension, verbatimFromExports: true };\r\n+ return { ...fromExports, verbatimFromExports: true };\r\n }\r\n- if (packageJsonContent.exports) {\r\n+ if (packageJsonContent?.exports) {\r\n return { moduleFileToTry: path, blockedByExports: true };\r\n }\r\n }\r\n- const versionPaths = packageJsonContent.typesVersions\r\n+ const versionPaths = packageJsonContent?.typesVersions\r\n ? getPackageJsonTypesVersionsPaths(packageJsonContent.typesVersions)\r\n : undefined;\r\n if (versionPaths) {\r\n@@ -1037,7 +1104,7 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }: ModulePath, { getCan\n }\r\n }\r\n // If the file is the main module, it can be imported by the package name\r\n- const mainFileRelative = packageJsonContent.typings || packageJsonContent.types || packageJsonContent.main || \"index.js\";\r\n+ const mainFileRelative = packageJsonContent?.typings || packageJsonContent?.types || packageJsonContent?.main || \"index.js\";\r\n if (isString(mainFileRelative) && !(maybeBlockedByTypesVersions && matchPatternOrExact(tryParsePatterns(versionPaths!.paths), mainFileRelative))) {\r\n // The 'main' file is also subject to mapping through typesVersions, and we couldn't come up with a path\r\n // explicitly through typesVersions, so if it matches a key in typesVersions now, it's not reachable.\r\n@@ -1052,7 +1119,7 @@ function tryGetModuleNameAsNodeModule({ path, isRedirect }: ModulePath, { getCan\n return { packageRootPath, moduleFileToTry };\r\n }\r\n else if (\r\n- packageJsonContent.type !== \"module\" &&\r\n+ packageJsonContent?.type !== \"module\" &&\r\n !fileExtensionIsOneOf(canonicalModuleFileToTry, extensionsNotSupportingExtensionlessResolution) &&\r\n startsWith(canonicalModuleFileToTry, mainExportFile) &&\r\n getDirectoryPath(canonicalModuleFileToTry) === removeTrailingDirectorySeparator(mainExportFile) &&\r\ndiff --git a/src/compiler/types.ts b/src/compiler/types.ts\nindex b8aab9a8563c..e56bba5ab485 100644\n--- a/src/compiler/types.ts\n+++ b/src/compiler/types.ts\n@@ -9690,6 +9690,7 @@ export interface ModuleSpecifierResolutionHost {\n getProjectReferenceRedirect(fileName: string): string | undefined;\r\n isSourceOfProjectReferenceRedirect(fileName: string): boolean;\r\n getFileIncludeReasons(): MultiMap<Path, FileIncludeReason>;\r\n+ getCommonSourceDirectory(): string;\r\n }\r\n \r\n /** @internal */\r\ndiff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts\nindex 347be386b6b3..398b7f1e6130 100644\n--- a/src/compiler/utilities.ts\n+++ b/src/compiler/utilities.ts\n@@ -7484,6 +7484,16 @@ export function readJson(path: string, host: { readFile(fileName: string): strin\n return readJsonOrUndefined(path, host) || {};\r\n }\r\n \r\n+/** @internal */\r\n+export function tryParseJson(text: string) {\r\n+ try {\r\n+ return JSON.parse(text);\r\n+ }\r\n+ catch {\r\n+ return undefined;\r\n+ }\r\n+}\r\n+\r\n /** @internal */\r\n export function directoryProbablyExists(directoryName: string, host: { directoryExists?: (directoryName: string) => boolean; }): boolean {\r\n // if host does not support 'directoryExists' assume that directory will exist\r\ndiff --git a/src/services/utilities.ts b/src/services/utilities.ts\nindex bb505008bedb..2f065b1a39cf 100644\n--- a/src/services/utilities.ts\n+++ b/src/services/utilities.ts\n@@ -362,6 +362,7 @@ import {\n tokenToString,\r\n toPath,\r\n tryCast,\r\n+ tryParseJson,\r\n Type,\r\n TypeChecker,\r\n TypeFlags,\r\n@@ -2473,6 +2474,7 @@ export function createModuleSpecifierResolutionHost(program: Program, host: Lang\n isSourceOfProjectReferenceRedirect: fileName => program.isSourceOfProjectReferenceRedirect(fileName),\r\n getNearestAncestorDirectoryWithPackageJson: maybeBind(host, host.getNearestAncestorDirectoryWithPackageJson),\r\n getFileIncludeReasons: () => program.getFileIncludeReasons(),\r\n+ getCommonSourceDirectory: () => program.getCommonSourceDirectory(),\r\n };\r\n }\r\n \r\n@@ -3895,15 +3897,6 @@ export function createPackageJsonImportFilter(fromFile: SourceFile, preferences:\n }\r\n }\r\n \r\n-function tryParseJson(text: string) {\r\n- try {\r\n- return JSON.parse(text);\r\n- }\r\n- catch {\r\n- return undefined;\r\n- }\r\n-}\r\n-\r\n /** @internal */\r\n export function consumesNodeCoreModules(sourceFile: SourceFile): boolean {\r\n return some(sourceFile.imports, ({ text }) => JsTyping.nodeCoreModules.has(text));\r\ndiff --git a/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap1.js b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap1.js\nnew file mode 100644\nindex 000000000000..28bbf58340b7\n--- /dev/null\n+++ b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap1.js\n@@ -0,0 +1,357 @@\n+currentDirectory:: / useCaseSensitiveFileNames: false\n+Info seq [hh:mm:ss:mss] Provided types map file \"/typesMap.json\" doesn't exist\n+//// [/lib.d.ts]\r\n+lib.d.ts-Text\r\n+\r\n+//// [/lib.decorators.d.ts]\r\n+lib.decorators.d.ts-Text\r\n+\r\n+//// [/lib.decorators.legacy.d.ts]\r\n+lib.decorators.legacy.d.ts-Text\r\n+\r\n+//// [/package.json]\r\n+{\n+ \"type\": \"module\",\n+ \"imports\": {\n+ \"#is-browser\": {\n+ \"browser\": \"./dist/env/browser.js\",\n+ \"default\": \"./dist/env/node.js\"\n+ }\n+ }\n+}\r\n+\r\n+//// [/src/a.ts]\r\n+isBrowser\r\n+\r\n+//// [/src/env/browser.ts]\r\n+export const isBrowser = true;\r\n+\r\n+//// [/src/env/node.ts]\r\n+export const isBrowser = false;\r\n+\r\n+//// [/tsconfig.json]\r\n+{\n+ \"compilerOptions\": {\n+ \"module\": \"nodenext\",\n+ \"rootDir\": \"src\",\n+ \"outDir\": \"dist\"\n+ }\n+}\r\n+\r\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/tsconfig.json\"\n+ },\n+ \"command\": \"open\"\n+ }\n+Info seq [hh:mm:ss:mss] Search path: /\n+Info seq [hh:mm:ss:mss] For info: /tsconfig.json :: Config file name: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Creating configuration project /tsconfig.json\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /tsconfig.json 2000 undefined Project: /tsconfig.json WatchType: Config file\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingStart\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\",\n+ \"reason\": \"Creating possible configured project for /tsconfig.json to open\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Config: /tsconfig.json : {\n+ \"rootNames\": [\n+ \"/lib.d.ts\",\n+ \"/lib.decorators.d.ts\",\n+ \"/lib.decorators.legacy.d.ts\",\n+ \"/src/a.ts\",\n+ \"/src/env/browser.ts\",\n+ \"/src/env/node.ts\"\n+ ],\n+ \"options\": {\n+ \"module\": 199,\n+ \"rootDir\": \"/src\",\n+ \"outDir\": \"/dist\",\n+ \"configFilePath\": \"/tsconfig.json\"\n+ }\n+}\n+Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.legacy.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/a.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/env/browser.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/env/node.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /tsconfig.json Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (6)\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/src/a.ts Text-1 \"isBrowser\"\n+\t/src/env/browser.ts Text-1 \"export const isBrowser = true;\"\n+\t/src/env/node.ts Text-1 \"export const isBrowser = false;\"\n+\n+\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.d.ts\n+\t Matched by default include pattern '**/*'\n+\tsrc/a.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\tsrc/env/browser.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\tsrc/env/node.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingFinish\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"configFileDiag\",\n+ \"body\": {\n+ \"triggerFile\": \"/tsconfig.json\",\n+ \"configFile\": \"/tsconfig.json\",\n+ \"diagnostics\": []\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /dev/null/inferredProject1*\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/tsconfig.json SVC-1-0 \"{\\n \\\"compilerOptions\\\": {\\n \\\"module\\\": \\\"nodenext\\\",\\n \\\"rootDir\\\": \\\"src\\\",\\n \\\"outDir\\\": \\\"dist\\\"\\n }\\n}\"\n+\n+\n+\tlib.d.ts\n+\t Default library for target 'es5'\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\ttsconfig.json\n+\t Root file specified for compilation\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /package.json 250 undefined WatchType: package.json file\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (6)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Open files: \n+Info seq [hh:mm:ss:mss] \tFileName: /tsconfig.json ProjectRootPath: undefined\n+Info seq [hh:mm:ss:mss] \t\tProjects: /dev/null/inferredProject1*\n+After Request\n+watchedFiles::\n+/lib.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.legacy.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/package.json: *new*\n+ {\"pollingInterval\":250}\n+/src/a.ts: *new*\n+ {\"pollingInterval\":500}\n+/src/env/browser.ts: *new*\n+ {\"pollingInterval\":500}\n+/src/env/node.ts: *new*\n+ {\"pollingInterval\":500}\n+/tsconfig.json: *new*\n+ {\"pollingInterval\":2000}\n+\n+watchedDirectoriesRecursive::\n+: *new*\n+ {}\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 1,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"preferences\": {\n+ \"includeCompletionsForModuleExports\": true,\n+ \"includeCompletionsWithInsertText\": true\n+ }\n+ },\n+ \"command\": \"configure\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"configure\",\n+ \"request_seq\": 1,\n+ \"success\": true\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 2,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"syntacticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"syntacticDiagnosticsSync\",\n+ \"request_seq\": 2,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 3,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"semanticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"semanticDiagnosticsSync\",\n+ \"request_seq\": 3,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"message\": \"Cannot find name 'isBrowser'.\",\n+ \"start\": 0,\n+ \"length\": 9,\n+ \"category\": \"error\",\n+ \"code\": 2304,\n+ \"startLocation\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"endLocation\": {\n+ \"line\": 1,\n+ \"offset\": 10\n+ }\n+ }\n+ ]\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 4,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"suggestionDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"suggestionDiagnosticsSync\",\n+ \"request_seq\": 4,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 5,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"startLine\": 1,\n+ \"startOffset\": 1,\n+ \"endLine\": 1,\n+ \"endOffset\": 10,\n+ \"errorCodes\": [\n+ 2304\n+ ]\n+ },\n+ \"command\": \"getCodeFixes\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"getCodeFixes\",\n+ \"request_seq\": 5,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"fixName\": \"import\",\n+ \"description\": \"Add import from \\\"./env/browser.js\\\"\",\n+ \"changes\": [\n+ {\n+ \"fileName\": \"/src/a.ts\",\n+ \"textChanges\": [\n+ {\n+ \"start\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"end\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"newText\": \"import { isBrowser } from \\\"./env/browser.js\\\";\\r\\n\\r\\n\"\n+ }\n+ ]\n+ }\n+ ]\n+ },\n+ {\n+ \"fixName\": \"import\",\n+ \"description\": \"Add import from \\\"#is-browser\\\"\",\n+ \"changes\": [\n+ {\n+ \"fileName\": \"/src/a.ts\",\n+ \"textChanges\": [\n+ {\n+ \"start\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"end\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"newText\": \"import { isBrowser } from \\\"#is-browser\\\";\\r\\n\\r\\n\"\n+ }\n+ ]\n+ }\n+ ]\n+ }\n+ ]\n+ }\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap2.js b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap2.js\nnew file mode 100644\nindex 000000000000..0faa37e2e094\n--- /dev/null\n+++ b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap2.js\n@@ -0,0 +1,321 @@\n+currentDirectory:: / useCaseSensitiveFileNames: false\n+Info seq [hh:mm:ss:mss] Provided types map file \"/typesMap.json\" doesn't exist\n+//// [/lib.d.ts]\r\n+lib.d.ts-Text\r\n+\r\n+//// [/lib.decorators.d.ts]\r\n+lib.decorators.d.ts-Text\r\n+\r\n+//// [/lib.decorators.legacy.d.ts]\r\n+lib.decorators.legacy.d.ts-Text\r\n+\r\n+//// [/package.json]\r\n+{\n+ \"type\": \"module\",\n+ \"imports\": {\n+ \"#internal/*\": \"./dist/internal/*\"\n+ }\n+}\r\n+\r\n+//// [/src/a.ts]\r\n+something\r\n+\r\n+//// [/src/internal/foo.ts]\r\n+export function something(name: string) {}\r\n+\r\n+//// [/tsconfig.json]\r\n+{\n+ \"compilerOptions\": {\n+ \"module\": \"nodenext\",\n+ \"rootDir\": \"src\",\n+ \"outDir\": \"dist\"\n+ }\n+}\r\n+\r\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/tsconfig.json\"\n+ },\n+ \"command\": \"open\"\n+ }\n+Info seq [hh:mm:ss:mss] Search path: /\n+Info seq [hh:mm:ss:mss] For info: /tsconfig.json :: Config file name: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Creating configuration project /tsconfig.json\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /tsconfig.json 2000 undefined Project: /tsconfig.json WatchType: Config file\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingStart\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\",\n+ \"reason\": \"Creating possible configured project for /tsconfig.json to open\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Config: /tsconfig.json : {\n+ \"rootNames\": [\n+ \"/lib.d.ts\",\n+ \"/lib.decorators.d.ts\",\n+ \"/lib.decorators.legacy.d.ts\",\n+ \"/src/a.ts\",\n+ \"/src/internal/foo.ts\"\n+ ],\n+ \"options\": {\n+ \"module\": 199,\n+ \"rootDir\": \"/src\",\n+ \"outDir\": \"/dist\",\n+ \"configFilePath\": \"/tsconfig.json\"\n+ }\n+}\n+Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.legacy.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/a.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/internal/foo.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /tsconfig.json Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/src/a.ts Text-1 \"something\"\n+\t/src/internal/foo.ts Text-1 \"export function something(name: string) {}\"\n+\n+\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.d.ts\n+\t Matched by default include pattern '**/*'\n+\tsrc/a.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\tsrc/internal/foo.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingFinish\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"configFileDiag\",\n+ \"body\": {\n+ \"triggerFile\": \"/tsconfig.json\",\n+ \"configFile\": \"/tsconfig.json\",\n+ \"diagnostics\": []\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /dev/null/inferredProject1*\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/tsconfig.json SVC-1-0 \"{\\n \\\"compilerOptions\\\": {\\n \\\"module\\\": \\\"nodenext\\\",\\n \\\"rootDir\\\": \\\"src\\\",\\n \\\"outDir\\\": \\\"dist\\\"\\n }\\n}\"\n+\n+\n+\tlib.d.ts\n+\t Default library for target 'es5'\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\ttsconfig.json\n+\t Root file specified for compilation\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /package.json 250 undefined WatchType: package.json file\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Open files: \n+Info seq [hh:mm:ss:mss] \tFileName: /tsconfig.json ProjectRootPath: undefined\n+Info seq [hh:mm:ss:mss] \t\tProjects: /dev/null/inferredProject1*\n+After Request\n+watchedFiles::\n+/lib.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.legacy.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/package.json: *new*\n+ {\"pollingInterval\":250}\n+/src/a.ts: *new*\n+ {\"pollingInterval\":500}\n+/src/internal/foo.ts: *new*\n+ {\"pollingInterval\":500}\n+/tsconfig.json: *new*\n+ {\"pollingInterval\":2000}\n+\n+watchedDirectoriesRecursive::\n+: *new*\n+ {}\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 1,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"preferences\": {\n+ \"includeCompletionsForModuleExports\": true,\n+ \"includeCompletionsWithInsertText\": true\n+ }\n+ },\n+ \"command\": \"configure\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"configure\",\n+ \"request_seq\": 1,\n+ \"success\": true\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 2,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"syntacticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"syntacticDiagnosticsSync\",\n+ \"request_seq\": 2,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 3,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"semanticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"semanticDiagnosticsSync\",\n+ \"request_seq\": 3,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"message\": \"Cannot find name 'something'.\",\n+ \"start\": 0,\n+ \"length\": 9,\n+ \"category\": \"error\",\n+ \"code\": 2304,\n+ \"startLocation\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"endLocation\": {\n+ \"line\": 1,\n+ \"offset\": 10\n+ }\n+ }\n+ ]\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 4,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"suggestionDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"suggestionDiagnosticsSync\",\n+ \"request_seq\": 4,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 5,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"startLine\": 1,\n+ \"startOffset\": 1,\n+ \"endLine\": 1,\n+ \"endOffset\": 10,\n+ \"errorCodes\": [\n+ 2304\n+ ]\n+ },\n+ \"command\": \"getCodeFixes\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"getCodeFixes\",\n+ \"request_seq\": 5,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"fixName\": \"import\",\n+ \"description\": \"Add import from \\\"#internal/foo.js\\\"\",\n+ \"changes\": [\n+ {\n+ \"fileName\": \"/src/a.ts\",\n+ \"textChanges\": [\n+ {\n+ \"start\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"end\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"newText\": \"import { something } from \\\"#internal/foo.js\\\";\\r\\n\\r\\n\"\n+ }\n+ ]\n+ }\n+ ]\n+ }\n+ ]\n+ }\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap3.js b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap3.js\nnew file mode 100644\nindex 000000000000..b2621096bd17\n--- /dev/null\n+++ b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap3.js\n@@ -0,0 +1,321 @@\n+currentDirectory:: / useCaseSensitiveFileNames: false\n+Info seq [hh:mm:ss:mss] Provided types map file \"/typesMap.json\" doesn't exist\n+//// [/lib.d.ts]\r\n+lib.d.ts-Text\r\n+\r\n+//// [/lib.decorators.d.ts]\r\n+lib.decorators.d.ts-Text\r\n+\r\n+//// [/lib.decorators.legacy.d.ts]\r\n+lib.decorators.legacy.d.ts-Text\r\n+\r\n+//// [/package.json]\r\n+{\n+ \"type\": \"module\",\n+ \"imports\": {\n+ \"#internal/\": \"./dist/internal/\"\n+ }\n+}\r\n+\r\n+//// [/src/a.ts]\r\n+something\r\n+\r\n+//// [/src/internal/foo.ts]\r\n+export function something(name: string) {}\r\n+\r\n+//// [/tsconfig.json]\r\n+{\n+ \"compilerOptions\": {\n+ \"module\": \"nodenext\",\n+ \"rootDir\": \"src\",\n+ \"outDir\": \"dist\"\n+ }\n+}\r\n+\r\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/tsconfig.json\"\n+ },\n+ \"command\": \"open\"\n+ }\n+Info seq [hh:mm:ss:mss] Search path: /\n+Info seq [hh:mm:ss:mss] For info: /tsconfig.json :: Config file name: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Creating configuration project /tsconfig.json\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /tsconfig.json 2000 undefined Project: /tsconfig.json WatchType: Config file\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingStart\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\",\n+ \"reason\": \"Creating possible configured project for /tsconfig.json to open\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Config: /tsconfig.json : {\n+ \"rootNames\": [\n+ \"/lib.d.ts\",\n+ \"/lib.decorators.d.ts\",\n+ \"/lib.decorators.legacy.d.ts\",\n+ \"/src/a.ts\",\n+ \"/src/internal/foo.ts\"\n+ ],\n+ \"options\": {\n+ \"module\": 199,\n+ \"rootDir\": \"/src\",\n+ \"outDir\": \"/dist\",\n+ \"configFilePath\": \"/tsconfig.json\"\n+ }\n+}\n+Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.legacy.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/a.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/internal/foo.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /tsconfig.json Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/src/a.ts Text-1 \"something\"\n+\t/src/internal/foo.ts Text-1 \"export function something(name: string) {}\"\n+\n+\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.d.ts\n+\t Matched by default include pattern '**/*'\n+\tsrc/a.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\tsrc/internal/foo.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingFinish\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"configFileDiag\",\n+ \"body\": {\n+ \"triggerFile\": \"/tsconfig.json\",\n+ \"configFile\": \"/tsconfig.json\",\n+ \"diagnostics\": []\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /dev/null/inferredProject1*\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/tsconfig.json SVC-1-0 \"{\\n \\\"compilerOptions\\\": {\\n \\\"module\\\": \\\"nodenext\\\",\\n \\\"rootDir\\\": \\\"src\\\",\\n \\\"outDir\\\": \\\"dist\\\"\\n }\\n}\"\n+\n+\n+\tlib.d.ts\n+\t Default library for target 'es5'\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\ttsconfig.json\n+\t Root file specified for compilation\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /package.json 250 undefined WatchType: package.json file\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Open files: \n+Info seq [hh:mm:ss:mss] \tFileName: /tsconfig.json ProjectRootPath: undefined\n+Info seq [hh:mm:ss:mss] \t\tProjects: /dev/null/inferredProject1*\n+After Request\n+watchedFiles::\n+/lib.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.legacy.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/package.json: *new*\n+ {\"pollingInterval\":250}\n+/src/a.ts: *new*\n+ {\"pollingInterval\":500}\n+/src/internal/foo.ts: *new*\n+ {\"pollingInterval\":500}\n+/tsconfig.json: *new*\n+ {\"pollingInterval\":2000}\n+\n+watchedDirectoriesRecursive::\n+: *new*\n+ {}\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 1,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"preferences\": {\n+ \"includeCompletionsForModuleExports\": true,\n+ \"includeCompletionsWithInsertText\": true\n+ }\n+ },\n+ \"command\": \"configure\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"configure\",\n+ \"request_seq\": 1,\n+ \"success\": true\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 2,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"syntacticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"syntacticDiagnosticsSync\",\n+ \"request_seq\": 2,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 3,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"semanticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"semanticDiagnosticsSync\",\n+ \"request_seq\": 3,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"message\": \"Cannot find name 'something'.\",\n+ \"start\": 0,\n+ \"length\": 9,\n+ \"category\": \"error\",\n+ \"code\": 2304,\n+ \"startLocation\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"endLocation\": {\n+ \"line\": 1,\n+ \"offset\": 10\n+ }\n+ }\n+ ]\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 4,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"suggestionDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"suggestionDiagnosticsSync\",\n+ \"request_seq\": 4,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 5,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"startLine\": 1,\n+ \"startOffset\": 1,\n+ \"endLine\": 1,\n+ \"endOffset\": 10,\n+ \"errorCodes\": [\n+ 2304\n+ ]\n+ },\n+ \"command\": \"getCodeFixes\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"getCodeFixes\",\n+ \"request_seq\": 5,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"fixName\": \"import\",\n+ \"description\": \"Add import from \\\"#internal/foo.js\\\"\",\n+ \"changes\": [\n+ {\n+ \"fileName\": \"/src/a.ts\",\n+ \"textChanges\": [\n+ {\n+ \"start\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"end\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"newText\": \"import { something } from \\\"#internal/foo.js\\\";\\r\\n\\r\\n\"\n+ }\n+ ]\n+ }\n+ ]\n+ }\n+ ]\n+ }\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap4.js b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap4.js\nnew file mode 100644\nindex 000000000000..e25af521ae67\n--- /dev/null\n+++ b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap4.js\n@@ -0,0 +1,324 @@\n+currentDirectory:: / useCaseSensitiveFileNames: false\n+Info seq [hh:mm:ss:mss] Provided types map file \"/typesMap.json\" doesn't exist\n+//// [/lib.d.ts]\r\n+lib.d.ts-Text\r\n+\r\n+//// [/lib.decorators.d.ts]\r\n+lib.decorators.d.ts-Text\r\n+\r\n+//// [/lib.decorators.legacy.d.ts]\r\n+lib.decorators.legacy.d.ts-Text\r\n+\r\n+//// [/package.json]\r\n+{\n+ \"type\": \"module\",\n+ \"imports\": {\n+ \"#is-browser\": {\n+ \"types\": \"./dist/env/browser.d.ts\",\n+ \"default\": \"./dist/env/browser.js\"\n+ }\n+ }\n+}\r\n+\r\n+//// [/src/a.ts]\r\n+isBrowser\r\n+\r\n+//// [/src/env/browser.ts]\r\n+export const isBrowser = true;\r\n+\r\n+//// [/tsconfig.json]\r\n+{\n+ \"compilerOptions\": {\n+ \"module\": \"nodenext\",\n+ \"rootDir\": \"src\",\n+ \"outDir\": \"dist\"\n+ }\n+}\r\n+\r\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/tsconfig.json\"\n+ },\n+ \"command\": \"open\"\n+ }\n+Info seq [hh:mm:ss:mss] Search path: /\n+Info seq [hh:mm:ss:mss] For info: /tsconfig.json :: Config file name: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Creating configuration project /tsconfig.json\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /tsconfig.json 2000 undefined Project: /tsconfig.json WatchType: Config file\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingStart\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\",\n+ \"reason\": \"Creating possible configured project for /tsconfig.json to open\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Config: /tsconfig.json : {\n+ \"rootNames\": [\n+ \"/lib.d.ts\",\n+ \"/lib.decorators.d.ts\",\n+ \"/lib.decorators.legacy.d.ts\",\n+ \"/src/a.ts\",\n+ \"/src/env/browser.ts\"\n+ ],\n+ \"options\": {\n+ \"module\": 199,\n+ \"rootDir\": \"/src\",\n+ \"outDir\": \"/dist\",\n+ \"configFilePath\": \"/tsconfig.json\"\n+ }\n+}\n+Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.legacy.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/a.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/env/browser.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /tsconfig.json Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/src/a.ts Text-1 \"isBrowser\"\n+\t/src/env/browser.ts Text-1 \"export const isBrowser = true;\"\n+\n+\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.d.ts\n+\t Matched by default include pattern '**/*'\n+\tsrc/a.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\tsrc/env/browser.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingFinish\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"configFileDiag\",\n+ \"body\": {\n+ \"triggerFile\": \"/tsconfig.json\",\n+ \"configFile\": \"/tsconfig.json\",\n+ \"diagnostics\": []\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /dev/null/inferredProject1*\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/tsconfig.json SVC-1-0 \"{\\n \\\"compilerOptions\\\": {\\n \\\"module\\\": \\\"nodenext\\\",\\n \\\"rootDir\\\": \\\"src\\\",\\n \\\"outDir\\\": \\\"dist\\\"\\n }\\n}\"\n+\n+\n+\tlib.d.ts\n+\t Default library for target 'es5'\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\ttsconfig.json\n+\t Root file specified for compilation\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /package.json 250 undefined WatchType: package.json file\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Open files: \n+Info seq [hh:mm:ss:mss] \tFileName: /tsconfig.json ProjectRootPath: undefined\n+Info seq [hh:mm:ss:mss] \t\tProjects: /dev/null/inferredProject1*\n+After Request\n+watchedFiles::\n+/lib.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.legacy.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/package.json: *new*\n+ {\"pollingInterval\":250}\n+/src/a.ts: *new*\n+ {\"pollingInterval\":500}\n+/src/env/browser.ts: *new*\n+ {\"pollingInterval\":500}\n+/tsconfig.json: *new*\n+ {\"pollingInterval\":2000}\n+\n+watchedDirectoriesRecursive::\n+: *new*\n+ {}\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 1,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"preferences\": {\n+ \"includeCompletionsForModuleExports\": true,\n+ \"includeCompletionsWithInsertText\": true\n+ }\n+ },\n+ \"command\": \"configure\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"configure\",\n+ \"request_seq\": 1,\n+ \"success\": true\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 2,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"syntacticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"syntacticDiagnosticsSync\",\n+ \"request_seq\": 2,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 3,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"semanticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"semanticDiagnosticsSync\",\n+ \"request_seq\": 3,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"message\": \"Cannot find name 'isBrowser'.\",\n+ \"start\": 0,\n+ \"length\": 9,\n+ \"category\": \"error\",\n+ \"code\": 2304,\n+ \"startLocation\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"endLocation\": {\n+ \"line\": 1,\n+ \"offset\": 10\n+ }\n+ }\n+ ]\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 4,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"suggestionDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"suggestionDiagnosticsSync\",\n+ \"request_seq\": 4,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 5,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"startLine\": 1,\n+ \"startOffset\": 1,\n+ \"endLine\": 1,\n+ \"endOffset\": 10,\n+ \"errorCodes\": [\n+ 2304\n+ ]\n+ },\n+ \"command\": \"getCodeFixes\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"getCodeFixes\",\n+ \"request_seq\": 5,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"fixName\": \"import\",\n+ \"description\": \"Add import from \\\"#is-browser\\\"\",\n+ \"changes\": [\n+ {\n+ \"fileName\": \"/src/a.ts\",\n+ \"textChanges\": [\n+ {\n+ \"start\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"end\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"newText\": \"import { isBrowser } from \\\"#is-browser\\\";\\r\\n\\r\\n\"\n+ }\n+ ]\n+ }\n+ ]\n+ }\n+ ]\n+ }\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap5.js b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap5.js\nnew file mode 100644\nindex 000000000000..9440f3f24757\n--- /dev/null\n+++ b/tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap5.js\n@@ -0,0 +1,341 @@\n+currentDirectory:: / useCaseSensitiveFileNames: false\n+Info seq [hh:mm:ss:mss] Provided types map file \"/typesMap.json\" doesn't exist\n+//// [/lib.d.ts]\r\n+lib.d.ts-Text\r\n+\r\n+//// [/lib.decorators.d.ts]\r\n+lib.decorators.d.ts-Text\r\n+\r\n+//// [/lib.decorators.legacy.d.ts]\r\n+lib.decorators.legacy.d.ts-Text\r\n+\r\n+//// [/package.json]\r\n+{\n+ \"type\": \"module\",\n+ \"imports\": {\n+ \"#is-browser\": {\n+ \"types\": \"./types/env/browser.d.ts\",\n+ \"default\": \"./not-dist-on-purpose/env/browser.js\"\n+ }\n+ }\n+}\r\n+\r\n+//// [/src/a.ts]\r\n+isBrowser\r\n+\r\n+//// [/src/env/browser.ts]\r\n+export const isBrowser = true;\r\n+\r\n+//// [/tsconfig.json]\r\n+{\n+ \"compilerOptions\": {\n+ \"module\": \"nodenext\",\n+ \"rootDir\": \"src\",\n+ \"outDir\": \"dist\",\n+ \"declarationDir\": \"types\",\n+ }\n+}\r\n+\r\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/tsconfig.json\"\n+ },\n+ \"command\": \"open\"\n+ }\n+Info seq [hh:mm:ss:mss] Search path: /\n+Info seq [hh:mm:ss:mss] For info: /tsconfig.json :: Config file name: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Creating configuration project /tsconfig.json\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /tsconfig.json 2000 undefined Project: /tsconfig.json WatchType: Config file\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingStart\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\",\n+ \"reason\": \"Creating possible configured project for /tsconfig.json to open\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Config: /tsconfig.json : {\n+ \"rootNames\": [\n+ \"/lib.d.ts\",\n+ \"/lib.decorators.d.ts\",\n+ \"/lib.decorators.legacy.d.ts\",\n+ \"/src/a.ts\",\n+ \"/src/env/browser.ts\"\n+ ],\n+ \"options\": {\n+ \"module\": 199,\n+ \"rootDir\": \"/src\",\n+ \"outDir\": \"/dist\",\n+ \"declarationDir\": \"/types\",\n+ \"configFilePath\": \"/tsconfig.json\"\n+ }\n+}\n+Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: 1 undefined Config: /tsconfig.json WatchType: Wild card directory\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /lib.decorators.legacy.d.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/a.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /src/env/browser.ts 500 undefined WatchType: Closed Script info\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /tsconfig.json\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /tsconfig.json Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/src/a.ts Text-1 \"isBrowser\"\n+\t/src/env/browser.ts Text-1 \"export const isBrowser = true;\"\n+\n+\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\t Matched by default include pattern '**/*'\n+\tlib.d.ts\n+\t Matched by default include pattern '**/*'\n+\tsrc/a.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\tsrc/env/browser.ts\n+\t Matched by default include pattern '**/*'\n+\t File is ECMAScript module because 'package.json' has field \"type\" with value \"module\"\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"projectLoadingFinish\",\n+ \"body\": {\n+ \"projectName\": \"/tsconfig.json\"\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] event:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"event\",\n+ \"event\": \"configFileDiag\",\n+ \"body\": {\n+ \"triggerFile\": \"/tsconfig.json\",\n+ \"configFile\": \"/tsconfig.json\",\n+ \"diagnostics\": [\n+ {\n+ \"start\": {\n+ \"line\": 6,\n+ \"offset\": 5\n+ },\n+ \"end\": {\n+ \"line\": 6,\n+ \"offset\": 21\n+ },\n+ \"text\": \"Option 'declarationDir' cannot be specified without specifying option 'declaration' or option 'composite'.\",\n+ \"code\": 5069,\n+ \"category\": \"error\",\n+ \"fileName\": \"/tsconfig.json\"\n+ }\n+ ]\n+ }\n+ }\n+Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /dev/null/inferredProject1*\n+Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /dev/null/inferredProject1* Version: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\t/lib.d.ts Text-1 lib.d.ts-Text\n+\t/lib.decorators.d.ts Text-1 lib.decorators.d.ts-Text\n+\t/lib.decorators.legacy.d.ts Text-1 lib.decorators.legacy.d.ts-Text\n+\t/tsconfig.json SVC-1-0 \"{\\n \\\"compilerOptions\\\": {\\n \\\"module\\\": \\\"nodenext\\\",\\n \\\"rootDir\\\": \\\"src\\\",\\n \\\"outDir\\\": \\\"dist\\\",\\n \\\"declarationDir\\\": \\\"types\\\",\\n }\\n}\"\n+\n+\n+\tlib.d.ts\n+\t Default library for target 'es5'\n+\tlib.decorators.d.ts\n+\t Library referenced via 'decorators' from file 'lib.d.ts'\n+\tlib.decorators.legacy.d.ts\n+\t Library referenced via 'decorators.legacy' from file 'lib.d.ts'\n+\ttsconfig.json\n+\t Root file specified for compilation\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /package.json 250 undefined WatchType: package.json file\n+Info seq [hh:mm:ss:mss] Project '/tsconfig.json' (Configured)\n+Info seq [hh:mm:ss:mss] \tFiles (5)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Project '/dev/null/inferredProject1*' (Inferred)\n+Info seq [hh:mm:ss:mss] \tFiles (4)\n+\n+Info seq [hh:mm:ss:mss] -----------------------------------------------\n+Info seq [hh:mm:ss:mss] Open files: \n+Info seq [hh:mm:ss:mss] \tFileName: /tsconfig.json ProjectRootPath: undefined\n+Info seq [hh:mm:ss:mss] \t\tProjects: /dev/null/inferredProject1*\n+After Request\n+watchedFiles::\n+/lib.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/lib.decorators.legacy.d.ts: *new*\n+ {\"pollingInterval\":500}\n+/package.json: *new*\n+ {\"pollingInterval\":250}\n+/src/a.ts: *new*\n+ {\"pollingInterval\":500}\n+/src/env/browser.ts: *new*\n+ {\"pollingInterval\":500}\n+/tsconfig.json: *new*\n+ {\"pollingInterval\":2000}\n+\n+watchedDirectoriesRecursive::\n+: *new*\n+ {}\n+\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 1,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"preferences\": {\n+ \"includeCompletionsForModuleExports\": true,\n+ \"includeCompletionsWithInsertText\": true\n+ }\n+ },\n+ \"command\": \"configure\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"configure\",\n+ \"request_seq\": 1,\n+ \"success\": true\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 2,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"syntacticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"syntacticDiagnosticsSync\",\n+ \"request_seq\": 2,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 3,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"semanticDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"semanticDiagnosticsSync\",\n+ \"request_seq\": 3,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"message\": \"Cannot find name 'isBrowser'.\",\n+ \"start\": 0,\n+ \"length\": 9,\n+ \"category\": \"error\",\n+ \"code\": 2304,\n+ \"startLocation\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"endLocation\": {\n+ \"line\": 1,\n+ \"offset\": 10\n+ }\n+ }\n+ ]\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 4,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"includeLinePosition\": true\n+ },\n+ \"command\": \"suggestionDiagnosticsSync\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"suggestionDiagnosticsSync\",\n+ \"request_seq\": 4,\n+ \"success\": true,\n+ \"body\": []\n+ }\n+Info seq [hh:mm:ss:mss] request:\n+ {\n+ \"seq\": 5,\n+ \"type\": \"request\",\n+ \"arguments\": {\n+ \"file\": \"/src/a.ts\",\n+ \"startLine\": 1,\n+ \"startOffset\": 1,\n+ \"endLine\": 1,\n+ \"endOffset\": 10,\n+ \"errorCodes\": [\n+ 2304\n+ ]\n+ },\n+ \"command\": \"getCodeFixes\"\n+ }\n+Info seq [hh:mm:ss:mss] response:\n+ {\n+ \"seq\": 0,\n+ \"type\": \"response\",\n+ \"command\": \"getCodeFixes\",\n+ \"request_seq\": 5,\n+ \"success\": true,\n+ \"body\": [\n+ {\n+ \"fixName\": \"import\",\n+ \"description\": \"Add import from \\\"#is-browser\\\"\",\n+ \"changes\": [\n+ {\n+ \"fileName\": \"/src/a.ts\",\n+ \"textChanges\": [\n+ {\n+ \"start\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"end\": {\n+ \"line\": 1,\n+ \"offset\": 1\n+ },\n+ \"newText\": \"import { isBrowser } from \\\"#is-browser\\\";\\r\\n\\r\\n\"\n+ }\n+ ]\n+ }\n+ ]\n+ }\n+ ]\n+ }\n\\ No newline at end of file\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonExportsSpecifierEndsInTs.ts b/tests/cases/fourslash/autoImportPackageJsonExportsSpecifierEndsInTs.ts\nnew file mode 100644\nindex 000000000000..7784b0334f92\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonExportsSpecifierEndsInTs.ts\n@@ -0,0 +1,27 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /node_modules/pkg/package.json\n+//// {\n+//// \"name\": \"pkg\",\n+//// \"version\": \"1.0.0\",\n+//// \"exports\": {\n+//// \"./something.ts\": \"./a.js\"\n+//// }\n+//// }\n+\n+// @Filename: /node_modules/pkg/a.d.ts\n+//// export function foo(): void;\n+\n+// @Filename: /package.json\n+//// {\n+//// \"dependencies\": {\n+//// \"pkg\": \"*\"\n+//// }\n+//// }\n+\n+// @Filename: /index.ts\n+//// foo/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"pkg/something.ts\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsConditions.ts b/tests/cases/fourslash/autoImportPackageJsonImportsConditions.ts\nnew file mode 100644\nindex 000000000000..71fd139167ca\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsConditions.ts\n@@ -0,0 +1,22 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#thing\": {\n+//// \"types\": { \"import\": \"./types-esm/thing.d.mts\", \"require\": \"./types/thing.d.ts\" },\n+//// \"default\": { \"import\": \"./esm/thing.mjs\", \"require\": \"./dist/thing.js\" }\n+//// }\n+//// }\n+//// }\n+\n+\n+// @Filename: /src/.ts\n+//// something/*a*/\n+\n+// @Filename: /types/thing.d.ts\n+//// export function something(name: string): any;\n+\n+verify.importFixModuleSpecifiers(\"a\", [\"#thing\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsLength1.ts b/tests/cases/fourslash/autoImportPackageJsonImportsLength1.ts\nnew file mode 100644\nindex 000000000000..ae0999fb7a3b\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsLength1.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/a/b/c/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /src/a/b/c/d.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"./something\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsLength2.ts b/tests/cases/fourslash/autoImportPackageJsonImportsLength2.ts\nnew file mode 100644\nindex 000000000000..5b54f6b3149c\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsLength2.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/a/b/c/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#a/b/c/something\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPattern.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPattern.ts\nnew file mode 100644\nindex 000000000000..70aeabcfdaae\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPattern.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#something.js\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPattern_js.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_js.ts\nnew file mode 100644\nindex 000000000000..a5955a65c927\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_js.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.js\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#something\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPattern_js_ts.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_js_ts.ts\nnew file mode 100644\nindex 000000000000..bf9b3305d77b\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_js_ts.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*.js\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#something.js\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts.ts\nnew file mode 100644\nindex 000000000000..a48ef7d4bc72\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#something\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_js.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_js.ts\nnew file mode 100644\nindex 000000000000..701b8fbd978b\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_js.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*.ts\": \"./src/*.js\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#something.ts\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_ts.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_ts.ts\nnew file mode 100644\nindex 000000000000..19171deea3b5\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_ts.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*.ts\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#something.ts\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPreference1.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPreference1.ts\nnew file mode 100644\nindex 000000000000..dfac2a3ab55d\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPreference1.ts\n@@ -0,0 +1,20 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/a/b/c/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"./src/a/b/c/something\"], {\n+ importModuleSpecifierPreference: \"relative\"\n+});\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPreference2.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPreference2.ts\nnew file mode 100644\nindex 000000000000..affd548cfa3c\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPreference2.ts\n@@ -0,0 +1,20 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/a/b/c/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"./src/a/b/c/something\"], {\n+ importModuleSpecifierPreference: \"project-relative\"\n+});\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImportsPreference3.ts b/tests/cases/fourslash/autoImportPackageJsonImportsPreference3.ts\nnew file mode 100644\nindex 000000000000..3113af1bab62\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImportsPreference3.ts\n@@ -0,0 +1,20 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#*\": \"./src/*.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/a/b/c/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /src/a/b/c/d.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#a/b/c/something\"], {\n+ importModuleSpecifierPreference: \"non-relative\"\n+});\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImports_capsInPath1.ts b/tests/cases/fourslash/autoImportPackageJsonImports_capsInPath1.ts\nnew file mode 100644\nindex 000000000000..81b698ebd4d4\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImports_capsInPath1.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /Dev/package.json\n+//// {\n+//// \"imports\": {\n+//// \"#thing\": \"./src/something.js\"\n+//// }\n+//// }\n+\n+// @Filename: /Dev/src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /Dev/a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#thing\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImports_capsInPath2.ts b/tests/cases/fourslash/autoImportPackageJsonImports_capsInPath2.ts\nnew file mode 100644\nindex 000000000000..eb0b0f683814\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImports_capsInPath2.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /Dev/package.json\n+//// {\n+//// \"imports\": {\n+//// \"#thing/*\": \"./src/*.js\"\n+//// }\n+//// }\n+\n+// @Filename: /Dev/src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /Dev/a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#thing/something\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImports_js.ts b/tests/cases/fourslash/autoImportPackageJsonImports_js.ts\nnew file mode 100644\nindex 000000000000..1056d13dd507\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImports_js.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#thing\": \"./src/something.js\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#thing\"]);\ndiff --git a/tests/cases/fourslash/autoImportPackageJsonImports_ts.ts b/tests/cases/fourslash/autoImportPackageJsonImports_ts.ts\nnew file mode 100644\nindex 000000000000..a8e8b13b3d6e\n--- /dev/null\n+++ b/tests/cases/fourslash/autoImportPackageJsonImports_ts.ts\n@@ -0,0 +1,18 @@\n+/// <reference path=\"fourslash.ts\" />\n+\n+// @module: nodenext\n+\n+// @Filename: /package.json\n+//// {\n+//// \"imports\": {\n+//// \"#thing\": \"./src/something.ts\"\n+//// }\n+//// }\n+\n+// @Filename: /src/something.ts\n+//// export function something(name: string): any;\n+\n+// @Filename: /a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#thing\"]);\ndiff --git a/tests/cases/fourslash/server/autoImportProvider_importsMap1.ts b/tests/cases/fourslash/server/autoImportProvider_importsMap1.ts\nnew file mode 100644\nindex 000000000000..02f6072753d1\n--- /dev/null\n+++ b/tests/cases/fourslash/server/autoImportProvider_importsMap1.ts\n@@ -0,0 +1,32 @@\n+/// <reference path=\"../fourslash.ts\"/>\n+\n+// @Filename: /tsconfig.json\n+//// {\n+//// \"compilerOptions\": {\n+//// \"module\": \"nodenext\",\n+//// \"rootDir\": \"src\",\n+//// \"outDir\": \"dist\"\n+//// }\n+//// }\n+\n+// @Filename: /package.json\n+//// {\n+//// \"type\": \"module\",\n+//// \"imports\": {\n+//// \"#is-browser\": {\n+//// \"browser\": \"./dist/env/browser.js\",\n+//// \"default\": \"./dist/env/node.js\"\n+//// }\n+//// }\n+//// }\n+\n+// @Filename: /src/env/browser.ts\n+//// export const isBrowser = true;\n+\n+// @Filename: /src/env/node.ts\n+//// export const isBrowser = false;\n+\n+// @Filename: /src/a.ts\n+//// isBrowser/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"./env/browser.js\", \"#is-browser\"]);\n\\ No newline at end of file\ndiff --git a/tests/cases/fourslash/server/autoImportProvider_importsMap2.ts b/tests/cases/fourslash/server/autoImportProvider_importsMap2.ts\nnew file mode 100644\nindex 000000000000..934823091e79\n--- /dev/null\n+++ b/tests/cases/fourslash/server/autoImportProvider_importsMap2.ts\n@@ -0,0 +1,26 @@\n+/// <reference path=\"../fourslash.ts\"/>\n+\n+// @Filename: /tsconfig.json\n+//// {\n+//// \"compilerOptions\": {\n+//// \"module\": \"nodenext\",\n+//// \"rootDir\": \"src\",\n+//// \"outDir\": \"dist\"\n+//// }\n+//// }\n+\n+// @Filename: /package.json\n+//// {\n+//// \"type\": \"module\",\n+//// \"imports\": {\n+//// \"#internal/*\": \"./dist/internal/*\"\n+//// }\n+//// }\n+\n+// @Filename: /src/internal/foo.ts\n+//// export function something(name: string) {}\n+\n+// @Filename: /src/a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#internal/foo.js\"]);\n\\ No newline at end of file\ndiff --git a/tests/cases/fourslash/server/autoImportProvider_importsMap3.ts b/tests/cases/fourslash/server/autoImportProvider_importsMap3.ts\nnew file mode 100644\nindex 000000000000..d10e69768531\n--- /dev/null\n+++ b/tests/cases/fourslash/server/autoImportProvider_importsMap3.ts\n@@ -0,0 +1,26 @@\n+/// <reference path=\"../fourslash.ts\"/>\n+\n+// @Filename: /tsconfig.json\n+//// {\n+//// \"compilerOptions\": {\n+//// \"module\": \"nodenext\",\n+//// \"rootDir\": \"src\",\n+//// \"outDir\": \"dist\"\n+//// }\n+//// }\n+\n+// @Filename: /package.json\n+//// {\n+//// \"type\": \"module\",\n+//// \"imports\": {\n+//// \"#internal/\": \"./dist/internal/\"\n+//// }\n+//// }\n+\n+// @Filename: /src/internal/foo.ts\n+//// export function something(name: string) {}\n+\n+// @Filename: /src/a.ts\n+//// something/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#internal/foo.js\"]);\n\\ No newline at end of file\ndiff --git a/tests/cases/fourslash/server/autoImportProvider_importsMap4.ts b/tests/cases/fourslash/server/autoImportProvider_importsMap4.ts\nnew file mode 100644\nindex 000000000000..11921f3fe52e\n--- /dev/null\n+++ b/tests/cases/fourslash/server/autoImportProvider_importsMap4.ts\n@@ -0,0 +1,29 @@\n+/// <reference path=\"../fourslash.ts\"/>\n+\n+// @Filename: /tsconfig.json\n+//// {\n+//// \"compilerOptions\": {\n+//// \"module\": \"nodenext\",\n+//// \"rootDir\": \"src\",\n+//// \"outDir\": \"dist\"\n+//// }\n+//// }\n+\n+// @Filename: /package.json\n+//// {\n+//// \"type\": \"module\",\n+//// \"imports\": {\n+//// \"#is-browser\": {\n+//// \"types\": \"./dist/env/browser.d.ts\",\n+//// \"default\": \"./dist/env/browser.js\"\n+//// }\n+//// }\n+//// }\n+\n+// @Filename: /src/env/browser.ts\n+//// export const isBrowser = true;\n+\n+// @Filename: /src/a.ts\n+//// isBrowser/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#is-browser\"]);\n\\ No newline at end of file\ndiff --git a/tests/cases/fourslash/server/autoImportProvider_importsMap5.ts b/tests/cases/fourslash/server/autoImportProvider_importsMap5.ts\nnew file mode 100644\nindex 000000000000..6f360f6b3bf5\n--- /dev/null\n+++ b/tests/cases/fourslash/server/autoImportProvider_importsMap5.ts\n@@ -0,0 +1,30 @@\n+/// <reference path=\"../fourslash.ts\"/>\n+\n+// @Filename: /tsconfig.json\n+//// {\n+//// \"compilerOptions\": {\n+//// \"module\": \"nodenext\",\n+//// \"rootDir\": \"src\",\n+//// \"outDir\": \"dist\",\n+//// \"declarationDir\": \"types\",\n+//// }\n+//// }\n+\n+// @Filename: /package.json\n+//// {\n+//// \"type\": \"module\",\n+//// \"imports\": {\n+//// \"#is-browser\": {\n+//// \"types\": \"./types/env/browser.d.ts\",\n+//// \"default\": \"./not-dist-on-purpose/env/browser.js\"\n+//// }\n+//// }\n+//// }\n+\n+// @Filename: /src/env/browser.ts\n+//// export const isBrowser = true;\n+\n+// @Filename: /src/a.ts\n+//// isBrowser/**/\n+\n+verify.importFixModuleSpecifiers(\"\", [\"#is-browser\"]);\n\\ No newline at end of file\n", "files": ["src/compiler/checker.ts", "src/compiler/core.ts", "src/compiler/emitter.ts", "src/compiler/moduleNameResolver.ts", "src/compiler/moduleSpecifiers.ts", "src/compiler/types.ts", "src/compiler/utilities.ts", "src/services/utilities.ts", "tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap1.js", "tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap2.js", "tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap3.js", "tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap4.js", "tests/baselines/reference/tsserver/fourslashServer/autoImportProvider_importsMap5.js", "tests/cases/fourslash/autoImportPackageJsonExportsSpecifierEndsInTs.ts", "tests/cases/fourslash/autoImportPackageJsonImportsConditions.ts", "tests/cases/fourslash/autoImportPackageJsonImportsLength1.ts", "tests/cases/fourslash/autoImportPackageJsonImportsLength2.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPattern.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPattern_js.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPattern_js_ts.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_js.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPattern_ts_ts.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPreference1.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPreference2.ts", "tests/cases/fourslash/autoImportPackageJsonImportsPreference3.ts", "tests/cases/fourslash/autoImportPackageJsonImports_capsInPath1.ts", "tests/cases/fourslash/autoImportPackageJsonImports_capsInPath2.ts", "tests/cases/fourslash/autoImportPackageJsonImports_js.ts", "tests/cases/fourslash/autoImportPackageJsonImports_ts.ts", "tests/cases/fourslash/server/autoImportProvider_importsMap1.ts", "tests/cases/fourslash/server/autoImportProvider_importsMap2.ts", "tests/cases/fourslash/server/autoImportProvider_importsMap3.ts", "tests/cases/fourslash/server/autoImportProvider_importsMap4.ts", "tests/cases/fourslash/server/autoImportProvider_importsMap5.ts"]}, "93e6b9da0c4cb164ca90a5a1b07415e81e97f2b1": {"diff": "diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts\nindex 43cff3cb5238..ceb99b65eefa 100644\n--- a/src/compiler/checker.ts\n+++ b/src/compiler/checker.ts\n@@ -20883,12 +20883,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n return !!(entry & RelationComparisonResult.Succeeded);\r\n }\r\n const targetEnumType = getTypeOfSymbol(targetSymbol);\r\n- for (const property of getPropertiesOfType(getTypeOfSymbol(sourceSymbol))) {\r\n- if (property.flags & SymbolFlags.EnumMember) {\r\n- const targetProperty = getPropertyOfType(targetEnumType, property.escapedName);\r\n+ for (const sourceProperty of getPropertiesOfType(getTypeOfSymbol(sourceSymbol))) {\r\n+ if (sourceProperty.flags & SymbolFlags.EnumMember) {\r\n+ const targetProperty = getPropertyOfType(targetEnumType, sourceProperty.escapedName);\r\n if (!targetProperty || !(targetProperty.flags & SymbolFlags.EnumMember)) {\r\n if (errorReporter) {\r\n- errorReporter(Diagnostics.Property_0_is_missing_in_type_1, symbolName(property), typeToString(getDeclaredTypeOfSymbol(targetSymbol), /*enclosingDeclaration*/ undefined, TypeFormatFlags.UseFullyQualifiedType));\r\n+ errorReporter(Diagnostics.Property_0_is_missing_in_type_1, symbolName(sourceProperty), typeToString(getDeclaredTypeOfSymbol(targetSymbol), /*enclosingDeclaration*/ undefined, TypeFormatFlags.UseFullyQualifiedType));\r\n enumRelation.set(id, RelationComparisonResult.Failed | RelationComparisonResult.Reported);\r\n }\r\n else {\r\n@@ -20896,6 +20896,46 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n }\r\n return false;\r\n }\r\n+ const sourceValue = getEnumMemberValue(getDeclarationOfKind(sourceProperty, SyntaxKind.EnumMember)!);\r\n+ const targetValue = getEnumMemberValue(getDeclarationOfKind(targetProperty, SyntaxKind.EnumMember)!);\r\n+ if (sourceValue !== targetValue) {\r\n+ const sourceIsString = typeof sourceValue === \"string\";\r\n+ const targetIsString = typeof targetValue === \"string\";\r\n+\r\n+ // If we have 2 enums with *known* values that differ, they are incompatible.\r\n+ if (sourceValue !== undefined && targetValue !== undefined) {\r\n+ if (!errorReporter) {\r\n+ enumRelation.set(id, RelationComparisonResult.Failed);\r\n+ }\r\n+ else {\r\n+ const escapedSource = sourceIsString ? `\"${escapeString(sourceValue)}\"` : sourceValue;\r\n+ const escapedTarget = targetIsString ? `\"${escapeString(targetValue)}\"` : targetValue;\r\n+ errorReporter(Diagnostics.Each_declaration_of_0_1_differs_in_its_value_where_2_was_expected_but_3_was_given, symbolName(targetSymbol), symbolName(targetProperty), escapedTarget, escapedSource);\r\n+ enumRelation.set(id, RelationComparisonResult.Failed | RelationComparisonResult.Reported);\r\n+ }\r\n+ return false;\r\n+ }\r\n+\r\n+ // At this point we know that at least one of the values is 'undefined'.\r\n+ // This may mean that we have an opaque member from an ambient enum declaration,\r\n+ // or that we were not able to calculate it (which is basically an error).\r\n+ //\r\n+ // Either way, we can assume that it's numeric.\r\n+ // If the other is a string, we have a mismatch in types.\r\n+ if (sourceIsString || targetIsString) {\r\n+ if (!errorReporter) {\r\n+ enumRelation.set(id, RelationComparisonResult.Failed);\r\n+ }\r\n+ else {\r\n+ const knownStringValue = sourceValue ?? targetValue;\r\n+ Debug.assert(typeof knownStringValue === \"string\");\r\n+ const escapedValue = `\"${escapeString(knownStringValue)}\"`;\r\n+ errorReporter(Diagnostics.One_value_of_0_1_is_the_string_2_and_the_other_is_assumed_to_be_an_unknown_numeric_value, symbolName(targetSymbol), symbolName(targetProperty), escapedValue);\r\n+ enumRelation.set(id, RelationComparisonResult.Failed | RelationComparisonResult.Reported);\r\n+ }\r\n+ return false;\r\n+ }\r\n+ }\r\n }\r\n }\r\n enumRelation.set(id, RelationComparisonResult.Succeeded);\r\ndiff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json\nindex 5a71fa894b10..1979557243ab 100644\n--- a/src/compiler/diagnosticMessages.json\n+++ b/src/compiler/diagnosticMessages.json\n@@ -4176,6 +4176,14 @@\n \"category\": \"Error\",\r\n \"code\": 4124\r\n },\r\n+ \"Each declaration of '{0}.{1}' differs in its value, where '{2}' was expected but '{3}' was given.\": {\r\n+ \"category\": \"Error\",\r\n+ \"code\": 4125\r\n+ },\r\n+ \"One value of '{0}.{1}' is the string '{2}', and the other is assumed to be an unknown numeric value.\": {\r\n+ \"category\": \"Error\",\r\n+ \"code\": 4126\r\n+ },\r\n \r\n \"The current host does not support the '{0}' option.\": {\r\n \"category\": \"Error\",\r\ndiff --git a/src/compiler/types.ts b/src/compiler/types.ts\nindex 6b7548280c60..b8aab9a8563c 100644\n--- a/src/compiler/types.ts\n+++ b/src/compiler/types.ts\n@@ -916,6 +916,7 @@ export const enum JsxFlags {\n // dprint-ignore\r\n /** @internal */\r\n export const enum RelationComparisonResult {\r\n+ None = 0,\r\n Succeeded = 1 << 0, // Should be truthy\r\n Failed = 1 << 1,\r\n Reported = 1 << 2,\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat3.errors.txt b/tests/baselines/reference/enumAssignmentCompat3.errors.txt\nindex efe726d5ddae..9c10fd6b13d9 100644\n--- a/tests/baselines/reference/enumAssignmentCompat3.errors.txt\n+++ b/tests/baselines/reference/enumAssignmentCompat3.errors.txt\n@@ -1,20 +1,26 @@\n enumAssignmentCompat3.ts(68,1): error TS2322: Type 'Abcd.E' is not assignable to type 'First.E'.\r\n Property 'd' is missing in type 'First.E'.\r\n enumAssignmentCompat3.ts(70,1): error TS2322: Type 'Cd.E' is not assignable to type 'First.E'.\r\n- Property 'd' is missing in type 'First.E'.\r\n+ Each declaration of 'E.c' differs in its value, where '2' was expected but '0' was given.\r\n enumAssignmentCompat3.ts(71,1): error TS2322: Type 'Nope' is not assignable to type 'E'.\r\n+enumAssignmentCompat3.ts(72,1): error TS2322: Type 'Decl.E' is not assignable to type 'First.E'.\r\n+ Each declaration of 'E.c' differs in its value, where '2' was expected but '3' was given.\r\n enumAssignmentCompat3.ts(75,1): error TS2322: Type 'First.E' is not assignable to type 'Ab.E'.\r\n Property 'c' is missing in type 'Ab.E'.\r\n enumAssignmentCompat3.ts(76,1): error TS2322: Type 'First.E' is not assignable to type 'Cd.E'.\r\n Property 'a' is missing in type 'Cd.E'.\r\n enumAssignmentCompat3.ts(77,1): error TS2322: Type 'E' is not assignable to type 'Nope'.\r\n+enumAssignmentCompat3.ts(78,1): error TS2322: Type 'First.E' is not assignable to type 'Decl.E'.\r\n+ Each declaration of 'E.c' differs in its value, where '3' was expected but '2' was given.\r\n enumAssignmentCompat3.ts(82,1): error TS2322: Type 'Const.E' is not assignable to type 'First.E'.\r\n enumAssignmentCompat3.ts(83,1): error TS2322: Type 'First.E' is not assignable to type 'Const.E'.\r\n enumAssignmentCompat3.ts(86,1): error TS2322: Type 'Merged.E' is not assignable to type 'First.E'.\r\n- Property 'd' is missing in type 'First.E'.\r\n+ Each declaration of 'E.c' differs in its value, where '2' was expected but '3' was given.\r\n+enumAssignmentCompat3.ts(87,1): error TS2322: Type 'First.E' is not assignable to type 'Merged.E'.\r\n+ Each declaration of 'E.c' differs in its value, where '3' was expected but '2' was given.\r\n \r\n \r\n-==== enumAssignmentCompat3.ts (9 errors) ====\r\n+==== enumAssignmentCompat3.ts (12 errors) ====\r\n namespace First {\r\n export enum E {\r\n a, b, c,\r\n@@ -90,11 +96,14 @@ enumAssignmentCompat3.ts(86,1): error TS2322: Type 'Merged.E' is not assignable\n abc = secondCd; // missing 'd'\r\n ~~~\r\n !!! error TS2322: Type 'Cd.E' is not assignable to type 'First.E'.\r\n-!!! error TS2322: Property 'd' is missing in type 'First.E'.\r\n+!!! error TS2322: Each declaration of 'E.c' differs in its value, where '2' was expected but '0' was given.\r\n abc = nope; // nope!\r\n ~~~\r\n !!! error TS2322: Type 'Nope' is not assignable to type 'E'.\r\n- abc = decl; // ok\r\n+ abc = decl; // bad - value of 'c' differs between these enums\r\n+ ~~~\r\n+!!! error TS2322: Type 'Decl.E' is not assignable to type 'First.E'.\r\n+!!! error TS2322: Each declaration of 'E.c' differs in its value, where '2' was expected but '3' was given.\r\n secondAbc = abc; // ok\r\n secondAbcd = abc; // ok\r\n secondAb = abc; // missing 'c'\r\n@@ -108,7 +117,10 @@ enumAssignmentCompat3.ts(86,1): error TS2322: Type 'Merged.E' is not assignable\n nope = abc; // nope!\r\n ~~~~\r\n !!! error TS2322: Type 'E' is not assignable to type 'Nope'.\r\n- decl = abc; // ok\r\n+ decl = abc; // bad - value of 'c' differs between these enums\r\n+ ~~~~\r\n+!!! error TS2322: Type 'First.E' is not assignable to type 'Decl.E'.\r\n+!!! error TS2322: Each declaration of 'E.c' differs in its value, where '3' was expected but '2' was given.\r\n \r\n // const is only assignable to itself\r\n k = k;\r\n@@ -123,7 +135,10 @@ enumAssignmentCompat3.ts(86,1): error TS2322: Type 'Merged.E' is not assignable\n abc = merged; // missing 'd'\r\n ~~~\r\n !!! error TS2322: Type 'Merged.E' is not assignable to type 'First.E'.\r\n-!!! error TS2322: Property 'd' is missing in type 'First.E'.\r\n- merged = abc; // ok\r\n+!!! error TS2322: Each declaration of 'E.c' differs in its value, where '2' was expected but '3' was given.\r\n+ merged = abc; // bad - value of 'c' differs between these enums\r\n+ ~~~~~~\r\n+!!! error TS2322: Type 'First.E' is not assignable to type 'Merged.E'.\r\n+!!! error TS2322: Each declaration of 'E.c' differs in its value, where '3' was expected but '2' was given.\r\n abc = merged2; // ok\r\n merged2 = abc; // ok\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/enumAssignmentCompat3.js b/tests/baselines/reference/enumAssignmentCompat3.js\nindex ac83fb96c317..755ddb169cfe 100644\n--- a/tests/baselines/reference/enumAssignmentCompat3.js\n+++ b/tests/baselines/reference/enumAssignmentCompat3.js\n@@ -72,13 +72,13 @@ abc = secondAbcd; // missing 'd'\n abc = secondAb; // ok\n abc = secondCd; // missing 'd'\n abc = nope; // nope!\n-abc = decl; // ok\n+abc = decl; // bad - value of 'c' differs between these enums\n secondAbc = abc; // ok\n secondAbcd = abc; // ok\n secondAb = abc; // missing 'c'\n secondCd = abc; // missing 'a' and 'b'\n nope = abc; // nope!\n-decl = abc; // ok\n+decl = abc; // bad - value of 'c' differs between these enums\n \n // const is only assignable to itself\n k = k;\n@@ -87,7 +87,7 @@ k = abc;\n \n // merged enums compare all their members\n abc = merged; // missing 'd'\n-merged = abc; // ok\n+merged = abc; // bad - value of 'c' differs between these enums\n abc = merged2; // ok\n merged2 = abc; // ok\r\n \r\n@@ -184,19 +184,19 @@ abc = secondAbcd; // missing 'd'\n abc = secondAb; // ok\r\n abc = secondCd; // missing 'd'\r\n abc = nope; // nope!\r\n-abc = decl; // ok\r\n+abc = decl; // bad - value of 'c' differs between these enums\r\n secondAbc = abc; // ok\r\n secondAbcd = abc; // ok\r\n secondAb = abc; // missing 'c'\r\n secondCd = abc; // missing 'a' and 'b'\r\n nope = abc; // nope!\r\n-decl = abc; // ok\r\n+decl = abc; // bad - value of 'c' differs between these enums\r\n // const is only assignable to itself\r\n k = k;\r\n abc = k; // error\r\n k = abc;\r\n // merged enums compare all their members\r\n abc = merged; // missing 'd'\r\n-merged = abc; // ok\r\n+merged = abc; // bad - value of 'c' differs between these enums\r\n abc = merged2; // ok\r\n merged2 = abc; // ok\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat3.symbols b/tests/baselines/reference/enumAssignmentCompat3.symbols\nindex 08b78e85f3a0..00ee430fc60b 100644\n--- a/tests/baselines/reference/enumAssignmentCompat3.symbols\n+++ b/tests/baselines/reference/enumAssignmentCompat3.symbols\n@@ -200,7 +200,7 @@ abc = nope; // nope!\n >abc : Symbol(abc, Decl(enumAssignmentCompat3.ts, 56, 3))\r\n >nope : Symbol(nope, Decl(enumAssignmentCompat3.ts, 61, 3))\r\n \r\n-abc = decl; // ok\r\n+abc = decl; // bad - value of 'c' differs between these enums\r\n >abc : Symbol(abc, Decl(enumAssignmentCompat3.ts, 56, 3))\r\n >decl : Symbol(decl, Decl(enumAssignmentCompat3.ts, 63, 3))\r\n \r\n@@ -224,7 +224,7 @@ nope = abc; // nope!\n >nope : Symbol(nope, Decl(enumAssignmentCompat3.ts, 61, 3))\r\n >abc : Symbol(abc, Decl(enumAssignmentCompat3.ts, 56, 3))\r\n \r\n-decl = abc; // ok\r\n+decl = abc; // bad - value of 'c' differs between these enums\r\n >decl : Symbol(decl, Decl(enumAssignmentCompat3.ts, 63, 3))\r\n >abc : Symbol(abc, Decl(enumAssignmentCompat3.ts, 56, 3))\r\n \r\n@@ -246,7 +246,7 @@ abc = merged; // missing 'd'\n >abc : Symbol(abc, Decl(enumAssignmentCompat3.ts, 56, 3))\r\n >merged : Symbol(merged, Decl(enumAssignmentCompat3.ts, 64, 3))\r\n \r\n-merged = abc; // ok\r\n+merged = abc; // bad - value of 'c' differs between these enums\r\n >merged : Symbol(merged, Decl(enumAssignmentCompat3.ts, 64, 3))\r\n >abc : Symbol(abc, Decl(enumAssignmentCompat3.ts, 56, 3))\r\n \r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat3.types b/tests/baselines/reference/enumAssignmentCompat3.types\nindex cc72b6777ba9..e1f98a739c8c 100644\n--- a/tests/baselines/reference/enumAssignmentCompat3.types\n+++ b/tests/baselines/reference/enumAssignmentCompat3.types\n@@ -196,7 +196,7 @@ abc = nope; // nope!\n >abc : First.E\r\n >nope : Abc.Nope\r\n \r\n-abc = decl; // ok\r\n+abc = decl; // bad - value of 'c' differs between these enums\r\n >abc = decl : Decl.E\r\n >abc : First.E\r\n >decl : Decl.E\r\n@@ -226,7 +226,7 @@ nope = abc; // nope!\n >nope : Abc.Nope\r\n >abc : First.E\r\n \r\n-decl = abc; // ok\r\n+decl = abc; // bad - value of 'c' differs between these enums\r\n >decl = abc : First.E\r\n >decl : Decl.E\r\n >abc : First.E\r\n@@ -253,7 +253,7 @@ abc = merged; // missing 'd'\n >abc : First.E\r\n >merged : Merged.E\r\n \r\n-merged = abc; // ok\r\n+merged = abc; // bad - value of 'c' differs between these enums\r\n >merged = abc : First.E\r\n >merged : Merged.E\r\n >abc : First.E\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat6.errors.txt b/tests/baselines/reference/enumAssignmentCompat6.errors.txt\nnew file mode 100644\nindex 000000000000..6fa72a1d05f1\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat6.errors.txt\n@@ -0,0 +1,115 @@\n+f.ts(37,5): error TS2322: Type 'strings.DiagnosticCategory' is not assignable to type 'numerics.DiagnosticCategory'.\r\n+ Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '0' was expected but '\"Warning\"' was given.\r\n+f.ts(38,5): error TS2322: Type 'numerics.DiagnosticCategory' is not assignable to type 'strings.DiagnosticCategory'.\r\n+ Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '\"Warning\"' was expected but '0' was given.\r\n+f.ts(42,5): error TS2322: Type 'DiagnosticCategory' is not assignable to type 'DiagnosticCategory2'.\r\n+f.ts(43,5): error TS2322: Type 'DiagnosticCategory2' is not assignable to type 'DiagnosticCategory'.\r\n+f.ts(52,5): error TS2322: Type 'ambients.DiagnosticCategory' is not assignable to type 'strings.DiagnosticCategory'.\r\n+ One value of 'DiagnosticCategory.Warning' is the string '\"Warning\"', and the other is assumed to be an unknown numeric value.\r\n+f.ts(53,5): error TS2322: Type 'strings.DiagnosticCategory' is not assignable to type 'ambients.DiagnosticCategory'.\r\n+ One value of 'DiagnosticCategory.Warning' is the string '\"Warning\"', and the other is assumed to be an unknown numeric value.\r\n+f.ts(73,9): error TS2322: Type 'DiagnosticCategory' is not assignable to type 'import(\"f\").DiagnosticCategory'.\r\n+ Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '0' was expected but '\"Warning\"' was given.\r\n+f.ts(74,9): error TS2322: Type 'import(\"f\").DiagnosticCategory' is not assignable to type 'DiagnosticCategory'.\r\n+ Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '\"Warning\"' was expected but '0' was given.\r\n+\r\n+\r\n+==== f.ts (8 errors) ====\r\n+ // @filename a.ts\r\n+ namespace numerics {\r\n+ export enum DiagnosticCategory {\r\n+ Warning,\r\n+ Error,\r\n+ Suggestion,\r\n+ Message,\r\n+ }\r\n+ \r\n+ export enum DiagnosticCategory2 {\r\n+ Warning,\r\n+ Error,\r\n+ Suggestion,\r\n+ Message,\r\n+ }\r\n+ }\r\n+ \r\n+ namespace strings {\r\n+ export enum DiagnosticCategory {\r\n+ Warning = \"Warning\",\r\n+ Error = \"Error\",\r\n+ Suggestion = \"Suggestion\",\r\n+ Message = \"Message\",\r\n+ }\r\n+ }\r\n+ \r\n+ declare namespace ambients {\r\n+ export enum DiagnosticCategory {\r\n+ Warning,\r\n+ Error,\r\n+ Suggestion,\r\n+ Message,\r\n+ }\r\n+ }\r\n+ \r\n+ function f(x: numerics.DiagnosticCategory, y: strings.DiagnosticCategory) {\r\n+ x = y;\r\n+ ~\r\n+!!! error TS2322: Type 'strings.DiagnosticCategory' is not assignable to type 'numerics.DiagnosticCategory'.\r\n+!!! error TS2322: Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '0' was expected but '\"Warning\"' was given.\r\n+ y = x;\r\n+ ~\r\n+!!! error TS2322: Type 'numerics.DiagnosticCategory' is not assignable to type 'strings.DiagnosticCategory'.\r\n+!!! error TS2322: Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '\"Warning\"' was expected but '0' was given.\r\n+ }\r\n+ \r\n+ function g(x: numerics.DiagnosticCategory2, y: strings.DiagnosticCategory) {\r\n+ x = y;\r\n+ ~\r\n+!!! error TS2322: Type 'DiagnosticCategory' is not assignable to type 'DiagnosticCategory2'.\r\n+ y = x;\r\n+ ~\r\n+!!! error TS2322: Type 'DiagnosticCategory2' is not assignable to type 'DiagnosticCategory'.\r\n+ }\r\n+ \r\n+ function h(x: numerics.DiagnosticCategory, y: ambients.DiagnosticCategory) {\r\n+ x = y;\r\n+ y = x;\r\n+ }\r\n+ \r\n+ function i(x: strings.DiagnosticCategory, y: ambients.DiagnosticCategory) {\r\n+ x = y;\r\n+ ~\r\n+!!! error TS2322: Type 'ambients.DiagnosticCategory' is not assignable to type 'strings.DiagnosticCategory'.\r\n+!!! error TS2322: One value of 'DiagnosticCategory.Warning' is the string '\"Warning\"', and the other is assumed to be an unknown numeric value.\r\n+ y = x;\r\n+ ~\r\n+!!! error TS2322: Type 'strings.DiagnosticCategory' is not assignable to type 'ambients.DiagnosticCategory'.\r\n+!!! error TS2322: One value of 'DiagnosticCategory.Warning' is the string '\"Warning\"', and the other is assumed to be an unknown numeric value.\r\n+ }\r\n+ \r\n+ export enum DiagnosticCategory {\r\n+ Warning,\r\n+ Error,\r\n+ Suggestion,\r\n+ Message,\r\n+ }\r\n+ \r\n+ export let x: DiagnosticCategory;\r\n+ \r\n+ (() => {\r\n+ enum DiagnosticCategory {\r\n+ Warning = \"Warning\",\r\n+ Error = \"Error\",\r\n+ Suggestion = \"Suggestion\",\r\n+ Message = \"Message\",\r\n+ }\r\n+ function f(y: DiagnosticCategory) {\r\n+ x = y;\r\n+ ~\r\n+!!! error TS2322: Type 'DiagnosticCategory' is not assignable to type 'import(\"f\").DiagnosticCategory'.\r\n+!!! error TS2322: Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '0' was expected but '\"Warning\"' was given.\r\n+ y = x;\r\n+ ~\r\n+!!! error TS2322: Type 'import(\"f\").DiagnosticCategory' is not assignable to type 'DiagnosticCategory'.\r\n+!!! error TS2322: Each declaration of 'DiagnosticCategory.Warning' differs in its value, where '\"Warning\"' was expected but '0' was given.\r\n+ }\r\n+ })()\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/enumAssignmentCompat6.js b/tests/baselines/reference/enumAssignmentCompat6.js\nnew file mode 100644\nindex 000000000000..a8cde20aacf6\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat6.js\n@@ -0,0 +1,148 @@\n+//// [tests/cases/compiler/enumAssignmentCompat6.ts] ////\r\n+\r\n+//// [f.ts]\r\n+// @filename a.ts\n+namespace numerics {\n+ export enum DiagnosticCategory {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+ }\n+\n+ export enum DiagnosticCategory2 {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+ }\n+}\n+\n+namespace strings {\n+ export enum DiagnosticCategory {\n+ Warning = \"Warning\",\n+ Error = \"Error\",\n+ Suggestion = \"Suggestion\",\n+ Message = \"Message\",\n+ }\n+}\n+\n+declare namespace ambients {\n+ export enum DiagnosticCategory {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+ }\n+}\n+\n+function f(x: numerics.DiagnosticCategory, y: strings.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+function g(x: numerics.DiagnosticCategory2, y: strings.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+function h(x: numerics.DiagnosticCategory, y: ambients.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+function i(x: strings.DiagnosticCategory, y: ambients.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+export enum DiagnosticCategory {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+}\n+\n+export let x: DiagnosticCategory;\n+\n+(() => {\n+ enum DiagnosticCategory {\n+ Warning = \"Warning\",\n+ Error = \"Error\",\n+ Suggestion = \"Suggestion\",\n+ Message = \"Message\",\n+ }\n+ function f(y: DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+ }\n+})()\r\n+\r\n+//// [f.js]\r\n+\"use strict\";\r\n+Object.defineProperty(exports, \"__esModule\", { value: true });\r\n+exports.x = exports.DiagnosticCategory = void 0;\r\n+// @filename a.ts\r\n+var numerics;\r\n+(function (numerics) {\r\n+ var DiagnosticCategory;\r\n+ (function (DiagnosticCategory) {\r\n+ DiagnosticCategory[DiagnosticCategory[\"Warning\"] = 0] = \"Warning\";\r\n+ DiagnosticCategory[DiagnosticCategory[\"Error\"] = 1] = \"Error\";\r\n+ DiagnosticCategory[DiagnosticCategory[\"Suggestion\"] = 2] = \"Suggestion\";\r\n+ DiagnosticCategory[DiagnosticCategory[\"Message\"] = 3] = \"Message\";\r\n+ })(DiagnosticCategory = numerics.DiagnosticCategory || (numerics.DiagnosticCategory = {}));\r\n+ var DiagnosticCategory2;\r\n+ (function (DiagnosticCategory2) {\r\n+ DiagnosticCategory2[DiagnosticCategory2[\"Warning\"] = 0] = \"Warning\";\r\n+ DiagnosticCategory2[DiagnosticCategory2[\"Error\"] = 1] = \"Error\";\r\n+ DiagnosticCategory2[DiagnosticCategory2[\"Suggestion\"] = 2] = \"Suggestion\";\r\n+ DiagnosticCategory2[DiagnosticCategory2[\"Message\"] = 3] = \"Message\";\r\n+ })(DiagnosticCategory2 = numerics.DiagnosticCategory2 || (numerics.DiagnosticCategory2 = {}));\r\n+})(numerics || (numerics = {}));\r\n+var strings;\r\n+(function (strings) {\r\n+ var DiagnosticCategory;\r\n+ (function (DiagnosticCategory) {\r\n+ DiagnosticCategory[\"Warning\"] = \"Warning\";\r\n+ DiagnosticCategory[\"Error\"] = \"Error\";\r\n+ DiagnosticCategory[\"Suggestion\"] = \"Suggestion\";\r\n+ DiagnosticCategory[\"Message\"] = \"Message\";\r\n+ })(DiagnosticCategory = strings.DiagnosticCategory || (strings.DiagnosticCategory = {}));\r\n+})(strings || (strings = {}));\r\n+function f(x, y) {\r\n+ x = y;\r\n+ y = x;\r\n+}\r\n+function g(x, y) {\r\n+ x = y;\r\n+ y = x;\r\n+}\r\n+function h(x, y) {\r\n+ x = y;\r\n+ y = x;\r\n+}\r\n+function i(x, y) {\r\n+ x = y;\r\n+ y = x;\r\n+}\r\n+var DiagnosticCategory;\r\n+(function (DiagnosticCategory) {\r\n+ DiagnosticCategory[DiagnosticCategory[\"Warning\"] = 0] = \"Warning\";\r\n+ DiagnosticCategory[DiagnosticCategory[\"Error\"] = 1] = \"Error\";\r\n+ DiagnosticCategory[DiagnosticCategory[\"Suggestion\"] = 2] = \"Suggestion\";\r\n+ DiagnosticCategory[DiagnosticCategory[\"Message\"] = 3] = \"Message\";\r\n+})(DiagnosticCategory || (exports.DiagnosticCategory = DiagnosticCategory = {}));\r\n+(function () {\r\n+ var DiagnosticCategory;\r\n+ (function (DiagnosticCategory) {\r\n+ DiagnosticCategory[\"Warning\"] = \"Warning\";\r\n+ DiagnosticCategory[\"Error\"] = \"Error\";\r\n+ DiagnosticCategory[\"Suggestion\"] = \"Suggestion\";\r\n+ DiagnosticCategory[\"Message\"] = \"Message\";\r\n+ })(DiagnosticCategory || (DiagnosticCategory = {}));\r\n+ function f(y) {\r\n+ exports.x = y;\r\n+ y = exports.x;\r\n+ }\r\n+})();\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat6.symbols b/tests/baselines/reference/enumAssignmentCompat6.symbols\nnew file mode 100644\nindex 000000000000..fcf2c4f1637f\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat6.symbols\n@@ -0,0 +1,202 @@\n+//// [tests/cases/compiler/enumAssignmentCompat6.ts] ////\r\n+\r\n+=== f.ts ===\r\n+// @filename a.ts\r\n+namespace numerics {\r\n+>numerics : Symbol(numerics, Decl(f.ts, 0, 0))\r\n+\r\n+ export enum DiagnosticCategory {\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 1, 20))\r\n+\r\n+ Warning,\r\n+>Warning : Symbol(DiagnosticCategory.Warning, Decl(f.ts, 2, 36))\r\n+\r\n+ Error,\r\n+>Error : Symbol(DiagnosticCategory.Error, Decl(f.ts, 3, 16))\r\n+\r\n+ Suggestion,\r\n+>Suggestion : Symbol(DiagnosticCategory.Suggestion, Decl(f.ts, 4, 14))\r\n+\r\n+ Message,\r\n+>Message : Symbol(DiagnosticCategory.Message, Decl(f.ts, 5, 19))\r\n+ }\r\n+\r\n+ export enum DiagnosticCategory2 {\r\n+>DiagnosticCategory2 : Symbol(DiagnosticCategory2, Decl(f.ts, 7, 5))\r\n+\r\n+ Warning,\r\n+>Warning : Symbol(DiagnosticCategory2.Warning, Decl(f.ts, 9, 37))\r\n+\r\n+ Error,\r\n+>Error : Symbol(DiagnosticCategory2.Error, Decl(f.ts, 10, 16))\r\n+\r\n+ Suggestion,\r\n+>Suggestion : Symbol(DiagnosticCategory2.Suggestion, Decl(f.ts, 11, 14))\r\n+\r\n+ Message,\r\n+>Message : Symbol(DiagnosticCategory2.Message, Decl(f.ts, 12, 19))\r\n+ }\r\n+}\r\n+\r\n+namespace strings {\r\n+>strings : Symbol(strings, Decl(f.ts, 15, 1))\r\n+\r\n+ export enum DiagnosticCategory {\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 17, 19))\r\n+\r\n+ Warning = \"Warning\",\r\n+>Warning : Symbol(DiagnosticCategory.Warning, Decl(f.ts, 18, 36))\r\n+\r\n+ Error = \"Error\",\r\n+>Error : Symbol(DiagnosticCategory.Error, Decl(f.ts, 19, 28))\r\n+\r\n+ Suggestion = \"Suggestion\",\r\n+>Suggestion : Symbol(DiagnosticCategory.Suggestion, Decl(f.ts, 20, 24))\r\n+\r\n+ Message = \"Message\",\r\n+>Message : Symbol(DiagnosticCategory.Message, Decl(f.ts, 21, 34))\r\n+ }\r\n+}\r\n+\r\n+declare namespace ambients {\r\n+>ambients : Symbol(ambients, Decl(f.ts, 24, 1))\r\n+\r\n+ export enum DiagnosticCategory {\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 26, 28))\r\n+\r\n+ Warning,\r\n+>Warning : Symbol(DiagnosticCategory.Warning, Decl(f.ts, 27, 36))\r\n+\r\n+ Error,\r\n+>Error : Symbol(DiagnosticCategory.Error, Decl(f.ts, 28, 16))\r\n+\r\n+ Suggestion,\r\n+>Suggestion : Symbol(DiagnosticCategory.Suggestion, Decl(f.ts, 29, 14))\r\n+\r\n+ Message,\r\n+>Message : Symbol(DiagnosticCategory.Message, Decl(f.ts, 30, 19))\r\n+ }\r\n+}\r\n+\r\n+function f(x: numerics.DiagnosticCategory, y: strings.DiagnosticCategory) {\r\n+>f : Symbol(f, Decl(f.ts, 33, 1))\r\n+>x : Symbol(x, Decl(f.ts, 35, 11))\r\n+>numerics : Symbol(numerics, Decl(f.ts, 0, 0))\r\n+>DiagnosticCategory : Symbol(numerics.DiagnosticCategory, Decl(f.ts, 1, 20))\r\n+>y : Symbol(y, Decl(f.ts, 35, 42))\r\n+>strings : Symbol(strings, Decl(f.ts, 15, 1))\r\n+>DiagnosticCategory : Symbol(strings.DiagnosticCategory, Decl(f.ts, 17, 19))\r\n+\r\n+ x = y;\r\n+>x : Symbol(x, Decl(f.ts, 35, 11))\r\n+>y : Symbol(y, Decl(f.ts, 35, 42))\r\n+\r\n+ y = x;\r\n+>y : Symbol(y, Decl(f.ts, 35, 42))\r\n+>x : Symbol(x, Decl(f.ts, 35, 11))\r\n+}\r\n+\r\n+function g(x: numerics.DiagnosticCategory2, y: strings.DiagnosticCategory) {\r\n+>g : Symbol(g, Decl(f.ts, 38, 1))\r\n+>x : Symbol(x, Decl(f.ts, 40, 11))\r\n+>numerics : Symbol(numerics, Decl(f.ts, 0, 0))\r\n+>DiagnosticCategory2 : Symbol(numerics.DiagnosticCategory2, Decl(f.ts, 7, 5))\r\n+>y : Symbol(y, Decl(f.ts, 40, 43))\r\n+>strings : Symbol(strings, Decl(f.ts, 15, 1))\r\n+>DiagnosticCategory : Symbol(strings.DiagnosticCategory, Decl(f.ts, 17, 19))\r\n+\r\n+ x = y;\r\n+>x : Symbol(x, Decl(f.ts, 40, 11))\r\n+>y : Symbol(y, Decl(f.ts, 40, 43))\r\n+\r\n+ y = x;\r\n+>y : Symbol(y, Decl(f.ts, 40, 43))\r\n+>x : Symbol(x, Decl(f.ts, 40, 11))\r\n+}\r\n+\r\n+function h(x: numerics.DiagnosticCategory, y: ambients.DiagnosticCategory) {\r\n+>h : Symbol(h, Decl(f.ts, 43, 1))\r\n+>x : Symbol(x, Decl(f.ts, 45, 11))\r\n+>numerics : Symbol(numerics, Decl(f.ts, 0, 0))\r\n+>DiagnosticCategory : Symbol(numerics.DiagnosticCategory, Decl(f.ts, 1, 20))\r\n+>y : Symbol(y, Decl(f.ts, 45, 42))\r\n+>ambients : Symbol(ambients, Decl(f.ts, 24, 1))\r\n+>DiagnosticCategory : Symbol(ambients.DiagnosticCategory, Decl(f.ts, 26, 28))\r\n+\r\n+ x = y;\r\n+>x : Symbol(x, Decl(f.ts, 45, 11))\r\n+>y : Symbol(y, Decl(f.ts, 45, 42))\r\n+\r\n+ y = x;\r\n+>y : Symbol(y, Decl(f.ts, 45, 42))\r\n+>x : Symbol(x, Decl(f.ts, 45, 11))\r\n+}\r\n+\r\n+function i(x: strings.DiagnosticCategory, y: ambients.DiagnosticCategory) {\r\n+>i : Symbol(i, Decl(f.ts, 48, 1))\r\n+>x : Symbol(x, Decl(f.ts, 50, 11))\r\n+>strings : Symbol(strings, Decl(f.ts, 15, 1))\r\n+>DiagnosticCategory : Symbol(strings.DiagnosticCategory, Decl(f.ts, 17, 19))\r\n+>y : Symbol(y, Decl(f.ts, 50, 41))\r\n+>ambients : Symbol(ambients, Decl(f.ts, 24, 1))\r\n+>DiagnosticCategory : Symbol(ambients.DiagnosticCategory, Decl(f.ts, 26, 28))\r\n+\r\n+ x = y;\r\n+>x : Symbol(x, Decl(f.ts, 50, 11))\r\n+>y : Symbol(y, Decl(f.ts, 50, 41))\r\n+\r\n+ y = x;\r\n+>y : Symbol(y, Decl(f.ts, 50, 41))\r\n+>x : Symbol(x, Decl(f.ts, 50, 11))\r\n+}\r\n+\r\n+export enum DiagnosticCategory {\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 53, 1))\r\n+\r\n+ Warning,\r\n+>Warning : Symbol(DiagnosticCategory.Warning, Decl(f.ts, 55, 32))\r\n+\r\n+ Error,\r\n+>Error : Symbol(DiagnosticCategory.Error, Decl(f.ts, 56, 12))\r\n+\r\n+ Suggestion,\r\n+>Suggestion : Symbol(DiagnosticCategory.Suggestion, Decl(f.ts, 57, 10))\r\n+\r\n+ Message,\r\n+>Message : Symbol(DiagnosticCategory.Message, Decl(f.ts, 58, 15))\r\n+}\r\n+\r\n+export let x: DiagnosticCategory;\r\n+>x : Symbol(x, Decl(f.ts, 62, 10))\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 53, 1))\r\n+\r\n+(() => {\r\n+ enum DiagnosticCategory {\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 64, 8))\r\n+\r\n+ Warning = \"Warning\",\r\n+>Warning : Symbol(DiagnosticCategory.Warning, Decl(f.ts, 65, 29))\r\n+\r\n+ Error = \"Error\",\r\n+>Error : Symbol(DiagnosticCategory.Error, Decl(f.ts, 66, 28))\r\n+\r\n+ Suggestion = \"Suggestion\",\r\n+>Suggestion : Symbol(DiagnosticCategory.Suggestion, Decl(f.ts, 67, 24))\r\n+\r\n+ Message = \"Message\",\r\n+>Message : Symbol(DiagnosticCategory.Message, Decl(f.ts, 68, 34))\r\n+ }\r\n+ function f(y: DiagnosticCategory) {\r\n+>f : Symbol(f, Decl(f.ts, 70, 5))\r\n+>y : Symbol(y, Decl(f.ts, 71, 15))\r\n+>DiagnosticCategory : Symbol(DiagnosticCategory, Decl(f.ts, 64, 8))\r\n+\r\n+ x = y;\r\n+>x : Symbol(x, Decl(f.ts, 62, 10))\r\n+>y : Symbol(y, Decl(f.ts, 71, 15))\r\n+\r\n+ y = x;\r\n+>y : Symbol(y, Decl(f.ts, 71, 15))\r\n+>x : Symbol(x, Decl(f.ts, 62, 10))\r\n+ }\r\n+})()\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat6.types b/tests/baselines/reference/enumAssignmentCompat6.types\nnew file mode 100644\nindex 000000000000..ff464f41afb2\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat6.types\n@@ -0,0 +1,214 @@\n+//// [tests/cases/compiler/enumAssignmentCompat6.ts] ////\r\n+\r\n+=== f.ts ===\r\n+// @filename a.ts\r\n+namespace numerics {\r\n+>numerics : typeof numerics\r\n+\r\n+ export enum DiagnosticCategory {\r\n+>DiagnosticCategory : DiagnosticCategory\r\n+\r\n+ Warning,\r\n+>Warning : DiagnosticCategory.Warning\r\n+\r\n+ Error,\r\n+>Error : DiagnosticCategory.Error\r\n+\r\n+ Suggestion,\r\n+>Suggestion : DiagnosticCategory.Suggestion\r\n+\r\n+ Message,\r\n+>Message : DiagnosticCategory.Message\r\n+ }\r\n+\r\n+ export enum DiagnosticCategory2 {\r\n+>DiagnosticCategory2 : DiagnosticCategory2\r\n+\r\n+ Warning,\r\n+>Warning : DiagnosticCategory2.Warning\r\n+\r\n+ Error,\r\n+>Error : DiagnosticCategory2.Error\r\n+\r\n+ Suggestion,\r\n+>Suggestion : DiagnosticCategory2.Suggestion\r\n+\r\n+ Message,\r\n+>Message : DiagnosticCategory2.Message\r\n+ }\r\n+}\r\n+\r\n+namespace strings {\r\n+>strings : typeof strings\r\n+\r\n+ export enum DiagnosticCategory {\r\n+>DiagnosticCategory : DiagnosticCategory\r\n+\r\n+ Warning = \"Warning\",\r\n+>Warning : DiagnosticCategory.Warning\r\n+>\"Warning\" : \"Warning\"\r\n+\r\n+ Error = \"Error\",\r\n+>Error : DiagnosticCategory.Error\r\n+>\"Error\" : \"Error\"\r\n+\r\n+ Suggestion = \"Suggestion\",\r\n+>Suggestion : DiagnosticCategory.Suggestion\r\n+>\"Suggestion\" : \"Suggestion\"\r\n+\r\n+ Message = \"Message\",\r\n+>Message : DiagnosticCategory.Message\r\n+>\"Message\" : \"Message\"\r\n+ }\r\n+}\r\n+\r\n+declare namespace ambients {\r\n+>ambients : typeof ambients\r\n+\r\n+ export enum DiagnosticCategory {\r\n+>DiagnosticCategory : DiagnosticCategory\r\n+\r\n+ Warning,\r\n+>Warning : DiagnosticCategory.Warning\r\n+\r\n+ Error,\r\n+>Error : DiagnosticCategory.Error\r\n+\r\n+ Suggestion,\r\n+>Suggestion : DiagnosticCategory.Suggestion\r\n+\r\n+ Message,\r\n+>Message : DiagnosticCategory.Message\r\n+ }\r\n+}\r\n+\r\n+function f(x: numerics.DiagnosticCategory, y: strings.DiagnosticCategory) {\r\n+>f : (x: numerics.DiagnosticCategory, y: strings.DiagnosticCategory) => void\r\n+>x : numerics.DiagnosticCategory\r\n+>numerics : any\r\n+>y : strings.DiagnosticCategory\r\n+>strings : any\r\n+\r\n+ x = y;\r\n+>x = y : strings.DiagnosticCategory\r\n+>x : numerics.DiagnosticCategory\r\n+>y : strings.DiagnosticCategory\r\n+\r\n+ y = x;\r\n+>y = x : numerics.DiagnosticCategory\r\n+>y : strings.DiagnosticCategory\r\n+>x : numerics.DiagnosticCategory\r\n+}\r\n+\r\n+function g(x: numerics.DiagnosticCategory2, y: strings.DiagnosticCategory) {\r\n+>g : (x: numerics.DiagnosticCategory2, y: strings.DiagnosticCategory) => void\r\n+>x : numerics.DiagnosticCategory2\r\n+>numerics : any\r\n+>y : strings.DiagnosticCategory\r\n+>strings : any\r\n+\r\n+ x = y;\r\n+>x = y : strings.DiagnosticCategory\r\n+>x : numerics.DiagnosticCategory2\r\n+>y : strings.DiagnosticCategory\r\n+\r\n+ y = x;\r\n+>y = x : numerics.DiagnosticCategory2\r\n+>y : strings.DiagnosticCategory\r\n+>x : numerics.DiagnosticCategory2\r\n+}\r\n+\r\n+function h(x: numerics.DiagnosticCategory, y: ambients.DiagnosticCategory) {\r\n+>h : (x: numerics.DiagnosticCategory, y: ambients.DiagnosticCategory) => void\r\n+>x : numerics.DiagnosticCategory\r\n+>numerics : any\r\n+>y : ambients.DiagnosticCategory\r\n+>ambients : any\r\n+\r\n+ x = y;\r\n+>x = y : ambients.DiagnosticCategory\r\n+>x : numerics.DiagnosticCategory\r\n+>y : ambients.DiagnosticCategory\r\n+\r\n+ y = x;\r\n+>y = x : numerics.DiagnosticCategory\r\n+>y : ambients.DiagnosticCategory\r\n+>x : numerics.DiagnosticCategory\r\n+}\r\n+\r\n+function i(x: strings.DiagnosticCategory, y: ambients.DiagnosticCategory) {\r\n+>i : (x: strings.DiagnosticCategory, y: ambients.DiagnosticCategory) => void\r\n+>x : strings.DiagnosticCategory\r\n+>strings : any\r\n+>y : ambients.DiagnosticCategory\r\n+>ambients : any\r\n+\r\n+ x = y;\r\n+>x = y : ambients.DiagnosticCategory\r\n+>x : strings.DiagnosticCategory\r\n+>y : ambients.DiagnosticCategory\r\n+\r\n+ y = x;\r\n+>y = x : strings.DiagnosticCategory\r\n+>y : ambients.DiagnosticCategory\r\n+>x : strings.DiagnosticCategory\r\n+}\r\n+\r\n+export enum DiagnosticCategory {\r\n+>DiagnosticCategory : DiagnosticCategory\r\n+\r\n+ Warning,\r\n+>Warning : DiagnosticCategory.Warning\r\n+\r\n+ Error,\r\n+>Error : DiagnosticCategory.Error\r\n+\r\n+ Suggestion,\r\n+>Suggestion : DiagnosticCategory.Suggestion\r\n+\r\n+ Message,\r\n+>Message : DiagnosticCategory.Message\r\n+}\r\n+\r\n+export let x: DiagnosticCategory;\r\n+>x : DiagnosticCategory\r\n+\r\n+(() => {\r\n+>(() => { enum DiagnosticCategory { Warning = \"Warning\", Error = \"Error\", Suggestion = \"Suggestion\", Message = \"Message\", } function f(y: DiagnosticCategory) { x = y; y = x; }})() : void\r\n+>(() => { enum DiagnosticCategory { Warning = \"Warning\", Error = \"Error\", Suggestion = \"Suggestion\", Message = \"Message\", } function f(y: DiagnosticCategory) { x = y; y = x; }}) : () => void\r\n+>() => { enum DiagnosticCategory { Warning = \"Warning\", Error = \"Error\", Suggestion = \"Suggestion\", Message = \"Message\", } function f(y: DiagnosticCategory) { x = y; y = x; }} : () => void\r\n+\r\n+ enum DiagnosticCategory {\r\n+>DiagnosticCategory : DiagnosticCategory\r\n+\r\n+ Warning = \"Warning\",\r\n+>Warning : DiagnosticCategory.Warning\r\n+>\"Warning\" : \"Warning\"\r\n+\r\n+ Error = \"Error\",\r\n+>Error : DiagnosticCategory.Error\r\n+>\"Error\" : \"Error\"\r\n+\r\n+ Suggestion = \"Suggestion\",\r\n+>Suggestion : DiagnosticCategory.Suggestion\r\n+>\"Suggestion\" : \"Suggestion\"\r\n+\r\n+ Message = \"Message\",\r\n+>Message : DiagnosticCategory.Message\r\n+>\"Message\" : \"Message\"\r\n+ }\r\n+ function f(y: DiagnosticCategory) {\r\n+>f : (y: DiagnosticCategory) => void\r\n+>y : DiagnosticCategory\r\n+\r\n+ x = y;\r\n+>x = y : DiagnosticCategory\r\n+>x : import(\"f\").DiagnosticCategory\r\n+>y : DiagnosticCategory\r\n+\r\n+ y = x;\r\n+>y = x : import(\"f\").DiagnosticCategory\r\n+>y : DiagnosticCategory\r\n+>x : import(\"f\").DiagnosticCategory\r\n+ }\r\n+})()\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat7.errors.txt b/tests/baselines/reference/enumAssignmentCompat7.errors.txt\nnew file mode 100644\nindex 000000000000..b829d9b65dcd\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat7.errors.txt\n@@ -0,0 +1,42 @@\n+enumAssignmentCompat7.ts(16,14): error TS2416: Property 'method' in type 'Derived' is not assignable to the same property in base type 'Base'.\r\n+ Type '(param: second.E) => void' is not assignable to type '(param: first.E) => void'.\r\n+ Types of parameters 'param' and 'param' are incompatible.\r\n+ Type 'first.E' is not assignable to type 'second.E'.\r\n+enumAssignmentCompat7.ts(20,10): error TS2394: This overload signature is not compatible with its implementation signature.\r\n+enumAssignmentCompat7.ts(22,21): error TS2339: Property 'B' does not exist on type 'typeof E'.\r\n+\r\n+\r\n+==== enumAssignmentCompat7.ts (3 errors) ====\r\n+ namespace first {\r\n+ export enum E { A = 1 }\r\n+ }\r\n+ \r\n+ namespace second {\r\n+ export enum E { A = 2 }\r\n+ }\r\n+ \r\n+ class Base {\r\n+ method(param: first.E) {\r\n+ \r\n+ }\r\n+ }\r\n+ \r\n+ class Derived extends Base {\r\n+ override method(param: second.E) {\r\n+ ~~~~~~\r\n+!!! error TS2416: Property 'method' in type 'Derived' is not assignable to the same property in base type 'Base'.\r\n+!!! error TS2416: Type '(param: second.E) => void' is not assignable to type '(param: first.E) => void'.\r\n+!!! error TS2416: Types of parameters 'param' and 'param' are incompatible.\r\n+!!! error TS2416: Type 'first.E' is not assignable to type 'second.E'.\r\n+ }\r\n+ }\r\n+ \r\n+ function overloadingFunction(): first.E\r\n+ ~~~~~~~~~~~~~~~~~~~\r\n+!!! error TS2394: This overload signature is not compatible with its implementation signature.\r\n+!!! related TS2750 enumAssignmentCompat7.ts:21:10: The implementation signature is declared here.\r\n+ function overloadingFunction(): second.E {\r\n+ return second.E.B\r\n+ ~\r\n+!!! error TS2339: Property 'B' does not exist on type 'typeof E'.\r\n+ }\n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/enumAssignmentCompat7.js b/tests/baselines/reference/enumAssignmentCompat7.js\nnew file mode 100644\nindex 000000000000..4521732abed6\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat7.js\n@@ -0,0 +1,77 @@\n+//// [tests/cases/compiler/enumAssignmentCompat7.ts] ////\r\n+\r\n+//// [enumAssignmentCompat7.ts]\r\n+namespace first {\n+ export enum E { A = 1 }\n+}\n+\n+namespace second {\n+ export enum E { A = 2 }\n+}\n+\n+class Base {\n+ method(param: first.E) {\n+\n+ }\n+}\n+\n+class Derived extends Base {\n+ override method(param: second.E) {\n+ }\n+}\n+\n+function overloadingFunction(): first.E\n+function overloadingFunction(): second.E {\n+ return second.E.B\n+}\r\n+\r\n+//// [enumAssignmentCompat7.js]\r\n+\"use strict\";\r\n+var __extends = (this && this.__extends) || (function () {\r\n+ var extendStatics = function (d, b) {\r\n+ extendStatics = Object.setPrototypeOf ||\r\n+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n+ return extendStatics(d, b);\r\n+ };\r\n+ return function (d, b) {\r\n+ if (typeof b !== \"function\" && b !== null)\r\n+ throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n+ extendStatics(d, b);\r\n+ function __() { this.constructor = d; }\r\n+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n+ };\r\n+})();\r\n+var first;\r\n+(function (first) {\r\n+ var E;\r\n+ (function (E) {\r\n+ E[E[\"A\"] = 1] = \"A\";\r\n+ })(E = first.E || (first.E = {}));\r\n+})(first || (first = {}));\r\n+var second;\r\n+(function (second) {\r\n+ var E;\r\n+ (function (E) {\r\n+ E[E[\"A\"] = 2] = \"A\";\r\n+ })(E = second.E || (second.E = {}));\r\n+})(second || (second = {}));\r\n+var Base = /** @class */ (function () {\r\n+ function Base() {\r\n+ }\r\n+ Base.prototype.method = function (param) {\r\n+ };\r\n+ return Base;\r\n+}());\r\n+var Derived = /** @class */ (function (_super) {\r\n+ __extends(Derived, _super);\r\n+ function Derived() {\r\n+ return _super !== null && _super.apply(this, arguments) || this;\r\n+ }\r\n+ Derived.prototype.method = function (param) {\r\n+ };\r\n+ return Derived;\r\n+}(Base));\r\n+function overloadingFunction() {\r\n+ return second.E.B;\r\n+}\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat7.symbols b/tests/baselines/reference/enumAssignmentCompat7.symbols\nnew file mode 100644\nindex 000000000000..8cd0dd808a94\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat7.symbols\n@@ -0,0 +1,58 @@\n+//// [tests/cases/compiler/enumAssignmentCompat7.ts] ////\r\n+\r\n+=== enumAssignmentCompat7.ts ===\r\n+namespace first {\r\n+>first : Symbol(first, Decl(enumAssignmentCompat7.ts, 0, 0))\r\n+\r\n+ export enum E { A = 1 }\r\n+>E : Symbol(E, Decl(enumAssignmentCompat7.ts, 0, 17))\r\n+>A : Symbol(E.A, Decl(enumAssignmentCompat7.ts, 1, 19))\r\n+}\r\n+\r\n+namespace second {\r\n+>second : Symbol(second, Decl(enumAssignmentCompat7.ts, 2, 1))\r\n+\r\n+ export enum E { A = 2 }\r\n+>E : Symbol(E, Decl(enumAssignmentCompat7.ts, 4, 18))\r\n+>A : Symbol(E.A, Decl(enumAssignmentCompat7.ts, 5, 19))\r\n+}\r\n+\r\n+class Base {\r\n+>Base : Symbol(Base, Decl(enumAssignmentCompat7.ts, 6, 1))\r\n+\r\n+ method(param: first.E) {\r\n+>method : Symbol(Base.method, Decl(enumAssignmentCompat7.ts, 8, 12))\r\n+>param : Symbol(param, Decl(enumAssignmentCompat7.ts, 9, 11))\r\n+>first : Symbol(first, Decl(enumAssignmentCompat7.ts, 0, 0))\r\n+>E : Symbol(first.E, Decl(enumAssignmentCompat7.ts, 0, 17))\r\n+\r\n+ }\r\n+}\r\n+\r\n+class Derived extends Base {\r\n+>Derived : Symbol(Derived, Decl(enumAssignmentCompat7.ts, 12, 1))\r\n+>Base : Symbol(Base, Decl(enumAssignmentCompat7.ts, 6, 1))\r\n+\r\n+ override method(param: second.E) {\r\n+>method : Symbol(Derived.method, Decl(enumAssignmentCompat7.ts, 14, 28))\r\n+>param : Symbol(param, Decl(enumAssignmentCompat7.ts, 15, 20))\r\n+>second : Symbol(second, Decl(enumAssignmentCompat7.ts, 2, 1))\r\n+>E : Symbol(second.E, Decl(enumAssignmentCompat7.ts, 4, 18))\r\n+ }\r\n+}\r\n+\r\n+function overloadingFunction(): first.E\r\n+>overloadingFunction : Symbol(overloadingFunction, Decl(enumAssignmentCompat7.ts, 17, 1), Decl(enumAssignmentCompat7.ts, 19, 39))\r\n+>first : Symbol(first, Decl(enumAssignmentCompat7.ts, 0, 0))\r\n+>E : Symbol(first.E, Decl(enumAssignmentCompat7.ts, 0, 17))\r\n+\r\n+function overloadingFunction(): second.E {\r\n+>overloadingFunction : Symbol(overloadingFunction, Decl(enumAssignmentCompat7.ts, 17, 1), Decl(enumAssignmentCompat7.ts, 19, 39))\r\n+>second : Symbol(second, Decl(enumAssignmentCompat7.ts, 2, 1))\r\n+>E : Symbol(second.E, Decl(enumAssignmentCompat7.ts, 4, 18))\r\n+\r\n+ return second.E.B\r\n+>second.E : Symbol(second.E, Decl(enumAssignmentCompat7.ts, 4, 18))\r\n+>second : Symbol(second, Decl(enumAssignmentCompat7.ts, 2, 1))\r\n+>E : Symbol(second.E, Decl(enumAssignmentCompat7.ts, 4, 18))\r\n+}\r\ndiff --git a/tests/baselines/reference/enumAssignmentCompat7.types b/tests/baselines/reference/enumAssignmentCompat7.types\nnew file mode 100644\nindex 000000000000..0445ae8147ac\n--- /dev/null\n+++ b/tests/baselines/reference/enumAssignmentCompat7.types\n@@ -0,0 +1,58 @@\n+//// [tests/cases/compiler/enumAssignmentCompat7.ts] ////\r\n+\r\n+=== enumAssignmentCompat7.ts ===\r\n+namespace first {\r\n+>first : typeof first\r\n+\r\n+ export enum E { A = 1 }\r\n+>E : E\r\n+>A : E.A\r\n+>1 : 1\r\n+}\r\n+\r\n+namespace second {\r\n+>second : typeof second\r\n+\r\n+ export enum E { A = 2 }\r\n+>E : E\r\n+>A : E.A\r\n+>2 : 2\r\n+}\r\n+\r\n+class Base {\r\n+>Base : Base\r\n+\r\n+ method(param: first.E) {\r\n+>method : (param: first.E) => void\r\n+>param : first.E\r\n+>first : any\r\n+\r\n+ }\r\n+}\r\n+\r\n+class Derived extends Base {\r\n+>Derived : Derived\r\n+>Base : Base\r\n+\r\n+ override method(param: second.E) {\r\n+>method : (param: second.E) => void\r\n+>param : second.E\r\n+>second : any\r\n+ }\r\n+}\r\n+\r\n+function overloadingFunction(): first.E\r\n+>overloadingFunction : () => first.E\r\n+>first : any\r\n+\r\n+function overloadingFunction(): second.E {\r\n+>overloadingFunction : () => first.E\r\n+>second : any\r\n+\r\n+ return second.E.B\r\n+>second.E.B : any\r\n+>second.E : typeof second.E\r\n+>second : typeof second\r\n+>E : typeof second.E\r\n+>B : any\r\n+}\r\ndiff --git a/tests/cases/compiler/enumAssignmentCompat3.ts b/tests/cases/compiler/enumAssignmentCompat3.ts\nindex 97a136468e3e..a706be4ce217 100644\n--- a/tests/cases/compiler/enumAssignmentCompat3.ts\n+++ b/tests/cases/compiler/enumAssignmentCompat3.ts\n@@ -69,13 +69,13 @@ abc = secondAbcd; // missing 'd'\n abc = secondAb; // ok\r\n abc = secondCd; // missing 'd'\r\n abc = nope; // nope!\r\n-abc = decl; // ok\r\n+abc = decl; // bad - value of 'c' differs between these enums\r\n secondAbc = abc; // ok\r\n secondAbcd = abc; // ok\r\n secondAb = abc; // missing 'c'\r\n secondCd = abc; // missing 'a' and 'b'\r\n nope = abc; // nope!\r\n-decl = abc; // ok\r\n+decl = abc; // bad - value of 'c' differs between these enums\r\n \r\n // const is only assignable to itself\r\n k = k;\r\n@@ -84,6 +84,6 @@ k = abc;\n \r\n // merged enums compare all their members\r\n abc = merged; // missing 'd'\r\n-merged = abc; // ok\r\n+merged = abc; // bad - value of 'c' differs between these enums\r\n abc = merged2; // ok\r\n merged2 = abc; // ok\n\\ No newline at end of file\ndiff --git a/tests/cases/compiler/enumAssignmentCompat6.ts b/tests/cases/compiler/enumAssignmentCompat6.ts\nnew file mode 100644\nindex 000000000000..b91300d37c53\n--- /dev/null\n+++ b/tests/cases/compiler/enumAssignmentCompat6.ts\n@@ -0,0 +1,77 @@\n+// @filename a.ts\n+namespace numerics {\n+ export enum DiagnosticCategory {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+ }\n+\n+ export enum DiagnosticCategory2 {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+ }\n+}\n+\n+namespace strings {\n+ export enum DiagnosticCategory {\n+ Warning = \"Warning\",\n+ Error = \"Error\",\n+ Suggestion = \"Suggestion\",\n+ Message = \"Message\",\n+ }\n+}\n+\n+declare namespace ambients {\n+ export enum DiagnosticCategory {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+ }\n+}\n+\n+function f(x: numerics.DiagnosticCategory, y: strings.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+function g(x: numerics.DiagnosticCategory2, y: strings.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+function h(x: numerics.DiagnosticCategory, y: ambients.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+function i(x: strings.DiagnosticCategory, y: ambients.DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+}\n+\n+// @filename: f.ts\n+export enum DiagnosticCategory {\n+ Warning,\n+ Error,\n+ Suggestion,\n+ Message,\n+}\n+\n+export let x: DiagnosticCategory;\n+\n+(() => {\n+ enum DiagnosticCategory {\n+ Warning = \"Warning\",\n+ Error = \"Error\",\n+ Suggestion = \"Suggestion\",\n+ Message = \"Message\",\n+ }\n+ function f(y: DiagnosticCategory) {\n+ x = y;\n+ y = x;\n+ }\n+})()\n\\ No newline at end of file\ndiff --git a/tests/cases/compiler/enumAssignmentCompat7.ts b/tests/cases/compiler/enumAssignmentCompat7.ts\nnew file mode 100644\nindex 000000000000..179f7d844dbf\n--- /dev/null\n+++ b/tests/cases/compiler/enumAssignmentCompat7.ts\n@@ -0,0 +1,26 @@\n+// @strict: true\n+// @strictFunctionTypes: false\n+\n+namespace first {\n+ export enum E { A = 1 }\n+}\n+\n+namespace second {\n+ export enum E { A = 2 }\n+}\n+\n+class Base {\n+ method(param: first.E) {\n+\n+ }\n+}\n+\n+class Derived extends Base {\n+ override method(param: second.E) {\n+ }\n+}\n+\n+function overloadingFunction(): first.E\n+function overloadingFunction(): second.E {\n+ return second.E.B\n+}\n\\ No newline at end of file\n", "files": ["src/compiler/checker.ts", "src/compiler/diagnosticMessages.json", "src/compiler/types.ts", "tests/baselines/reference/enumAssignmentCompat3.errors.txt", "tests/baselines/reference/enumAssignmentCompat3.js", "tests/baselines/reference/enumAssignmentCompat3.symbols", "tests/baselines/reference/enumAssignmentCompat3.types", "tests/baselines/reference/enumAssignmentCompat6.errors.txt", "tests/baselines/reference/enumAssignmentCompat6.js", "tests/baselines/reference/enumAssignmentCompat6.symbols", "tests/baselines/reference/enumAssignmentCompat6.types", "tests/baselines/reference/enumAssignmentCompat7.errors.txt", "tests/baselines/reference/enumAssignmentCompat7.js", "tests/baselines/reference/enumAssignmentCompat7.symbols", "tests/baselines/reference/enumAssignmentCompat7.types", "tests/cases/compiler/enumAssignmentCompat3.ts", "tests/cases/compiler/enumAssignmentCompat6.ts", "tests/cases/compiler/enumAssignmentCompat7.ts"]}, "0e5927d5d38399bac1818ad4160f2ff91c33c174": {"diff": "diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts\nindex 9e1086a98e54..43cff3cb5238 100644\n--- a/src/compiler/checker.ts\n+++ b/src/compiler/checker.ts\n@@ -26192,6 +26192,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n return compilerOptions.types\r\n ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig\r\n : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode;\r\n+ case \"Bun\":\r\n+ return compilerOptions.types\r\n+ ? Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_Bun_Try_npm_i_save_dev_types_Slashbun_and_then_add_bun_to_the_types_field_in_your_tsconfig\r\n+ : Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_Bun_Try_npm_i_save_dev_types_Slashbun;\r\n case \"Map\":\r\n case \"Set\":\r\n case \"Promise\":\r\ndiff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json\nindex 8a16147b6338..5a71fa894b10 100644\n--- a/src/compiler/diagnosticMessages.json\n+++ b/src/compiler/diagnosticMessages.json\n@@ -3735,6 +3735,14 @@\n \"category\": \"Error\",\r\n \"code\": 2866\r\n },\r\n+ \"Cannot find name '{0}'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.\": {\r\n+ \"category\": \"Error\",\r\n+ \"code\": 2867\r\n+ },\r\n+ \"Cannot find name '{0}'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun` and then add 'bun' to the types field in your tsconfig.\": {\r\n+ \"category\": \"Error\",\r\n+ \"code\": 2868\r\n+ },\r\n \r\n \"Import declaration '{0}' is using private name '{1}'.\": {\r\n \"category\": \"Error\",\r\ndiff --git a/tests/baselines/reference/typingsSuggestionBun1.errors.txt b/tests/baselines/reference/typingsSuggestionBun1.errors.txt\nnew file mode 100644\nindex 000000000000..c2ab614b5fc9\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun1.errors.txt\n@@ -0,0 +1,11 @@\n+a.ts(1,14): error TS2868: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun` and then add 'bun' to the types field in your tsconfig.\r\n+\r\n+\r\n+==== tsconfig.json (0 errors) ====\r\n+ { \"compilerOptions\": {\"types\": []} }\r\n+ \r\n+==== a.ts (1 errors) ====\r\n+ const file = Bun.file(\"/a.ts\");\r\n+ ~~~\r\n+!!! error TS2868: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun` and then add 'bun' to the types field in your tsconfig.\r\n+ \n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/typingsSuggestionBun1.js b/tests/baselines/reference/typingsSuggestionBun1.js\nnew file mode 100644\nindex 000000000000..4561a2ff4aec\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun1.js\n@@ -0,0 +1,8 @@\n+//// [tests/cases/conformance/typings/typingsSuggestionBun1.ts] ////\r\n+\r\n+//// [a.ts]\r\n+const file = Bun.file(\"/a.ts\");\n+\r\n+\r\n+//// [a.js]\r\n+var file = Bun.file(\"/a.ts\");\r\ndiff --git a/tests/baselines/reference/typingsSuggestionBun1.symbols b/tests/baselines/reference/typingsSuggestionBun1.symbols\nnew file mode 100644\nindex 000000000000..77b6c8f71748\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun1.symbols\n@@ -0,0 +1,6 @@\n+//// [tests/cases/conformance/typings/typingsSuggestionBun1.ts] ////\r\n+\r\n+=== a.ts ===\r\n+const file = Bun.file(\"/a.ts\");\r\n+>file : Symbol(file, Decl(a.ts, 0, 5))\r\n+\r\ndiff --git a/tests/baselines/reference/typingsSuggestionBun1.types b/tests/baselines/reference/typingsSuggestionBun1.types\nnew file mode 100644\nindex 000000000000..2961bd448723\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun1.types\n@@ -0,0 +1,11 @@\n+//// [tests/cases/conformance/typings/typingsSuggestionBun1.ts] ////\r\n+\r\n+=== a.ts ===\r\n+const file = Bun.file(\"/a.ts\");\r\n+>file : any\r\n+>Bun.file(\"/a.ts\") : any\r\n+>Bun.file : any\r\n+>Bun : any\r\n+>file : any\r\n+>\"/a.ts\" : \"/a.ts\"\r\n+\r\ndiff --git a/tests/baselines/reference/typingsSuggestionBun2.errors.txt b/tests/baselines/reference/typingsSuggestionBun2.errors.txt\nnew file mode 100644\nindex 000000000000..309dc7e05b31\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun2.errors.txt\n@@ -0,0 +1,11 @@\n+a.ts(1,14): error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.\r\n+\r\n+\r\n+==== tsconfig.json (0 errors) ====\r\n+ { \"compilerOptions\": {} }\r\n+ \r\n+==== a.ts (1 errors) ====\r\n+ const file = Bun.file(\"/a.ts\");\r\n+ ~~~\r\n+!!! error TS2867: Cannot find name 'Bun'. Do you need to install type definitions for Bun? Try `npm i --save-dev @types/bun`.\r\n+ \n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/typingsSuggestionBun2.js b/tests/baselines/reference/typingsSuggestionBun2.js\nnew file mode 100644\nindex 000000000000..7a19ff2b8416\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun2.js\n@@ -0,0 +1,8 @@\n+//// [tests/cases/conformance/typings/typingsSuggestionBun2.ts] ////\r\n+\r\n+//// [a.ts]\r\n+const file = Bun.file(\"/a.ts\");\n+\r\n+\r\n+//// [a.js]\r\n+var file = Bun.file(\"/a.ts\");\r\ndiff --git a/tests/baselines/reference/typingsSuggestionBun2.symbols b/tests/baselines/reference/typingsSuggestionBun2.symbols\nnew file mode 100644\nindex 000000000000..e022b8f6d614\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun2.symbols\n@@ -0,0 +1,6 @@\n+//// [tests/cases/conformance/typings/typingsSuggestionBun2.ts] ////\r\n+\r\n+=== a.ts ===\r\n+const file = Bun.file(\"/a.ts\");\r\n+>file : Symbol(file, Decl(a.ts, 0, 5))\r\n+\r\ndiff --git a/tests/baselines/reference/typingsSuggestionBun2.types b/tests/baselines/reference/typingsSuggestionBun2.types\nnew file mode 100644\nindex 000000000000..e68cee2f35ee\n--- /dev/null\n+++ b/tests/baselines/reference/typingsSuggestionBun2.types\n@@ -0,0 +1,11 @@\n+//// [tests/cases/conformance/typings/typingsSuggestionBun2.ts] ////\r\n+\r\n+=== a.ts ===\r\n+const file = Bun.file(\"/a.ts\");\r\n+>file : any\r\n+>Bun.file(\"/a.ts\") : any\r\n+>Bun.file : any\r\n+>Bun : any\r\n+>file : any\r\n+>\"/a.ts\" : \"/a.ts\"\r\n+\r\ndiff --git a/tests/cases/conformance/typings/typingsSuggestionBun1.ts b/tests/cases/conformance/typings/typingsSuggestionBun1.ts\nnew file mode 100644\nindex 000000000000..aff75faff5da\n--- /dev/null\n+++ b/tests/cases/conformance/typings/typingsSuggestionBun1.ts\n@@ -0,0 +1,5 @@\n+// @filename: tsconfig.json\r\n+{ \"compilerOptions\": {\"types\": []} }\r\n+\r\n+// @filename: a.ts\r\n+const file = Bun.file(\"/a.ts\");\r\ndiff --git a/tests/cases/conformance/typings/typingsSuggestionBun2.ts b/tests/cases/conformance/typings/typingsSuggestionBun2.ts\nnew file mode 100644\nindex 000000000000..6c07e0483d34\n--- /dev/null\n+++ b/tests/cases/conformance/typings/typingsSuggestionBun2.ts\n@@ -0,0 +1,5 @@\n+// @filename: tsconfig.json\r\n+{ \"compilerOptions\": {} }\r\n+\r\n+// @filename: a.ts\r\n+const file = Bun.file(\"/a.ts\");\r\n", "files": ["src/compiler/checker.ts", "src/compiler/diagnosticMessages.json", "tests/baselines/reference/typingsSuggestionBun1.errors.txt", "tests/baselines/reference/typingsSuggestionBun1.js", "tests/baselines/reference/typingsSuggestionBun1.symbols", "tests/baselines/reference/typingsSuggestionBun1.types", "tests/baselines/reference/typingsSuggestionBun2.errors.txt", "tests/baselines/reference/typingsSuggestionBun2.js", "tests/baselines/reference/typingsSuggestionBun2.symbols", "tests/baselines/reference/typingsSuggestionBun2.types", "tests/cases/conformance/typings/typingsSuggestionBun1.ts", "tests/cases/conformance/typings/typingsSuggestionBun2.ts"]}, "a36d04fc63c83b6ec5a8099942b653a5caa29eb1": {"diff": "diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts\nindex 34454f3906ed..9e1086a98e54 100644\n--- a/src/compiler/checker.ts\n+++ b/src/compiler/checker.ts\n@@ -48798,11 +48798,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n }\r\n }\r\n switch (modifier.kind) {\r\n- case SyntaxKind.ConstKeyword:\r\n+ case SyntaxKind.ConstKeyword: {\r\n if (node.kind !== SyntaxKind.EnumDeclaration && node.kind !== SyntaxKind.TypeParameter) {\r\n return grammarErrorOnNode(node, Diagnostics.A_class_member_cannot_have_the_0_keyword, tokenToString(SyntaxKind.ConstKeyword));\r\n }\r\n- const parent = node.parent;\r\n+ const parent = (isJSDocTemplateTag(node.parent) && getEffectiveJSDocHost(node.parent)) || node.parent;\r\n if (\r\n node.kind === SyntaxKind.TypeParameter && !(isFunctionLikeDeclaration(parent) || isClassLike(parent) || isFunctionTypeNode(parent) ||\r\n isConstructorTypeNode(parent) || isCallSignatureDeclaration(parent) || isConstructSignatureDeclaration(parent) || isMethodSignature(parent))\r\n@@ -48810,6 +48810,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_type_parameter_of_a_function_method_or_class, tokenToString(modifier.kind));\r\n }\r\n break;\r\n+ }\r\n case SyntaxKind.OverrideKeyword:\r\n // If node.kind === SyntaxKind.Parameter, checkParameter reports an error if it's not a parameter property.\r\n if (flags & ModifierFlags.Override) {\r\n@@ -49088,10 +49089,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n break;\r\n \r\n case SyntaxKind.InKeyword:\r\n- case SyntaxKind.OutKeyword:\r\n+ case SyntaxKind.OutKeyword: {\r\n const inOutFlag = modifier.kind === SyntaxKind.InKeyword ? ModifierFlags.In : ModifierFlags.Out;\r\n const inOutText = modifier.kind === SyntaxKind.InKeyword ? \"in\" : \"out\";\r\n- if (node.kind !== SyntaxKind.TypeParameter || !(isInterfaceDeclaration(node.parent) || isClassLike(node.parent) || isTypeAliasDeclaration(node.parent))) {\r\n+ const parent = isJSDocTemplateTag(node.parent) && (getEffectiveJSDocHost(node.parent) || find(getJSDocRoot(node.parent)?.tags, isJSDocTypedefTag)) || node.parent;\r\n+ if (node.kind !== SyntaxKind.TypeParameter || parent && !(isInterfaceDeclaration(parent) || isClassLike(parent) || isTypeAliasDeclaration(parent) || isJSDocTypedefTag(parent))) {\r\n return grammarErrorOnNode(modifier, Diagnostics._0_modifier_can_only_appear_on_a_type_parameter_of_a_class_interface_or_type_alias, inOutText);\r\n }\r\n if (flags & inOutFlag) {\r\n@@ -49102,6 +49104,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {\n }\r\n flags |= inOutFlag;\r\n break;\r\n+ }\r\n }\r\n }\r\n }\r\ndiff --git a/src/compiler/parser.ts b/src/compiler/parser.ts\nindex bdd80887cda6..4f68271ccb72 100644\n--- a/src/compiler/parser.ts\n+++ b/src/compiler/parser.ts\n@@ -9710,8 +9710,9 @@ namespace Parser {\n if (isBracketed) {\r\n skipWhitespace();\r\n }\r\n- const name = parseJSDocIdentifierName(Diagnostics.Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces);\r\n \r\n+ const modifiers = parseModifiers(/*allowDecorators*/ false, /*permitConstAsModifier*/ true);\r\n+ const name = parseJSDocIdentifierName(Diagnostics.Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces);\r\n let defaultType: TypeNode | undefined;\r\n if (isBracketed) {\r\n skipWhitespace();\r\n@@ -9723,7 +9724,7 @@ namespace Parser {\n if (nodeIsMissing(name)) {\r\n return undefined;\r\n }\r\n- return finishNode(factory.createTypeParameterDeclaration(/*modifiers*/ undefined, name, /*constraint*/ undefined, defaultType), typeParameterPos);\r\n+ return finishNode(factory.createTypeParameterDeclaration(modifiers, name, /*constraint*/ undefined, defaultType), typeParameterPos);\r\n }\r\n \r\n function parseTemplateTagTypeParameters() {\r\ndiff --git a/tests/baselines/reference/jsdocTemplateTag6.symbols b/tests/baselines/reference/jsdocTemplateTag6.symbols\nnew file mode 100644\nindex 000000000000..105ba2b51f2e\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag6.symbols\n@@ -0,0 +1,192 @@\n+//// [tests/cases/conformance/jsdoc/jsdocTemplateTag6.ts] ////\r\n+\r\n+=== a.js ===\r\n+/**\r\n+ * @template const T\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+function f1(x) {\r\n+>f1 : Symbol(f1, Decl(a.js, 0, 0))\r\n+>x : Symbol(x, Decl(a.js, 5, 12))\r\n+\r\n+ return x;\r\n+>x : Symbol(x, Decl(a.js, 5, 12))\r\n+}\r\n+const t1 = f1(\"a\");\r\n+>t1 : Symbol(t1, Decl(a.js, 8, 5))\r\n+>f1 : Symbol(f1, Decl(a.js, 0, 0))\r\n+\r\n+const t2 = f1([\"a\", [\"b\", \"c\"]]);\r\n+>t2 : Symbol(t2, Decl(a.js, 9, 5))\r\n+>f1 : Symbol(f1, Decl(a.js, 0, 0))\r\n+\r\n+const t3 = f1({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\r\n+>t3 : Symbol(t3, Decl(a.js, 10, 5))\r\n+>f1 : Symbol(f1, Decl(a.js, 0, 0))\r\n+>a : Symbol(a, Decl(a.js, 10, 15))\r\n+>b : Symbol(b, Decl(a.js, 10, 21))\r\n+>d : Symbol(d, Decl(a.js, 10, 29))\r\n+>f : Symbol(f, Decl(a.js, 10, 49))\r\n+\r\n+/**\r\n+ * @template const T, U\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+function f2(x) {\r\n+>f2 : Symbol(f2, Decl(a.js, 10, 63))\r\n+>x : Symbol(x, Decl(a.js, 17, 12))\r\n+\r\n+ return x;\r\n+>x : Symbol(x, Decl(a.js, 17, 12))\r\n+\r\n+};\r\n+const t4 = f2('a');\r\n+>t4 : Symbol(t4, Decl(a.js, 20, 5))\r\n+>f2 : Symbol(f2, Decl(a.js, 10, 63))\r\n+\r\n+const t5 = f2(['a', ['b', 'c']]);\r\n+>t5 : Symbol(t5, Decl(a.js, 21, 5))\r\n+>f2 : Symbol(f2, Decl(a.js, 10, 63))\r\n+\r\n+const t6 = f2({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\r\n+>t6 : Symbol(t6, Decl(a.js, 22, 5))\r\n+>f2 : Symbol(f2, Decl(a.js, 10, 63))\r\n+>a : Symbol(a, Decl(a.js, 22, 15))\r\n+>b : Symbol(b, Decl(a.js, 22, 21))\r\n+>d : Symbol(d, Decl(a.js, 22, 29))\r\n+>f : Symbol(f, Decl(a.js, 22, 49))\r\n+\r\n+/**\r\n+ * @template const T\r\n+ * @param {T} x\r\n+ * @returns {T[]}\r\n+ */\r\n+function f3(x) {\r\n+>f3 : Symbol(f3, Decl(a.js, 22, 63))\r\n+>x : Symbol(x, Decl(a.js, 29, 12))\r\n+\r\n+ return [x];\r\n+>x : Symbol(x, Decl(a.js, 29, 12))\r\n+}\r\n+const t7 = f3(\"hello\");\r\n+>t7 : Symbol(t7, Decl(a.js, 32, 5))\r\n+>f3 : Symbol(f3, Decl(a.js, 22, 63))\r\n+\r\n+const t8 = f3(\"hello\");\r\n+>t8 : Symbol(t8, Decl(a.js, 33, 5))\r\n+>f3 : Symbol(f3, Decl(a.js, 22, 63))\r\n+\r\n+/**\r\n+ * @template const T\r\n+ * @param {[T, T]} x\r\n+ * @returns {T}\r\n+ */\r\n+function f4(x) {\r\n+>f4 : Symbol(f4, Decl(a.js, 33, 23))\r\n+>x : Symbol(x, Decl(a.js, 40, 12))\r\n+\r\n+ return x[0];\r\n+>x : Symbol(x, Decl(a.js, 40, 12))\r\n+>0 : Symbol(0)\r\n+}\r\n+const t9 = f4([[1, \"x\"], [2, \"y\"]]);\r\n+>t9 : Symbol(t9, Decl(a.js, 43, 5))\r\n+>f4 : Symbol(f4, Decl(a.js, 33, 23))\r\n+\r\n+const t10 = f4([{ a: 1, b: \"x\" }, { a: 2, b: \"y\" }]);\r\n+>t10 : Symbol(t10, Decl(a.js, 44, 5))\r\n+>f4 : Symbol(f4, Decl(a.js, 33, 23))\r\n+>a : Symbol(a, Decl(a.js, 44, 17))\r\n+>b : Symbol(b, Decl(a.js, 44, 23))\r\n+>a : Symbol(a, Decl(a.js, 44, 35))\r\n+>b : Symbol(b, Decl(a.js, 44, 41))\r\n+\r\n+/**\r\n+ * @template const T\r\n+ * @param {{ x: T, y: T}} obj\r\n+ * @returns {T}\r\n+ */\r\n+function f5(obj) {\r\n+>f5 : Symbol(f5, Decl(a.js, 44, 53))\r\n+>obj : Symbol(obj, Decl(a.js, 51, 12))\r\n+\r\n+ return obj.x;\r\n+>obj.x : Symbol(x, Decl(a.js, 48, 12))\r\n+>obj : Symbol(obj, Decl(a.js, 51, 12))\r\n+>x : Symbol(x, Decl(a.js, 48, 12))\r\n+}\r\n+const t11 = f5({ x: [1, \"x\"], y: [2, \"y\"] });\r\n+>t11 : Symbol(t11, Decl(a.js, 54, 5))\r\n+>f5 : Symbol(f5, Decl(a.js, 44, 53))\r\n+>x : Symbol(x, Decl(a.js, 54, 16))\r\n+>y : Symbol(y, Decl(a.js, 54, 29))\r\n+\r\n+const t12 = f5({ x: { a: 1, b: \"x\" }, y: { a: 2, b: \"y\" } });\r\n+>t12 : Symbol(t12, Decl(a.js, 55, 5))\r\n+>f5 : Symbol(f5, Decl(a.js, 44, 53))\r\n+>x : Symbol(x, Decl(a.js, 55, 16))\r\n+>a : Symbol(a, Decl(a.js, 55, 21))\r\n+>b : Symbol(b, Decl(a.js, 55, 27))\r\n+>y : Symbol(y, Decl(a.js, 55, 37))\r\n+>a : Symbol(a, Decl(a.js, 55, 42))\r\n+>b : Symbol(b, Decl(a.js, 55, 48))\r\n+\r\n+/**\r\n+ * @template const T\r\n+ */\r\n+class C {\r\n+>C : Symbol(C, Decl(a.js, 55, 61))\r\n+\r\n+ /**\r\n+ * @param {T} x\r\n+ */\r\n+ constructor(x) {}\r\n+>x : Symbol(x, Decl(a.js, 64, 16))\r\n+\r\n+ /**\r\n+ * @template const U\r\n+ * @param {U} x\r\n+ */\r\n+ foo(x) {\r\n+>foo : Symbol(C.foo, Decl(a.js, 64, 21))\r\n+>x : Symbol(x, Decl(a.js, 70, 8))\r\n+\r\n+ return x;\r\n+>x : Symbol(x, Decl(a.js, 70, 8))\r\n+ }\r\n+}\r\n+\r\n+const t13 = new C({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\r\n+>t13 : Symbol(t13, Decl(a.js, 75, 5))\r\n+>C : Symbol(C, Decl(a.js, 55, 61))\r\n+>a : Symbol(a, Decl(a.js, 75, 19))\r\n+>b : Symbol(b, Decl(a.js, 75, 25))\r\n+>d : Symbol(d, Decl(a.js, 75, 33))\r\n+>f : Symbol(f, Decl(a.js, 75, 53))\r\n+\r\n+const t14 = t13.foo([\"a\", [\"b\", \"c\"]]);\r\n+>t14 : Symbol(t14, Decl(a.js, 76, 5))\r\n+>t13.foo : Symbol(C.foo, Decl(a.js, 64, 21))\r\n+>t13 : Symbol(t13, Decl(a.js, 75, 5))\r\n+>foo : Symbol(C.foo, Decl(a.js, 64, 21))\r\n+\r\n+/**\r\n+ * @template {readonly unknown[]} const T\r\n+ * @param {T} args\r\n+ * @returns {T}\r\n+ */\r\n+function f6(...args) {\r\n+>f6 : Symbol(f6, Decl(a.js, 76, 39))\r\n+>args : Symbol(args, Decl(a.js, 83, 12))\r\n+\r\n+ return args;\r\n+>args : Symbol(args, Decl(a.js, 83, 12))\r\n+}\r\n+const t15 = f6(1, 'b', { a: 1, b: 'x' });\r\n+>t15 : Symbol(t15, Decl(a.js, 86, 5))\r\n+>f6 : Symbol(f6, Decl(a.js, 76, 39))\r\n+>a : Symbol(a, Decl(a.js, 86, 24))\r\n+>b : Symbol(b, Decl(a.js, 86, 30))\r\n+\r\ndiff --git a/tests/baselines/reference/jsdocTemplateTag6.types b/tests/baselines/reference/jsdocTemplateTag6.types\nnew file mode 100644\nindex 000000000000..2ba325b68560\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag6.types\n@@ -0,0 +1,288 @@\n+//// [tests/cases/conformance/jsdoc/jsdocTemplateTag6.ts] ////\r\n+\r\n+=== a.js ===\r\n+/**\r\n+ * @template const T\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+function f1(x) {\r\n+>f1 : <const T>(x: T) => T\r\n+>x : T\r\n+\r\n+ return x;\r\n+>x : T\r\n+}\r\n+const t1 = f1(\"a\");\r\n+>t1 : \"a\"\r\n+>f1(\"a\") : \"a\"\r\n+>f1 : <const T>(x: T) => T\r\n+>\"a\" : \"a\"\r\n+\r\n+const t2 = f1([\"a\", [\"b\", \"c\"]]);\r\n+>t2 : readonly [\"a\", readonly [\"b\", \"c\"]]\r\n+>f1([\"a\", [\"b\", \"c\"]]) : readonly [\"a\", readonly [\"b\", \"c\"]]\r\n+>f1 : <const T>(x: T) => T\r\n+>[\"a\", [\"b\", \"c\"]] : [\"a\", [\"b\", \"c\"]]\r\n+>\"a\" : \"a\"\r\n+>[\"b\", \"c\"] : [\"b\", \"c\"]\r\n+>\"b\" : \"b\"\r\n+>\"c\" : \"c\"\r\n+\r\n+const t3 = f1({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\r\n+>t3 : { readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }\r\n+>f1({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] }) : { readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }\r\n+>f1 : <const T>(x: T) => T\r\n+>{ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] } : { a: 1; b: \"c\"; d: [\"e\", 2, true, { f: \"g\"; }]; }\r\n+>a : 1\r\n+>1 : 1\r\n+>b : \"c\"\r\n+>\"c\" : \"c\"\r\n+>d : [\"e\", 2, true, { f: \"g\"; }]\r\n+>[\"e\", 2, true, { f: \"g\" }] : [\"e\", 2, true, { f: \"g\"; }]\r\n+>\"e\" : \"e\"\r\n+>2 : 2\r\n+>true : true\r\n+>{ f: \"g\" } : { f: \"g\"; }\r\n+>f : \"g\"\r\n+>\"g\" : \"g\"\r\n+\r\n+/**\r\n+ * @template const T, U\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+function f2(x) {\r\n+>f2 : <const T, U>(x: T) => T\r\n+>x : T\r\n+\r\n+ return x;\r\n+>x : T\r\n+\r\n+};\r\n+const t4 = f2('a');\r\n+>t4 : \"a\"\r\n+>f2('a') : \"a\"\r\n+>f2 : <const T, U>(x: T) => T\r\n+>'a' : \"a\"\r\n+\r\n+const t5 = f2(['a', ['b', 'c']]);\r\n+>t5 : readonly [\"a\", readonly [\"b\", \"c\"]]\r\n+>f2(['a', ['b', 'c']]) : readonly [\"a\", readonly [\"b\", \"c\"]]\r\n+>f2 : <const T, U>(x: T) => T\r\n+>['a', ['b', 'c']] : [\"a\", [\"b\", \"c\"]]\r\n+>'a' : \"a\"\r\n+>['b', 'c'] : [\"b\", \"c\"]\r\n+>'b' : \"b\"\r\n+>'c' : \"c\"\r\n+\r\n+const t6 = f2({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\r\n+>t6 : { readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }\r\n+>f2({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] }) : { readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }\r\n+>f2 : <const T, U>(x: T) => T\r\n+>{ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] } : { a: 1; b: \"c\"; d: [\"e\", 2, true, { f: \"g\"; }]; }\r\n+>a : 1\r\n+>1 : 1\r\n+>b : \"c\"\r\n+>\"c\" : \"c\"\r\n+>d : [\"e\", 2, true, { f: \"g\"; }]\r\n+>[\"e\", 2, true, { f: \"g\" }] : [\"e\", 2, true, { f: \"g\"; }]\r\n+>\"e\" : \"e\"\r\n+>2 : 2\r\n+>true : true\r\n+>{ f: \"g\" } : { f: \"g\"; }\r\n+>f : \"g\"\r\n+>\"g\" : \"g\"\r\n+\r\n+/**\r\n+ * @template const T\r\n+ * @param {T} x\r\n+ * @returns {T[]}\r\n+ */\r\n+function f3(x) {\r\n+>f3 : <const T>(x: T) => T[]\r\n+>x : T\r\n+\r\n+ return [x];\r\n+>[x] : T[]\r\n+>x : T\r\n+}\r\n+const t7 = f3(\"hello\");\r\n+>t7 : \"hello\"[]\r\n+>f3(\"hello\") : \"hello\"[]\r\n+>f3 : <const T>(x: T) => T[]\r\n+>\"hello\" : \"hello\"\r\n+\r\n+const t8 = f3(\"hello\");\r\n+>t8 : \"hello\"[]\r\n+>f3(\"hello\") : \"hello\"[]\r\n+>f3 : <const T>(x: T) => T[]\r\n+>\"hello\" : \"hello\"\r\n+\r\n+/**\r\n+ * @template const T\r\n+ * @param {[T, T]} x\r\n+ * @returns {T}\r\n+ */\r\n+function f4(x) {\r\n+>f4 : <const T>(x: [T, T]) => T\r\n+>x : [T, T]\r\n+\r\n+ return x[0];\r\n+>x[0] : T\r\n+>x : [T, T]\r\n+>0 : 0\r\n+}\r\n+const t9 = f4([[1, \"x\"], [2, \"y\"]]);\r\n+>t9 : readonly [1, \"x\"] | readonly [2, \"y\"]\r\n+>f4([[1, \"x\"], [2, \"y\"]]) : readonly [1, \"x\"] | readonly [2, \"y\"]\r\n+>f4 : <const T>(x: [T, T]) => T\r\n+>[[1, \"x\"], [2, \"y\"]] : [[1, \"x\"], [2, \"y\"]]\r\n+>[1, \"x\"] : [1, \"x\"]\r\n+>1 : 1\r\n+>\"x\" : \"x\"\r\n+>[2, \"y\"] : [2, \"y\"]\r\n+>2 : 2\r\n+>\"y\" : \"y\"\r\n+\r\n+const t10 = f4([{ a: 1, b: \"x\" }, { a: 2, b: \"y\" }]);\r\n+>t10 : { readonly a: 1; readonly b: \"x\"; } | { readonly a: 2; readonly b: \"y\"; }\r\n+>f4([{ a: 1, b: \"x\" }, { a: 2, b: \"y\" }]) : { readonly a: 1; readonly b: \"x\"; } | { readonly a: 2; readonly b: \"y\"; }\r\n+>f4 : <const T>(x: [T, T]) => T\r\n+>[{ a: 1, b: \"x\" }, { a: 2, b: \"y\" }] : [{ a: 1; b: \"x\"; }, { a: 2; b: \"y\"; }]\r\n+>{ a: 1, b: \"x\" } : { a: 1; b: \"x\"; }\r\n+>a : 1\r\n+>1 : 1\r\n+>b : \"x\"\r\n+>\"x\" : \"x\"\r\n+>{ a: 2, b: \"y\" } : { a: 2; b: \"y\"; }\r\n+>a : 2\r\n+>2 : 2\r\n+>b : \"y\"\r\n+>\"y\" : \"y\"\r\n+\r\n+/**\r\n+ * @template const T\r\n+ * @param {{ x: T, y: T}} obj\r\n+ * @returns {T}\r\n+ */\r\n+function f5(obj) {\r\n+>f5 : <const T>(obj: { x: T; y: T;}) => T\r\n+>obj : { x: T; y: T; }\r\n+\r\n+ return obj.x;\r\n+>obj.x : T\r\n+>obj : { x: T; y: T; }\r\n+>x : T\r\n+}\r\n+const t11 = f5({ x: [1, \"x\"], y: [2, \"y\"] });\r\n+>t11 : readonly [1, \"x\"] | readonly [2, \"y\"]\r\n+>f5({ x: [1, \"x\"], y: [2, \"y\"] }) : readonly [1, \"x\"] | readonly [2, \"y\"]\r\n+>f5 : <const T>(obj: { x: T; y: T; }) => T\r\n+>{ x: [1, \"x\"], y: [2, \"y\"] } : { x: [1, \"x\"]; y: [2, \"y\"]; }\r\n+>x : [1, \"x\"]\r\n+>[1, \"x\"] : [1, \"x\"]\r\n+>1 : 1\r\n+>\"x\" : \"x\"\r\n+>y : [2, \"y\"]\r\n+>[2, \"y\"] : [2, \"y\"]\r\n+>2 : 2\r\n+>\"y\" : \"y\"\r\n+\r\n+const t12 = f5({ x: { a: 1, b: \"x\" }, y: { a: 2, b: \"y\" } });\r\n+>t12 : { readonly a: 1; readonly b: \"x\"; } | { readonly a: 2; readonly b: \"y\"; }\r\n+>f5({ x: { a: 1, b: \"x\" }, y: { a: 2, b: \"y\" } }) : { readonly a: 1; readonly b: \"x\"; } | { readonly a: 2; readonly b: \"y\"; }\r\n+>f5 : <const T>(obj: { x: T; y: T; }) => T\r\n+>{ x: { a: 1, b: \"x\" }, y: { a: 2, b: \"y\" } } : { x: { a: 1; b: \"x\"; }; y: { a: 2; b: \"y\"; }; }\r\n+>x : { a: 1; b: \"x\"; }\r\n+>{ a: 1, b: \"x\" } : { a: 1; b: \"x\"; }\r\n+>a : 1\r\n+>1 : 1\r\n+>b : \"x\"\r\n+>\"x\" : \"x\"\r\n+>y : { a: 2; b: \"y\"; }\r\n+>{ a: 2, b: \"y\" } : { a: 2; b: \"y\"; }\r\n+>a : 2\r\n+>2 : 2\r\n+>b : \"y\"\r\n+>\"y\" : \"y\"\r\n+\r\n+/**\r\n+ * @template const T\r\n+ */\r\n+class C {\r\n+>C : C<T>\r\n+\r\n+ /**\r\n+ * @param {T} x\r\n+ */\r\n+ constructor(x) {}\r\n+>x : T\r\n+\r\n+ /**\r\n+ * @template const U\r\n+ * @param {U} x\r\n+ */\r\n+ foo(x) {\r\n+>foo : <const U>(x: U) => U\r\n+>x : U\r\n+\r\n+ return x;\r\n+>x : U\r\n+ }\r\n+}\r\n+\r\n+const t13 = new C({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\r\n+>t13 : C<{ readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }>\r\n+>new C({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] }) : C<{ readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }>\r\n+>C : typeof C\r\n+>{ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] } : { a: 1; b: \"c\"; d: [\"e\", 2, true, { f: \"g\"; }]; }\r\n+>a : 1\r\n+>1 : 1\r\n+>b : \"c\"\r\n+>\"c\" : \"c\"\r\n+>d : [\"e\", 2, true, { f: \"g\"; }]\r\n+>[\"e\", 2, true, { f: \"g\" }] : [\"e\", 2, true, { f: \"g\"; }]\r\n+>\"e\" : \"e\"\r\n+>2 : 2\r\n+>true : true\r\n+>{ f: \"g\" } : { f: \"g\"; }\r\n+>f : \"g\"\r\n+>\"g\" : \"g\"\r\n+\r\n+const t14 = t13.foo([\"a\", [\"b\", \"c\"]]);\r\n+>t14 : readonly [\"a\", readonly [\"b\", \"c\"]]\r\n+>t13.foo([\"a\", [\"b\", \"c\"]]) : readonly [\"a\", readonly [\"b\", \"c\"]]\r\n+>t13.foo : <const U>(x: U) => U\r\n+>t13 : C<{ readonly a: 1; readonly b: \"c\"; readonly d: readonly [\"e\", 2, true, { readonly f: \"g\"; }]; }>\r\n+>foo : <const U>(x: U) => U\r\n+>[\"a\", [\"b\", \"c\"]] : [\"a\", [\"b\", \"c\"]]\r\n+>\"a\" : \"a\"\r\n+>[\"b\", \"c\"] : [\"b\", \"c\"]\r\n+>\"b\" : \"b\"\r\n+>\"c\" : \"c\"\r\n+\r\n+/**\r\n+ * @template {readonly unknown[]} const T\r\n+ * @param {T} args\r\n+ * @returns {T}\r\n+ */\r\n+function f6(...args) {\r\n+>f6 : <const T extends readonly unknown[]>(...args: T) => T\r\n+>args : T\r\n+\r\n+ return args;\r\n+>args : T\r\n+}\r\n+const t15 = f6(1, 'b', { a: 1, b: 'x' });\r\n+>t15 : readonly [1, \"b\", { readonly a: 1; readonly b: \"x\"; }]\r\n+>f6(1, 'b', { a: 1, b: 'x' }) : readonly [1, \"b\", { readonly a: 1; readonly b: \"x\"; }]\r\n+>f6 : <const T extends readonly unknown[]>(...args: T) => T\r\n+>1 : 1\r\n+>'b' : \"b\"\r\n+>{ a: 1, b: 'x' } : { a: 1; b: \"x\"; }\r\n+>a : 1\r\n+>1 : 1\r\n+>b : \"x\"\r\n+>'x' : \"x\"\r\n+\r\ndiff --git a/tests/baselines/reference/jsdocTemplateTag7.errors.txt b/tests/baselines/reference/jsdocTemplateTag7.errors.txt\nnew file mode 100644\nindex 000000000000..6d5770242ed1\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag7.errors.txt\n@@ -0,0 +1,28 @@\n+a.js(2,14): error TS1277: 'const' modifier can only appear on a type parameter of a function, method or class\r\n+a.js(12,14): error TS1273: 'private' modifier cannot appear on a type parameter\r\n+\r\n+\r\n+==== a.js (2 errors) ====\r\n+ /**\r\n+ * @template const T\r\n+ ~~~~~\r\n+!!! error TS1277: 'const' modifier can only appear on a type parameter of a function, method or class\r\n+ * @typedef {[T]} X\r\n+ */\r\n+ \r\n+ /**\r\n+ * @template const T\r\n+ */\r\n+ class C { }\r\n+ \r\n+ /**\r\n+ * @template private T\r\n+ ~~~~~~~\r\n+!!! error TS1273: 'private' modifier cannot appear on a type parameter\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+ function f(x) {\r\n+ return x;\r\n+ }\r\n+ \n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/jsdocTemplateTag7.symbols b/tests/baselines/reference/jsdocTemplateTag7.symbols\nnew file mode 100644\nindex 000000000000..2d734a70fbb8\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag7.symbols\n@@ -0,0 +1,27 @@\n+//// [tests/cases/conformance/jsdoc/jsdocTemplateTag7.ts] ////\r\n+\r\n+=== a.js ===\r\n+/**\r\n+ * @template const T\r\n+ * @typedef {[T]} X\r\n+ */\r\n+\r\n+/**\r\n+ * @template const T\r\n+ */\r\n+class C { }\r\n+>C : Symbol(C, Decl(a.js, 0, 0))\r\n+\r\n+/**\r\n+ * @template private T\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+function f(x) {\r\n+>f : Symbol(f, Decl(a.js, 8, 11))\r\n+>x : Symbol(x, Decl(a.js, 15, 11))\r\n+\r\n+ return x;\r\n+>x : Symbol(x, Decl(a.js, 15, 11))\r\n+}\r\n+\r\ndiff --git a/tests/baselines/reference/jsdocTemplateTag7.types b/tests/baselines/reference/jsdocTemplateTag7.types\nnew file mode 100644\nindex 000000000000..7a49d72b4a4c\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag7.types\n@@ -0,0 +1,27 @@\n+//// [tests/cases/conformance/jsdoc/jsdocTemplateTag7.ts] ////\r\n+\r\n+=== a.js ===\r\n+/**\r\n+ * @template const T\r\n+ * @typedef {[T]} X\r\n+ */\r\n+\r\n+/**\r\n+ * @template const T\r\n+ */\r\n+class C { }\r\n+>C : C<T>\r\n+\r\n+/**\r\n+ * @template private T\r\n+ * @param {T} x\r\n+ * @returns {T}\r\n+ */\r\n+function f(x) {\r\n+>f : <T>(x: T) => T\r\n+>x : T\r\n+\r\n+ return x;\r\n+>x : T\r\n+}\r\n+\r\ndiff --git a/tests/baselines/reference/jsdocTemplateTag8.errors.txt b/tests/baselines/reference/jsdocTemplateTag8.errors.txt\nnew file mode 100644\nindex 000000000000..1c592ae23184\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag8.errors.txt\n@@ -0,0 +1,97 @@\n+a.js(18,1): error TS2322: Type 'Covariant<unknown>' is not assignable to type 'Covariant<string>'.\r\n+ Type 'unknown' is not assignable to type 'string'.\r\n+a.js(36,1): error TS2322: Type 'Contravariant<string>' is not assignable to type 'Contravariant<unknown>'.\r\n+ Type 'unknown' is not assignable to type 'string'.\r\n+a.js(55,1): error TS2322: Type 'Invariant<string>' is not assignable to type 'Invariant<unknown>'.\r\n+ Types of property 'f' are incompatible.\r\n+ Type '(x: string) => string' is not assignable to type '(x: unknown) => unknown'.\r\n+ Types of parameters 'x' and 'x' are incompatible.\r\n+ Type 'unknown' is not assignable to type 'string'.\r\n+a.js(56,1): error TS2322: Type 'Invariant<unknown>' is not assignable to type 'Invariant<string>'.\r\n+ The types returned by 'f(...)' are incompatible between these types.\r\n+ Type 'unknown' is not assignable to type 'string'.\r\n+a.js(59,14): error TS1274: 'in' modifier can only appear on a type parameter of a class, interface or type alias\r\n+\r\n+\r\n+==== a.js (5 errors) ====\r\n+ /**\r\n+ * @template out T\r\n+ * @typedef {Object} Covariant\r\n+ * @property {T} x\r\n+ */\r\n+ \r\n+ /**\r\n+ * @type {Covariant<unknown>}\r\n+ */\r\n+ let super_covariant = { x: 1 };\r\n+ \r\n+ /**\r\n+ * @type {Covariant<string>}\r\n+ */\r\n+ let sub_covariant = { x: '' };\r\n+ \r\n+ super_covariant = sub_covariant;\r\n+ sub_covariant = super_covariant; // Error\r\n+ ~~~~~~~~~~~~~\r\n+!!! error TS2322: Type 'Covariant<unknown>' is not assignable to type 'Covariant<string>'.\r\n+!!! error TS2322: Type 'unknown' is not assignable to type 'string'.\r\n+ \r\n+ /**\r\n+ * @template in T\r\n+ * @typedef {Object} Contravariant\r\n+ * @property {(x: T) => void} f\r\n+ */\r\n+ \r\n+ /**\r\n+ * @type {Contravariant<unknown>}\r\n+ */\r\n+ let super_contravariant = { f: (x) => {} };\r\n+ \r\n+ /**\r\n+ * @type {Contravariant<string>}\r\n+ */\r\n+ let sub_contravariant = { f: (x) => {} };\r\n+ \r\n+ super_contravariant = sub_contravariant; // Error\r\n+ ~~~~~~~~~~~~~~~~~~~\r\n+!!! error TS2322: Type 'Contravariant<string>' is not assignable to type 'Contravariant<unknown>'.\r\n+!!! error TS2322: Type 'unknown' is not assignable to type 'string'.\r\n+ sub_contravariant = super_contravariant;\r\n+ \r\n+ /**\r\n+ * @template in out T\r\n+ * @typedef {Object} Invariant\r\n+ * @property {(x: T) => T} f\r\n+ */\r\n+ \r\n+ /**\r\n+ * @type {Invariant<unknown>}\r\n+ */\r\n+ let super_invariant = { f: (x) => {} };\r\n+ \r\n+ /**\r\n+ * @type {Invariant<string>}\r\n+ */\r\n+ let sub_invariant = { f: (x) => { return \"\" } };\r\n+ \r\n+ super_invariant = sub_invariant; // Error\r\n+ ~~~~~~~~~~~~~~~\r\n+!!! error TS2322: Type 'Invariant<string>' is not assignable to type 'Invariant<unknown>'.\r\n+!!! error TS2322: Types of property 'f' are incompatible.\r\n+!!! error TS2322: Type '(x: string) => string' is not assignable to type '(x: unknown) => unknown'.\r\n+!!! error TS2322: Types of parameters 'x' and 'x' are incompatible.\r\n+!!! error TS2322: Type 'unknown' is not assignable to type 'string'.\r\n+ sub_invariant = super_invariant; // Error\r\n+ ~~~~~~~~~~~~~\r\n+!!! error TS2322: Type 'Invariant<unknown>' is not assignable to type 'Invariant<string>'.\r\n+!!! error TS2322: The types returned by 'f(...)' are incompatible between these types.\r\n+!!! error TS2322: Type 'unknown' is not assignable to type 'string'.\r\n+ \r\n+ /**\r\n+ * @template in T\r\n+ ~~\r\n+!!! error TS1274: 'in' modifier can only appear on a type parameter of a class, interface or type alias\r\n+ * @param {T} x\r\n+ */\r\n+ function f(x) {}\r\n+ \n\\ No newline at end of file\ndiff --git a/tests/baselines/reference/jsdocTemplateTag8.symbols b/tests/baselines/reference/jsdocTemplateTag8.symbols\nnew file mode 100644\nindex 000000000000..5b6d103ed023\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag8.symbols\n@@ -0,0 +1,99 @@\n+//// [tests/cases/conformance/jsdoc/jsdocTemplateTag8.ts] ////\r\n+\r\n+=== a.js ===\r\n+/**\r\n+ * @template out T\r\n+ * @typedef {Object} Covariant\r\n+ * @property {T} x\r\n+ */\r\n+\r\n+/**\r\n+ * @type {Covariant<unknown>}\r\n+ */\r\n+let super_covariant = { x: 1 };\r\n+>super_covariant : Symbol(super_covariant, Decl(a.js, 9, 3))\r\n+>x : Symbol(x, Decl(a.js, 9, 23))\r\n+\r\n+/**\r\n+ * @type {Covariant<string>}\r\n+ */\r\n+let sub_covariant = { x: '' };\r\n+>sub_covariant : Symbol(sub_covariant, Decl(a.js, 14, 3))\r\n+>x : Symbol(x, Decl(a.js, 14, 21))\r\n+\r\n+super_covariant = sub_covariant;\r\n+>super_covariant : Symbol(super_covariant, Decl(a.js, 9, 3))\r\n+>sub_covariant : Symbol(sub_covariant, Decl(a.js, 14, 3))\r\n+\r\n+sub_covariant = super_covariant; // Error\r\n+>sub_covariant : Symbol(sub_covariant, Decl(a.js, 14, 3))\r\n+>super_covariant : Symbol(super_covariant, Decl(a.js, 9, 3))\r\n+\r\n+/**\r\n+ * @template in T\r\n+ * @typedef {Object} Contravariant\r\n+ * @property {(x: T) => void} f\r\n+ */\r\n+\r\n+/**\r\n+ * @type {Contravariant<unknown>}\r\n+ */\r\n+let super_contravariant = { f: (x) => {} };\r\n+>super_contravariant : Symbol(super_contravariant, Decl(a.js, 28, 3))\r\n+>f : Symbol(f, Decl(a.js, 28, 27))\r\n+>x : Symbol(x, Decl(a.js, 28, 32))\r\n+\r\n+/**\r\n+ * @type {Contravariant<string>}\r\n+ */\r\n+let sub_contravariant = { f: (x) => {} };\r\n+>sub_contravariant : Symbol(sub_contravariant, Decl(a.js, 33, 3))\r\n+>f : Symbol(f, Decl(a.js, 33, 25))\r\n+>x : Symbol(x, Decl(a.js, 33, 30))\r\n+\r\n+super_contravariant = sub_contravariant; // Error\r\n+>super_contravariant : Symbol(super_contravariant, Decl(a.js, 28, 3))\r\n+>sub_contravariant : Symbol(sub_contravariant, Decl(a.js, 33, 3))\r\n+\r\n+sub_contravariant = super_contravariant;\r\n+>sub_contravariant : Symbol(sub_contravariant, Decl(a.js, 33, 3))\r\n+>super_contravariant : Symbol(super_contravariant, Decl(a.js, 28, 3))\r\n+\r\n+/**\r\n+ * @template in out T\r\n+ * @typedef {Object} Invariant\r\n+ * @property {(x: T) => T} f\r\n+ */\r\n+\r\n+/**\r\n+ * @type {Invariant<unknown>}\r\n+ */\r\n+let super_invariant = { f: (x) => {} };\r\n+>super_invariant : Symbol(super_invariant, Decl(a.js, 47, 3))\r\n+>f : Symbol(f, Decl(a.js, 47, 23))\r\n+>x : Symbol(x, Decl(a.js, 47, 28))\r\n+\r\n+/**\r\n+ * @type {Invariant<string>}\r\n+ */\r\n+let sub_invariant = { f: (x) => { return \"\" } };\r\n+>sub_invariant : Symbol(sub_invariant, Decl(a.js, 52, 3))\r\n+>f : Symbol(f, Decl(a.js, 52, 21))\r\n+>x : Symbol(x, Decl(a.js, 52, 26))\r\n+\r\n+super_invariant = sub_invariant; // Error\r\n+>super_invariant : Symbol(super_invariant, Decl(a.js, 47, 3))\r\n+>sub_invariant : Symbol(sub_invariant, Decl(a.js, 52, 3))\r\n+\r\n+sub_invariant = super_invariant; // Error\r\n+>sub_invariant : Symbol(sub_invariant, Decl(a.js, 52, 3))\r\n+>super_invariant : Symbol(super_invariant, Decl(a.js, 47, 3))\r\n+\r\n+/**\r\n+ * @template in T\r\n+ * @param {T} x\r\n+ */\r\n+function f(x) {}\r\n+>f : Symbol(f, Decl(a.js, 55, 32))\r\n+>x : Symbol(x, Decl(a.js, 61, 11))\r\n+\r\ndiff --git a/tests/baselines/reference/jsdocTemplateTag8.types b/tests/baselines/reference/jsdocTemplateTag8.types\nnew file mode 100644\nindex 000000000000..d085ff77d0e7\n--- /dev/null\n+++ b/tests/baselines/reference/jsdocTemplateTag8.types\n@@ -0,0 +1,118 @@\n+//// [tests/cases/conformance/jsdoc/jsdocTemplateTag8.ts] ////\r\n+\r\n+=== a.js ===\r\n+/**\r\n+ * @template out T\r\n+ * @typedef {Object} Covariant\r\n+ * @property {T} x\r\n+ */\r\n+\r\n+/**\r\n+ * @type {Covariant<unknown>}\r\n+ */\r\n+let super_covariant = { x: 1 };\r\n+>super_covariant : Covariant<unknown>\r\n+>{ x: 1 } : { x: number; }\r\n+>x : number\r\n+>1 : 1\r\n+\r\n+/**\r\n+ * @type {Covariant<string>}\r\n+ */\r\n+let sub_covariant = { x: '' };\r\n+>sub_covariant : Covariant<string>\r\n+>{ x: '' } : { x: string; }\r\n+>x : string\r\n+>'' : \"\"\r\n+\r\n+super_covariant = sub_covariant;\r\n+>super_covariant = sub_covariant : Covariant<string>\r\n+>super_covariant : Covariant<unknown>\r\n+>sub_covariant : Covariant<string>\r\n+\r\n+sub_covariant = super_covariant; // Error\r\n+>sub_covariant = super_covariant : Covariant<unknown>\r\n+>sub_covariant : Covariant<string>\r\n+>super_covariant : Covariant<unknown>\r\n+\r\n+/**\r\n+ * @template in T\r\n+ * @typedef {Object} Contravariant\r\n+ * @property {(x: T) => void} f\r\n+ */\r\n+\r\n+/**\r\n+ * @type {Contravariant<unknown>}\r\n+ */\r\n+let super_contravariant = { f: (x) => {} };\r\n+>super_contravariant : Contravariant<unknown>\r\n+>{ f: (x) => {} } : { f: (x: unknown) => void; }\r\n+>f : (x: unknown) => void\r\n+>(x) => {} : (x: unknown) => void\r\n+>x : unknown\r\n+\r\n+/**\r\n+ * @type {Contravariant<string>}\r\n+ */\r\n+let sub_contravariant = { f: (x) => {} };\r\n+>sub_contravariant : Contravariant<string>\r\n+>{ f: (x) => {} } : { f: (x: string) => void; }\r\n+>f : (x: string) => void\r\n+>(x) => {} : (x: string) => void\r\n+>x : string\r\n+\r\n+super_contravariant = sub_contravariant; // Error\r\n+>super_contravariant = sub_contravariant : Contravariant<string>\r\n+>super_contravariant : Contravariant<unknown>\r\n+>sub_contravariant : Contravariant<string>\r\n+\r\n+sub_contravariant = super_contravariant;\r\n+>sub_contravariant = super_contravariant : Contravariant<unknown>\r\n+>sub_contravariant : Contravariant<string>\r\n+>super_contravariant : Contravariant<unknown>\r\n+\r\n+/**\r\n+ * @template in out T\r\n+ * @typedef {Object} Invariant\r\n+ * @property {(x: T) => T} f\r\n+ */\r\n+\r\n+/**\r\n+ * @type {Invariant<unknown>}\r\n+ */\r\n+let super_invariant = { f: (x) => {} };\r\n+>super_invariant : Invariant<unknown>\r\n+>{ f: (x) => {} } : { f: (x: unknown) => void; }\r\n+>f : (x: unknown) => void\r\n+>(x) => {} : (x: unknown) => void\r\n+>x : unknown\r\n+\r\n+/**\r\n+ * @type {Invariant<string>}\r\n+ */\r\n+let sub_invariant = { f: (x) => { return \"\" } };\r\n+>sub_invariant : Invariant<string>\r\n+>{ f: (x) => { return \"\" } } : { f: (x: string) => string; }\r\n+>f : (x: string) => string\r\n+>(x) => { return \"\" } : (x: string) => string\r\n+>x : string\r\n+>\"\" : \"\"\r\n+\r\n+super_invariant = sub_invariant; // Error\r\n+>super_invariant = sub_invariant : Invariant<string>\r\n+>super_invariant : Invariant<unknown>\r\n+>sub_invariant : Invariant<string>\r\n+\r\n+sub_invariant = super_invariant; // Error\r\n+>sub_invariant = super_invariant : Invariant<unknown>\r\n+>sub_invariant : Invariant<string>\r\n+>super_invariant : Invariant<unknown>\r\n+\r\n+/**\r\n+ * @template in T\r\n+ * @param {T} x\r\n+ */\r\n+function f(x) {}\r\n+>f : <in T>(x: T) => void\r\n+>x : T\r\n+\r\ndiff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTag6.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTag6.ts\nnew file mode 100644\nindex 000000000000..7555c6917818\n--- /dev/null\n+++ b/tests/cases/conformance/jsdoc/jsdocTemplateTag6.ts\n@@ -0,0 +1,93 @@\n+// @noEmit: true\n+// @allowJs: true\n+// @checkJs: true\n+// @strict: true\n+// @Filename: a.js\n+\n+/**\n+ * @template const T\n+ * @param {T} x\n+ * @returns {T}\n+ */\n+function f1(x) {\n+ return x;\n+}\n+const t1 = f1(\"a\");\n+const t2 = f1([\"a\", [\"b\", \"c\"]]);\n+const t3 = f1({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\n+\n+/**\n+ * @template const T, U\n+ * @param {T} x\n+ * @returns {T}\n+ */\n+function f2(x) {\n+ return x;\n+};\n+const t4 = f2('a');\n+const t5 = f2(['a', ['b', 'c']]);\n+const t6 = f2({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\n+\n+/**\n+ * @template const T\n+ * @param {T} x\n+ * @returns {T[]}\n+ */\n+function f3(x) {\n+ return [x];\n+}\n+const t7 = f3(\"hello\");\n+const t8 = f3(\"hello\");\n+\n+/**\n+ * @template const T\n+ * @param {[T, T]} x\n+ * @returns {T}\n+ */\n+function f4(x) {\n+ return x[0];\n+}\n+const t9 = f4([[1, \"x\"], [2, \"y\"]]);\n+const t10 = f4([{ a: 1, b: \"x\" }, { a: 2, b: \"y\" }]);\n+\n+/**\n+ * @template const T\n+ * @param {{ x: T, y: T}} obj\n+ * @returns {T}\n+ */\n+function f5(obj) {\n+ return obj.x;\n+}\n+const t11 = f5({ x: [1, \"x\"], y: [2, \"y\"] });\n+const t12 = f5({ x: { a: 1, b: \"x\" }, y: { a: 2, b: \"y\" } });\n+\n+/**\n+ * @template const T\n+ */\n+class C {\n+ /**\n+ * @param {T} x\n+ */\n+ constructor(x) {}\n+\n+ /**\n+ * @template const U\n+ * @param {U} x\n+ */\n+ foo(x) {\n+ return x;\n+ }\n+}\n+\n+const t13 = new C({ a: 1, b: \"c\", d: [\"e\", 2, true, { f: \"g\" }] });\n+const t14 = t13.foo([\"a\", [\"b\", \"c\"]]);\n+\n+/**\n+ * @template {readonly unknown[]} const T\n+ * @param {T} args\n+ * @returns {T}\n+ */\n+function f6(...args) {\n+ return args;\n+}\n+const t15 = f6(1, 'b', { a: 1, b: 'x' });\ndiff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTag7.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTag7.ts\nnew file mode 100644\nindex 000000000000..b4f85fb71a17\n--- /dev/null\n+++ b/tests/cases/conformance/jsdoc/jsdocTemplateTag7.ts\n@@ -0,0 +1,24 @@\n+// @noEmit: true\n+// @allowJs: true\n+// @checkJs: true\n+// @strict: true\n+// @Filename: a.js\n+\n+/**\n+ * @template const T\n+ * @typedef {[T]} X\n+ */\n+\n+/**\n+ * @template const T\n+ */\n+class C { }\n+\n+/**\n+ * @template private T\n+ * @param {T} x\n+ * @returns {T}\n+ */\n+function f(x) {\n+ return x;\n+}\ndiff --git a/tests/cases/conformance/jsdoc/jsdocTemplateTag8.ts b/tests/cases/conformance/jsdoc/jsdocTemplateTag8.ts\nnew file mode 100644\nindex 000000000000..3e6c25d2e46f\n--- /dev/null\n+++ b/tests/cases/conformance/jsdoc/jsdocTemplateTag8.ts\n@@ -0,0 +1,68 @@\n+// @noEmit: true\n+// @allowJs: true\n+// @checkJs: true\n+// @strict: true\n+// @Filename: a.js\n+\n+/**\n+ * @template out T\n+ * @typedef {Object} Covariant\n+ * @property {T} x\n+ */\n+\n+/**\n+ * @type {Covariant<unknown>}\n+ */\n+let super_covariant = { x: 1 };\n+\n+/**\n+ * @type {Covariant<string>}\n+ */\n+let sub_covariant = { x: '' };\n+\n+super_covariant = sub_covariant;\n+sub_covariant = super_covariant; // Error\n+\n+/**\n+ * @template in T\n+ * @typedef {Object} Contravariant\n+ * @property {(x: T) => void} f\n+ */\n+\n+/**\n+ * @type {Contravariant<unknown>}\n+ */\n+let super_contravariant = { f: (x) => {} };\n+\n+/**\n+ * @type {Contravariant<string>}\n+ */\n+let sub_contravariant = { f: (x) => {} };\n+\n+super_contravariant = sub_contravariant; // Error\n+sub_contravariant = super_contravariant;\n+\n+/**\n+ * @template in out T\n+ * @typedef {Object} Invariant\n+ * @property {(x: T) => T} f\n+ */\n+\n+/**\n+ * @type {Invariant<unknown>}\n+ */\n+let super_invariant = { f: (x) => {} };\n+\n+/**\n+ * @type {Invariant<string>}\n+ */\n+let sub_invariant = { f: (x) => { return \"\" } };\n+\n+super_invariant = sub_invariant; // Error\n+sub_invariant = super_invariant; // Error\n+\n+/**\n+ * @template in T\n+ * @param {T} x\n+ */\n+function f(x) {}\n", "files": ["src/compiler/checker.ts", "src/compiler/parser.ts", "tests/baselines/reference/jsdocTemplateTag6.symbols", "tests/baselines/reference/jsdocTemplateTag6.types", "tests/baselines/reference/jsdocTemplateTag7.errors.txt", "tests/baselines/reference/jsdocTemplateTag7.symbols", "tests/baselines/reference/jsdocTemplateTag7.types", "tests/baselines/reference/jsdocTemplateTag8.errors.txt", "tests/baselines/reference/jsdocTemplateTag8.symbols", "tests/baselines/reference/jsdocTemplateTag8.types", "tests/cases/conformance/jsdoc/jsdocTemplateTag6.ts", "tests/cases/conformance/jsdoc/jsdocTemplateTag7.ts", "tests/cases/conformance/jsdoc/jsdocTemplateTag8.ts"]}, "2c134db31df48ba5f158f490168dea733a11ae44": {"diff": "diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts\nindex 7c6f4bfe85cf..73a6d2428ca5 100644\n--- a/src/services/formatting/rules.ts\n+++ b/src/services/formatting/rules.ts\n@@ -88,7 +88,7 @@ export function getAllRules(): RuleSpec[] {\n const functionOpenBraceLeftTokenRange = anyTokenIncludingMultilineComments;\r\n \r\n // Place a space before open brace in a TypeScript declaration that has braces as children (class, module, enum, etc)\r\n- const typeScriptOpenBraceLeftTokenRange = tokenRangeFrom([SyntaxKind.Identifier, SyntaxKind.MultiLineCommentTrivia, SyntaxKind.ClassKeyword, SyntaxKind.ExportKeyword, SyntaxKind.ImportKeyword]);\r\n+ const typeScriptOpenBraceLeftTokenRange = tokenRangeFrom([SyntaxKind.Identifier, SyntaxKind.GreaterThanToken, SyntaxKind.MultiLineCommentTrivia, SyntaxKind.ClassKeyword, SyntaxKind.ExportKeyword, SyntaxKind.ImportKeyword]);\r\n \r\n // Place a space before open brace in a control flow construct\r\n const controlOpenBraceLeftTokenRange = tokenRangeFrom([SyntaxKind.CloseParenToken, SyntaxKind.MultiLineCommentTrivia, SyntaxKind.DoKeyword, SyntaxKind.TryKeyword, SyntaxKind.FinallyKeyword, SyntaxKind.ElseKeyword, SyntaxKind.CatchKeyword]);\r\ndiff --git a/tests/cases/fourslash/formatSpaceAfterImplementsExtends.ts b/tests/cases/fourslash/formatSpaceAfterImplementsExtends.ts\nnew file mode 100644\nindex 000000000000..b732c99aa2cd\n--- /dev/null\n+++ b/tests/cases/fourslash/formatSpaceAfterImplementsExtends.ts\n@@ -0,0 +1,27 @@\n+///<reference path=\"fourslash.ts\"/>\n+\n+////class C1 implements Array<string>{\n+////}\n+////\n+////class C2 implements Number{\n+////}\n+////\n+////class C3 extends Array<string>{\n+////}\n+////\n+////class C4 extends Number{\n+////}\n+\n+format.document();\n+verify.currentFileContentIs(\n+`class C1 implements Array<string> {\n+}\n+\n+class C2 implements Number {\n+}\n+\n+class C3 extends Array<string> {\n+}\n+\n+class C4 extends Number {\n+}`);\ndiff --git a/tests/cases/fourslash/genericsFormatting.ts b/tests/cases/fourslash/genericsFormatting.ts\nindex bb2a218a4408..e22b16d433f6 100644\n--- a/tests/cases/fourslash/genericsFormatting.ts\n+++ b/tests/cases/fourslash/genericsFormatting.ts\n@@ -26,7 +26,7 @@\n format.document();\r\n \r\n goTo.marker(\"inClassDeclaration\");\r\n-verify.currentLineContentIs(\"class Foo<T1, T2> {\");\r\n+verify.currentLineContentIs(\"class Foo<T1, T2> {\");\r\n \r\n goTo.marker(\"inMethodDeclaration\");\r\n verify.currentLineContentIs(\" public method<T3, T4>(a: T1, b: Array<T4>): Map<T1, T2, Array<T3>> {\");\r\n", "files": ["src/services/formatting/rules.ts", "tests/cases/fourslash/formatSpaceAfterImplementsExtends.ts", "tests/cases/fourslash/genericsFormatting.ts"]}, "f108468970bf4e70910862476900f924fb701399": {"diff": "diff --git a/Misc/NEWS.d/next/Build/2020-05-01-23-44-31.bpo-11102.Fw9zeS.rst b/Misc/NEWS.d/next/Build/2020-05-01-23-44-31.bpo-11102.Fw9zeS.rst\nnew file mode 100644\nindex 00000000000000..6477538edf5550\n--- /dev/null\n+++ b/Misc/NEWS.d/next/Build/2020-05-01-23-44-31.bpo-11102.Fw9zeS.rst\n@@ -0,0 +1,2 @@\n+The :func:`os.major`, :func:`os.makedev`, and :func:`os.minor` functions are\n+now available on HP-UX v3.\ndiff --git a/Modules/posixmodule.c b/Modules/posixmodule.c\nindex c635fd4d993d57..f4a18536e8f1e1 100644\n--- a/Modules/posixmodule.c\n+++ b/Modules/posixmodule.c\n@@ -236,15 +236,16 @@ corresponding Unix manual entries for more information on calls.\");\n # include <sys/uio.h>\n #endif\n \n+#ifdef HAVE_SYS_TYPES_H\n+/* Should be included before <sys/sysmacros.h> on HP-UX v3 */\n+# include <sys/types.h>\n+#endif /* HAVE_SYS_TYPES_H */\n+\n #ifdef HAVE_SYS_SYSMACROS_H\n /* GNU C Library: major(), minor(), makedev() */\n # include <sys/sysmacros.h>\n #endif\n \n-#ifdef HAVE_SYS_TYPES_H\n-# include <sys/types.h>\n-#endif /* HAVE_SYS_TYPES_H */\n-\n #ifdef HAVE_SYS_STAT_H\n # include <sys/stat.h>\n #endif /* HAVE_SYS_STAT_H */\ndiff --git a/configure b/configure\nindex 6d65d3abc1811b..3322b7a682dd25 100755\n--- a/configure\n+++ b/configure\n@@ -21805,6 +21805,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n #if defined(MAJOR_IN_MKDEV)\n #include <sys/mkdev.h>\n #elif defined(MAJOR_IN_SYSMACROS)\n+#include <sys/types.h>\n #include <sys/sysmacros.h>\n #else\n #include <sys/types.h>\ndiff --git a/configure.ac b/configure.ac\nindex bfdabc4474e5eb..13a6d746763d62 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -5102,6 +5102,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[\n #if defined(MAJOR_IN_MKDEV)\n #include <sys/mkdev.h>\n #elif defined(MAJOR_IN_SYSMACROS)\n+#include <sys/types.h>\n #include <sys/sysmacros.h>\n #else\n #include <sys/types.h>\n", "files": ["Misc/NEWS.d/next/Build/2020-05-01-23-44-31.bpo-11102.Fw9zeS.rst", "Modules/posixmodule.c", "configure", "configure.ac"]}, "cc13eabc7ce08accf49656e258ba500f74a1dae8": {"diff": "diff --git a/Misc/NEWS.d/next/macOS/2023-12-23-22-41-07.gh-issue-110459.NaMBJy.rst b/Misc/NEWS.d/next/macOS/2023-12-23-22-41-07.gh-issue-110459.NaMBJy.rst\nnew file mode 100644\nindex 00000000000000..44ffd857785f0d\n--- /dev/null\n+++ b/Misc/NEWS.d/next/macOS/2023-12-23-22-41-07.gh-issue-110459.NaMBJy.rst\n@@ -0,0 +1,2 @@\n+Running ``configure ... --with-openssl-rpath=X/Y/Z`` no longer fails to detect\n+OpenSSL on macOS.\ndiff --git a/configure b/configure\nindex 7e50abc29d0c1a..6d65d3abc1811b 100755\n--- a/configure\n+++ b/configure\n@@ -27478,7 +27478,12 @@ then :\n \n else $as_nop\n \n- rpath_arg=\"-Wl,-rpath=\"\n+ if test \"$ac_sys_system\" = \"Darwin\"\n+ then\n+ rpath_arg=\"-Wl,-rpath,\"\n+ else\n+ rpath_arg=\"-Wl,-rpath=\"\n+ fi\n \n fi\n \ndiff --git a/configure.ac b/configure.ac\nindex e064848af9ed1b..bfdabc4474e5eb 100644\n--- a/configure.ac\n+++ b/configure.ac\n@@ -6808,7 +6808,12 @@ AX_CHECK_OPENSSL([have_openssl=yes],[have_openssl=no])\n AS_VAR_IF([GNULD], [yes], [\n rpath_arg=\"-Wl,--enable-new-dtags,-rpath=\"\n ], [\n- rpath_arg=\"-Wl,-rpath=\"\n+ if test \"$ac_sys_system\" = \"Darwin\"\n+ then\n+ rpath_arg=\"-Wl,-rpath,\"\n+ else\n+ rpath_arg=\"-Wl,-rpath=\"\n+ fi\n ])\n \n AC_MSG_CHECKING([for --with-openssl-rpath])\n", "files": ["Misc/NEWS.d/next/macOS/2023-12-23-22-41-07.gh-issue-110459.NaMBJy.rst", "configure", "configure.ac"]}, "bfee2f77e16f01a718c1044564ee624f1f2bc328": {"diff": "diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst\nindex aaf79205d44282..2426c37ccb1e0f 100644\n--- a/Doc/library/sys.rst\n+++ b/Doc/library/sys.rst\n@@ -1744,9 +1744,17 @@ always available.\n \n .. availability:: Windows.\n \n+ .. note::\n+ Changing the filesystem encoding after Python startup is risky because\n+ the old fsencoding or paths encoded by the old fsencoding may be cached\n+ somewhere. Use :envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead.\n+\n .. versionadded:: 3.6\n See :pep:`529` for more details.\n \n+ .. deprecated-removed:: 3.13 3.16\n+ Use :envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead.\n+\n .. data:: stdin\n stdout\n stderr\ndiff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst\nindex 4b02ecddd63b27..888ebd0402d0e7 100644\n--- a/Doc/whatsnew/3.13.rst\n+++ b/Doc/whatsnew/3.13.rst\n@@ -474,6 +474,10 @@ Deprecated\n security and functionality bugs. This includes removal of the ``--cgi``\n flag to the ``python -m http.server`` command line in 3.15.\n \n+* :mod:`sys`: :func:`sys._enablelegacywindowsfsencoding` function.\n+ Replace it with :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable.\n+ (Contributed by Inada Naoki in :gh:`73427`.)\n+\n * :mod:`traceback`:\n \n * The field *exc_type* of :class:`traceback.TracebackException` is\ndiff --git a/Misc/NEWS.d/next/Windows/2023-08-08-01-42-14.gh-issue-73427.WOpiNt.rst b/Misc/NEWS.d/next/Windows/2023-08-08-01-42-14.gh-issue-73427.WOpiNt.rst\nnew file mode 100644\nindex 00000000000000..830c4c54838e80\n--- /dev/null\n+++ b/Misc/NEWS.d/next/Windows/2023-08-08-01-42-14.gh-issue-73427.WOpiNt.rst\n@@ -0,0 +1,2 @@\n+Deprecate :func:`sys._enablelegacywindowsfsencoding`. Use\n+:envvar:`PYTHONLEGACYWINDOWSFSENCODING` instead. Patch by Inada Naoki.\ndiff --git a/Python/sysmodule.c b/Python/sysmodule.c\nindex 57dc4a1226ce75..c2de4ecdc8ce0f 100644\n--- a/Python/sysmodule.c\n+++ b/Python/sysmodule.c\n@@ -1715,6 +1715,13 @@ static PyObject *\n sys__enablelegacywindowsfsencoding_impl(PyObject *module)\n /*[clinic end generated code: output=f5c3855b45e24fe9 input=2bfa931a20704492]*/\n {\n+ if (PyErr_WarnEx(PyExc_DeprecationWarning,\n+ \"sys._enablelegacywindowsfsencoding() is deprecated and will be \"\n+ \"removed in Python 3.16. Use PYTHONLEGACYWINDOWSFSENCODING \"\n+ \"instead.\", 1))\n+ {\n+ return NULL;\n+ }\n if (_PyUnicode_EnableLegacyWindowsFSEncoding() < 0) {\n return NULL;\n }\n", "files": ["Doc/library/sys.rst", "Doc/whatsnew/3.13.rst", "Misc/NEWS.d/next/Windows/2023-08-08-01-42-14.gh-issue-73427.WOpiNt.rst", "Python/sysmodule.c"]}, "7ab9efdd6a2fb21cddca1ccd70175f1ac6bd9168": {"diff": "diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py\nindex 3d6816d73d45bc..7323bdd801f4be 100644\n--- a/Lib/test/test_clinic.py\n+++ b/Lib/test/test_clinic.py\n@@ -3920,7 +3920,7 @@ def test_Function_and_Parameter_reprs(self):\n self.assertEqual(repr(parameter), \"<clinic.Parameter 'bar'>\")\n \n def test_Monitor_repr(self):\n- monitor = clinic.cpp.Monitor(\"test.c\")\n+ monitor = libclinic.cpp.Monitor(\"test.c\")\n self.assertRegex(repr(monitor), r\"<clinic.Monitor \\d+ line=0 condition=''>\")\n \n monitor.line_number = 42\ndiff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py\nindex 82efff56eda756..f6f95580f1a177 100755\n--- a/Tools/clinic/clinic.py\n+++ b/Tools/clinic/clinic.py\n@@ -13,7 +13,6 @@\n import collections\n import contextlib\n import copy\n-import cpp\n import dataclasses as dc\n import enum\n import functools\n@@ -53,6 +52,7 @@\n \n # Local imports.\n import libclinic\n+import libclinic.cpp\n from libclinic import ClinicError\n \n \n@@ -648,7 +648,7 @@ class CLanguage(Language):\n \n def __init__(self, filename: str) -> None:\n super().__init__(filename)\n- self.cpp = cpp.Monitor(filename)\n+ self.cpp = libclinic.cpp.Monitor(filename)\n \n def parse_line(self, line: str) -> None:\n self.cpp.writeline(line)\ndiff --git a/Tools/clinic/cpp.py b/Tools/clinic/libclinic/cpp.py\nsimilarity index 99%\nrename from Tools/clinic/cpp.py\nrename to Tools/clinic/libclinic/cpp.py\nindex 659099056cd46c..e115d65a88e1b6 100644\n--- a/Tools/clinic/cpp.py\n+++ b/Tools/clinic/libclinic/cpp.py\n@@ -3,7 +3,10 @@\n import sys\n from typing import NoReturn\n \n-from libclinic.errors import ParseError\n+from .errors import ParseError\n+\n+\n+__all__ = [\"Monitor\"]\n \n \n TokenAndCondition = tuple[str, str]\n", "files": ["Lib/test/test_clinic.py", "Tools/clinic/clinic.py", "Tools/clinic/libclinic/cpp.py"]}, "36a2463e7c01151b05fff9a1f1c6fb08d764c82e": {"diff": "diff --git a/lib/time/update.bash b/lib/time/update.bash\nindex 605afa76d3bcf..e72850079f4a9 100755\n--- a/lib/time/update.bash\n+++ b/lib/time/update.bash\n@@ -24,8 +24,8 @@\n # in the CL match the update.bash in the CL.\n \n # Versions to use.\n-CODE=2023c\n-DATA=2023c\n+CODE=2023d\n+DATA=2023d\n \n set -e\n \ndiff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip\nindex 417ee2b194a75..7cf689f83078a 100644\nBinary files a/lib/time/zoneinfo.zip and b/lib/time/zoneinfo.zip differ\n", "files": ["lib/time/update.bash", "lib/time/zoneinfo.zip"]}, "f6509cf5cdbb5787061b784973782933c47f1782": {"diff": "diff --git a/src/cmd/compile/internal/ssa/sccp.go b/src/cmd/compile/internal/ssa/sccp.go\nindex 86c6117d872b5..77a6f509618af 100644\n--- a/src/cmd/compile/internal/ssa/sccp.go\n+++ b/src/cmd/compile/internal/ssa/sccp.go\n@@ -535,6 +535,13 @@ func rewireSuccessor(block *Block, constVal *Value) bool {\n \tcase BlockJumpTable:\n \t\t// Remove everything but the known taken branch.\n \t\tidx := int(constVal.AuxInt)\n+\t\tif idx < 0 || idx >= len(block.Succs) {\n+\t\t\t// This can only happen in unreachable code,\n+\t\t\t// as an invariant of jump tables is that their\n+\t\t\t// input index is in range.\n+\t\t\t// See issue 64826.\n+\t\t\treturn false\n+\t\t}\n \t\tblock.swapSuccessorsByIdx(0, idx)\n \t\tfor len(block.Succs) > 1 {\n \t\t\tblock.removeEdge(1)\ndiff --git a/test/fixedbugs/issue64826.go b/test/fixedbugs/issue64826.go\nnew file mode 100644\nindex 0000000000000..864c474a644e8\n--- /dev/null\n+++ b/test/fixedbugs/issue64826.go\n@@ -0,0 +1,38 @@\n+// build\n+\n+// Copyright 2023 The Go Authors. All rights reserved.\n+// Use of this source code is governed by a BSD-style\n+// license that can be found in the LICENSE file.\n+\n+package main\n+\n+func main() {\n+\tf(g(false))\n+}\n+func g(b bool) string {\n+\tif b {\n+\t\treturn \"z\"\n+\t}\n+\treturn \"q\"\n+}\n+func f(x string) int {\n+\tswitch len(x) {\n+\tcase 4:\n+\t\treturn 4\n+\tcase 5:\n+\t\treturn 5\n+\tcase 6:\n+\t\treturn 6\n+\tcase 7:\n+\t\treturn 7\n+\tcase 8:\n+\t\treturn 8\n+\tcase 9:\n+\t\treturn 9\n+\tcase 10:\n+\t\treturn 10\n+\tcase 11:\n+\t\treturn 11\n+\t}\n+\treturn 0\n+}\n", "files": ["src/cmd/compile/internal/ssa/sccp.go", "test/fixedbugs/issue64826.go"]}, "9dd1cde9ac0f1e935ed44d33f6b4668be538c1ed": {"diff": "diff --git a/doc/go1.22.html b/doc/go1.22.html\nindex 437e86e6b6da4..3bc0c092ed29c 100644\n--- a/doc/go1.22.html\n+++ b/doc/go1.22.html\n@@ -94,7 +94,9 @@ <h3 id=\"go-command\">Go command</h3>\n \n <!-- CL 518776 -->\n <p>\n- <!-- cmd/go: remove conversion of legacy pre-module dependency configs -->\n+ <code>go</code> <code>mod</code> <code>init</code> no longer attempts to import\n+ module requirements from configuration files for other vendoring tools\n+ (such as <code>Gopkg.lock</code>).\n </p>\n \n <!-- CL 495447 -->\ndiff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go\nindex a40d0556ff142..e61e865c84a8f 100644\n--- a/src/cmd/go/alldocs.go\n+++ b/src/cmd/go/alldocs.go\n@@ -1324,9 +1324,6 @@\n // using import comments in .go files, vendoring tool configuration files (like\n // Gopkg.lock), and the current directory (if in GOPATH).\n //\n-// If a configuration file for a vendoring tool is present, init will attempt to\n-// import module requirements from it.\n-//\n // See https://golang.org/ref/mod#go-mod-init for more about 'go mod init'.\n //\n // # Add missing and remove unused modules\ndiff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go\nindex e4be73fab0bc9..facdaa9911c36 100644\n--- a/src/cmd/go/internal/modcmd/init.go\n+++ b/src/cmd/go/internal/modcmd/init.go\n@@ -25,9 +25,6 @@ module path argument is omitted, init will attempt to infer the module path\n using import comments in .go files, vendoring tool configuration files (like\n Gopkg.lock), and the current directory (if in GOPATH).\n \n-If a configuration file for a vendoring tool is present, init will attempt to\n-import module requirements from it.\n-\n See https://golang.org/ref/mod#go-mod-init for more about 'go mod init'.\n `,\n \tRun: runInit,\n"}, "52dbffeac86863e1e0c9455b5b216ec50c828946": {"diff": "diff --git a/src/cmd/go/internal/base/goflags.go b/src/cmd/go/internal/base/goflags.go\nindex 3d5a76d54b758..eced2c5d58226 100644\n--- a/src/cmd/go/internal/base/goflags.go\n+++ b/src/cmd/go/internal/base/goflags.go\n@@ -88,7 +88,7 @@ type boolFlag interface {\n }\n \n // SetFromGOFLAGS sets the flags in the given flag set using settings in $GOFLAGS.\n-func SetFromGOFLAGS(flags *flag.FlagSet, ignoreErrors bool) {\n+func SetFromGOFLAGS(flags *flag.FlagSet) {\n \tInitGOFLAGS()\n \n \t// This loop is similar to flag.Parse except that it ignores\n@@ -121,22 +121,22 @@ func SetFromGOFLAGS(flags *flag.FlagSet, ignoreErrors bool) {\n \n \t\tif fb, ok := f.Value.(boolFlag); ok && fb.IsBoolFlag() {\n \t\t\tif hasValue {\n-\t\t\t\tif err := flags.Set(f.Name, value); err != nil && !ignoreErrors {\n+\t\t\t\tif err := flags.Set(f.Name, value); err != nil {\n \t\t\t\t\tfmt.Fprintf(flags.Output(), \"go: invalid boolean value %q for flag %s (from %s): %v\\n\", value, name, where, err)\n \t\t\t\t\tflags.Usage()\n \t\t\t\t}\n \t\t\t} else {\n-\t\t\t\tif err := flags.Set(f.Name, \"true\"); err != nil && !ignoreErrors {\n+\t\t\t\tif err := flags.Set(f.Name, \"true\"); err != nil {\n \t\t\t\t\tfmt.Fprintf(flags.Output(), \"go: invalid boolean flag %s (from %s): %v\\n\", name, where, err)\n \t\t\t\t\tflags.Usage()\n \t\t\t\t}\n \t\t\t}\n \t\t} else {\n-\t\t\tif !hasValue && !ignoreErrors {\n+\t\t\tif !hasValue {\n \t\t\t\tfmt.Fprintf(flags.Output(), \"go: flag needs an argument: %s (from %s)\\n\", name, where)\n \t\t\t\tflags.Usage()\n \t\t\t}\n-\t\t\tif err := flags.Set(f.Name, value); err != nil && !ignoreErrors {\n+\t\t\tif err := flags.Set(f.Name, value); err != nil {\n \t\t\t\tfmt.Fprintf(flags.Output(), \"go: invalid value %q for flag %s (from %s): %v\\n\", value, name, where, err)\n \t\t\t\tflags.Usage()\n \t\t\t}\ndiff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go\nindex b3c77dfbc2178..eeab6da62a2da 100644\n--- a/src/cmd/go/internal/modfetch/fetch.go\n+++ b/src/cmd/go/internal/modfetch/fetch.go\n@@ -525,7 +525,7 @@ func readGoSum(dst map[module.Version][]string, file string, data []byte) {\n \t\t\t\t// ignore malformed line so that go mod tidy can fix go.sum\n \t\t\t\tcontinue\n \t\t\t} else {\n-\t\t\t\tbase.Fatalf(\"go: malformed go.sum:\\n%s:%d: wrong number of fields %v\\n\", file, lineno, len(f))\n+\t\t\t\tbase.Fatalf(\"malformed go.sum:\\n%s:%d: wrong number of fields %v\\n\", file, lineno, len(f))\n \t\t\t}\n \t\t}\n \t\tif f[2] == emptyGoModHash {\n@@ -574,32 +574,32 @@ func checkMod(ctx context.Context, mod module.Version) {\n \t// Do the file I/O before acquiring the go.sum lock.\n \tziphash, err := CachePath(ctx, mod, \"ziphash\")\n \tif err != nil {\n-\t\tbase.Fatalf(\"go: verifying %v\", module.VersionError(mod, err))\n+\t\tbase.Fatalf(\"verifying %v\", module.VersionError(mod, err))\n \t}\n \tdata, err := lockedfile.Read(ziphash)\n \tif err != nil {\n-\t\tbase.Fatalf(\"go: verifying %v\", module.VersionError(mod, err))\n+\t\tbase.Fatalf(\"verifying %v\", module.VersionError(mod, err))\n \t}\n \tdata = bytes.TrimSpace(data)\n \tif !isValidSum(data) {\n \t\t// Recreate ziphash file from zip file and use that to check the mod sum.\n \t\tzip, err := CachePath(ctx, mod, \"zip\")\n \t\tif err != nil {\n-\t\t\tbase.Fatalf(\"go: verifying %v\", module.VersionError(mod, err))\n+\t\t\tbase.Fatalf(\"verifying %v\", module.VersionError(mod, err))\n \t\t}\n \t\terr = hashZip(mod, zip, ziphash)\n \t\tif err != nil {\n-\t\t\tbase.Fatalf(\"go: verifying %v\", module.VersionError(mod, err))\n+\t\t\tbase.Fatalf(\"verifying %v\", module.VersionError(mod, err))\n \t\t}\n \t\treturn\n \t}\n \th := string(data)\n \tif !strings.HasPrefix(h, \"h1:\") {\n-\t\tbase.Fatalf(\"go: verifying %v\", module.VersionError(mod, fmt.Errorf(\"unexpected ziphash: %q\", h)))\n+\t\tbase.Fatalf(\"verifying %v\", module.VersionError(mod, fmt.Errorf(\"unexpected ziphash: %q\", h)))\n \t}\n \n \tif err := checkModSum(mod, h); err != nil {\n-\t\tbase.Fatal(err)\n+\t\tbase.Fatalf(\"%s\", err)\n \t}\n }\n \n@@ -684,7 +684,7 @@ func haveModSumLocked(mod module.Version, h string) bool {\n \t\t\treturn true\n \t\t}\n \t\tif strings.HasPrefix(vh, \"h1:\") {\n-\t\t\tbase.Fatalf(\"go: verifying %s@%s: checksum mismatch\\n\\tdownloaded: %v\\n\\t%s: %v\"+goSumMismatch, mod.Path, mod.Version, h, sumFileName, vh)\n+\t\t\tbase.Fatalf(\"verifying %s@%s: checksum mismatch\\n\\tdownloaded: %v\\n\\t%s: %v\"+goSumMismatch, mod.Path, mod.Version, h, sumFileName, vh)\n \t\t}\n \t}\n \t// Also check workspace sums.\n@@ -696,7 +696,7 @@ func haveModSumLocked(mod module.Version, h string) bool {\n \t\t\tif h == vh {\n \t\t\t\tfoundMatch = true\n \t\t\t} else if strings.HasPrefix(vh, \"h1:\") {\n-\t\t\t\tbase.Fatalf(\"go: verifying %s@%s: checksum mismatch\\n\\tdownloaded: %v\\n\\t%s: %v\"+goSumMismatch, mod.Path, mod.Version, h, goSumFile, vh)\n+\t\t\t\tbase.Fatalf(\"verifying %s@%s: checksum mismatch\\n\\tdownloaded: %v\\n\\t%s: %v\"+goSumMismatch, mod.Path, mod.Version, h, goSumFile, vh)\n \t\t\t}\n \t\t}\n \t}\n@@ -895,7 +895,7 @@ func TrimGoSum(keep map[module.Version]bool) {\n \tdefer goSum.mu.Unlock()\n \tinited, err := initGoSum()\n \tif err != nil {\n-\t\tbase.Fatal(err)\n+\t\tbase.Fatalf(\"%s\", err)\n \t}\n \tif !inited {\n \t\treturn\ndiff --git a/src/cmd/go/internal/test/testflag.go b/src/cmd/go/internal/test/testflag.go\nindex 22c3ab1302162..425378889d9af 100644\n--- a/src/cmd/go/internal/test/testflag.go\n+++ b/src/cmd/go/internal/test/testflag.go\n@@ -222,7 +222,7 @@ func (f *shuffleFlag) Set(value string) error {\n //\tgo test fmt -custom-flag-for-fmt-test\n //\tgo test -x math\n func testFlags(args []string) (packageNames, passToTest []string) {\n-\tbase.SetFromGOFLAGS(&CmdTest.Flag, false)\n+\tbase.SetFromGOFLAGS(&CmdTest.Flag)\n \taddFromGOFLAGS := map[string]bool{}\n \tCmdTest.Flag.Visit(func(f *flag.Flag) {\n \t\tif short := strings.TrimPrefix(f.Name, \"test.\"); passFlagToTest[short] {\ndiff --git a/src/cmd/go/internal/toolchain/exec.go b/src/cmd/go/internal/toolchain/exec.go\nindex acfb9e943ca77..820fe93e87c37 100644\n--- a/src/cmd/go/internal/toolchain/exec.go\n+++ b/src/cmd/go/internal/toolchain/exec.go\n@@ -44,12 +44,12 @@ func execGoToolchain(gotoolchain, dir, exe string) {\n \t\t\t\tif e.ProcessState.Exited() {\n \t\t\t\t\tos.Exit(e.ProcessState.ExitCode())\n \t\t\t\t}\n-\t\t\t\tbase.Fatalf(\"go: exec %s: %s\", gotoolchain, e.ProcessState)\n+\t\t\t\tbase.Fatalf(\"exec %s: %s\", gotoolchain, e.ProcessState)\n \t\t\t}\n-\t\t\tbase.Fatalf(\"go: exec %s: %s\", exe, err)\n+\t\t\tbase.Fatalf(\"exec %s: %s\", exe, err)\n \t\t}\n \t\tos.Exit(0)\n \t}\n \terr := syscall.Exec(exe, os.Args, os.Environ())\n-\tbase.Fatalf(\"go: exec %s: %v\", gotoolchain, err)\n+\tbase.Fatalf(\"exec %s: %v\", gotoolchain, err)\n }\ndiff --git a/src/cmd/go/internal/toolchain/select.go b/src/cmd/go/internal/toolchain/select.go\nindex 84fa7f685c97b..9fd1549a61bbc 100644\n--- a/src/cmd/go/internal/toolchain/select.go\n+++ b/src/cmd/go/internal/toolchain/select.go\n@@ -8,10 +8,10 @@ package toolchain\n import (\n \t\"context\"\n \t\"errors\"\n-\t\"flag\"\n \t\"fmt\"\n \t\"go/build\"\n \t\"io/fs\"\n+\t\"log\"\n \t\"os\"\n \t\"path/filepath\"\n \t\"runtime\"\n@@ -20,12 +20,10 @@ import (\n \n \t\"cmd/go/internal/base\"\n \t\"cmd/go/internal/cfg\"\n-\t\"cmd/go/internal/cmdflag\"\n \t\"cmd/go/internal/gover\"\n \t\"cmd/go/internal/modfetch\"\n \t\"cmd/go/internal/modload\"\n \t\"cmd/go/internal/run\"\n-\t\"cmd/go/internal/work\"\n \n \t\"golang.org/x/mod/module\"\n )\n@@ -87,6 +85,9 @@ func FilterEnv(env []string) []string {\n // It must be called early in startup.\n // See https://go.dev/doc/toolchain#select.\n func Select() {\n+\tlog.SetPrefix(\"go: \")\n+\tdefer log.SetPrefix(\"\")\n+\n \tif !modload.WillBeEnabled() {\n \t\treturn\n \t}\n@@ -132,15 +133,15 @@ func Select() {\n \t\t\tv := gover.FromToolchain(min)\n \t\t\tif v == \"\" {\n \t\t\t\tif plus {\n-\t\t\t\t\tbase.Fatalf(\"go: invalid GOTOOLCHAIN %q: invalid minimum toolchain %q\", gotoolchain, min)\n+\t\t\t\t\tbase.Fatalf(\"invalid GOTOOLCHAIN %q: invalid minimum toolchain %q\", gotoolchain, min)\n \t\t\t\t}\n-\t\t\t\tbase.Fatalf(\"go: invalid GOTOOLCHAIN %q\", gotoolchain)\n+\t\t\t\tbase.Fatalf(\"invalid GOTOOLCHAIN %q\", gotoolchain)\n \t\t\t}\n \t\t\tminToolchain = min\n \t\t\tminVers = v\n \t\t}\n \t\tif plus && suffix != \"auto\" && suffix != \"path\" {\n-\t\t\tbase.Fatalf(\"go: invalid GOTOOLCHAIN %q: only version suffixes are +auto and +path\", gotoolchain)\n+\t\t\tbase.Fatalf(\"invalid GOTOOLCHAIN %q: only version suffixes are +auto and +path\", gotoolchain)\n \t\t}\n \t\tmode = suffix\n \t}\n@@ -171,7 +172,7 @@ func Select() {\n \t\t\t\t// has a suffix like \"go1.21.1-foo\" and toolchain is \"go1.21.1\".)\n \t\t\t\ttoolVers := gover.FromToolchain(toolchain)\n \t\t\t\tif toolVers == \"\" || (!strings.HasPrefix(toolchain, \"go\") && !strings.Contains(toolchain, \"-go\")) {\n-\t\t\t\t\tbase.Fatalf(\"go: invalid toolchain %q in %s\", toolchain, base.ShortPath(file))\n+\t\t\t\t\tbase.Fatalf(\"invalid toolchain %q in %s\", toolchain, base.ShortPath(file))\n \t\t\t\t}\n \t\t\t\tif gover.Compare(toolVers, minVers) > 0 {\n \t\t\t\t\tgotoolchain = toolchain\n@@ -193,7 +194,7 @@ func Select() {\n \t// so that we have initialized gover.Startup for use in error messages.\n \tif target := os.Getenv(targetEnv); target != \"\" && TestVersionSwitch != \"loop\" {\n \t\tif gover.LocalToolchain() != target {\n-\t\t\tbase.Fatalf(\"go: toolchain %v invoked to provide %v\", gover.LocalToolchain(), target)\n+\t\t\tbase.Fatalf(\"toolchain %v invoked to provide %v\", gover.LocalToolchain(), target)\n \t\t}\n \t\tos.Unsetenv(targetEnv)\n \n@@ -224,7 +225,7 @@ func Select() {\n \t// We want to disallow mistakes / bad ideas like GOTOOLCHAIN=bash,\n \t// since we will find that in the path lookup.\n \tif !strings.HasPrefix(gotoolchain, \"go1\") && !strings.Contains(gotoolchain, \"-go1\") {\n-\t\tbase.Fatalf(\"go: invalid GOTOOLCHAIN %q\", gotoolchain)\n+\t\tbase.Fatalf(\"invalid GOTOOLCHAIN %q\", gotoolchain)\n \t}\n \n \tExec(gotoolchain)\n@@ -243,6 +244,8 @@ var TestVersionSwitch string\n // as a source of Go toolchains. Otherwise Exec tries the PATH but then downloads\n // a toolchain if necessary.\n func Exec(gotoolchain string) {\n+\tlog.SetPrefix(\"go: \")\n+\n \twriteBits = sysWriteBits()\n \n \tcount, _ := strconv.Atoi(os.Getenv(countEnv))\n@@ -250,7 +253,7 @@ func Exec(gotoolchain string) {\n \t\tfmt.Fprintf(os.Stderr, \"go: switching from go%v to %v [depth %d]\\n\", gover.Local(), gotoolchain, count)\n \t}\n \tif count >= maxSwitch {\n-\t\tbase.Fatalf(\"go: too many toolchain switches\")\n+\t\tbase.Fatalf(\"too many toolchain switches\")\n \t}\n \tos.Setenv(countEnv, fmt.Sprint(count+1))\n \n@@ -273,7 +276,7 @@ func Exec(gotoolchain string) {\n \tcase \"loop\", \"mismatch\":\n \t\texe, err := os.Executable()\n \t\tif err != nil {\n-\t\t\tbase.Fatal(err)\n+\t\t\tbase.Fatalf(\"%v\", err)\n \t\t}\n \t\texecGoToolchain(gotoolchain, os.Getenv(\"GOROOT\"), exe)\n \t}\n@@ -288,7 +291,7 @@ func Exec(gotoolchain string) {\n \t// GOTOOLCHAIN=auto looks in PATH and then falls back to download.\n \t// GOTOOLCHAIN=path only looks in PATH.\n \tif pathOnly {\n-\t\tbase.Fatalf(\"go: cannot find %q in PATH\", gotoolchain)\n+\t\tbase.Fatalf(\"cannot find %q in PATH\", gotoolchain)\n \t}\n \n \t// Set up modules without an explicit go.mod, to download distribution.\n@@ -307,9 +310,9 @@ func Exec(gotoolchain string) {\n \tdir, err := modfetch.Download(context.Background(), m)\n \tif err != nil {\n \t\tif errors.Is(err, fs.ErrNotExist) {\n-\t\t\tbase.Fatalf(\"go: download %s for %s/%s: toolchain not available\", gotoolchain, runtime.GOOS, runtime.GOARCH)\n+\t\t\tbase.Fatalf(\"download %s for %s/%s: toolchain not available\", gotoolchain, runtime.GOOS, runtime.GOARCH)\n \t\t}\n-\t\tbase.Fatalf(\"go: download %s: %v\", gotoolchain, err)\n+\t\tbase.Fatalf(\"download %s: %v\", gotoolchain, err)\n \t}\n \n \t// On first use after download, set the execute bits on the commands\n@@ -318,7 +321,7 @@ func Exec(gotoolchain string) {\n \tif runtime.GOOS != \"windows\" {\n \t\tinfo, err := os.Stat(filepath.Join(dir, \"bin/go\"))\n \t\tif err != nil {\n-\t\t\tbase.Fatalf(\"go: download %s: %v\", gotoolchain, err)\n+\t\t\tbase.Fatalf(\"download %s: %v\", gotoolchain, err)\n \t\t}\n \t\tif info.Mode()&0111 == 0 {\n \t\t\t// allowExec sets the exec permission bits on all files found in dir.\n@@ -339,7 +342,7 @@ func Exec(gotoolchain string) {\n \t\t\t\t\treturn nil\n \t\t\t\t})\n \t\t\t\tif err != nil {\n-\t\t\t\t\tbase.Fatalf(\"go: download %s: %v\", gotoolchain, err)\n+\t\t\t\t\tbase.Fatalf(\"download %s: %v\", gotoolchain, err)\n \t\t\t\t}\n \t\t\t}\n \n@@ -381,7 +384,7 @@ func Exec(gotoolchain string) {\n \t\t\terr = raceSafeCopy(srcUGoMod, srcGoMod)\n \t\t}\n \t\tif err != nil {\n-\t\t\tbase.Fatalf(\"go: download %s: %v\", gotoolchain, err)\n+\t\t\tbase.Fatalf(\"download %s: %v\", gotoolchain, err)\n \t\t}\n \t}\n \n@@ -472,7 +475,7 @@ func modGoToolchain() (file, goVers, toolchain string) {\n \n \tdata, err := os.ReadFile(file)\n \tif err != nil {\n-\t\tbase.Fatal(err)\n+\t\tbase.Fatalf(\"%v\", err)\n \t}\n \treturn file, gover.GoModLookup(data, \"go\"), gover.GoModLookup(data, \"toolchain\")\n }\n@@ -489,7 +492,6 @@ func goInstallVersion() bool {\n \n \t// Check for pkg@version.\n \tvar arg string\n-\tvar cmdFlags *flag.FlagSet\n \tswitch os.Args[1] {\n \tdefault:\n \t\treturn false\n@@ -498,7 +500,6 @@ func goInstallVersion() bool {\n \t\t// across a toolchain switch. To make that work, assume the pkg@version\n \t\t// is the last argument and skip the flag parsing.\n \t\targ = os.Args[len(os.Args)-1]\n-\t\tcmdFlags = &work.CmdInstall.Flag\n \tcase \"run\":\n \t\t// For run, the pkg@version can be anywhere on the command line,\n \t\t// because it is preceded by run flags and followed by arguments to the\n@@ -506,7 +507,6 @@ func goInstallVersion() bool {\n \t\t// flags a little bit, to know whether each flag takes an optional argument.\n \t\t// We can still allow unknown flags as long as they have an explicit =value.\n \t\targs := os.Args[2:]\n-\t\tcmdFlags = &run.CmdRun.Flag\n \t\tfor i := 0; i < len(args); i++ {\n \t\t\ta := args[i]\n \t\t\tif !strings.HasPrefix(a, \"-\") {\n@@ -554,20 +554,6 @@ func goInstallVersion() bool {\n \t\treturn false\n \t}\n \n-\t// Make a best effort to parse flags so that module flags like -modcacherw\n-\t// will take effect (see https://go.dev/issue/64282).\n-\targs := os.Args[2:]\n-\tfor len(args) > 0 {\n-\t\tvar err error\n-\t\t_, args, err = cmdflag.ParseOne(cmdFlags, args)\n-\t\tif errors.Is(err, cmdflag.ErrFlagTerminator) {\n-\t\t\tbreak\n-\t\t}\n-\t\t// Ignore all other errors: they may be new flags \u2014 or updated syntax for\n-\t\t// existing flags \u2014 intended for a newer Go toolchain.\n-\t}\n-\tbase.SetFromGOFLAGS(cmdFlags, true)\n-\n \t// It would be correct to simply return true here, bypassing use\n \t// of the current go.mod or go.work, and let \"go run\" or \"go install\"\n \t// do the rest, including a toolchain switch.\ndiff --git a/src/cmd/go/internal/vet/vetflag.go b/src/cmd/go/internal/vet/vetflag.go\nindex 601ae9aa64ba1..eb7af6508d00b 100644\n--- a/src/cmd/go/internal/vet/vetflag.go\n+++ b/src/cmd/go/internal/vet/vetflag.go\n@@ -116,7 +116,7 @@ func vetFlags(args []string) (passToVet, packageNames []string) {\n \n \t// Record the set of vet tool flags set by GOFLAGS. We want to pass them to\n \t// the vet tool, but only if they aren't overridden by an explicit argument.\n-\tbase.SetFromGOFLAGS(&CmdVet.Flag, false)\n+\tbase.SetFromGOFLAGS(&CmdVet.Flag)\n \taddFromGOFLAGS := map[string]bool{}\n \tCmdVet.Flag.Visit(func(f *flag.Flag) {\n \t\tif isVetFlag[f.Name] {\ndiff --git a/src/cmd/go/main.go b/src/cmd/go/main.go\nindex b309cb867ab26..d380aae489436 100644\n--- a/src/cmd/go/main.go\n+++ b/src/cmd/go/main.go\n@@ -234,7 +234,7 @@ func invoke(cmd *base.Command, args []string) {\n \tif cmd.CustomFlags {\n \t\targs = args[1:]\n \t} else {\n-\t\tbase.SetFromGOFLAGS(&cmd.Flag, false)\n+\t\tbase.SetFromGOFLAGS(&cmd.Flag)\n \t\tcmd.Flag.Parse(args[1:])\n \t\targs = cmd.Flag.Args()\n \t}\ndiff --git a/src/cmd/go/testdata/script/install_modcacherw_issue64282.txt b/src/cmd/go/testdata/script/install_modcacherw_issue64282.txt\ndeleted file mode 100644\nindex ea644f789ea2f..0000000000000\n--- a/src/cmd/go/testdata/script/install_modcacherw_issue64282.txt\n+++ /dev/null\n@@ -1,32 +0,0 @@\n-# Regression test for https://go.dev/issue/64282:\n-# 'go install' and 'go run' with pkg@version arguments should make\n-# a best effort to parse flags before they download modules to\n-# identify which toolchain version to use, because those flags\n-# may affect the downloaded contents.\n-\n-# However, the best-effort flag parsing should not interfere with\n-# actual flag parsing if we don't switch toolchains. In particular,\n-# unrecognized flags should still be diagnosed after the module for\n-# the requested package has been downloaded and checked for toolchain\n-# upgrades.\n-\n-! go install -cake=delicious -modcacherw example.com/printversion@v0.1.0\n-stderr '^flag provided but not defined: -cake$'\n-\n-[!short] go install -modcacherw example.com/printversion@v0.1.0\n-\t# Because the -modcacherw flag was set, we should be able to modify the contents\n-\t# of a directory within the module cache.\n-cp $WORK/extraneous.txt $GOPATH/pkg/mod/example.com/printversion@v0.1.0/extraneous_file.go\n-\n-\n-# We should also apply flags from GOFLAGS at this step.\n-\n-go clean -modcache\n-env GOFLAGS=-modcacherw\n-! go install -cake=delicious example.com/printversion@v0.1.0\n-stderr '^flag provided but not defined: -cake$'\n-cp $WORK/extraneous.txt $GOPATH/pkg/mod/example.com/printversion@v0.1.0/extraneous_file.go\n-\n-\n--- $WORK/extraneous.txt --\n-This is not a Go source file.\ndiff --git a/src/cmd/go/testdata/script/malformed_gosum_issue62345.txt b/src/cmd/go/testdata/script/malformed_gosum_issue62345.txt\nindex 35fad2919326f..23c41beae90ae 100644\n--- a/src/cmd/go/testdata/script/malformed_gosum_issue62345.txt\n+++ b/src/cmd/go/testdata/script/malformed_gosum_issue62345.txt\n@@ -1,5 +1,5 @@\n ! go mod download\n-stderr '^go: malformed go.sum:\\n.*go.sum:3: wrong number of fields 5\\n$'\n+stderr '^malformed go.sum:\\n.*go.sum:3: wrong number of fields 5\\n$'\n \n go mod tidy\n cmp go.sum go.sum.after-tidy\ndiff --git a/src/cmd/go/testdata/script/work_sum_mismatch.txt b/src/cmd/go/testdata/script/work_sum_mismatch.txt\nindex d4997aa37246e..ca5d71dc5e73c 100644\n--- a/src/cmd/go/testdata/script/work_sum_mismatch.txt\n+++ b/src/cmd/go/testdata/script/work_sum_mismatch.txt\n@@ -4,7 +4,7 @@\n cmpenv stderr want-error\n \n -- want-error --\n-go: verifying rsc.io/sampler@v1.3.0/go.mod: checksum mismatch\n+verifying rsc.io/sampler@v1.3.0/go.mod: checksum mismatch\n \tdownloaded: h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n \t$WORK${/}gopath${/}src${/}a${/}go.sum: h1:U1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=\n \n@@ -58,4 +58,4 @@ import (\n \n func main() {\n \tfmt.Println(quote.Hello())\n-}\n+}\n\\ No newline at end of file\n", "files": ["src/cmd/go/internal/base/goflags.go", "src/cmd/go/internal/modfetch/fetch.go", "src/cmd/go/internal/test/testflag.go", "src/cmd/go/internal/toolchain/exec.go", "src/cmd/go/internal/toolchain/select.go", "src/cmd/go/internal/vet/vetflag.go", "src/cmd/go/main.go", "src/cmd/go/testdata/script/install_modcacherw_issue64282.txt", "src/cmd/go/testdata/script/malformed_gosum_issue62345.txt", "src/cmd/go/testdata/script/work_sum_mismatch.txt"]}, "af73483f4e8b6f5c68c9aa63257bdd929a9c194a": {"diff": "diff --git a/lib/idr.c b/lib/idr.c\nindex 13f2758c237735..da36054c3ca020 100644\n--- a/lib/idr.c\n+++ b/lib/idr.c\n@@ -508,7 +508,7 @@ void ida_free(struct ida *ida, unsigned int id)\n \t\t\tgoto delete;\n \t\txas_store(&xas, xa_mk_value(v));\n \t} else {\n-\t\tif (!test_bit(bit, bitmap->bitmap))\n+\t\tif (!bitmap || !test_bit(bit, bitmap->bitmap))\n \t\t\tgoto err;\n \t\t__clear_bit(bit, bitmap->bitmap);\n \t\txas_set_mark(&xas, XA_FREE_MARK);\ndiff --git a/lib/test_ida.c b/lib/test_ida.c\nindex b0688062596150..55105baa19da9a 100644\n--- a/lib/test_ida.c\n+++ b/lib/test_ida.c\n@@ -150,6 +150,45 @@ static void ida_check_conv(struct ida *ida)\n \tIDA_BUG_ON(ida, !ida_is_empty(ida));\n }\n \n+/*\n+ * Check various situations where we attempt to free an ID we don't own.\n+ */\n+static void ida_check_bad_free(struct ida *ida)\n+{\n+\tunsigned long i;\n+\n+\tprintk(\"vvv Ignore \\\"not allocated\\\" warnings\\n\");\n+\t/* IDA is empty; all of these will fail */\n+\tida_free(ida, 0);\n+\tfor (i = 0; i < 31; i++)\n+\t\tida_free(ida, 1 << i);\n+\n+\t/* IDA contains a single value entry */\n+\tIDA_BUG_ON(ida, ida_alloc_min(ida, 3, GFP_KERNEL) != 3);\n+\tida_free(ida, 0);\n+\tfor (i = 0; i < 31; i++)\n+\t\tida_free(ida, 1 << i);\n+\n+\t/* IDA contains a single bitmap */\n+\tIDA_BUG_ON(ida, ida_alloc_min(ida, 1023, GFP_KERNEL) != 1023);\n+\tida_free(ida, 0);\n+\tfor (i = 0; i < 31; i++)\n+\t\tida_free(ida, 1 << i);\n+\n+\t/* IDA contains a tree */\n+\tIDA_BUG_ON(ida, ida_alloc_min(ida, (1 << 20) - 1, GFP_KERNEL) != (1 << 20) - 1);\n+\tida_free(ida, 0);\n+\tfor (i = 0; i < 31; i++)\n+\t\tida_free(ida, 1 << i);\n+\tprintk(\"^^^ \\\"not allocated\\\" warnings over\\n\");\n+\n+\tida_free(ida, 3);\n+\tida_free(ida, 1023);\n+\tida_free(ida, (1 << 20) - 1);\n+\n+\tIDA_BUG_ON(ida, !ida_is_empty(ida));\n+}\n+\n static DEFINE_IDA(ida);\n \n static int ida_checks(void)\n@@ -162,6 +201,7 @@ static int ida_checks(void)\n \tida_check_leaf(&ida, 1024 * 64);\n \tida_check_max(&ida);\n \tida_check_conv(&ida);\n+\tida_check_bad_free(&ida);\n \n \tprintk(\"IDA: %u of %u tests passed\\n\", tests_passed, tests_run);\n \treturn (tests_run != tests_passed) ? 0 : -EINVAL;\n"}, "87295b4068762f9cbdfcae5fed5ff54aadd3cb62": {"diff": "diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py\nindex 21f56fe0195e69..3d6816d73d45bc 100644\n--- a/Lib/test/test_clinic.py\n+++ b/Lib/test/test_clinic.py\n@@ -22,7 +22,7 @@\n \n \n def _make_clinic(*, filename='clinic_tests'):\n- clang = clinic.CLanguage(None)\n+ clang = clinic.CLanguage(filename)\n c = clinic.Clinic(clang, filename=filename, limited_capi=False)\n c.block_parser = clinic.BlockParser('', clang)\n return c\n@@ -3920,7 +3920,7 @@ def test_Function_and_Parameter_reprs(self):\n self.assertEqual(repr(parameter), \"<clinic.Parameter 'bar'>\")\n \n def test_Monitor_repr(self):\n- monitor = clinic.cpp.Monitor()\n+ monitor = clinic.cpp.Monitor(\"test.c\")\n self.assertRegex(repr(monitor), r\"<clinic.Monitor \\d+ line=0 condition=''>\")\n \n monitor.line_number = 42\ndiff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py\nindex f004bec3cce8f6..82efff56eda756 100755\n--- a/Tools/clinic/clinic.py\n+++ b/Tools/clinic/clinic.py\n@@ -53,6 +53,7 @@\n \n # Local imports.\n import libclinic\n+from libclinic import ClinicError\n \n \n # TODO:\n@@ -94,27 +95,6 @@ def __repr__(self) -> str:\n TemplateDict = dict[str, str]\n \n \n-@dc.dataclass\n-class ClinicError(Exception):\n- message: str\n- _: dc.KW_ONLY\n- lineno: int | None = None\n- filename: str | None = None\n-\n- def __post_init__(self) -> None:\n- super().__init__(self.message)\n-\n- def report(self, *, warn_only: bool = False) -> str:\n- msg = \"Warning\" if warn_only else \"Error\"\n- if self.filename is not None:\n- msg += f\" in file {self.filename!r}\"\n- if self.lineno is not None:\n- msg += f\" on line {self.lineno}\"\n- msg += \":\\n\"\n- msg += f\"{self.message}\\n\"\n- return msg\n-\n-\n @overload\n def warn_or_fail(\n *args: object,\n@@ -669,7 +649,6 @@ class CLanguage(Language):\n def __init__(self, filename: str) -> None:\n super().__init__(filename)\n self.cpp = cpp.Monitor(filename)\n- self.cpp.fail = fail # type: ignore[method-assign]\n \n def parse_line(self, line: str) -> None:\n self.cpp.writeline(line)\ndiff --git a/Tools/clinic/cpp.py b/Tools/clinic/cpp.py\nindex 16eee6fc399491..659099056cd46c 100644\n--- a/Tools/clinic/cpp.py\n+++ b/Tools/clinic/cpp.py\n@@ -3,6 +3,8 @@\n import sys\n from typing import NoReturn\n \n+from libclinic.errors import ParseError\n+\n \n TokenAndCondition = tuple[str, str]\n TokenStack = list[TokenAndCondition]\n@@ -32,7 +34,7 @@ class Monitor:\n \n Anyway this implementation seems to work well enough for the CPython sources.\n \"\"\"\n- filename: str | None = None\n+ filename: str\n _: dc.KW_ONLY\n verbose: bool = False\n \n@@ -59,14 +61,8 @@ def condition(self) -> str:\n \"\"\"\n return \" && \".join(condition for token, condition in self.stack)\n \n- def fail(self, *a: object) -> NoReturn:\n- if self.filename:\n- filename = \" \" + self.filename\n- else:\n- filename = ''\n- print(\"Error at\" + filename, \"line\", self.line_number, \":\")\n- print(\" \", ' '.join(str(x) for x in a))\n- sys.exit(-1)\n+ def fail(self, msg: str) -> NoReturn:\n+ raise ParseError(msg, filename=self.filename, lineno=self.line_number)\n \n def writeline(self, line: str) -> None:\n self.line_number += 1\n@@ -74,7 +70,7 @@ def writeline(self, line: str) -> None:\n \n def pop_stack() -> TokenAndCondition:\n if not self.stack:\n- self.fail(\"#\" + token + \" without matching #if / #ifdef / #ifndef!\")\n+ self.fail(f\"#{token} without matching #if / #ifdef / #ifndef!\")\n return self.stack.pop()\n \n if self.continuation:\n@@ -145,7 +141,7 @@ def pop_stack() -> TokenAndCondition:\n \n if token in {'if', 'ifdef', 'ifndef', 'elif'}:\n if not condition:\n- self.fail(\"Invalid format for #\" + token + \" line: no argument!\")\n+ self.fail(f\"Invalid format for #{token} line: no argument!\")\n if token in {'if', 'elif'}:\n if not is_a_simple_defined(condition):\n condition = \"(\" + condition + \")\"\n@@ -155,7 +151,8 @@ def pop_stack() -> TokenAndCondition:\n else:\n fields = condition.split()\n if len(fields) != 1:\n- self.fail(\"Invalid format for #\" + token + \" line: should be exactly one argument!\")\n+ self.fail(f\"Invalid format for #{token} line: \"\n+ \"should be exactly one argument!\")\n symbol = fields[0]\n condition = 'defined(' + symbol + ')'\n if token == 'ifndef':\ndiff --git a/Tools/clinic/libclinic/__init__.py b/Tools/clinic/libclinic/__init__.py\nindex 0c3c6840901a42..d4e7a0c5cf7b76 100644\n--- a/Tools/clinic/libclinic/__init__.py\n+++ b/Tools/clinic/libclinic/__init__.py\n@@ -1,5 +1,8 @@\n from typing import Final\n \n+from .errors import (\n+ ClinicError,\n+)\n from .formatting import (\n SIG_END_MARKER,\n c_repr,\n@@ -15,6 +18,9 @@\n \n \n __all__ = [\n+ # Error handling\n+ \"ClinicError\",\n+\n # Formatting helpers\n \"SIG_END_MARKER\",\n \"c_repr\",\ndiff --git a/Tools/clinic/libclinic/errors.py b/Tools/clinic/libclinic/errors.py\nnew file mode 100644\nindex 00000000000000..afb21b02386fe7\n--- /dev/null\n+++ b/Tools/clinic/libclinic/errors.py\n@@ -0,0 +1,26 @@\n+import dataclasses as dc\n+\n+\n+@dc.dataclass\n+class ClinicError(Exception):\n+ message: str\n+ _: dc.KW_ONLY\n+ lineno: int | None = None\n+ filename: str | None = None\n+\n+ def __post_init__(self) -> None:\n+ super().__init__(self.message)\n+\n+ def report(self, *, warn_only: bool = False) -> str:\n+ msg = \"Warning\" if warn_only else \"Error\"\n+ if self.filename is not None:\n+ msg += f\" in file {self.filename!r}\"\n+ if self.lineno is not None:\n+ msg += f\" on line {self.lineno}\"\n+ msg += \":\\n\"\n+ msg += f\"{self.message}\\n\"\n+ return msg\n+\n+\n+class ParseError(ClinicError):\n+ pass\n"}, "6fe0d3758b35afcc342832e376d8d985a5a29070": {"diff": "diff --git a/src/cmd/compile/internal/base/debug.go b/src/cmd/compile/internal/base/debug.go\nindex a85f0139fc3b4..aadd950a0a0ad 100644\n--- a/src/cmd/compile/internal/base/debug.go\n+++ b/src/cmd/compile/internal/base/debug.go\n@@ -36,7 +36,6 @@ type DebugFlags struct {\n \tGossahash string `help:\"hash value for use in debugging the compiler\"`\n \tInlFuncsWithClosures int `help:\"allow functions with closures to be inlined\" concurrent:\"ok\"`\n \tInlStaticInit int `help:\"allow static initialization of inlined calls\" concurrent:\"ok\"`\n-\tInterfaceCycles int `help:\"allow anonymous interface cycles\"`\n \tLibfuzzer int `help:\"enable coverage instrumentation for libfuzzer\"`\n \tLoopVar int `help:\"shared (0, default), 1 (private loop variables), 2, private + log\"`\n \tLoopVarHash string `help:\"for debugging changes in loop behavior. Overrides experiment and loopvar flag.\"`\ndiff --git a/src/cmd/compile/internal/noder/irgen.go b/src/cmd/compile/internal/noder/irgen.go\nindex 46511d1f9736e..d909f3467bf08 100644\n--- a/src/cmd/compile/internal/noder/irgen.go\n+++ b/src/cmd/compile/internal/noder/irgen.go\n@@ -92,23 +92,22 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {\n \t}\n \n \t// Check for anonymous interface cycles (#56103).\n-\tif base.Debug.InterfaceCycles == 0 {\n-\t\tvar f cycleFinder\n-\t\tfor _, file := range files {\n-\t\t\tsyntax.Inspect(file, func(n syntax.Node) bool {\n-\t\t\t\tif n, ok := n.(*syntax.InterfaceType); ok {\n-\t\t\t\t\tif f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) {\n-\t\t\t\t\t\tbase.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, \"invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)\")\n-\n-\t\t\t\t\t\tfor typ := range f.cyclic {\n-\t\t\t\t\t\t\tf.cyclic[typ] = false // suppress duplicate errors\n-\t\t\t\t\t\t}\n+\t// TODO(gri) move this code into the type checkers (types2 and go/types)\n+\tvar f cycleFinder\n+\tfor _, file := range files {\n+\t\tsyntax.Inspect(file, func(n syntax.Node) bool {\n+\t\t\tif n, ok := n.(*syntax.InterfaceType); ok {\n+\t\t\t\tif f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) {\n+\t\t\t\t\tbase.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, \"invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)\")\n+\n+\t\t\t\t\tfor typ := range f.cyclic {\n+\t\t\t\t\t\tf.cyclic[typ] = false // suppress duplicate errors\n \t\t\t\t\t}\n-\t\t\t\t\treturn false\n \t\t\t\t}\n-\t\t\t\treturn true\n-\t\t\t})\n-\t\t}\n+\t\t\t\treturn false\n+\t\t\t}\n+\t\t\treturn true\n+\t\t})\n \t}\n \tbase.ExitIfErrors()\n \ndiff --git a/src/cmd/compile/internal/types2/stdlib_test.go b/src/cmd/compile/internal/types2/stdlib_test.go\nindex 7c14e3476e7ba..405af78572bba 100644\n--- a/src/cmd/compile/internal/types2/stdlib_test.go\n+++ b/src/cmd/compile/internal/types2/stdlib_test.go\n@@ -311,6 +311,7 @@ func TestStdFixed(t *testing.T) {\n \n \ttestTestDir(t, filepath.Join(testenv.GOROOT(t), \"test\", \"fixedbugs\"),\n \t\t\"bug248.go\", \"bug302.go\", \"bug369.go\", // complex test instructions - ignore\n+\t\t\"bug398.go\", // types2 doesn't check for anonymous interface cycles (go.dev/issue/56103)\n \t\t\"issue6889.go\", // gc-specific test\n \t\t\"issue11362.go\", // canonical import path check\n \t\t\"issue16369.go\", // types2 handles this correctly - not an issue\ndiff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go\nindex f90f9388c2809..a89cd858db5be 100644\n--- a/src/go/types/stdlib_test.go\n+++ b/src/go/types/stdlib_test.go\n@@ -312,6 +312,7 @@ func TestStdFixed(t *testing.T) {\n \n \ttestTestDir(t, filepath.Join(testenv.GOROOT(t), \"test\", \"fixedbugs\"),\n \t\t\"bug248.go\", \"bug302.go\", \"bug369.go\", // complex test instructions - ignore\n+\t\t\"bug398.go\", // go/types doesn't check for anonymous interface cycles (go.dev/issue/56103)\n \t\t\"issue6889.go\", // gc-specific test\n \t\t\"issue11362.go\", // canonical import path check\n \t\t\"issue16369.go\", // go/types handles this correctly - not an issue\ndiff --git a/test/fixedbugs/bug398.go b/test/fixedbugs/bug398.go\nindex db3e43c7f965e..2b00f6074d4c3 100644\n--- a/test/fixedbugs/bug398.go\n+++ b/test/fixedbugs/bug398.go\n@@ -1,4 +1,4 @@\n-// compile -d=interfacecycles\n+// errorcheck\n \n // Copyright 2012 The Go Authors. All rights reserved.\n // Use of this source code is governed by a BSD-style\n@@ -11,11 +11,11 @@ package p\n \n // exported interfaces\n \n-type I1 interface {\n+type I1 interface { // ERROR \"invalid recursive type: anonymous interface refers to itself\"\n F() interface{I1}\n }\n \n-type I2 interface {\n+type I2 interface { // ERROR \"invalid recursive type: anonymous interface refers to itself\"\n F() interface{I2}\n }\n \n@@ -28,11 +28,11 @@ func F() bool {\n \n // non-exported interfaces\n \n-type i1 interface {\n+type i1 interface { // ERROR \"invalid recursive type: anonymous interface refers to itself\"\n F() interface{i1}\n }\n \n-type i2 interface {\n+type i2 interface { // ERROR \"invalid recursive type: anonymous interface refers to itself\"\n F() interface{i2}\n }\n \ndiff --git a/test/fixedbugs/issue16369.go b/test/fixedbugs/issue16369.go\nindex 3a7bb7eaed6fb..86d0ce645d211 100644\n--- a/test/fixedbugs/issue16369.go\n+++ b/test/fixedbugs/issue16369.go\n@@ -1,4 +1,4 @@\n-// compile -d=interfacecycles\n+// errorcheck\n \n // Copyright 2016 The Go Authors. All rights reserved.\n // Use of this source code is governed by a BSD-style\n@@ -6,7 +6,7 @@\n \n package p\n \n-type T interface {\n+type T interface { // ERROR \"invalid recursive type: anonymous interface refers to itself\"\n \tM(interface {\n \t\tT\n \t})\n"}} |