es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener acceso al IType / IDeclaredType desde un ITreeNode en ReSharper?

Estoy explorando la escritura de Plugins para ReSharper / Rider. Siguiendo la documentación, estoy creando una acción de contexto para ReSharper.

Aquí está la acción de contexto, que aún no hace mucho:

[ContextAction
(
    Name = "Nueva acción de contexto",
    Description = "Alguna descripción...",
    Group = "C#",
    Disabled = false,
    Priority = 1
)]
public sealed class NuevaAccionContexto : ContextActionBase
{
    public override string Text => "Nueva acción de contexto";

    public NuevaAccionContexto(LanguageIndependentContextActionDataProvider dataProvider)
    {
        var selectedTreeNode = dataProvider.GetSelectedElement<itreenode>();

        // --> ¿Cómo puedo obtener una referencia al tipo?
    }

    ...
}

Cuando hago clic en algo en el código fuente (como un tipo como se muestra arriba), se llama al constructor de mi clase de acción de contexto. Tengo acceso al nombre con ITreeNode, pero no sé cómo pasar de la representación del árbol a la representación real del tipo utilizado por ReSharper.

Pregunta

¿Cómo puedo obtener una referencia al tipo (IType, IDeclaredType,…) en el que el usuario hizo clic?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener una referencia al tipo que ha sido seleccionado por el usuario, puedes usar el método Resolve de la clase DeclaredElementFactory de la siguiente manera:

    var selectedTreeNode = dataProvider.GetSelectedElement<itreenode>();
    var declaredType = selectedTreeNode?.GetDeclaredElement() as IDeclaredType;
    
    if (declaredType != null)
    {
        var typeElement = declaredType.GetTypeElement();
        var psiModule = typeElement.Module;
        var symbolScope = psiModule.GetSymbolScope();
    
        var typeSymbol = symbolScope.GetSymbolDeclaredElement(typeElement.ShortName, typeElement.Module)?.GetContainingType();
        var resolvedType = DeclaredElementFactory.GetInstance(psiModule).CreateType(typeSymbol);
    
        // hacer algo con resolvedType
    }
    

    El código anterior obtiene el ITreeNode que ha sido seleccionado, luego obtiene el IDeclaredType de él. Si selectedTreeNode no es nulo y representa un tipo declarado, procedemos a obtener el ITypeElement correspondiente. Luego obtenemos el PsiModule y SymbolScope del ITypeElement, y los usamos para resolver el símbolo del tipo usando el nombre corto del elemento tipo. Finalmente, creamos una instancia de IType utilizando el IDeclaredType y el ITypeSymbol que hemos resuelto, lo cual nos da una referencia al tipo que ha sido seleccionado por el usuario.

Comments are closed.