]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Simplify attribute objects
authorJürg Billeter <j@bitron.ch>
Sat, 21 Aug 2010 11:01:26 +0000 (13:01 +0200)
committerJürg Billeter <j@bitron.ch>
Fri, 17 Sep 2010 23:00:13 +0000 (01:00 +0200)
vala/valaattribute.vala
vala/valacodewriter.vala
vala/valafield.vala
vala/valagenieparser.vala
vala/valaparser.vala

index 32f475ff9d5bfcc6400635f7c913e7d09a921079..9fdc28a428ab86570e77c616689f1b6aacab1a22 100644 (file)
@@ -34,7 +34,7 @@ public class Vala.Attribute : CodeNode {
        /**
         * Contains all specified attribute arguments.
         */
-       public Vala.Map<string,Expression> args = new HashMap<string,Expression> (str_hash, str_equal);
+       public Vala.Map<string,string> args = new HashMap<string,string> (str_hash, str_equal);
 
        /**
         * Creates a new attribute.
@@ -53,7 +53,7 @@ public class Vala.Attribute : CodeNode {
         *
         * @param arg named argument
         */
-       public void add_argument (string key, Expression value) {
+       public void add_argument (string key, string value) {
                args.set (key, value);
        }
        
@@ -74,12 +74,16 @@ public class Vala.Attribute : CodeNode {
         * @return     string value
         */
        public string? get_string (string name) {
-               var lit = args.get (name) as StringLiteral;
-               if (lit != null) {
-                       return lit.eval ();
+               string value = args.get (name);
+
+               if (value == null) {
+                       return null;
                }
-               
-               return null;
+
+               /* remove quotes */
+               var noquotes = value.substring (1, (uint) (value.length - 2));
+               /* unescape string */
+               return noquotes.compress ();
        }
        
        /**
@@ -89,12 +93,13 @@ public class Vala.Attribute : CodeNode {
         * @return     integer value
         */
        public int get_integer (string name) {
-               var lit = args.get (name) as IntegerLiteral;
-               if (lit != null) {
-                       return lit.value.to_int ();
+               string value = args.get (name);
+
+               if (value == null) {
+                       return 0;
                }
-               
-               return 0;
+
+               return value.to_int ();
        }
 
        /**
@@ -104,27 +109,13 @@ public class Vala.Attribute : CodeNode {
         * @return     double value
         */
        public double get_double (string name) {
-               var arg = args.get (name);
-               if (arg is RealLiteral) {
-                       var lit = (RealLiteral) arg;
-                       return lit.value.to_double ();
-               } else if (arg is IntegerLiteral) {
-                       var lit = (IntegerLiteral) arg;
-                       return lit.value.to_int ();
-               } else if (arg is UnaryExpression) {
-                       var unary = (UnaryExpression) arg;
-                       if (unary.operator == UnaryOperator.MINUS) {
-                               if (unary.inner is RealLiteral) {
-                                       var lit = (RealLiteral) unary.inner;
-                                       return -lit.value.to_double ();
-                               } else if (unary.inner is IntegerLiteral) {
-                                       var lit = (IntegerLiteral) unary.inner;
-                                       return -lit.value.to_int ();
-                               }
-                       }
+               string value = args.get (name);
+
+               if (value == null) {
+                       return 0;
                }
-               
-               return 0;
+
+               return value.to_double ();
        }
 
        /**
@@ -134,11 +125,6 @@ public class Vala.Attribute : CodeNode {
         * @return     boolean value
         */
        public bool get_bool (string name) {
-               var lit = args.get (name) as BooleanLiteral;
-               if (lit != null) {
-                       return lit.value;
-               }
-               
-               return false;
+               return (args.get (name) == "true");
        }
 }
index f4030399605efd4a9a0019afeee4cdf3b1630449..07bb4b607282f66fc7fb3e9c42f71528fe172a01 100644 (file)
@@ -1923,9 +1923,7 @@ public class Vala.CodeWriter : CodeVisitor {
 
                                        string separator = "";
                                        foreach (string arg_name in keys) {
-                                               stream.printf ("%s%s = ", separator, arg_name);
-                                               var expr = attr.args.get (arg_name);
-                                               expr.accept (this);
+                                               stream.printf ("%s%s = %s", separator, arg_name, attr.args.get (arg_name));
                                                separator = ", ";
                                        }
 
index 07281f24683b0e4faa53cd19cfe96769dbc8129e..fc218e3142b0d940185fd28e9daab8865390e999 100644 (file)
@@ -257,7 +257,7 @@ public class Vala.Field : Variable, Lockable {
                        attr = new Attribute ("CCode");
                        attributes.append (attr);
                }
-               attr.add_argument ("type", new StringLiteral ("\"%s\"".printf (ctype)));
+               attr.add_argument ("type", "\"%s\"".printf (ctype));
        }
 
        public override bool check (SemanticAnalyzer analyzer) {
index 415a9fed34819470175216e08fe68db11afbf8fc..28ffbacb040a4f2417c311d6ec6d58c4c7991f74 100644 (file)
@@ -2284,6 +2284,31 @@ public class Vala.Genie.Parser : CodeVisitor {
                return new DeleteStatement (expr, get_src (begin));
        }
 
+       string parse_attribute_value () throws ParseError {
+               switch (current ()) {
+               case TokenType.NULL:
+               case TokenType.TRUE:
+               case TokenType.FALSE:
+               case TokenType.INTEGER_LITERAL:
+               case TokenType.REAL_LITERAL:
+               case TokenType.STRING_LITERAL:
+                       next ();
+                       return get_last_string ();
+               case TokenType.MINUS:
+                       next ();
+                       switch (current ()) {
+                       case TokenType.INTEGER_LITERAL:
+                       case TokenType.REAL_LITERAL:
+                               next ();
+                               return "-" + get_last_string ();
+                       default:
+                               throw new ParseError.SYNTAX (get_error ("expected number"));
+                       }
+               default:
+                       throw new ParseError.SYNTAX (get_error ("expected literal"));
+               }
+       }
+
        List<Attribute>? parse_attributes () throws ParseError {
                if (current () != TokenType.OPEN_BRACKET) {
                        return null;
@@ -2299,8 +2324,7 @@ public class Vala.Genie.Parser : CodeVisitor {
                                                do {
                                                        id = parse_identifier ();
                                                        expect (TokenType.ASSIGN);
-                                                       var expr = parse_expression ();
-                                                       attr.add_argument (id, expr);
+                                                       attr.add_argument (id, parse_attribute_value ());
                                                } while (accept (TokenType.COMMA));
                                        }
                                        expect (TokenType.CLOSE_PARENS);
index 093cd4e22b55c2dde47cd66eb9fbe75948808e90..9f4f34d941e40733d290d97fd4fb7aaa16231628 100644 (file)
@@ -1973,6 +1973,31 @@ public class Vala.Parser : CodeVisitor {
                return new DeleteStatement (expr, get_src (begin));
        }
 
+       string parse_attribute_value () throws ParseError {
+               switch (current ()) {
+               case TokenType.NULL:
+               case TokenType.TRUE:
+               case TokenType.FALSE:
+               case TokenType.INTEGER_LITERAL:
+               case TokenType.REAL_LITERAL:
+               case TokenType.STRING_LITERAL:
+                       next ();
+                       return get_last_string ();
+               case TokenType.MINUS:
+                       next ();
+                       switch (current ()) {
+                       case TokenType.INTEGER_LITERAL:
+                       case TokenType.REAL_LITERAL:
+                               next ();
+                               return "-" + get_last_string ();
+                       default:
+                               throw new ParseError.SYNTAX (get_error ("expected number"));
+                       }
+               default:
+                       throw new ParseError.SYNTAX (get_error ("expected literal"));
+               }
+       }
+
        List<Attribute>? parse_attributes () throws ParseError {
                if (current () != TokenType.OPEN_BRACKET) {
                        return null;
@@ -1988,8 +2013,7 @@ public class Vala.Parser : CodeVisitor {
                                                do {
                                                        id = parse_identifier ();
                                                        expect (TokenType.ASSIGN);
-                                                       var expr = parse_expression ();
-                                                       attr.add_argument (id, expr);
+                                                       attr.add_argument (id, parse_attribute_value ());
                                                } while (accept (TokenType.COMMA));
                                        }
                                        expect (TokenType.CLOSE_PARENS);