| /******************************************************************************* |
| * Copyright (c) 2004, 2013 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.core.dom; |
| |
| /** |
| * Abstract base class for property descriptors of AST nodes. |
| * There are three kinds of properties: |
| * <ul> |
| * <li>simple properties ({@link SimplePropertyDescriptor}) |
| * - properties where the value is a primitive (int, boolean) |
| * or simple (String, InfixExprsssion.Operator) type other than an |
| * AST node; for example, the identifier of a {@link SimpleName}</li> |
| * <li>child properties ({@link ChildPropertyDescriptor}) |
| * - properties whose value is another AST node; |
| * for example, the name of a {@link MethodDeclaration}</li> |
| * <li>child list properties ({@link ChildListPropertyDescriptor}) |
| * - properties where the value is a list of AST nodes; |
| * for example, the statements of a {@link Block}</li> |
| * </ul> |
| * |
| * @since 3.0 |
| * @noextend This class is not intended to be subclassed by clients. |
| */ |
| @SuppressWarnings("rawtypes") |
| public abstract class StructuralPropertyDescriptor { |
| |
| /** |
| * Property id. |
| */ |
| private final String propertyId; |
| |
| /** |
| * The concrete AST node type that owns this property. |
| */ |
| private final Class nodeClass; |
| |
| /** |
| * Creates a new property descriptor for the given node type |
| * with the given property id. |
| * Note that this constructor is declared package-private so that |
| * property descriptors can only be created by the AST |
| * implementation. |
| * |
| * @param nodeClass concrete AST node type that owns this property |
| * @param propertyId the property id |
| */ |
| StructuralPropertyDescriptor(Class nodeClass, String propertyId) { |
| if (nodeClass == null || propertyId == null) { |
| throw new IllegalArgumentException(); |
| } |
| this.propertyId = propertyId; |
| this.nodeClass = nodeClass; |
| } |
| |
| /** |
| * Returns the id of this property. |
| * |
| * @return the property id |
| */ |
| public final String getId() { |
| return this.propertyId; |
| } |
| |
| /** |
| * Returns the AST node type that owns this property. |
| * <p> |
| * For example, for all properties of the node type |
| * TypeDeclaration, this method returns <code>TypeDeclaration.class</code>. |
| * </p> |
| * |
| * @return the node type that owns this property |
| */ |
| public final Class getNodeClass() { |
| return this.nodeClass; |
| } |
| |
| /** |
| * Returns whether this property is a simple property |
| * (instance of {@link SimplePropertyDescriptor}. |
| * |
| * @return <code>true</code> if this is a simple property, and |
| * <code>false</code> otherwise |
| */ |
| public final boolean isSimpleProperty(){ |
| return (this instanceof SimplePropertyDescriptor); |
| } |
| |
| /** |
| * Returns whether this property is a child property |
| * (instance of {@link ChildPropertyDescriptor}. |
| * |
| * @return <code>true</code> if this is a child property, and |
| * <code>false</code> otherwise |
| */ |
| public final boolean isChildProperty() { |
| return (this instanceof ChildPropertyDescriptor); |
| } |
| |
| /** |
| * Returns whether this property is a child list property |
| * (instance of {@link ChildListPropertyDescriptor}. |
| * |
| * @return <code>true</code> if this is a child list property, and |
| * <code>false</code> otherwise |
| */ |
| public final boolean isChildListProperty() { |
| return (this instanceof ChildListPropertyDescriptor); |
| } |
| |
| /** |
| * Returns a string suitable for debug purposes. |
| * @return {@inheritDoc} |
| */ |
| @Override |
| public String toString() { |
| StringBuffer b = new StringBuffer(); |
| if (isChildListProperty()) { |
| b.append("ChildList"); //$NON-NLS-1$ |
| } |
| if (isChildProperty()) { |
| b.append("Child"); //$NON-NLS-1$ |
| } |
| if (isSimpleProperty()) { |
| b.append("Simple"); //$NON-NLS-1$ |
| } |
| b.append("Property["); //$NON-NLS-1$ |
| if (this.nodeClass != null) { |
| b.append(this.nodeClass.getName()); |
| } |
| b.append(","); //$NON-NLS-1$ |
| if (this.propertyId != null) { |
| b.append(this.propertyId); |
| } |
| b.append("]"); //$NON-NLS-1$ |
| return b.toString(); |
| } |
| } |