Class CtElementImpl
- java.lang.Object
-
- spoon.support.reflect.declaration.CtElementImpl
-
- All Implemented Interfaces:
Serializable
,Cloneable
,FactoryAccessor
,SourcePositionHolder
,CtElement
,CtQueryable
,CtVisitable
- Direct Known Subclasses:
CtCodeElementImpl
,CtCompilationUnitImpl
,CtImportImpl
,CtJavaDocTagImpl
,CtModuleRequirementImpl
,CtNamedElementImpl
,CtPackageDeclarationImpl
,CtPackageExportImpl
,CtProvidedServiceImpl
,CtReferenceImpl
,CtTypeMemberWildcardImportReferenceImpl
,CtUnresolvedImport
,CtUsedServiceImpl
public abstract class CtElementImpl extends Object implements CtElement
Contains the default implementation of most CtElement methods.- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description static String
ERROR_MESSAGE_TO_STRING
protected Factory
factory
this field `factory` must be transient in order to allow proper serialization the factory is restored in all AST nodes inSerializationModelStreamer
protected static org.slf4j.Logger
LOGGER
protected CtElement
parent
-
Constructor Summary
Constructors Constructor Description CtElementImpl()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description <E extends CtElement>
EaddAnnotation(CtAnnotation<? extends Annotation> annotation)
Add an annotation for this element<E extends CtElement>
EaddComment(CtComment comment)
Add a comment to the current elementelement.addComment(element.getFactory().Code().createComment("comment", CtComment.CommentType.INLINE)
Iterable<CtElement>
asIterable()
Returns an Iterable instance of this CtElement, allowing for dfs traversal of its descendants.CtElement
clone()
Clone the element which calls this method in a new object.void
comment()
Replace the statement with a CtComment having the statement as textvoid
delete()
Deletes the element.Iterator<CtElement>
descendantIterator()
Returns an iterator over this CtElement's descendants.static <T> List<T>
emptyList()
static <T> Set<T>
emptySet()
boolean
equals(Object o)
<P extends CtElement>
CtQueryfilterChildren(Filter<P> predicate)
Map<String,Object>
getAllMetadata()
Retrieves all metadata stored in an element.<E extends CtElement>
List<E>getAnnotatedChildren(Class<? extends Annotation> annotationType)
Gets the child elements annotated with the given annotation type's instances.<A extends Annotation>
AgetAnnotation(Class<A> annotationType)
Searches for an annotation of the given class that annotates the current element.<A extends Annotation>
CtAnnotation<A>getAnnotation(CtTypeReference<A> annotationType)
Gets the annotation element for a given annotation type.List<CtAnnotation<? extends Annotation>>
getAnnotations()
Returns the annotations that are present on this element.List<CtComment>
getComments()
The list of commentsList<CtElement>
getDirectChildren()
String
getDocComment()
Returns the text of the documentation ("javadoc") comment of this element.<E extends CtElement>
List<E>getElements(Filter<E> filter)
Returns all the children elements recursively matching the filter.Factory
getFactory()
Gets the factory of this object.Object
getMetadata(String key)
Retrieves metadata stored in an element.Set<String>
getMetadataKeys()
Returns the metadata keys stored in an element.ElementSourceFragment
getOriginalSourceFragment()
Returns the original source code (maybe different from toString() if a transformation has been applied).CtElement
getParent()
Gets the parent of current reference.<P extends CtElement>
PgetParent(Class<P> parentType)
Gets the first parent that matches the given type.<E extends CtElement>
EgetParent(Filter<E> filter)
Gets the first parent that matches the filter.CtPath
getPath()
Return the path from the model root to this CtElement, eg `.spoon.test.path.Foo.foo#body#statement[index=0]`SourcePosition
getPosition()
Gets the position of this element in input source filesSet<CtTypeReference<?>>
getReferencedTypes()
Calculates and returns the set of all the types referenced by this element (and sub-elements in the AST).CtRole
getRoleInParent()
String
getShortRepresentation()
Build a short representation of any element.<T> T
getValueByRole(CtRole role)
<A extends Annotation>
booleanhasAnnotation(Class<A> annotationType)
int
hashCode()
boolean
hasParent(CtElement candidate)
Tells if the given element is a direct or indirect parent.boolean
isImplicit()
Returns true if this element is not present in the code (automatically added by the Java compiler or inferred when the model is built).boolean
isParentInitialized()
Tells if this parent has been initialized.<I> CtQuery
map(CtConsumableFunction<I> queryStep)
<I,R>
CtQuerymap(CtFunction<I,R> function)
String
prettyprint()
<E extends CtElement>
EputMetadata(String key, Object val)
Saves metadata inside an Element.boolean
removeAnnotation(CtAnnotation<? extends Annotation> annotation)
Remove an annotation for this element<E extends CtElement>
EremoveComment(CtComment comment)
Remove a comment<E extends CtElement>
voidreplace(Collection<E> elements)
Replaces this element by several elements.void
replace(CtElement element)
Replaces this element by another one.<E extends CtElement>
EsetAllMetadata(Map<String,Object> metadata)
Saves a bunch of metadata inside an Element<E extends CtElement>
EsetAnnotations(List<CtAnnotation<? extends Annotation>> annotations)
Sets the annotations for this element.<E extends CtElement>
EsetComments(List<CtComment> comments)
Set the comment list<E extends CtElement>
EsetDocComment(String docComment)
Sets the text of the documentation ("javadoc") comment of this declaration.void
setFactory(Factory factory)
Sets the factory object.<E extends CtElement>
EsetImplicit(boolean implicit)
Sets this element to be implicit.<E extends CtElement>
EsetParent(CtElement parent)
Manually sets the parent element of the current element.<E extends CtElement>
EsetPosition(SourcePosition position)
Sets the position in the Java source file.<E extends CtElement>
EsetPositions(SourcePosition position)
Sets the position of this element and all its children element.<E extends CtElement,T>
EsetValueByRole(CtRole role, T value)
Sets a field according to a role.String
toString()
String
toStringDebug()
static <T> List<T>
unmodifiableList(List<T> list)
void
updateAllParentsBelow()
Calculates and sets all the parents below this element.-
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface spoon.reflect.visitor.CtVisitable
accept
-
-
-
-
Field Detail
-
LOGGER
protected static final org.slf4j.Logger LOGGER
-
ERROR_MESSAGE_TO_STRING
public static final String ERROR_MESSAGE_TO_STRING
- See Also:
- Constant Field Values
-
factory
protected transient Factory factory
this field `factory` must be transient in order to allow proper serialization the factory is restored in all AST nodes inSerializationModelStreamer
-
parent
protected CtElement parent
-
-
Method Detail
-
emptyList
public static <T> List<T> emptyList()
-
emptySet
public static <T> Set<T> emptySet()
-
getShortRepresentation
public String getShortRepresentation()
Description copied from interface:CtElement
Build a short representation of any element.- Specified by:
getShortRepresentation
in interfaceCtElement
-
getAnnotation
public <A extends Annotation> A getAnnotation(Class<A> annotationType)
Description copied from interface:CtElement
Searches for an annotation of the given class that annotates the current element. When used with a shadow element, this method might return an empty list even on an annotated element because annotations without a RUNTIME retention policy are lost after compilation. WARNING: this method uses a class loader proxy, which is costly. UseCtElement.getAnnotation(CtTypeReference)
preferably.NOTE: before using an annotation proxy, you have to make sure that all the types referenced by the annotation have been compiled and are in the classpath so that accessed values can be converted into the actual types.
- Specified by:
getAnnotation
in interfaceCtElement
- Type Parameters:
A
- the annotation's type- Parameters:
annotationType
- the annotation's class- Returns:
- if found, returns a proxy for this annotation
-
hasAnnotation
public <A extends Annotation> boolean hasAnnotation(Class<A> annotationType)
- Specified by:
hasAnnotation
in interfaceCtElement
- Parameters:
annotationType
- the annotation type- Returns:
- true if the element is annotated by the given annotation type.
-
getAnnotation
public <A extends Annotation> CtAnnotation<A> getAnnotation(CtTypeReference<A> annotationType)
Description copied from interface:CtElement
Gets the annotation element for a given annotation type. When used with a shadow element, this method might return an empty list even on an annotated element because annotations without a RUNTIME retention policy are lost after compilation.- Specified by:
getAnnotation
in interfaceCtElement
- Parameters:
annotationType
- the annotation type- Returns:
- the annotation if this element is annotated by one annotation of the given type
-
getAnnotations
public List<CtAnnotation<? extends Annotation>> getAnnotations()
Description copied from interface:CtElement
Returns the annotations that are present on this element. For sake of encapsulation, the returned list is unmodifiable.- Specified by:
getAnnotations
in interfaceCtElement
-
getDocComment
public String getDocComment()
Description copied from interface:CtElement
Returns the text of the documentation ("javadoc") comment of this element. It contains the text of Javadoc together with the tags. If one only wants only the text without the tag, one can call `getComments().get(0).getContent()` If one wants to analyze the tags, one can call `getComments().get(0).asJavaDoc().getTags()` See alsoCtElement.getComments()
.andCtJavaDoc
- Specified by:
getDocComment
in interfaceCtElement
-
getPosition
public SourcePosition getPosition()
Description copied from interface:CtElement
Gets the position of this element in input source files- Specified by:
getPosition
in interfaceCtElement
- Specified by:
getPosition
in interfaceSourcePositionHolder
- Returns:
- Source file and line number of this element.
It never returns null. Use
SourcePosition.isValidPosition()
to detect whether return instance contains start/end indexes.
-
setAnnotations
public <E extends CtElement> E setAnnotations(List<CtAnnotation<? extends Annotation>> annotations)
Description copied from interface:CtElement
Sets the annotations for this element.- Specified by:
setAnnotations
in interfaceCtElement
-
delete
public void delete()
Description copied from interface:CtElement
Deletes the element. For instance, delete a statement from its containing block. Warning: it may result in an incorrect AST, use at your own risk.
-
addAnnotation
public <E extends CtElement> E addAnnotation(CtAnnotation<? extends Annotation> annotation)
Description copied from interface:CtElement
Add an annotation for this element- Specified by:
addAnnotation
in interfaceCtElement
- Returns:
- true if this element changed as a result of the call
-
removeAnnotation
public boolean removeAnnotation(CtAnnotation<? extends Annotation> annotation)
Description copied from interface:CtElement
Remove an annotation for this element- Specified by:
removeAnnotation
in interfaceCtElement
- Returns:
- true if this element changed as a result of the call
-
setDocComment
public <E extends CtElement> E setDocComment(String docComment)
Description copied from interface:CtElement
Sets the text of the documentation ("javadoc") comment of this declaration. This API will set the content of the first javadocCtComment
or create a new javadocCtComment
if no javadocCtComment
is available on this object.- Specified by:
setDocComment
in interfaceCtElement
-
setPosition
public <E extends CtElement> E setPosition(SourcePosition position)
Description copied from interface:CtElement
Sets the position in the Java source file. Note that this information is used to feed the line numbers in the generated bytecode if any (which is useful for debugging).- Specified by:
setPosition
in interfaceCtElement
- Parameters:
position
- of this element in the input source files
-
setPositions
public <E extends CtElement> E setPositions(SourcePosition position)
Description copied from interface:CtElement
Sets the position of this element and all its children element. Note that this information is used to feed the line numbers in the generated bytecode if any (which is useful for debugging).- Specified by:
setPositions
in interfaceCtElement
- Parameters:
position
- of this element and all children in the input source file
-
prettyprint
public String prettyprint()
- Specified by:
prettyprint
in interfaceCtElement
- Returns:
- the source code of this element with the pretty-printing rules of Spoon
Warning: this is not side-effect free, this triggers some
ImportAnalyzer
which would change the model: add/remove imports, change the value `implicit` of some model elements, etc.
-
toStringDebug
public String toStringDebug()
- Specified by:
toStringDebug
in interfaceCtElement
- Returns:
- the most straightforward and explicit version of this element.
-
toString
public String toString()
- Specified by:
toString
in interfaceCtElement
- Overrides:
toString
in classObject
- Returns:
- the source code of this element according to the setting of
Environment.getPrettyPrintingMode()
.
-
getAnnotatedChildren
public <E extends CtElement> List<E> getAnnotatedChildren(Class<? extends Annotation> annotationType)
Description copied from interface:CtElement
Gets the child elements annotated with the given annotation type's instances.- Specified by:
getAnnotatedChildren
in interfaceCtElement
- Type Parameters:
E
- the element's type- Parameters:
annotationType
- the annotation type- Returns:
- all the child elements annotated with an instance of the given annotation type
-
isImplicit
public boolean isImplicit()
Description copied from interface:CtElement
Returns true if this element is not present in the code (automatically added by the Java compiler or inferred when the model is built). Consequently, implicit elements are not pretty-printed and have no position.- Specified by:
isImplicit
in interfaceCtElement
-
setImplicit
public <E extends CtElement> E setImplicit(boolean implicit)
Description copied from interface:CtElement
Sets this element to be implicit.- Specified by:
setImplicit
in interfaceCtElement
-
getReferencedTypes
public Set<CtTypeReference<?>> getReferencedTypes()
Description copied from interface:CtElement
Calculates and returns the set of all the types referenced by this element (and sub-elements in the AST).- Specified by:
getReferencedTypes
in interfaceCtElement
-
getElements
public <E extends CtElement> List<E> getElements(Filter<E> filter)
Description copied from interface:CtElement
Returns all the children elements recursively matching the filter. If the receiver (this) matches the filter, it is also returned- Specified by:
getElements
in interfaceCtElement
-
map
public <I> CtQuery map(CtConsumableFunction<I> queryStep)
- Specified by:
map
in interfaceCtQueryable
- See Also:
CtQuery.map(CtConsumableFunction)
-
map
public <I,R> CtQuery map(CtFunction<I,R> function)
- Specified by:
map
in interfaceCtQueryable
- See Also:
CtQuery.map(CtFunction)
-
filterChildren
public <P extends CtElement> CtQuery filterChildren(Filter<P> predicate)
- Specified by:
filterChildren
in interfaceCtQueryable
- See Also:
CtQuery.filterChildren(Filter)
-
getParent
public CtElement getParent() throws ParentNotInitializedException
Description copied from interface:CtElement
Gets the parent of current reference.- Specified by:
getParent
in interfaceCtElement
- Throws:
ParentNotInitializedException
- when the parent of this element is not initialized
-
setParent
public <E extends CtElement> E setParent(CtElement parent)
Description copied from interface:CtElement
Manually sets the parent element of the current element.
-
isParentInitialized
public boolean isParentInitialized()
Description copied from interface:CtElement
Tells if this parent has been initialized.- Specified by:
isParentInitialized
in interfaceCtElement
-
getParent
public <P extends CtElement> P getParent(Class<P> parentType)
Description copied from interface:CtElement
Gets the first parent that matches the given type.
-
getParent
public <E extends CtElement> E getParent(Filter<E> filter)
Description copied from interface:CtElement
Gets the first parent that matches the filter.
-
hasParent
public boolean hasParent(CtElement candidate)
Description copied from interface:CtElement
Tells if the given element is a direct or indirect parent.
-
getRoleInParent
public CtRole getRoleInParent()
- Specified by:
getRoleInParent
in interfaceCtElement
- Returns:
- the
CtRole
of the parent's attribute where this element is used. It returns the primary role. For example ((CtMethod) method).getRoleInParent() returnsCtRole.TYPE_MEMBER
.
Returns null if parent doesn't contain this element as direct children or if this element has no parent.
-
updateAllParentsBelow
public void updateAllParentsBelow()
Description copied from interface:CtElement
Calculates and sets all the parents below this element. This function can be called to check and fix parents after manipulating the model.- Specified by:
updateAllParentsBelow
in interfaceCtElement
-
getFactory
public Factory getFactory()
Description copied from interface:FactoryAccessor
Gets the factory of this object.- Specified by:
getFactory
in interfaceFactoryAccessor
-
setFactory
public void setFactory(Factory factory)
Description copied from interface:FactoryAccessor
Sets the factory object.- Specified by:
setFactory
in interfaceFactoryAccessor
-
replace
public void replace(CtElement element)
Description copied from interface:CtElement
Replaces this element by another one.
-
replace
public <E extends CtElement> void replace(Collection<E> elements)
Description copied from interface:CtElement
Replaces this element by several elements. If `elements` contains one single element, it is equivalent toCtElement.replace(CtElement)
. If `elements` is empty, it is equivalent toCtElement.delete()
.
-
setAllMetadata
public <E extends CtElement> E setAllMetadata(Map<String,Object> metadata)
Description copied from interface:CtElement
Saves a bunch of metadata inside an Element- Specified by:
setAllMetadata
in interfaceCtElement
-
putMetadata
public <E extends CtElement> E putMetadata(String key, Object val)
Description copied from interface:CtElement
Saves metadata inside an Element.- Specified by:
putMetadata
in interfaceCtElement
-
getMetadata
public Object getMetadata(String key)
Description copied from interface:CtElement
Retrieves metadata stored in an element. Returns null if it does not exist.- Specified by:
getMetadata
in interfaceCtElement
-
getAllMetadata
public Map<String,Object> getAllMetadata()
Description copied from interface:CtElement
Retrieves all metadata stored in an element.- Specified by:
getAllMetadata
in interfaceCtElement
-
getMetadataKeys
public Set<String> getMetadataKeys()
Description copied from interface:CtElement
Returns the metadata keys stored in an element.- Specified by:
getMetadataKeys
in interfaceCtElement
-
getComments
public List<CtComment> getComments()
Description copied from interface:CtElement
The list of comments- Specified by:
getComments
in interfaceCtElement
- Returns:
- the list of comment
-
addComment
public <E extends CtElement> E addComment(CtComment comment)
Description copied from interface:CtElement
Add a comment to the current elementelement.addComment(element.getFactory().Code().createComment("comment", CtComment.CommentType.INLINE)
- Specified by:
addComment
in interfaceCtElement
- Parameters:
comment
- the comment
-
removeComment
public <E extends CtElement> E removeComment(CtComment comment)
Description copied from interface:CtElement
Remove a comment- Specified by:
removeComment
in interfaceCtElement
- Parameters:
comment
- the comment to remove
-
setComments
public <E extends CtElement> E setComments(List<CtComment> comments)
Description copied from interface:CtElement
Set the comment list- Specified by:
setComments
in interfaceCtElement
-
clone
public CtElement clone()
Description copied from interface:CtElement
Clone the element which calls this method in a new object. Note that that references are kept as is, and thus, so if you clone whole classes or methods, some parts of the cloned element (eg executable references) may still point to the initial element. In this case, consider using methodsRefactoring.copyType(CtType)
andRefactoring.copyMethod(CtMethod)
instead which does additional work beyond cloning.
-
getValueByRole
public <T> T getValueByRole(CtRole role)
- Specified by:
getValueByRole
in interfaceCtElement
- Parameters:
role
- the role of the returned attribute with respect to this element. For instance, "klass.getValueByRole(CtRole.METHOD)" returns a list of methods. SeeRoleHandlerHelper
for more advanced methods.- Returns:
- a a single value (eg a CtElement), List, Set or Map depending on this `element` and `role`. Returned collections are read-only.
-
setValueByRole
public <E extends CtElement,T> E setValueByRole(CtRole role, T value)
Description copied from interface:CtElement
Sets a field according to a role.- Specified by:
setValueByRole
in interfaceCtElement
- Parameters:
role
- the role of the field to be setvalue
- to be assigned to this field.
-
getPath
public CtPath getPath()
Description copied from interface:CtElement
Return the path from the model root to this CtElement, eg `.spoon.test.path.Foo.foo#body#statement[index=0]`
-
descendantIterator
public Iterator<CtElement> descendantIterator()
Description copied from interface:CtElement
Returns an iterator over this CtElement's descendants.- Specified by:
descendantIterator
in interfaceCtElement
- Returns:
- An iterator over this CtElement's descendants.
-
asIterable
public Iterable<CtElement> asIterable()
Description copied from interface:CtElement
Returns an Iterable instance of this CtElement, allowing for dfs traversal of its descendants.- Specified by:
asIterable
in interfaceCtElement
- Returns:
- an Iterable object that allows iterating through this CtElement's descendants.
-
getOriginalSourceFragment
public ElementSourceFragment getOriginalSourceFragment()
Description copied from interface:SourcePositionHolder
Returns the original source code (maybe different from toString() if a transformation has been applied). Warning: this is a advanced method which cannot be considered as part of the stable API- Specified by:
getOriginalSourceFragment
in interfaceCtElement
- Specified by:
getOriginalSourceFragment
in interfaceSourcePositionHolder
-
comment
public void comment()
Replace the statement with a CtComment having the statement as text
-
getDirectChildren
public List<CtElement> getDirectChildren()
- Specified by:
getDirectChildren
in interfaceCtElement
- Returns:
- a list of CtElement containing the element's direct children.
-
-