]> 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>
Thu, 9 Sep 2010 13:54:17 +0000 (15:54 +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 a1cda9724cff1d6103fe9b5b15076c27751cbbfc..09a08089591b7f807ac8da8977d60068ef850ba6 100644 (file)
@@ -1915,9 +1915,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 5b4b39f6d79095897e62fcf6baf7a58fd6f7e4f5..0649c28c08ac0fc7c2e17e2c97b900e96eba3a02 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 f05c15fc6e9c9d17766d552d70a1883eae7c0a73..edc48130eaadeeeff28e7fef75aa5e9fd076b6ec 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);