summaryrefslogtreecommitdiff
path: root/vala/valagenieparser.vala
diff options
context:
space:
mode:
authorMichal Proszek <michal.proszek@gmail.com>2019-01-20 19:56:39 +0000
committerRico Tzschichholz <ricotz@ubuntu.com>2019-01-20 22:07:47 +0100
commit005acf76fcf5b466196b85bff29bdf66df9480fc (patch)
tree4d3e2574deacf6b937769117e5f08757e069e017 /vala/valagenieparser.vala
parent135d9c993159aaa10e12da19d20703917a85dfde (diff)
downloadvala-005acf76fcf5b466196b85bff29bdf66df9480fc.tar.gz
genie: Support `protected` accessibility and allow explicit `public`
Fixes https://gitlab.gnome.org/GNOME/vala/issues/346
Diffstat (limited to 'vala/valagenieparser.vala')
-rw-r--r--vala/valagenieparser.vala74
1 files changed, 55 insertions, 19 deletions
diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala
index 8ed3bab4d..30a5fb3a0 100644
--- a/vala/valagenieparser.vala
+++ b/vala/valagenieparser.vala
@@ -68,7 +68,9 @@ public class Vala.Genie.Parser : CodeVisitor {
VIRTUAL = 1 << 7,
PRIVATE = 1 << 8,
ASYNC = 1 << 9,
- SEALED = 1 << 10
+ SEALED = 1 << 10,
+ PUBLIC = 1 << 11,
+ PROTECTED = 1 << 12,
}
public Parser () {
@@ -234,8 +236,8 @@ public class Vala.Genie.Parser : CodeVisitor {
}
}
- inline SymbolAccessibility get_access (string s) {
- if (s[0] == '_') {
+ inline SymbolAccessibility get_default_accessibility (string s) {
+ if (s.has_prefix("_")) {
return SymbolAccessibility.PRIVATE;
}
@@ -295,6 +297,7 @@ public class Vala.Genie.Parser : CodeVisitor {
case TokenType.PASS:
case TokenType.PRINT:
case TokenType.PRIVATE:
+ case TokenType.PROTECTED:
case TokenType.PROP:
case TokenType.RAISE:
case TokenType.RAISES:
@@ -2661,13 +2664,10 @@ public class Vala.Genie.Parser : CodeVisitor {
if (ModifierFlags.PRIVATE in flags) {
cl.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ cl.access = SymbolAccessibility.PROTECTED;
} else {
- /* class must always be Public unless its name starts with underscore */
- if (sym.name[0] == '_') {
- cl.access = SymbolAccessibility.PRIVATE;
- } else {
- cl.access = SymbolAccessibility.PUBLIC;
- }
+ cl.access = get_default_accessibility (sym.name);
}
if (ModifierFlags.ABSTRACT in flags) {
@@ -2763,7 +2763,7 @@ public class Vala.Genie.Parser : CodeVisitor {
}
var c = new Constant (id, type, initializer, get_src (begin), comment);
- c.access = get_access (id);
+ c.access = get_default_accessibility (id);
if (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {
c.external = true;
@@ -2800,8 +2800,10 @@ public class Vala.Genie.Parser : CodeVisitor {
if (ModifierFlags.PRIVATE in flags) {
f.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ f.access = SymbolAccessibility.PROTECTED;
} else {
- f.access = get_access (id);
+ f.access = get_default_accessibility (id);
}
set_attributes (f, attrs);
@@ -2912,8 +2914,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var method = new Method (id, type, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
method.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ method.access = SymbolAccessibility.PROTECTED;
} else {
- method.access = get_access (id);
+ method.access = get_default_accessibility (id);
}
@@ -3049,8 +3053,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var prop = new Property (id, type, null, null, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
prop.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ prop.access = SymbolAccessibility.PROTECTED;
} else {
- prop.access = get_access (id);
+ prop.access = get_default_accessibility (id);
}
set_attributes (prop, attrs);
@@ -3187,8 +3193,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var sig = new Vala.Signal (id, type, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
sig.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ sig.access = SymbolAccessibility.PROTECTED;
} else {
- sig.access = get_access (id);
+ sig.access = get_default_accessibility (id);
}
if (ModifierFlags.VIRTUAL in flags) {
@@ -3258,8 +3266,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var st = new Struct (sym.name, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
st.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ st.access = SymbolAccessibility.PROTECTED;
} else {
- st.access = get_access (sym.name);
+ st.access = get_default_accessibility (sym.name);
}
set_attributes (st, attrs);
foreach (TypeParameter type_param in type_param_list) {
@@ -3320,8 +3330,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var iface = new Interface (sym.name, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
iface.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ iface.access = SymbolAccessibility.PROTECTED;
} else {
- iface.access = get_access (sym.name);
+ iface.access = get_default_accessibility (sym.name);
}
if (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {
iface.external = true;
@@ -3388,8 +3400,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var en = new Enum (sym.name, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
en.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ en.access = SymbolAccessibility.PROTECTED;
} else {
- en.access = get_access (sym.name);
+ en.access = get_default_accessibility (sym.name);
}
if (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {
en.external = true;
@@ -3448,8 +3462,10 @@ public class Vala.Genie.Parser : CodeVisitor {
var ed = new ErrorDomain (sym.name, get_src (begin), comment);
if (ModifierFlags.PRIVATE in flags) {
ed.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ ed.access = SymbolAccessibility.PROTECTED;
} else {
- ed.access = get_access (sym.name);
+ ed.access = get_default_accessibility (sym.name);
}
set_attributes (ed, attrs);
@@ -3517,6 +3533,16 @@ public class Vala.Genie.Parser : CodeVisitor {
flags |= ModifierFlags.PRIVATE;
break;
+ case TokenType.PUBLIC:
+ next ();
+ flags |= ModifierFlags.PUBLIC;
+ break;
+
+ case TokenType.PROTECTED:
+ next ();
+ flags |= ModifierFlags.PROTECTED;
+ break;
+
default:
return flags;
}
@@ -3571,6 +3597,14 @@ public class Vala.Genie.Parser : CodeVisitor {
next ();
flags |= ModifierFlags.PRIVATE;
break;
+ case TokenType.PUBLIC:
+ next ();
+ flags |= ModifierFlags.PUBLIC;
+ break;
+ case TokenType.PROTECTED:
+ next ();
+ flags |= ModifierFlags.PROTECTED;
+ break;
default:
return flags;
}
@@ -3714,8 +3748,10 @@ public class Vala.Genie.Parser : CodeVisitor {
if (ModifierFlags.PRIVATE in flags) {
d.access = SymbolAccessibility.PRIVATE;
+ } else if (ModifierFlags.PROTECTED in flags) {
+ d.access = SymbolAccessibility.PROTECTED;
} else {
- d.access = get_access (sym.name);
+ d.access = get_default_accessibility (sym.name);
}
if (ModifierFlags.STATIC in flags) {