Blueprint for Language Specs System

From Qt Wiki
Revision as of 07:04, 24 February 2015 by Maintenance script (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Blueprint for language specs system

Current ModelManagerInterface::ProjectPart has following problems:
* Pure C can be set only for whole ProjectPart. Objective C headers and objective C++ headers/sources cannot be set.
* C++ language extensions not handled.
* Project managers for autotools and cmake assume that any file is C++ source
* ProjectManager can use only C++ flags and must ignore C/ObjC/ObjC++ flags.
* QMake project manager doesn't read OBJECTIVE_HEADERS variable

How clang can handle different languages:

  • Clang supports 4 languages: C, C+, ObjectiveC and ObjectiveC. Each language has headers and implementation files. Like in such code:
    <br />QStringList ClangCodeModel::Utils::clangLanguageOption(bool cxxEnabled,<br /> bool isHeader,<br /> bool isObjC)<br />{<br /> QStringList opts;<br /> opts''= QLatin1String(&quot;-x&amp;quot;);
    
    if (cxxEnabled &amp;&amp; isHeader &amp;&amp; isObjC)<br /> opts ''= QLatin1String(&quot;objective-c-header&amp;quot;);<br /> else if (!cxxEnabled &amp;&amp; isHeader &amp;&amp; isObjC)<br /> opts''= QLatin1String(&quot;objective-c-header&amp;quot;);<br /> else if (cxxEnabled &amp;&amp; !isHeader &amp;&amp; isObjC)<br /> opts ''= QLatin1String(&quot;objective-c&quot;);<br /> else if ([[Image:cxxEnabled &amp;&amp; |cxxEnabled &amp;&amp; ]]isHeader &amp;&amp; isObjC)<br /> opts''= QLatin1String(&quot;objective-c&amp;quot;);<br /> else if (cxxEnabled &amp;&amp; isHeader &amp;&amp; !isObjC)<br /> opts ''= QLatin1String(&quot;c-header&amp;quot;);<br /> else if ([[Image:cxxEnabled &amp;&amp; isHeader &amp;&amp; |cxxEnabled &amp;&amp; isHeader &amp;&amp; ]]isObjC)<br /> opts''= QLatin1String(&quot;c-header&amp;quot;);<br /> else if (cxxEnabled &amp;&amp; [[Image:isHeader &amp;&amp; |isHeader &amp;&amp; ]]isObjC)<br /> opts ''= QLatin1String(&quot;c&quot;);<br /> else // [[Image:cxxEnabled &amp;&amp; |cxxEnabled &amp;&amp; ]]isHeader &amp;&amp; !isObjC<br /> opts''= QLatin1String(&quot;c&amp;quot;);
    
    return opts;<br />}<br />
    

    * If file directly included to project, than it language and isHeader flag can be determined by each project manager plugin. Otherwise, we can use dependency table and assume that <iostream&gt; file is "c+
    -header&quot;, because it included only by C+ files. (sergey shambir: I don't know how to handle inclusion from both C++ and ObjectiveC++ files. Probably it should have type of file from which it was opened in editor).
    * Each language can have extensions: GNU, Microsoft and Borland. Only one extensions group used.
    * Each language can have own set of flags, at least in QMAKE