Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.

Clang-hacking-notes-for-wip-clang-branch: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
(Decode HTML entity names)
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
[[Category:Tools::Qt Creator:Branches]]
[[Category:Tools::Qt Creator:Branches]]


Line 5: Line 7:
GCC C++ frontend is a parser that also generates code. Clang is quite similar: it is parser that also calls various actions along with creating AST. Completion implemented via inserting virtual token, on which parser calls one of Sema class methods, implemented in SemaCodeComplete.cpp.
GCC C++ frontend is a parser that also generates code. Clang is quite similar: it is parser that also calls various actions along with creating AST. Completion implemented via inserting virtual token, on which parser calls one of Sema class methods, implemented in SemaCodeComplete.cpp.


Main pros of this approach is context-sensitive completion: parser will not produce any completion results if it doesn't expect completion token at given point, otherwise it will call one of ~40 methods from SemaCodeComplete.cpp, choice depends on context. There are declarations of some code complete methods, parser calls one of them:<br /><code><br /> void CodeCompleteTag(Scope *S, unsigned TagSpec);<br /> void CodeCompleteTypeQualifiers(DeclSpec &amp;DS);<br /> void CodeCompleteCase(Scope *S);<br /> void CodeCompleteCall(Scope *S, Expr '''Fn, ArrayRef&amp;lt;Expr'''&gt; Args);<br /> void CodeCompleteInitializer(Scope *S, Decl *D);<br /> void CodeCompleteReturn(Scope *S);<br /> void CodeCompleteAfterIf(Scope *S);<br /> void CodeCompleteAssignmentRHS(Scope *S, Expr '''LHS);<br /></code>
Main pros of this approach is context-sensitive completion: parser will not produce any completion results if it doesn't expect completion token at given point, otherwise it will call one of ~40 methods from SemaCodeComplete.cpp, choice depends on context. There are declarations of some code complete methods, parser calls one of them:
<br />Additional notes:<br />''' &quot;Builder pattern&amp;quot;:http://en.wikipedia.org/wiki/Builder_pattern used to create completion results, see ResultBuilder class.
<code>
void CodeCompleteTag(Scope *S, unsigned TagSpec);
void CodeCompleteTypeQualifiers(DeclSpec &DS);
void CodeCompleteCase(Scope *S);
void CodeCompleteCall(Scope *S, Expr '''Fn, ArrayRef<Expr'''> Args);
void CodeCompleteInitializer(Scope *S, Decl *D);
void CodeCompleteReturn(Scope *S);
void CodeCompleteAfterIf(Scope *S);
void CodeCompleteAssignmentRHS(Scope *S, Expr '''LHS);
</code>
 
Additional notes:
''' [http://en.wikipedia.org/wiki/Builder_pattern Builder pattern] used to create completion results, see ResultBuilder class.

Latest revision as of 16:59, 12 March 2015

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

Code Completion

GCC C++ frontend is a parser that also generates code. Clang is quite similar: it is parser that also calls various actions along with creating AST. Completion implemented via inserting virtual token, on which parser calls one of Sema class methods, implemented in SemaCodeComplete.cpp.

Main pros of this approach is context-sensitive completion: parser will not produce any completion results if it doesn't expect completion token at given point, otherwise it will call one of ~40 methods from SemaCodeComplete.cpp, choice depends on context. There are declarations of some code complete methods, parser calls one of them:

 void CodeCompleteTag(Scope *S, unsigned TagSpec);
 void CodeCompleteTypeQualifiers(DeclSpec &DS);
 void CodeCompleteCase(Scope *S);
 void CodeCompleteCall(Scope *S, Expr '''Fn, ArrayRef<Expr'''> Args);
 void CodeCompleteInitializer(Scope *S, Decl *D);
 void CodeCompleteReturn(Scope *S);
 void CodeCompleteAfterIf(Scope *S);
 void CodeCompleteAssignmentRHS(Scope *S, Expr '''LHS);

Additional notes: Builder pattern used to create completion results, see ResultBuilder class.