Skip to content

Commit 03a84a0

Browse files
authored
Merge pull request #9 from tommykw/feature/inline-trait-viewer
Implement inline trait viewer with merged class display
2 parents 03c74ba + b9c6a62 commit 03a84a0

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

src/main/kotlin/com/github/tommykw/phptraitinlineviewer/TraitMerger.kt

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,77 @@ package com.github.tommykw.phptraitinlineviewer
22

33
import com.intellij.openapi.fileEditor.FileEditorManager
44
import com.intellij.openapi.project.Project
5+
import com.intellij.psi.util.PsiTreeUtil
56
import com.intellij.testFramework.LightVirtualFile
67
import com.jetbrains.php.lang.PhpFileType
8+
import com.jetbrains.php.lang.psi.PhpFile
79
import com.jetbrains.php.lang.psi.elements.PhpClass
10+
import com.jetbrains.php.lang.psi.elements.PhpUseList
811

912
object 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

Comments
 (0)