luau/Analysis/include/Luau/FragmentAutocomplete.h

147 lines
4.1 KiB
C
Raw Normal View History

2024-09-27 10:11:46 -07:00
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
#pragma once
#include "Luau/Ast.h"
2024-10-18 18:08:01 +03:00
#include "Luau/Parser.h"
#include "Luau/AutocompleteTypes.h"
2024-10-18 18:08:01 +03:00
#include "Luau/DenseHash.h"
#include "Luau/Module.h"
#include "Luau/Frontend.h"
2024-09-27 10:11:46 -07:00
2024-10-18 18:08:01 +03:00
#include <memory>
2024-09-27 10:11:46 -07:00
#include <vector>
namespace Luau
{
2024-10-25 09:46:08 -07:00
struct FrontendOptions;
2024-09-27 10:11:46 -07:00
2025-01-10 09:13:13 -08:00
enum class FragmentTypeCheckStatus
{
SkipAutocomplete,
2025-01-24 10:42:11 -08:00
Success,
2025-01-10 09:13:13 -08:00
};
2024-09-27 10:11:46 -07:00
struct FragmentAutocompleteAncestryResult
{
DenseHashMap<AstName, AstLocal*> localMap{AstName()};
std::vector<AstLocal*> localStack;
std::vector<AstNode*> ancestry;
2024-10-18 18:08:01 +03:00
AstStat* nearestStatement = nullptr;
};
struct FragmentParseResult
{
std::string fragmentToParse;
AstStatBlock* root = nullptr;
std::vector<AstNode*> ancestry;
AstStat* nearestStatement = nullptr;
2025-01-10 09:13:13 -08:00
std::vector<Comment> commentLocations;
2024-10-18 18:08:01 +03:00
std::unique_ptr<Allocator> alloc = std::make_unique<Allocator>();
2024-09-27 10:11:46 -07:00
};
2024-10-25 09:46:08 -07:00
struct FragmentTypeCheckResult
{
ModulePtr incrementalModule = nullptr;
ScopePtr freshScope;
std::vector<AstNode*> ancestry;
};
struct FragmentAutocompleteResult
{
ModulePtr incrementalModule;
Scope* freshScope;
TypeArena arenaForAutocomplete;
AutocompleteResult acResults;
2024-10-25 09:46:08 -07:00
};
2024-09-27 10:11:46 -07:00
FragmentAutocompleteAncestryResult findAncestryForFragmentParse(AstStatBlock* root, const Position& cursorPos);
2025-01-24 10:42:11 -08:00
std::optional<FragmentParseResult> parseFragment(
2024-11-15 11:37:29 -08:00
const SourceModule& srcModule,
std::string_view src,
const Position& cursorPos,
std::optional<Position> fragmentEndPosition
);
2024-10-18 18:08:01 +03:00
2025-01-10 09:13:13 -08:00
std::pair<FragmentTypeCheckStatus, FragmentTypeCheckResult> typecheckFragment(
2024-10-25 09:46:08 -07:00
Frontend& frontend,
const ModuleName& moduleName,
const Position& cursorPos,
std::optional<FrontendOptions> opts,
2024-11-15 11:37:29 -08:00
std::string_view src,
std::optional<Position> fragmentEndPosition
2024-10-25 09:46:08 -07:00
);
FragmentAutocompleteResult fragmentAutocomplete(
2024-10-18 18:08:01 +03:00
Frontend& frontend,
std::string_view src,
const ModuleName& moduleName,
Position cursorPosition,
2024-10-25 09:46:08 -07:00
std::optional<FrontendOptions> opts,
2024-11-15 11:37:29 -08:00
StringCompletionCallback callback,
std::optional<Position> fragmentEndPosition = std::nullopt
2024-10-18 18:08:01 +03:00
);
2025-02-28 14:01:49 -08:00
enum class FragmentAutocompleteStatus
{
Success,
FragmentTypeCheckFail,
InternalIce
};
struct FragmentAutocompleteStatusResult
{
FragmentAutocompleteStatus status;
std::optional<FragmentAutocompleteResult> result;
};
struct FragmentContext
{
std::string_view newSrc;
const ParseResult& newAstRoot;
std::optional<FrontendOptions> opts;
std::optional<Position> DEPRECATED_fragmentEndPosition;
};
/**
* @brief Attempts to compute autocomplete suggestions from the fragment context.
*
* This function computes autocomplete suggestions using outdated frontend typechecking data
* by patching the fragment context of the new script source content.
*
* @param frontend The Luau Frontend data structure, which may contain outdated typechecking data.
*
* @param moduleName The name of the target module, specifying which script the caller wants to request autocomplete for.
*
* @param cursorPosition The position in the script where the caller wants to trigger autocomplete.
*
* @param context The fragment context that this API will use to patch the outdated typechecking data.
*
* @param stringCompletionCB A callback function that provides autocomplete suggestions for string contexts.
*
* @return
* The status indicating whether `fragmentAutocomplete` ran successfully or failed, along with the reason for failure.
* Also includes autocomplete suggestions if the status is successful.
*
* @usage
* FragmentAutocompleteStatusResult acStatusResult;
* if (shouldFragmentAC)
* acStatusResult = Luau::tryFragmentAutocomplete(...);
*
* if (acStatusResult.status != Successful)
* {
* frontend.check(moduleName, options);
* acStatusResult.acResult = Luau::autocomplete(...);
* }
* return convertResultWithContext(acStatusResult.acResult);
*/
FragmentAutocompleteStatusResult tryFragmentAutocomplete(
Frontend& frontend,
const ModuleName& moduleName,
Position cursorPosition,
FragmentContext context,
StringCompletionCallback stringCompletionCB
);
2024-10-18 18:08:01 +03:00
2024-09-27 10:11:46 -07:00
} // namespace Luau