[LME-311] Support multi file validation checks

Introduced functionality to compute validations for related files by comparing initial and result states. Enhanced `CodeGenerationInvoker` to parse related files and manage their validations, ensuring more accurate evaluation across multiple files. This improves validation coverage for auxiliary file changes during code generation.

Merge-request: IJ-MR-153911
Merged-by: Berkay Özerbay <berkay.ozerbay@jetbrains.com>

GitOrigin-RevId: 60f3d045da7e28eedbc429eb35d15082ef400ebf
This commit is contained in:
Berkay Özerbay
2025-02-07 08:24:30 +00:00
committed by intellij-monorepo-bot
parent ddcd3466f8
commit a6c3fa7948
5 changed files with 18 additions and 20 deletions
@@ -5,10 +5,8 @@ import com.intellij.cce.actions.simplified.SimplifiedDatasetSerializer.parseLine
import com.intellij.cce.core.SimpleTokenProperties
import com.intellij.cce.core.SymbolLocation
import com.intellij.cce.core.TypeProperty
import com.intellij.cce.evaluable.FILE_CHANGED_LINES_PREFIX
import com.intellij.cce.evaluable.FILE_PATTERN_PROPERTY_PREFIX
import com.intellij.cce.evaluable.FILE_UNCHANGED_LINES_PREFIX
import com.intellij.cce.evaluable.PROMPT_PROPERTY
import com.intellij.cce.evaluable.FILE_VALIDATIONS
import java.nio.file.Files
import java.nio.file.Paths
import java.util.*
@@ -61,18 +59,10 @@ class DatasetTransformer(private val offsetProvider: OffsetProvider) {
}
private fun generateActions(sessionId: UUID, interaction: SimplifiedDatasetSerializer.InteractionData): List<CallFeature> {
val fileValidation = interaction.fileValidations.firstOrNull()
val fileValidationsJson = SimplifiedDatasetSerializer.serializeFileValidations(interaction.fileValidations)
val nodeProperties = SimpleTokenProperties.create(TypeProperty.FILE, SymbolLocation.PROJECT) {
put(PROMPT_PROPERTY,interaction.userPrompt)
fileValidation?.patterns.orEmpty().forEachIndexed { i, pattern ->
put("${FILE_PATTERN_PROPERTY_PREFIX}_${i+1}", pattern)
}
fileValidation?.changedLines.orEmpty().forEachIndexed { i, pattern ->
put("${FILE_CHANGED_LINES_PREFIX}_${i+1}", pattern)
}
fileValidation?.unchangedLines.orEmpty().forEachIndexed { i, pattern ->
put("${FILE_UNCHANGED_LINES_PREFIX}_${i+1}", pattern)
}
put(PROMPT_PROPERTY, interaction.userPrompt)
put(FILE_VALIDATIONS, fileValidationsJson)
}
val position = interaction.position
val defaultLine = position.caretLine ?: parseLineRange(position.selectionLines)?.first ?: 0
@@ -1,10 +1,20 @@
package com.intellij.cce.actions.simplified
import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
object SimplifiedDatasetSerializer {
private val gson = GsonBuilder().create()
fun parseFileValidations(jsonData: String): List<FileValidation> {
val listType = object : TypeToken<List<FileValidation>>() {}.type
return gson.fromJson(jsonData, listType)
}
fun serializeFileValidations(fileValidations: List<FileValidation>): String {
return gson.toJson(fileValidations)
}
/**
* Parses a string representing a range of integers in the format "start-end" and returns it as an IntRange object.
*/
@@ -5,6 +5,7 @@ const val AIA_USER_PROMPT = "aia_user_prompt"
const val AIA_RESPONSE = "aia_response"
const val AIA_ORIGINAL_CONTENT = "aia_original_content"
const val AIA_FAILED_FILE_VALIDATIONS = "aia_failed_file_validations"
const val AIA_FAILED_RELATED_FILE_VALIDATIONS = "aia_failed_related_file_validations"
const val AIA_HAS_SYNTAX_ERRORS = "has_syntax_errors"
const val AIA_HAS_HIGHLIGHT_ERRORS = "has_highlight_errors"
const val AIA_PREDICTED_API_CALLS = "predicted_api_calls"
@@ -1,6 +1,7 @@
package com.intellij.cce.evaluable
const val PROMPT_PROPERTY = "prompt"
const val FILE_VALIDATIONS = "file_validations"
const val SNIPPET_PROMPT_PROPERTY = "snippet_prompt"
const val PROMPT_PRESENTATION_PROPERTY = "prompt_presentation"
const val INTERNAL_API_CALLS_PROPERTY = "internal_api_calls"
@@ -73,9 +73,7 @@ class DatasetTransformerTest {
"features": [],
"additional": {
"prompt": "add method to check email string",
"file_property_regex_1": "static.*boolean.*mail.*String",
"file_changed_lines_1": "5-6",
"file_unchanged_lines_1": "1-3"
"file_validations": "[{\"path\":\"src/main/java/com/jetbrains/eval/Utils.java\",\"patterns\":[\"static.*boolean.*mail.*String\"],\"changedLines\":[\"5-6\"],\"unchangedLines\":[\"1-3\"]}]"
}
},
"type": "CALL_FEATURE"
@@ -101,9 +99,7 @@ class DatasetTransformerTest {
"features": [],
"additional": {
"prompt": "add method to check email string",
"file_property_regex_1": "static.*boolean.*mail.*String",
"file_changed_lines_1": "5-6",
"file_unchanged_lines_1": "1-3"
"file_validations": "[{\"path\":\"src/main/java/com/jetbrains/eval/Utils.java\",\"patterns\":[\"static.*boolean.*mail.*String\"],\"changedLines\":[\"5-6\"],\"unchangedLines\":[\"1-3\"]}]"
}
},
"type": "CALL_FEATURE"