mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
d95ff2d2fb
Some new hover features: docstrings (`@param/@return` syntax is not yet supported, nor is a syntax-highlighted preview, will do later) ![image](https://user-images.githubusercontent.com/13153231/190830490-d0ef774c-e7e5-4bb9-8007-b366be0f491e.png) better MIPs instruction descriptions ![image](https://user-images.githubusercontent.com/13153231/190830507-0bb35c13-7e88-4b74-a63b-b7fb3587b82e.png) numeric hovers convert to different bases / tell you the OpenGOAL method id (i can't tell you the amount of times ive done -16 / 4 manually myself...) ![image](https://user-images.githubusercontent.com/13153231/190830674-f66ed15a-f983-48ff-b251-259374dfbcac.png) Closes https://github.com/open-goal/opengoal-vscode/issues/33 Closes https://github.com/open-goal/opengoal-vscode/issues/31 Related to https://github.com/open-goal/opengoal-vscode/issues/29
81 lines
2.8 KiB
C++
81 lines
2.8 KiB
C++
#pragma once
|
|
|
|
#include <optional>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
#include "common/util/FileUtil.h"
|
|
|
|
#include "decompiler/util/DecompilerTypeSystem.h"
|
|
#include "lsp/protocol/common_types.h"
|
|
#include "lsp/protocol/document_diagnostics.h"
|
|
#include "lsp/protocol/document_symbols.h"
|
|
|
|
class WorkspaceIRFile {
|
|
public:
|
|
WorkspaceIRFile(){};
|
|
WorkspaceIRFile(const std::string& content);
|
|
// TODO - make private
|
|
int32_t version;
|
|
std::vector<std::string> m_lines;
|
|
std::vector<LSPSpec::DocumentSymbol> m_symbols;
|
|
std::vector<LSPSpec::Diagnostic> m_diagnostics;
|
|
GameVersion m_game_version;
|
|
LSPSpec::DocumentUri m_all_types_uri = "";
|
|
fs::path m_all_types_file_path;
|
|
|
|
std::optional<std::string> get_mips_instruction_at_position(const LSPSpec::Position position);
|
|
std::optional<std::string> get_symbol_at_position(const LSPSpec::Position position);
|
|
|
|
private:
|
|
void find_all_types_path(const std::string& line);
|
|
void find_function_symbol(const uint32_t line_num_zero_based, const std::string& line);
|
|
/// @brief Make any relevant diagnostics on the IR line.
|
|
/// It's assumed each line in an IR can have atmost one diagnostic, and they are contained to just
|
|
/// that line!
|
|
/// @param line_num_zero_based
|
|
/// @param line
|
|
void identify_diagnostics(const uint32_t line_num_zero_based, const std::string& line);
|
|
};
|
|
|
|
class WorkspaceAllTypesFile {
|
|
public:
|
|
WorkspaceAllTypesFile() : m_dts(GameVersion::Jak1){};
|
|
WorkspaceAllTypesFile(const LSPSpec::DocumentUri& uri,
|
|
const GameVersion version,
|
|
const fs::path file_path)
|
|
: m_uri(uri), m_game_version(version), m_dts(m_game_version), m_file_path(file_path){};
|
|
|
|
GameVersion m_game_version;
|
|
LSPSpec::DocumentUri m_uri;
|
|
decompiler::DecompilerTypeSystem m_dts;
|
|
fs::path m_file_path;
|
|
|
|
void parse_type_system();
|
|
void update_type_system();
|
|
};
|
|
|
|
class Workspace {
|
|
public:
|
|
Workspace();
|
|
virtual ~Workspace();
|
|
|
|
bool is_initialized();
|
|
void set_initialized(bool new_value);
|
|
|
|
void start_tracking_file(const LSPSpec::DocumentUri& file_uri,
|
|
const std::string& language_id,
|
|
const std::string& content);
|
|
void update_tracked_file(const LSPSpec::DocumentUri& file_uri, const std::string& content);
|
|
void stop_tracking_file(const LSPSpec::DocumentUri& file_uri);
|
|
std::optional<WorkspaceIRFile> get_tracked_ir_file(const LSPSpec::URI& file_uri);
|
|
std::optional<DefinitionMetadata> get_definition_info_from_all_types(
|
|
const std::string& symbol_name,
|
|
const LSPSpec::DocumentUri& all_types_uri);
|
|
|
|
private:
|
|
bool m_initialized = false;
|
|
std::unordered_map<LSPSpec::DocumentUri, WorkspaceIRFile> m_tracked_ir_files = {};
|
|
std::unordered_map<LSPSpec::DocumentUri, WorkspaceAllTypesFile> m_tracked_all_types_files = {};
|
|
};
|