@@ -97,10 +97,11 @@ function map_completion_text(completions)
97
97
return map (completion_text, c), r, res
98
98
end
99
99
100
- test_complete (s) = map_completion_text (@inferred (completions (s,lastindex (s))))
101
- test_scomplete (s) = map_completion_text (@inferred (shell_completions (s,lastindex (s))))
102
- test_bslashcomplete (s) = map_completion_text (@inferred (bslash_completions (s,lastindex (s)))[2 ])
103
- test_complete_context (s) = map_completion_text (@inferred (completions (s,lastindex (s),Main. CompletionFoo)))
100
+ test_complete (s) = map_completion_text (@inferred (completions (s, lastindex (s))))
101
+ test_scomplete (s) = map_completion_text (@inferred (shell_completions (s, lastindex (s))))
102
+ test_bslashcomplete (s) = map_completion_text (@inferred (bslash_completions (s, lastindex (s)))[2 ])
103
+ test_complete_context (s, m) = map_completion_text (@inferred (completions (s,lastindex (s), m)))
104
+ test_complete_foo (s) = test_complete_context (s, Main. CompletionFoo)
104
105
105
106
module M32377 end
106
107
test_complete_32377 (s) = map_completion_text (completions (s,lastindex (s), M32377))
297
298
298
299
# test latex symbol completion in getindex expressions (#24705)
299
300
let s = " tuple[\\ alpha"
300
- c, r, res = test_complete_context (s)
301
+ c, r, res = test_complete_foo (s)
301
302
@test c[1 ] == " α"
302
303
@test r == 7 : 12
303
304
@test length (c) == 1
@@ -987,100 +988,100 @@ end
987
988
988
989
# No CompletionFoo.CompletionFoo
989
990
let s = " "
990
- c, r = test_complete_context (s)
991
+ c, r = test_complete_foo (s)
991
992
@test ! (" CompletionFoo" in c)
992
993
end
993
994
994
995
# Can see `rand()` after `using Random`
995
996
let s = " r"
996
- c, r = test_complete_context (s)
997
+ c, r = test_complete_foo (s)
997
998
@test " rand" in c
998
999
@test r == 1 : 1
999
1000
@test s[r] == " r"
1000
1001
end
1001
1002
1002
1003
# Can see `Test.AbstractTestSet` after `import Test`
1003
1004
let s = " Test.A"
1004
- c, r = test_complete_context (s)
1005
+ c, r = test_complete_foo (s)
1005
1006
@test " AbstractTestSet" in c
1006
1007
@test r == 6 : 6
1007
1008
@test s[r] == " A"
1008
1009
end
1009
1010
1010
1011
# Can complete relative import
1011
1012
let s = " import ..M"
1012
- c, r = test_complete_context (s)
1013
+ c, r = test_complete_foo (s)
1013
1014
@test_broken " Main" in c
1014
1015
@test r == 10 : 10
1015
1016
@test s[r] == " M"
1016
1017
end
1017
1018
1018
1019
let s = " "
1019
- c, r = test_complete_context (s)
1020
+ c, r = test_complete_foo (s)
1020
1021
@test " bar" in c
1021
1022
@test r === 1 : 0
1022
1023
@test s[r] == " "
1023
1024
end
1024
1025
1025
1026
let s = " f"
1026
- c, r = test_complete_context (s)
1027
+ c, r = test_complete_foo (s)
1027
1028
@test " foo" in c
1028
1029
@test r == 1 : 1
1029
1030
@test s[r] == " f"
1030
1031
@test ! (" foobar" in c)
1031
1032
end
1032
1033
1033
1034
let s = " @f"
1034
- c, r = test_complete_context (s)
1035
+ c, r = test_complete_foo (s)
1035
1036
@test " @foobar" in c
1036
1037
@test r == 1 : 2
1037
1038
@test s[r] == " @f"
1038
1039
@test ! (" foo" in c)
1039
1040
end
1040
1041
1041
1042
let s = " type_test.x"
1042
- c, r = test_complete_context (s)
1043
+ c, r = test_complete_foo (s)
1043
1044
@test " xx" in c
1044
1045
@test r == 11 : 11
1045
1046
@test s[r] == " x"
1046
1047
end
1047
1048
1048
1049
let s = " bar.no_val_available"
1049
- c, r = test_complete_context (s)
1050
+ c, r = test_complete_foo (s)
1050
1051
@test length (c)== 0
1051
1052
end
1052
1053
1053
1054
let s = " type_test.xx.y"
1054
- c, r = test_complete_context (s)
1055
+ c, r = test_complete_foo (s)
1055
1056
@test " yy" in c
1056
1057
@test r == 14 : 14
1057
1058
@test s[r] == " y"
1058
1059
end
1059
1060
1060
1061
let s = " :(function foo(::Int) end).args[1].args[2]."
1061
- c, r = test_complete_context (s)
1062
+ c, r = test_complete_foo (s)
1062
1063
@test c == Any[]
1063
1064
end
1064
1065
1065
1066
let s = " log(log.(x),"
1066
- c, r = test_complete_context (s)
1067
+ c, r = test_complete_foo (s)
1067
1068
@test ! isempty (c)
1068
1069
end
1069
1070
1070
1071
let s = " Base.return_types(getin"
1071
- c, r = test_complete_context (s)
1072
+ c, r = test_complete_foo (s)
1072
1073
@test " getindex" in c
1073
1074
@test r == 19 : 23
1074
1075
@test s[r] == " getin"
1075
1076
end
1076
1077
1077
1078
let s = " using Test, Random"
1078
- c, r = test_complete_context (s)
1079
+ c, r = test_complete_foo (s)
1079
1080
@test ! (" RandomDevice" in c)
1080
1081
end
1081
1082
1082
1083
let s = " test(1,1, "
1083
- c, r, res = test_complete_context (s)
1084
+ c, r, res = test_complete_foo (s)
1084
1085
@test ! res
1085
1086
@test c[1 ] == string (first (methods (Main. CompletionFoo. test, Tuple{Int, Int})))
1086
1087
@test length (c) == 3
@@ -1089,28 +1090,28 @@ let s = "test(1,1, "
1089
1090
end
1090
1091
1091
1092
let s = " test.(1,1, "
1092
- c, r, res = test_complete_context (s)
1093
+ c, r, res = test_complete_foo (s)
1093
1094
@test ! res
1094
1095
@test length (c) == 4
1095
1096
@test r == 1 : 4
1096
1097
@test s[r] == " test"
1097
1098
end
1098
1099
1099
1100
let s = " prevind(\" θ\" ,1,"
1100
- c, r, res = test_complete_context (s)
1101
+ c, r, res = test_complete_foo (s)
1101
1102
@test c[1 ] == string (first (methods (prevind, Tuple{String, Int})))
1102
1103
@test r == 1 : 7
1103
1104
@test s[r] == " prevind"
1104
1105
end
1105
1106
1106
1107
# Issue #32840
1107
1108
let s = " typeof(+)."
1108
- c, r = test_complete_context (s)
1109
+ c, r = test_complete_foo (s)
1109
1110
@test length (c) == length (fieldnames (DataType))
1110
1111
end
1111
1112
1112
1113
let s = " test_dict[\" ab"
1113
- c, r = test_complete_context (s)
1114
+ c, r = test_complete_foo (s)
1114
1115
@test c == Any[" \" abc\" " , " \" abcd\" " ]
1115
1116
end
1116
1117
@@ -1120,3 +1121,44 @@ let
1120
1121
(test_complete (" Main.@noexist." ); @test true )
1121
1122
(test_complete (" @Main.noexist." ); @test true )
1122
1123
end
1124
+
1125
+ @testset " https://github.com/JuliaLang/julia/issues/40247" begin
1126
+ # getfield type completion can work for complicated expression
1127
+
1128
+ let
1129
+ m = Module ()
1130
+ @eval m begin
1131
+ struct Rs
1132
+ rs:: Vector{Regex}
1133
+ end
1134
+ var = nothing
1135
+ function foo ()
1136
+ global var = 1
1137
+ return Rs ([r" foo" ])
1138
+ end
1139
+ end
1140
+
1141
+ c, r = test_complete_context (" foo().rs[1]." , m)
1142
+ @test m. var ≠ 1 # getfield type completion should never execute `foo()`
1143
+ @test length (c) == fieldcount (Regex)
1144
+ end
1145
+
1146
+ let
1147
+ m = Module ()
1148
+ @eval m begin
1149
+ struct R
1150
+ r:: Regex
1151
+ end
1152
+ var = nothing
1153
+ function foo ()
1154
+ global var = 1
1155
+ return R (r" foo" )
1156
+ end
1157
+ end
1158
+
1159
+ c, r = test_complete_context (" foo().r." , m)
1160
+ # the current implementation of `REPL.REPLCompletions.completions(::String, ::Int, ::Module)`
1161
+ # cuts off "foo().r." to `.r.`, and the getfield type completion doesn't work for this simpler case
1162
+ @test_broken length (c) == fieldcount (Regex)
1163
+ end
1164
+ end
0 commit comments