@@ -2867,4 +2867,318 @@ Syntax(Chunk)@0..137
2867
2867
2868
2868
assert_ast_eq ! ( code, result) ;
2869
2869
}
2870
+
2871
+ #[ test]
2872
+ fn test_alias_infer_identifier ( ) {
2873
+ let code = r#"
2874
+ ---@alias Foo infer
2875
+ "# ;
2876
+ let result = r#"
2877
+ Syntax(Chunk)@0..37
2878
+ Syntax(Block)@0..37
2879
+ Token(TkEndOfLine)@0..1 "\n"
2880
+ Token(TkWhitespace)@1..9 " "
2881
+ Syntax(Comment)@9..28
2882
+ Token(TkDocStart)@9..13 "---@"
2883
+ Syntax(DocTagAlias)@13..28
2884
+ Token(TkTagAlias)@13..18 "alias"
2885
+ Token(TkWhitespace)@18..19 " "
2886
+ Token(TkName)@19..22 "Foo"
2887
+ Token(TkWhitespace)@22..23 " "
2888
+ Syntax(TypeName)@23..28
2889
+ Token(TkName)@23..28 "infer"
2890
+ Token(TkEndOfLine)@28..29 "\n"
2891
+ Token(TkWhitespace)@29..37 " "
2892
+ "# ;
2893
+
2894
+ assert_ast_eq ! ( code, result) ;
2895
+ }
2896
+
2897
+ #[ test]
2898
+ fn test_alias_conditional_infer_param ( ) {
2899
+ let code = r#"
2900
+ ---@alias ConstructorParameters<T> T extends (fun(infer: infer P): any) and P or unknown
2901
+ "# ;
2902
+
2903
+ let result = r#"
2904
+ Syntax(Chunk)@0..106
2905
+ Syntax(Block)@0..106
2906
+ Token(TkEndOfLine)@0..1 "\n"
2907
+ Token(TkWhitespace)@1..9 " "
2908
+ Syntax(Comment)@9..97
2909
+ Token(TkDocStart)@9..13 "---@"
2910
+ Syntax(DocTagAlias)@13..97
2911
+ Token(TkTagAlias)@13..18 "alias"
2912
+ Token(TkWhitespace)@18..19 " "
2913
+ Token(TkName)@19..40 "ConstructorParameters"
2914
+ Syntax(DocGenericDeclareList)@40..43
2915
+ Token(TkLt)@40..41 "<"
2916
+ Syntax(DocGenericParameter)@41..42
2917
+ Token(TkName)@41..42 "T"
2918
+ Token(TkGt)@42..43 ">"
2919
+ Token(TkWhitespace)@43..44 " "
2920
+ Syntax(TypeConditional)@44..97
2921
+ Syntax(TypeBinary)@44..80
2922
+ Syntax(TypeName)@44..45
2923
+ Token(TkName)@44..45 "T"
2924
+ Token(TkWhitespace)@45..46 " "
2925
+ Token(TkDocExtends)@46..53 "extends"
2926
+ Token(TkWhitespace)@53..54 " "
2927
+ Token(TkLeftParen)@54..55 "("
2928
+ Syntax(TypeFun)@55..79
2929
+ Token(TkName)@55..58 "fun"
2930
+ Token(TkLeftParen)@58..59 "("
2931
+ Syntax(DocTypedParameter)@59..73
2932
+ Token(TkName)@59..64 "infer"
2933
+ Token(TkColon)@64..65 ":"
2934
+ Token(TkWhitespace)@65..66 " "
2935
+ Syntax(TypeInfer)@66..73
2936
+ Token(TkName)@66..71 "infer"
2937
+ Token(TkWhitespace)@71..72 " "
2938
+ Syntax(DocGenericParameter)@72..73
2939
+ Token(TkName)@72..73 "P"
2940
+ Token(TkRightParen)@73..74 ")"
2941
+ Token(TkColon)@74..75 ":"
2942
+ Token(TkWhitespace)@75..76 " "
2943
+ Syntax(DocTypeList)@76..79
2944
+ Syntax(DocNamedReturnType)@76..79
2945
+ Syntax(TypeName)@76..79
2946
+ Token(TkName)@76..79 "any"
2947
+ Token(TkRightParen)@79..80 ")"
2948
+ Token(TkWhitespace)@80..81 " "
2949
+ Token(TkAnd)@81..84 "and"
2950
+ Token(TkWhitespace)@84..85 " "
2951
+ Syntax(TypeName)@85..86
2952
+ Token(TkName)@85..86 "P"
2953
+ Token(TkWhitespace)@86..87 " "
2954
+ Token(TkOr)@87..89 "or"
2955
+ Token(TkWhitespace)@89..90 " "
2956
+ Syntax(TypeName)@90..97
2957
+ Token(TkName)@90..97 "unknown"
2958
+ Token(TkEndOfLine)@97..98 "\n"
2959
+ Token(TkWhitespace)@98..106 " "
2960
+ "# ;
2961
+
2962
+ assert_ast_eq ! ( code, result) ;
2963
+ }
2964
+
2965
+ #[ test]
2966
+ fn test_alias_conditional_infer ( ) {
2967
+ let code = r#"
2968
+ ---@alias ConstructorParameters<T extends fun(...: any): any> T extends (fun(...: infer P): any) and P or unknown
2969
+ "# ;
2970
+
2971
+ let result = r#"
2972
+ Syntax(Chunk)@0..131
2973
+ Syntax(Block)@0..131
2974
+ Token(TkEndOfLine)@0..1 "\n"
2975
+ Token(TkWhitespace)@1..9 " "
2976
+ Syntax(Comment)@9..122
2977
+ Token(TkDocStart)@9..13 "---@"
2978
+ Syntax(DocTagAlias)@13..122
2979
+ Token(TkTagAlias)@13..18 "alias"
2980
+ Token(TkWhitespace)@18..19 " "
2981
+ Token(TkName)@19..40 "ConstructorParameters"
2982
+ Syntax(DocGenericDeclareList)@40..70
2983
+ Token(TkLt)@40..41 "<"
2984
+ Syntax(DocGenericParameter)@41..69
2985
+ Token(TkName)@41..42 "T"
2986
+ Token(TkWhitespace)@42..43 " "
2987
+ Token(TkDocExtends)@43..50 "extends"
2988
+ Token(TkWhitespace)@50..51 " "
2989
+ Syntax(TypeFun)@51..69
2990
+ Token(TkName)@51..54 "fun"
2991
+ Token(TkLeftParen)@54..55 "("
2992
+ Syntax(DocTypedParameter)@55..63
2993
+ Token(TkDots)@55..58 "..."
2994
+ Token(TkColon)@58..59 ":"
2995
+ Token(TkWhitespace)@59..60 " "
2996
+ Syntax(TypeName)@60..63
2997
+ Token(TkName)@60..63 "any"
2998
+ Token(TkRightParen)@63..64 ")"
2999
+ Token(TkColon)@64..65 ":"
3000
+ Token(TkWhitespace)@65..66 " "
3001
+ Syntax(DocTypeList)@66..69
3002
+ Syntax(DocNamedReturnType)@66..69
3003
+ Syntax(TypeName)@66..69
3004
+ Token(TkName)@66..69 "any"
3005
+ Token(TkGt)@69..70 ">"
3006
+ Token(TkWhitespace)@70..71 " "
3007
+ Syntax(TypeConditional)@71..122
3008
+ Syntax(TypeBinary)@71..105
3009
+ Syntax(TypeName)@71..72
3010
+ Token(TkName)@71..72 "T"
3011
+ Token(TkWhitespace)@72..73 " "
3012
+ Token(TkDocExtends)@73..80 "extends"
3013
+ Token(TkWhitespace)@80..81 " "
3014
+ Token(TkLeftParen)@81..82 "("
3015
+ Syntax(TypeFun)@82..104
3016
+ Token(TkName)@82..85 "fun"
3017
+ Token(TkLeftParen)@85..86 "("
3018
+ Syntax(DocTypedParameter)@86..98
3019
+ Token(TkDots)@86..89 "..."
3020
+ Token(TkColon)@89..90 ":"
3021
+ Token(TkWhitespace)@90..91 " "
3022
+ Syntax(TypeInfer)@91..98
3023
+ Token(TkName)@91..96 "infer"
3024
+ Token(TkWhitespace)@96..97 " "
3025
+ Syntax(DocGenericParameter)@97..98
3026
+ Token(TkName)@97..98 "P"
3027
+ Token(TkRightParen)@98..99 ")"
3028
+ Token(TkColon)@99..100 ":"
3029
+ Token(TkWhitespace)@100..101 " "
3030
+ Syntax(DocTypeList)@101..104
3031
+ Syntax(DocNamedReturnType)@101..104
3032
+ Syntax(TypeName)@101..104
3033
+ Token(TkName)@101..104 "any"
3034
+ Token(TkRightParen)@104..105 ")"
3035
+ Token(TkWhitespace)@105..106 " "
3036
+ Token(TkAnd)@106..109 "and"
3037
+ Token(TkWhitespace)@109..110 " "
3038
+ Syntax(TypeName)@110..111
3039
+ Token(TkName)@110..111 "P"
3040
+ Token(TkWhitespace)@111..112 " "
3041
+ Token(TkOr)@112..114 "or"
3042
+ Token(TkWhitespace)@114..115 " "
3043
+ Syntax(TypeName)@115..122
3044
+ Token(TkName)@115..122 "unknown"
3045
+ Token(TkEndOfLine)@122..123 "\n"
3046
+ Token(TkWhitespace)@123..131 " "
3047
+ "# ;
3048
+
3049
+ assert_ast_eq ! ( code, result) ;
3050
+ }
3051
+
3052
+ #[ test]
3053
+ fn test_alias_nested_conditional_no_paren ( ) {
3054
+ let code = r#"
3055
+ ---@alias IsFortyTwo<T> T extends number and T extends 42 and true or false or false
3056
+ "# ;
3057
+
3058
+ let result = r#"
3059
+ Syntax(Chunk)@0..102
3060
+ Syntax(Block)@0..102
3061
+ Token(TkEndOfLine)@0..1 "\n"
3062
+ Token(TkWhitespace)@1..9 " "
3063
+ Syntax(Comment)@9..93
3064
+ Token(TkDocStart)@9..13 "---@"
3065
+ Syntax(DocTagAlias)@13..93
3066
+ Token(TkTagAlias)@13..18 "alias"
3067
+ Token(TkWhitespace)@18..19 " "
3068
+ Token(TkName)@19..29 "IsFortyTwo"
3069
+ Syntax(DocGenericDeclareList)@29..32
3070
+ Token(TkLt)@29..30 "<"
3071
+ Syntax(DocGenericParameter)@30..31
3072
+ Token(TkName)@30..31 "T"
3073
+ Token(TkGt)@31..32 ">"
3074
+ Token(TkWhitespace)@32..33 " "
3075
+ Syntax(TypeConditional)@33..93
3076
+ Syntax(TypeBinary)@33..49
3077
+ Syntax(TypeName)@33..34
3078
+ Token(TkName)@33..34 "T"
3079
+ Token(TkWhitespace)@34..35 " "
3080
+ Token(TkDocExtends)@35..42 "extends"
3081
+ Token(TkWhitespace)@42..43 " "
3082
+ Syntax(TypeName)@43..49
3083
+ Token(TkName)@43..49 "number"
3084
+ Token(TkWhitespace)@49..50 " "
3085
+ Token(TkAnd)@50..53 "and"
3086
+ Token(TkWhitespace)@53..54 " "
3087
+ Syntax(TypeConditional)@54..84
3088
+ Syntax(TypeBinary)@54..66
3089
+ Syntax(TypeName)@54..55
3090
+ Token(TkName)@54..55 "T"
3091
+ Token(TkWhitespace)@55..56 " "
3092
+ Token(TkDocExtends)@56..63 "extends"
3093
+ Token(TkWhitespace)@63..64 " "
3094
+ Syntax(TypeLiteral)@64..66
3095
+ Token(TkInt)@64..66 "42"
3096
+ Token(TkWhitespace)@66..67 " "
3097
+ Token(TkAnd)@67..70 "and"
3098
+ Token(TkWhitespace)@70..71 " "
3099
+ Syntax(TypeLiteral)@71..75
3100
+ Token(TkTrue)@71..75 "true"
3101
+ Token(TkWhitespace)@75..76 " "
3102
+ Token(TkOr)@76..78 "or"
3103
+ Token(TkWhitespace)@78..79 " "
3104
+ Syntax(TypeLiteral)@79..84
3105
+ Token(TkFalse)@79..84 "false"
3106
+ Token(TkWhitespace)@84..85 " "
3107
+ Token(TkOr)@85..87 "or"
3108
+ Token(TkWhitespace)@87..88 " "
3109
+ Syntax(TypeLiteral)@88..93
3110
+ Token(TkFalse)@88..93 "false"
3111
+ Token(TkEndOfLine)@93..94 "\n"
3112
+ Token(TkWhitespace)@94..102 " "
3113
+ "# ;
3114
+
3115
+ assert_ast_eq ! ( code, result) ;
3116
+ }
3117
+
3118
+ #[ test]
3119
+ fn test_alias_nested_conditional ( ) {
3120
+ let code = r#"
3121
+ ---@alias IsFortyTwo<T> T extends number and (T extends 42 and true or false) or false
3122
+ "# ;
3123
+
3124
+ let result = r#"
3125
+ Syntax(Chunk)@0..104
3126
+ Syntax(Block)@0..104
3127
+ Token(TkEndOfLine)@0..1 "\n"
3128
+ Token(TkWhitespace)@1..9 " "
3129
+ Syntax(Comment)@9..95
3130
+ Token(TkDocStart)@9..13 "---@"
3131
+ Syntax(DocTagAlias)@13..95
3132
+ Token(TkTagAlias)@13..18 "alias"
3133
+ Token(TkWhitespace)@18..19 " "
3134
+ Token(TkName)@19..29 "IsFortyTwo"
3135
+ Syntax(DocGenericDeclareList)@29..32
3136
+ Token(TkLt)@29..30 "<"
3137
+ Syntax(DocGenericParameter)@30..31
3138
+ Token(TkName)@30..31 "T"
3139
+ Token(TkGt)@31..32 ">"
3140
+ Token(TkWhitespace)@32..33 " "
3141
+ Syntax(TypeConditional)@33..95
3142
+ Syntax(TypeBinary)@33..49
3143
+ Syntax(TypeName)@33..34
3144
+ Token(TkName)@33..34 "T"
3145
+ Token(TkWhitespace)@34..35 " "
3146
+ Token(TkDocExtends)@35..42 "extends"
3147
+ Token(TkWhitespace)@42..43 " "
3148
+ Syntax(TypeName)@43..49
3149
+ Token(TkName)@43..49 "number"
3150
+ Token(TkWhitespace)@49..50 " "
3151
+ Token(TkAnd)@50..53 "and"
3152
+ Token(TkWhitespace)@53..54 " "
3153
+ Token(TkLeftParen)@54..55 "("
3154
+ Syntax(TypeConditional)@55..85
3155
+ Syntax(TypeBinary)@55..67
3156
+ Syntax(TypeName)@55..56
3157
+ Token(TkName)@55..56 "T"
3158
+ Token(TkWhitespace)@56..57 " "
3159
+ Token(TkDocExtends)@57..64 "extends"
3160
+ Token(TkWhitespace)@64..65 " "
3161
+ Syntax(TypeLiteral)@65..67
3162
+ Token(TkInt)@65..67 "42"
3163
+ Token(TkWhitespace)@67..68 " "
3164
+ Token(TkAnd)@68..71 "and"
3165
+ Token(TkWhitespace)@71..72 " "
3166
+ Syntax(TypeLiteral)@72..76
3167
+ Token(TkTrue)@72..76 "true"
3168
+ Token(TkWhitespace)@76..77 " "
3169
+ Token(TkOr)@77..79 "or"
3170
+ Token(TkWhitespace)@79..80 " "
3171
+ Syntax(TypeLiteral)@80..85
3172
+ Token(TkFalse)@80..85 "false"
3173
+ Token(TkRightParen)@85..86 ")"
3174
+ Token(TkWhitespace)@86..87 " "
3175
+ Token(TkOr)@87..89 "or"
3176
+ Token(TkWhitespace)@89..90 " "
3177
+ Syntax(TypeLiteral)@90..95
3178
+ Token(TkFalse)@90..95 "false"
3179
+ Token(TkEndOfLine)@95..96 "\n"
3180
+ Token(TkWhitespace)@96..104 " "
3181
+ "# ;
3182
+ assert_ast_eq ! ( code, result) ;
3183
+ }
2870
3184
}
0 commit comments