Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Web Inspector: the protocol generator should have separate prefix opt…
…ions for Objective-C classes and filenames

https://bugs.webkit.org/show_bug.cgi?id=155101
<rdar://problem/25000053>

Reviewed by Timothy Hatcher.

It should be possible to generate Objective-C protocol types without prefixing all class names.
The prefixes are only necessary when the generated files are part of a framework, but this isn't
how the generated Objective-C frontend files are used.

Add a separate framework setting and switch over code to use the 'protocol_group' in filenames,
and the 'objc_prefix' for Objective-C enum and class prefixes.

No tests need to be rebaselined because tests always set the protocol_group and objc_prefix
to the same value.

* inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py:
(ObjCBackendDispatcherHeaderGenerator.output_filename):
* inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py:
(ObjCConfigurationImplementationGenerator.output_filename):
(ObjCConfigurationImplementationGenerator.generate_output):
* inspector/scripts/codegen/generate_objc_configuration_header.py:
(ObjCConfigurationHeaderGenerator.output_filename):
(ObjCConfigurationHeaderGenerator.generate_output):
(ObjCConfigurationHeaderGenerator._generate_configuration_interface_for_domains):
* inspector/scripts/codegen/generate_objc_configuration_implementation.py:
(ObjCBackendDispatcherImplementationGenerator.output_filename):
(ObjCBackendDispatcherImplementationGenerator.generate_output):
(ObjCBackendDispatcherImplementationGenerator._generate_configuration_implementation_for_domains):
* inspector/scripts/codegen/generate_objc_conversion_helpers.py:
(ObjCConversionHelpersGenerator.output_filename):
* inspector/scripts/codegen/generate_objc_frontend_dispatcher_implementation.py:
(ObjCFrontendDispatcherImplementationGenerator.output_filename):
(ObjCFrontendDispatcherImplementationGenerator.generate_output):
* inspector/scripts/codegen/generate_objc_header.py:
(ObjCHeaderGenerator.output_filename):
* inspector/scripts/codegen/generate_objc_internal_header.py:
(ObjCInternalHeaderGenerator.output_filename):
(ObjCInternalHeaderGenerator.generate_output):
* inspector/scripts/codegen/generate_objc_protocol_types_implementation.py:
(ObjCProtocolTypesImplementationGenerator.output_filename):
(ObjCProtocolTypesImplementationGenerator.generate_output):
* inspector/scripts/codegen/models.py:
* inspector/scripts/codegen/objc_generator.py:
(ObjCGenerator):
(ObjCGenerator.protocol_name):
(ObjCGenerator.objc_prefix):

Canonical link: https://commits.webkit.org/173192@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@197658 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
burg committed Mar 7, 2016
1 parent c10a9db commit 249409e
Show file tree
Hide file tree
Showing 12 changed files with 89 additions and 27 deletions.
50 changes: 50 additions & 0 deletions Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,53 @@
2016-03-06 Brian Burg <bburg@apple.com>

Web Inspector: the protocol generator should have separate prefix options for Objective-C classes and filenames
https://bugs.webkit.org/show_bug.cgi?id=155101
<rdar://problem/25000053>

Reviewed by Timothy Hatcher.

It should be possible to generate Objective-C protocol types without prefixing all class names.
The prefixes are only necessary when the generated files are part of a framework, but this isn't
how the generated Objective-C frontend files are used.

Add a separate framework setting and switch over code to use the 'protocol_group' in filenames,
and the 'objc_prefix' for Objective-C enum and class prefixes.

No tests need to be rebaselined because tests always set the protocol_group and objc_prefix
to the same value.

* inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py:
(ObjCBackendDispatcherHeaderGenerator.output_filename):
* inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py:
(ObjCConfigurationImplementationGenerator.output_filename):
(ObjCConfigurationImplementationGenerator.generate_output):
* inspector/scripts/codegen/generate_objc_configuration_header.py:
(ObjCConfigurationHeaderGenerator.output_filename):
(ObjCConfigurationHeaderGenerator.generate_output):
(ObjCConfigurationHeaderGenerator._generate_configuration_interface_for_domains):
* inspector/scripts/codegen/generate_objc_configuration_implementation.py:
(ObjCBackendDispatcherImplementationGenerator.output_filename):
(ObjCBackendDispatcherImplementationGenerator.generate_output):
(ObjCBackendDispatcherImplementationGenerator._generate_configuration_implementation_for_domains):
* inspector/scripts/codegen/generate_objc_conversion_helpers.py:
(ObjCConversionHelpersGenerator.output_filename):
* inspector/scripts/codegen/generate_objc_frontend_dispatcher_implementation.py:
(ObjCFrontendDispatcherImplementationGenerator.output_filename):
(ObjCFrontendDispatcherImplementationGenerator.generate_output):
* inspector/scripts/codegen/generate_objc_header.py:
(ObjCHeaderGenerator.output_filename):
* inspector/scripts/codegen/generate_objc_internal_header.py:
(ObjCInternalHeaderGenerator.output_filename):
(ObjCInternalHeaderGenerator.generate_output):
* inspector/scripts/codegen/generate_objc_protocol_types_implementation.py:
(ObjCProtocolTypesImplementationGenerator.output_filename):
(ObjCProtocolTypesImplementationGenerator.generate_output):
* inspector/scripts/codegen/models.py:
* inspector/scripts/codegen/objc_generator.py:
(ObjCGenerator):
(ObjCGenerator.protocol_name):
(ObjCGenerator.objc_prefix):

2016-03-06 Brian Burg <bburg@apple.com>

Unreviewed, rebaseline inspector protocol generator tests after r197563.
Expand Down
Expand Up @@ -44,7 +44,7 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sBackendDispatchers.h' % self.objc_prefix()
return '%sBackendDispatchers.h' % self.protocol_name()

def domains_to_generate(self):
return filter(ObjCGenerator.should_generate_domain_command_handler_filter(self.model()), Generator.domains_to_generate(self))
Expand Down
Expand Up @@ -44,20 +44,20 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sBackendDispatchers.mm' % self.objc_prefix()
return '%sBackendDispatchers.mm' % self.protocol_name()

def domains_to_generate(self):
return filter(ObjCGenerator.should_generate_domain_command_handler_filter(self.model()), Generator.domains_to_generate(self))

def generate_output(self):
secondary_headers = [
'"%sInternal.h"' % self.objc_prefix(),
'"%sEnumConversionHelpers.h"' % self.objc_prefix(),
'"%sInternal.h"' % self.protocol_name(),
'"%sEnumConversionHelpers.h"' % self.protocol_name(),
'<JavaScriptCore/InspectorValues.h>',
]

header_args = {
'primaryInclude': '"%sBackendDispatchers.h"' % self.objc_prefix(),
'primaryInclude': '"%sBackendDispatchers.h"' % self.protocol_name(),
'secondaryIncludes': '\n'.join(['#include %s' % header for header in secondary_headers]),
}

Expand Down
Expand Up @@ -41,11 +41,11 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sConfiguration.h' % self.objc_prefix()
return '%sConfiguration.h' % self.protocol_name()

def generate_output(self):
headers = [
'<WebInspector/%s.h>' % self.objc_prefix(),
'<WebInspector/%s.h>' % self.protocol_name(),
]

header_args = {
Expand All @@ -66,7 +66,7 @@ def generate_output(self):
def _generate_configuration_interface_for_domains(self, domains):
lines = []
lines.append('__attribute__((visibility ("default")))')
lines.append('@interface %sConfiguration : NSObject' % self.objc_prefix())
lines.append('@interface %sConfiguration : NSObject' % self.protocol_name())
for domain in domains:
lines.extend(self._generate_properties_for_domain(domain))
lines.append('@end')
Expand Down
Expand Up @@ -41,20 +41,20 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sConfiguration.mm' % self.objc_prefix()
return '%sConfiguration.mm' % self.protocol_name()

def generate_output(self):
secondary_headers = [
'"%sInternal.h"' % self.objc_prefix(),
'"%sBackendDispatchers.h"' % self.objc_prefix(),
'"%sInternal.h"' % self.protocol_name(),
'"%sBackendDispatchers.h"' % self.protocol_name(),
'<JavaScriptCore/AlternateDispatchableAgent.h>',
'<JavaScriptCore/AugmentableInspectorController.h>',
'<JavaScriptCore/InspectorAlternateBackendDispatchers.h>',
'<JavaScriptCore/InspectorBackendDispatchers.h>',
]

header_args = {
'primaryInclude': '"%sConfiguration.h"' % self.objc_prefix(),
'primaryInclude': '"%sConfiguration.h"' % self.protocol_name(),
'secondaryIncludes': '\n'.join(['#import %s' % header for header in secondary_headers]),
}

Expand All @@ -71,7 +71,7 @@ def generate_output(self):

def _generate_configuration_implementation_for_domains(self, domains):
lines = []
lines.append('@implementation %sConfiguration' % self.objc_prefix())
lines.append('@implementation %sConfiguration' % self.protocol_name())
lines.append('{')
lines.append(' AugmentableInspectorController* _controller;')
lines.extend(self._generate_ivars(domains))
Expand Down
Expand Up @@ -48,7 +48,7 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sEnumConversionHelpers.h' % self.objc_prefix()
return '%sEnumConversionHelpers.h' % self.protocol_name()

def domains_to_generate(self):
return filter(ObjCGenerator.should_generate_domain_types_filter(self.model()), Generator.domains_to_generate(self))
Expand Down
Expand Up @@ -42,19 +42,19 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sEventDispatchers.mm' % self.objc_prefix()
return '%sEventDispatchers.mm' % self.protocol_name()

def domains_to_generate(self):
return filter(ObjCGenerator.should_generate_domain_event_dispatcher_filter(self.model()), Generator.domains_to_generate(self))

def generate_output(self):
secondary_headers = [
'"%sEnumConversionHelpers.h"' % self.objc_prefix(),
'"%sEnumConversionHelpers.h"' % self.protocol_name(),
'<JavaScriptCore/InspectorValues.h>',
]

header_args = {
'primaryInclude': '"%sInternal.h"' % self.objc_prefix(),
'primaryInclude': '"%sInternal.h"' % self.protocol_name(),
'secondaryIncludes': '\n'.join(['#import %s' % header for header in secondary_headers]),
}

Expand Down
Expand Up @@ -48,7 +48,7 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%s.h' % self.objc_prefix()
return '%s.h' % self.protocol_name()

def generate_output(self):
headers = set([
Expand Down
Expand Up @@ -41,12 +41,12 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sInternal.h' % self.objc_prefix()
return '%sInternal.h' % self.protocol_name()

def generate_output(self):
headers = set([
'"%s.h"' % self.objc_prefix(),
'"%sJSONObjectPrivate.h"' % self.objc_prefix(),
'"%s.h"' % self.protocol_name(),
'"%sJSONObjectPrivate.h"' % self.protocol_name(),
'<JavaScriptCore/InspectorValues.h>',
'<JavaScriptCore/AugmentableInspectorController.h>',
])
Expand Down
Expand Up @@ -48,21 +48,21 @@ def __init__(self, model, input_filepath):
ObjCGenerator.__init__(self, model, input_filepath)

def output_filename(self):
return '%sTypes.mm' % self.objc_prefix()
return '%sTypes.mm' % self.protocol_name()

def domains_to_generate(self):
return filter(ObjCGenerator.should_generate_domain_types_filter(self.model()), Generator.domains_to_generate(self))

def generate_output(self):
secondary_headers = [
'"%sEnumConversionHelpers.h"' % self.objc_prefix(),
'"%sEnumConversionHelpers.h"' % self.protocol_name(),
Generator.string_for_file_include('%sJSONObjectPrivate.h' % ObjCGenerator.OBJC_STATIC_PREFIX, Frameworks.WebInspector, self.model().framework),
'<JavaScriptCore/InspectorValues.h>',
'<wtf/Assertions.h>',
]

# The FooProtocolInternal.h header is only needed to declare the backend-side event dispatcher bindings.
primaryIncludeName = self.objc_prefix()
primaryIncludeName = self.protocol_name()
if self.get_generator_setting('generate_backend', False):
primaryIncludeName += 'Internal'

Expand Down
4 changes: 3 additions & 1 deletion Source/JavaScriptCore/inspector/scripts/codegen/models.py
Expand Up @@ -46,14 +46,16 @@ def find_duplicates(l):
"alternate_dispatchers": True,
},
"WebKit": {
"objc_prefix": "Automation",
"protocol_group": "Automation",
},
"WebInspector": {
"protocol_group": "RWI",
"objc_prefix": "RWI",
},
# Used for code generator tests.
"Test": {
"alternate_dispatchers": True,
"protocol_group": "Test",
"objc_prefix": "Test",
}
}
Expand Down
14 changes: 12 additions & 2 deletions Source/JavaScriptCore/inspector/scripts/codegen/objc_generator.py
Expand Up @@ -92,9 +92,19 @@ class ObjCGenerator(Generator):
def __init__(self, model, input_filepath):
Generator.__init__(self, model, input_filepath)

# The 'protocol name' is used to prefix filenames for a protocol group (a set of domains generated together).
def protocol_name(self):
protocol_group = self.model().framework.setting('protocol_group', '')
return '%s%s' % (protocol_group, ObjCGenerator.OBJC_SHARED_PREFIX)

# The 'ObjC prefix' is used to prefix Objective-C class names and enums with a
# framework-specific prefix. It is separate from filename prefixes.
def objc_prefix(self):
framework_prefix = self.model().framework.setting('objc_prefix', '')
return '%s%s' % (framework_prefix, ObjCGenerator.OBJC_SHARED_PREFIX)
framework_prefix = self.model().framework.setting('objc_prefix', None)
if not framework_prefix:
return ''
else:
return '%s%s' % (framework_prefix, ObjCGenerator.OBJC_SHARED_PREFIX)

# Adjust identifier names that collide with ObjC keywords.

Expand Down

0 comments on commit 249409e

Please sign in to comment.