| Index: core/inspector/CodeGeneratorInspector.py
|
| diff --git a/core/inspector/CodeGeneratorInspector.py b/core/inspector/CodeGeneratorInspector.py
|
| index 481682bcfeca44359f3c2c621361b87cc2f1774f..4c817968f7c51a01b16ec31025e60e8eeba77f83 100755
|
| --- a/core/inspector/CodeGeneratorInspector.py
|
| +++ b/core/inspector/CodeGeneratorInspector.py
|
| @@ -226,7 +226,11 @@ class RawTypes(object):
|
|
|
| @classmethod
|
| def get_raw_validator_call_text(cls):
|
| - return "RuntimeCastHelper::assertType<InspectorValue::Type%s>" % cls.get_validate_method_params().template_type
|
| + return "RuntimeCastHelper::assertType<JSONValue::Type%s>" % cls.get_validate_method_params().template_type
|
| +
|
| + @staticmethod
|
| + def get_validate_method_params():
|
| + raise Exception("Abstract method")
|
|
|
| class String(BaseType):
|
| @staticmethod
|
| @@ -236,6 +240,10 @@ class RawTypes(object):
|
| get_setter_name = get_getter_name
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + return "InspectorString::create(%s)"
|
| +
|
| + @staticmethod
|
| def get_c_initializer():
|
| return "\"\""
|
|
|
| @@ -271,6 +279,10 @@ class RawTypes(object):
|
| return "Number"
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + return "InspectorBasicValue::create(%s)"
|
| +
|
| + @staticmethod
|
| def get_c_initializer():
|
| return "0"
|
|
|
| @@ -304,6 +316,10 @@ class RawTypes(object):
|
| return "Number"
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + return "InspectorBasicValue::create(%s)"
|
| +
|
| + @staticmethod
|
| def get_c_initializer():
|
| return "0"
|
|
|
| @@ -337,6 +353,10 @@ class RawTypes(object):
|
| get_setter_name = get_getter_name
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + return "InspectorBasicValue::create(%s)"
|
| +
|
| + @staticmethod
|
| def get_c_initializer():
|
| return "false"
|
|
|
| @@ -372,8 +392,12 @@ class RawTypes(object):
|
| return "Value"
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + return "%s"
|
| +
|
| + @staticmethod
|
| def get_c_initializer():
|
| - return "InspectorObject::create()"
|
| + return "JSONObject::create()"
|
|
|
| @staticmethod
|
| def get_output_argument_prefix():
|
| @@ -395,7 +419,7 @@ class RawTypes(object):
|
|
|
| @staticmethod
|
| def get_array_item_raw_c_type_text():
|
| - return "InspectorObject"
|
| + return "JSONObject"
|
|
|
| @staticmethod
|
| def get_raw_type_model():
|
| @@ -413,6 +437,10 @@ class RawTypes(object):
|
| raise Exception("Unsupported")
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + raise Exception("Unsupported")
|
| +
|
| + @staticmethod
|
| def get_raw_validator_call_text():
|
| return "RuntimeCastHelper::assertAny"
|
|
|
| @@ -426,7 +454,7 @@ class RawTypes(object):
|
|
|
| @staticmethod
|
| def get_array_item_raw_c_type_text():
|
| - return "InspectorValue"
|
| + return "JSONValue"
|
|
|
| @staticmethod
|
| def get_raw_type_model():
|
| @@ -442,8 +470,12 @@ class RawTypes(object):
|
| return "Value"
|
|
|
| @staticmethod
|
| + def get_constructor_pattern():
|
| + return "%s"
|
| +
|
| + @staticmethod
|
| def get_c_initializer():
|
| - return "InspectorArray::create()"
|
| + return "JSONArray::create()"
|
|
|
| @staticmethod
|
| def get_output_argument_prefix():
|
| @@ -465,7 +497,7 @@ class RawTypes(object):
|
|
|
| @staticmethod
|
| def get_array_item_raw_c_type_text():
|
| - return "InspectorArray"
|
| + return "JSONArray"
|
|
|
| @staticmethod
|
| def get_raw_type_model():
|
| @@ -662,14 +694,14 @@ class TypeModel:
|
| cls.Int = cls.ValueType("int", False)
|
| cls.Number = cls.ValueType("double", False)
|
| cls.String = cls.ValueType("String", True,)
|
| - cls.Object = cls.RefPtrBased("InspectorObject")
|
| - cls.Array = cls.RefPtrBased("InspectorArray")
|
| - cls.Any = cls.RefPtrBased("InspectorValue")
|
| + cls.Object = cls.RefPtrBased("JSONObject")
|
| + cls.Array = cls.RefPtrBased("JSONArray")
|
| + cls.Any = cls.RefPtrBased("JSONValue")
|
|
|
| TypeModel.init_class()
|
|
|
|
|
| -# Collection of InspectorObject class methods that are likely to be overloaded in generated class.
|
| +# Collection of JSONObject class methods that are likely to be overloaded in generated class.
|
| # We must explicitly import all overloaded methods or they won't be available to user.
|
| INSPECTOR_OBJECT_SETTER_NAMES = frozenset(["setValue", "setBoolean", "setNumber", "setString", "setValue", "setObject", "setArray"])
|
|
|
| @@ -865,14 +897,14 @@ class TypeBindings:
|
|
|
| if enum_binding_cls.need_internal_runtime_cast_:
|
| writer.append("#if %s\n" % VALIDATOR_IFDEF_NAME)
|
| - writer.newline(" static void assertCorrectValue(InspectorValue* value);\n")
|
| + writer.newline(" static void assertCorrectValue(JSONValue* value);\n")
|
| writer.append("#endif // %s\n" % VALIDATOR_IFDEF_NAME)
|
|
|
| validator_writer = generate_context.validator_writer
|
|
|
| domain_fixes = DomainNameFixes.get_fixed_data(context_domain_name)
|
|
|
| - validator_writer.newline("void %s%s::assertCorrectValue(InspectorValue* value)\n" % (helper.full_name_prefix_for_impl, enum_name))
|
| + validator_writer.newline("void %s%s::assertCorrectValue(JSONValue* value)\n" % (helper.full_name_prefix_for_impl, enum_name))
|
| validator_writer.newline("{\n")
|
| validator_writer.newline(" WTF::String s;\n")
|
| validator_writer.newline(" bool cast_res = value->asString(&s);\n")
|
| @@ -1018,7 +1050,7 @@ class TypeBindings:
|
|
|
| @classmethod
|
| def get_array_item_c_type_text(cls):
|
| - return "const %s%s&" % (helper.full_name_prefix_for_use, fixed_type_name.class_name)
|
| + return "%s%s" % (helper.full_name_prefix_for_use, fixed_type_name.class_name)
|
|
|
| return TypedefString
|
|
|
| @@ -1103,9 +1135,9 @@ class TypeBindings:
|
| writer.append(class_name)
|
| writer.append(" : public ")
|
| if is_open_type:
|
| - writer.append("InspectorObject")
|
| + writer.append("JSONObject")
|
| else:
|
| - writer.append("InspectorObjectBase")
|
| + writer.append("JSONObjectBase")
|
| writer.append(" {\n")
|
| writer.newline("public:\n")
|
| ad_hoc_type_writer = writer.insert_writer(" ")
|
| @@ -1182,25 +1214,25 @@ class TypeBindings:
|
|
|
|
|
| if setter_name in INSPECTOR_OBJECT_SETTER_NAMES:
|
| - writer.newline(" using InspectorObjectBase::%s;\n\n" % setter_name)
|
| + writer.newline(" using JSONObjectBase::%s;\n\n" % setter_name)
|
|
|
| if class_binding_cls.need_user_runtime_cast_:
|
| - writer.newline(" static PassRefPtr<%s> runtimeCast(PassRefPtr<InspectorValue> value)\n" % class_name)
|
| + writer.newline(" static PassRefPtr<%s> runtimeCast(PassRefPtr<JSONValue> value)\n" % class_name)
|
| writer.newline(" {\n")
|
| - writer.newline(" RefPtr<InspectorObject> object;\n")
|
| + writer.newline(" RefPtr<JSONObject> object;\n")
|
| writer.newline(" bool castRes = value->asObject(&object);\n")
|
| writer.newline(" ASSERT_UNUSED(castRes, castRes);\n")
|
| writer.append("#if %s\n" % VALIDATOR_IFDEF_NAME)
|
| writer.newline(" assertCorrectValue(object.get());\n")
|
| writer.append("#endif // %s\n" % VALIDATOR_IFDEF_NAME)
|
| - writer.newline(" COMPILE_ASSERT(sizeof(%s) == sizeof(InspectorObjectBase), type_cast_problem);\n" % class_name)
|
| - writer.newline(" return static_cast<%s*>(static_cast<InspectorObjectBase*>(object.get()));\n" % class_name)
|
| + writer.newline(" COMPILE_ASSERT(sizeof(%s) == sizeof(JSONObjectBase), type_cast_problem);\n" % class_name)
|
| + writer.newline(" return static_cast<%s*>(static_cast<JSONObjectBase*>(object.get()));\n" % class_name)
|
| writer.newline(" }\n")
|
| writer.append("\n")
|
|
|
| if class_binding_cls.need_internal_runtime_cast_:
|
| writer.append("#if %s\n" % VALIDATOR_IFDEF_NAME)
|
| - writer.newline(" static void assertCorrectValue(InspectorValue* value);\n")
|
| + writer.newline(" static void assertCorrectValue(JSONValue* value);\n")
|
| writer.append("#endif // %s\n" % VALIDATOR_IFDEF_NAME)
|
|
|
| closed_field_set = (context_domain_name + "." + class_name) not in TYPES_WITH_OPEN_FIELD_LIST_SET
|
| @@ -1209,15 +1241,15 @@ class TypeBindings:
|
|
|
| domain_fixes = DomainNameFixes.get_fixed_data(context_domain_name)
|
|
|
| - validator_writer.newline("void %s%s::assertCorrectValue(InspectorValue* value)\n" % (helper.full_name_prefix_for_impl, class_name))
|
| + validator_writer.newline("void %s%s::assertCorrectValue(JSONValue* value)\n" % (helper.full_name_prefix_for_impl, class_name))
|
| validator_writer.newline("{\n")
|
| - validator_writer.newline(" RefPtr<InspectorObject> object;\n")
|
| + validator_writer.newline(" RefPtr<JSONObject> object;\n")
|
| validator_writer.newline(" bool castRes = value->asObject(&object);\n")
|
| validator_writer.newline(" ASSERT_UNUSED(castRes, castRes);\n")
|
| for prop_data in resolve_data.main_properties:
|
| validator_writer.newline(" {\n")
|
| it_name = "%sPos" % prop_data.p["name"]
|
| - validator_writer.newline(" InspectorObject::iterator %s;\n" % it_name)
|
| + validator_writer.newline(" JSONObject::iterator %s;\n" % it_name)
|
| validator_writer.newline(" %s = object->find(\"%s\");\n" % (it_name, prop_data.p["name"]))
|
| validator_writer.newline(" ASSERT(%s != object->end());\n" % it_name)
|
| validator_writer.newline(" %s(%s->value.get());\n" % (prop_data.param_type_binding.get_validator_call_text(), it_name))
|
| @@ -1229,7 +1261,7 @@ class TypeBindings:
|
| for prop_data in resolve_data.optional_properties:
|
| validator_writer.newline(" {\n")
|
| it_name = "%sPos" % prop_data.p["name"]
|
| - validator_writer.newline(" InspectorObject::iterator %s;\n" % it_name)
|
| + validator_writer.newline(" JSONObject::iterator %s;\n" % it_name)
|
| validator_writer.newline(" %s = object->find(\"%s\");\n" % (it_name, prop_data.p["name"]))
|
| validator_writer.newline(" if (%s != object->end()) {\n" % it_name)
|
| validator_writer.newline(" %s(%s->value.get());\n" % (prop_data.param_type_binding.get_validator_call_text(), it_name))
|
| @@ -1340,7 +1372,7 @@ class TypeBindings:
|
|
|
| @staticmethod
|
| def get_validator_call_text():
|
| - return "RuntimeCastHelper::assertType<InspectorValue::TypeObject>"
|
| + return "RuntimeCastHelper::assertType<JSONValue::TypeObject>"
|
|
|
| @classmethod
|
| def get_array_item_c_type_text(cls):
|
| @@ -1650,7 +1682,8 @@ class Templates:
|
| frontend_domain_class = string.Template(CodeGeneratorInspectorStrings.frontend_domain_class)
|
| backend_method = string.Template(CodeGeneratorInspectorStrings.backend_method)
|
| frontend_method = string.Template(CodeGeneratorInspectorStrings.frontend_method)
|
| - callback_method = string.Template(CodeGeneratorInspectorStrings.callback_method)
|
| + callback_main_methods = string.Template(CodeGeneratorInspectorStrings.callback_main_methods)
|
| + callback_failure_method = string.Template(CodeGeneratorInspectorStrings.callback_failure_method)
|
| frontend_h = string.Template(file_header_ + CodeGeneratorInspectorStrings.frontend_h)
|
| backend_h = string.Template(file_header_ + CodeGeneratorInspectorStrings.backend_h)
|
| backend_cpp = string.Template(file_header_ + CodeGeneratorInspectorStrings.backend_cpp)
|
| @@ -1839,7 +1872,7 @@ class Generator:
|
| class EventMethodStructTemplate:
|
| @staticmethod
|
| def append_prolog(line_list):
|
| - line_list.append(" RefPtr<InspectorObject> paramsObject = InspectorObject::create();\n")
|
| + line_list.append(" RefPtr<JSONObject> paramsObject = JSONObject::create();\n")
|
|
|
| @staticmethod
|
| def append_epilog(line_list):
|
| @@ -1855,7 +1888,7 @@ class Generator:
|
|
|
| Generator.method_name_enum_list.append(" %s," % cmd_enum_name)
|
| Generator.method_handler_list.append(" &InspectorBackendDispatcherImpl::%s_%s," % (domain_name, json_command_name))
|
| - Generator.backend_method_declaration_list.append(" void %s_%s(long callId, InspectorObject* requestMessageObject);" % (domain_name, json_command_name))
|
| + Generator.backend_method_declaration_list.append(" void %s_%s(long callId, JSONObject* requestMessageObject);" % (domain_name, json_command_name))
|
|
|
| ad_hoc_type_output = []
|
| Generator.backend_agent_interface_list.append(ad_hoc_type_output)
|
| @@ -1866,13 +1899,34 @@ class Generator:
|
| method_in_code = ""
|
| method_out_code = ""
|
| agent_call_param_list = []
|
| - response_cook_list = []
|
| request_message_param = ""
|
| + normal_response_cook_text = ""
|
| + error_response_cook_text = ""
|
| + error_type_binding = None
|
| + if "error" in json_command:
|
| + json_error = json_command["error"]
|
| + error_type_binding = Generator.resolve_type_and_generate_ad_hoc(json_error, json_command_name + "Error", json_command_name, domain_name, ad_hoc_type_writer, agent_interface_name + "::")
|
| + error_type_model = error_type_binding.get_type_model().get_optional()
|
| + error_annotated_type = error_type_model.get_command_return_pass_model().get_output_parameter_type()
|
| + agent_call_param_list.append(", %serrorData" % error_type_model.get_command_return_pass_model().get_output_argument_prefix())
|
| + Generator.backend_agent_interface_list.append(", %s errorData" % error_annotated_type)
|
| + method_in_code += " %s errorData;\n" % error_type_model.get_command_return_pass_model().get_return_var_type()
|
| +
|
| + setter_argument = error_type_model.get_command_return_pass_model().get_output_to_raw_expression() % "errorData"
|
| + if error_type_binding.get_setter_value_expression_pattern():
|
| + setter_argument = error_type_binding.get_setter_value_expression_pattern() % setter_argument
|
| + error_assigment_value = error_type_binding.reduce_to_raw_type().get_constructor_pattern() % setter_argument
|
| +
|
| + cook = " resultErrorData = %s;\n" % error_assigment_value
|
| +
|
| + error_condition_pattern = error_type_model.get_command_return_pass_model().get_set_return_condition()
|
| + cook = (" if (%s)\n " % (error_condition_pattern % "errorData")) + cook
|
| + error_response_cook_text = " if (error.length()) {\n" + cook + " }\n"
|
| +
|
| if "parameters" in json_command:
|
| json_params = json_command["parameters"]
|
| method_in_code += Templates.param_container_access_code
|
| request_message_param = " requestMessageObject"
|
| - js_param_list = []
|
|
|
| for json_parameter in json_params:
|
| json_param_name = json_parameter["name"]
|
| @@ -1909,7 +1963,6 @@ class Generator:
|
| agent_call_param_list.append(param)
|
| Generator.backend_agent_interface_list.append(", %s in_%s" % (formal_param_type_pattern % non_optional_type_model.get_command_return_pass_model().get_return_var_type(), json_param_name))
|
|
|
| - response_cook_text = ""
|
| if json_command.get("async") == True:
|
| callback_name = Capitalizer.lower_camel_case_to_upper(json_command_name) + "Callback"
|
|
|
| @@ -1920,33 +1973,51 @@ class Generator:
|
| Generator.generate_send_method(json_command.get("returns"), json_command_name, domain_name, ad_hoc_type_writer,
|
| decl_parameter_list,
|
| Generator.CallbackMethodStructTemplate,
|
| - Generator.backend_method_implementation_list, Templates.callback_method,
|
| + Generator.backend_method_implementation_list, Templates.callback_main_methods,
|
| {"callbackName": callback_name, "agentName": agent_interface_name})
|
|
|
| callback_writer.newline("class " + callback_name + " : public CallbackBase {\n")
|
| callback_writer.newline("public:\n")
|
| callback_writer.newline(" " + callback_name + "(PassRefPtr<InspectorBackendDispatcherImpl>, int id);\n")
|
| callback_writer.newline(" void sendSuccess(" + ", ".join(decl_parameter_list) + ");\n")
|
| + error_part_writer = callback_writer.insert_writer("")
|
| callback_writer.newline("};\n")
|
|
|
| + if error_type_binding:
|
| + annotated_type = error_type_model.get_input_param_type_text()
|
| + error_part_writer.newline(" void sendFailure(const ErrorString&, %s);\n" % annotated_type)
|
| + error_part_writer.newline(" using CallbackBase::sendFailure;\n")
|
| +
|
| + assigment_value = error_type_model.get_event_setter_expression_pattern() % "errorData"
|
| + assigment_value = error_type_binding.reduce_to_raw_type().get_constructor_pattern() % assigment_value
|
| +
|
| + Generator.backend_method_implementation_list.append(Templates.callback_failure_method.substitute(None,
|
| + agentName=agent_interface_name,
|
| + callbackName=callback_name,
|
| + parameter=annotated_type + " errorData",
|
| + argument=assigment_value))
|
| +
|
| +
|
| +
|
| ad_hoc_type_output.append(callback_output)
|
|
|
| method_out_code += " RefPtr<" + agent_interface_name + "::" + callback_name + "> callback = adoptRef(new " + agent_interface_name + "::" + callback_name + "(this, callId));\n"
|
| agent_call_param_list.append(", callback")
|
| - response_cook_text += " if (!error.length()) \n"
|
| - response_cook_text += " return;\n"
|
| - response_cook_text += " callback->disable();\n"
|
| + normal_response_cook_text += " if (!error.length()) \n"
|
| + normal_response_cook_text += " return;\n"
|
| + normal_response_cook_text += " callback->disable();\n"
|
| Generator.backend_agent_interface_list.append(", PassRefPtr<%s> callback" % callback_name)
|
| else:
|
| if "returns" in json_command:
|
| method_out_code += "\n"
|
| + response_cook_list = []
|
| for json_return in json_command["returns"]:
|
|
|
| json_return_name = json_return["name"]
|
|
|
| optional = bool(json_return.get("optional"))
|
|
|
| - return_type_binding = Generator.resolve_type_and_generate_ad_hoc(json_return, json_command_name, domain_name, ad_hoc_type_writer, agent_interface_name + "::")
|
| + return_type_binding = Generator.resolve_param_type_and_generate_ad_hoc(json_return, json_command_name, domain_name, ad_hoc_type_writer, agent_interface_name + "::")
|
|
|
| raw_type = return_type_binding.reduce_to_raw_type()
|
| setter_type = raw_type.get_setter_name()
|
| @@ -1971,7 +2042,7 @@ class Generator:
|
| cook = (" if (%s)\n " % (set_condition_pattern % var_name)) + cook
|
| annotated_type = type_model.get_command_return_pass_model().get_output_parameter_type()
|
|
|
| - param_name = "out_%s" % json_return_name
|
| + param_name = var_name
|
| if optional:
|
| param_name = "opt_" + param_name
|
|
|
| @@ -1981,10 +2052,10 @@ class Generator:
|
| method_out_code += code
|
| agent_call_param_list.append(param)
|
|
|
| - response_cook_text = "".join(response_cook_list)
|
| + normal_response_cook_text += "".join(response_cook_list)
|
|
|
| - if len(response_cook_text) != 0:
|
| - response_cook_text = " if (!error.length()) {\n" + response_cook_text + " }"
|
| + if len(normal_response_cook_text) != 0:
|
| + normal_response_cook_text = " if (!error.length()) {\n" + normal_response_cook_text + " }"
|
|
|
| Generator.backend_method_implementation_list.append(Templates.backend_method.substitute(None,
|
| domainName=domain_name, methodName=json_command_name,
|
| @@ -1993,7 +2064,8 @@ class Generator:
|
| methodOutCode=method_out_code,
|
| agentCallParams="".join(agent_call_param_list),
|
| requestMessageObject=request_message_param,
|
| - responseCook=response_cook_text,
|
| + responseCook=normal_response_cook_text,
|
| + errorCook=error_response_cook_text,
|
| commandNameIndex=cmd_enum_name))
|
| Generator.backend_method_name_declaration_list.append(" \"%s.%s\"," % (domain_name, json_command_name))
|
|
|
| @@ -2021,7 +2093,7 @@ class Generator:
|
| for json_parameter in parameters:
|
| parameter_name = json_parameter["name"]
|
|
|
| - param_type_binding = Generator.resolve_type_and_generate_ad_hoc(json_parameter, event_name, domain_name, ad_hoc_type_writer, "")
|
| + param_type_binding = Generator.resolve_param_type_and_generate_ad_hoc(json_parameter, event_name, domain_name, ad_hoc_type_writer, "")
|
|
|
| raw_type = param_type_binding.reduce_to_raw_type()
|
| raw_type_binding = RawTypeBinding(raw_type)
|
| @@ -2057,9 +2129,13 @@ class Generator:
|
| parameters=", ".join(decl_parameter_list),
|
| code="".join(method_line_list), **template_params))
|
|
|
| - @staticmethod
|
| - def resolve_type_and_generate_ad_hoc(json_param, method_name, domain_name, ad_hoc_type_writer, container_relative_name_prefix_param):
|
| + @classmethod
|
| + def resolve_param_type_and_generate_ad_hoc(cls, json_param, method_name, domain_name, ad_hoc_type_writer, container_relative_name_prefix_param):
|
| param_name = json_param["name"]
|
| + return cls.resolve_type_and_generate_ad_hoc(json_param, param_name, method_name, domain_name, ad_hoc_type_writer, container_relative_name_prefix_param)
|
| +
|
| + @staticmethod
|
| + def resolve_type_and_generate_ad_hoc(typable_element, element_name, method_name, domain_name, ad_hoc_type_writer, container_relative_name_prefix_param):
|
| ad_hoc_type_list = []
|
|
|
| class AdHocTypeContext:
|
| @@ -2069,11 +2145,11 @@ class Generator:
|
| @staticmethod
|
| def get_type_name_fix():
|
| class NameFix:
|
| - class_name = Capitalizer.lower_camel_case_to_upper(param_name)
|
| + class_name = Capitalizer.lower_camel_case_to_upper(element_name)
|
|
|
| @staticmethod
|
| def output_comment(writer):
|
| - writer.newline("// Named after parameter '%s' while generating command/event %s.\n" % (param_name, method_name))
|
| + writer.newline("// Named after parameter '%s' while generating command/event %s.\n" % (element_name, method_name))
|
|
|
| return NameFix
|
|
|
| @@ -2081,7 +2157,7 @@ class Generator:
|
| def add_type(binding):
|
| ad_hoc_type_list.append(binding)
|
|
|
| - type_binding = resolve_param_type(json_param, domain_name, AdHocTypeContext)
|
| + type_binding = resolve_param_type(typable_element, domain_name, AdHocTypeContext)
|
|
|
| class InterfaceForwardListener:
|
| @staticmethod
|
|
|