blob: 22742151994f243f4ed13bc76fa8a6b57755a532 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (c) 2014 Apple Inc. All rights reserved.
# Copyright (c) 2014 University of Washington. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.
# Generator templates, which can be filled with string.Template.
# Following are classes that fill the templates from the typechecked model.
class ObjCGeneratorTemplates:
HeaderPrelude = (
"""#import <Foundation/Foundation.h>
${includes}
""")
HeaderPostlude = (
"""
${includes}
""")
TypeConversionsHeaderPrelude = (
"""${includes}
namespace Inspector {""")
TypeConversionsHeaderPostlude = (
"""} // namespace Inspector
""")
GenericHeaderPrelude = (
"""${includes}""")
GenericHeaderPostlude = (
"""""")
TypeConversionsHeaderStandard = (
"""template<typename ObjCEnumType>
Optional<ObjCEnumType> fromProtocolString(const String& value);""")
BackendDispatcherHeaderPrelude = (
"""${includes}
${forwardDeclarations}
namespace Inspector {
""")
BackendDispatcherHeaderPostlude = (
"""} // namespace Inspector
""")
BackendDispatcherImplementationPrelude = (
"""#import "config.h"
#import ${primaryInclude}
${secondaryIncludes}
namespace Inspector {""")
BackendDispatcherImplementationPostlude = (
"""} // namespace Inspector
""")
ImplementationPrelude = (
"""#import ${primaryInclude}
${secondaryIncludes}
using namespace Inspector;""")
ImplementationPostlude = (
"""""")
BackendDispatcherHeaderDomainHandlerInterfaceDeclaration = (
"""class Alternate${domainName}BackendDispatcher : public AlternateBackendDispatcher {
public:
virtual ~Alternate${domainName}BackendDispatcher() { }
${commandDeclarations}
};""")
BackendDispatcherHeaderDomainHandlerObjCDeclaration = (
"""class ObjCInspector${domainName}BackendDispatcher final : public Alternate${domainName}BackendDispatcher {
WTF_MAKE_FAST_ALLOCATED;
public:
ObjCInspector${domainName}BackendDispatcher(id<${objcPrefix}${domainName}DomainHandler> handler) { m_delegate = handler; }
${commandDeclarations}
private:
RetainPtr<id<${objcPrefix}${domainName}DomainHandler>> m_delegate;
};""")
BackendDispatcherHeaderDomainHandlerImplementation = (
"""void ObjCInspector${domainName}BackendDispatcher::${commandName}(${parameters})
{
if (!${respondsToSelector}) {
backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::MethodNotFound, "'${domainName}.${commandName}' was not found"_s);
backendDispatcher()->sendPendingErrors();
return;
}
id errorCallback = ^(NSString *error) {
backendDispatcher()->reportProtocolError(requestId, BackendDispatcher::ServerError, error);
backendDispatcher()->sendPendingErrors();
};
${successCallback}
${conversions}
${invocation}
}
""")
ConfigurationCommandProperty = (
"""@property (nonatomic, retain, setter=set${domainName}Handler:) id<${objcPrefix}${domainName}DomainHandler> ${variableNamePrefix}Handler;""")
ConfigurationEventProperty = (
"""@property (nonatomic, readonly) ${objcPrefix}${domainName}DomainEventDispatcher *${variableNamePrefix}EventDispatcher;""")
ConfigurationCommandPropertyImplementation = (
"""- (void)set${domainName}Handler:(id<${objcPrefix}${domainName}DomainHandler>)handler
{
if (handler == _${variableNamePrefix}Handler)
return;
[_${variableNamePrefix}Handler release];
_${variableNamePrefix}Handler = [handler retain];
auto alternateDispatcher = makeUnique<ObjCInspector${domainName}BackendDispatcher>(handler);
auto alternateAgent = makeUnique<AlternateDispatchableAgent<${domainName}BackendDispatcher, Alternate${domainName}BackendDispatcher>>("${domainName}"_s, *_controller, WTFMove(alternateDispatcher));
_controller->appendExtraAgent(WTFMove(alternateAgent));
}
- (id<${objcPrefix}${domainName}DomainHandler>)${variableNamePrefix}Handler
{
return _${variableNamePrefix}Handler;
}""")
ConfigurationGetterImplementation = (
"""- (${objcPrefix}${domainName}DomainEventDispatcher *)${variableNamePrefix}EventDispatcher
{
if (!_${variableNamePrefix}EventDispatcher)
_${variableNamePrefix}EventDispatcher = [[${objcPrefix}${domainName}DomainEventDispatcher alloc] initWithController:_controller];
return _${variableNamePrefix}EventDispatcher;
}""")