Skip to content

Commit

Permalink
Merge r228196 - Web Inspector: protocol generator should automaticall…
Browse files Browse the repository at this point in the history
…y deduce the correct include style to use

https://bugs.webkit.org/show_bug.cgi?id=182505

Reviewed by Timothy Hatcher.

Currently the generated imports use a mix of system header imports (powered by forwarding headers)
and framework-style includes. Since forwarding headers are going away, this patch stops
using system header includes for headers that are JavaScriptCore private headers. Instead,
use either a relative include or a framework include.

* inspector/scripts/codegen/generate_cpp_alternate_backend_dispatcher_header.py:
(CppAlternateBackendDispatcherHeaderGenerator.generate_output):
(CppAlternateBackendDispatcherHeaderGenerator):
(CppAlternateBackendDispatcherHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py:
(CppBackendDispatcherHeaderGenerator.generate_output):
(CppBackendDispatcherHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py:
(CppBackendDispatcherImplementationGenerator.generate_output):
(CppBackendDispatcherImplementationGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_frontend_dispatcher_header.py:
(CppFrontendDispatcherHeaderGenerator.generate_output):
(CppFrontendDispatcherHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_frontend_dispatcher_implementation.py:
(CppFrontendDispatcherImplementationGenerator.generate_output):
(CppFrontendDispatcherImplementationGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_protocol_types_header.py:
(CppProtocolTypesHeaderGenerator.generate_output):
(CppProtocolTypesHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_protocol_types_implementation.py:
(CppProtocolTypesImplementationGenerator.generate_output):
(CppProtocolTypesImplementationGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py:
(ObjCBackendDispatcherHeaderGenerator):
Convert existing header lists to the new entries format, which includes the
allowable target frameworks and the relative path to the header.

* inspector/scripts/codegen/generator.py:
(Generator.generate_includes_from_entries):
Copied from the same in the builtins code generator. It still works great.

* inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
* inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
* inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/generic/expected/domain-availability.json-result:
* inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result:
* inspector/scripts/tests/generic/expected/enum-values.json-result:
* inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
* inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
* inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result:
* inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
* inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
* inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result:
* inspector/scripts/tests/generic/expected/worker-supported-domains.json-result:
* inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
Rebaseline.
  • Loading branch information
burg authored and carlosgcampos committed Feb 19, 2018
1 parent 79c9811 commit 7871337
Show file tree
Hide file tree
Showing 30 changed files with 261 additions and 143 deletions.
65 changes: 65 additions & 0 deletions Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,68 @@
2018-02-06 Brian Burg <bburg@apple.com>

Web Inspector: protocol generator should automatically deduce the correct include style to use
https://bugs.webkit.org/show_bug.cgi?id=182505

Reviewed by Timothy Hatcher.

Currently the generated imports use a mix of system header imports (powered by forwarding headers)
and framework-style includes. Since forwarding headers are going away, this patch stops
using system header includes for headers that are JavaScriptCore private headers. Instead,
use either a relative include or a framework include.

* inspector/scripts/codegen/generate_cpp_alternate_backend_dispatcher_header.py:
(CppAlternateBackendDispatcherHeaderGenerator.generate_output):
(CppAlternateBackendDispatcherHeaderGenerator):
(CppAlternateBackendDispatcherHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py:
(CppBackendDispatcherHeaderGenerator.generate_output):
(CppBackendDispatcherHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py:
(CppBackendDispatcherImplementationGenerator.generate_output):
(CppBackendDispatcherImplementationGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_frontend_dispatcher_header.py:
(CppFrontendDispatcherHeaderGenerator.generate_output):
(CppFrontendDispatcherHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_frontend_dispatcher_implementation.py:
(CppFrontendDispatcherImplementationGenerator.generate_output):
(CppFrontendDispatcherImplementationGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_protocol_types_header.py:
(CppProtocolTypesHeaderGenerator.generate_output):
(CppProtocolTypesHeaderGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_cpp_protocol_types_implementation.py:
(CppProtocolTypesImplementationGenerator.generate_output):
(CppProtocolTypesImplementationGenerator._generate_secondary_header_includes):
* inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py:
(ObjCBackendDispatcherHeaderGenerator):
Convert existing header lists to the new entries format, which includes the
allowable target frameworks and the relative path to the header.

* inspector/scripts/codegen/generator.py:
(Generator.generate_includes_from_entries):
Copied from the same in the builtins code generator. It still works great.

* inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
* inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
* inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/generic/expected/domain-availability.json-result:
* inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result:
* inspector/scripts/tests/generic/expected/enum-values.json-result:
* inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
* inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
* inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result:
* inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result:
* inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
* inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
* inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result:
* inspector/scripts/tests/generic/expected/worker-supported-domains.json-result:
* inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result:
* inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
Rebaseline.

2018-02-06 Keith Miller <keith_miller@apple.com>

put_to_scope/get_from_scope should not cache lexical scopes when expecting a global object
Expand Down
Expand Up @@ -44,24 +44,30 @@ def output_filename(self):
return '%sAlternateBackendDispatchers.h' % self.protocol_name()

def generate_output(self):
headers = [
'"%sProtocolTypes.h"' % self.protocol_name(),
'<inspector/InspectorFrontendRouter.h>',
'<JavaScriptCore/InspectorBackendDispatcher.h>',
]

header_args = {
'includes': '\n'.join(['#include ' + header for header in headers]),
template_args = {
'includes': self._generate_secondary_header_includes()
}

domains = self.domains_to_generate()
sections = []
sections.append(self.generate_license())
sections.append(Template(CppTemplates.AlternateDispatchersHeaderPrelude).substitute(None, **header_args))
sections.append(Template(CppTemplates.AlternateDispatchersHeaderPrelude).substitute(None, **template_args))
sections.append('\n'.join(filter(None, map(self._generate_handler_declarations_for_domain, domains))))
sections.append(Template(CppTemplates.AlternateDispatchersHeaderPostlude).substitute(None, **header_args))
sections.append(Template(CppTemplates.AlternateDispatchersHeaderPostlude).substitute(None, **template_args))
return '\n\n'.join(sections)

# Private methods.

def _generate_secondary_header_includes(self):
target_framework_name = self.model().framework.name
header_includes = [
([target_framework_name], (target_framework_name, "%sProtocolTypes.h" % self.protocol_name())),
(["JavaScriptCore"], ("JavaScriptCore", "inspector/InspectorFrontendRouter.h")),
(["JavaScriptCore"], ("JavaScriptCore", "inspector/InspectorBackendDispatcher.h")),
]

return '\n'.join(self.generate_includes_from_entries(header_includes))

def _generate_handler_declarations_for_domain(self, domain):
commands = self.commands_for_domain(domain)

Expand Down
Expand Up @@ -49,15 +49,9 @@ def domains_to_generate(self):
return filter(lambda domain: len(self.commands_for_domain(domain)) > 0, Generator.domains_to_generate(self))

def generate_output(self):
headers = [
'"%sProtocolObjects.h"' % self.protocol_name(),
'<inspector/InspectorBackendDispatcher.h>',
'<wtf/text/WTFString.h>']

typedefs = [('String', 'ErrorString')]

header_args = {
'includes': '\n'.join(['#include ' + header for header in headers]),
'includes': self._generate_secondary_header_includes(),
'typedefs': '\n'.join(['typedef %s %s;' % typedef for typedef in typedefs]),
}

Expand All @@ -75,6 +69,15 @@ def generate_output(self):

# Private methods.

def _generate_secondary_header_includes(self):
header_includes = [
(["JavaScriptCore", "WebKit"], (self.model().framework.name, "%sProtocolObjects.h" % self.protocol_name())),
(["JavaScriptCore", "WebKit"], ("JavaScriptCore", "inspector/InspectorBackendDispatcher.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/text/WTFString.h"))
]

return '\n'.join(self.generate_includes_from_entries(header_includes))

def _generate_alternate_handler_forward_declarations_for_domains(self, domains):
if not domains:
return ''
Expand Down
Expand Up @@ -48,13 +48,7 @@ def domains_to_generate(self):
return filter(lambda domain: len(self.commands_for_domain(domain)) > 0, Generator.domains_to_generate(self))

def generate_output(self):
secondary_headers = [
'<inspector/InspectorFrontendRouter.h>',
'<wtf/JSONValues.h>',
'<wtf/NeverDestroyed.h>',
'<wtf/text/CString.h>']

secondary_includes = ['#include %s' % header for header in secondary_headers]
secondary_includes = self._generate_secondary_header_includes()

if self.model().framework.setting('alternate_dispatchers', False):
secondary_includes.append('')
Expand All @@ -77,6 +71,17 @@ def generate_output(self):

# Private methods.

def _generate_secondary_header_includes(self):
header_includes = [
(["JavaScriptCore", "WebKit"], ("JavaScriptCore", "inspector/InspectorFrontendRouter.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/JSONValues.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/NeverDestroyed.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/text/CString.h"))
]

return self.generate_includes_from_entries(header_includes)


def _generate_handler_class_destructor_for_domain(self, domain):
destructor_args = {
'domainName': domain.domain_name
Expand Down
Expand Up @@ -49,13 +49,8 @@ def domains_to_generate(self):
return filter(lambda domain: len(self.events_for_domain(domain)) > 0, Generator.domains_to_generate(self))

def generate_output(self):
headers = [
'"%sProtocolObjects.h"' % self.protocol_name(),
'<wtf/JSONValues.h>',
'<wtf/text/WTFString.h>']

header_args = {
'includes': '\n'.join(['#include ' + header for header in headers]),
'includes': self._generate_secondary_header_includes(),
'typedefs': 'class FrontendRouter;',
}

Expand All @@ -68,6 +63,15 @@ def generate_output(self):

# Private methods.

def _generate_secondary_header_includes(self):
header_includes = [
(["JavaScriptCore", "WebKit"], (self.model().framework.name, "%sProtocolObjects.h" % self.protocol_name())),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/JSONValues.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/text/WTFString.h"))
]

return '\n'.join(self.generate_includes_from_entries(header_includes))

def _generate_anonymous_enum_for_parameter(self, parameter, event):
enum_args = {
'parameterName': parameter.parameter_name,
Expand Down
Expand Up @@ -48,14 +48,9 @@ def domains_to_generate(self):
return filter(lambda domain: len(self.events_for_domain(domain)) > 0, Generator.domains_to_generate(self))

def generate_output(self):
secondary_headers = [
'<inspector/InspectorFrontendRouter.h>',
'<wtf/text/CString.h>',
]

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

sections = []
Expand All @@ -67,6 +62,14 @@ def generate_output(self):

# Private methods.

def _generate_secondary_header_includes(self):
header_includes = [
(["JavaScriptCore", "WebKit"], ("JavaScriptCore", "inspector/InspectorFrontendRouter.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/text/CString.h"))
]

return '\n'.join(self.generate_includes_from_entries(header_includes))

def _generate_dispatcher_implementations_for_domain(self, domain):
implementations = []
events = self.events_for_domain(domain)
Expand Down
Expand Up @@ -50,13 +50,8 @@ def generate_output(self):
domains = self.domains_to_generate()
self.calculate_types_requiring_shape_assertions(domains)

headers = set([
'<inspector/InspectorProtocolTypes.h>',
'<wtf/Assertions.h>',
])

header_args = {
'includes': '\n'.join(['#include ' + header for header in sorted(headers)]),
'includes': self._generate_secondary_header_includes(),
'typedefs': '',
}

Expand All @@ -79,6 +74,14 @@ def generate_output(self):

# FIXME: move builders out of classes, uncomment forward declaration

def _generate_secondary_header_includes(self):
header_includes = [
(["JavaScriptCore", "WebKit"], ("JavaScriptCore", "inspector/InspectorProtocolTypes.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/Assertions.h"))
]

return '\n'.join(self.generate_includes_from_entries(header_includes))

def _generate_forward_declarations(self, domains):
sections = []

Expand Down
Expand Up @@ -56,7 +56,7 @@ def generate_output(self):

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

sections = []
Expand All @@ -74,6 +74,14 @@ def generate_output(self):

# Private methods.

def _generate_secondary_header_includes(self):
header_includes = [
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/Optional.h")),
(["JavaScriptCore", "WebKit"], ("WTF", "wtf/text/CString.h")),
]

return '\n'.join(self.generate_includes_from_entries(header_includes))

def _generate_enum_mapping(self):
if not self.assigned_enum_values():
return []
Expand Down
Expand Up @@ -68,6 +68,8 @@ def generate_output(self):
sections.append(Template(ObjCTemplates.BackendDispatcherHeaderPostlude).substitute(None, **header_args))
return '\n\n'.join(sections)

# Private methods.

def _generate_objc_forward_declarations(self):
lines = []
for domain in self.domains_to_generate():
Expand Down
19 changes: 19 additions & 0 deletions Source/JavaScriptCore/inspector/scripts/codegen/generator.py
Expand Up @@ -119,6 +119,25 @@ def get_generator_setting(self, key, default=None):
def generate_license(self):
return Template(Templates.CopyrightBlock).substitute(None, inputFilename=os.path.basename(self._input_filepath))

def generate_includes_from_entries(self, entries):
includes = set()
for entry in entries:
(allowed_framework_names, data) = entry
(framework_name, header_path) = data

allowed_frameworks = allowed_framework_names + ["Test"]
if self.model().framework.name not in allowed_frameworks:
continue

if framework_name == "WTF":
includes.add("#include <%s>" % header_path)
elif self.model().framework.name != framework_name:
includes.add("#include <%s/%s>" % (framework_name, os.path.basename(header_path)))
else:
includes.add("#include \"%s\"" % os.path.basename(header_path))

return sorted(list(includes))

# These methods are overridden by subclasses.
def non_supplemental_domains(self):
return filter(lambda domain: not domain.is_supplemental, self.model().domains)
Expand Down
Expand Up @@ -72,8 +72,8 @@ InspectorBackend.activateDomain("Network");
#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)

#include "TestProtocolTypes.h"
#include <inspector/InspectorFrontendRouter.h>
#include <JavaScriptCore/InspectorBackendDispatcher.h>
#include <JavaScriptCore/InspectorFrontendRouter.h>

namespace Inspector {

Expand Down Expand Up @@ -131,7 +131,7 @@ public:
#pragma once

#include "TestProtocolObjects.h"
#include <inspector/InspectorBackendDispatcher.h>
#include <JavaScriptCore/InspectorBackendDispatcher.h>
#include <wtf/text/WTFString.h>

namespace Inspector {
Expand Down Expand Up @@ -203,7 +203,7 @@ private:
#include "config.h"
#include "TestBackendDispatchers.h"

#include <inspector/InspectorFrontendRouter.h>
#include <JavaScriptCore/InspectorFrontendRouter.h>
#include <wtf/JSONValues.h>
#include <wtf/NeverDestroyed.h>
#include <wtf/text/CString.h>
Expand Down Expand Up @@ -350,7 +350,7 @@ private:
#include "config.h"
#include "TestFrontendDispatchers.h"

#include <inspector/InspectorFrontendRouter.h>
#include <JavaScriptCore/InspectorFrontendRouter.h>
#include <wtf/text/CString.h>

namespace Inspector {
Expand Down Expand Up @@ -400,7 +400,7 @@ void NetworkFrontendDispatcher::resourceLoaded()

#pragma once

#include <inspector/InspectorProtocolTypes.h>
#include <JavaScriptCore/InspectorProtocolTypes.h>
#include <wtf/Assertions.h>

namespace Inspector {
Expand Down

0 comments on commit 7871337

Please sign in to comment.