hoshi-lang
dev
Yet another programming language
Loading...
Searching...
No Matches
symbolExtractor.h
Go to the documentation of this file.
1
//
2
// Symbol Extractor for hoshi-lang LSP server
3
// Walks the AST and extracts symbol definitions
4
//
5
6
#ifndef HOSHI_LANG_LSP_SYMBOL_EXTRACTOR_H
7
#define HOSHI_LANG_LSP_SYMBOL_EXTRACTOR_H
8
9
#include <string>
10
#include <vector>
11
#include <
share/def.hpp
>
12
#include <
compiler/frontend/ast.hpp
>
13
14
namespace
lsp
{
15
16
enum class
HoshiSymbolKind
{
17
Function
,
18
Struct
,
19
Interface
,
20
Variable
,
21
TypeAlias
,
22
Enum
,
23
Module
,
24
ModuleAlias
,
// use alias "path" — the alias name
25
Method
,
26
Field
,
27
Constructor
,
28
Finalizer
,
29
EnumMember
,
30
Import
,
// import func from "path"
31
Export
,
32
Concept_
,
33
Lambda
,
34
};
35
36
struct
Symbol
{
37
yoi::wstr
name
;
38
HoshiSymbolKind
kind
=
HoshiSymbolKind::Variable
;
39
yoi::indexT
line
= 0;
// 0-based
40
yoi::indexT
column
= 0;
// 0-based
41
yoi::indexT
endLine
= 0;
// 0-based
42
yoi::indexT
endColumn
= 0;
// 0-based
43
yoi::wstr
detail
;
// e.g. "func foo(a: int, b: string): bool"
44
yoi::wstr
typeInfo
;
// e.g. "int" or "string"
45
yoi::wstr
parentName
;
// e.g. struct name for methods/fields
46
yoi::wstr
sourceFile
;
// absolute path of the defining module (for cross-module tracking)
47
yoi::wstr
importPath
;
// for ModuleAlias/Import: the resolved module path
48
// Locals are retained for editor features, but must not be exported as module symbols.
49
bool
isLocal
=
false
;
50
yoi::indexT
ownerLine
= 0;
// Declaration line of the callable that owns this local.
51
std::vector<Symbol>
children
;
52
};
53
54
inline
bool
isCallableSymbol
(
const
Symbol
&symbol) {
55
return
symbol.
kind
==
HoshiSymbolKind::Function
||
56
symbol.
kind
==
HoshiSymbolKind::Method
||
57
symbol.
kind
==
HoshiSymbolKind::Constructor
||
58
symbol.
kind
==
HoshiSymbolKind::Finalizer
;
59
}
60
61
// A local is visible only in the callable body that owns it.
62
// This keeps locals out of global lookups while preserving completion/navigation in bodies.
63
inline
bool
isSymbolVisibleAt
(
const
yoi::vec<Symbol>
&symbols,
const
Symbol
&symbol,
64
yoi::indexT
line) {
65
if
(!symbol.
isLocal
)
return
true
;
66
if
(symbol.
line
> line)
return
false
;
67
68
const
Symbol
*owner =
nullptr
;
69
for
(
const
auto
&candidate : symbols) {
70
if
(candidate.isLocal || !
isCallableSymbol
(candidate) || candidate.line > line ||
71
candidate.endLine < line) {
72
continue
;
73
}
74
if
(!owner || candidate.
line
> owner->
line
) owner = &candidate;
75
}
76
77
return
owner && owner->
line
== symbol.
ownerLine
&& owner->
name
== symbol.
parentName
;
78
}
79
80
class
SymbolExtractor
{
81
public
:
82
yoi::vec<Symbol>
extract
(
yoi::hoshiModule
*module);
83
84
private
:
85
yoi::vec<Symbol>
symbols
;
86
87
void
visitGlobal
(
yoi::globalStmt
*stmt);
88
void
visitFuncDef
(
yoi::funcDefStmt
*stmt);
89
void
visitStructDef
(
yoi::structDefStmt
*stmt);
90
void
visitInterfaceDef
(
yoi::interfaceDefStmt
*stmt);
91
void
visitLetStmt
(
yoi::letStmt
*stmt,
const
yoi::wstr
&inParent = L
""
,
92
yoi::indexT
ownerLine = 0);
93
void
visitTypeAlias
(
yoi::typeAliasStmt
*stmt);
94
void
visitEnum
(
yoi::enumerationDefinition
*stmt);
95
void
visitImport
(
yoi::importDecl
*stmt);
96
void
visitExport
(
yoi::exportDecl
*stmt);
97
void
visitImpl
(
yoi::implStmt
*stmt);
98
void
visitUse
(
yoi::useStmt
*stmt);
99
void
visitDataStruct
(
yoi::dataStructDefStmt
*stmt);
100
void
visitConceptDef
(
yoi::conceptDefinition
*stmt);
101
void
visitInCodeBlock
(
yoi::inCodeBlockStmt
*stmt,
const
yoi::wstr
&inParent = L
""
,
102
yoi::indexT
ownerLine = 0);
103
104
yoi::wstr
formatTypeSpec
(
yoi::typeSpec
*spec);
105
yoi::wstr
formatDefinitionArgs
(
yoi::definitionArguments
*args);
106
yoi::wstr
formatIdentifierWithDefTemplateArg
(
yoi::identifierWithDefTemplateArg
*
id
);
107
yoi::wstr
formatIdentifierWithTemplateArg
(
yoi::identifierWithTemplateArg
*
id
);
108
yoi::wstr
formatExternModuleAccessExpression
(
yoi::externModuleAccessExpression
*expr);
109
};
110
111
}
// namespace lsp
112
113
#endif
// HOSHI_LANG_LSP_SYMBOL_EXTRACTOR_H
ast.hpp
lsp::SymbolExtractor
Definition
symbolExtractor.h:80
lsp::SymbolExtractor::formatExternModuleAccessExpression
yoi::wstr formatExternModuleAccessExpression(yoi::externModuleAccessExpression *expr)
Definition
symbolExtractor.cpp:751
lsp::SymbolExtractor::formatIdentifierWithDefTemplateArg
yoi::wstr formatIdentifierWithDefTemplateArg(yoi::identifierWithDefTemplateArg *id)
Definition
symbolExtractor.cpp:741
lsp::SymbolExtractor::symbols
yoi::vec< Symbol > symbols
Definition
symbolExtractor.h:85
lsp::SymbolExtractor::visitStructDef
void visitStructDef(yoi::structDefStmt *stmt)
Definition
symbolExtractor.cpp:129
lsp::SymbolExtractor::visitInterfaceDef
void visitInterfaceDef(yoi::interfaceDefStmt *stmt)
Definition
symbolExtractor.cpp:191
lsp::SymbolExtractor::visitEnum
void visitEnum(yoi::enumerationDefinition *stmt)
Definition
symbolExtractor.cpp:345
lsp::SymbolExtractor::visitLetStmt
void visitLetStmt(yoi::letStmt *stmt, const yoi::wstr &inParent=L"", yoi::indexT ownerLine=0)
Definition
symbolExtractor.cpp:289
lsp::SymbolExtractor::visitExport
void visitExport(yoi::exportDecl *stmt)
Definition
symbolExtractor.cpp:401
lsp::SymbolExtractor::visitConceptDef
void visitConceptDef(yoi::conceptDefinition *stmt)
Definition
symbolExtractor.cpp:570
lsp::SymbolExtractor::visitImpl
void visitImpl(yoi::implStmt *stmt)
Definition
symbolExtractor.cpp:419
lsp::SymbolExtractor::extract
yoi::vec< Symbol > extract(yoi::hoshiModule *module)
Definition
symbolExtractor.cpp:14
lsp::SymbolExtractor::formatDefinitionArgs
yoi::wstr formatDefinitionArgs(yoi::definitionArguments *args)
Definition
symbolExtractor.cpp:724
lsp::SymbolExtractor::visitFuncDef
void visitFuncDef(yoi::funcDefStmt *stmt)
Definition
symbolExtractor.cpp:70
lsp::SymbolExtractor::formatTypeSpec
yoi::wstr formatTypeSpec(yoi::typeSpec *spec)
Definition
symbolExtractor.cpp:688
lsp::SymbolExtractor::visitUse
void visitUse(yoi::useStmt *stmt)
Definition
symbolExtractor.cpp:387
lsp::SymbolExtractor::visitDataStruct
void visitDataStruct(yoi::dataStructDefStmt *stmt)
Definition
symbolExtractor.cpp:541
lsp::SymbolExtractor::formatIdentifierWithTemplateArg
yoi::wstr formatIdentifierWithTemplateArg(yoi::identifierWithTemplateArg *id)
Definition
symbolExtractor.cpp:746
lsp::SymbolExtractor::visitTypeAlias
void visitTypeAlias(yoi::typeAliasStmt *stmt)
Definition
symbolExtractor.cpp:328
lsp::SymbolExtractor::visitGlobal
void visitGlobal(yoi::globalStmt *stmt)
Definition
symbolExtractor.cpp:25
lsp::SymbolExtractor::visitImport
void visitImport(yoi::importDecl *stmt)
Definition
symbolExtractor.cpp:370
lsp::SymbolExtractor::visitInCodeBlock
void visitInCodeBlock(yoi::inCodeBlockStmt *stmt, const yoi::wstr &inParent=L"", yoi::indexT ownerLine=0)
Definition
symbolExtractor.cpp:583
yoi::conceptDefinition
Definition
ast.hpp:1113
yoi::dataStructDefStmt
Definition
ast.hpp:721
yoi::definitionArguments
Definition
ast.hpp:305
yoi::enumerationDefinition
Definition
ast.hpp:1096
yoi::exportDecl
Definition
ast.hpp:1047
yoi::externModuleAccessExpression
Definition
ast.hpp:1038
yoi::funcDefStmt
Definition
ast.hpp:618
yoi::globalStmt
Definition
ast.hpp:800
yoi::hoshiModule
Definition
ast.hpp:1031
yoi::identifierWithDefTemplateArg
Definition
ast.hpp:367
yoi::identifierWithTemplateArg
Definition
ast.hpp:355
yoi::implStmt
Definition
ast.hpp:760
yoi::importDecl
Definition
ast.hpp:1054
yoi::inCodeBlockStmt
Definition
ast.hpp:918
yoi::interfaceDefStmt
Definition
ast.hpp:657
yoi::letStmt
Definition
ast.hpp:793
yoi::structDefStmt
Definition
ast.hpp:711
yoi::typeAliasStmt
Definition
ast.hpp:221
yoi::typeSpec
Definition
ast.hpp:322
yoi::useStmt
Definition
ast.hpp:603
def.hpp
lsp
Definition
completion.cpp:12
lsp::isSymbolVisibleAt
bool isSymbolVisibleAt(const yoi::vec< Symbol > &symbols, const Symbol &symbol, yoi::indexT line)
Definition
symbolExtractor.h:63
lsp::isCallableSymbol
bool isCallableSymbol(const Symbol &symbol)
Definition
symbolExtractor.h:54
lsp::CompletionItemKind::Interface
@ Interface
lsp::CompletionItemKind::Variable
@ Variable
lsp::CompletionItemKind::Method
@ Method
lsp::CompletionItemKind::Constructor
@ Constructor
lsp::CompletionItemKind::EnumMember
@ EnumMember
lsp::CompletionItemKind::Field
@ Field
lsp::CompletionItemKind::Function
@ Function
lsp::CompletionItemKind::Struct
@ Struct
lsp::CompletionItemKind::Enum
@ Enum
lsp::CompletionItemKind::Module
@ Module
lsp::HoshiSymbolKind
HoshiSymbolKind
Definition
symbolExtractor.h:16
lsp::HoshiSymbolKind::Export
@ Export
lsp::HoshiSymbolKind::Lambda
@ Lambda
lsp::HoshiSymbolKind::ModuleAlias
@ ModuleAlias
lsp::HoshiSymbolKind::TypeAlias
@ TypeAlias
lsp::HoshiSymbolKind::Variable
@ Variable
lsp::HoshiSymbolKind::Method
@ Method
lsp::HoshiSymbolKind::Constructor
@ Constructor
lsp::HoshiSymbolKind::Import
@ Import
lsp::HoshiSymbolKind::Function
@ Function
lsp::HoshiSymbolKind::Concept_
@ Concept_
lsp::HoshiSymbolKind::Finalizer
@ Finalizer
yoi::vec
std::vector< t > vec
Definition
def.hpp:56
yoi::wstr
std::wstring wstr
Definition
def.hpp:51
yoi::indexT
uint64_t indexT
Definition
def.hpp:54
lsp::Symbol
Definition
symbolExtractor.h:36
lsp::Symbol::ownerLine
yoi::indexT ownerLine
Definition
symbolExtractor.h:50
lsp::Symbol::detail
yoi::wstr detail
Definition
symbolExtractor.h:43
lsp::Symbol::importPath
yoi::wstr importPath
Definition
symbolExtractor.h:47
lsp::Symbol::endLine
yoi::indexT endLine
Definition
symbolExtractor.h:41
lsp::Symbol::column
yoi::indexT column
Definition
symbolExtractor.h:40
lsp::Symbol::line
yoi::indexT line
Definition
symbolExtractor.h:39
lsp::Symbol::children
std::vector< Symbol > children
Definition
symbolExtractor.h:51
lsp::Symbol::parentName
yoi::wstr parentName
Definition
symbolExtractor.h:45
lsp::Symbol::name
yoi::wstr name
Definition
symbolExtractor.h:37
lsp::Symbol::kind
HoshiSymbolKind kind
Definition
symbolExtractor.h:38
lsp::Symbol::isLocal
bool isLocal
Definition
symbolExtractor.h:49
lsp::Symbol::endColumn
yoi::indexT endColumn
Definition
symbolExtractor.h:42
lsp::Symbol::typeInfo
yoi::wstr typeInfo
Definition
symbolExtractor.h:44
lsp::Symbol::sourceFile
yoi::wstr sourceFile
Definition
symbolExtractor.h:46
lsp
symbolExtractor.h
Generated by
1.9.8