Skip to content

Commit 952aa7d

Browse files
committed
send help
1 parent 168e281 commit 952aa7d

File tree

7 files changed

+783
-41
lines changed

7 files changed

+783
-41
lines changed

build.gradle

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ repositories {
1717

1818
dependencies {
1919
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
20-
implementation "io.github.fukkitmc:gloom:2.0.8"
20+
implementation "io.github.fukkitmc:gloom:2.1.0"
2121
}
2222

2323
// See https://github.com/JetBrains/gradle-intellij-plugin/
2424
intellij {
2525
version '2020.1.1'
26+
plugins = ['java']
2627
}
2728
compileKotlin {
2829
kotlinOptions.jvmTarget = "1.8"

src/main/kotlin/me/hydos/fukkitdevelopment/FieldTextBox.kt

-23
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,47 @@
1-
package me.hydos.fukkitdevelopment
1+
package me.hydos.fukkitdevelopment;
22

33
import com.intellij.openapi.actionSystem.AnAction
44
import com.intellij.openapi.actionSystem.AnActionEvent
5-
import io.github.fukkitmc.gloom.DefinitionSerializer
6-
import java.awt.event.ActionEvent
7-
import java.io.File
8-
import javax.swing.JButton
9-
5+
import com.intellij.openapi.actionSystem.CommonDataKeys.CARET
6+
import com.intellij.openapi.actionSystem.CommonDataKeys.PSI_FILE
7+
import com.intellij.openapi.wm.WindowManager
8+
import com.intellij.psi.*
9+
import com.intellij.psi.util.elementType
1010

1111
class GloomFieldAction : AnAction() {
12-
/**
13-
* Implement this method to provide your action handler.
14-
*
15-
* @param e Carries information on the invocation place
16-
*/
12+
1713
override fun actionPerformed(e: AnActionEvent) {
14+
print(1)
15+
val project = e.project ?: return
16+
val file = e.getData(PSI_FILE) ?: return
17+
val caret = e.getData(CARET) ?: return
18+
19+
val element = file.findElementAt(caret.offset) ?: return
20+
val member = element.findReferencedMember() ?: return
21+
22+
val targetReference = when (member) {
23+
is PsiMethod -> member.qualifiedMemberReference
24+
is PsiField -> member.qualifiedMemberReference
25+
else -> return
26+
}
1827

19-
val definitions = DefinitionSerializer.fromString(File("E:/dev/fabric/mods/LegacyFukkit/definitions/fields.json").readText());
20-
val testButton = JButton()
21-
testButton.addActionListener { actionEvent: ActionEvent? ->
22-
if (FieldTextBox().showAndGet()) {
28+
WindowManager.getInstance().getStatusBar(project).info = "Adding $targetReference to Gloom fields"
29+
println(file.parent)
30+
println(file)
2331

24-
}
25-
}
32+
val methodName = element.text;
33+
val methodDescriptor = toString(targetReference);
2634

35+
println(methodName)
36+
println(methodDescriptor)
37+
}
2738

39+
private fun toString(reference: MemberReference): String {
40+
val builder = StringBuilder()
41+
if (reference.owner != null) {
42+
builder.append('L').append(reference.owner.replace('.', '/')).append(';')
43+
}
44+
return builder.toString()
2845
}
2946

3047
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package me.hydos.fukkitdevelopment
2+
3+
import com.google.gson.JsonDeserializationContext
4+
import com.google.gson.JsonDeserializer
5+
import com.google.gson.JsonElement
6+
import com.intellij.openapi.project.Project
7+
import com.intellij.psi.PsiClass
8+
import com.intellij.psi.PsiField
9+
import com.intellij.psi.PsiMember
10+
import com.intellij.psi.PsiMethod
11+
import com.intellij.psi.search.GlobalSearchScope
12+
import com.intellij.util.containers.stream
13+
import java.io.Serializable
14+
import java.lang.reflect.Type
15+
import java.util.stream.Stream
16+
17+
/**
18+
* Represents a reference to a class member (a method or a field). It may
19+
* resolve to multiple members if [matchAll] is set or if the member is
20+
* not full qualified.
21+
*/
22+
data class MemberReference(
23+
val name: String,
24+
val descriptor: String? = null,
25+
val owner: String? = null,
26+
val matchAll: Boolean = false
27+
) : Serializable {
28+
29+
val qualified
30+
get() = this.owner != null
31+
32+
val withoutOwner
33+
get() = if (this.owner == null) this else MemberReference(this.name, this.descriptor, null, this.matchAll)
34+
35+
fun matchOwner(psiClass: PsiClass): Boolean {
36+
return this.owner == null || this.owner == psiClass.fullQualifiedName
37+
}
38+
39+
fun match(method: PsiMethod, qualifier: PsiClass): Boolean {
40+
return this.name == method.internalName && matchOwner(qualifier) &&
41+
(this.descriptor == null || this.descriptor == method.descriptor)
42+
}
43+
44+
fun match(field: PsiField, qualifier: PsiClass): Boolean {
45+
return this.name == field.name && matchOwner(qualifier) &&
46+
(this.descriptor == null || this.descriptor == field.descriptor)
47+
}
48+
49+
fun resolve(
50+
project: Project,
51+
scope: GlobalSearchScope = GlobalSearchScope.allScope(project)
52+
): Pair<PsiClass, PsiMember>? {
53+
return resolve(project, scope, ::Pair)
54+
}
55+
56+
fun resolveMember(project: Project, scope: GlobalSearchScope = GlobalSearchScope.allScope(project)): PsiMember? {
57+
return resolve(project, scope) { _, member -> member }
58+
}
59+
60+
private inline fun <R> resolve(project: Project, scope: GlobalSearchScope, ret: (PsiClass, PsiMember) -> R): R? {
61+
if (this.owner == null) {
62+
throw IllegalStateException("Cannot resolve unqualified member reference (owner == null)")
63+
}
64+
65+
val psiClass = findQualifiedClass(project, this.owner, scope) ?: return null
66+
67+
val member: PsiMember? = if (descriptor != null && descriptor.startsWith('(')) {
68+
// Method, we assume there is only one (since this member descriptor is full qualified)
69+
psiClass.findMethods(this, checkBases = true).findAny().orElse(null)
70+
} else {
71+
// Field
72+
psiClass.findField(this, checkBases = true)
73+
}
74+
75+
return member?.let { ret(psiClass, member) }
76+
}
77+
78+
object Deserializer : JsonDeserializer<MemberReference> {
79+
override fun deserialize(json: JsonElement, type: Type, ctx: JsonDeserializationContext): MemberReference {
80+
val ref = json.asString
81+
val className = ref.substringBefore('#')
82+
val methodName = ref.substring(className.length + 1, ref.indexOf("("))
83+
val methodDesc = ref.substring(className.length + methodName.length + 1)
84+
return MemberReference(methodName, methodDesc, className)
85+
}
86+
}
87+
}
88+
89+
// Class
90+
91+
fun PsiClass.findMethods(member: MemberReference, checkBases: Boolean = false): Stream<PsiMethod> {
92+
if (!member.matchOwner(this)) {
93+
return Stream.empty()
94+
}
95+
96+
val result = findMethodsByInternalName(member.name, checkBases)
97+
return if (member.descriptor != null) {
98+
result.stream().filter { it.descriptor == member.descriptor }
99+
} else {
100+
result.stream()
101+
}
102+
}
103+
104+
fun PsiClass.findField(member: MemberReference, checkBases: Boolean = false): PsiField? {
105+
if (!member.matchOwner(this)) {
106+
return null
107+
}
108+
109+
val field = findFieldByName(member.name, checkBases) ?: return null
110+
if (member.descriptor != null && member.descriptor != field.descriptor) {
111+
return null
112+
}
113+
114+
return field
115+
}
116+
117+
// Method
118+
119+
val PsiMethod.memberReference
120+
get() = MemberReference(internalName, descriptor)
121+
122+
val PsiMethod.qualifiedMemberReference
123+
get() = MemberReference(internalName, descriptor, containingClass!!.fullQualifiedName)
124+
125+
fun PsiMethod.getQualifiedMemberReference(owner: PsiClass): MemberReference {
126+
return MemberReference(internalName, descriptor, owner.fullQualifiedName)
127+
}
128+
129+
fun PsiMethod?.isSameReference(reference: PsiMethod?): Boolean =
130+
this != null && (this === reference || qualifiedMemberReference == reference?.qualifiedMemberReference)
131+
132+
// Field
133+
val PsiField.simpleMemberReference
134+
get() = MemberReference(name)
135+
136+
val PsiField.memberReference
137+
get() = MemberReference(name, descriptor)
138+
139+
val PsiField.simpleQualifiedMemberReference
140+
get() = MemberReference(name, null, containingClass!!.fullQualifiedName)
141+
142+
val PsiField.qualifiedMemberReference
143+
get() = MemberReference(name, descriptor, containingClass!!.fullQualifiedName)
144+
145+
fun PsiField.getQualifiedMemberReference(owner: PsiClass): MemberReference {
146+
return MemberReference(name, descriptor, owner.fullQualifiedName)
147+
}

0 commit comments

Comments
 (0)