diff options
-rw-r--r-- | continuedev/src/continuedev/steps/core/core.py | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/continuedev/src/continuedev/steps/core/core.py b/continuedev/src/continuedev/steps/core/core.py index a8c43514..999cbcba 100644 --- a/continuedev/src/continuedev/steps/core/core.py +++ b/continuedev/src/continuedev/steps/core/core.py @@ -288,10 +288,12 @@ class DefaultModelEditCodeStep(Step): LINES_TO_MATCH_BEFORE_ENDING_BLOCK = 2 matched_lines_at_end_of_block = 0 # If a line has been matched at the end of the block, this is its index within original_lines_below_previous_blocks - index_of_last_matched_line = -1 + # Except we are keeping track of multiple potentialities, so it's a list + # We always check the lines following each of these leads, but if multiple make it out at the end, we use the first one + indices_of_last_matched_lines = [] async def handle_generated_line(line: str): - nonlocal current_block_start, current_line_in_file, original_lines, original_lines_below_previous_blocks, current_block_lines, matched_lines_at_end_of_block, index_of_last_matched_line, LINES_TO_MATCH_BEFORE_ENDING_BLOCK, offset_from_blocks + nonlocal current_block_start, current_line_in_file, original_lines, original_lines_below_previous_blocks, current_block_lines, matched_lines_at_end_of_block, indices_of_last_matched_lines, LINES_TO_MATCH_BEFORE_ENDING_BLOCK, offset_from_blocks # Highlight the line to show progress # - len(current_block_lines) @@ -318,12 +320,17 @@ class DefaultModelEditCodeStep(Step): # What you ideally do is find ALL matches, and then throw them out as you check the following lines if og_line == line: # and og_line.strip() != "": matched_lines_at_end_of_block = 1 - index_of_last_matched_line = i - break + indices_of_last_matched_lines.append(i) else: # In a block, and have already matched at least one line - # Check if the next line matches - if index_of_last_matched_line + 1 < len(original_lines_below_previous_blocks) and line == original_lines_below_previous_blocks[index_of_last_matched_line + 1]: + # Check if the next line matches, for each of the candidates + matches_found = [] + for index_of_last_matched_line in range(len(indices_of_last_matched_lines)): + if index_of_last_matched_line + 1 < len(original_lines_below_previous_blocks) and line == original_lines_below_previous_blocks[index_of_last_matched_line + 1]: + matches_found.append(index_of_last_matched_line + 1) + indices_of_last_matched_lines = matches_found + + if len(matches_found) > 0: matched_lines_at_end_of_block += 1 if matched_lines_at_end_of_block >= LINES_TO_MATCH_BEFORE_ENDING_BLOCK: # We've matched the required number of lines, insert suggestion! @@ -331,7 +338,7 @@ class DefaultModelEditCodeStep(Step): # We added some lines to the block that were matched (including maybe some blank lines) # So here we will strip all matching lines from the end of current_block_lines lines_stripped = [] - index_of_last_line_in_block = index_of_last_matched_line + 1 + index_of_last_line_in_block = indices_of_last_matched_lines[0] while len(current_block_lines) > 0 and current_block_lines[-1] == original_lines_below_previous_blocks[index_of_last_line_in_block]: lines_stripped.append(current_block_lines.pop()) index_of_last_line_in_block -= 1 @@ -354,16 +361,16 @@ class DefaultModelEditCodeStep(Step): current_block_lines = [] current_block_start = -1 matched_lines_at_end_of_block = 0 - index_of_last_matched_line = -1 + indices_of_last_matched_lines = [] return else: - index_of_last_matched_line += 1 + pass else: # We matched some lines, but didn't make it to N # So this block should continue on with the matched lines as a part of it matched_lines_at_end_of_block = 0 - index_of_last_matched_line = -1 + indices_of_last_matched_lines = [] current_block_lines.append(line) @@ -449,6 +456,8 @@ class DefaultModelEditCodeStep(Step): if current_block_lines[i] == original_lines_below_previous_blocks[-1]: num_to_remove += 1 original_lines_below_previous_blocks.pop() + else: + break current_block_lines = current_block_lines[:- num_to_remove] if num_to_remove > 0 else current_block_lines |