Skip to content

Commit

Permalink
fix: Evaluate relative paths specified in settings with respect to ro…
Browse files Browse the repository at this point in the history
…ot folder
  • Loading branch information
slavek-kucera authored Jul 19, 2024
1 parent 85f51dc commit 962da20
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 18 deletions.
3 changes: 3 additions & 0 deletions clients/vscode-hlasmplugin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
#### Added
- Support CATTR, XATTR and R-type constants

#### Fixed
- Evaluate relative paths specified in settings with respect to the root folder

## [1.14.0](https://github.com/eclipse-che4z/che-che4z-lsp-for-hlasm/compare/1.13.0...1.14.0) (2024-07-16)

#### Added
Expand Down
26 changes: 13 additions & 13 deletions language_server/src/lsp/feature_workspace_folders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,30 +72,30 @@ void feature_workspace_folders::initialize_feature(const nlohmann::json& initial
m_supports_dynamic_file_change_notification = watcher->value("dynamicRegistration", false);
}

if (ws_folders_support)
if (auto root_uri = initialize_params.find("rootUri"); root_uri != initialize_params.end() && root_uri->is_string())
{
for (const auto& ws : initialize_params.at("workspaceFolders"))
m_initial_workspaces.emplace_back(ws.at("name").get<std::string>(), ws.at("uri").get<std::string>());
return;
m_root_uri = root_uri->get<std::string>();
}

auto root_uri = initialize_params.find("rootUri");
if (root_uri != initialize_params.end() && !root_uri->is_null())
else if (auto root_path = initialize_params.find("rootPath");
root_path != initialize_params.end() && root_path->is_string())
{
m_initial_workspaces.emplace_back(root_uri->get<std::string>(), root_uri->get<std::string>());
return;
m_root_uri = utils::path::path_to_uri(utils::path::lexically_normal(root_path->get<std::string>()).string());
}

auto root_path = initialize_params.find("rootPath");
if (root_path != initialize_params.end() && !root_path->is_null())
if (ws_folders_support)
{
for (const auto& ws : initialize_params.at("workspaceFolders"))
m_initial_workspaces.emplace_back(ws.at("name").get<std::string>(), ws.at("uri").get<std::string>());
}
else if (!m_root_uri.empty())
{
auto uri = utils::path::path_to_uri(utils::path::lexically_normal(root_path->get<std::string>()).string());
m_initial_workspaces.emplace_back(uri, uri);
m_initial_workspaces.emplace_back(m_root_uri, m_root_uri);
}
}

void feature_workspace_folders::initialized()
{
ws_mngr_.change_implicit_group_base(m_root_uri);
send_configuration_request();
if (m_supports_dynamic_file_change_notification)
register_file_change_notifictions();
Expand Down
1 change: 1 addition & 0 deletions language_server/src/lsp/feature_workspace_folders.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class feature_workspace_folders : public feature

parser_library::workspace_manager& ws_mngr_;
std::vector<std::pair<std::string, std::string>> m_initial_workspaces;
std::string m_root_uri;

bool m_supports_dynamic_file_change_notification = false;
};
Expand Down
2 changes: 2 additions & 0 deletions language_server/test/ws_mngr_mock.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ class ws_mngr_mock : public workspace_manager
retrieve_output,
(std::string_view document_uri, workspace_manager_response<std::span<const output_line>> resp),
(override));

MOCK_METHOD(void, change_implicit_group_base, (std::string_view uri), (override));
};

} // namespace hlasm_plugin::language_server::test
Expand Down
2 changes: 2 additions & 0 deletions parser_library/include/workspace_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,8 @@ class workspace_manager

virtual void retrieve_output(
std::string_view document_uri, workspace_manager_response<std::span<const output_line>> resp) = 0;

virtual void change_implicit_group_base(std::string_view uri) = 0;
};

workspace_manager* create_workspace_manager_impl(
Expand Down
5 changes: 5 additions & 0 deletions parser_library/src/workspace_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,11 @@ class workspace_manager_impl final : public workspace_manager,
notify_diagnostics_consumers();
}

void change_implicit_group_base(std::string_view uri) override
{
m_implicit_workspace.config.change_processor_group_base(normalized_uri(uri));
}

void configuration_changed(const lib_config& new_config, std::string_view full_cfg) override
{
// TODO: should this action be also performed IN ORDER?
Expand Down
16 changes: 11 additions & 5 deletions parser_library/src/workspaces/workspace_configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ workspace_configuration::workspace_configuration(file_manager& fm,
const lib_config& global_config,
external_configuration_requests* ecr)
: m_file_manager(fm)
, m_location(std::move(location))
, m_location(location)
, m_proc_base(std::move(location))
, m_global_settings(global_settings)
, m_global_config(global_config)
, m_external_configuration_requests(ecr)
Expand Down Expand Up @@ -424,7 +425,7 @@ utils::task workspace_configuration::process_processor_group_library(const confi
const auto& root =
lib.root_folder == config::processor_group_root_folder::alternate_root && !alternative_root.empty()
? alternative_root
: m_location;
: m_proc_base;

std::optional<std::string> lib_path = substitute_home_directory(lib.path);
if (!lib_path.has_value())
Expand Down Expand Up @@ -585,7 +586,7 @@ workspace_configuration::load_proc_config(
config::proc_grps& proc_groups, global_settings_map& utilized_settings_values, std::vector<diagnostic>& diags)
{
const auto current_settings = m_global_settings.load();
json_settings_replacer json_visitor { *current_settings, utilized_settings_values, m_location };
json_settings_replacer json_visitor { *current_settings, utilized_settings_values, m_proc_base };

auto config_source = m_proc_grps_loc;

Expand Down Expand Up @@ -651,7 +652,7 @@ workspace_configuration::load_pgm_config(
config::pgm_conf& pgm_config, global_settings_map& utilized_settings_values, std::vector<diagnostic>& diags)
{
const auto current_settings = m_global_settings.load();
json_settings_replacer json_visitor { *current_settings, utilized_settings_values, m_location };
json_settings_replacer json_visitor { *current_settings, utilized_settings_values, m_proc_base };

auto config_source = m_pgm_conf_loc;

Expand Down Expand Up @@ -1016,7 +1017,7 @@ workspace_configuration::make_external_proc_group(
global_settings_map utilized_settings_values;

const auto current_settings = m_global_settings.load();
json_settings_replacer json_visitor { *current_settings, utilized_settings_values, m_location };
json_settings_replacer json_visitor { *current_settings, utilized_settings_values, m_proc_base };

std::vector<diagnostic> diags;

Expand Down Expand Up @@ -1220,4 +1221,9 @@ utils::value_task<utils::resource::resource_location> workspace_configuration::l
co_return configuration_url;
}

void workspace_configuration::change_processor_group_base(utils::resource::resource_location url)
{
m_proc_base = std::move(url);
}

} // namespace hlasm_plugin::parser_library::workspaces
3 changes: 3 additions & 0 deletions parser_library/src/workspaces/workspace_configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ class workspace_configuration : public configuration_provider

file_manager& m_file_manager;
utils::resource::resource_location m_location;
utils::resource::resource_location m_proc_base;
const shared_json& m_global_settings;
const lib_config& m_global_config;

Expand Down Expand Up @@ -320,6 +321,8 @@ class workspace_configuration : public configuration_provider
get_analyzer_configuration(utils::resource::resource_location url) override;
[[nodiscard]] opcode_suggestion_data get_opcode_suggestion_data(
const utils::resource::resource_location& url) override;

void change_processor_group_base(utils::resource::resource_location url);
};

} // namespace hlasm_plugin::parser_library::workspaces
Expand Down
32 changes: 32 additions & 0 deletions parser_library/test/workspace_manager_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,3 +178,35 @@ TEST(workspace_manager, implicit_configuration)

EXPECT_TRUE(matches_message_text(diags.diags, { "Hello" }));
}

TEST(workspace_manager, implicit_configuration_base_changed)
{
const std::string_view uri = "untitled:file1";
NiceMock<workspace_manager_external_file_requests_mock> ext_mock;
diag_consumer_mock diags;

auto ws_mngr = create_workspace_manager(&ext_mock, true);
ws_mngr->register_diagnostics_consumer(&diags);
ws_mngr->add_workspace("dir", "test:/dir");
ws_mngr->change_implicit_group_base("test:/dir");
ws_mngr->configuration_changed({},
R"({"hlasm":{"proc_grps":{"pgroups":[{"name":"P1","libs":["macs/"]}]},"pgm_conf":{"pgms":[{"program":"**","pgroup":"P1"}]}}})");

EXPECT_CALL(ext_mock, read_external_file).WillRepeatedly(Invoke([](auto, auto r) { r.error(-1, ""); }));
EXPECT_CALL(ext_mock, read_external_directory(StrEq("test:/dir/macs/"), _, _))
.WillOnce(Invoke([](auto, auto r, auto) {
static constexpr std::string_view resp[] = { "test:/dir/macs/MAC" };
r.provide(workspace_manager_external_directory_result { .member_urls = resp });
}));

ws_mngr->did_open_file("test:/dir/macs/MAC", 1, R"( MACRO
MAC
MNOTE 'Hello'
MEND
)");
ws_mngr->did_open_file(uri, 1, " MAC");

ws_mngr->idle_handler();

EXPECT_TRUE(matches_message_text(diags.diags, { "Hello" }));
}

0 comments on commit 962da20

Please sign in to comment.