Modified: trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py (240401 => 240402)
--- trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py 2019-01-24 01:43:58 UTC (rev 240401)
+++ trunk/Tools/Scripts/webkitpy/style/checkers/cpp.py 2019-01-24 02:47:53 UTC (rev 240402)
@@ -3332,11 +3332,15 @@
'RetainPtr<> should never contain a type with \'*\'. Correct: RetainPtr<NSString>, RetainPtr<CFStringRef>.')
break
- frameworks_with_soft_links = ['CoreMedia', 'CoreVideo', 'DataDetectorsCore', 'MediaAccessibility', 'MediaRemote', 'PassKit', 'QuickLook', 'UIKit', 'VideoToolbox']
- matched = re.compile('^\s*SOFT_LINK_FRAMEWORK.*\(({})\)'.format('|'.join(frameworks_with_soft_links))).search(line)
+ matched = re.compile('^\s*SOFT_LINK_(PRIVATE_)?FRAMEWORK.*\((\S+)\)').search(line)
if matched:
- framework_name = matched.group(1)
- if not re.compile('^\s*SOFT_LINK_FRAMEWORK_FOR_(HEADER|SOURCE)(_WITH_EXPORT)?\({}\)'.format(framework_name)).search(line):
+ framework_name = matched.group(2)
+ if file_extension == 'h' and not search(r'^\s*SOFT_LINK_(PRIVATE_)?FRAMEWORK_FOR_HEADER.*\(', line):
+ error(line_number, 'softlink/header', 5,
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create {framework}SoftLink.{{cpp,mm}} instead.'.format(framework=framework_name))
+
+ frameworks_with_soft_links = ['CoreMedia', 'CoreVideo', 'DataDetectorsCore', 'MediaAccessibility', 'MediaRemote', 'PassKit', 'QuickLook', 'UIKit', 'VideoToolbox']
+ if framework_name in frameworks_with_soft_links and not re.compile('^\s*SOFT_LINK_(PRIVATE_)?FRAMEWORK_FOR_(HEADER|SOURCE)(_WITH_EXPORT)?\({}\)'.format(framework_name)).search(line):
error(line_number, 'softlink/framework', 5,
'Use {framework}SoftLink.{{cpp,h,mm}} to soft-link to {framework}.framework.'.format(framework=framework_name))
@@ -4093,6 +4097,7 @@
'security/printf',
'security/temp_file',
'softlink/framework',
+ 'softlink/header',
'whitespace/blank_line',
'whitespace/braces',
'whitespace/brackets',
Modified: trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py (240401 => 240402)
--- trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py 2019-01-24 01:43:58 UTC (rev 240401)
+++ trunk/Tools/Scripts/webkitpy/style/checkers/cpp_unittest.py 2019-01-24 02:47:53 UTC (rev 240402)
@@ -1688,25 +1688,36 @@
' [runtime/retainptr] [5]')
self.assert_lint('''RetainPtr<NSDictionary<NSString *, NSArray<NSString *>>> dictionary;''', '')
- def test_softlink(self):
+ def test_softlink_framework(self):
self.assert_lint(
- '''SOFT_LINK_FRAMEWORK(AVFoundation)''',
+ '''SOFT_LINK_FRAMEWORK(Foundation)''',
'')
self.assert_lint(
- '''SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)''',
+ '''SOFT_LINK_FRAMEWORK_OPTIONAL(Foundation)''',
'')
self.assert_lint(
- '''SOFT_LINK_FRAMEWORK_OPTIONAL_PREFLIGHT(AVFoundation)''',
+ '''SOFT_LINK_FRAMEWORK_OPTIONAL_PREFLIGHT(Foundation)''',
'')
self.assert_lint(
- '''SOFT_LINK_FRAMEWORK_FOR_HEADER(AVFoundation)''',
+ '''SOFT_LINK_FRAMEWORK_FOR_HEADER(Foundation)''',
+ '',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK_FOR_SOURCE(Foundation)''',
'')
self.assert_lint(
- '''SOFT_LINK_FRAMEWORK_FOR_SOURCE(AVFoundation)''',
+ '''SOFT_LINK_FRAMEWORK_FOR_SOURCE_WITH_EXPORT(Foundation)''',
'')
self.assert_lint(
- '''SOFT_LINK_FRAMEWORK_FOR_SOURCE_WITH_EXPORT(AVFoundation)''',
+ '''SOFT_LINK_PRIVATE_FRAMEWORK_FOR_HEADER(Foundation)''',
+ '',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_PRIVATE_FRAMEWORK_FOR_SOURCE(Foundation)''',
'')
+ self.assert_lint(
+ '''SOFT_LINK_PRIVATE_FRAMEWORK_FOR_SOURCE_WITH_EXPORT(Foundation)''',
+ '')
self.assert_lint(
'''SOFT_LINK_FRAMEWORK(UIKit)''',
@@ -1722,7 +1733,8 @@
' [softlink/framework] [5]')
self.assert_lint(
'''SOFT_LINK_FRAMEWORK_FOR_HEADER(UIKit)''',
- '')
+ '',
+ file_name='foo.h')
self.assert_lint(
'''SOFT_LINK_FRAMEWORK_FOR_SOURCE(UIKit)''',
'')
@@ -1730,6 +1742,43 @@
'''SOFT_LINK_FRAMEWORK_FOR_SOURCE_WITH_EXPORT(UIKit)''',
'')
+ def test_softlink_header(self):
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK(MyFramework)''',
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create MyFrameworkSoftLink.{cpp,mm} instead.'
+ ' [softlink/header] [5]',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK_OPTIONAL(MyFramework)''',
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create MyFrameworkSoftLink.{cpp,mm} instead.'
+ ' [softlink/header] [5]',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK_OPTIONAL_PREFLIGHT(MyFramework)''',
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create MyFrameworkSoftLink.{cpp,mm} instead.'
+ ' [softlink/header] [5]',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_PRIVATE_FRAMEWORK(MyPrivateFramework)''',
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create MyPrivateFrameworkSoftLink.{cpp,mm} instead.'
+ ' [softlink/header] [5]',
+ file_name='foo.h')
+
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK_FOR_HEADER(MyFramework)''',
+ '',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK_FOR_SOURCE(MyFramework)''',
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create MyFrameworkSoftLink.{cpp,mm} instead.'
+ ' [softlink/header] [5]',
+ file_name='foo.h')
+ self.assert_lint(
+ '''SOFT_LINK_FRAMEWORK_FOR_SOURCE_WITH_EXPORT(MyFramework)''',
+ 'Never soft-link frameworks in headers. Put the soft-link macros in a source file, or create MyFrameworkSoftLink.{cpp,mm} instead.'
+ ' [softlink/header] [5]',
+ file_name='foo.h')
+
# Variable-length arrays are not permitted.
def test_variable_length_array_detection(self):
errmsg = ('Do not use variable-length arrays. Use an appropriately named '