Skip to content

Commit

Permalink
make vscode-lib controller API match client API (#196)
Browse files Browse the repository at this point in the history
  • Loading branch information
sqs authored Aug 17, 2024
1 parent bf893ee commit 9fdde53
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 71 deletions.
2 changes: 1 addition & 1 deletion client/vscode-lib/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@openctx/vscode-lib",
"version": "0.0.19",
"version": "0.0.20",
"description": "OpenCtx library for VS Code extensions",
"license": "Apache-2.0",
"repository": {
Expand Down
8 changes: 4 additions & 4 deletions client/vscode-lib/src/controller.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import type { Controller } from './controller.js'

export function createMockController(): MockedObject<Controller> {
return {
observeMeta: vi.fn(),
metaChanges: vi.fn(),
meta: vi.fn(),
observeMentions: vi.fn(),
mentionsChanges: vi.fn(),
mentions: vi.fn(),
observeItems: vi.fn(),
itemsChanges: vi.fn(),
items: vi.fn(),
observeAnnotations: vi.fn(),
annotationsChanges: vi.fn(),
annotations: vi.fn(),
}
}
Expand Down
68 changes: 25 additions & 43 deletions client/vscode-lib/src/controller.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
type AnnotationsParams,
type AuthInfo,
type Client,
type ClientConfiguration,
Expand Down Expand Up @@ -34,24 +35,18 @@ import { observeWorkspaceConfigurationChanges, toEventEmitter } from './util/obs

type VSCodeClient = Client<vscode.Range>

export interface Controller {
observeMeta: VSCodeClient['metaChanges']
meta: VSCodeClient['meta']

observeMentions: VSCodeClient['mentionsChanges']
mentions: VSCodeClient['mentions']

observeItems: VSCodeClient['itemsChanges']
items: VSCodeClient['items']

observeAnnotations(
doc: Pick<vscode.TextDocument, 'uri' | 'getText'>,
): ReturnType<VSCodeClient['annotationsChanges']>
annotations(
doc: Pick<vscode.TextDocument, 'uri' | 'getText'>,
opts?: ProviderMethodOptions,
): ReturnType<VSCodeClient['annotations']>
}
export interface Controller
extends Pick<
VSCodeClient,
| 'metaChanges'
| 'meta'
| 'mentionsChanges'
| 'mentions'
| 'itemsChanges'
| 'items'
| 'annotationsChanges'
| 'annotations'
> {}

export function createController({
secrets: secretsInput,
Expand Down Expand Up @@ -165,38 +160,25 @@ export function createController({
*/
const controller: Controller = {
meta: errorReporter.wrapPromise(UserAction.Explicit, client.meta),
observeMeta: errorReporter.wrapObservable(UserAction.Explicit, client.metaChanges),
metaChanges: errorReporter.wrapObservable(UserAction.Explicit, client.metaChanges),

mentions: errorReporter.wrapPromise(UserAction.Explicit, client.mentions),
observeMentions: errorReporter.wrapObservable(UserAction.Explicit, client.mentionsChanges),
mentionsChanges: errorReporter.wrapObservable(UserAction.Explicit, client.mentionsChanges),

items: errorReporter.wrapPromise(UserAction.Explicit, client.items),
observeItems: errorReporter.wrapObservable(UserAction.Explicit, client.itemsChanges),
itemsChanges: errorReporter.wrapObservable(UserAction.Explicit, client.itemsChanges),

async annotations(doc: vscode.TextDocument, opts?: ProviderMethodOptions) {
if (ignoreDoc(doc)) {
annotations: async (params: AnnotationsParams, opts?: ProviderMethodOptions) => {
if (ignoreDoc(params)) {
return []
}
return await clientAnnotations(
{
uri: doc.uri.toString(),
content: doc.getText(),
},
opts,
)
return await clientAnnotations(params, opts)
},
observeAnnotations(doc: vscode.TextDocument, opts?: ProviderMethodOptions) {
if (ignoreDoc(doc)) {
annotationsChanges(params: AnnotationsParams, opts?: ProviderMethodOptions) {
if (ignoreDoc(params)) {
return of([])
}

return clientAnnotationsChanges(
{
uri: doc.uri.toString(),
content: doc.getText(),
},
opts,
)
return clientAnnotationsChanges(params, opts)
},
}

Expand Down Expand Up @@ -224,11 +206,11 @@ export function createController({
}
}

function ignoreDoc(doc: vscode.TextDocument): boolean {
function ignoreDoc(params: AnnotationsParams): boolean {
// Ignore:
// - documents that are not in the editor (`output` is the VS Code output channel).
// - very long documents
return doc.uri.scheme === 'output' || doc.lineCount > 5000
// - very large documents
return params.uri.startsWith('output:') || params.content.length > 1024 * 1024
}

function makeRange(range: Range): vscode.Range {
Expand Down
24 changes: 11 additions & 13 deletions client/vscode-lib/src/ui/editor/codeLens.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Annotation, EachWithProviderUri, Item } from '@openctx/client'
import type { Annotation, AnnotationsParams, EachWithProviderUri, Item } from '@openctx/client'
import { TestScheduler } from 'rxjs/testing'
import { type MockedObject, describe, expect, test, vi } from 'vitest'
import type * as vscode from 'vscode'
Expand Down Expand Up @@ -66,14 +66,12 @@ describe('createCodeLensProvider', () => {
const { controller, provider } = createTestProvider()
const doc = mockTextDocument()
testScheduler().run(({ cold, expectObservable }): void => {
controller.observeAnnotations.mockImplementation(
(doc: Pick<vscode.TextDocument, 'uri' | 'getText'>) => {
expect(doc).toBe(doc)
return cold<EachWithProviderUri<Annotation<vscode.Range>[]>>('a', {
a: [fixtureAnn('a')],
})
},
)
controller.annotationsChanges.mockImplementation((params: AnnotationsParams) => {
expect(params).toBe(params)
return cold<EachWithProviderUri<Annotation<vscode.Range>[]>>('a', {
a: [fixtureAnn('a')],
})
})
expectObservable(provider.observeCodeLenses(doc)).toBe('a', {
a: [
{
Expand All @@ -99,8 +97,8 @@ describe('createCodeLensProvider', () => {
const { controller, provider } = createTestProvider()
const doc = mockTextDocument()
testScheduler().run(({ cold, expectObservable }): void => {
controller.observeAnnotations.mockImplementation(doc => {
expect(doc).toBe(doc)
controller.annotationsChanges.mockImplementation(params => {
expect(params).toBe(params)
return cold<EachWithProviderUri<Annotation<vscode.Range>[]>>('ab', {
a: [fixtureAnn('a')],
b: [fixtureAnn('b')],
Expand Down Expand Up @@ -138,7 +136,7 @@ describe('createCodeLensProvider', () => {
const { controller, provider } = createTestProvider()
const doc = mockTextDocument()
testScheduler().run(({ cold, expectObservable }): void => {
controller.observeAnnotations.mockImplementation(doc =>
controller.annotationsChanges.mockImplementation(params =>
cold<EachWithProviderUri<Annotation<vscode.Range>[]>>('a', {
a: [
{
Expand Down Expand Up @@ -169,7 +167,7 @@ describe('createCodeLensProvider', () => {
const { controller, provider } = createTestProvider()
const doc = mockTextDocument()
testScheduler().run(({ cold, expectObservable }): void => {
controller.observeAnnotations.mockImplementation(doc =>
controller.annotationsChanges.mockImplementation(params =>
cold<EachWithProviderUri<Annotation<vscode.Range>[]>>('a', {
a: [
{
Expand Down
16 changes: 9 additions & 7 deletions client/vscode-lib/src/ui/editor/codeLens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,16 @@ export function createCodeLensProvider(controller: Controller): vscode.CodeLensP
return entry.observable
}

const observable = controller.observeAnnotations(doc).pipe(
map(anns =>
prepareAnnotationsForPresentation<vscode.Range>(anns ?? []).map(item =>
annotationCodeLens(doc, item, showHover),
const observable = controller
.annotationsChanges({ uri: doc.uri.toString(), content: doc.getText() })
.pipe(
map(anns =>
prepareAnnotationsForPresentation<vscode.Range>(anns ?? []).map(item =>
annotationCodeLens(doc, item, showHover),
),
),
),
shareReplay({ bufferSize: 1, refCount: true }),
)
shareReplay({ bufferSize: 1, refCount: true }),
)
const subscription = observable.subscribe({
next: () => changeCodeLenses.fire(),
error: () => changeCodeLenses.fire(),
Expand Down
2 changes: 1 addition & 1 deletion client/vscode-lib/src/ui/editor/hover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export function createHoverProvider(controller: Controller): vscode.HoverProvide
return {
async provideHover(doc, pos): Promise<vscode.Hover | null> {
return firstValueFrom(
controller.observeAnnotations(doc).pipe(
controller.annotationsChanges({ uri: doc.uri.toString(), content: doc.getText() }).pipe(
map(anns => {
const containedByAnns = anns?.filter(ann =>
(ann.range ?? ZERO_RANGE).contains(pos),
Expand Down
8 changes: 6 additions & 2 deletions client/vscode-lib/src/ui/fileItemsList.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Annotation } from '@openctx/client'
import type { Annotation, AnnotationsParams } from '@openctx/client'
import * as vscode from 'vscode'
import type { Controller } from '../controller.js'

Expand Down Expand Up @@ -37,7 +37,11 @@ async function showQuickPick(controller: Controller): Promise<void> {
quickPick.matchOnDetail = true
quickPick.show()

const subscription = controller.observeAnnotations(editor.document).subscribe(
const params: AnnotationsParams = {
uri: editor.document.uri.toString(),
content: editor.document.getText(),
}
const subscription = controller.annotationsChanges(params).subscribe(
anns => {
quickPick.items =
anns && anns.length > 0
Expand Down

0 comments on commit 9fdde53

Please sign in to comment.