다음을 통해 공유


새 CodeLens를 사용하여 Visual Studio 편집기 확장

만들 수 있는 다양한 유형의 CodeLenses가 있습니다. 각 형식은 고유한 기능 집합을 제공합니다. 다음 섹션에서는 이러한 각 유형의 CodeLenses를 제공하는 방법을 자세히 설명합니다.

텍스트 보기 CodeLens

텍스트 뷰 CodeLens는 코드 세그먼트에 텍스트 기반 정보를 제공합니다. 이것이 CodeLens의 가장 간단한 형태입니다. 다음 개념은 CodeLens 텍스트 보기를 만드는 방법을 보여 줍니다.

  • ICodeLensProvider 인터페이스는 구현할 기본 인터페이스입니다. 이 인터페이스의 구현은 CodeLens가 활성화되는 시기와 CodeLens가 적용할 코드 세그먼트 및 표시 방법을 정의합니다.
  • ICodeLensProvider구현 내에서 CodeLensProviderConfiguration구현하여 CodeLens를 활성화해야 하는 시기를 정의해야 합니다.
  • 또한 TryCreateCodeLensAsync 메서드를 구현해야 합니다. 이 메서드는 CodeLens가 활성화될 때 호출됩니다. 이 메서드에서는 CodeLens를 표시하는 방법과 표시할 시기를 정의할 수 있습니다. 이 메서드는 CodeLens인스턴스를 반환합니다.
  • GetLabelAsync 메서드를 통해 표시 텍스트를 표시하는 방법을 정의하려면 고유한 하위 클래스인 CodeLens만들어야 합니다. 이 메서드는 텍스트, 도구 설명 및 선택적 아이콘을 구성하는 데 사용할 수 있는 CodeLensLabel인스턴스를 반환합니다.

호출 가능한 CodeLens

호출 가능한 CodeLens를 사용하면 사용자가 CodeLens를 클릭할 때 확장에서 일부 작업(예: 단위 테스트 실행)을 수행할 수 있습니다. 확장은 CodeLens로부터 파생된 InvokableCodeLens를 구현해서 호출 가능한 CodeLens에 기여할 수 있습니다.

Visual CodeLens (비주얼 코드렌즈)

Visual CodeLens를 사용하면 사용자가 CodeLens를 클릭할 때 확장에서 메서드에 대한 참조 목록과 같은 사용자 지정 UI를 CodeLens 위의 팝업에 표시할 수 있습니다. 확장은 CodeLens에서 파생된 VisualCodeLens를 구현하여 Visual CodeLens에 기여할 수 있습니다. VisualStudio.Extensibility의 확장은 Visual Studio에서 처리되지 않을 수 있으므로 텍스트 보기 여백과 마찬가지로 visual CodeLenses는 해당 컨트롤에 대한 RemoteUserControl 및 해당 데이터 템플릿을 만들어 UI를 제공합니다. 아래에는 몇 가지 간단한 예제가 있지만 visual CodeLens의 UI 콘텐츠를 만들 때 원격 UI 설명서를 읽는 것이 좋습니다.

아래 샘플 코드는 텍스트 뷰 CodeLens 및 호출 가능한 CodeLens를 만드는 방법을 보여 줍니다.

public TextViewExtensionConfiguration TextViewExtensionConfiguration => new()
{
    AppliesTo = new[]
    {
        DocumentFilter.FromDocumentType(DocumentType.KnownValues.Code),
    },
};

public CodeLensProviderConfiguration CodeLensProviderConfiguration =>
    new("CodeLens Sample Provider") {};

public Task<CodeLens?> TryCreateCodeLensAsync(CodeElement codeElement, CodeElementContext codeElementContext, CancellationToken token)
{
    if (codeElement.Kind == CodeElementKind.KnownValues.Method)
    {
        return Task.FromResult<CodeLens?>(new ClickableCodeLens(codeElement, this.Extensibility));
    }
    
    return Task.FromResult<CodeLens?>(new WordCountCodeLens(codeElement, codeElementContext, this.Extensibility, this));
}

...

public class ClickableCodeLens : InvokableCodeLens
{
    public override Task ExecuteAsync(CodeElementContext codeElementContext, IClientContext clientContext, CancellationToken cancelToken)
    {
        this.clickCount++;
        this.Invalidate();
        return Task.CompletedTask;
    }

    public override Task<CodeLensLabel> GetLabelAsync(CodeElementContext codeElementContext, CancellationToken token)
    {
        return Task.FromResult(new CodeLensLabel()
        {
            Text = this.clickCount == 0 ? "Click me" : $"Clicked {this.clickCount} times",
            Tooltip = "Invokable CodeLens Sample Tooltip",
        });
    }
}

public class WordCountCodeLens : VisualCodeLens
{   
    public override Task<IRemoteUserControl> GetVisualizationAsync(CodeElementContext codeElementContext, IClientContext clientContext, CancellationToken token)
    {
        return Task.FromResult<IRemoteUserControl>(new WordCountCodeLensVisual(this.wordCountData));
    }

    public override Task<CodeLensLabel> GetLabelAsync(CodeElementContext codeElementContext, CancellationToken token)
    {
        this.wordCountData.WordCount = CountWords(codeElementContext.Range);
        return Task.FromResult(new CodeLensLabel()
        {
            Text = $"Words: {this.wordCountData.WordCount}",
            Tooltip = "Number of words in this code element",
        });
    }
}

CodeLens 공급자 표시 이름을 구성하는 것 외에도 CodeLens 공급자는 CodeLens의 우선 순위를 구성할 수 있습니다. 우선순위 값은 다른 CodeLenses와 비교하여 상대적 순서를 결정하는 데 사용됩니다. 이 작업은 CodeLensProviderConfiguration 개체의 Priority 속성을 통해 수행됩니다.

CodeLenses는 일반적으로 텍스트 뷰와 관련된 일부 데이터를 시각화합니다. 예를 들어 메서드에 대한 참조 수를 표시할 수 있습니다. 이렇게 하려면 CodeLens 공급자가 텍스트 보기 이벤트를 수신 대기하여 텍스트 보기를 열고 닫거나 사용자가 입력할 때 반응해야 합니다.

Visual Studio는 사용자가 여는 적용 가능한 텍스트 보기 수에 관계없이 CodeLens 공급자의 인스턴스를 하나만 만듭니다. 즉, CodeLens가 상태를 유지해야 하는 경우 CodeLens 공급자가 현재 열려 있는 텍스트 보기의 상태를 유지할 수 있도록 해야 합니다.

자세한 내용은 CodeLens 샘플참조하세요.

새 문서 형식(또는 CodeLens를 지원하지 않는 기존 문서 형식)에 CodeLenses를 기여하는 아직 지원되지 않습니다.