Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/Analysis/include/Luau/AstQuery.h
2727 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#pragma once
3
4
#include "Luau/Ast.h"
5
#include "Luau/Documentation.h"
6
#include "Luau/TypeFwd.h"
7
8
#include <memory>
9
10
namespace Luau
11
{
12
13
struct Binding;
14
struct SourceModule;
15
struct Module;
16
17
using ScopePtr = std::shared_ptr<struct Scope>;
18
19
struct ExprOrLocal
20
{
21
AstExpr* getExpr()
22
{
23
return expr;
24
}
25
AstLocal* getLocal()
26
{
27
return local;
28
}
29
void setExpr(AstExpr* newExpr)
30
{
31
expr = newExpr;
32
local = nullptr;
33
}
34
void setLocal(AstLocal* newLocal)
35
{
36
local = newLocal;
37
expr = nullptr;
38
}
39
std::optional<Location> getLocation()
40
{
41
return expr ? expr->location : (local ? local->location : std::optional<Location>{});
42
}
43
std::optional<AstName> getName()
44
{
45
if (expr)
46
{
47
if (AstName name = getIdentifier(expr); name.value)
48
{
49
return name;
50
}
51
}
52
else if (local)
53
{
54
return local->name;
55
}
56
return std::nullopt;
57
}
58
59
private:
60
AstExpr* expr = nullptr;
61
AstLocal* local = nullptr;
62
};
63
64
struct FindFullAncestry final : public AstVisitor
65
{
66
std::vector<AstNode*> nodes;
67
Position pos;
68
Position documentEnd;
69
bool includeTypes = false;
70
71
explicit FindFullAncestry(Position pos, Position documentEnd, bool includeTypes = false);
72
73
bool visit(AstType* type) override;
74
75
bool visit(AstStatFunction* node) override;
76
77
bool visit(AstNode* node) override;
78
};
79
80
std::vector<AstNode*> findAncestryAtPositionForAutocomplete(const SourceModule& source, Position pos);
81
std::vector<AstNode*> findAncestryAtPositionForAutocomplete(AstStatBlock* root, Position pos);
82
std::vector<AstNode*> findAstAncestryOfPosition(const SourceModule& source, Position pos, bool includeTypes = false);
83
std::vector<AstNode*> findAstAncestryOfPosition(AstStatBlock* root, Position pos, bool includeTypes = false);
84
AstNode* findNodeAtPosition(const SourceModule& source, Position pos);
85
AstNode* findNodeAtPosition(AstStatBlock* root, Position pos);
86
AstExpr* findExprAtPosition(const SourceModule& source, Position pos);
87
ScopePtr findScopeAtPosition(const Module& module, Position pos);
88
std::optional<Binding> findBindingAtPosition(const Module& module, const SourceModule& source, Position pos);
89
ExprOrLocal findExprOrLocalAtPosition(const SourceModule& source, Position pos);
90
91
std::optional<TypeId> findTypeAtPosition(const Module& module, const SourceModule& sourceModule, Position pos);
92
std::optional<TypeId> findExpectedTypeAtPosition(const Module& module, const SourceModule& sourceModule, Position pos);
93
94
std::optional<DocumentationSymbol> getDocumentationSymbolAtPosition(const SourceModule& source, const Module& module, Position position);
95
96
} // namespace Luau
97
98