Link

프로그래밍 언어 기능

프로그래밍 언어 기능은 vscode.languages.* API를 통해 제공되는 스마트 편집 기능 모음입니다. Visual Studio Code에서 동적 언어 기능을 제공하는 방법은 크게 2가지가 있습니다. Hover를 예시로 들어보겠습니다:

vscode.languages.registerHoverProvider('javascript', {
  provideHover(document, position, token) {
    return {
      contents: ['Hover Content']
    };
  }
});

위에서 볼 수 있듯이, vscode.languages.registerHoverProvider API는 자바스크립트 파일에 대하여 호버링을 제공 하는 쉬운 방법 입니다. 이 익스텐션이 활성화 된 이후, 여러분이 어떤 자바스크립트 코드 위에 마우스를 올릴때 마다, VS Code는 모든 자바스크립트에 대한 HoverProvider를 쿼리하여 그 결과를 호버링 위젯에 표기 할 것입니다. 언어 기능 목록과 아래의 gif는 여러분에게 익스텐션이 필요로 하는 VS Code API / LSP 메소드를 찾는 방법을 제공합니다.

다른 방법은 언어 서버 프로토콜을 제공하는 언어 서버를 구현하는 것입니다. 작동 방식은 아래와 같습니다 :

  • 익스텐션이 언어 클라이언트와 자바스크립트를 위한 언어 서버를 제공합니다.
  • 언어 클라이언트는 다른 VS Code 익스텐션과 같이, Node.js 익스텐션 호스트 컨텍스트에서 실행됩니다. 활성화 되면, 다른 프로세스에서 언어 서버를 생성하고, 언어 서버 프로토콜을 통해 언어 서버와 통신 합니다.
  • VS Code의 자바스크립트 코드에 마우스를 올립니다.
  • 언어 클라이언트가 호버링 결과를 언어 서버에 쿼리한 다음, VS Code로 다시 보냅니다.
  • VS Code가 호버 위젯에 호버링 결과를 표기 합니다.

이 프로세스는 더 복잡해보이지만, 2가지 큰 장점이 있습니다:

  • 언어 서버는 어떤 언어로도 작성 될 수 있습니다
  • 언어 서버는 여러 에디터에 스마트 편집 기능을 제공하기 위해 재사용될 수 있습니다.

보다 자세한 가이드를 위해, 언어 서버 익스텐션 가이드를 참조하십시오.


언어 기능 목록

아래 목록은 각 언어 기능에 해당하는 다음 항목을 포함합니다:

  • VS Code의 언어 기능 설명
  • 연관된 VS Code API
  • 연관된 LSP 메소드

진단 제공

진단은 코드의 문제를 표현하는 방식입니다.

Diagnostics at Work

언어 서버 프로토콜

언어 서버는 언어 클라이언트에 textDocument/publishDiagnostics 메세지를 전송합니다. 이 메세지는 리소스 URI에 대한 진단 항목으로 구성된 어레이를 전달합니다.

주의: 클라이언트는 서버에 진단을 요청하지 않으며, 서버가 클라이언트에 진단 정보를 푸시합니다.

직접 구현

let diagnosticCollection: vscode.DiagnosticCollection;

export function activate(ctx: vscode.ExtensionContext): void {
  ...
  ctx.subscriptions.push(getDisposable());
  diagnosticCollection = vscode.languages.createDiagnosticCollection('go');
  ctx.subscriptions.push(diagnosticCollection);
  ...
}

function onChange() {
  let uri = document.uri;
  check(uri.fsPath, goConfig).then(errors => {
    diagnosticCollection.clear();
    let diagnosticMap: Map<string, vscode.Diagnostic[]> = new Map();
    errors.forEach(error => {
      let canonicalFile = vscode.Uri.file(error.file).toString();
      let range = new vscode.Range(error.line-1, error.startColumn, error.line-1, error.endColumn);
      let diagnostics = diagnosticMap.get(canonicalFile);
      if (!diagnostics) { diagnostics = []; }
      diagnostics.push(new vscode.Diagnostic(range, error.msg, error.severity));
      diagnosticMap.set(canonicalFile, diagnostics);
    });
    diagnosticMap.forEach((diags, file) => {
      diagnosticCollection.set(vscode.Uri.parse(file), diags);
    });
  })
}

기본

열린 에디터에 진단을 보고 하십시오. 최소한, 저장할때마다 해야 하며. 에디터의 저장 되지 않은 내용을 기반으로 계산한 진단은 더 좋습니다.

고급

열린 에디터 뿐 아니라, 에디터에서 열렸는지 여부의 관계 없이 열린 폴더의 모든 리소스에 대해 진단하십시오.

코드 완성 제안

코드 완성은 사용자에게 상황에 따른 제안을 제공합니다.

Code Completion at Work

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 완료와, 계산이 완료된 추가 정보를 제공하기 위해 completionItem\resolve 메소드를 지원 하는지 에 대한 여부를 알려야 합니다.

{
    ...
    "capabilities" : {
        "completionProvider" : {
            "resolveProvider": "true",
            "triggerCharacters": [ '.' ]
        }
        ...
    }
}

직접 구현

class GoCompletionItemProvider implements vscode.CompletionItemProvider {
    public provideCompletionItems(
        document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
        Thenable<vscode.CompletionItem[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(getDisposable());
    ctx.subscriptions.push(
        vscode.languages.registerCompletionItemProvider(
            GO_MODE, new GoCompletionItemProvider(), '.', '\"'));
    ...
}

기본

해결 제공자를 지원하지 않습니다.

고급

사용자가 완료한 선택에 대하여, 추가 정보를 계산하는 분석 제공자를 지원합니다. 이 정보는 선택한 항목과 같이 표기 됩니다.

호버링

호버링은 마우스 커서 아래의 심볼/오브젝트에 대한 정보를 보여줍니다. 이는 보통 심볼의 타입과 설명입니다.

Hovers at Work

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 호버링을 제공 알려야 합니다.

{
    ...
    "capabilities" : {
        "hoverProvider" : "true",
        ...
    }
}

추가로, 언어 서버는 textDocument/hover 리퀘스트에 응답해야 합니다.

직접 구현

class GoHoverProvider implements HoverProvider {
    public provideHover(
        document: TextDocument, position: Position, token: CancellationToken):
        Thenable<Hover> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerHoverProvider(
            GO_MODE, new GoHoverProvider()));
    ...
}

기본

가능한 경우 타입 정보와 다큐멘트를 포함하십시오.

고급

코드와 같은 스타일로 메소드 시그니쳐에 색상을 제공하십시오.

함수와 메소드 시그니쳐 도움말

사용자가 함수나 메소드를 입력할 때, 호출된 함수/메소드에 대한 정보를 표기합니다.

Type Hover

언어 서버 프로토콜

initialize메소드에 대한 응답으로, 언어 서버는 시그니쳐 도움말을 제공 알려야 합니다.

{
    ...
    "capabilities" : {
        "signatureHelpProvider" : {
            "triggerCharacters": [ '(' ]
        }
        ...
    }
}

추가로 언어 서버는 textDocument/signatureHelp요청에 응답하여야 합니다.

직접 구현

class GoSignatureHelpProvider implements SignatureHelpProvider {
    public provideSignatureHelp(
        document: TextDocument, position: Position, token: CancellationToken):
        Promise<SignatureHelp> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerSignatureHelpProvider(
            GO_MODE, new GoSignatureHelpProvider(), '(', ','));
    ...
}

기본

시그니쳐 도움말에 함수 혹은 메소드에 파라미터에 관한 문서가 포함되어있는지 확인하십시오.

고급

추가할 것이 없습니다.

심볼 정의

사용자가 변수/함수/메소드가 사용되는 곳에서 변수/함수/메소드의 내용을 확인 할 수 있게 합니다.

Type Hover

언어 서버 프로토콜

initialize메소드에 대한 응답으로, 언어 서버는 goto-definition 의 위치를 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "definitionProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/definition 요청에 응답하여야 합니다.

직접 구현

class GoDefinitionProvider implements vscode.DefinitionProvider {
    public provideDefinition(
        document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
        Thenable<vscode.Location> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerDefinitionProvider(
            GO_MODE, new GoDefinitionProvider()));
    ...
}

기본

심볼이 여러개일 경우, 여러 정의를 표시 할 수 있습니다.

고급

추가 될 것이 없습니다.

모든 심볼 참조 검색

사용자가 사용하는 특정 변수/함수/메소드/심볼의 소스 코드의 위치를 볼 수 있게 합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 심볼 참조 위치를 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "referencesProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/references 요청에 응답해야 합니다.

직접 구현

class GoReferenceProvider implements vscode.ReferenceProvider {
    public provideReferences(
        document: vscode.TextDocument, position: vscode.Position,
        options: { includeDeclaration: boolean }, token: vscode.CancellationToken):
        Thenable<vscode.Location[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerReferenceProvider(
            GO_MODE, new GoReferenceProvider()));
    ...
}

기본

모든 참조에 대하여 위치를 (리소스 URI와 범위) 반환하십시오.

고급

추가 될 것이 없습니다.

문서의 모든 심볼 강조

사용자에게 열려있는 에디터의 모든 심볼을 확인할 수 있게 합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 심볼 문서 위치를 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "documentHighlightProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/documentHighlight 요청에 응답해야 합니다.

직접 구현

class GoDocumentHighlightProvider implements vscode.DocumentHighlightProvider {
    public provideDocumentHighlights(
        document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
        vscode.DocumentHighlight[] | Thenable<vscode.DocumentHighlight[]>;
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerDocumentHighlightProvider(
            GO_MODE, new GoDocumentHighlightProvider()));
    ...
}

기본

에디터의 문서에서 참조가 발견 되는 범위를 반환합니다.

고급

추가 될 것이 없습니다.

문서의 모든 심볼 정의

사용자에게 열린 에디터에서 빠르게 심볼의 정의를 확인 할 수 있게 합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 심볼 문서 위치를 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "documentSymbolProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/documentSymbol 요청에 응답해야 합니다.

직접 구현

class GoDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
    public provideDocumentSymbols(
        document: vscode.TextDocument, token: vscode.CancellationToken):
        Thenable<vscode.SymbolInformation[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerDocumentSymbolProvider(
            GO_MODE, new GoDocumentSymbolProvider()));
    ...
}

기본

문서의 모든 심볼을 반환합니다. 변수, 함수, 클래스, 메소드 등과 같은 심볼의 종류를 정의하십시오.

고급

추가 될 것이 없습니다.

폴더의 모든 심볼 정의

사용자가 VS Code의 (작업공간) 열린 폴더 내부의 심볼 정의를 확인 할 수 있게 합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 전역 심볼 위치를 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "workspaceSymbolProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 workspace/symbol 요청에 응답해야 합니다.

직접 구현

class GoWorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider {
    public provideWorkspaceSymbols(
        query: string, token: vscode.CancellationToken):
        Thenable<vscode.SymbolInformation[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerWorkspaceSymbolProvider(
            new GoWorkspaceSymbolProvider()));
    ...
}

기본

열린 폴더의 모든 소스 코드에 정의 된 심볼을 반환합니다. 변수, 함수, 클래스, 메소드 등과 같은 심볼의 종류를 정의하십시오.

고급

추가 될 것이 없습니다.

가능한 액션, 에러, 경고

사용자에게 에러나 경고에 대하여 가능한 액션을 제공합니다. 만약 액션이 사용가능 하다면, 전구 모양이 에러 혹은 경고 옆에 나타날 것입니다. 사용자가 전구를 클릭하면, 가능한 코드 액션 목록이 표시 됩니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 코드 액션을 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "codeActionProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/codeAction 요청에 응답해야 합니다.

직접 구현

class GoCodeActionProvider implements vscode.CodeActionProvider {
    public provideCodeActions(
        document: vscode.TextDocument, range: vscode.Range,
        context: vscode.CodeActionContext, token: vscode.CancellationToken):
        Thenable<vscode.Command[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerCodeActionsProvider(
            GO_MODE, new GoCodeActionProvider()));
    ...
}

기본

에러/경고를 고칠 수 있는 코드 액션을 제공하십시오.

고급

추가로, 리팩토링과 같은 소스 코드 조작 액션을 제공하십시오. 예를 들면 Extract Method 입니다 .

CodeLens - 소스 코드내부의 실행 가능한 컨텍스트 정보 제공

사용자에게 소스 코드와 함께 표시되는 실행 가능한 컨텍스트 정보를 제공합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 CodeLens 결과를 제공하는 것과, CodeLens 커맨드에 바인딩 하는 condLens\resolve를 지원하는지의 여부를 알려야합니다.

{
    ...
    "capabilities" : {
        "codeLensProvider" : {
            "resolveProvider": "true"
        }
        ...
    }
}

추가로, 언어 서버는 textDocument/codeLens 요청에 응답해야 합니다.

직접 구현

class GoCodeLensProvider implements vscode.CodeLensProvider {
    public provideCodeLenses(document: TextDocument, token: CancellationToken):
        CodeLens[] | Thenable<CodeLens[]> {
    ...
    }

    public resolveCodeLens?(codeLens: CodeLens, token: CancellationToken):
         CodeLens | Thenable<CodeLens> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerCodeLensProvider(
            GO_MODE, new GoCodeLensProvider()));
    ...
}

기본

문서에 사용가능한 CodeLens 결과를 정의하십시오.

고급

codeLens/resolve에 응답하여 CodeLens 결과를 커맨드에 바인딩 하십시오.

색상 설정

사용자에게 문서의 색상을 수정하거나 미리보기 할 수 있게 합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 색상 정보를 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "colorProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/documentColortextDocument/colorPresentation 요청에 응답해야 합니다.

직접 구현

class GoColorProvider implements vscode.DocumentColorProvider {
    public provideDocumentColors(
        document: vscode.TextDocument, token: vscode.CancellationToken):
        Thenable<vscode.ColorInformation[]> {
    ...
    }
    public provideColorPresentations(
        color: Color, context: { document: TextDocument, range: Range }, token: vscode.CancellationToken):
        Thenable<vscode.ColorPresentation[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerColorProvider(
            GO_MODE, new GoColorProvider()));
    ...
}

기본

문서의 모든 색상 참조를 반환하십시오. 지원 되는 색상 형식에 대한 표현을 제공하십시오. (예 : rgb(…), hsl(…))

고급

추가 될 것이 없습니다 .

에디터의 소스 코드 포맷

사용자에게 전체 문서에 대한 포맷을 지원합니다.

Document Formatting at Work

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 문서 포맷을 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "documentFormattingProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/formatting 요청에 응답해야 합니다.

직접 구현

class GoDocumentFormatter implements vscode.DocumentFormattingEditProvider {
    public formatDocument(document: vscode.TextDocument):
        Thenable<vscode.TextEdit[]> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerDocumentFormattingEditProvider(
            GO_MODE, new GoDocumentFormatter()));
    ...
}

기본

포맷 지원을 제공하지 않습니다.

고급

소스 코드를 포하는 최소한의 텍스트 수정을 반환해야 합니다. 이는 진단 결과와 같은 마커가 올바르게 조절되고 손실 되지 않도록 하는것에 있어 중요합니다.

에디터의 선택된 줄에 포맷

사용자에게 문서에서 선택된 범위내의 줄에 대한 포맷을 지원합니다.

Document Formatting at Work

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 선택된 줄에 대한 포맷을 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "documentRangeFormattingProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/rangeFormatting 요청에 응답해야 합니다.

직접 구현

class GoDocumentRangeFormatter implements vscode.DocumentRangeFormattingEditProvider{
    public provideDocumentRangeFormattingEdits(
        document: vscode.TextDocument, range: vscode.Range,
        options: vscode.FormattingOptions, token: vscode.CancellationToken):
        Thenable<vscode.TextEdit[]>;
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerDocumentRangeFormattingEditProvider(
            GO_MODE, new GoDocumentRangeFormatter()));
    ...
}

기본

포맷 지원을 제공하지 않습니다.

고급

소스 코드를 포맷하는 최소한의 텍스트 수정을 반환해야 합니다. 이는 진단 결과와 같은 마커가 올바르게 조절되고 손실 되지 않도록 하는것에 있어 중요합니다.

사용자 입력에 대한 포맷

사용자에게 그들이 입력 하는 대로 포맷을 지원합니다.

주의: 사용자 설정 editor.formatOnType으로 소스 코드가 사용자 타입으로 포맷 될지 조절 합니다 .

Document Formatting at Work

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 사용자 입력으로 포맷을 제공한다고 알려야합니다. 또한 클라이언트에 어떤 문자로 포맷을 시작할지 알려야 합니다. moreTriggerCharacters는 선택지입니다.

{
    ...
    "capabilities" : {
        "documentOnTypeFormattingProvider" : {
            "firstTriggerCharacter": "}",
            "moreTriggerCharacter": [";", ","]
        }
        ...
    }
}

추가로, 언어 서버는 textDocument/onTypeFormatting 요청에 응답해야 합니다.

직접 구현

class GoOnTypingFormatter implements vscode.OnTypeFormattingEditProvider{
    public provideOnTypeFormattingEdits(
        document: vscode.TextDocument, position: vscode.Position,
        ch: string, options: vscode.FormattingOptions, token: vscode.CancellationToken):
        Thenable<vscode.TextEdit[]>;
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerOnTypeFormattingEditProvider(
            GO_MODE, new GoOnTypingFormatter()));
    ...
}

기본

포맷 지원을 제공하지 않습니다.

고급

소스 코드를 포맷하는 최소한의 텍스트 수정을 반환해야 합니다. 이는 진단 결과와 같은 마커가 올바르게 조절되고 손실 되지 않도록 하는것에 있어 중요합니다.

심볼 이름 변경

사용자에게 심볼 이름을 변경하고 심볼의 모든 참조를 업데이트 하게 합니다.

Type Hover

언어 서버 프로토콜

initialize 메소드에 대한 응답으로, 언어 서버는 이름 변경을 제공한다고 알려야합니다.

{
    ...
    "capabilities" : {
        "renameProvider" : "true"
        ...
    }
}

추가로, 언어 서버는 textDocument/rename 요청에 응답해야 합니다.

직접 구현

class GoRenameProvider implements vscode.RenameProvider {
    public provideRenameEdits(
        document: vscode.TextDocument, position: vscode.Position,
        newName: string, token: vscode.CancellationToken):
        Thenable<vscode.WorkspaceEdit> {
    ...
    }
}

export function activate(ctx: vscode.ExtensionContext): void {
    ...
    ctx.subscriptions.push(
        vscode.languages.registerRenameProvider(
            GO_MODE, new GoRenameProvider()));
    ...
}

기본

이름 변경 지원을 제공하지 않습니다.

고급

수행해야 하는 모든 작업 공간 목록을 반환합니다. 예를 들면 심볼에 대한 참조를 포함하는 모든 일의 편집 목록입니다.