diff --git a/mojo/golden/generated/typescript/results.test-mojom-webui.ts.golden b/mojo/golden/generated/typescript/results.test-mojom-webui.ts.golden index 10235e3436f02..b1bca72a809a7 100644 --- a/mojo/golden/generated/typescript/results.test-mojom-webui.ts.golden +++ b/mojo/golden/generated/typescript/results.test-mojom-webui.ts.golden @@ -157,6 +157,12 @@ export const ResultTestErrorSpec: { $: mojo.internal.MojomType } = export const ResultInterface_Method_ParamsSpec: { $: mojo.internal.MojomType } = { $: {} as unknown as mojo.internal.MojomType }; +export const ResultInterface_Method_ResponseParamsSpec: { $: mojo.internal.MojomType } = + { $: {} as unknown as mojo.internal.MojomType }; + +export const ResultInterface_Method_ResponseParams_ResultSpec: { $: mojo.internal.MojomType } = + { $: {} as unknown as mojo.internal.MojomType }; + @@ -201,3 +207,47 @@ mojo.internal.Struct<ResultInterface_Method_ParamsMojoType>( + + +export interface ResultInterface_Method_ResponseParamsMojoType { + result: ResultInterface_Method_ResponseParams_Result; +} + + +export type ResultInterface_Method_ResponseParams = ResultInterface_Method_ResponseParamsMojoType; +mojo.internal.Struct<ResultInterface_Method_ResponseParamsMojoType>( + ResultInterface_Method_ResponseParamsSpec.$, + 'ResultInterface_Method_ResponseParams', + [ + mojo.internal.StructField<ResultInterface_Method_ResponseParamsMojoType, ResultInterface_Method_ResponseParams_Result>( + 'result', 0, + 0, + ResultInterface_Method_ResponseParams_ResultSpec.$, + null, + false /* nullable */, + 0, + undefined, + undefined, + ), + ], + [[0, 24],]); + + + +mojo.internal.Union( + ResultInterface_Method_ResponseParams_ResultSpec.$, 'ResultInterface_Method_ResponseParams_Result', + { + 'success': { + 'ordinal': 0, + 'type': mojo.internal.Bool, + }, + 'failure': { + 'ordinal': 1, + 'type': ResultTestErrorSpec.$, + }, + }); + +export interface ResultInterface_Method_ResponseParams_Result { + success?: boolean, + failure?: ResultTestError, +} diff --git a/mojo/public/tools/mojom/mojom/generate/generator.py b/mojo/public/tools/mojom/mojom/generate/generator.py index 2beb7b332caa5..67db58ea13fdc 100644 --- a/mojo/public/tools/mojom/mojom/generate/generator.py +++ b/mojo/public/tools/mojom/mojom/generate/generator.py @@ -188,7 +188,8 @@ def AddComputedData(module): interface.version = max(interface.version, method.param_struct.versions[-1].version) - if method.response_parameters is not None: + if method.response_parameters is not None or \ + method.result_response is not None: method.response_param_struct = _GetResponseStructFromMethod(method) if interface.stable: method.response_param_struct.attributes[mojom.ATTRIBUTE_STABLE] = True @@ -218,6 +219,13 @@ def AddComputedData(module): """Converts a method's response_parameters into the fields of a struct.""" params_class = "%s_%s_ResponseParams" % (method.interface.mojom_name, method.mojom_name) + if method.response_parameters is not None: + return _GetResponseStructForParamList(method, params_class) + if method.result_response is not None: + return _GetResponseStructForResultResponse(method, params_class) + raise Exception('method should only be called for methods with response') + + def _GetResponseStructForParamList(method, params_class): struct = mojom.Struct(params_class, module=method.interface.module, attributes={}) @@ -230,6 +238,30 @@ def AddComputedData(module): _AddStructComputedData(False, struct) return struct + def _GetResponseStructForResultResponse(method, params_class): + struct = mojom.Struct(params_class, + module=method.interface.module, + attributes={}) + result = method.interface.module.AddUnion(f"{params_class}_Result") + result.AddField( + 'success', + method.result_response.success_kind, + 0, + ) + result.AddField( + 'failure', + method.result_response.failure_kind, + 1, + ) + + struct.AddField( + 'result', + result, + 0, + ) + _AddStructComputedData(False, struct) + return struct + for struct in module.structs: _AddStructComputedData(True, struct) for interface in module.interfaces: diff --git a/mojo/public/tools/mojom/mojom/generate/module.py b/mojo/public/tools/mojom/mojom/generate/module.py index e24ba2056c110..3e46d7ca814be 100644 --- a/mojo/public/tools/mojom/mojom/generate/module.py +++ b/mojo/public/tools/mojom/mojom/generate/module.py @@ -955,14 +955,14 @@ class Parameter: class Result: - def __init__(self, success_type, failure_type): - self.success_type = success_type - self.failure_type = failure_type + def __init__(self, success_kind, failure_kind): + self.success_kind = success_kind + self.failure_kind = failure_kind def Repr(self): return GenericRepr(self, { - 'success_type': self.success_type, - 'failure_type': self.failure_type, + 'success_kind': self.success_kind, + 'failure_kind': self.failure_kind, }) diff --git a/mojo/public/tools/mojom/mojom/generate/translate.py b/mojo/public/tools/mojom/mojom/generate/translate.py index ab38218253d35..1903d941a3764 100644 --- a/mojo/public/tools/mojom/mojom/generate/translate.py +++ b/mojo/public/tools/mojom/mojom/generate/translate.py @@ -808,8 +808,13 @@ def _Method(module, parsed_method, interface): parsed_method.response_parameter_list)) if parsed_method.result_response is not None: result_type = parsed_method.result_response - method.result = mojom.Result(_MapKind(result_type.success_type), - _MapKind(result_type.failure_type)) + success_kind = _Kind(module, module.kinds, + _MapKind(result_type.success_type), + (module.mojom_namespace, interface.mojom_name)) + failure_kind = _Kind(module, module.kinds, + _MapKind(result_type.failure_type), + (module.mojom_namespace, interface.mojom_name)) + method.result_response = mojom.Result(success_kind, failure_kind) method.attributes = _AttributeListToDict(module, method, parsed_method.attribute_list) diff --git a/mojo/public/tools/mojom/result_unittest.py b/mojo/public/tools/mojom/result_unittest.py index 20e2bdca3400f..ce6c66154eb98 100644 --- a/mojo/public/tools/mojom/result_unittest.py +++ b/mojo/public/tools/mojom/result_unittest.py @@ -20,10 +20,12 @@ class ResultTest(MojomParserTestCase): a = self.LoadModule(a_mojom) self.assertEqual(1, len(a.interfaces)) self.assertEqual(1, len(a.interfaces[0].methods)) - self.assertEqual('b', a.interfaces[0].methods[0].result.success_type) - self.assertEqual('s', a.interfaces[0].methods[0].result.failure_type) + self.assertEqual(mojom.BOOL, + a.interfaces[0].methods[0].result_response.success_kind) + self.assertEqual(mojom.STRING, + a.interfaces[0].methods[0].result_response.failure_kind) - def testResultResponse(self): + def testResultResponseStructs(self): a_mojom = 'a.mojom' self.WriteFile( a_mojom, """ @@ -38,7 +40,14 @@ class ResultTest(MojomParserTestCase): a = self.LoadModule(a_mojom) self.assertEqual(1, len(a.interfaces)) self.assertEqual(1, len(a.interfaces[0].methods)) - self.assertEqual('x:Success', - a.interfaces[0].methods[0].result.success_type) - self.assertEqual('x:Failure', - a.interfaces[0].methods[0].result.failure_type) + + result_response = a.interfaces[0].methods[0].result_response + self.assertIsNotNone(result_response.success_kind) + self.assertIsNotNone(result_response.failure_kind) + + name_to_kind = {} + for kind in a.structs: + name_to_kind[kind.mojom_name] = kind + + self.assertEqual(name_to_kind['Success'], result_response.success_kind) + self.assertEqual(name_to_kind['Failure'], result_response.failure_kind)