diff options
Diffstat (limited to 'Source/WebKit2/Scripts/webkit/messages.py')
-rw-r--r-- | Source/WebKit2/Scripts/webkit/messages.py | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/Source/WebKit2/Scripts/webkit/messages.py b/Source/WebKit2/Scripts/webkit/messages.py index b71df91b6..4b786fe62 100644 --- a/Source/WebKit2/Scripts/webkit/messages.py +++ b/Source/WebKit2/Scripts/webkit/messages.py @@ -1,4 +1,4 @@ -# Copyright (C) 2010, 2011 Apple Inc. All rights reserved. +# Copyright (C) 2010-2017 Apple Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -23,6 +23,7 @@ import collections import re import sys + from webkit import parser WANTS_CONNECTION_ATTRIBUTE = 'WantsConnection' @@ -168,11 +169,11 @@ def forward_declarations_for_namespace(namespace, kind_and_types): def forward_declarations_and_headers(receiver): types_by_namespace = collections.defaultdict(set) - headers = set([ - '"Arguments.h"', - '"MessageEncoder.h"', - '"StringReference.h"', - ]) + header_conditions = { + '"Arguments.h"' : [], + '"MessageEncoder.h"' : [], + '"StringReference.h"': [] + } non_template_wtf_types = frozenset([ 'String', @@ -180,38 +181,47 @@ def forward_declarations_and_headers(receiver): for message in receiver.messages: if message.reply_parameters != None and message.has_attribute(DELAYED_ATTRIBUTE): - headers.add('<wtf/ThreadSafeRefCounted.h>') + header_conditions['<wtf/ThreadSafeRefCounted.h>'] = [] types_by_namespace['IPC'].update([('class', 'Connection')]) + type_conditions = {} for parameter in receiver.iterparameters(): - kind = parameter.kind - type = parameter.type + if not parameter.type in type_conditions: + type_conditions[parameter.type] = [] - if type.find('<') != -1: - # Don't forward declare class templates. - headers.update(headers_for_type(type)) - continue + if not parameter.condition in type_conditions[parameter.type]: + type_conditions[parameter.type].append(parameter.condition) - split = type.split('::') + for parameter in receiver.iterparameters(): + type = parameter.type + conditions = type_conditions[type] - # Handle WTF types even if the WTF:: prefix is not given - if split[0] in non_template_wtf_types: - split.insert(0, 'WTF') + argument_encoder_headers = argument_coder_headers_for_type(type) + if argument_encoder_headers: + for header in argument_encoder_headers: + if header not in header_conditions: + header_conditions[header] = [] + header_conditions[header].extend(conditions) - if len(split) == 2: - namespace = split[0] - inner_type = split[1] - types_by_namespace[namespace].add((kind, inner_type)) - elif len(split) > 2: - # We probably have a nested struct, which means we can't forward declare it. - # Include its header instead. - headers.update(headers_for_type(type)) + type_headers = headers_for_type(type) + for header in type_headers: + if header not in header_conditions: + header_conditions[header] = [] + header_conditions[header].extend(conditions) forward_declarations = '\n'.join([forward_declarations_for_namespace(namespace, types) for (namespace, types) in sorted(types_by_namespace.items())]) - headers = ['#include %s\n' % header for header in sorted(headers)] + headers = [] + for header in sorted(header_conditions): + if header_conditions[header] and not None in header_conditions[header]: + headers.append('#if %s\n' % ' || '.join(set(header_conditions[header]))) + headers += ['#include %s\n' % header] + headers.append('#endif\n') + else: + headers += ['#include %s\n' % header] return (forward_declarations, headers) + def generate_messages_header(file): receiver = parser.parse(file) header_guard = messages_header_filename(receiver).replace('.', '_') @@ -302,7 +312,7 @@ def class_template_headers(template_string): match = re.match('(?P<template_name>.+?)<(?P<parameter_string>.+)>', template_string) if not match: - return {'header_infos':[], 'types':[template_string]} + return {'header_infos': [], 'types': [template_string]} template_name = match.groupdict()['template_name'] if template_name not in class_template_types: @@ -315,10 +325,10 @@ def class_template_headers(template_string): for parameter in parser.split_parameters_string(match.groupdict()['parameter_string']): parameter_header_infos_and_types = class_template_headers(parameter) - header_infos += parameter_header_infos_and_types['header_infos']; + header_infos += parameter_header_infos_and_types['header_infos'] types += parameter_header_infos_and_types['types'] - return {'header_infos':header_infos, 'types':types} + return {'header_infos': header_infos, 'types': types} def argument_coder_headers_for_type(type): @@ -346,6 +356,7 @@ def argument_coder_headers_for_type(type): return headers + def headers_for_type(type): header_infos_and_types = class_template_headers(type) @@ -402,6 +413,7 @@ def headers_for_type(type): return headers + def generate_message_handler(file): receiver = parser.parse(file) header_conditions = { @@ -452,7 +464,6 @@ def generate_message_handler(file): header_conditions[header] = [] header_conditions[header].append(message.condition) - result = [] result.append(_license_header) |