From 8e6bbbf1e1d5db4e1325a476f0fc412d6e6f0e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Berkay=20=C3=96zerbay?= Date: Tue, 4 Mar 2025 17:33:06 +0000 Subject: [PATCH] [LME-328] Unify exptractPredictedAPICalls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed `extractPredictedApiCallsEnsureMethodProperty` and updated references to use `extractPredictedApiCalls` directly. Replaced TokenProperties with ExtractionOptions when invoking `extractApiCalls` Merge-request: IJ-MR-156572 Merged-by: Berkay Özerbay GitOrigin-RevId: 1bea737a57068936bc667f62a11ce26e32f5068a --- .../intellij/cce/core/ExtractionOptions.kt | 19 +++++++++ .../intellij/cce/metric/ApiCallExtractor.kt | 4 +- .../cce/java/chat/JavaApiCallExtractor.kt | 9 ++--- .../chat/JavaApiCallExtractorTest.kt | 39 ++++++++----------- .../cce/python/chat/PythonApiCallExtractor.kt | 6 +-- 5 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 plugins/evaluation-plugin/core/src/com/intellij/cce/core/ExtractionOptions.kt diff --git a/plugins/evaluation-plugin/core/src/com/intellij/cce/core/ExtractionOptions.kt b/plugins/evaluation-plugin/core/src/com/intellij/cce/core/ExtractionOptions.kt new file mode 100644 index 000000000000..4a8c7ed3a756 --- /dev/null +++ b/plugins/evaluation-plugin/core/src/com/intellij/cce/core/ExtractionOptions.kt @@ -0,0 +1,19 @@ +package com.intellij.cce.core + +import com.intellij.cce.evaluable.METHOD_NAME_PROPERTY + +/** + * ExtractionOptions decouples language-specific details from the API call extraction logic. + * For example: + * In static languages (e.g., Java/PHP), the method name narrows the search to a specific function. + * In dynamic languages (e.g., Python), the extraction may ignore the method name entirely. + */ +data class ExtractionOptions( + val methodName: String? = null +) + +fun TokenProperties.extractionOptions(): ExtractionOptions { + return ExtractionOptions( + methodName = this.additionalProperty(METHOD_NAME_PROPERTY) + ) +} diff --git a/plugins/evaluation-plugin/core/src/com/intellij/cce/metric/ApiCallExtractor.kt b/plugins/evaluation-plugin/core/src/com/intellij/cce/metric/ApiCallExtractor.kt index 198f26fba3c0..7344e929535e 100644 --- a/plugins/evaluation-plugin/core/src/com/intellij/cce/metric/ApiCallExtractor.kt +++ b/plugins/evaluation-plugin/core/src/com/intellij/cce/metric/ApiCallExtractor.kt @@ -1,12 +1,12 @@ package com.intellij.cce.metric +import com.intellij.cce.core.ExtractionOptions import com.intellij.cce.core.Language -import com.intellij.cce.core.TokenProperties import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.project.Project interface ApiCallExtractor { - suspend fun extractApiCalls(code: String, project: Project, tokenProperties: TokenProperties): List + suspend fun extractApiCalls(code: String, project: Project, extractionOptions: ExtractionOptions): List } interface ApiCallExtractorProvider { diff --git a/plugins/evaluation-plugin/languages/java/src/com/intellij/cce/java/chat/JavaApiCallExtractor.kt b/plugins/evaluation-plugin/languages/java/src/com/intellij/cce/java/chat/JavaApiCallExtractor.kt index 31c61887aa40..09cf35531853 100644 --- a/plugins/evaluation-plugin/languages/java/src/com/intellij/cce/java/chat/JavaApiCallExtractor.kt +++ b/plugins/evaluation-plugin/languages/java/src/com/intellij/cce/java/chat/JavaApiCallExtractor.kt @@ -1,14 +1,13 @@ package com.intellij.cce.java.chat +import com.intellij.cce.core.ExtractionOptions import com.intellij.cce.core.Language -import com.intellij.cce.core.TokenProperties -import com.intellij.cce.evaluable.METHOD_NAME_PROPERTY import com.intellij.cce.metric.ApiCallExtractor import com.intellij.cce.metric.ApiCallExtractorProvider import com.intellij.ide.actions.QualifiedNameProviderUtil +import com.intellij.openapi.application.edtWriteAction import com.intellij.openapi.application.readAction import com.intellij.openapi.application.smartReadActionBlocking -import com.intellij.openapi.application.edtWriteAction import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectFileIndex @@ -32,8 +31,8 @@ class InEditorGeneratedCodeIntegrator : GeneratedCodeIntegrator { } class JavaApiCallExtractor(private val generatedCodeIntegrator: GeneratedCodeIntegrator) : ApiCallExtractor { - override suspend fun extractApiCalls(code: String, project: Project, tokenProperties: TokenProperties): List { - val methodName = tokenProperties.additionalProperty(METHOD_NAME_PROPERTY)!! + override suspend fun extractApiCalls(code: String, project: Project, extractionOptions: ExtractionOptions): List { + val methodName = extractionOptions.methodName ?: return emptyList() val psiFileWithGeneratedCode = edtWriteAction { createPsiFile(code, project, "dummy1.java") } val method = extractMethodFromGeneratedSnippet(project, psiFileWithGeneratedCode, methodName) ?: return emptyList() diff --git a/plugins/evaluation-plugin/languages/java/test/com/intellij/cce/evaluable/chat/JavaApiCallExtractorTest.kt b/plugins/evaluation-plugin/languages/java/test/com/intellij/cce/evaluable/chat/JavaApiCallExtractorTest.kt index f375ef010cae..6e34b62e1fb2 100644 --- a/plugins/evaluation-plugin/languages/java/test/com/intellij/cce/evaluable/chat/JavaApiCallExtractorTest.kt +++ b/plugins/evaluation-plugin/languages/java/test/com/intellij/cce/evaluable/chat/JavaApiCallExtractorTest.kt @@ -3,6 +3,7 @@ package com.intellij.cce.evaluable.chat import com.intellij.cce.core.SymbolLocation import com.intellij.cce.core.TokenProperties import com.intellij.cce.core.TypeProperty +import com.intellij.cce.core.extractionOptions import com.intellij.cce.evaluable.METHOD_NAME_PROPERTY import com.intellij.cce.java.chat.InEditorGeneratedCodeIntegrator import com.intellij.cce.java.chat.JavaApiCallExtractor @@ -57,7 +58,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { runBlocking { val extractor = JavaApiCallExtractor { project, _ -> code } - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) assertEquals(listOf("MyClass#bar"), apiCalls) } } @@ -83,7 +84,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { runBlocking { val extractor = JavaApiCallExtractor { project, _ -> code } - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) assertEquals(listOf("MyClass#bar", "MyClass#baz"), apiCalls) } } @@ -102,7 +103,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { runBlocking { val extractor = JavaApiCallExtractor { project, _ -> code } - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) assertTrue(apiCalls.isEmpty()) } } @@ -121,7 +122,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { val code = """ public void bar() { - foo() + foo(); } """.trimIndent() @@ -130,11 +131,8 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { runBlocking { val extractor = JavaApiCallExtractor(InEditorGeneratedCodeIntegrator()) - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) - assertEquals( - listOf("MyClass#foo"), - apiCalls - ) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) + assertEquals(listOf("MyClass#foo"), apiCalls) } } @@ -146,7 +144,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { } public void bar(Integer t) { - bar() + bar(); } } @@ -156,7 +154,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { val code = """ public void bar() { - foo() + foo(); } """.trimIndent() @@ -165,11 +163,8 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { runBlocking { val extractor = JavaApiCallExtractor(InEditorGeneratedCodeIntegrator()) - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) - assertEquals( - listOf("MyClass#foo"), - apiCalls - ) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) + assertEquals(listOf("MyClass#foo"), apiCalls) } } @@ -177,7 +172,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { val code = """ public class MyClass { public void foo() { - something() + something(); } } """.trimIndent() @@ -187,7 +182,7 @@ class JavaApiCallExtractorTest : BasePlatformTestCase() { runBlocking { val extractor = JavaApiCallExtractor { project, _ -> code } - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) assertTrue(apiCalls.isEmpty()) } } @@ -239,9 +234,9 @@ public class MySubClass extends SuperClass { // Assuming Velocity is another class defined elsewhere class Velocity { private float length; - + // Constructor and other methods - + public float getLength() { return length; } @@ -260,11 +255,11 @@ class SuperClass { runBlocking { val extractor = JavaApiCallExtractor { project, _ -> code } - val apiCalls = extractor.extractApiCalls(code, project, tokenProperties) + val apiCalls = extractor.extractApiCalls(code, project, tokenProperties.extractionOptions()) assertEquals( listOf("MySubClass#isTargetingSuccessful", "Velocity#getLength", "MySubClass#onTargetingFailOrLowVelocity"), apiCalls ) } } -} \ No newline at end of file +} diff --git a/plugins/evaluation-plugin/languages/python/src/com/intellij/cce/python/chat/PythonApiCallExtractor.kt b/plugins/evaluation-plugin/languages/python/src/com/intellij/cce/python/chat/PythonApiCallExtractor.kt index ae4cfc646459..c5410420446b 100644 --- a/plugins/evaluation-plugin/languages/python/src/com/intellij/cce/python/chat/PythonApiCallExtractor.kt +++ b/plugins/evaluation-plugin/languages/python/src/com/intellij/cce/python/chat/PythonApiCallExtractor.kt @@ -1,11 +1,11 @@ package com.intellij.cce.python.chat +import com.intellij.cce.core.ExtractionOptions import com.intellij.cce.core.Language -import com.intellij.cce.core.TokenProperties import com.intellij.cce.metric.ApiCallExtractor import com.intellij.cce.metric.ApiCallExtractorProvider -import com.intellij.openapi.application.readAction import com.intellij.openapi.application.edtWriteAction +import com.intellij.openapi.application.readAction import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile import com.intellij.psi.PsiFileFactory @@ -14,7 +14,7 @@ import com.jetbrains.python.psi.PyRecursiveElementVisitor import com.intellij.lang.Language as PlatformLanguage class PythonApiCallExtractor : ApiCallExtractor { - override suspend fun extractApiCalls(code: String, project: Project, tokenProperties: TokenProperties): List { + override suspend fun extractApiCalls(code: String, project: Project, extractionOptions: ExtractionOptions): List { val psiFile = edtWriteAction { parsePsiFile(project, code) } return readAction { extractApiCalls(psiFile) } }