diff options
author | vlad1777d <naumovvladislav@mail.ru> | 2017-05-06 21:38:58 +0300 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2018-03-04 15:10:01 +0100 |
commit | 1873d7a1f9a64011b961e882f554d8d896c42a29 (patch) | |
tree | 269de4beb4338c06d8045201c147e587ef0b0a03 | |
parent | c1ce796a319d66f7330b12e7a53cc8b9c375b55c (diff) | |
download | vala-wip/genie.tar.gz |
genie: Allow method definitions in enumswip/genie
https://bugzilla.gnome.org/show_bug.cgi?id=776835
-rw-r--r-- | tests/genie/enums/enum_methods.gs | 145 | ||||
-rw-r--r-- | vala/valagenieparser.vala | 37 |
2 files changed, 167 insertions, 15 deletions
diff --git a/tests/genie/enums/enum_methods.gs b/tests/genie/enums/enum_methods.gs new file mode 100644 index 000000000..ba9f0d32d --- /dev/null +++ b/tests/genie/enums/enum_methods.gs @@ -0,0 +1,145 @@ +/* +Wrong syntax exaples: + +enum Aa6 + AAE, + AAF + def static met (): int + return 6 + AAZ + +Error: "error: syntax error, expected line end or comma but got `def'" + + +*/ + +enum Aa1 + AAE + AAF + def static met (): int + return 1 + AAZ + +enum Aa2 + AAE, + AAF + def static met (): int + return 2 + AAZ, + +enum Aa3 + AAE, + AAF + AAZ, + def static met (): int + return 3 + +enum Aa4 + AAE, + AAF + AAZ + def static met (): int + return 4 + +enum Aa5 + def static met (): int + return 5 + AAE, + AAF + AAZ + +enum Aa6 + AAE, + AAF, def static met (): int + return 6 + AAZ + +enum Bb1 + AAE, + AAF + + def static minimum (): int + enumc: EnumClass = (EnumClass) typeof (Bb1).class_ref () + return enumc.minimum + + def static maximum (): int + enumc: EnumClass = (EnumClass) typeof (Bb1).class_ref () + return enumc.maximum + + AAZ = 101 + + def static get_by_nick (nick: string, out result: Bb1): bool + enumc: EnumClass = (EnumClass) typeof (Bb1).class_ref () + eval: unowned EnumValue? = enumc.get_value_by_nick (nick) + if eval == null + print "was null" + return false + else + result = (Bb1) eval.value + return true + + AMM = 30 + + +init + var a_1_1 = Aa1.AAE + var a_1_2 = Aa1.AAF + var a_1_3 = Aa1.AAZ + assert a_1_1 == Aa1.AAE + assert a_1_2 == Aa1.AAF + assert a_1_3 == Aa1.AAZ + assert Aa1.met () == 1 + + var a_2_1 = Aa2.AAE + var a_2_2 = Aa2.AAF + var a_2_3 = Aa2.AAZ + assert a_2_1 == Aa2.AAE + assert a_2_2 == Aa2.AAF + assert a_2_3 == Aa2.AAZ + assert Aa2.met () == 2 + + var a_3_1 = Aa3.AAE + var a_3_2 = Aa3.AAF + var a_3_3 = Aa3.AAZ + assert a_3_1 == Aa3.AAE + assert a_3_2 == Aa3.AAF + assert a_3_3 == Aa3.AAZ + assert Aa3.met () == 3 + + var a_4_1 = Aa4.AAE + var a_4_2 = Aa4.AAF + var a_4_3 = Aa4.AAZ + assert a_4_1 == Aa4.AAE + assert a_4_2 == Aa4.AAF + assert a_4_3 == Aa4.AAZ + assert Aa4.met () == 4 + + var a_5_1 = Aa5.AAE + var a_5_2 = Aa5.AAF + var a_5_3 = Aa5.AAZ + assert a_5_1 == Aa5.AAE + assert a_5_2 == Aa5.AAF + assert a_5_3 == Aa5.AAZ + assert Aa5.met () == 5 + + var a_6_1 = Aa6.AAE + var a_6_2 = Aa6.AAF + var a_6_3 = Aa6.AAZ + assert a_6_1 == Aa6.AAE + assert a_6_2 == Aa6.AAF + assert a_6_3 == Aa6.AAZ + assert Aa6.met () == 6 + + assert Bb1.minimum () == 0 + assert Bb1.maximum () == 101 + b_1_1: Bb1 // for out of method + Bb1.get_by_nick ("aaz", out b_1_1) + assert b_1_1 == 101 + var b_1_2 = Bb1.AMM + var b_1_3 = Bb1.AAE + var b_1_4 = Bb1.AAF + var b_1_5 = Bb1.AAZ + assert b_1_2 == 30 + assert b_1_3 == Bb1.AAE + assert b_1_4 == Bb1.AAF + assert b_1_5 == Bb1.AAZ diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala index 09b7ca6c4..53ff02b14 100644 --- a/vala/valagenieparser.vala +++ b/vala/valagenieparser.vala @@ -3634,27 +3634,34 @@ public class Vala.Genie.Parser : CodeVisitor { expect (TokenType.EOL); expect (TokenType.INDENT); do { - if (current () == TokenType.DEDENT && en.get_values ().size > 0) { + TokenType cur = current (); + if (cur == TokenType.DEDENT && en.get_values ().size > 0) { // allow trailing comma break; } - var value_attrs = parse_attributes (false); - var value_begin = get_location (); - string id = parse_identifier (); - comment = scanner.pop_comment (); + if (cur == TokenType.DEF) { + var en_method = parse_declaration (); + assert (en_method is Method); + en.add_method ((Method) en_method); + } else { + var value_attrs = parse_attributes (false); + var value_begin = get_location (); + string id = parse_identifier (); + comment = scanner.pop_comment (); - Expression value = null; - if (accept (TokenType.ASSIGN)) { - value = parse_expression (); - } + Expression value = null; + if (accept (TokenType.ASSIGN)) { + value = parse_expression (); + } - var ev = new EnumValue (id, value, get_src (value_begin), comment); - ev.access = SymbolAccessibility.PUBLIC; - set_attributes (ev, value_attrs); + var ev = new EnumValue (id, value, get_src (value_begin), comment); + ev.access = SymbolAccessibility.PUBLIC; + set_attributes (ev, value_attrs); - en.add_value (ev); - if (expect_separator ()) { - accept (TokenType.EOL); + en.add_value (ev); + if (expect_separator ()) { + accept (TokenType.EOL); + } } } while (true); |