aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/runtime/PropertyDescriptor.java
blob: e00759ba9401fd9696183db0a4e083d68ebecd93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package jdk.nashorn.internal.runtime;

/**
 * Describes attributes of a specific property of a script object.
 */
public interface PropertyDescriptor {

    /** Type: generic property descriptor - TODO this should be an enum */
    public static final int GENERIC  = 0;

    /** Type: data property descriptor - TODO this should be an enum */
    public static final int DATA     = 1;

    /** Type: accessor property descriptor - TODO this should be an enum */
    public static final int ACCESSOR = 2;

    /** descriptor for configurable property */
    public static final String CONFIGURABLE = "configurable";

    /** descriptor for enumerable property */
    public static final String ENUMERABLE = "enumerable";

    /** descriptor for writable property */
    public static final String WRITABLE = "writable";

    /** descriptor for value */
    public static final String VALUE = "value";

    /** descriptor for getter */
    public static final String GET = "get";

    /** descriptor for setter */
    public static final String SET = "set";

    /**
     * Check if this {@code PropertyDescriptor} describes a configurable property
     * @return true if configurable
     */
    public boolean isConfigurable();

    /**
     * Check if this {@code PropertyDescriptor} describes an enumerable property
     * @return true if enumerable
     */
    public boolean isEnumerable();

    /**
     * Check if this {@code PropertyDescriptor} describes a wriable property
     * @return true if writable
     */
    public boolean isWritable();

    /**
     * Get the property value as given by this {@code PropertyDescriptor}
     * @return property value
     */
    public Object getValue();

    /**
     * Get the {@link UserAccessorProperty} getter as given by this {@code PropertyDescriptor}
     * @return getter, or null if not available
     */
    public ScriptFunction getGetter();

    /**
     * Get the {@link UserAccessorProperty} setter as given by this {@code PropertyDescriptor}
     * @return setter, or null if not available
     */
    public ScriptFunction getSetter();

    /**
     * Set whether this {@code PropertyDescriptor} describes a configurable property
     * @param flag true if configurable, false otherwise
     */
    public void setConfigurable(boolean flag);

    /**
     * Set whether this {@code PropertyDescriptor} describes an enumerable property
     * @param flag true if enumerable, false otherwise
     */
    public void setEnumerable(boolean flag);

    /**
     * Set whether this {@code PropertyDescriptor} describes a writable property
     * @param flag true if writable, false otherwise
     */
    public void setWritable(boolean flag);

    /**
     * Set the property value for this {@code PropertyDescriptor}
     * @param value property value
     */
    public void setValue(Object value);

    /**
     * Assign a {@link UserAccessorProperty} getter as given to this {@code PropertyDescriptor}
     * @param getter getter, or null if not available
     */
    public void setGetter(Object getter);

    /**
     * Assign a {@link UserAccessorProperty} setter as given to this {@code PropertyDescriptor}
     * @param setter setter, or null if not available
     */
    public void setSetter(Object setter);

    /**
     * Fill in this {@code PropertyDescriptor} from the properties of a given {@link ScriptObject}
     *
     * @param obj the script object
     * @return filled in {@code PropertyDescriptor}
     *
     */
    public PropertyDescriptor fillFrom(ScriptObject obj);

    /**
     * Get the type of this property descriptor.
     * @return property descriptor type, one of {@link PropertyDescriptor#GENERIC}, {@link PropertyDescriptor#DATA} and {@link PropertyDescriptor#ACCESSOR}
     */
    public int type();

    /**
     * Wrapper for {@link ScriptObject#has(Object)}
     *
     * @param key property key
     * @return true if property exists in implementor
     */
    public boolean has(Object key);

    /**
     * Check existence and compare attributes of descriptors.
     * @param otherDesc other descriptor to compare to
     * @return true if every field of this descriptor exists in otherDesc and has the same value.
     */
    public boolean hasAndEquals(PropertyDescriptor otherDesc);
}