Copyright (c) 2000, 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
/*******************************************************************************
* Copyright (c) 2000, 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;
import java.util.ArrayList;
import java.util.List;
Local type declaration statement AST node type.
This kind of node is used to convert a type declaration
node into a statement node by wrapping it.
TypeDeclarationStatement:
TypeDeclaration
EnumDeclaration
Although allowed at the AST, not all arrangements of AST nodes are meaningful;
in particular, only class and enum declarations are meaningful in the context of
a block.
Since: 2.0 @noinstantiate This class is not intended to be instantiated by clients.
/**
* Local type declaration statement AST node type.
* <p>
* This kind of node is used to convert a type declaration
* node into a statement node by wrapping it.
* </p>
* <pre>
* TypeDeclarationStatement:
* TypeDeclaration
* EnumDeclaration
* </pre>
* Although allowed at the AST, not all arrangements of AST nodes are meaningful;
* in particular, only class and enum declarations are meaningful in the context of
* a block.
*
* @since 2.0
* @noinstantiate This class is not intended to be instantiated by clients.
*/
@SuppressWarnings("rawtypes")
public class TypeDeclarationStatement extends Statement {
The "typeDeclaration" structural property of this node type (child type: TypeDeclaration
) (JLS2 API only). Since: 3.0 Deprecated: In the JLS3 API, this property is replaced by DECLARATION_PROPERTY
.
/**
* The "typeDeclaration" structural property of this node type (child type: {@link TypeDeclaration}) (JLS2 API only).
* @since 3.0
* @deprecated In the JLS3 API, this property is replaced by {@link #DECLARATION_PROPERTY}.
*/
public static final ChildPropertyDescriptor TYPE_DECLARATION_PROPERTY =
new ChildPropertyDescriptor(TypeDeclarationStatement.class, "typeDeclaration", TypeDeclaration.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
The "declaration" structural property of this node type (child type: AbstractTypeDeclaration
) (added in JLS3 API). Since: 3.1
/**
* The "declaration" structural property of this node type (child type: {@link AbstractTypeDeclaration}) (added in JLS3 API).
* @since 3.1
*/
public static final ChildPropertyDescriptor DECLARATION_PROPERTY =
new ChildPropertyDescriptor(TypeDeclarationStatement.class, "declaration", AbstractTypeDeclaration.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
A list of property descriptors (element type: StructuralPropertyDescriptor
), or null if uninitialized. Since: 3.0
/**
* A list of property descriptors (element type:
* {@link StructuralPropertyDescriptor}),
* or null if uninitialized.
* @since 3.0
*/
private static final List PROPERTY_DESCRIPTORS_2_0;
A list of property descriptors (element type: StructuralPropertyDescriptor
), or null if uninitialized. Since: 3.1
/**
* A list of property descriptors (element type:
* {@link StructuralPropertyDescriptor}),
* or null if uninitialized.
* @since 3.1
*/
private static final List PROPERTY_DESCRIPTORS_3_0;
static {
List propertyList = new ArrayList(2);
createPropertyList(TypeDeclarationStatement.class, propertyList);
addProperty(TYPE_DECLARATION_PROPERTY, propertyList);
PROPERTY_DESCRIPTORS_2_0 = reapPropertyList(propertyList);
propertyList = new ArrayList(2);
createPropertyList(TypeDeclarationStatement.class, propertyList);
addProperty(DECLARATION_PROPERTY, propertyList);
PROPERTY_DESCRIPTORS_3_0 = reapPropertyList(propertyList);
}
Returns a list of structural property descriptors for this node type.
Clients must not modify the result.
Params: - apiLevel – the API level; one of the
AST.JLS*
constants
Returns: a list of property descriptors (element type: StructuralPropertyDescriptor
) Since: 3.0
/**
* Returns a list of structural property descriptors for this node type.
* Clients must not modify the result.
*
* @param apiLevel the API level; one of the
* <code>AST.JLS*</code> constants
* @return a list of property descriptors (element type:
* {@link StructuralPropertyDescriptor})
* @since 3.0
*/
public static List propertyDescriptors(int apiLevel) {
if (apiLevel == AST.JLS2_INTERNAL) {
return PROPERTY_DESCRIPTORS_2_0;
} else {
return PROPERTY_DESCRIPTORS_3_0;
}
}
The type declaration; lazily initialized; defaults to a unspecified,
but legal, type declaration. In JLS2, corresponds to TYPE_DECLARATION_PROPERTY.
After JLS2, corresponds to DECLARATION_PROPERTY.
See Also: - typeDeclProperty
/**
* The type declaration; lazily initialized; defaults to a unspecified,
* but legal, type declaration. In JLS2, corresponds to TYPE_DECLARATION_PROPERTY.
* After JLS2, corresponds to DECLARATION_PROPERTY.
* @see #typeDeclProperty
*/
private AbstractTypeDeclaration typeDecl = null;
The child property stored on the typeDecl
instance variable.
In JLS2, corresponds to TYPE_DECLARATION_PROPERTY. After JLS2, corresponds to
DECLARATION_PROPERTY.
Returns: the property corresponding to the typeDecl
instance variable;
never null
/**
* The child property stored on the <code>typeDecl</code> instance variable.
* In JLS2, corresponds to TYPE_DECLARATION_PROPERTY. After JLS2, corresponds to
* DECLARATION_PROPERTY.
*
* @return the property corresponding to the <code>typeDecl</code> instance variable;
* never <code>null</code>
*/
private ChildPropertyDescriptor typeDeclProperty () {
if (getAST().apiLevel() == AST.JLS2_INTERNAL) {
return TYPE_DECLARATION_PROPERTY;
} else {
return DECLARATION_PROPERTY;
}
}
Creates a new unparented local type declaration statement node owned
by the given AST. By default, the local type declaration is an
unspecified, but legal, type declaration.
N.B. This constructor is package-private.
Params: - ast – the AST that is to own this node
/**
* Creates a new unparented local type declaration statement node owned
* by the given AST. By default, the local type declaration is an
* unspecified, but legal, type declaration.
* <p>
* N.B. This constructor is package-private.
* </p>
*
* @param ast the AST that is to own this node
*/
TypeDeclarationStatement(AST ast) {
super(ast);
}
/* (omit javadoc for this method)
* Method declared on ASTNode.
* @since 3.0
*/
@Override
final List internalStructuralPropertiesForType(int apiLevel) {
return propertyDescriptors(apiLevel);
}
@Override
final ASTNode internalGetSetChildProperty(ChildPropertyDescriptor property, boolean get, ASTNode child) {
if (property == TYPE_DECLARATION_PROPERTY) {
if (get) {
return getTypeDeclaration();
} else {
setTypeDeclaration((TypeDeclaration) child);
return null;
}
}
if (property == DECLARATION_PROPERTY) {
if (get) {
return getDeclaration();
} else {
setDeclaration((AbstractTypeDeclaration) child);
return null;
}
}
// allow default implementation to flag the error
return super.internalGetSetChildProperty(property, get, child);
}
@Override
final int getNodeType0() {
return TYPE_DECLARATION_STATEMENT;
}
@Override
ASTNode clone0(AST target) {
TypeDeclarationStatement result =
new TypeDeclarationStatement(target);
result.setSourceRange(getStartPosition(), getLength());
result.copyLeadingComment(this);
result.setDeclaration(
(AbstractTypeDeclaration) getDeclaration().clone(target));
return result;
}
@Override
final boolean subtreeMatch0(ASTMatcher matcher, Object other) {
// dispatch to correct overloaded match method
return matcher.match(this, other);
}
@Override
void accept0(ASTVisitor visitor) {
boolean visitChildren = visitor.visit(this);
if (visitChildren) {
acceptChild(visitor, getDeclaration());
}
visitor.endVisit(this);
}
Returns the abstract type declaration of this local type declaration
statement (added in JLS3 API).
Returns: the type declaration node Since: 3.1
/**
* Returns the abstract type declaration of this local type declaration
* statement (added in JLS3 API).
*
* @return the type declaration node
* @since 3.1
*/
public AbstractTypeDeclaration getDeclaration() {
if (this.typeDecl == null) {
// lazy init must be thread-safe for readers
synchronized (this) {
if (this.typeDecl == null) {
preLazyInit();
this.typeDecl = new TypeDeclaration(this.ast);
postLazyInit(this.typeDecl, typeDeclProperty());
}
}
}
return this.typeDecl;
}
Sets the abstract type declaration of this local type declaration
statement (added in JLS3 API).
Params: - decl – the type declaration node
Throws: - IllegalArgumentException – if:
- the node belongs to a different AST
- the node already has a parent
- a cycle in would be created
Since: 3.1
/**
* Sets the abstract type declaration of this local type declaration
* statement (added in JLS3 API).
*
* @param decl the type declaration node
* @exception IllegalArgumentException if:
* <ul>
* <li>the node belongs to a different AST</li>
* <li>the node already has a parent</li>
* <li>a cycle in would be created</li>
* </ul>
* @since 3.1
*/
public void setDeclaration(AbstractTypeDeclaration decl) {
if (decl == null) {
throw new IllegalArgumentException();
}
// a TypeDeclarationStatement may occur inside an
// TypeDeclaration - must check cycles
ASTNode oldChild = this.typeDecl;
ChildPropertyDescriptor typeDeclProperty = typeDeclProperty();
preReplaceChild(oldChild, decl, typeDeclProperty);
this.typeDecl= decl;
postReplaceChild(oldChild, decl, typeDeclProperty);
}
Returns the type declaration of this local type declaration
statement (JLS2 API only).
Throws: - UnsupportedOperationException – if this operation is used in
an AST later than JLS2
Returns: the type declaration node Deprecated: In the JLS3 API, this method is replaced by getDeclaration()
, which returns AbstractTypeDeclaration
instead of TypeDeclaration
.
/**
* Returns the type declaration of this local type declaration
* statement (JLS2 API only).
*
* @return the type declaration node
* @exception UnsupportedOperationException if this operation is used in
* an AST later than JLS2
* @deprecated In the JLS3 API, this method is replaced by
* {@link #getDeclaration()}, which returns <code>AbstractTypeDeclaration</code>
* instead of <code>TypeDeclaration</code>.
*/
public TypeDeclaration getTypeDeclaration() {
return internalGetTypeDeclaration();
}
Internal synonym for deprecated method. Used to avoid
deprecation warnings.
Since: 3.1
/**
* Internal synonym for deprecated method. Used to avoid
* deprecation warnings.
* @since 3.1
*/
/*package*/ final TypeDeclaration internalGetTypeDeclaration() {
supportedOnlyIn2();
return (TypeDeclaration) getDeclaration();
}
Sets the type declaration of this local type declaration
statement (JLS2 API only).
Params: - decl – the type declaration node
Throws: - IllegalArgumentException – if:
- the node belongs to a different AST
- the node already has a parent
- a cycle in would be created
- UnsupportedOperationException – if this operation is used in
an AST later than JLS2
Deprecated: In the JLS3 API, this method is replaced by setDeclaration(AbstractTypeDeclaration)
which takes AbstractTypeDeclaration
instead of
TypeDeclaration
.
/**
* Sets the type declaration of this local type declaration
* statement (JLS2 API only).
*
* @param decl the type declaration node
* @exception IllegalArgumentException if:
* <ul>
* <li>the node belongs to a different AST</li>
* <li>the node already has a parent</li>
* <li>a cycle in would be created</li>
* </ul>
* @exception UnsupportedOperationException if this operation is used in
* an AST later than JLS2
* @deprecated In the JLS3 API, this method is replaced by
* {@link #setDeclaration(AbstractTypeDeclaration)} which takes
* <code>AbstractTypeDeclaration</code> instead of
* <code>TypeDeclaration</code>.
*/
public void setTypeDeclaration(TypeDeclaration decl) {
internalSetTypeDeclaration(decl);
}
Internal synonym for deprecated method. Used to avoid
deprecation warnings.
Since: 3.1
/**
* Internal synonym for deprecated method. Used to avoid
* deprecation warnings.
* @since 3.1
*/
/*package*/ final void internalSetTypeDeclaration(TypeDeclaration decl) {
supportedOnlyIn2();
// forward to non-deprecated replacement method
setDeclaration(decl);
}
Resolves and returns the binding for the class or interface declared in
this type declaration statement.
Note that bindings are generally unavailable unless requested when the
AST is being built.
Returns: the binding, or null
if the binding cannot be
resolved
/**
* Resolves and returns the binding for the class or interface declared in
* this type declaration statement.
* <p>
* Note that bindings are generally unavailable unless requested when the
* AST is being built.
* </p>
*
* @return the binding, or <code>null</code> if the binding cannot be
* resolved
*/
public ITypeBinding resolveBinding() {
// forward request to the wrapped type declaration
AbstractTypeDeclaration d = getDeclaration();
if (d instanceof TypeDeclaration) {
return ((TypeDeclaration) d).resolveBinding();
} else if (d instanceof AnnotationTypeDeclaration) {
return ((AnnotationTypeDeclaration) d).resolveBinding();
} else {
// shouldn't happen
return null;
}
}
@Override
int memSize() {
return super.memSize() + 1 * 4;
}
@Override
int treeSize() {
return
memSize()
+ (this.typeDecl == null ? 0 : getDeclaration().treeSize());
}
}