Skip to content

Commit

Permalink
IPC: Resolve C++ endpoint classes
Browse files Browse the repository at this point in the history
  • Loading branch information
mattco98 committed Jan 20, 2024
1 parent 87c10b9 commit 4b22360
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package me.mattco.serenityos.ipc.psi.mixins

import com.intellij.lang.ASTNode
import com.intellij.psi.PsiManager
import com.intellij.psi.search.FileTypeIndex
import com.intellij.psi.util.PsiTreeUtil
import com.jetbrains.cidr.lang.OCFileType
import com.jetbrains.cidr.lang.psi.OCElement
import com.jetbrains.cidr.lang.psi.OCFile
import com.jetbrains.cidr.lang.psi.OCStructLike
import com.jetbrains.cidr.lang.search.scopes.OCSearchScope
import me.mattco.serenityos.ipc.psi.IPCNamedElement
import me.mattco.serenityos.ipc.psi.api.IPCEndpoint
import me.mattco.serenityos.ipc.psi.multiRef

abstract class IPCEndpointMixin(node: ASTNode) : IPCNamedElement(node), IPCEndpoint {
override fun getReference() = multiRef { resolveCppDecl() }

private fun resolveCppDecl(): List<OCElement> {
val endpointName = identifier.text

val scope = OCSearchScope.getProjectSourcesScope(project)
val psiManager = PsiManager.getInstance(project)

// We will only ever resolve to header files. Additionally, IPC files have some naming
// conventions that we can use to avoid searching thousands of files
val files = FileTypeIndex.getFiles(OCFileType.INSTANCE, scope)
.filter {
val name = it.nameWithoutExtension
it.extension == "h" && ("Client" in name || "Server" in name || "Connection" in name)
}

val matchingEndpoints = mutableListOf<OCStructLike>()

for (file in files) {
val cppFile = psiManager.findFile(file) as OCFile
val structs = PsiTreeUtil.findChildrenOfType(cppFile, OCStructLike::class.java)
for (struct in structs) {
for (base in struct.baseClausesList?.baseClauses.orEmpty()) {
val baseText = base.text
if (endpointName !in baseText) continue
if (baseText.startsWith("public IPC::ConnectionFromClient")
|| baseText.startsWith("public IPC::ConnectionToServer")
) {
matchingEndpoints.add(struct)
}
}
}
}

return matchingEndpoints
}
}
4 changes: 3 additions & 1 deletion src/main/resources/grammar/SerenityOS IPC.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ QuoteIncludePath ::= QUOTE INCLUDE_IDENTIFIER QUOTE {
elementType=IncludePath
}

Endpoint ::= KEYWORD_ENDPOINT IDENTIFIER OPEN_CURLY EndpointFunction* CLOSE_CURLY
Endpoint ::= KEYWORD_ENDPOINT IDENTIFIER OPEN_CURLY EndpointFunction* CLOSE_CURLY {
mixin="me.mattco.serenityos.ipc.psi.mixins.IPCEndpointMixin"
}
EndpointFunction ::= IDENTIFIER ParameterList Trailer

ParameterList ::= OPEN_PAREN [Parameter (COMMA Parameter)*] CLOSE_PAREN
Expand Down

0 comments on commit 4b22360

Please sign in to comment.