[Qt-creator] Accessing the AST
Nikolai Kosjar
nikolai.kosjar at digia.com
Mon Apr 22 12:45:46 CEST 2013
Hiya!
On 04/22/2013 11:26 AM, Jesper K. Pedersen wrote:
> I'm currently trying to get my hands on the AST for a given file, so I e.g. can tell which method and class I'm in.
You might be interested in
* Document::lastVisibleSymbolAt(line, column)
* QString AbstractEditorSupport::functionAt(const
CppModelManagerInterface *modelManager, QString &fileName, int line, int
column)
> Here is what I currently have:
>
> I believe that my luck is made, as soon as I can get something valid out of ASTPath::operator(), which returns a list of AST*, so I'm working backwards from that.
>
> // Fetch information about line, coumn and file name
> Core::IEditor* editor = Core::EditorManager::instance()->currentEditor();
> const int line = editor->currentLine();
> const int column = editor->currentColumn();
> const QString fileName = editor->document()->fileName();
>
> // Fetch document content
> QFile file(editor->document()->fileName());
> file.open(QFile::ReadOnly);
> const QByteArray content = file.readAll();
>
> // Get a Document pointer
> CPlusPlus::Snapshot snapshot = CPlusPlus::CppModelManagerInterface::instance()->snapshot();
> CPlusPlus::Document::Ptr document = snapshot.documentFromSource(content, fileName);
> const bool ok = document->parse(CPlusPlus::Document::ParseTranlationUnit);
Did you try Document::Ptr document(const QString &fileName)? There is
also Document::utf8Source(), so you don't need to reread the file and
create a document.
> // OK, I'm desperate, so lets wait a bit in case something needs to initialize asyncronic
> QTime time;
> time.start();
> while ( time.elapsed() < 2000 )
> qApp->processEvents(QEventLoop::AllEvents, 100);
I'm not sure in which context you run this, but in general this
shouldn't be needed after calling document->parse().
> // Give me an AST, please
> QList<AST *> path = ASTPath(document)(editor->currentLine(), editor->currentColumn());
>
> qDebug("Result:\nFileName: %s\nColumn: %d\nLine: %d\nParsed OK: %d\nLength of result from ASTPath: %d", qPrintable(fileName), column, line, ok, path.count());
Where is your cursor positioned? Note that if the cursor is on the very
first or last character of the document (or some whitespace characters
in front/after), ASTPath will return an empty list since the cursor is
not considered to be on any AST in these cases.
Nikolai
More information about the Qt-creator
mailing list