move strict tsconfig closer to the prompt files source code and add missing documentation comments

This commit is contained in:
Oleg Solomko
2025-05-06 10:45:57 -07:00
parent 7212555ae4
commit 2f392d619e
6 changed files with 34 additions and 41 deletions

View File

@@ -1445,10 +1445,7 @@ export default tseslint.config(
languageOptions: { languageOptions: {
parser: tseslint.parser, parser: tseslint.parser,
parserOptions: { parserOptions: {
project: [ project: 'src/vs/platform/prompts/tsconfig.strict.json',
// TODO: @lego - check if needed
'src/tsconfig.strict.json',
],
} }
}, },
plugins: { plugins: {

View File

@@ -5,8 +5,8 @@
import { ITextModel } from '../../model.js'; import { ITextModel } from '../../model.js';
import { VSBuffer } from '../../../../base/common/buffer.js'; import { VSBuffer } from '../../../../base/common/buffer.js';
import { assert, assertNever } from '../../../../base/common/assert.js';
import { CancellationToken } from '../../../../base/common/cancellation.js'; import { CancellationToken } from '../../../../base/common/cancellation.js';
import { assertNever } from '../../../../base/common/assert.js';
import { ObservableDisposable } from '../../../../base/common/observableDisposable.js'; import { ObservableDisposable } from '../../../../base/common/observableDisposable.js';
import { newWriteableStream, WriteableStream, ReadableStream } from '../../../../base/common/stream.js'; import { newWriteableStream, WriteableStream, ReadableStream } from '../../../../base/common/stream.js';
@@ -15,7 +15,7 @@ import { newWriteableStream, WriteableStream, ReadableStream } from '../../../..
*/ */
export class Stream<T extends object> extends ObservableDisposable implements ReadableStream<T> { export class Stream<T extends object> extends ObservableDisposable implements ReadableStream<T> {
/** /**
* TODO: @legomushroom * Flag that indicates whether the stream has ended.
*/ */
private ended: boolean = false; private ended: boolean = false;
@@ -40,24 +40,26 @@ export class Stream<T extends object> extends ObservableDisposable implements Re
if (cancellationToken?.isCancellationRequested) { if (cancellationToken?.isCancellationRequested) {
this.end(); this.end();
return; return;
} }
// send couple of tokens immediately // send a first batch of tokens immediately
this.send(false); this.send(true);
} }
/** /**
* TODO: @legomushroom * Starts process of sending tokens to the stream.
*
* @param stopAfterFirstSend whether to continue sending data to the stream or
* stop sending after the first batch of data is sent
*/ */
public send( public send(
play: boolean = true, stopAfterFirstSend: boolean = false,
): void { ): void {
// TODO: @legomushroom - throw instead? assert(
if (this.ended) { this.ended === false,
return; 'Cannot send on already ended stream.',
} );
this.sendTokens() this.sendTokens()
.then(() => { .then(() => {
@@ -73,17 +75,16 @@ export class Stream<T extends object> extends ObservableDisposable implements Re
return; return;
} }
if (play === false) { if (stopAfterFirstSend === true) {
this.stopStream(); this.stopStream();
return; return;
} }
this.interval = setImmediate(this.send.bind(this)); this.interval = setImmediate(this.send.bind(this));
}) })
.catch(() => { .catch((error) => {
this.stream.destroy(); this.stream.error(error);
this.stream.end(); this.dispose();
this.stopStream();
}); });
} }
@@ -119,18 +120,16 @@ export class Stream<T extends object> extends ObservableDisposable implements Re
await this.stream.write(token.value); await this.stream.write(token.value);
tokensCount--; tokensCount--;
} catch { } catch (error) {
this.stopStream(); this.stream.error(error);
this.stream.destroy(); this.dispose();
// TODO: @legomushroom - needed?
this.stream.end();
return; return;
} }
} }
} }
/** /**
* TODO: @legomushroom * Ends the stream and stops sending tokens.
*/ */
private end(): this { private end(): this {
this.ended = true; this.ended = true;
@@ -203,7 +202,7 @@ export class Stream<T extends object> extends ObservableDisposable implements Re
} }
/** /**
* TODO: @legomushroom * Create new instance of the stream from a provided array.
*/ */
public static fromArray<T extends object>( public static fromArray<T extends object>(
array: T[], array: T[],
@@ -213,7 +212,7 @@ export class Stream<T extends object> extends ObservableDisposable implements Re
} }
/** /**
* TODO: @legomushroom * Create new instance of the stream from a provided text model.
*/ */
public static fromTextModel( public static fromTextModel(
model: ITextModel, model: ITextModel,
@@ -224,7 +223,7 @@ export class Stream<T extends object> extends ObservableDisposable implements Re
} }
/** /**
* TODO: @legomushroom * Create a generator out of a provided array.
*/ */
export const arrayToGenerator = <T extends NonNullable<unknown>>(array: T[]): Generator<T, undefined> => { export const arrayToGenerator = <T extends NonNullable<unknown>>(array: T[]): Generator<T, undefined> => {
return (function* (): Generator<T, undefined> { return (function* (): Generator<T, undefined> {
@@ -235,7 +234,7 @@ export const arrayToGenerator = <T extends NonNullable<unknown>>(array: T[]): Ge
}; };
/** /**
* TODO: @legomushroom * Create a generator out of a provided text model.
*/ */
export const modelToGenerator = (model: ITextModel): Generator<VSBuffer, undefined> => { export const modelToGenerator = (model: ITextModel): Generator<VSBuffer, undefined> => {
return (function* (): Generator<VSBuffer, undefined> { return (function* (): Generator<VSBuffer, undefined> {

View File

@@ -7,13 +7,13 @@ import * as assert from 'assert';
import { URI } from '../../../../../base/common/uri.js'; import { URI } from '../../../../../base/common/uri.js';
import { createTextModel } from '../../testTextModel.js'; import { createTextModel } from '../../testTextModel.js';
import { randomTokens } from '../testUtils/randomTokens.js'; import { randomTokens } from '../testUtils/randomTokens.js';
import { randomInt } from '../../../../../base/common/numbers.js';
import { Stream } from '../../../../common/codecs/utils/stream.js'; import { Stream } from '../../../../common/codecs/utils/stream.js';
import { BaseToken } from '../../../../common/codecs/baseToken.js'; import { BaseToken } from '../../../../common/codecs/baseToken.js';
import { assertDefined } from '../../../../../base/common/types.js'; import { assertDefined } from '../../../../../base/common/types.js';
import { randomBoolean } from '../../../../../base/test/common/testUtils.js'; import { randomBoolean } from '../../../../../base/test/common/testUtils.js';
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
import { CancellationTokenSource } from '../../../../../base/common/cancellation.js'; import { CancellationTokenSource } from '../../../../../base/common/cancellation.js';
import { randomInt } from '../../../../../base/common/numbers.js'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
suite('Stream', () => { suite('Stream', () => {
const disposables = ensureNoDisposablesAreLeakedInTestSuite(); const disposables = ensureNoDisposablesAreLeakedInTestSuite();
@@ -122,7 +122,7 @@ suite('Stream', () => {
}); });
/** /**
* TODO: @legomushroom * Asserts that two tokens lists are equal.
*/ */
const assertTokensEqual = ( const assertTokensEqual = (
receivedTokens: BaseToken[], receivedTokens: BaseToken[],
@@ -144,7 +144,7 @@ const assertTokensEqual = (
}; };
/** /**
* TODO: @legomushroom * Consume a provided stream and return a list of received data objects.
*/ */
const consume = <T extends object>(stream: Stream<T>): Promise<T[]> => { const consume = <T extends object>(stream: Stream<T>): Promise<T[]> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {

View File

@@ -1,6 +1,7 @@
{ {
"extends": "./tsconfig.json", "extends": "../../../tsconfig.json",
"compilerOptions": { "compilerOptions": {
"strict": true,
"allowUnusedLabels": false, "allowUnusedLabels": false,
"allowUnreachableCode": false, "allowUnreachableCode": false,
"alwaysStrict": true, "alwaysStrict": true,
@@ -14,6 +15,5 @@
"noUncheckedIndexedAccess": true, "noUncheckedIndexedAccess": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,
"strict": true,
} }
} }

View File

@@ -39,8 +39,6 @@ export class TextModelContentsProvider extends PromptContentsProviderBase<IModel
private readonly model: ITextModel, private readonly model: ITextModel,
options: Partial<IPromptContentsProviderOptions>, options: Partial<IPromptContentsProviderOptions>,
@IInstantiationService private readonly initService: IInstantiationService, @IInstantiationService private readonly initService: IInstantiationService,
// TODO: @legomushroom - use the log service?
// @ILogService private readonly logService: ILogService,
) { ) {
super(options); super(options);
@@ -63,7 +61,6 @@ export class TextModelContentsProvider extends PromptContentsProviderBase<IModel
_event: IModelContentChangedEvent | 'full', _event: IModelContentChangedEvent | 'full',
cancellationToken?: CancellationToken, cancellationToken?: CancellationToken,
): Promise<ReadableStream<VSBuffer>> { ): Promise<ReadableStream<VSBuffer>> {
// TODO: @legomushroom - do we need `IModelContentChangedEvent` here?
return Stream.fromTextModel(this.model, cancellationToken); return Stream.fromTextModel(this.model, cancellationToken);
} }

View File

@@ -982,8 +982,8 @@ class FirstParseResult extends DeferredPromise<void> {
this._gotResult = true; this._gotResult = true;
super.complete(void 0) super.complete(void 0)
.catch(() => { .catch(() => {
// noop // the complete method is never fails
// TODO: @legomushroom // so we can ignore the error here
}); });
return; return;