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);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |