From: Juerg Billeter Date: Sun, 25 May 2008 11:40:01 +0000 (+0000) Subject: Support qualified access to global symbols with `global::' X-Git-Tag: VALA_0_3_3~134 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=15989e7dfe023b28eb51ebca918db4d499ffa3a6;p=thirdparty%2Fvala.git Support qualified access to global symbols with `global::' 2008-05-25 Juerg Billeter * vala/valaparser.vala: * vala/valascanner.vala: * vala/valasymbolresolver.vala: * vala/valatokentype.vala: * vala/valaunresolvedsymbol.vala: Support qualified access to global symbols with `global::' svn path=/trunk/; revision=1424 --- diff --git a/ChangeLog b/ChangeLog index 861f517e6..d511c252c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-05-25 Jürg Billeter + + * vala/valaparser.vala: + * vala/valascanner.vala: + * vala/valasymbolresolver.vala: + * vala/valatokentype.vala: + * vala/valaunresolvedsymbol.vala: + + Support qualified access to global symbols with `global::' + 2008-05-25 Jürg Billeter * vapi/tiff.vapi: various binding fixes, patch by Christian Meyer diff --git a/vala/valaparser.vala b/vala/valaparser.vala index c7a3d71e6..30c0b5ed9 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -299,7 +299,7 @@ public class Vala.Parser : CodeVisitor { void skip_symbol_name () throws ParseError { do { skip_identifier (); - } while (accept (TokenType.DOT)); + } while (accept (TokenType.DOT) || accept (TokenType.DOUBLE_COLON)); } UnresolvedSymbol parse_symbol_name () throws ParseError { @@ -307,6 +307,14 @@ public class Vala.Parser : CodeVisitor { UnresolvedSymbol sym = null; do { string name = parse_identifier (); + if (name == "global" && accept (TokenType.DOUBLE_COLON)) { + // global::Name + // qualified access to global symbol + name = parse_identifier (); + sym = new UnresolvedSymbol (sym, name, get_src (begin)); + sym.qualified = true; + continue; + } sym = new UnresolvedSymbol (sym, name, get_src (begin)); } while (accept (TokenType.DOT)); return sym; diff --git a/vala/valascanner.vala b/vala/valascanner.vala index ba1975498..38eaf9001 100644 --- a/vala/valascanner.vala +++ b/vala/valascanner.vala @@ -433,6 +433,10 @@ public class Vala.Scanner : Object { case ':': type = TokenType.COLON; current++; + if (current < end && current[0] == ':') { + type = TokenType.DOUBLE_COLON; + current++; + } break; case ',': type = TokenType.COMMA; diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala index 40f32c58e..f574798f8 100644 --- a/vala/valasymbolresolver.vala +++ b/vala/valasymbolresolver.vala @@ -189,7 +189,10 @@ public class Vala.SymbolResolver : CodeVisitor { } private Symbol? resolve_symbol (UnresolvedSymbol unresolved_symbol) { - if (unresolved_symbol.inner == null) { + if (unresolved_symbol.qualified) { + // qualified access to global symbol + return root_symbol.scope.lookup (unresolved_symbol.name); + } else if (unresolved_symbol.inner == null) { Symbol sym = null; Scope scope = current_scope; while (sym == null && scope != null) { diff --git a/vala/valatokentype.vala b/vala/valatokentype.vala index 1a7384da6..94fc0a0a8 100644 --- a/vala/valatokentype.vala +++ b/vala/valatokentype.vala @@ -58,6 +58,7 @@ public enum Vala.TokenType { DELETE, DIV, DO, + DOUBLE_COLON, DOT, DYNAMIC, ELLIPSIS, diff --git a/vala/valaunresolvedsymbol.vala b/vala/valaunresolvedsymbol.vala index df8c30b94..4ba4469e0 100644 --- a/vala/valaunresolvedsymbol.vala +++ b/vala/valaunresolvedsymbol.vala @@ -36,6 +36,11 @@ public class Vala.UnresolvedSymbol : CodeNode { */ public string name { get; set; } + /** + * Qualified access to global symbol. + */ + public bool qualified { get; set; } + public UnresolvedSymbol (UnresolvedSymbol? inner, string name, SourceReference? source_reference = null) { this.inner = inner; this.name = name;