microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.69k stars 12.44k forks source link

Potential memory leak or dead recursive during auto completion #59998

Open neko-para opened 4 weeks ago

neko-para commented 4 weeks ago

🔎 Search Terms

memory leak auto completion

🕗 Version & Regression Information

seems occur since first version that could compile those code.

Please forgive me for providing such a huge source code, as its complexity has to be kept to cause noticeable memory consumption rate (about 30MB/s, at least).

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/C4TwDgpgBAShDGB7AKuaBeAUFHUA+UA5ACICWATgsABKnCHa4GHIQC2YANgIbAQCyveAAsGufEQBiEXgFdKg4CLFMiAYUSdE5RcsY5mAeTUwVBogDkI87pyvAA7toDWangGd3pAGYgzEwisbOwhHF2JQqn9mNVl3YEQ2BkxQSCgAQXhgVDSscWZiRAtEYGFSADsAc2j1TlJ4ZxrCAGUHUkgmgGkIP30A1gAPej7mZuBucmB0sDAmscQwadmRonmwZG53RpXCWPjE5NToQ3IAEwhyACEQQTAodCgAbz7WDh4+XWEALiJqbVIAF6IcrjTiEAIANQuwHqtnBoyQlHhRBg3HKpwOfWkcgUQm+v3+QJBcMh0NhYICzUREGRhHSlG4tNR6Mx4g0Wh0eJ+hD+5EBwNBtKhk3JtKp2hpAXpMiZaIxST6xhg3N5-OJFOYwph8BJzGljICABkIFVSrKWQrxEFyLZ7E5yK4PF5fCrCQLdUQtaLKdTzfL-NbbaF7c4Inwsq6+UTBaSRTqNatfVKGX7MQBfTApNBQAAK7QgdXKEEuslInHO5DGvAgAB4AFLuYH3J5pgB8zee4gxRZ+DeBmDTUAAZFAABSEShISrlOikYHgiBDE2ndxQZw9RDeKB98p9AD8Lb6P074lPk8Q09nwJrMCgi746NXcCQOQgrdHfVPZ4QiB+ME-p4AJQ-HmkCFhAz4XjOMLAiWZYVlWfA1gBX44Duw5PChqHiOel4weUf5YV+aYADREae-7YTgrYAWmgHDn047cFkc7lAuS6PmuG5bjuWEHo8GbYce5HiMx+E1ukd4cSuGRZK+74iahYk-Okik4MBub5uBmT4XB5YXIhtZqae6EjieVEWVAYmsSpxniKRdm4Kplm4DRFl0Qx4jjkWQzsQ+MnriAm7bo2u7YfxgmocJLk4D5wA1hYUn+au8R8lUADaAC674AHR5eUQw-OleU5RYmUaaBBYVMWpb6ZW4xIaZTxQHFPyJW25EeUOjGEBUfDkOQshgPQSXLqugXBbx4WHkJmExVAfUXINw01gAkqNnGpRUlRZQp83iCVfVFSVq2ZcZFVadVekIQ1tZNY8C0gktQ3AD860de59HdV5E7VgA+nUbB0H5Y1cUFPGhXxM1RXNMU2nwAOkED8W3veoPlLIbAAEYXO+8MQH+F1gVdtU3dW9ahRhD344jyN-lAH1UV1PUwmwECILII1o5xE0Q-200CVh0Uxaz7OczeG0yRj2O46OouEyBl1FtdBm3RTTZmVAosc69sAM25TNfT1wJ-Ut2ggzz3EhfzqERULsMuSbZvkDWhiSylwBpTt2UfvtuAlUtx15YYZ3zUTVXK6Tqvk-dUBOwN2g-G7jPYczP0VAAbhc7iStzAVW1NtvQ1+wsuZn2e1uteerljiCaDI5Tvpnb3h+BKv1THlOa+X5A529+udUbP0mtwWOcBApwW-n4PW2FReC7N5mWSPY8TzWACi7tQLX9dou+Jo-Ovrck-B0eNV3zUr+PpyHwPn2ebg45gJQf3nDwfhb7zs9QwvMNLxZz8ICvwLNwEANYcxb2ljjcg75AEgWPpHU+Hdz4a2aoA4B78QJ30Ng-HAT9EDxAwaAqe40C6QwFpFEuDtLJgAIcAIhYCIHVxapjaBsC6HwMVsTRBdVDLq3KFTKAtDCFv1AVglOqE06P0IMI+hoiP7MK-oXL8dtF7GVkQw8BkDWGy1kZwzS3CapIL4bHDR8jxEG1TkPaR6CHDcDoH9bwlAIAAggO4EhYNJrkPnpQ08pcaEvzsQ4pxEAXFuK4RHCAAB1exwBJDONce3ExoUSJEFsbExxCS3GEEsZI6xeDCDeEQPAOIHilHeJUcXPx1CLJFJKe4Gskgt473HnvUcdS4g-EkAgoxvC1axw6e4Lp2CrGZiOAYyJkE8KsSSWrHMlwdypMglvSCr5UnoQeAJdsmy+jdgJhMtuUdkG1nmU1HcNFBwjlHMs5hJAKBUFoMMcQqjcA-HHOQRApAylkJthQ8i-iXIfNIBLZh6UtpVEyhIdKUCLipJheQOFOiEUsJluQH2jkDp5SBYRP2PSpnQRmUcvhGLcCnJSSSnAkEyJ+3ELHbFetQXwsRai5l0DWUXEhQeW8f50oAAZIW+JcrkqxuDULvM+X9Tc3gc5c2kqQmeyjLIvJcgC-aQLJXeGlaEEFcqoDQqRey5FTKUXQPRTS1CJV6WUXNVAPFP5pmwSJXMhZKTYA-nWRfamEqpUyvphIlydF8ljhubqlg7AuDVk+LSbEwB5ACDxP4Z5RA+BvGrN8hVFSqLKqoqqlyKaI1IWQFvcF3s9o2pwCVfNnAg45WQKHGldqpwEsdcY51iy3VIA9agh6Vbqw-CLf6pm9sBJBuuT+LeYbU0fATQEQMIQwgOjDFEKGhBSiUHcMITQk9P4-LnhZbNajzVrrcZu8sNYi3MPhbtX25aoCVuEOumtdaSWNqglecoszyZkuBEs91s9BHHo3Vu-tA8SWAdPacAAJOe7RqKy3lsA-2l9ETwL4vfZ+pC37yi-s7f+zW4HgNQAHcKodi8pF4JDclTxW4TgVmuLcFd2gKx-Sxgo3V5TflZqqYemlTGLgsbAW7ZhtGLj0e4GAdKkEzW3r4+QJOyGDnVTQ7pJ1X6XU-o7YgLtAjNayYE0nEZllBWvJbKOyjoMv4iauDccTK6KjnAGOmrxnG-kqpqTFezi4YOXqRfBm1pBTgDCQ+a19DqP2qcw+p7DmntOCM80Fojhn3LDvI8G8dtzXgFvjUoUQK62alEQNuxRu7FIHr-iS-Lm7Tg1n4FvAAjBIAAzBIAArH581lXCs-H4ApyqqH7XNvC62tT7aqV4eap1m+UBauDtTilsz6XQ3sm0FGvLoQqtOb5nurjv8LK5sspNmrW8AAsEhju8okAANnazSyb3XetKwggN9DEWTlRZw1p8bD07vTaS6Rv+qWx1IAnZl942XlABBjXG1b01CCVGceUP6bBNiNB3RmlzPjFL7YsvD0JiPkdbBrAAcWaXXVpjcb3loJ84H4ROHuGOU4S4bkXRt-tjrjk0SOUe07+3NsjC3ge3Kh7iHLtJluclFyupAsgQSbe-i5MrVD-4xWlyCGsahYNsMpza1Xus1D08mc9lTzO3us9w7HXXPwNezckfN0VQPEATuF+D3LsPzjhgSOQOXirXOWWx1Rd3VBtA1mIBO5oq1JDIFpJ0dIAAtdetJ0gx-j7SS4MBVrNE6LSQwMBLg5O1+a93PxiAG-602l7JvwHvZi19qAgesiJygKHm3xE7ffUfuZzihBncw6Lr9GC3vM2+72+5wFvA5w6qo-Cm7ft4ZzhxQ2lDSmjdM76SN11Y26Xj9-HrFvp5jM4GPIDzvMldiaBWwmtbBWivsZKwrschAtAOAuIPjH9-dv7V7KFdKhBJuEEhcwqdgQOdhSlAPxKAV+E-hcDWIaFvPqiyiarCogWitehAVRCVFAXJnqiVIaPWrergKFoNhhqbhvmzp6lAJgT8LAXvgGqAf7n7JgTAXAfCplKgfgdhBgYgM-lgcVHlLgWgeIIQRXmvizqQebuQZQVANQSRn7KlvNOOENJAF7mjs5ttuaorp-rPD-n-gAbqkAVACAewWAaPuwYodAbAYygasgYaqwdJkYRwXlGYTwTgXgfYepEvkWIzi2iISQRppvuQU4VQbzjagfjSvQTak4TWAAKrMFIq2Ez5uF3qOEzAXA1pRGuFuFCHG4+FV5m6faxyBFQAxE0H7R0RY7cYmYjr24n6rhn4ci96VKEBIDlBFhZATyv5qGY5ubK4uTNGtF8DVYa7MItINwJHzR9FW6l7L7l7ZFkyiF+FkHdpQB9FUATxW7BGt787VGLZUaEBKiJq4AHiECLiQBtE35UYcadGVIf48Z+wnGrHVabzMIlpsG3oBwDBgA1rrwZExRZGr5zG+HRb+FLH3FnG3wlE4ChFH4C6O63Jzp2guBuCbDOgfzMDwnBjhCRBZAHE4BHGgkDEdGlYVFK4kr4lrxPG6pXp2E2rvGfHYF5TfFTGeEr7eEAm5FiH5HkFklTabwQkMxt6MQ1FED7ErqUARrwC5y37o5XGngaHiDhFfhik8ASmT6gxgqezbSpIlrxEF40q0k1owA-EuR-GslnyAkfaxaaxKnMT7K3h8lQmmbbGC6hoimw7AicAgB-STiEnv6hHykmEWTumemTiuyk67wU5oGTjyYhYeFPYzH-FmnskLHiFLFBlekIAGb2kCleRCl7EmC0jokLqOjIk+ComWDWA2jzohhLrYl5aFYFg+lKrEnVI9EHb1mcBHbPEalVBjExRsDtn3YxmKbMnxmmnHJJlAmLE6YTYDm-ZZlbHt4UY7GgyBAVlBhFlImeClkFlrlVmYke44nGGP6jwFjuIqFbZEk3Hlbmo8A4ycANIWG6ovHUnmoYEnnVr0k5T8FDl9bTFvqzGJlYYWm163mnlBHzkA4wkTp7AJCWh971KwXpmjlsTnny5NlXkknmoIWJBIX-msTq7FrdmVC9mAo-iTE-mPZeFDY5FAU14W5xCIW4SDbrEQVK7H7Lld4wWsjwUMU4VMXvp-RgATDcBJCoU+5dF+4BlUTYVsC4VhaCXCVsAEXMKQRnA1glqpIy7ODlBcGNwkU0KKXkWL7Dlxl4VjnEr4FAVoFUpoH0X7CyX8X4QKU2hsAsUkoyG2785jLZi-lFg6QJnjm0U6Rbw6RrL-qbJtgdi7LAj7K+W9JslYYYTnIDgYSjjBW3JuD1Co4xC8VwW4nJoTCVChCNnXEOmtlfjjDkBFXxQXq6rpSeyyAQCQoEDqlezNV6rGqdVWEsH6VfiVqFWhDBa-Gxn+XmVqwkpWXmo6TUo0qxyVXVUgaWEIFdXLVxHGFFr9p8oCrGQeWQlHiOmLljjpVLZ1ANBi65WHlHHzWhAapaqyoXF37oV+mVFgYDX0I+rapCZ1UrVsrWHIEvl6l5QfW6yGBMkQCjXUUJXV7TW17XXvWaq+pQDJy7X77ZmPzHW7GtD5iXVEA4yVAVAlU7bPWH5SXYR40VA1iXBwENVNVQralQo-VIGM1oq9XoF5Tk0ERQCXBg0Q3EHISWXvZoHTW2XkEc0-BU1LW-XM02HGFU3i1bX8nmoo32Ro14IY0rlY0dAroc23UyqE3D45qk2oQ63A2U2xGrUW1S1xGs0OE5TA3i080sRjXr4aYw2xwm0I2DVc0bGo0LmMTq1d6a00grrLj60SUj7lVUTLgbzU2DS00tX00tXS1-U9W6l+wBzoiHyO0AXjloGTW3rC34GxzLi3yS1M3dUV2oqcpQCbyHwK3E2oTK24BlWA4B2n5B043HHoi63FViVD7h2G2R3YTLg93xQUlUbwFW2W3l1V020WpA2e26zrzZ0BV8JBVZCWmXzd32010+0q1+1eRt21HdC9Cw6BRh2lXlFD2oSBQ1idCa4XCvHlolSBQ1qdBGmWQ9K82vYTmpJu3kGv1QD32sUtmt1ZATqrTlBgCcyDBPJ94VDQP0J8C+R91v6ynNn+nX1fgIOcx-TIM1WEVexz0VX3hDW4ojVO2Q2AXQ0b2144NIOkOJYgOYNgPABh6VVTAzBigJCLBcMrpCUNDcBFUX3oMYUtkkoCPOBCMnKEPbTEOnhgDOCVAgQr3O3zHRb-1LGSPSMWLGQt2jpH3qAXVS65V-TWTzioMylJpiOYMkoyVmOUPKVPlEXyOiQRhQD64UWGLf2V7r3ACb0PT2PmOc3W5N17UH3o3gMZXGOw5BOUPOUiUiPWMN0KmnhxNOVCUuVONUaqXVYaVQBaU6UOB6Vp37SZMiVGXkMmU+M0U0P+O17pOsQJOuUeN73N3zbeVpBxUxJ0DxKhKJI-19D504An0TrpLBJZJnnMAaJBL0IhJhLuIzVoSUwRWYDbLUJ7Kxl81YSJVmSKTpSBSPRAM9CZRf5oO+IXKpWrpIySkPXSn7hVL+6izeaUm+alMVU3NkOoQ9I9NxJZJ820Un0BNayfNMMkaA6rpvUiMaGpNw0vMT003tWtXbRIvJ3M0A0uT9VVVe3IDnSxm-N9NhLbPmrDP7RAskpzVvWLXfWV1T10scrrVQCbX8qK0xQo0Qtw2j3QvNmwtvWj2hll1Gq0sz2mryMlQ72g1hz4uxKEsDO+PV5Auw18sSs+0csPonpbrctiOwvqtAZnq1VT5vNga6tfMWQ-Myv-M-2As9DAsEblggZ74Qt-6WM-xlXGSHa1bMINYEDNYEBtbvNUT5aDnDUmUEuWvyvtqKuxw-Yzbsujr95AKAzAwusG22PzQ0xJsowP0wIBvYT4wL7GnSu9Phu1ORs2u14ZtIx0B+pxuZjNHxBQAZzNijgCRWSrhxXEGAQ5TBPjiZVnVdt7I5SYBAA

💻 Code

type RecoType =
    | 'DirectHit'
    | 'TemplateMatch'
    | 'FeatureMatch'
    | 'ColorMatch'
    | 'OCR'
    | 'NeuralNetworkClassify'
    | 'NeuralNetworkDetect'
    | 'Custom'

type ActType =
    | 'DoNothing'
    | 'Click'
    | 'Swipe'
    | 'Key'
    | 'Text'
    | 'StartApp'
    | 'StopApp'
    | 'StopTask'
    | 'Custom'

type OrderByMap = {
    TemplateMatch: 'Horizontal' | 'Vertical' | 'Score' | 'Random'
    FeatureMatch: 'Horizontal' | 'Vertical' | 'Score' | 'Area' | 'Random'
    ColorMatch: 'Horizontal' | 'Vertical' | 'Score' | 'Area' | 'Random'
    OCR: 'Horizontal' | 'Vertical' | 'Area' | 'Length' | 'Random'
    NeuralNetworkClassify: 'Horizontal' | 'Vertical' | 'Score' | 'Random'
    NeuralNetworkDetect: 'Horizontal' | 'Vertical' | 'Score' | 'Area' | 'Random'
}

type PipelineBuilderState<Json = {}> = {
    done: Json
} & ('recognition' extends keyof Json
    ? {}
    : {
          recognition<R extends RecoType>(
              reco: R
          ): PipelineRecognitionBuilderState<
              Json & {
                  recognition: R
              },
              R
          >
      }) &
    ('action' extends keyof Json
        ? {}
        : {
              action<A extends ActType>(
                  act: A
              ): PipelineActionBuilderState<
                  Json & {
                      action: A
                  },
                  A
              >
          }) &
    ('next' extends keyof Json
        ? {}
        : {
              next<N extends string[]>(...nxt: [...N]): PipelineBuilderState<Json & { next: N }>
          }) &
    ('interrupt' extends keyof Json
        ? {}
        : {
              interrupt<I extends string[]>(
                  ...int: [...I]
              ): PipelineBuilderState<Json & { interrupt: I }>
          }) &
    ('rate_limit' extends keyof Json
        ? {}
        : {
              rate_limit<R extends number>(rate: R): PipelineBuilderState<Json & { rate_limit: R }>
          }) &
    ('timeout' extends keyof Json
        ? {}
        : {
              timeout<R extends number>(time: R): PipelineBuilderState<Json & { timeout: R }>
          }) &
    ('on_error' extends keyof Json
        ? {}
        : {
              on_error<O extends string[]>(
                  ...err: [...O]
              ): PipelineBuilderState<Json & { on_error: O }>
          }) &
    ('inverse' extends keyof Json
        ? {}
        : {
              inverse<I extends boolean>(inv: I): PipelineBuilderState<Json & { inverse: I }>
          }) &
    ('enabled' extends keyof Json
        ? {}
        : {
              enabled<E extends boolean>(en: E): PipelineBuilderState<Json & { enabled: E }>
          }) &
    ('pre_delay' extends keyof Json
        ? {}
        : {
              pre_delay<P extends number>(pre: P): PipelineBuilderState<Json & { pre_delay: P }>
          }) &
    ('post_delay' extends keyof Json // <--- here two post_delay are provided, which is the root cause
        ? {}
        : {
              post_delay<P extends number>(post: P): PipelineBuilderState<Json & { post_delay: P }>
          }) &
    ('post_delay' extends keyof Json // <---
        ? {}
        : {
              post_delay<P extends number>(post: P): PipelineBuilderState<Json & { post_delay: P }>
          }) &
    ('pre_wait_freezes' extends keyof Json
        ? {}
        : {
              pre_wait_freezes: PipelineWaitFreezeBuilderState<Json, 'pre_wait_freezes'>
          }) &
    ('focus' extends keyof Json
        ? {}
        : {
              focus<F extends boolean>(focus: F): PipelineBuilderState<Json & { focus: F }>
          })

type PipelineRecognitionBuilderState<PBJson, Reco extends RecoType, Json = {}> = {
    done: PipelineBuilderState<PBJson & Json>
} & (Reco extends 'DirectHit'
    ? {}
    : ('roi' extends keyof Json
          ? {}
          : {
                roi<R extends [string] | [number, number, number, number]>(
                    ...roi: R
                ): PipelineRecognitionBuilderState<
                    PBJson,
                    Reco,
                    Json & { roi: R extends [number, number, number, number] ? R : R[0] }
                >
            }) &
          ('roi_offset' extends keyof Json
              ? {}
              : {
                    roi_offset<R extends [number, number, number, number]>(
                        ...roi: R
                    ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { roi_offset: R }>
                })) &
    (Reco extends 'TemplateMatch' | 'FeatureMatch'
        ? 'template' extends keyof Json
            ? {}
            : {
                  template<T extends string[]>(
                      ...templ: [...T]
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { template: T }>
              }
        : {}) &
    (Reco extends 'TemplateMatch' | 'NeuralNetworkDetect'
        ? 'threshold' extends keyof Json
            ? {}
            : {
                  threshold<T extends number[]>(
                      ...thres: [...T]
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { threshold: T }>

                  threshold$<T extends number>(
                      thres: T
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { threshold: T }>
              }
        : {}) &
    (Reco extends keyof OrderByMap
        ? 'order_by' extends keyof Json
            ? {}
            : {
                  order_by<O extends OrderByMap[Reco]>(
                      order: O
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { order_by: O }>
              }
        : {}) &
    (Reco extends keyof OrderByMap
        ? 'index' extends keyof Json
            ? {}
            : {
                  index<T extends number>(
                      idx: T
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { index: T }>
              }
        : {}) &
    (Reco extends 'TemplateMatch'
        ? 'method' extends keyof Json
            ? {}
            : {
                  method<M extends 1 | 3 | 5>(
                      method: M
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { method: M }>
              }
        : {}) &
    (Reco extends 'ColorMatch'
        ? 'method' extends keyof Json
            ? {}
            : {
                  method<M extends 4 | 40 | 6>(
                      method: M
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { method: M }>
              }
        : {}) &
    (Reco extends 'TemplateMatch' | 'FeatureMatch'
        ? 'green_mask' extends keyof Json
            ? {}
            : {
                  green_mask<G extends boolean>(
                      mask: G
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { green_mask: G }>
              }
        : {}) &
    (Reco extends 'FeatureMatch' | 'ColorMatch'
        ? 'count' extends keyof Json
            ? {}
            : {
                  count<C extends number>(
                      count: C
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { count: C }>
              }
        : {}) &
    (Reco extends 'FeatureMatch'
        ? 'detector' extends keyof Json
            ? {}
            : {
                  detector<D extends 'SIFT' | 'KAZE' | 'AKAZE' | 'BRISK' | 'ORB'>(
                      det: D
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { detector: D }>
              }
        : {}) &
    (Reco extends 'FeatureMatch'
        ? 'ratio' extends keyof Json
            ? {}
            : {
                  ratio<R extends number>(
                      ratio: R
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { ratio: R }>
              }
        : {}) &
    (Reco extends 'ColorMatch'
        ? 'method' extends keyof Json
            ? ('lower' extends keyof Json
                  ? {}
                  : Json['method'] extends 4 | 40
                    ? {
                          lower<L extends [number, number, number][]>(
                              ...lower: [...L]
                          ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { lower: L }>
                      }
                    : {
                          lower<L extends [number][]>(
                              ...lower: [...L]
                          ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { lower: L }>
                      }) &
                  ('upper' extends keyof Json
                      ? {}
                      : Json['method'] extends 4 | 40
                        ? {
                              upper<L extends [number, number, number][]>(
                                  ...upper: [...L]
                              ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { upper: L }>
                          }
                        : {
                              upper<U extends [number][]>(
                                  ...upper: [...U]
                              ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { upper: U }>
                          })
            : {}
        : {}) &
    (Reco extends 'ColorMatch'
        ? 'connected' extends keyof Json
            ? {}
            : {
                  connected<C extends boolean>(
                      conn: C
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { connected: C }>
              }
        : {}) &
    (Reco extends 'OCR'
        ? 'expected' extends keyof Json
            ? {}
            : {
                  expected<E extends string[]>(
                      ...exp: [...E]
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { expected: E }>
              }
        : {}) &
    (Reco extends 'NeuralNetworkClassify' | 'NeuralNetworkDetect'
        ? 'expected' extends keyof Json
            ? {}
            : {
                  expected<E extends number[]>(
                      ...exp: [...E]
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { expected: E }>
              }
        : {}) &
    (Reco extends 'OCR'
        ? 'replace' extends keyof Json
            ? {}
            : {
                  replace<R extends [string, string][]>(
                      ...exp: [...R]
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { replace: R }>
              }
        : {}) &
    (Reco extends 'OCR'
        ? 'only_rec' extends keyof Json
            ? {}
            : {
                  only_rec<O extends boolean>(
                      rec: O
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { only_rec: O }>
              }
        : {}) &
    (Reco extends 'OCR' | 'NeuralNetworkClassify' | 'NeuralNetworkDetect'
        ? 'model' extends keyof Json
            ? {}
            : {
                  model<M extends string>(
                      model: M
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { model: M }>
              }
        : {}) &
    (Reco extends 'NeuralNetworkClassify' | 'NeuralNetworkDetect'
        ? 'labels' extends keyof Json
            ? {}
            : {
                  labels<L extends string[]>(
                      ...label: [...L]
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { labels: L }>
              }
        : {}) &
    (Reco extends 'Custom'
        ? 'custom_recognition' extends keyof Json
            ? {}
            : {
                  custom_recognition<C extends string>(
                      reco: C
                  ): PipelineRecognitionBuilderState<PBJson, Reco, Json & { custom_recognition: C }>
              }
        : {}) &
    (Reco extends 'Custom'
        ? 'custom_recognition_param' extends keyof Json
            ? {}
            : {
                  custom_recognition_param<C extends Record<string, unknown>>(
                      param: C
                  ): PipelineRecognitionBuilderState<
                      PBJson,
                      Reco,
                      Json & { custom_recognition_param: C }
                  >
              }
        : {})

type PipelineActionBuilderState<PBJson, Act extends ActType, Json = {}> = {
    done: PipelineBuilderState<PBJson & Json>
} & (Act extends 'Click' | 'Custom'
    ? 'target' extends keyof Json
        ? {}
        : {
              target<T extends [true] | [string] | [number, number, number, number]>(
                  ...target: T
              ): PipelineActionBuilderState<
                  PBJson,
                  Act,
                  Json & { target: T extends [number, number, number, number] ? T : T[0] }
              >
          }
    : {}) &
    (Act extends 'Click' | 'Custom'
        ? 'target_offset' extends keyof Json
            ? {}
            : {
                  target_offset<O extends [number, number, number, number]>(
                      ...offset: O
                  ): PipelineActionBuilderState<PBJson, Act, Json & { target_offset: O }>
              }
        : {}) &
    (Act extends 'Swipe'
        ? 'begin' extends keyof Json
            ? {}
            : {
                  begin<B extends [true] | [string] | [number, number, number, number]>(
                      ...begin: B
                  ): PipelineActionBuilderState<
                      PBJson,
                      Act,
                      Json & { begin: B extends [number, number, number, number] ? B : B[0] }
                  >
              }
        : {}) &
    (Act extends 'Swipe'
        ? 'begin_offset' extends keyof Json
            ? {}
            : {
                  begin_offset<B extends [number, number, number, number]>(
                      ...offset: B
                  ): PipelineActionBuilderState<PBJson, Act, Json & { begin_offset: B }>
              }
        : {}) &
    (Act extends 'Swipe'
        ? 'end' extends keyof Json
            ? {}
            : {
                  end<E extends [true] | [string] | [number, number, number, number]>(
                      ...end: E
                  ): PipelineActionBuilderState<
                      PBJson,
                      Act,
                      Json & { end: E extends [number, number, number, number] ? E : E[0] }
                  >
              }
        : {}) &
    (Act extends 'Swipe'
        ? 'end_offset' extends keyof Json
            ? {}
            : {
                  end_offset<E extends [number, number, number, number]>(
                      ...offset: E
                  ): PipelineActionBuilderState<PBJson, Act, Json & { end_offset: E }>
              }
        : {}) &
    (Act extends 'Key'
        ? 'key' extends keyof Json
            ? {}
            : {
                  key<K extends number[]>(
                      ...key: [...K]
                  ): PipelineActionBuilderState<PBJson, Act, Json & { key: K }>
              }
        : {}) &
    (Act extends 'InputText'
        ? 'input_text' extends keyof Json
            ? {}
            : {
                  input_text<T extends string>(
                      text: T
                  ): PipelineActionBuilderState<PBJson, Act, Json & { input_text: T }>
              }
        : {}) &
    (Act extends 'StartApp' | 'StopApp'
        ? 'package' extends keyof Json
            ? {}
            : {
                  package<P extends string>(
                      pkg: P
                  ): PipelineActionBuilderState<PBJson, Act, Json & { package: P }>
              }
        : {}) &
    (Act extends 'Custom'
        ? 'custom_action' extends keyof Json
            ? {}
            : {
                  custom_action<C extends string>(
                      act: C
                  ): PipelineActionBuilderState<PBJson, Act, Json & { custom_action: C }>
              }
        : {}) &
    (Act extends 'Custom'
        ? 'custom_action_param' extends keyof Json
            ? {}
            : {
                  custom_action_param<C extends Record<string, unknown>>(
                      param: C
                  ): PipelineActionBuilderState<PBJson, Act, Json & { custom_action_param: C }>
              }
        : {})

type PipelineWaitFreezeBuilderState<
    PBJson,
    Key extends 'pre_wait_freezes' | 'post_wait_freezes',
    Json = {}
> = {
    done: PipelineBuilderState<
        PBJson & {
            [key in Key]: Json
        }
    >
} & ('time' extends keyof Json
    ? {}
    : {
          time<T extends number>(
              time: T
          ): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { time: T }>
      }) &
    ('target' extends keyof Json
        ? {}
        : {
              target<T extends [true] | [string] | [number, number, number, number]>(
                  ...target: T
              ): PipelineWaitFreezeBuilderState<
                  PBJson,
                  Key,
                  Json & { target: T extends [number, number, number, number] ? T : T[0] }
              >
          }) &
    ('target_offset' extends keyof Json
        ? {}
        : {
              target_offset<O extends [number, number, number, number]>(
                  ...offset: O
              ): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { target_offset: O }>
          }) &
    ('threshold' extends keyof Json
        ? {}
        : {
              threshold<T extends number>(
                  thres: T
              ): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { threshold: T }>
          }) &
    ('method' extends keyof Json
        ? {}
        : {
              method<M extends 1 | 3 | 5>(
                  met: M
              ): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { method: M }>
          }) &
    ('rate_limit' extends keyof Json
        ? {}
        : {
              rate_limit<R extends number>(
                  rate: R
              ): PipelineWaitFreezeBuilderState<PBJson, Key, Json & { rate_limit: R }>
          })

const v = ({} as PipelineBuilderState).action('Click').done.

🙁 Actual behavior

When requesting auto completion in the last row (via dot), the heap raise quickly.

I've checked out that it is caused by the miss duplication of post_delay property state changing edge.

QQ_1726660185885 0d21ebf95cd073005933175c61f60b50

🙂 Expected behavior

The completion should either fail or succeed quickly. The duplicate edge shouldn't affect completing.

Additional information about the issue

No response

RyanCavanaugh commented 3 weeks ago

If there's a repro that isn't enormous we can look at it sooner

neko-para commented 3 weeks ago

@RyanCavanaugh

Seems that typescript could eventually manage to provide the completion, but the repro providing above is too complex to be evaluated.

Here's a simplified repro