2017-11-02 6 views
1

나는 조금 놀아서 비주얼 스튜디오 확장을 만드는 법을 배우려고합니다.
코드 편집기 (C#)에서 마우스 아래에있는 단어에 대한 모든 정보를 얻고 싶습니다. 그러나 어떻게해야하는지 알 수 없습니다. 코드를 분석하기를 원하지 않습니다. 왜냐하면이 모든 정보는 도구 설명 (예 : 도구 설명 데이터를 캡처하는 데 충분할 수 있습니다)과 같은 정보이기 때문에이 메커니즘이 있어야하기 때문입니다.
더 명확하게하려면 다음과 같이하십시오.
- 변수 위로 마우스를 가져 가면이 단어가 변수라는 것을 알고 싶습니다. 또한이 변수 및 유형의 이름을 원합니다. 다른 유형, 인터페이스 등에 대해서도 동일합니다.
- 'var'키워드 위로 마우스를 가져 가면이 단어가 'var'키워드라는 것을 알고 싶습니다. 유형을 알고 싶습니다.
- 'List [Domain.Example.TestClass]'와 같은 일반 내부 클래스 위로 마우스를 가져 가면 'TestClass'와 동일한 형식을 얻고 싶습니다.
기본적으로 툴팁 내용과 동일합니다.비주얼 스튜디오 확장 코드 편집기에서 마우스 위치에있는 단어에 대한 정보를 얻는 방법

'IQuickInfoSource'를 사용하려고했지만 커서 아래에 단어를 표시 할 수 있지만 추가 데이터를 얻는 방법을 모르겠습니다.
나는 또한 'IMouseProcessorProvider'를 시도했고 같은 결과를 얻었지만 현재 단어를 얻을 수 있었지만 다른 정보는 얻을 수있었습니다.

어떻게 해결할 수 있습니까? 또는 적어도 시각적 인 스튜디오 확장에 대한 적절한 문서를 찾기가 어렵 기 때문에 적어도 올바른 방향으로 안내하십시오. 더 자세한 정보가 필요하면 질문하십시오.

미리 감사드립니다.

답변

1

몇 시간이 지난 후에 나는 내가 원하는 것을 얻을 수있었습니다. 누군가가 똑같이하려고한다면 다음 단계를 찾아야합니다.

:

내가 그 정보를 얻기 위해 '로슬린'를 사용하고, 그래서 'Microsoft.CodeAnalysis'등

나는 또한 마우스 이벤트에 대한 반응 할 수 IMouseProcessorProvider을 사용

같은 nuget 패키지를 다운로드하는 데 필요한

[Export(typeof(IMouseProcessorProvider))] 
[Order] 
[ContentType("CSharp")] 
[Name("MouseNavigation")] 
[TextViewRole(PredefinedTextViewRoles.Interactive)] 
internal class MouseNavigationProvider : IMouseProcessorProvider 

는 사용하여 다음 코드 후, 나는 타입 정보를 얻을 수있었습니다

SnapshotPoint caretPosition = _textView.Caret.Position.BufferPosition; 
Document document = caretPosition.Snapshot.GetOpenDocumentInCurrentContextWithChanges(); 
SemanticModel semanticModel = document.GetSemanticModelAsync().Result; 
if (semanticModel == null) 
    return null; 

TypeInfo typeInfo; 
SyntaxNode expressionNode = document.GetSyntaxRootAsync().Result.FindToken(caretPosition).Parent; 
if (expressionNode is VariableDeclaratorSyntax) 
{ 
    SyntaxNode childNode = expressionNode.ChildNodes()?.FirstOrDefault() 
     ?.ChildNodes()?.FirstOrDefault(); 
    typeInfo = semanticModel.GetTypeInfo(childNode); 
} 
else if (expressionNode is ClassDeclarationSyntax) 
{ 
    throw new NotImplementedException(); 
} 
else 
{ 
    // NOTE: This probably should be changed for specific type of syntax, but right now it is only for testing purposes 
    typeInfo = semanticModel.GetTypeInfo(expressionNode); 
    if (typeInfo.Type == null) 
    { 
     expressionNode = expressionNode.Parent; 
     typeInfo = semanticModel.GetTypeInfo(expressionNode); 
    } 
}