2010-10-29 4 views
7

Quindi sto giocando con EnvDTE e con l'API EnvDTE.CodeModel, e mi chiedevo se c'era un modo per ottenere il valore del testo rappresentato da un CodeElement.: Ottieni il valore di testo di un EnvDTE.CodeElement

Diciamo che ho un CodeAttribute, c'è qualche modo per ottenere una string di ciò che il CodeAttribute rappresenta, vale a dire [MyAttribute(value="myvalue")].

So che è possibile ricostruire il codice utilizzando le varie proprietà di CodeElement, almeno in alcuni scenari, ma per alcune cose sembra più semplice ottenere il testo.

Grazie!

risposta

4

L'interfaccia CodeElement ha le proprietà StartPoint e EndPoint che rappresentano l'inizio e la fine dell'elemento all'interno del buffer. Questi contengono il numero/colonna della linea che possono essere passati a metodi come IVsTextLines.GetLineText e ti restituiscono il valore che stai cercando.

Per ottenere risultati IVsTextLines per un dato CodeElement è possibile effettuare le seguenti

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

Credo che la mia prossima domanda dovrebbe essere, come faccio ad ottenere un riferimento a un 'IVsTextLines'? Mi chiedo anche se questo richiederebbe che il file sia aperto nell'editor e quindi nel buffer di testo. Sto cercando di implementare qualcosa di project/solution wide, usando 'Project.CodeModel', quindi esplorerei il modello senza che il file fosse aperto. Questo potrebbe non essere possibile però. –

+0

@MasterMorality hai finito per capire come ottenere il riferimento 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("}"); 

    }