26 const std::string &languageId,
int version) {
42 it->second.version = version;
53 if (it ==
documents.end())
return nullptr;
84 std::wstringstream stream(doc.
text);
111 std::string fp = uri;
112 if (fp.rfind(
"file://", 0) == 0) fp = fp.substr(7);
113 auto &searchPaths =
compilerCtx->getBuildConfig()->searchPaths;
114 auto parentPath = std::filesystem::path(fp).parent_path().wstring();
115 searchPaths.push_back(parentPath);
116 searchPaths.push_back((std::filesystem::path(fp).parent_path() /
".tsuki_modules").wstring());
118 auto irMod = std::make_shared<yoi::IRModule>();
121 static std::atomic<yoi::indexT> nextModuleId{1000};
123 irMod->identifier = modIdx;
125 auto modCtx = std::make_shared<yoi::moduleContext>(
130 }
catch (
const std::runtime_error &e) {
131 std::cerr <<
"[lsp] visitor error: " << e.what() << std::endl;
134 searchPaths.pop_back();
135 searchPaths.pop_back();
146 }
catch (
const std::runtime_error &e) {
149 std::cerr <<
"[hoshi-lsp] parse failed for " << uri <<
": " << e.what() << std::endl;
164 std::string filePath = uri;
165 if (filePath.rfind(
"file://", 0) == 0) {
166 filePath = filePath.substr(7);
173 std::string importPathStr;
177 auto *useStmt =
static_cast<yoi::useStmt *
>(stmt->value.ptr);
178 if (!useStmt)
continue;
180 aliasName = useStmt->name->node.strVal;
183 if (!importStmt)
continue;
185 if (importStmt->inner && importStmt->inner->name && importStmt->inner->name->id) {
186 aliasName = importStmt->inner->name->id->node.strVal;
192 if (importPathStr.empty())
continue;
196 if (resolvedPath.empty())
continue;
202 for (
const auto &sym : modSymbols) {
203 if (sym.isLocal)
continue;
209 if (!aliasName.empty() && tagged.
parentName.empty()) {
void closeDocument(const std::string &uri)
void openDocument(const std::string &uri, const std::string &text, const std::string &languageId, int version)
void resolveAndIndexImports(const std::string &uri, Document &doc)
Resolve import/use references in the document AST and index referenced modules.
void reparseDocument(const std::string &uri)
Document * getDocument(const std::string &uri)
std::map< std::string, Document > documents
ProjectIndex * projectIndex
std::shared_ptr< yoi::compilerContext > compilerCtx
void updateDocument(const std::string &uri, const std::string &text, int version)
const yoi::vec< Symbol > & indexAndGet(const std::string &absolutePath)
Parse and index a module, then return its symbols.
std::string resolveModule(const std::string &importPath, const std::string &relativeToFile)
const std::vector< Diagnostic > & getDiagnostics() const
void setCurrentFilePath(const yoi::wstr &path)
Set the file path for diagnostics reported via the convenience overload.
vec< globalStmt * > stmts
std::shared_ptr< yoi::IRModule > visit()
std::string wstring2string(const std::wstring &v)
std::wstring string2wstring(const std::string &v)
thread_local yoi::wstr __current_file_path
void set_diagnostic_engine(DiagnosticEngine *engine)
void set_current_file_path(const std::wstring &path)
void finalizeAST(funcTypeSpec *ptr)
void parse(yoi::basicLiterals *&o, yoi::lexer &lex)
yoi::vec< Symbol > crossModuleSymbols
yoi::vec< Symbol > symbols
ProjectIndex * projectIndex
std::shared_ptr< yoi::compilerContext > compilerCtx
std::shared_ptr< yoi::IRModule > irModule
yoi::vec< yoi::Diagnostic > diagnostics