From 211a860319f60542bdfd0721590768ba87dec9af Mon Sep 17 00:00:00 2001 From: slavek-kucera <53339291+slavek-kucera@users.noreply.github.com> Date: Fri, 7 Oct 2022 12:23:07 +0200 Subject: [PATCH] fix: False positive sequence symbol redefinition diagnostics generated --- clients/vscode-hlasmplugin/CHANGELOG.md | 1 + .../src/processing/processing_manager.cpp | 8 +++--- .../src/processing/processing_manager.h | 1 + .../test/processing/lookahead_test.cpp | 26 +++++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/clients/vscode-hlasmplugin/CHANGELOG.md b/clients/vscode-hlasmplugin/CHANGELOG.md index 80e867b7c..82220a5cc 100644 --- a/clients/vscode-hlasmplugin/CHANGELOG.md +++ b/clients/vscode-hlasmplugin/CHANGELOG.md @@ -16,6 +16,7 @@ - Produce only a warning when immediate operand overflows in machine instructions - Relax PROCESS operand validation - Syntax error while parsing the END language operands +- False positive sequence symbol redefinition diagnostics generated ## [1.4.0](https://github.com/eclipse/che-che4z-lsp-for-hlasm/compare/1.3.0...1.4.0) (2022-08-30) diff --git a/parser_library/src/processing/processing_manager.cpp b/parser_library/src/processing/processing_manager.cpp index 8e71f934d..2123a99d7 100644 --- a/parser_library/src/processing/processing_manager.cpp +++ b/parser_library/src/processing/processing_manager.cpp @@ -140,6 +140,8 @@ bool processing_manager::seq_lookahead_active() const return look_pr && look_pr->action == lookahead_action::SEQ; } +bool processing_manager::lookahead_active() const { return procs_.back()->kind == processing_kind::LOOKAHEAD; } + statement_provider& processing_manager::find_provider() { if (attr_lookahead_active()) @@ -314,17 +316,15 @@ void processing_manager::register_sequence_symbol(context::id_index target, rang auto symbol = hlasm_ctx_.get_opencode_sequence_symbol(target); auto new_symbol = create_opencode_sequence_symbol(target, symbol_range); - bool seq_lookahead = seq_lookahead_active(); - if (!symbol) { hlasm_ctx_.add_opencode_sequence_symbol(std::move(new_symbol)); - if (seq_lookahead) + if (lookahead_active()) m_pending_seq_redifinitions.emplace_back(m_lookahead_seq_redifinitions.try_emplace(target).first); } else if (!(*symbol->access_opencode_symbol() == *new_symbol)) { - if (!seq_lookahead) + if (!lookahead_active()) add_diagnostic(diagnostic_op::error_E045(*target, symbol_range)); else if (auto it = m_lookahead_seq_redifinitions.find(target); it == m_lookahead_seq_redifinitions.end() || it->second.first != pending_seq_redifinition_state::lookahead_pending) diff --git a/parser_library/src/processing/processing_manager.h b/parser_library/src/processing/processing_manager.h index 57be89942..52aa7f4ff 100644 --- a/parser_library/src/processing/processing_manager.h +++ b/parser_library/src/processing/processing_manager.h @@ -77,6 +77,7 @@ class processing_manager final : public processing_state_listener, public branch bool attr_lookahead_active() const; bool seq_lookahead_active() const; + bool lookahead_active() const; statement_provider& find_provider(); void finish_processor(); diff --git a/parser_library/test/processing/lookahead_test.cpp b/parser_library/test/processing/lookahead_test.cpp index ea820893f..b22810b37 100644 --- a/parser_library/test/processing/lookahead_test.cpp +++ b/parser_library/test/processing/lookahead_test.cpp @@ -1040,3 +1040,29 @@ TEST(lookahead, combined_redefinition) EXPECT_TRUE(matches_message_codes(a.diags(), { "E045", "E045", "E045" })); } + +TEST(lookahead, ord_with_aread) +{ + std::string input = R"( + MACRO + MAC +&X AREAD +&X AREAD + MEND +* + AIF (L'X EQ 0).SKIP + MAC +.TEST +.TEST + MNOTE 'AAAA' +.SKIP ANOP +X DS C + END +)"; + + analyzer a(input); + a.analyze(); + a.collect_diags(); + + EXPECT_TRUE(matches_message_codes(a.diags(), { "MNOTE" })); +}