@@ -2,34 +2,77 @@ package com.github.tommykw.phptraitinlineviewer
22
33import com.intellij.openapi.fileEditor.FileEditorManager
44import com.intellij.openapi.project.Project
5+ import com.intellij.psi.util.PsiTreeUtil
56import com.intellij.testFramework.LightVirtualFile
67import com.jetbrains.php.lang.PhpFileType
8+ import com.jetbrains.php.lang.psi.PhpFile
79import com.jetbrains.php.lang.psi.elements.PhpClass
10+ import com.jetbrains.php.lang.psi.elements.PhpUseList
811
912object TraitMerger {
1013 fun mergeClassWithTraits (phpClass : PhpClass ): String {
1114 return buildString {
1215 append(" <?php\n\n " )
16+
17+ val namespace = phpClass.namespaceName?.trim(' \\ ' )
18+ if (! namespace.isNullOrEmpty()) {
19+ append(" namespace $namespace ;\n\n " )
20+ }
21+
22+ val phpFile = phpClass.containingFile as ? PhpFile
23+ phpFile?.let { file ->
24+ val useStatements = PsiTreeUtil .findChildrenOfType(file, PhpUseList ::class .java)
25+ .filter { useList ->
26+ PsiTreeUtil .getParentOfType(useList, PhpClass ::class .java) == null
27+ }
28+ if (useStatements.isNotEmpty()) {
29+ for (useList in useStatements) {
30+ append(useList.text)
31+ append(" \n " )
32+ }
33+ append(" \n " )
34+ }
35+ }
36+
1337 append(" class ${phpClass.name} Merged {\n " )
1438
1539 val traits = phpClass.traits
16-
1740 for (trait in traits) {
1841 append(" // ===== Trait: ${trait.name} =====\n\n " )
1942
43+ for (field in trait.fields) {
44+ append(" " )
45+ append(field.text.replace(" \n " , " \n " ))
46+ append(" \n\n " )
47+ }
48+
2049 for (method in trait.methods) {
2150 append(" " )
2251 append(method.text.replace(" \n " , " \n " ))
2352 append(" \n\n " )
2453 }
54+ }
2555
26- for (field in trait.fields) {
56+ val ownFields = phpClass.ownFields
57+ if (ownFields.isNotEmpty()) {
58+ append(" // ===== Original Class Fields =====\n\n " )
59+ for (field in ownFields) {
2760 append(" " )
2861 append(field.text.replace(" \n " , " \n " ))
2962 append(" \n\n " )
3063 }
3164 }
3265
66+ val ownMethods = phpClass.ownMethods
67+ if (ownMethods.isNotEmpty()) {
68+ append(" // ===== Original Class Methods =====\n\n " )
69+ for (method in ownMethods) {
70+ append(" " )
71+ append(method.text.replace(" \n " , " \n " ))
72+ append(" \n\n " )
73+ }
74+ }
75+
3376 append(" }\n " )
3477 }
3578 }
0 commit comments