Skip to content

Commit

Permalink
Add parsing for members declaration in a class
Browse files Browse the repository at this point in the history
  • Loading branch information
mwilliamson committed Jun 3, 2012
1 parent c9bb174 commit 2d2e980
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 3 deletions.
7 changes: 7 additions & 0 deletions lib/nodes.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ exports.formalTypeParameter = function(name, source) {
}, source);
};

exports.memberDeclarationByReference = function(name, source) {
return node({
nodeType: "memberDeclarationByReference",
name: name
}, source);
};

exports.assign = function(variable, value, source) {
return node({
nodeType: "assignment",
Expand Down
33 changes: 30 additions & 3 deletions lib/parsing/expressions.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,37 @@ var lambdaRule = lazyRule(function() {
);
});

var memberRule = lazyRule(function() {
return then(
identifier(),
nodes.memberDeclarationByReference
);
});

var membersRule = lazyRule(function() {
var members = capture(zeroOrMoreWithSeparator(memberRule, symbol(",")), "members");
return then(
sequence(
keyword("members"),
symbol("{"),
members,
symbol("}")
),
sequence.extract(members)
);
});

var optionalMembersRule = then(
optional(membersRule),
function(members) {
return members.orElse([]);
}
);

var classRule = lazyRule(function() {
var formalTypeParameters = capture(optional(formalTypeParametersRule), "formalTypeParameters");
var formalArguments = capture(formalArgumentsRule, "formalArguments");
var members = capture(optionalMembersRule, "members");
var body = capture(zeroOrMore(statements.statement), "body");
return then(
sequence(
Expand All @@ -193,12 +221,11 @@ var classRule = lazyRule(function() {
formalArguments,
symbol("=>"),
symbol("{"),
members,
body,
symbol("}")
),
applySequenceValuesToNode(function(formalTypeParameters, formalArguments, body, source) {
return nodes.class(formalTypeParameters, formalArguments, [], body, source);
}, formalTypeParameters, formalArguments, body)
applySequenceValuesToNode(nodes.class, formalTypeParameters, formalArguments, members, body)
);
});

Expand Down
12 changes: 12 additions & 0 deletions test/parsing/expressions.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,18 @@ exports.canParseClassDefinitionWithBody = function(test) {
test.done();
};

exports.canParseClassDefinitionWithMembersDeclaration = function(test) {
var result = parse(parsing.expression, "class() => { members { blah } }");
var expected = nodes.class(
options.none,
nodes.formalArguments([]),
[nodes.memberDeclarationByReference("blah")],
[]
);
assertIsSuccessWithValue(test, result, ignoringSources(expected));
test.done();
};

exports.canParseEmptyObject = function(test) {
var result = parse(parsing.expression, "object { }");
var expected = nodes.object([]);
Expand Down

0 comments on commit 2d2e980

Please sign in to comment.