<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[270282] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/270282">270282</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2020-11-30 19:59:26 -0800 (Mon, 30 Nov 2020)</dd>
</dl>

<h3>Log Message</h3>
<pre>check-webkit-style should allow WebKitAdditions headers to appear after soft linking headers
https://bugs.webkit.org/show_bug.cgi?id=219382

Reviewed by Darin Adler.

The header include ordering rule that forces soft linking headers to be included last in implementation (cpp and
mm) files shouldn't really apply to WebKitAdditions headers, since those additions headers are only meant to
contain method and function implementations anyways.

Fix this by adding code to recognize WebKitAdditions headers as a special type of header, and exempt these
headers from the `'*SoftLink.h header should be included after all other headers.'` rule.

* Scripts/webkitpy/style/checkers/cpp.py:
(_IncludeState):
(_IncludeState.check_next_include_order):
(_classify_include):
* Scripts/webkitpy/style/checkers/cpp_unittest.py: Add a test case to exercise this scenario.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpystylecheckerscpppy">trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py</a></li>
<li><a href="#trunkToolsScriptswebkitpystylecheckerscpp_unittestpy">trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (270281 => 270282)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog    2020-12-01 02:37:53 UTC (rev 270281)
+++ trunk/Tools/ChangeLog       2020-12-01 03:59:26 UTC (rev 270282)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2020-11-30  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        check-webkit-style should allow WebKitAdditions headers to appear after soft linking headers
+        https://bugs.webkit.org/show_bug.cgi?id=219382
+
+        Reviewed by Darin Adler.
+
+        The header include ordering rule that forces soft linking headers to be included last in implementation (cpp and
+        mm) files shouldn't really apply to WebKitAdditions headers, since those additions headers are only meant to
+        contain method and function implementations anyways.
+
+        Fix this by adding code to recognize WebKitAdditions headers as a special type of header, and exempt these
+        headers from the `'*SoftLink.h header should be included after all other headers.'` rule.
+
+        * Scripts/webkitpy/style/checkers/cpp.py:
+        (_IncludeState):
+        (_IncludeState.check_next_include_order):
+        (_classify_include):
+        * Scripts/webkitpy/style/checkers/cpp_unittest.py: Add a test case to exercise this scenario.
+
</ins><span class="cx"> 2020-11-30  Brian Burg  <bburg@apple.com>
</span><span class="cx"> 
</span><span class="cx">         filter-build-webkit: reduce non-actionable warnings from objc runtime and xcodebuild
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpystylecheckerscpppy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py (270281 => 270282)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py       2020-12-01 02:37:53 UTC (rev 270281)
+++ trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py  2020-12-01 03:59:26 UTC (rev 270282)
</span><span class="lines">@@ -122,6 +122,7 @@
</span><span class="cx"> _OTHER_HEADER = 2
</span><span class="cx"> _SOFT_LINK_HEADER = 3
</span><span class="cx"> _MOC_HEADER = 4
</span><ins>+_WEBKIT_ADDITIONS_HEADER = 5
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> # Files which is generated by some sort of code generator.
</span><span class="lines">@@ -292,6 +293,7 @@
</span><span class="cx">         _OTHER_HEADER: 'other header',
</span><span class="cx">         _SOFT_LINK_HEADER: '*SoftLink.h header',
</span><span class="cx">         _MOC_HEADER: 'moc file',
</span><ins>+        _WEBKIT_ADDITIONS_HEADER: 'WebKitAdditions header',
</ins><span class="cx">         }
</span><span class="cx">     _SECTION_NAMES = {
</span><span class="cx">         _INITIAL_SECTION: "... nothing.",
</span><span class="lines">@@ -364,8 +366,7 @@
</span><span class="cx">                 if primary_header_exists and not filename.endswith('SoftLink.cpp'):
</span><span class="cx">                     error_message = before_error_message
</span><span class="cx">             self._section = self._OTHER_SECTION
</span><del>-        else:
-            assert header_type == _SOFT_LINK_HEADER
</del><ins>+        elif header_type == _SOFT_LINK_HEADER:
</ins><span class="cx">             if file_is_header:
</span><span class="cx">                 error_message = '{} should never be included in a header.'.format(
</span><span class="cx">                     self._TYPE_NAMES[header_type])
</span><span class="lines">@@ -372,7 +373,7 @@
</span><span class="cx">             self._section = self._SOFT_LINK_SECTION
</span><span class="cx">             self._visited_soft_link_section = True
</span><span class="cx"> 
</span><del>-        if not error_message and self.visited_soft_link_section() and header_type != _SOFT_LINK_HEADER:
</del><ins>+        if not error_message and self.visited_soft_link_section() and header_type != _SOFT_LINK_HEADER and header_type != _WEBKIT_ADDITIONS_HEADER:
</ins><span class="cx">             error_message = '*SoftLink.h header should be included after all other headers.'
</span><span class="cx"> 
</span><span class="cx">         return error_message
</span><span class="lines">@@ -3428,6 +3429,9 @@
</span><span class="cx">       _OTHER_HEADER
</span><span class="cx">     """
</span><span class="cx"> 
</span><ins>+    if 'WebKitAdditions/' in include:
+        return _WEBKIT_ADDITIONS_HEADER
+
</ins><span class="cx">     # If it is a system header we know it is classified as _OTHER_HEADER.
</span><span class="cx">     if is_system and not include.startswith('public/') and not include.startswith('wtf/') and not include.endswith('SoftLink.h'):
</span><span class="cx">         return _OTHER_HEADER
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpystylecheckerscpp_unittestpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py (270281 => 270282)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py      2020-12-01 02:37:53 UTC (rev 270281)
+++ trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py 2020-12-01 03:59:26 UTC (rev 270282)
</span><span class="lines">@@ -3427,11 +3427,21 @@
</span><span class="cx">                                          '#include <Framework/Bar.h>\n',
</span><span class="cx">                                          '*SoftLink.h header should be included after all other headers.  [build/include_order] [4]')
</span><span class="cx"> 
</span><ins>+        # Allow WebKitAdditions headers to appear after *SoftLink.h headers.
</ins><span class="cx">         self.assert_language_rules_check('Foo.cpp',
</span><span class="cx">                                          '#include "config.h"\n'
</span><span class="cx">                                          '#include "Foo.h"\n'
</span><span class="cx">                                          '\n'
</span><span class="cx">                                          '#include "ALocalHeader.h"\n'
</span><ins>+                                         '#include "FrameworkSoftLink.h"\n'
+                                         '#include <WebKitAdditions/FooAdditions.h>\n',
+                                         '')
+
+        self.assert_language_rules_check('Foo.cpp',
+                                         '#include "config.h"\n'
+                                         '#include "Foo.h"\n'
+                                         '\n'
+                                         '#include "ALocalHeader.h"\n'
</ins><span class="cx">                                          '#include <Framework/Bar.h>\n'
</span><span class="cx">                                          '\n'
</span><span class="cx">                                          '#include "FrameworkSoftLink.h"\n'
</span></span></pre>
</div>
</div>

</body>
</html>