Skip to content

Commit

Permalink
Refactor: Use common types in requests and notifications for embedded…
Browse files Browse the repository at this point in the history
… languages support
  • Loading branch information
idillon-sfl committed Nov 2, 2023
1 parent e61f183 commit b2cf131
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 24 deletions.
22 changes: 17 additions & 5 deletions client/src/language/languageClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,25 @@ import {
TransportKind,
type ServerOptions
} from 'vscode-languageclient/node'

const getEmbeddedLanguageDocInfos = async (client: LanguageClient, uriString: string, position: Position): Promise<{ uri: string, lineOffset: number }> => {
return await client.sendRequest('custom/getEmbeddedLanguageDocInfos', { uriString, position })
import { RequestMethod, type RequestParams, type RequestResult } from '../lib/src/types/requests'
import { NotificationMethod, type NotificationParams } from '../lib/src/types/notifications'

const getEmbeddedLanguageDocInfos = async (
client: LanguageClient,
uriString: string,
position: Position
): RequestResult['EmbeddedLanguageDocInfos'] => {
const params: RequestParams['EmbeddedLanguageDocInfos'] = { uriString, position }
return await client.sendRequest(RequestMethod.EmbeddedLanguageDocInfos, params)
}

const notifyFileRenameChanged = async (client: LanguageClient, oldUriString: string, newUriString: string): Promise<void> => {
await client.sendNotification('custom/fileNameChanged', { oldUriString, newUriString })
const notifyFileRenameChanged = async (
client: LanguageClient,
oldUriString: string,
newUriString: string
): Promise<void> => {
const params: NotificationParams['FilenameChanged'] = { oldUriString, newUriString }
await client.sendNotification(NotificationMethod.FilenameChanged, params)
}

export async function activateLanguageServer (context: ExtensionContext): Promise<LanguageClient> {
Expand Down
12 changes: 12 additions & 0 deletions client/src/lib/src/types/embedded-languages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) 2023 Savoir-faire Linux. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */

export type EmbeddedLanguageType = 'bash' | 'python'

export interface EmbeddedLanguageDocInfos {
uri: string
language: EmbeddedLanguageType
lineOffset: number
}
21 changes: 21 additions & 0 deletions client/src/lib/src/types/notifications.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) 2023 Savoir-faire Linux. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */

enum NotificationType {
FilenameChanged = 'FilenameChanged'
}

export const NotificationMethod: Record<NotificationType, string> = {
[NotificationType.FilenameChanged]: 'custom/fileNameChanged'
}

export interface NotificationParams {
[NotificationType.FilenameChanged]: NotifyFileNameChangeParams
}

interface NotifyFileNameChangeParams {
oldUriString: string
newUriString: string
}
28 changes: 28 additions & 0 deletions client/src/lib/src/types/requests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) 2023 Savoir-faire Linux. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */

import { type Position } from 'vscode'
import { type EmbeddedLanguageDocInfos } from './embedded-languages'

enum RequestType {
EmbeddedLanguageDocInfos = 'EmbeddedLanguageDocInfos'
}

export const RequestMethod: Record<RequestType, string> = {
[RequestType.EmbeddedLanguageDocInfos]: 'custom/requestEmbeddedLanguageDocInfos'
}

export interface RequestParams {
[RequestType.EmbeddedLanguageDocInfos]: RequestEmbeddedLanguageDocInfosParams
}

export interface RequestResult {
[RequestType.EmbeddedLanguageDocInfos]: Promise<EmbeddedLanguageDocInfos | undefined>
}

interface RequestEmbeddedLanguageDocInfosParams {
uriString: string
position: Position
}
2 changes: 1 addition & 1 deletion server/src/embedded-languages/bash-support.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { type TextDocument } from 'vscode-languageserver-textdocument'
import { replaceTextForSpaces } from './utils'

import { analyzer } from '../tree-sitter/analyzer'
import { type EmbeddedLanguageDocInfos } from './utils'
import { type EmbeddedLanguageDocInfos } from '../lib/src/types/embedded-languages'
import { embeddedLanguageDocsManager } from './documents-manager'

export const generateBashEmbeddedLanguageDoc = async (textDocument: TextDocument): Promise<void> => {
Expand Down
2 changes: 1 addition & 1 deletion server/src/embedded-languages/documents-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import fs from 'fs'

import logger from 'winston'

import { type EmbeddedLanguageDocInfos, type EmbeddedLanguageType } from './utils'
import { type EmbeddedLanguageDocInfos, type EmbeddedLanguageType } from '../lib/src/types/embedded-languages'

const EMBEDDED_DOCUMENTS_FOLDER = 'embedded-documents'

Expand Down
3 changes: 2 additions & 1 deletion server/src/embedded-languages/general-support.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { generateBashEmbeddedLanguageDoc } from './bash-support'
import { generatePythonEmbeddedLanguageDoc } from './python-support'
import { embeddedLanguageDocsManager } from './documents-manager'
import { isInsideBashRegion, isInsidePythonRegion } from './utils'
import { type EmbeddedLanguageDocInfos } from '../lib/src/types/embedded-languages'

export const generateEmbeddedLanguageDocs = async (textDocument: TextDocument): Promise<void> => {
await Promise.all([
Expand All @@ -18,7 +19,7 @@ export const generateEmbeddedLanguageDocs = async (textDocument: TextDocument):
])
}

export const getEmbeddedLanguageDocInfosOnPosition = (uriString: string, position: Position): { uri: string, lineOffset: number } | undefined => {
export const getEmbeddedLanguageDocInfosOnPosition = (uriString: string, position: Position): EmbeddedLanguageDocInfos | undefined => {
if (isInsideBashRegion(uriString, position)) {
const documentInfos = embeddedLanguageDocsManager.getEmbeddedLanguageDocInfos(uriString, 'bash')
return documentInfos
Expand Down
2 changes: 1 addition & 1 deletion server/src/embedded-languages/python-support.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { replaceTextForSpaces } from './utils'

import { analyzer } from '../tree-sitter/analyzer'
import { embeddedLanguageDocsManager } from './documents-manager'
import { type EmbeddedLanguageDocInfos } from './utils'
import { type EmbeddedLanguageDocInfos } from '../lib/src/types/embedded-languages'

export const generatePythonEmbeddedLanguageDoc = async (textDocument: TextDocument): Promise<void> => {
const pythonRegions = analyzer.getPythonRegions(textDocument.uri)
Expand Down
8 changes: 0 additions & 8 deletions server/src/embedded-languages/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,6 @@ import type * as LSP from 'vscode-languageserver/node'
import { analyzer } from '../tree-sitter/analyzer'
import { positionIsWithinRange } from '../utils/range'

export type EmbeddedLanguageType = 'bash' | 'python'

export interface EmbeddedLanguageDocInfos {
uri: string
language: EmbeddedLanguageType
lineOffset: number
}

const isInsideRegion = (position: Position, region: LSP.SymbolInformation): boolean => {
return positionIsWithinRange(position, region.location.range)
}
Expand Down
21 changes: 14 additions & 7 deletions server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import {
ProposedFeatures,
TextDocumentSyncKind,
type InitializeParams,
type Position,
FileChangeType
} from 'vscode-languageserver/node'
import { bitBakeDocScanner } from './BitBakeDocScanner'
Expand All @@ -31,6 +30,8 @@ import { setNotificationManagerConnection, serverNotificationManager } from './S
import { onHoverHandler } from './connectionHandlers/onHover'
import { generateEmbeddedLanguageDocs, getEmbeddedLanguageDocInfosOnPosition } from './embedded-languages/general-support'
import { embeddedLanguageDocsManager } from './embedded-languages/documents-manager'
import { RequestMethod, type RequestParams, type RequestResult } from './lib/src/types/requests'
import { NotificationMethod, type NotificationParams } from './lib/src/types/notifications'
// Create a connection for the server. The connection uses Node's IPC as a transport
const connection: Connection = createConnection(ProposedFeatures.all)
const documents = new TextDocuments<TextDocument>(TextDocument)
Expand Down Expand Up @@ -121,13 +122,19 @@ connection.onDefinition(onDefinitionHandler)

connection.onHover(onHoverHandler)

connection.onRequest('custom/getEmbeddedLanguageDocInfos', async ({ uriString, position }: { uriString: string, position: Position }): Promise<{ uri: string, lineOffset: number } | undefined> => {
return getEmbeddedLanguageDocInfosOnPosition(uriString, position)
})
connection.onRequest(
RequestMethod.EmbeddedLanguageDocInfos,
async ({ uriString, position }: RequestParams['EmbeddedLanguageDocInfos']): RequestResult['EmbeddedLanguageDocInfos'] => {
return getEmbeddedLanguageDocInfosOnPosition(uriString, position)
}
)

connection.onNotification('custom/fileNameChanged', ({ oldUriString, newUriString }: { oldUriString: string, newUriString: string }): void => {
embeddedLanguageDocsManager.renameEmbeddedLanguageDocs(oldUriString, newUriString)
})
connection.onNotification(
NotificationMethod.FilenameChanged,
({ oldUriString, newUriString }: NotificationParams['FilenameChanged']): void => {
embeddedLanguageDocsManager.renameEmbeddedLanguageDocs(oldUriString, newUriString)
}
)

connection.listen()

Expand Down

0 comments on commit b2cf131

Please sign in to comment.