From 9f16de461f23e5619202781a1b92b604137a65d9 Mon Sep 17 00:00:00 2001 From: empty2fill Date: Mon, 18 Apr 2022 16:02:33 +0900 Subject: [PATCH] Add TemplateNamingConvention - gather all type action asset (cherry picked from commit 801bb6e399f73e316369aaf7469584a65f63b6cd) --- Plugins/Linter/Linter.uplugin | 15 ++++ .../TemplateLinter/Private/TemplateLinter.cpp | 20 +++++ .../Private/TemplateNamingConvention.cpp | 83 +++++++++++++++++++ .../TemplateLinter/Public/TemplateLinter.h | 23 +++++ .../Public/TemplateNamingConvention.h | 17 ++++ .../TemplateLinter/TemplateLinter.Build.cs | 29 +++++++ 6 files changed, 187 insertions(+) create mode 100644 Plugins/Linter/Source/TemplateLinter/Private/TemplateLinter.cpp create mode 100644 Plugins/Linter/Source/TemplateLinter/Private/TemplateNamingConvention.cpp create mode 100644 Plugins/Linter/Source/TemplateLinter/Public/TemplateLinter.h create mode 100644 Plugins/Linter/Source/TemplateLinter/Public/TemplateNamingConvention.h create mode 100644 Plugins/Linter/Source/TemplateLinter/TemplateLinter.Build.cs diff --git a/Plugins/Linter/Linter.uplugin b/Plugins/Linter/Linter.uplugin index b8697f9..51c6148 100644 --- a/Plugins/Linter/Linter.uplugin +++ b/Plugins/Linter/Linter.uplugin @@ -58,6 +58,21 @@ "Server", "Client" ] + }, + { + "Name": "TemplateLinter", + "Type": "Editor", + "LoadingPhase": "PreDefault", + "WhitelistPlatforms": [ + "Win64", + "Win32", + "Mac", + "Linux" + ], + "BlacklistTargets": [ + "Server", + "Client" + ] } ] } \ No newline at end of file diff --git a/Plugins/Linter/Source/TemplateLinter/Private/TemplateLinter.cpp b/Plugins/Linter/Source/TemplateLinter/Private/TemplateLinter.cpp new file mode 100644 index 0000000..e1e6897 --- /dev/null +++ b/Plugins/Linter/Source/TemplateLinter/Private/TemplateLinter.cpp @@ -0,0 +1,20 @@ +// Copyright 2019-2020 Gamemakin LLC. All Rights Reserved. + +#include "TemplateLinter.h" + +#define LOCTEXT_NAMESPACE "FTemplateLinterModule" + +void FTemplateLinterModule::StartupModule() +{ +// Super::StartupModule(); +} + +void FTemplateLinterModule::ShutdownModule() +{ +// Super::ShutdownModule(); +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FTemplateLinterModule, TemplateLinter) +DEFINE_LOG_CATEGORY(LogTemplateLinter); \ No newline at end of file diff --git a/Plugins/Linter/Source/TemplateLinter/Private/TemplateNamingConvention.cpp b/Plugins/Linter/Source/TemplateLinter/Private/TemplateNamingConvention.cpp new file mode 100644 index 0000000..e4e6042 --- /dev/null +++ b/Plugins/Linter/Source/TemplateLinter/Private/TemplateNamingConvention.cpp @@ -0,0 +1,83 @@ +// Copyright 2019-2020 Gamemakin LLC. All Rights Reserved. +#include "TemplateNamingConvention.h" + +#include "IAssetTypeActions.h" +#include "AssetToolsModule.h" +#include "Misc/BlacklistNames.h" + +UTemplateNamingConvention::UTemplateNamingConvention(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + if(HasAnyFlags(EObjectFlags::RF_ClassDefaultObject)) + { + return; + } + + auto AddNamingConvention = [&](const FString& ObjectPath, const FString& Prefix = TEXT(""), const FString& Suffix = TEXT(""), const FName& Variant = NAME_None) { + ClassNamingConventions.Push(FLinterNamingConventionInfo(TSoftClassPtr(FSoftObjectPath(ObjectPath)), Prefix, Suffix, Variant)); + }; + + // Add all type action asset, reference SFilterList::MakeAddFilterMenu + { + FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked(TEXT("AssetTools")); + + // Get the browser type maps + TArray> AssetTypeActionsList; + AssetToolsModule.Get().GetAssetTypeActionsList(AssetTypeActionsList); + + // Sort the list + struct FCompareIAssetTypeActions + { + FORCEINLINE bool operator()(const TWeakPtr& A, const TWeakPtr& B) const + { + return A.Pin()->GetName().CompareTo(B.Pin()->GetName()) == -1; + } + }; + AssetTypeActionsList.Sort(FCompareIAssetTypeActions()); + + TSharedRef AssetClassBlacklist = AssetToolsModule.Get().GetAssetClassBlacklist(); + + // For every asset type, add naming convention + for (int32 ClassIdx = 0; ClassIdx < AssetTypeActionsList.Num(); ++ClassIdx) + { + const TWeakPtr& WeakTypeActions = AssetTypeActionsList[ClassIdx]; + if (WeakTypeActions.IsValid()) + { + TSharedPtr TypeActions = WeakTypeActions.Pin(); + if (ensure(TypeActions.IsValid()) && TypeActions->CanFilter()) + { + UClass* SupportedClass = TypeActions->GetSupportedClass(); + if (SupportedClass && AssetClassBlacklist->PassesFilter(SupportedClass->GetFName())) + { + AddNamingConvention(SupportedClass->GetPathName()); + } + } + } + } + } + + // Add missing asset and variant + { + // Animation + AddNamingConvention(TEXT("/Script/Engine.AnimLayerInterface")); + AddNamingConvention(TEXT("/Script/Engine.MorphTarget")); + + // Artificial Intelligence + AddNamingConvention(TEXT("/Script/Engine.AIController")); + AddNamingConvention(TEXT("/Script/Engine.BTDecorator")); + AddNamingConvention(TEXT("/Script/Engine.BTService")); + AddNamingConvention(TEXT("/Script/Engine.BTTaskNode")); + + // Blueprints + AddNamingConvention(TEXT("/Script/Engine.Blueprint"), "", "", "MacroLibrary"); + AddNamingConvention(TEXT("/Script/Engine.Blueprint"), "", "", "Interface"); + AddNamingConvention(TEXT("/Script/Engine.BlueprintFunctionLibrary")); + + // Materials + AddNamingConvention(TEXT("/Script/Engine.Material"), "", "", "PostProcess"); + AddNamingConvention(TEXT("/Script/Engine.MaterialInstanceConstant"), "", "", "PostProcess"); + } + + SortConventions(); +} + diff --git a/Plugins/Linter/Source/TemplateLinter/Public/TemplateLinter.h b/Plugins/Linter/Source/TemplateLinter/Public/TemplateLinter.h new file mode 100644 index 0000000..4e28a45 --- /dev/null +++ b/Plugins/Linter/Source/TemplateLinter/Public/TemplateLinter.h @@ -0,0 +1,23 @@ +// Copyright 2019-2020 Gamemakin LLC. All Rights Reserved. +#pragma once + +#include "Modules/ModuleManager.h" + +DECLARE_LOG_CATEGORY_EXTERN(LogTemplateLinter, Verbose, All); + +class TEMPLATELINTER_API FTemplateLinterModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; + + virtual bool SupportsDynamicReloading() override + { + return false; + } + +private: + +}; \ No newline at end of file diff --git a/Plugins/Linter/Source/TemplateLinter/Public/TemplateNamingConvention.h b/Plugins/Linter/Source/TemplateLinter/Public/TemplateNamingConvention.h new file mode 100644 index 0000000..935083a --- /dev/null +++ b/Plugins/Linter/Source/TemplateLinter/Public/TemplateNamingConvention.h @@ -0,0 +1,17 @@ +// Copyright 2019-2020 Gamemakin LLC. All Rights Reserved. +#pragma once + +#include "CoreMinimal.h" +#include "LinterNamingConvention.h" +#include "TemplateNamingConvention.generated.h" + +UCLASS() +class UTemplateNamingConvention : public ULinterNamingConvention +{ + GENERATED_BODY() + +public: + + UTemplateNamingConvention(const FObjectInitializer& ObjectInitializer); + +}; diff --git a/Plugins/Linter/Source/TemplateLinter/TemplateLinter.Build.cs b/Plugins/Linter/Source/TemplateLinter/TemplateLinter.Build.cs new file mode 100644 index 0000000..4ed6f9e --- /dev/null +++ b/Plugins/Linter/Source/TemplateLinter/TemplateLinter.Build.cs @@ -0,0 +1,29 @@ +// Copyright 2019-2020 Gamemakin LLC. All Rights Reserved. + +using UnrealBuildTool; + +public class TemplateLinter : ModuleRules +{ + public TemplateLinter(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "CoreUObject", + "Engine", + "Linter" + } + ); + + + PrivateDependencyModuleNames.AddRange( + new string[] + { + + } + ); + } +}