下面列出了怎么用org.eclipse.jdt.core.dom.BodyDeclaration的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public void preVisit(ASTNode node) {
// int li = comp.getLineNumber(node.getStartPosition());
// if(li > 0) {
// while(li > currentLine) {
// fBuffer.append("//" + li + "," + currentLine);
// lineBreak2();
// }
// }
if (node instanceof BodyDeclaration) {
tabs += 4;
lineBreak();
}
super.preVisit(node);
}
private Set<MethodDeclaration> getMethodDeclarationsWithinAnonymousClassDeclarations(MethodDeclaration methodDeclaration) {
Set<MethodDeclaration> methods = new LinkedHashSet<MethodDeclaration>();
ExpressionExtractor expressionExtractor = new ExpressionExtractor();
List<Expression> classInstanceCreations = expressionExtractor.getClassInstanceCreations(methodDeclaration.getBody());
for(Expression expression : classInstanceCreations) {
ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation)expression;
AnonymousClassDeclaration anonymousClassDeclaration = classInstanceCreation.getAnonymousClassDeclaration();
if(anonymousClassDeclaration != null) {
List<BodyDeclaration> bodyDeclarations = anonymousClassDeclaration.bodyDeclarations();
for(BodyDeclaration bodyDeclaration : bodyDeclarations) {
if(bodyDeclaration instanceof MethodDeclaration)
methods.add((MethodDeclaration)bodyDeclaration);
}
}
}
return methods;
}
private void initializeDestinations() {
List<ASTNode> result= new ArrayList<ASTNode>();
BodyDeclaration decl= fAnalyzer.getEnclosingBodyDeclaration();
ASTNode current= ASTResolving.findParentType(decl.getParent());
if (fAnalyzer.isValidDestination(current)) {
result.add(current);
}
if (current != null && (decl instanceof MethodDeclaration || decl instanceof Initializer || decl instanceof FieldDeclaration)) {
ITypeBinding binding= ASTNodes.getEnclosingType(current);
ASTNode next= ASTResolving.findParentType(current.getParent());
while (next != null && binding != null && binding.isNested()) {
if (fAnalyzer.isValidDestination(next)) {
result.add(next);
}
current= next;
binding= ASTNodes.getEnclosingType(current);
next= ASTResolving.findParentType(next.getParent());
}
}
fDestinations= result.toArray(new ASTNode[result.size()]);
fDestination= fDestinations[fDestinationIndex];
}
private static void createAddDeprecatedAnnotationOperations(CompilationUnit compilationUnit, IProblemLocation[] locations, List<CompilationUnitRewriteOperation> result) {
for (int i= 0; i < locations.length; i++) {
IProblemLocation problem= locations[i];
if (isMissingDeprecationProblem(problem.getProblemId())) {
ASTNode selectedNode= problem.getCoveringNode(compilationUnit);
if (selectedNode != null) {
ASTNode declaringNode= getDeclaringNode(selectedNode);
if (declaringNode instanceof BodyDeclaration) {
BodyDeclaration declaration= (BodyDeclaration) declaringNode;
AnnotationRewriteOperation operation= new AnnotationRewriteOperation(declaration, DEPRECATED);
result.add(operation);
}
}
}
}
}
public static void checkModifiers(ProblemCollector collector, BodyDeclaration elem,
Predicate<Modifier> allowSpecific) {
for (Object obj : elem.modifiers()) {
if (!(obj instanceof Modifier)) {
continue;
}
Modifier modifier = (Modifier) obj;
boolean valid;
if (allowSpecific.test(modifier)) {
valid = true;
} else {
valid = modifier.isPrivate() || modifier.isPublic() || modifier.isProtected() || modifier.isFinal();
}
if (!valid) {
collector.report(INVALID_MODIFIER.create(collector.getSourceInfo(), modifier));
}
}
}
private static void createAddOverrideAnnotationOperations(CompilationUnit compilationUnit, boolean addOverrideInterfaceAnnotation, IProblemLocation[] locations, List<CompilationUnitRewriteOperation> result) {
for (int i= 0; i < locations.length; i++) {
IProblemLocation problem= locations[i];
int problemId= problem.getProblemId();
if (isMissingOverrideAnnotationProblem(problemId)) {
if (!isMissingOverrideAnnotationInterfaceProblem(problemId) || addOverrideInterfaceAnnotation) {
ASTNode selectedNode= problem.getCoveringNode(compilationUnit);
if (selectedNode != null) {
ASTNode declaringNode= getDeclaringNode(selectedNode);
if (declaringNode instanceof BodyDeclaration) {
BodyDeclaration declaration= (BodyDeclaration) declaringNode;
AnnotationRewriteOperation operation= new AnnotationRewriteOperation(declaration, OVERRIDE);
result.add(operation);
}
}
}
}
}
}
private static BodyDeclaration getSelectedMemberDeclaration(ICompilationUnit unit, CodeActionParams params) {
int start = DiagnosticsHelper.getStartOffset(unit, params.getRange());
int end = DiagnosticsHelper.getEndOffset(unit, params.getRange());
InnovationContext context = new InnovationContext(unit, start, end - start);
context.setASTRoot(CodeActionHandler.getASTRoot(unit));
ASTNode node = context.getCoveredNode();
if (node == null) {
node = context.getCoveringNode();
}
while (node != null && !(node instanceof BodyDeclaration)) {
node = node.getParent();
}
if (node != null && (node instanceof MethodDeclaration || node instanceof FieldDeclaration || node instanceof AbstractTypeDeclaration) && JdtFlags.isStatic((BodyDeclaration) node)) {
return (BodyDeclaration) node;
}
return null;
}
@SuppressWarnings("unchecked")
private void writeNestedTypes() {
ArrayList<TypeDeclaration> publicTypes = new ArrayList<>();
ArrayList<TypeDeclaration> protectedTypes = new ArrayList<>();
ArrayList<TypeDeclaration> privateTypes = new ArrayList<>();
for (BodyDeclaration bodyDeclaration : (List<BodyDeclaration>) typeDeclaration.bodyDeclarations()) {
if (bodyDeclaration instanceof TypeDeclaration) {
TypeDeclaration nestedTypeDeclaration = (TypeDeclaration) bodyDeclaration;
AccessLevel accessLevel = ASTUtil.getAccessModifier(nestedTypeDeclaration.modifiers());
if (accessLevel == AccessLevel.PUBLIC || accessLevel == AccessLevel.PACKAGE)
publicTypes.add(nestedTypeDeclaration);
else if (accessLevel == AccessLevel.PROTECTED)
protectedTypes.add(nestedTypeDeclaration);
else
privateTypes.add(nestedTypeDeclaration);
}
}
writeNestedTypeDeclarationsForAccessLevel(publicTypes, AccessLevel.PUBLIC);
writeNestedTypeDeclarationsForAccessLevel(protectedTypes, AccessLevel.PROTECTED);
writeNestedTypeDeclarationsForAccessLevel(privateTypes, AccessLevel.PRIVATE);
}
private static MethodDeclaration getSelectedMethodDeclaration(ICompilationUnit unit, CodeActionParams params) {
int start = DiagnosticsHelper.getStartOffset(unit, params.getRange());
int end = DiagnosticsHelper.getEndOffset(unit, params.getRange());
InnovationContext context = new InnovationContext(unit, start, end - start);
context.setASTRoot(CodeActionHandler.getASTRoot(unit));
ASTNode node = context.getCoveredNode();
if (node == null) {
node = context.getCoveringNode();
}
while (node != null && !(node instanceof BodyDeclaration)) {
node = node.getParent();
}
if (node != null && node instanceof MethodDeclaration) {
return (MethodDeclaration) node;
}
return null;
}
public static boolean isStatic(BodyDeclaration bodyDeclaration) {
if (isNestedInterfaceOrAnnotation(bodyDeclaration)) {
return true;
}
int nodeType= bodyDeclaration.getNodeType();
if (!(nodeType == ASTNode.METHOD_DECLARATION || nodeType == ASTNode.ANNOTATION_TYPE_MEMBER_DECLARATION) &&
isInterfaceOrAnnotationMember(bodyDeclaration)) {
return true;
}
if (bodyDeclaration instanceof EnumConstantDeclaration) {
return true;
}
if (bodyDeclaration instanceof EnumDeclaration && bodyDeclaration.getParent() instanceof AbstractTypeDeclaration) {
return true;
}
return Modifier.isStatic(bodyDeclaration.getModifiers());
}
private List<Expression> getExpressions(AnonymousClassDeclaration anonymousClassDeclaration) {
List<Expression> expressionList = new ArrayList<Expression>();
List<BodyDeclaration> bodyDeclarations = anonymousClassDeclaration.bodyDeclarations();
for(BodyDeclaration bodyDeclaration : bodyDeclarations) {
if(bodyDeclaration instanceof MethodDeclaration) {
MethodDeclaration methodDeclaration = (MethodDeclaration)bodyDeclaration;
Block body = methodDeclaration.getBody();
if(body != null) {
List<Statement> statements = body.statements();
for(Statement statement : statements) {
expressionList.addAll(getExpressions(statement));
}
}
}
}
return expressionList;
}
private TagElement getDelegateJavadocTag(BodyDeclaration declaration) throws JavaModelException {
Assert.isNotNull(declaration);
String msg= RefactoringCoreMessages.DelegateCreator_use_member_instead;
int firstParam= msg.indexOf("{0}"); //$NON-NLS-1$
Assert.isTrue(firstParam != -1);
List<ASTNode> fragments= new ArrayList<>();
TextElement text= getAst().newTextElement();
text.setText(msg.substring(0, firstParam).trim());
fragments.add(text);
fragments.add(createJavadocMemberReferenceTag(declaration, getAst()));
text= getAst().newTextElement();
text.setText(msg.substring(firstParam + 3).trim());
fragments.add(text);
final TagElement tag= getAst().newTagElement();
tag.setTagName(TagElement.TAG_DEPRECATED);
tag.fragments().addAll(fragments);
return tag;
}
/**
* Finds an annotation of the given type (as a fully-qualified name) on a
* declaration (type, method, field, etc.). If no such annotation exists,
* returns <code>null</code>.
*/
@SuppressWarnings("unchecked")
public static Annotation findAnnotation(BodyDeclaration decl,
String annotationTypeName) {
if (annotationTypeName == null) {
throw new IllegalArgumentException("annotationTypeName cannot be null");
}
List<ASTNode> modifiers = (List<ASTNode>) decl.getStructuralProperty(decl.getModifiersProperty());
for (ASTNode modifier : modifiers) {
if (modifier instanceof Annotation) {
Annotation annotation = (Annotation) modifier;
String typeName = getAnnotationTypeName(annotation);
if (annotationTypeName.equals(typeName)) {
return annotation;
}
}
}
return null;
}
private UMLAnonymousClass processAnonymousClassDeclaration(CompilationUnit cu, AnonymousClassDeclaration anonymous, String packageName, String binaryName, String codePath, String sourceFile) {
List<BodyDeclaration> bodyDeclarations = anonymous.bodyDeclarations();
LocationInfo locationInfo = generateLocationInfo(cu, sourceFile, anonymous, CodeElementType.ANONYMOUS_CLASS_DECLARATION);
UMLAnonymousClass anonymousClass = new UMLAnonymousClass(packageName, binaryName, codePath, locationInfo);
for(BodyDeclaration bodyDeclaration : bodyDeclarations) {
if(bodyDeclaration instanceof FieldDeclaration) {
FieldDeclaration fieldDeclaration = (FieldDeclaration)bodyDeclaration;
List<UMLAttribute> attributes = processFieldDeclaration(cu, fieldDeclaration, false, sourceFile);
for(UMLAttribute attribute : attributes) {
attribute.setClassName(anonymousClass.getCodePath());
anonymousClass.addAttribute(attribute);
}
}
else if(bodyDeclaration instanceof MethodDeclaration) {
MethodDeclaration methodDeclaration = (MethodDeclaration)bodyDeclaration;
UMLOperation operation = processMethodDeclaration(cu, methodDeclaration, packageName, false, sourceFile);
operation.setClassName(anonymousClass.getCodePath());
anonymousClass.addOperation(operation);
}
}
return anonymousClass;
}
@Override
public RefactoringStatus checkFinalConditions(IProgressMonitor pm) throws CoreException {
pm.beginTask(RefactoringCoreMessages.ExtractMethodRefactoring_checking_new_name, 2);
pm.subTask(EMPTY);
RefactoringStatus result = checkMethodName();
result.merge(checkParameterNames());
result.merge(checkVarargOrder());
pm.worked(1);
if (pm.isCanceled()) {
throw new OperationCanceledException();
}
BodyDeclaration node = fAnalyzer.getEnclosingBodyDeclaration();
if (node != null) {
fAnalyzer.checkInput(result, fMethodName, fDestination);
pm.worked(1);
}
pm.done();
return result;
}
/**
* Returns the fields which reference the specified ast node.
*
* @param node
* the ast node
* @param project
* the java project
* @return the referencing fields
* @throws JavaModelException
* if an error occurs
*/
protected final List<IField> getReferencingFields(final ASTNode node, final IJavaProject project) throws JavaModelException {
List<IField> result= Collections.emptyList();
if (node instanceof Type) {
final BodyDeclaration parent= (BodyDeclaration) ASTNodes.getParent(node, BodyDeclaration.class);
if (parent instanceof FieldDeclaration) {
final List<VariableDeclarationFragment> fragments= ((FieldDeclaration) parent).fragments();
result= new ArrayList<IField>(fragments.size());
VariableDeclarationFragment fragment= null;
for (final Iterator<VariableDeclarationFragment> iterator= fragments.iterator(); iterator.hasNext();) {
fragment= iterator.next();
final IField field= getCorrespondingField(fragment);
if (field != null)
result.add(field);
}
}
}
return result;
}
private boolean isSortPreserved(BodyDeclaration bodyDeclaration) {
switch (bodyDeclaration.getNodeType()) {
case ASTNode.FIELD_DECLARATION:
case ASTNode.ENUM_CONSTANT_DECLARATION:
case ASTNode.INITIALIZER:
return true;
default:
return false;
}
}
public static Boolean containsModifier(BodyDeclaration node, String modifier){
for (Object m : node.modifiers()) {
if(m.toString().equals(modifier)){
return true;
}
}
return false;
}
public static String getVisibility(BodyDeclaration node){
for (Object modifier : node.modifiers()) {
if(modifier.toString().equals("public") || modifier.toString().equals("private")
|| modifier.toString().equals("protected")){
return modifier.toString();
}
}
return "default";
}
public static void addChangeToEnumMap(EnumDeclaration type, BodyDeclaration change,
HashMap<EnumDeclaration, ArrayList<BodyDeclaration>> changeMap) {
if(changeMap.containsKey(type)){
changeMap.get(type).add(change);
}else{
changeMap.put(type, new ArrayList<BodyDeclaration>());
changeMap.get(type).add(change);
}
}
private int computeInsertIndexForNewConstructor(AbstractTypeDeclaration declaration) {
List<BodyDeclaration> declarations= declaration.bodyDeclarations();
if (declarations.isEmpty())
return 0;
int index= findFirstMethodIndex(declaration);
if (index == -1)
return declarations.size();
else
return index;
}
private int findLastFieldIndex(TypeDeclaration newType) {
return ((List<BodyDeclaration>) newType.bodyDeclarations())
.stream()
.filter(element -> element instanceof FieldDeclaration)
.collect(Collectors.toList())
.size();
}
private FieldDeclaration[] getFieldDeclarations() {
List<BodyDeclaration> bodyDeclarations= ASTNodes.getBodyDeclarations(getMethodDeclaration().getParent());
List<FieldDeclaration> fields= new ArrayList<FieldDeclaration>(1);
for (Iterator<BodyDeclaration> iter= bodyDeclarations.iterator(); iter.hasNext();) {
Object each= iter.next();
if (each instanceof FieldDeclaration)
fields.add((FieldDeclaration) each);
}
return fields.toArray(new FieldDeclaration[fields.size()]);
}
public static boolean isStatic(BodyDeclaration bodyDeclaration) {
if (isNestedInterfaceOrAnnotation(bodyDeclaration))
return true;
int nodeType= bodyDeclaration.getNodeType();
if (!(nodeType == ASTNode.METHOD_DECLARATION || nodeType == ASTNode.ANNOTATION_TYPE_MEMBER_DECLARATION) &&
isInterfaceOrAnnotationMember(bodyDeclaration))
return true;
if (bodyDeclaration instanceof EnumConstantDeclaration)
return true;
if (bodyDeclaration instanceof EnumDeclaration && bodyDeclaration.getParent() instanceof AbstractTypeDeclaration)
return true;
return Modifier.isStatic(bodyDeclaration.getModifiers());
}
public <T extends BodyDeclaration> List<T> extractBodyDeclaration(TypeDeclaration typeDeclaration, Class<T> expectedReturnType) {
return ((List<BodyDeclaration>) typeDeclaration.bodyDeclarations())
.stream()
.filter(value -> value.getClass().equals(expectedReturnType))
.map(value -> (T) value)
.collect(Collectors.toList());
}
private static int findIndexOfFistNestedClass(List<BodyDeclaration> list) {
for (int i= 0, n= list.size(); i < n; i++) {
BodyDeclaration each= list.get(i);
if (isNestedType(each))
return i;
}
return -1;
}
/**
* @return the annotation node if it is present on the declaration or null
*/
public static Annotation obtainAnnotation(BodyDeclaration declaration, Class<?> annotationClass) {
for (Object mod : declaration.modifiers()) {
IExtendedModifier modifier = (IExtendedModifier) mod;
if (modifier.isAnnotation()) {
Annotation annotation = (Annotation) modifier;
if (identicalAnnotations(annotation, annotationClass)) {
return annotation;
}
}
}
return null;
}
private Set<String> getNamesDeclaredLocallyAtNewLocation() {
if (fNamesDeclaredLocallyAtNewLocation != null)
return fNamesDeclaredLocallyAtNewLocation;
BodyDeclaration enclosingBodyDecl= (BodyDeclaration) ASTNodes.getParent(fNewLocation, BodyDeclaration.class);
Assert.isTrue(!(enclosingBodyDecl instanceof AbstractTypeDeclaration));
return fNamesDeclaredLocallyAtNewLocation= getLocallyDeclaredNames(enclosingBodyDecl);
}
public static void getUnusedAndUndocumentedParameterOrExceptionProposals(IInvocationContext context,
IProblemLocationCore problem, Collection<ChangeCorrectionProposal> proposals) {
ICompilationUnit cu= context.getCompilationUnit();
IJavaProject project= cu.getJavaProject();
if (!JavaCore.ENABLED.equals(project.getOption(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, true))) {
return;
}
int problemId= problem.getProblemId();
boolean isUnusedTypeParam= problemId == IProblem.UnusedTypeParameter;
boolean isUnusedParam= problemId == IProblem.ArgumentIsNeverUsed || isUnusedTypeParam;
String key= isUnusedParam ? JavaCore.COMPILER_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE : JavaCore.COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION_INCLUDE_DOC_COMMENT_REFERENCE;
if (!JavaCore.ENABLED.equals(project.getOption(key, true))) {
return;
}
ASTNode node= problem.getCoveringNode(context.getASTRoot());
if (node == null) {
return;
}
BodyDeclaration bodyDecl= ASTResolving.findParentBodyDeclaration(node);
if (bodyDecl == null || ASTResolving.getParentMethodOrTypeBinding(bodyDecl) == null) {
return;
}
String label;
if (isUnusedTypeParam) {
label= CorrectionMessages.JavadocTagsSubProcessor_document_type_parameter_description;
} else if (isUnusedParam) {
label= CorrectionMessages.JavadocTagsSubProcessor_document_parameter_description;
} else {
node= ASTNodes.getNormalizedNode(node);
label= CorrectionMessages.JavadocTagsSubProcessor_document_exception_description;
}
ASTRewriteCorrectionProposal proposal= new AddMissingJavadocTagProposal(label, context.getCompilationUnit(), bodyDecl, node, IProposalRelevance.DOCUMENT_UNUSED_ITEM);
proposals.add(proposal);
}
private VariableDeclarationFragment addFieldDeclaration(ASTRewrite rewrite, org.eclipse.jdt.core.dom.ASTNode newTypeDecl, int modifiers, String varName, String qualifiedName, String value) {
ChildListPropertyDescriptor property = ASTNodes.getBodyDeclarationsProperty(newTypeDecl);
List<BodyDeclaration> decls = ASTNodes.getBodyDeclarations(newTypeDecl);
AST ast = newTypeDecl.getAST();
VariableDeclarationFragment newDeclFrag = ast.newVariableDeclarationFragment();
newDeclFrag.setName(ast.newSimpleName(varName));
Type type = createType(Signature.createTypeSignature(qualifiedName, true), ast);
if (value != null && value.trim().length() > 0) {
Expression e = createExpression(value);
Expression ne = (Expression) org.eclipse.jdt.core.dom.ASTNode.copySubtree(ast, e);
newDeclFrag.setInitializer(ne);
} else {
if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
newDeclFrag.setInitializer(ASTNodeFactory.newDefaultExpression(ast, type, 0));
}
}
FieldDeclaration newDecl = ast.newFieldDeclaration(newDeclFrag);
newDecl.setType(type);
newDecl.modifiers().addAll(ASTNodeFactory.newModifiers(ast, modifiers));
int insertIndex = findFieldInsertIndex(decls, getCompletionOffset(), modifiers);
rewrite.getListRewrite(newTypeDecl, property).insertAt(newDecl, insertIndex, null);
return newDeclFrag;
}