Skip to content

Commit

Permalink
Mojo: Mojom: Add a Parameter object to the AST.
Browse files Browse the repository at this point in the history
Also add a basic parser test for interfaces/methods. (I also verified
that the change does not affect the output of the generators on any
.mojom file under mojo/.)

R=jamesr@chromium.org

Review URL: https://codereview.chromium.org/365773002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281040 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
viettrungluu@chromium.org committed Jul 2, 2014
1 parent 16f7888 commit a69d6c5
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 14 deletions.
14 changes: 14 additions & 0 deletions mojo/public/tools/bindings/pylib/mojom/parse/ast.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,17 @@ def __init__(self, value, **kwargs):

def __eq__(self, other):
return self.value == other.value

class Parameter(BaseNode):
"""Represents a method request or response parameter."""
def __init__(self, typename, name, ordinal, **kwargs):
assert isinstance(ordinal, Ordinal)
BaseNode.__init__(self, **kwargs)
self.typename = typename
self.name = name
self.ordinal = ordinal

def __eq__(self, other):
return self.typename == other.typename and \
self.name == other.name and \
self.ordinal == other.ordinal
9 changes: 5 additions & 4 deletions mojo/public/tools/bindings/pylib/mojom/parse/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,13 +183,14 @@ def p_parameters(self, p):
if len(p) == 1:
p[0] = []
elif len(p) == 2:
p[0] = _ListFromConcat(p[1])
elif len(p) > 3:
p[0] = _ListFromConcat(p[1], p[3])
p[0] = [p[1]]
else:
p[0] = [p[1]] + p[3]

def p_parameter(self, p):
"""parameter : typename NAME ordinal"""
p[0] = ('PARAM', p[1], p[2], p[3])
p[0] = ast.Parameter(p[1], p[2], p[3],
filename=self.filename, lineno=p.lineno(1))

def p_typename(self, p):
"""typename : basictypename
Expand Down
21 changes: 11 additions & 10 deletions mojo/public/tools/bindings/pylib/mojom/parse/translate.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,27 @@ def _GetAttribute(attributes, name):
return out

def _MapField(tree):
assert type(tree[3]) is ast.Ordinal
assert isinstance(tree[3], ast.Ordinal)
return {'name': tree[2],
'kind': _MapKind(tree[1]),
'ordinal': tree[3].value,
'default': tree[4]}

def _MapParameter(tree):
assert type(tree[3]) is ast.Ordinal
return {'name': tree[2],
'kind': _MapKind(tree[1]),
'ordinal': tree[3].value}

def _MapMethod(tree):
assert type(tree[3]) is ast.Ordinal
def ParameterToDict(param):
assert isinstance(param, ast.Parameter)
return {'name': param.name,
'kind': _MapKind(param.typename),
'ordinal': param.ordinal.value}

assert isinstance(tree[2], list)
assert isinstance(tree[3], ast.Ordinal)
method = {'name': tree[1],
'parameters': _MapTree(_MapParameter, tree[2], 'PARAM'),
'parameters': map(ParameterToDict, tree[2]),
'ordinal': tree[3].value}
# Note: |tree[4]| may be an empty list, indicating a parameter-less response.
if tree[4] is not None:
method['response_parameters'] = _MapTree(_MapParameter, tree[4], 'PARAM')
method['response_parameters'] = map(ParameterToDict, tree[4])
return method

def _MapEnumField(tree):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -560,5 +560,72 @@ def testInvalidFixedArraySize(self):
r"^my_file\.mojom:2: Error: Unexpected 'abcdefg':"):
parser.Parse(source3, "my_file.mojom")

def testValidMethod(self):
"""Tests parsing method declarations."""
source1 = """\
interface MyInterface {
MyMethod(int32 a);
};
"""
expected1 = \
[('MODULE',
'',
None,
[('INTERFACE',
'MyInterface',
None,
[('METHOD',
'MyMethod',
[ast.Parameter('int32', 'a', ast.Ordinal(None))],
ast.Ordinal(None),
None)])])]
self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)

source2 = """\
interface MyInterface {
MyMethod1@0(int32 a@0, int64 b@1);
MyMethod2@1() => ();
};
"""
expected2 = \
[('MODULE',
'',
None,
[('INTERFACE',
'MyInterface',
None,
[('METHOD',
'MyMethod1',
[ast.Parameter('int32', 'a', ast.Ordinal(0)),
ast.Parameter('int64', 'b', ast.Ordinal(1))],
ast.Ordinal(0),
None),
('METHOD',
'MyMethod2',
[],
ast.Ordinal(1),
[])])])]
self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)

source3 = """\
interface MyInterface {
MyMethod(string a) => (int32 a, bool b);
};
"""
expected3 = \
[('MODULE',
'',
None,
[('INTERFACE',
'MyInterface',
None,
[('METHOD',
'MyMethod',
[ast.Parameter('string', 'a', ast.Ordinal(None))],
ast.Ordinal(None),
[ast.Parameter('int32', 'a', ast.Ordinal(None)),
ast.Parameter('bool', 'b', ast.Ordinal(None))])])])]
self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)

if __name__ == "__main__":
unittest.main()

0 comments on commit a69d6c5

Please sign in to comment.