1:- module(pls_index_profiles, [
2 use_language_profile/1,
3 provide_language_profile/1,
4 register_language_profile/2,
5 reindex_for_profile/1,
6 profile_module/2,
7 ensure_profile_loaded/1,
8 get_document_profile/2,
9 set_document_profile/2,
10
11 profile_index_term/4,
12 profile_index_docs/5,
13 profile_index_signature/5,
14 profile_index_goal/5,
15
16 index_goals/4,
17 index_goal/4,
18
19 functor_range/3,
20 functor_range/4,
21 term_position_range/3,
22 term_range/4,
23 argument_positions/2,
24 symbol_kind/2
25]). 26
27:- use_module(library(log4p)). 28:- use_module(documents). 29
30user:file_search_path(pls_language_profile,library(pls_language_profile)).
31user:file_search_path(pls_language_profile,LocalPath) :-
32 working_directory(Cwd, Cwd),
33 absolute_file_name(pls_language_profile,LocalPath, [relative_to(Cwd)]).
34
35user:file_search_path(pls_language_profile,LocalPath) :-
36 working_directory(Cwd, Cwd),
37 absolute_file_name(prolog/pls_language_profile,LocalPath, [relative_to(Cwd)]).
38
42
44:- multifile profile_index_term/4.
51:- multifile profile_index_docs/5. 52
54:- multifile profile_index_signature/5.
60:- multifile profile_index_goal/5.
66:- multifile profile_end_of_file/2.
72:- multifile profile_symbol/7.
79use_language_profile(_Profile) :- true.
80
81:- meta_predicate use_language_profile(:).
86:- dynamic profile_loaded/1.
94provide_language_profile(_Profile).
101register_language_profile(Profile, ProfileURI) :-
102 registered_language_profile(Profile, ProfileURI),
103 info("Language profile %w in %w already registered",[Profile, ProfileURI]).
104
105register_language_profile(Profile, ProfileURI) :-
106 info("Registering language profile %w in %w",[Profile, ProfileURI]),
107 assertz(registered_language_profile(Profile, ProfileURI)).
116:- dynamic registered_language_profile/2. 117
118profile_module(Profile, Module) :-
119 profile_module_file(Profile, ProfileURI),
120 get_document_item(ProfileURI, _Range, module(Module, _Exports)),
121 info("Profile %w is in module %w",[Profile, Module]),
122 !.
123
124profile_module(_Profile, Module) :-
125 Module = pls_language_profile_base.
126
127profile_module_file(Profile, ProfileURI) :-
128 registered_language_profile(Profile, ProfileURI).
129
130profile_module_file(Profile, ProfileURI) :-
131 exists_source(pls_language_profile(Profile), ProfileURI).
132
133ensure_profile_loaded(Profile) :-
134 profile_loaded(Profile),
135 !.
136
137ensure_profile_loaded(Profile) :-
138 once(profile_module_file(Profile, ProfileURI)),
139 uri_file_name(ProfileURI, ProfileModuleFile),
140 ensure_loaded(ProfileModuleFile),
141 assertz(profile_loaded(Profile)).
142
143get_document_profile(URI, Profile) :-
144 get_document_property(URI,profile(Profile)),
145 !.
146
147get_document_profile(_URI, base).
148
149set_document_profile(URI, Profile) :-
150 set_document_property(URI, profile(Profile)).
151
152reindex_for_profile(base).
153
154reindex_for_profile(Profile) :-
155 forall(
156 get_document_profile(URI, Profile),
157 158 159 (
160 info("Reindexing %w for profile %w",[URI, Profile]),
161 pls_index_indexing:index_text(URI)
162 )
163 ).
164
168index_goals(URI, Caller, GoalPos, Goal) :-
169 forall(index_goal(URI, Caller, GoalPos, Goal), true).
170
171index_goal(URI, Caller, GoalPos, Goal) :-
172 get_document_profile(URI, Profile),
173 try_profile_index_goal(Profile, URI, Caller, GoalPos, Goal).
174
175try_profile_index_goal(Profile, URI, Caller, GoalPos, Goal) :-
176 pls_index_profiles:profile_index_goal(Profile, URI, Caller, GoalPos, Goal),
177 !.
178
179try_profile_index_goal(_Profile, URI, Caller, GoalPos, Goal) :-
180 pls_index_profiles:profile_index_goal(base, URI, Caller, GoalPos, Goal).
181
190functor_range(URI, term_position(_From, _To, FFrom, FTo, _Subpos), Range) :-
191 term_range(URI, FFrom, FTo, Range).
192
193functor_range(URI, FFrom, FTo, Range) :-
194 term_range(URI, FFrom, FTo, Range).
195
196term_position_range(URI, term_position(From, To, _FFrom, _FTo, _Subpos), Range) :-
197 term_range(URI, From, To, Range).
205term_range(URI, From, To, Range) :-
206 get_document_line_position(URI, FromLine, From),
207 get_document_line_position(URI, FromLine, FromStart),
208 get_document_line_position(URI, ToLine, To),
209 get_document_line_position(URI, ToLine, ToStart),
210 FromPosition is From - FromStart,
211 ToPosition is To - ToStart,
212 Range = range{
213 start: position{
214 line: FromLine,
215 character: FromPosition
216 },
217 end: position{
218 line: ToLine,
219 character: ToPosition
220 }
221 }.
222
223argument_positions(term_position(_From, _To, _FFrom, _FTo, Subpos), Subpos).
229symbol_kind(file, 1).
230symbol_kind(module, 2).
231symbol_kind(namespace, 3).
232symbol_kind(package, 4).
233symbol_kind(class, 5).
234symbol_kind(method, 6).
235symbol_kind(property, 7).
236symbol_kind(field, 8).
237symbol_kind(constructor, 9).
238symbol_kind(enum, 10).
239symbol_kind(interface, 11).
240symbol_kind(function, 12).
241symbol_kind(variable, 13).
242symbol_kind(constant, 14).
243symbol_kind(string, 15).
244symbol_kind(number, 16).
245symbol_kind(boolean, 17).
246symbol_kind(array, 18)