Skip to content

Commit

Permalink
Allow specifying max lines used for AI code completion context
Browse files Browse the repository at this point in the history
fixed #14538

Signed-off-by: Jonas Helming <jhelming@eclipsesource.com>
  • Loading branch information
JonasHelming committed Nov 27, 2024
1 parent 48b6e06 commit bad7fdd
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

import { ILogger } from '@theia/core';
import { ContainerModule } from '@theia/core/shared/inversify';
import { CodeCompletionAgent, CodeCompletionAgentImpl } from '../common/code-completion-agent';
import { CodeCompletionAgent, CodeCompletionAgentImpl } from './code-completion-agent';
import { AIFrontendApplicationContribution } from './ai-code-frontend-application-contribution';
import { FrontendApplicationContribution, KeybindingContribution, PreferenceContribution } from '@theia/core/lib/browser';
import { Agent } from '@theia/ai-core';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { AI_CORE_PREFERENCES_TITLE } from '@theia/ai-core/lib/browser/ai-core-pr

export const PREF_AI_INLINE_COMPLETION_AUTOMATIC_ENABLE = 'ai-features.codeCompletion.automaticCodeCompletion';
export const PREF_AI_INLINE_COMPLETION_EXCLUDED_EXTENSIONS = 'ai-features.codeCompletion.excludedFileExtensions';
export const PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES = 'ai-features.codeCompletion.maxContextLines';

export const AICodeCompletionPreferencesSchema: PreferenceSchema = {
type: 'object',
Expand All @@ -39,6 +40,14 @@ export const AICodeCompletionPreferencesSchema: PreferenceSchema = {
type: 'string'
},
default: []
},
[PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES]: {
title: 'Maximum Context Lines',
type: 'number',
description: 'The maximum number of lines shared between the prefix and suffix for AI code completion.\
Set this to 0 to use the full file as context without any line limit.',
default: 0,
minimum: 0
}
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import * as monaco from '@theia/monaco-editor-core';

import { inject, injectable } from '@theia/core/shared/inversify';
import { CodeCompletionAgent } from '../common/code-completion-agent';
import { CodeCompletionAgent } from './code-completion-agent';
import { AgentService } from '@theia/ai-core';

@injectable()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import {
import { generateUuid, ILogger, ProgressService } from '@theia/core';
import { inject, injectable, named } from '@theia/core/shared/inversify';
import * as monaco from '@theia/monaco-editor-core';
import { PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES } from './ai-code-completion-preference';
import { PreferenceService } from '@theia/core/lib/browser';

export const CodeCompletionAgent = Symbol('CodeCompletionAgent');
export interface CodeCompletionAgent extends Agent {
Expand Down Expand Up @@ -52,20 +54,41 @@ export class CodeCompletionAgentImpl implements CodeCompletionAgent {
return undefined;
}

// Get text until the given position
const maxContextLines = this.preferences.get<number>(PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES, 0);

let prefixStartLine = 1;
let suffixEndLine = model.getLineCount();

if (maxContextLines > 0) {
const linesBeforeCursor = position.lineNumber - 1;
const linesAfterCursor = model.getLineCount() - position.lineNumber;

// Allocate one more line to the prefix in case of an odd maxContextLines
const prefixLines = Math.min(
Math.ceil(maxContextLines / 2),
linesBeforeCursor
);
const suffixLines = Math.min(
maxContextLines - prefixLines,
linesAfterCursor
);

prefixStartLine = Math.max(1, position.lineNumber - prefixLines);
suffixEndLine = Math.min(model.getLineCount(), position.lineNumber + suffixLines);
}

const prefix = model.getValueInRange({
startLineNumber: 1,
startLineNumber: prefixStartLine,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column,
});

// Get text after the given position
const suffix = model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: position.column,
endLineNumber: model.getLineCount(),
endColumn: model.getLineMaxColumn(model.getLineCount()),
endLineNumber: suffixEndLine,
endColumn: model.getLineMaxColumn(suffixEndLine),
});

const file = model.uri.toString(false);
Expand Down Expand Up @@ -137,6 +160,9 @@ export class CodeCompletionAgentImpl implements CodeCompletionAgent {
@inject(ProgressService)
protected progressService: ProgressService;

@inject(PreferenceService)
protected preferences: PreferenceService;

id = 'Code Completion';
name = 'Code Completion';
description =
Expand Down

0 comments on commit bad7fdd

Please # to comment.