From 12fd4fda5671881128059ccdb844f12fa210f8dc Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Sun, 23 Jun 2024 16:43:38 +0800 Subject: [PATCH] feat(compiler): add query statement support in pattern action #16 Added a new field 'isQueryStatement' in PatternAction and PatternActionTransform classes to identify query statements. Introduced a new QueryStatementProcessor class to handle query statement processing. Updated PatternActionProcessor to use QueryStatementProcessor for query statements and improved error handling for unknown pattern processor types. --- .../shirelang/compiler/hobbit/HobbitHole.kt | 2 +- .../compiler/hobbit/ast/PatternAction.kt | 3 ++- .../patternaction/PatternActionProcessor.kt | 27 ++++++++++++------- .../patternaction/PatternActionTransform.kt | 1 + .../patternaction/QueryStatementProcessor.kt | 17 ++++++++++++ 5 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/QueryStatementProcessor.kt diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/HobbitHole.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/HobbitHole.kt index 865649c41..4a5716476 100644 --- a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/HobbitHole.kt +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/HobbitHole.kt @@ -166,7 +166,7 @@ open class HobbitHole( // remove pattern sus PatternAction.from(value)?.let { val pattern = it.pattern.removeSurrounding("/") - variables[variable] = PatternActionTransform(variable, pattern, it.patternFuncs) + variables[variable] = PatternActionTransform(variable, pattern, it.patternFuncs, it.isQueryStatement) } } } diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/ast/PatternAction.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/ast/PatternAction.kt index 4bd2d3e54..f2203c083 100644 --- a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/ast/PatternAction.kt +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/hobbit/ast/PatternAction.kt @@ -13,6 +13,7 @@ import com.phodal.shirelang.compiler.patternaction.PatternActionFunc data class PatternAction( val pattern: String, val patternFuncs: List, + val isQueryStatement: Boolean = false ) { companion object { /** @@ -34,7 +35,7 @@ data class PatternAction( is FrontMatterType.QueryStatement -> { val action = value.value as? ShirePsiQueryStatement ?: return null - PatternAction("", action.toPatternActionFunc()) + PatternAction("", action.toPatternActionFunc(), true) } else -> { diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionProcessor.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionProcessor.kt index cf84e923c..d90faef62 100644 --- a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionProcessor.kt +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionProcessor.kt @@ -19,6 +19,14 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol * Each function output will be the input of the next function. */ fun execute(actionTransform: PatternActionTransform): String { + if (actionTransform.patternActionFuncs.isEmpty()) { + return "" + } + + if (actionTransform.isQueryStatement) { + return QueryStatementProcessor(myProject, editor, hole).execute(actionTransform) + } + var input: Any = "" // todo: update rules for input type if (actionTransform.pattern.isNotBlank()) { @@ -57,6 +65,7 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol (result as Array).filter { line -> action.patterns.any { line.contains(it) } } .joinToString("\n") } + else -> { (result as String).split("\n") .filter { line -> action.patterns.any { line.contains(it) } } @@ -75,6 +84,7 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol ) } } + else -> { (result as String).split("\n").joinToString("\n") { line -> line.replace( @@ -91,6 +101,7 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol is Array<*> -> { (result as Array).sorted().joinToString("\n") } + else -> { (result as String).split("\n").sorted().joinToString("\n") } @@ -102,6 +113,7 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol is Array<*> -> { (result as Array).distinct().joinToString("\n") } + else -> { (result as String).split("\n").distinct().joinToString("\n") } @@ -113,6 +125,7 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol is Array<*> -> { (result as Array).take(action.number.toInt()).joinToString("\n") } + else -> { (result as String).split("\n").take(action.number.toInt()).joinToString("\n") } @@ -124,6 +137,7 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol is Array<*> -> { (result as Array).takeLast(action.number.toInt()).joinToString("\n") } + else -> { (result as String).split("\n").takeLast(action.number.toInt()).joinToString("\n") } @@ -142,16 +156,9 @@ class PatternActionProcessor(val myProject: Project, val editor: Editor, val hol action.variables } - is PatternActionFunc.From -> { - logger().info("Unsupported function: ${action.funcName}") - } - - is PatternActionFunc.Where -> { - logger().info("Unsupported function: ${action.funcName}") - } - - is PatternActionFunc.Select -> { - logger().info("Unsupported function: ${action.funcName}") + else -> { + logger().error("Unknown pattern processor type: $action") + "" } } } diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionTransform.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionTransform.kt index 6c4f544b5..5c9895b4a 100644 --- a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionTransform.kt +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/PatternActionTransform.kt @@ -25,5 +25,6 @@ class PatternActionTransform( val variable: String, val pattern: String, val patternActionFuncs: List, + val isQueryStatement: Boolean = false ) { } \ No newline at end of file diff --git a/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/QueryStatementProcessor.kt b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/QueryStatementProcessor.kt new file mode 100644 index 000000000..b914bff88 --- /dev/null +++ b/shirelang/src/main/kotlin/com/phodal/shirelang/compiler/patternaction/QueryStatementProcessor.kt @@ -0,0 +1,17 @@ +package com.phodal.shirelang.compiler.patternaction + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.phodal.shirelang.compiler.hobbit.HobbitHole + +class QueryStatementProcessor(myProject: Project, editor: Editor, hole: HobbitHole) { + fun execute(transform: PatternActionTransform): String { + val fromStmt = transform.patternActionFuncs.find { it is PatternActionFunc.From } as PatternActionFunc.From + val selectStmt = + transform.patternActionFuncs.find { it is PatternActionFunc.Select } as PatternActionFunc.Select + val whereStmt = transform.patternActionFuncs.find { it is PatternActionFunc.Where } as PatternActionFunc.Where + + + return "Test" + } +}