135 lines
4.5 KiB
C++
135 lines
4.5 KiB
C++
// Tencent is pleased to support the open source community by making UnLua available.
|
|
//
|
|
// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
|
//
|
|
// Licensed under the MIT License (the "License");
|
|
// you may not use this file except in compliance with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://opensource.org/licenses/MIT
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and limitations under the License.
|
|
|
|
#include "Commandlets/UnLuaIntelliSenseCommandlet.h"
|
|
|
|
#include "Binding.h"
|
|
#include "Misc/FileHelper.h"
|
|
#include "UnLuaIntelliSenseGenerator.h"
|
|
|
|
UUnLuaIntelliSenseCommandlet::UUnLuaIntelliSenseCommandlet(const FObjectInitializer& ObjectInitializer)
|
|
: Super(ObjectInitializer)
|
|
{
|
|
//IntermediateDir = FPaths::ProjectIntermediateDir();
|
|
IntermediateDir = FPaths::ProjectPluginsDir();
|
|
IntermediateDir += TEXT("UnLua/Intermediate/");
|
|
}
|
|
|
|
int32 UUnLuaIntelliSenseCommandlet::Main(const FString &Params)
|
|
{
|
|
// class black list
|
|
TArray<FString> ClassBlackList;
|
|
ClassBlackList.Add("int8");
|
|
ClassBlackList.Add("int16");
|
|
ClassBlackList.Add("int32");
|
|
ClassBlackList.Add("int64");
|
|
ClassBlackList.Add("uint8");
|
|
ClassBlackList.Add("uint16");
|
|
ClassBlackList.Add("uint32");
|
|
ClassBlackList.Add("uint64");
|
|
ClassBlackList.Add("float");
|
|
ClassBlackList.Add("double");
|
|
ClassBlackList.Add("bool");
|
|
ClassBlackList.Add("FName");
|
|
ClassBlackList.Add("FString");
|
|
ClassBlackList.Add("FText");
|
|
|
|
// enum black list
|
|
TArray<FString> EnumBlackList;
|
|
|
|
// function black list
|
|
TArray<FString> FuncBlackList;
|
|
FuncBlackList.Add("OnModuleHotfixed");
|
|
|
|
const auto ExportedReflectedClasses = UnLua::GetExportedReflectedClasses();
|
|
const auto ExportedNonReflectedClasses = UnLua::GetExportedNonReflectedClasses();
|
|
const auto ExportedEnums = UnLua::GetExportedEnums();
|
|
const auto ExportedFunctions = UnLua::GetExportedFunctions();
|
|
|
|
FString GeneratedFileContent;
|
|
FString ModuleName(TEXT("StaticallyExports"));
|
|
|
|
// reflected classes
|
|
for (auto Pair : ExportedReflectedClasses)
|
|
{
|
|
if (ClassBlackList.Contains(Pair.Key))
|
|
continue;
|
|
|
|
Pair.Value->GenerateIntelliSense(GeneratedFileContent);
|
|
SaveFile(ModuleName, Pair.Key, GeneratedFileContent);
|
|
}
|
|
|
|
for (auto Pair : ExportedNonReflectedClasses)
|
|
{
|
|
if (ClassBlackList.Contains(Pair.Key))
|
|
continue;
|
|
|
|
Pair.Value->GenerateIntelliSense(GeneratedFileContent);
|
|
SaveFile(ModuleName, Pair.Key, GeneratedFileContent);
|
|
}
|
|
|
|
for (auto Enum : ExportedEnums)
|
|
{
|
|
if (EnumBlackList.Contains(Enum->GetName()))
|
|
continue;
|
|
|
|
Enum->GenerateIntelliSense(GeneratedFileContent);
|
|
SaveFile(ModuleName, Enum->GetName(), GeneratedFileContent);
|
|
}
|
|
|
|
for (auto Function : ExportedFunctions)
|
|
{
|
|
if (FuncBlackList.Contains(Function->GetName()))
|
|
continue;
|
|
|
|
Function->GenerateIntelliSense(GeneratedFileContent);
|
|
}
|
|
|
|
SaveFile(ModuleName, TEXT("GlobalFunctions"), GeneratedFileContent);
|
|
|
|
// generate blueprint intellisense if needed
|
|
TArray<FString> Tokens;
|
|
TArray<FString> Switches;
|
|
TMap<FString, FString> ParamsMap;
|
|
ParseCommandLine(*Params, Tokens, Switches, ParamsMap);
|
|
FString BPKey = TEXT("BP");
|
|
if (ParamsMap.Contains(BPKey) && ParamsMap[BPKey] == TEXT("1"))
|
|
{
|
|
auto Generator = FUnLuaIntelliSenseGenerator::Get();
|
|
Generator->Initialize();
|
|
Generator->UpdateAll();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void UUnLuaIntelliSenseCommandlet::SaveFile(const FString &ModuleName, const FString &FileName, const FString &GeneratedFileContent)
|
|
{
|
|
IFileManager &FileManager = IFileManager::Get();
|
|
FString Directory = FString::Printf(TEXT("%sIntelliSense/%s"), *IntermediateDir, *ModuleName);
|
|
if (!FileManager.DirectoryExists(*Directory))
|
|
{
|
|
FileManager.MakeDirectory(*Directory);
|
|
}
|
|
|
|
const FString FilePath = FString::Printf(TEXT("%s/%s.lua"), *Directory, *FileName);
|
|
FString FileContent;
|
|
FFileHelper::LoadFileToString(FileContent, *FilePath);
|
|
if (FileContent != GeneratedFileContent)
|
|
{
|
|
bool bResult = FFileHelper::SaveStringToFile(GeneratedFileContent, *FilePath, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);
|
|
check(bResult);
|
|
}
|
|
}
|