Skip to content

Commit

Permalink
refactor(comments): update for basic strategy #1
Browse files Browse the repository at this point in the history
phodal committed Dec 29, 2023

Verified

This commit was signed with the committer’s verified signature.
phodal Fengda Huang
1 parent 90a5c91 commit 434af29
Showing 17 changed files with 130 additions and 78 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package cc.unitmesh.core.completion

import chapi.domain.core.CodeContainer
import chapi.domain.core.CodeDataStruct
import chapi.domain.core.CodeFunction

/**
* TypedInsBuilder is an interface that allows for the construction of different types of completions based on the provided code.
*
* To use this interface, you need to implement it and override the build methods according to the desired completion type.
* The build methods return a list of TypedIns objects, which represent the generated completions.
*
* This interface provides three build methods:
*
* 1. build(container: CodeContainer): List<TypedIns>
* - This method builds a list of TypedIns objects based on the provided CodeContainer.
* - It is suitable for file-level analysis, such as generating completions for documentation.
* - The CodeContainer parameter contains the data structures and functions to be analyzed.
* - The method returns a list of TypedIns objects representing the extracted comments from the CodeContainer.
*
* 2. build(dataStruct: CodeDataStruct): List<TypedIns>
* - This method builds a list of TypedIns objects based on the given CodeDataStruct.
* - It is suitable for generating code related to the entire class.
* - The CodeDataStruct parameter represents the class to be analyzed.
* - The method returns a list of TypedIns objects generated based on the CodeDataStruct.
*
* 3. build(function: CodeFunction): List<CodeCompletionIns>
* - This method builds a list of code completion instructions based on a given function.
* - It is suitable for generating code completions for inline and interline completion.
* - The CodeFunction parameter represents the function to be analyzed.
* - The method returns a list of CodeCompletionIns objects representing the code completion instructions.
*
* Note: The default implementation of these build methods returns an empty list.
*
* Example usage:
*
* ```kotlin
* val builder = MyTypedInsBuilder()
* val container = CodeContainer(...)
* val completions = builder.build(container)
* ```
*/
interface TypedInsBuilder {
/**
* Builds a list of TypedIns objects based on the provided CodeContainer.
* This method is suitable for file-level analysis, such as:
*
* - [CompletionBuilderType.DOCUMENTATION]
*
* @param container The CodeContainer containing the data structures and functions to be analyzed.
* @return A list of TypedIns objects representing the comments extracted from the CodeContainer.
*/
fun build(container: CodeContainer): List<TypedIns> {
return listOf()
}

/**
* Builds a list of TypedIns objects based on the given CodeDataStruct.
* This method is suitable for generating code related to the entire class, such as:
*
* - [CompletionBuilderType.TEST_CODE_GEN]
*
* @param dataStruct The CodeDataStruct object representing the class to be analyzed.
* @return A list of TypedIns objects generated based on the CodeDataStruct.
*/
fun build(dataStruct: CodeDataStruct): List<TypedIns> {
return listOf()
}

/**
* Builds a list of code completion instructions based on a given function.
*
* @param function The CodeFunction object representing the function to be analyzed.
* @return A list of CodeCompletionIns objects representing the code completion instructions.
*
* This method is suitable for generating code completions for inline and interline completion, such as :
*
* - [CompletionBuilderType.INLINE_COMPLETION]
* - [CompletionBuilderType.IN_BLOCK_COMPLETION]
* - [CompletionBuilderType.AFTER_BLOCK_COMPLETION]
*/
fun build(function: CodeFunction): List<CodeCompletionIns> {
return listOf()
}
}


This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package cc.unitmesh.pick.strategy.bizcode
package cc.unitmesh.pick.builder

import cc.unitmesh.core.SupportedLang
import cc.unitmesh.core.completion.CodeCompletionIns
import cc.unitmesh.core.completion.TypedIns
import cc.unitmesh.core.completion.TypedInsBuilder
import cc.unitmesh.pick.builder.comment.KotlinCommentBuilder
import cc.unitmesh.pick.strategy.base.CodeStrategyBuilder
import cc.unitmesh.pick.worker.job.JobContext
import chapi.domain.core.CodeContainer
import chapi.domain.core.CodeFunction

/**
* 对于其它不需要上下文的 AI 能力,需要实现一个空的上下文策略,如注释生成。
*/
class CommentsStrategyBuilder(val context: JobContext) : CodeStrategyBuilder {
class DocumentationTypedInsBuilder(val context: JobContext) : TypedInsBuilder {
private val kotlinCommentBuilder = KotlinCommentBuilder()

override fun build(): List<TypedIns> {
val container = context.job.container ?: return emptyList()

override fun build(container: CodeContainer): List<TypedIns> {
val language = context.project.language
return when (language) {
SupportedLang.JAVA -> kotlinCommentBuilder.build(context.job.code, container)
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
package cc.unitmesh.pick.builder

import cc.unitmesh.core.completion.CompletionBuilder
import cc.unitmesh.core.completion.TypedInsBuilder
import cc.unitmesh.core.completion.CompletionBuilderType
import cc.unitmesh.core.unittest.TestCodeBuilder
import cc.unitmesh.core.unittest.TestCodeBuilderType
import cc.unitmesh.pick.builder.bizcode.AfterBlockCodeCompletionBuilder
import cc.unitmesh.pick.builder.bizcode.InBlockCodeCompletionBuilder
import cc.unitmesh.pick.builder.bizcode.InlineCodeCompletionBuilder
import cc.unitmesh.pick.builder.bizcode.AfterBlockCodeTypedInsBuilder
import cc.unitmesh.pick.builder.bizcode.InBlockCodeTypedInsBuilder
import cc.unitmesh.pick.builder.bizcode.InlineCodeTypedInsBuilder
import cc.unitmesh.pick.builder.unittest.java.ClassTestCodeBuilder
import cc.unitmesh.pick.builder.unittest.java.JavaMethodTestCodeBuilder
import cc.unitmesh.pick.worker.job.JobContext
import kotlinx.serialization.SerializationException

fun completionBuilders(types: List<CompletionBuilderType>, context: JobContext) : List<CompletionBuilder> {
fun completionBuilders(types: List<CompletionBuilderType>, context: JobContext) : List<TypedInsBuilder> {
return types.map { completionBuilder(it, context) }
}

fun completionBuilder(completionBuilderType: CompletionBuilderType, context: JobContext): CompletionBuilder {
fun completionBuilder(completionBuilderType: CompletionBuilderType, context: JobContext): TypedInsBuilder {
return mapOf(
CompletionBuilderType.INLINE_COMPLETION to InlineCodeCompletionBuilder(context),
CompletionBuilderType.IN_BLOCK_COMPLETION to InBlockCodeCompletionBuilder(context),
CompletionBuilderType.AFTER_BLOCK_COMPLETION to AfterBlockCodeCompletionBuilder(context),
CompletionBuilderType.TEST_CODE_GEN to TestCodeCompletionBuilder(context),
CompletionBuilderType.DOCUMENTATION to DocumentationCompletionBuilder(context),
CompletionBuilderType.INLINE_COMPLETION to InlineCodeTypedInsBuilder(context),
CompletionBuilderType.IN_BLOCK_COMPLETION to InBlockCodeTypedInsBuilder(context),
CompletionBuilderType.AFTER_BLOCK_COMPLETION to AfterBlockCodeTypedInsBuilder(context),
CompletionBuilderType.TEST_CODE_GEN to TestCodeTypedInsBuilder(context),
CompletionBuilderType.DOCUMENTATION to DocumentationTypedInsBuilder(context),
)[completionBuilderType] ?: throw SerializationException("Unknown message type: $completionBuilderType")
}

Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package cc.unitmesh.pick.builder

import cc.unitmesh.core.completion.CodeCompletionIns
import cc.unitmesh.core.completion.CompletionBuilder
import cc.unitmesh.core.completion.TypedInsBuilder
import cc.unitmesh.core.completion.TypedIns
import cc.unitmesh.pick.builder.unittest.base.UnitTestService
import cc.unitmesh.pick.worker.job.JobContext
import chapi.domain.core.CodeDataStruct
import chapi.domain.core.CodeFunction

class TestCodeCompletionBuilder(val context: JobContext) : CompletionBuilder {
class TestCodeTypedInsBuilder(val context: JobContext) : TypedInsBuilder {
override fun build(dataStruct: CodeDataStruct): List<TypedIns> {
val testIns = UnitTestService.lookup(dataStruct, context).map {
it.build(dataStruct)
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package cc.unitmesh.pick.builder.bizcode

import cc.unitmesh.core.completion.CodeCompletionIns
import cc.unitmesh.core.completion.CompletionBuilder
import cc.unitmesh.core.completion.TypedInsBuilder
import cc.unitmesh.core.completion.CompletionBuilderType
import cc.unitmesh.pick.worker.job.JobContext
import chapi.domain.core.CodeFunction


class AfterBlockCodeCompletionBuilder(val context: JobContext) : CompletionBuilder {
class AfterBlockCodeTypedInsBuilder(val context: JobContext) : TypedInsBuilder {
override fun build(function: CodeFunction): List<CodeCompletionIns> {
val position = function.Position
val codeLines = context.job.codeLines
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package cc.unitmesh.pick.builder.bizcode

import cc.unitmesh.core.completion.CodeCompletionIns
import cc.unitmesh.core.completion.CompletionBuilder
import cc.unitmesh.core.completion.TypedInsBuilder
import cc.unitmesh.core.completion.CompletionBuilderType
import cc.unitmesh.pick.worker.job.JobContext
import chapi.domain.core.CodeFunction

class InBlockCodeCompletionBuilder(val context: JobContext) : CompletionBuilder {
class InBlockCodeTypedInsBuilder(val context: JobContext) : TypedInsBuilder {
override fun build(function: CodeFunction): List<CodeCompletionIns> {
val position = function.Position
val beforeCursor = context.job.codeLines.subList(0, position.StartLine).joinToString("\n")
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package cc.unitmesh.pick.builder.bizcode

import cc.unitmesh.core.completion.CodeCompletionIns
import cc.unitmesh.core.completion.CompletionBuilder
import cc.unitmesh.core.completion.TypedInsBuilder
import cc.unitmesh.core.completion.CompletionBuilderType
import cc.unitmesh.pick.worker.job.JobContext
import chapi.domain.core.CodeFunction

class InlineCodeCompletionBuilder(val context: JobContext) : CompletionBuilder {
class InlineCodeTypedInsBuilder(val context: JobContext) : TypedInsBuilder {
private fun isValidTypeOver(char: Char): Boolean {
return char == ')' || char == ']' || char == '}' || char == '"' || char == '\'' || char == '>' || char == ';' || char == ','
}
Original file line number Diff line number Diff line change
@@ -60,9 +60,8 @@ data class InsPickerOption(
*
*/
val buildPlan: List<BuildPlanType> = listOf(
// BuildPlanType.RELATED_CODE,
// BuildPlanType.SIMILAR_CHUNKS,
BuildPlanType.COMMENT,
BuildPlanType.RELATED_CODE,
BuildPlanType.SIMILAR_CHUNKS,
),
/**
* The [CompletionBuilderType], which will according you IDE strategy to generate the type.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package cc.unitmesh.pick.strategy

import cc.unitmesh.pick.strategy.base.CodeStrategyBuilder
import cc.unitmesh.pick.strategy.bizcode.CommentsStrategyBuilder
import cc.unitmesh.pick.strategy.bizcode.RelatedCodeStrategyBuilder
import cc.unitmesh.pick.strategy.bizcode.SimilarChunksStrategyBuilder
import cc.unitmesh.pick.worker.job.JobContext
@@ -29,19 +28,13 @@ enum class BuildPlanType {
/**
* the AutoDev with pre-build context
*/
RELATED_CODE,

/**
* the AutoDev with pre-build context
*/
COMMENT
RELATED_CODE
;

fun builder(context: JobContext): CodeStrategyBuilder {
return mapOf(
SIMILAR_CHUNKS to SimilarChunksStrategyBuilder(context),
RELATED_CODE to RelatedCodeStrategyBuilder(context),
COMMENT to CommentsStrategyBuilder(context),
)[this] ?: throw SerializationException("Unknown message type: $this")
}
}
Original file line number Diff line number Diff line change
@@ -47,11 +47,15 @@ class RelatedCodeStrategyBuilder(private val context: JobContext) : CodeStrategy

// 3. build completion instruction
val builders = completionBuilders(context.completionBuilderTypes, context)
builders.asSequence().forEach {
it.build(container)
}

val codeCompletionIns = dataStructs.map { ds ->
val blockIns = builders.asSequence().map {
it.build(ds)
}.flatten()

val functionsIns = ds.Functions.map { function ->
builders.asSequence().map {
it.build(function)
Original file line number Diff line number Diff line change
@@ -47,6 +47,9 @@ class SimilarChunksStrategyBuilder(private val context: JobContext) : CodeStrate
}

val builders = completionBuilders(context.completionBuilderTypes, context)
builders.asSequence().forEach {
it.build(container)
}

// 2. collect all with similar data structure
val codeCompletionIns = dataStructs.map { ds ->
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ class SingleProjectCodePickerTest {
language = "kotlin",
url = root,
maxTokenLength = 8192,
buildPlan = listOf(BuildPlanType.COMMENT, BuildPlanType.RELATED_CODE),
buildPlan = listOf(BuildPlanType.RELATED_CODE),
completionTypes = listOf(
CompletionBuilderType.DOCUMENTATION, CompletionBuilderType.TEST_CODE_GEN
),
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ import io.kotest.matchers.shouldBe
import org.archguard.scanner.analyser.count.FileJob
import org.junit.jupiter.api.Test

class AfterBlockCodeCompletionBuilderTest {
class AfterBlockCodeTypedInsBuilderTest {

@Test
fun should_success_split_after_block_code() {
@@ -39,7 +39,7 @@ class AfterBlockCodeCompletionBuilderTest {
3,
insQualityThreshold = InsQualityThreshold()
)
val builder = AfterBlockCodeCompletionBuilder(jobContext)
val builder = AfterBlockCodeTypedInsBuilder(jobContext)

val result = builder.build(codeFunction)

Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ import io.kotest.matchers.shouldBe
import org.archguard.scanner.analyser.count.FileJob
import org.junit.jupiter.api.Test

class InBlockCodeCompletionBuilderTest {
class InBlockCodeTypedInsBuilderTest {

@Test
fun should_return_single_CodeCompletionIns() {
@@ -39,7 +39,7 @@ class InBlockCodeCompletionBuilderTest {
3,
insQualityThreshold = InsQualityThreshold()
)
val builder = InBlockCodeCompletionBuilder(jobContext)
val builder = InBlockCodeTypedInsBuilder(jobContext)

// when
val result = builder.build(codeFunction)
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ import io.kotest.matchers.shouldBe
import org.archguard.scanner.analyser.count.FileJob
import org.junit.jupiter.api.Test

class InlineCodeCompletionBuilderTest {
class InlineCodeTypedInsBuilderTest {
@Test
fun should_return_list_of_code_completion_ins() {
// Given
@@ -39,7 +39,7 @@ class InlineCodeCompletionBuilderTest {
3,
insQualityThreshold = InsQualityThreshold()
)
val builder = InlineCodeCompletionBuilder(jobContext)
val builder = InlineCodeTypedInsBuilder(jobContext)

// When
val result = builder.build(codeFunction)

0 comments on commit 434af29

Please sign in to comment.