summaryrefslogtreecommitdiff
path: root/vala/valaproperty.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2007-05-02 09:42:00 +0000
committerJürg Billeter <juergbi@src.gnome.org>2007-05-02 09:42:00 +0000
commitf8387ad143f1884f8f5f89bd5389605624f4c34f (patch)
treee75e563fc9535200ec146af72962e80778359ae4 /vala/valaproperty.vala
parent9db973114ee1449c1764404163ecc8294f8e73d2 (diff)
downloadvala-f8387ad143f1884f8f5f89bd5389605624f4c34f.tar.gz
Move contents of vala-pkg to trunk
2007-05-02 Jürg Billeter <j@bitron.ch> * Move contents of vala-pkg to trunk svn path=/trunk/; revision=300
Diffstat (limited to 'vala/valaproperty.vala')
-rw-r--r--vala/valaproperty.vala231
1 files changed, 231 insertions, 0 deletions
diff --git a/vala/valaproperty.vala b/vala/valaproperty.vala
new file mode 100644
index 000000000..16b5b29bb
--- /dev/null
+++ b/vala/valaproperty.vala
@@ -0,0 +1,231 @@
+/* valaproperty.vala
+ *
+ * Copyright (C) 2006-2007 Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Jürg Billeter <j@bitron.ch>
+ */
+
+using GLib;
+
+/**
+ * Represents a property declaration in the source code.
+ */
+public class Vala.Property : Member, Lockable {
+ /**
+ * The property name.
+ */
+ public string! name { get; set construct; }
+
+ /**
+ * The property type.
+ */
+ public TypeReference! type_reference { get; set construct; }
+
+ /**
+ * The get accessor of this property if available.
+ */
+ public PropertyAccessor get_accessor { get; set; }
+
+ /**
+ * The set/construct accessor of this property if available.
+ */
+ public PropertyAccessor set_accessor { get; set; }
+
+ /**
+ * Specifies the accessibility of this property. Public accessibility
+ * doesn't limit access. Default accessibility limits access to this
+ * program or library. Private accessibility limits access to the parent
+ * class.
+ */
+ public MemberAccessibility access { get; set; }
+
+ /**
+ * Represents the generated ´this' parameter in this property.
+ */
+ public FormalParameter this_parameter { get; set; }
+
+ /**
+ * Specifies whether the implementation of this property does not
+ * provide getter/setter methods.
+ */
+ public bool no_accessor_method { get; set; }
+
+ /**
+ * Specifies whether automatic accessor code generation should be
+ * disabled.
+ */
+ public bool interface_only { get; set; }
+
+ /**
+ * Specifies whether this property is abstract. Abstract properties have
+ * no accessor bodies, may only be specified within abstract classes and
+ * interfaces, and must be overriden by derived non-abstract classes.
+ */
+ public bool is_abstract { get; set; }
+
+ /**
+ * Specifies whether this property is virtual. Virtual properties may be
+ * overridden by derived classes.
+ */
+ public bool is_virtual { get; set; }
+
+ /**
+ * Specifies whether this property overrides a virtual or abstract
+ * property of a base type.
+ */
+ public bool overrides { get; set; }
+
+ /**
+ * Specifies the virtual or abstract property this property overrides.
+ * Reference must be weak as virtual properties set base_property to
+ * themselves.
+ */
+ public weak Property base_property { get; set; }
+
+ /**
+ * Specifies the abstract interface property this property implements.
+ */
+ public Property base_interface_property { get; set; }
+
+ private bool lock_used = false;
+
+ /**
+ * Creates a new property.
+ *
+ * @param name property name
+ * @param type property type
+ * @param get_accessor get accessor
+ * @param set_accessor set/construct accessor
+ * @param source reference to source code
+ * @return newly created property
+ */
+ public Property (string! _name, TypeReference! type, PropertyAccessor _get_accessor, PropertyAccessor _set_accessor, SourceReference source) {
+ name = _name;
+ type_reference = type;
+ get_accessor = _get_accessor;
+ set_accessor = _set_accessor;
+ source_reference = source;
+ }
+
+ public override void accept (CodeVisitor! visitor) {
+ visitor.visit_member (this);
+ visitor.visit_begin_property (this);
+
+ type_reference.accept (visitor);
+
+ if (get_accessor != null) {
+ get_accessor.accept (visitor);
+ }
+ if (set_accessor != null) {
+ set_accessor.accept (visitor);
+ }
+
+ visitor.visit_end_property (this);
+ }
+
+ /**
+ * Returns the C name of this property in upper case. Words are
+ * separated by underscores. The upper case C name of the class is
+ * prefix of the result.
+ *
+ * @return the upper case name to be used in C code
+ */
+ public ref string! get_upper_case_cname () {
+ return "%s_%s".printf (((DataType) symbol.parent_symbol.node).get_lower_case_cname (null), Namespace.camel_case_to_lower_case (name)).up ();
+ }
+
+ /**
+ * Returns the string literal of this property to be used in C code.
+ *
+ * @return string literal to be used in C code
+ */
+ public ref CCodeConstant! get_canonical_cconstant () {
+ var str = new String ("\"");
+
+ string i = name;
+
+ while (i.len () > 0) {
+ unichar c = i.get_char ();
+ if (c == '_') {
+ str.append_c ('-');
+ } else {
+ str.append_unichar (c);
+ }
+
+ i = i.next_char ();
+ }
+
+ str.append_c ('"');
+
+ return new CCodeConstant (str.str);
+ }
+
+ /**
+ * Process all associated attributes.
+ */
+ public void process_attributes () {
+ foreach (Attribute a in attributes) {
+ if (a.name == "NoAccessorMethod") {
+ no_accessor_method = true;
+ }
+ }
+ }
+
+ public bool get_lock_used () {
+ return lock_used;
+ }
+
+ public void set_lock_used (bool used) {
+ lock_used = used;
+ }
+
+ /**
+ * Checks whether the accessors and type of the specified property
+ * matches this property.
+ *
+ * @param prop a property
+ * @return true if the specified property is compatible to this
+ * property
+ */
+ public bool equals (Property! prop2) {
+ if (!prop2.type_reference.equals (type_reference)) {
+ return false;
+ }
+
+ if ((get_accessor == null && prop2.get_accessor != null) ||
+ (get_accessor != null && prop2.get_accessor == null)) {
+ return false;
+ }
+
+ if ((set_accessor == null && prop2.set_accessor != null) ||
+ (set_accessor != null && prop2.set_accessor == null)) {
+ return false;
+ }
+
+ if (set_accessor != null) {
+ if (set_accessor.writable != prop2.set_accessor.writable) {
+ return false;
+ }
+ if (set_accessor.construction != prop2.set_accessor.construction) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}