2010-10-29 13 views
7

Así que estoy jugando con EnvDTE, y la API EnvDTE.CodeModel, y me preguntaba si había una manera de obtener el valor de texto representado por un CodeElement.automatización vs2010: Obtener el valor de texto de un EnvDTE.CodeElement

Digamos que tengo una CodeAttribute, ¿hay alguna manera de conseguir un string de lo que el CodeAttribute representa, es decir [MyAttribute(value="myvalue")].

Sé que es posible reconstruir el código usando las diversas propiedades del CodeElement, al menos en algunos escenarios, pero para algunas cosas parece que sería más fácil simplemente obtener el texto.

Gracias!

Respuesta

4

La interfaz CodeElement tiene las propiedades StartPoint y EndPoint que representan el inicio y el final del elemento dentro del búfer. Estos contienen el número de línea/columna que se puede pasar a métodos como IVsTextLines.GetLineText y le devuelven el valor que está buscando.

Para obtener el IVsTextLines para un determinado CodeElement se puede hacer lo siguiente

CodeElement ce = ...; 
TextDocument td = ce.StartPoint.Parent; 
IVsTextLines lines = td as IVsTextLines; 
+1

Creo que mi siguiente pregunta debería ser, ¿cómo puedo obtener una referencia a un 'IVsTextLines'? También me pregunto si esto requeriría que el archivo se abra en el editor y, por lo tanto, en el búfer de texto. Estoy tratando de implementar algo del proyecto/solución en general, usando 'Project.CodeModel' para explorar el modelo sin abrir el archivo. Esto puede no ser posible sin embargo. –

+0

@MasterMorality ¿terminaste averiguando cómo obtener la referencia a IVsTextLines? –

3
void WriteMapping(CodeProperty codeProperty) 
{ 
    WriteLine(""); 
    WriteLine("///CodeProperty"); 
    WriteLine("///<summary>"); 
    WriteLine("///"+codeProperty.FullName); 
    WriteLine("///</summary>"); 
    if(codeProperty.Getter==null && codeProperty.Setter==null) 
     return; 
    if(codeProperty.Attributes!=null){ 
     foreach(CodeAttribute a in codeProperty.Attributes) 
     { 
      Write("["+a.FullName); 
      if(a.Children!=null && a.Children.Count>0) 
      { 
       var start=a.Children.Cast<CodeElement>().First().GetStartPoint(); 
       var finish= a.GetEndPoint(); 
       string allArguments=start.CreateEditPoint().GetText(finish); 

       Write("("+allArguments); 
      } 
    WriteLine("]"); 
     } 
     } 
    Write("public "+GetFullName(codeProperty.Type) +" "+codeProperty.Prototype); 

    Write(" {"); 
    //if(codeProperty.Getter!=null && codeProperty.Getter.Access!=vsCMAccess.vsCMAccessPrivate) 
     Write("get;"); 
    //if(codeProperty.Setter!=null) 
     Write("set;"); 
    WriteLine("}"); 

    } 
Cuestiones relacionadas