1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints;
13 import java.util.Arrays;
14 import java.util.LinkedHashSet;
15 import java.util.List;
18 import org.eclipse.core.runtime.Assert;
20 import org.eclipse.jdt.core.ICompilationUnit;
21 import org.eclipse.jdt.core.dom.ASTNode;
22 import org.eclipse.jdt.core.dom.ASTVisitor;
23 import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
24 import org.eclipse.jdt.core.dom.ArrayAccess;
25 import org.eclipse.jdt.core.dom.ArrayCreation;
26 import org.eclipse.jdt.core.dom.ArrayInitializer;
27 import org.eclipse.jdt.core.dom.ArrayType;
28 import org.eclipse.jdt.core.dom.AssertStatement;
29 import org.eclipse.jdt.core.dom.Assignment;
30 import org.eclipse.jdt.core.dom.Block;
31 import org.eclipse.jdt.core.dom.BooleanLiteral;
32 import org.eclipse.jdt.core.dom.BreakStatement;
33 import org.eclipse.jdt.core.dom.CastExpression;
34 import org.eclipse.jdt.core.dom.CatchClause;
35 import org.eclipse.jdt.core.dom.CharacterLiteral;
36 import org.eclipse.jdt.core.dom.ClassInstanceCreation;
37 import org.eclipse.jdt.core.dom.CompilationUnit;
38 import org.eclipse.jdt.core.dom.ConditionalExpression;
39 import org.eclipse.jdt.core.dom.ConstructorInvocation;
40 import org.eclipse.jdt.core.dom.ContinueStatement;
41 import org.eclipse.jdt.core.dom.DoStatement;
42 import org.eclipse.jdt.core.dom.EmptyStatement;
43 import org.eclipse.jdt.core.dom.ExpressionStatement;
44 import org.eclipse.jdt.core.dom.FieldAccess;
45 import org.eclipse.jdt.core.dom.FieldDeclaration;
46 import org.eclipse.jdt.core.dom.ForStatement;
47 import org.eclipse.jdt.core.dom.IfStatement;
48 import org.eclipse.jdt.core.dom.ImportDeclaration;
49 import org.eclipse.jdt.core.dom.InfixExpression;
50 import org.eclipse.jdt.core.dom.Initializer;
51 import org.eclipse.jdt.core.dom.InstanceofExpression;
52 import org.eclipse.jdt.core.dom.Javadoc;
53 import org.eclipse.jdt.core.dom.LabeledStatement;
54 import org.eclipse.jdt.core.dom.MarkerAnnotation;
55 import org.eclipse.jdt.core.dom.MethodDeclaration;
56 import org.eclipse.jdt.core.dom.MethodInvocation;
57 import org.eclipse.jdt.core.dom.NormalAnnotation;
58 import org.eclipse.jdt.core.dom.NullLiteral;
59 import org.eclipse.jdt.core.dom.NumberLiteral;
60 import org.eclipse.jdt.core.dom.PackageDeclaration;
61 import org.eclipse.jdt.core.dom.ParenthesizedExpression;
62 import org.eclipse.jdt.core.dom.PostfixExpression;
63 import org.eclipse.jdt.core.dom.PrefixExpression;
64 import org.eclipse.jdt.core.dom.PrimitiveType;
65 import org.eclipse.jdt.core.dom.QualifiedName;
66 import org.eclipse.jdt.core.dom.ReturnStatement;
67 import org.eclipse.jdt.core.dom.SimpleName;
68 import org.eclipse.jdt.core.dom.SimpleType;
69 import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
70 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
71 import org.eclipse.jdt.core.dom.StringLiteral;
72 import org.eclipse.jdt.core.dom.SuperConstructorInvocation;
73 import org.eclipse.jdt.core.dom.SuperFieldAccess;
74 import org.eclipse.jdt.core.dom.SuperMethodInvocation;
75 import org.eclipse.jdt.core.dom.SwitchCase;
76 import org.eclipse.jdt.core.dom.SwitchStatement;
77 import org.eclipse.jdt.core.dom.SynchronizedStatement;
78 import org.eclipse.jdt.core.dom.ThisExpression;
79 import org.eclipse.jdt.core.dom.ThrowStatement;
80 import org.eclipse.jdt.core.dom.TryStatement;
81 import org.eclipse.jdt.core.dom.TypeDeclaration;
82 import org.eclipse.jdt.core.dom.TypeDeclarationStatement;
83 import org.eclipse.jdt.core.dom.TypeLiteral;
84 import org.eclipse.jdt.core.dom.VariableDeclarationExpression;
85 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
86 import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
87 import org.eclipse.jdt.core.dom.WhileStatement;
89 import org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup;
90 import org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil;
91 import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeTypeRefactoring;
94 public final class ConstraintCollector extends ASTVisitor {
96 private final ConstraintCreator fCreator;
97 private final Set<ITypeConstraint> fConstraints;
99 public ConstraintCollector() {
100 this(new FullConstraintCreator());
103 public ConstraintCollector(ConstraintCreator creator) {
104 Assert.isNotNull(creator);
106 fConstraints= new LinkedHashSet<ITypeConstraint>();
109 private void add(ITypeConstraint[] constraints){
110 fConstraints.addAll(Arrays.asList(constraints));
114 fConstraints.clear();
117 public ITypeConstraint[] getConstraints(){
118 return fConstraints.toArray(new ITypeConstraint[fConstraints.size()]);
121 //------------------------- visit methods -------------------------//
124 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.AnonymousClassDeclaration)
127 public boolean visit(AnonymousClassDeclaration node) {
128 add(fCreator.create(node));
133 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ArrayAccess)
136 public boolean visit(ArrayAccess node) {
137 add(fCreator.create(node));
142 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ArrayCreation)
145 public boolean visit(ArrayCreation node) {
146 add(fCreator.create(node));
151 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ArrayInitializer)
154 public boolean visit(ArrayInitializer node) {
155 add(fCreator.create(node));
160 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ArrayType)
163 public boolean visit(ArrayType node) {
164 add(fCreator.create(node));
169 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.AssertStatement)
172 public boolean visit(AssertStatement node) {
173 add(fCreator.create(node));
178 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Assignment)
181 public boolean visit(Assignment node) {
182 add(fCreator.create(node));
187 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Block)
190 public boolean visit(Block node) {
191 add(fCreator.create(node));
196 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.BooleanLiteral)
199 public boolean visit(BooleanLiteral node) {
200 add(fCreator.create(node));
205 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.BreakStatement)
208 public boolean visit(BreakStatement node) {
209 add(fCreator.create(node));
214 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.CastExpression)
217 public boolean visit(CastExpression node) {
218 add(fCreator.create(node));
223 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.CatchClause)
226 public boolean visit(CatchClause node) {
227 add(fCreator.create(node));
232 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.CharacterLiteral)
235 public boolean visit(CharacterLiteral node) {
236 add(fCreator.create(node));
241 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ClassInstanceCreation)
244 public boolean visit(ClassInstanceCreation node) {
245 add(fCreator.create(node));
250 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.CompilationUnit)
253 public boolean visit(CompilationUnit node) {
254 add(fCreator.create(node));
259 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ConditionalExpression)
262 public boolean visit(ConditionalExpression node) {
263 add(fCreator.create(node));
268 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ConstructorInvocation)
271 public boolean visit(ConstructorInvocation node) {
272 add(fCreator.create(node));
277 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ContinueStatement)
280 public boolean visit(ContinueStatement node) {
281 add(fCreator.create(node));
286 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.DoStatement)
289 public boolean visit(DoStatement node) {
290 add(fCreator.create(node));
295 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.EmptyStatement)
298 public boolean visit(EmptyStatement node) {
299 add(fCreator.create(node));
304 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ExpressionStatement)
307 public boolean visit(ExpressionStatement node) {
308 add(fCreator.create(node));
313 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.FieldAccess)
316 public boolean visit(FieldAccess node) {
317 add(fCreator.create(node));
322 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.FieldDeclaration)
325 public boolean visit(FieldDeclaration node) {
326 add(fCreator.create(node));
331 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ForStatement)
334 public boolean visit(ForStatement node) {
335 add(fCreator.create(node));
340 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.IfStatement)
343 public boolean visit(IfStatement node) {
344 add(fCreator.create(node));
349 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ImportDeclaration)
352 public boolean visit(ImportDeclaration node) {
353 add(fCreator.create(node));
358 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.InfixExpression)
361 public boolean visit(InfixExpression node) {
362 add(fCreator.create(node));
367 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Initializer)
370 public boolean visit(Initializer node) {
371 add(fCreator.create(node));
376 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.InstanceofExpression)
379 public boolean visit(InstanceofExpression node) {
380 add(fCreator.create(node));
385 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.Javadoc)
388 public boolean visit(Javadoc node) {
389 add(fCreator.create(node));
394 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.LabeledStatement)
397 public boolean visit(LabeledStatement node) {
398 add(fCreator.create(node));
403 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MarkerAnnotation)
406 public boolean visit(MarkerAnnotation node) {
410 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodDeclaration)
413 public boolean visit(MethodDeclaration node) {
414 add(fCreator.create(node));
419 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.MethodInvocation)
422 public boolean visit(MethodInvocation node) {
423 add(fCreator.create(node));
427 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.NormalAnnotation)
430 public boolean visit(NormalAnnotation node) {
434 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.NullLiteral)
437 public boolean visit(NullLiteral node) {
438 add(fCreator.create(node));
443 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.NumberLiteral)
446 public boolean visit(NumberLiteral node) {
447 add(fCreator.create(node));
452 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.PackageDeclaration)
455 public boolean visit(PackageDeclaration node) {
456 add(fCreator.create(node));
461 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ParenthesizedExpression)
464 public boolean visit(ParenthesizedExpression node) {
465 add(fCreator.create(node));
470 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.PostfixExpression)
473 public boolean visit(PostfixExpression node) {
474 add(fCreator.create(node));
479 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.PrefixExpression)
482 public boolean visit(PrefixExpression node) {
483 add(fCreator.create(node));
488 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.PrimitiveType)
491 public boolean visit(PrimitiveType node) {
492 add(fCreator.create(node));
497 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.QualifiedName)
500 public boolean visit(QualifiedName node) {
501 add(fCreator.create(node));
506 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ReturnStatement)
509 public boolean visit(ReturnStatement node) {
510 add(fCreator.create(node));
515 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SimpleName)
518 public boolean visit(SimpleName node) {
519 add(fCreator.create(node));
524 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SimpleType)
527 public boolean visit(SimpleType node) {
528 add(fCreator.create(node));
533 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SingleMemberAnnotation)
536 public boolean visit(SingleMemberAnnotation node) {
541 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SingleVariableDeclaration)
544 public boolean visit(SingleVariableDeclaration node) {
545 add(fCreator.create(node));
550 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.StringLiteral)
553 public boolean visit(StringLiteral node) {
554 add(fCreator.create(node));
559 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SuperConstructorInvocation)
562 public boolean visit(SuperConstructorInvocation node) {
563 add(fCreator.create(node));
568 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SuperFieldAccess)
571 public boolean visit(SuperFieldAccess node) {
572 add(fCreator.create(node));
577 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SuperMethodInvocation)
580 public boolean visit(SuperMethodInvocation node) {
581 add(fCreator.create(node));
586 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SwitchCase)
589 public boolean visit(SwitchCase node) {
590 add(fCreator.create(node));
595 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SwitchStatement)
598 public boolean visit(SwitchStatement node) {
599 add(fCreator.create(node));
604 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SynchronizedStatement)
607 public boolean visit(SynchronizedStatement node) {
608 add(fCreator.create(node));
613 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ThisExpression)
616 public boolean visit(ThisExpression node) {
617 add(fCreator.create(node));
622 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.ThrowStatement)
625 public boolean visit(ThrowStatement node) {
626 add(fCreator.create(node));
631 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TryStatement)
634 public boolean visit(TryStatement node) {
635 add(fCreator.create(node));
640 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TypeDeclaration)
643 public boolean visit(TypeDeclaration node) {
644 add(fCreator.create(node));
647 // TODO account for enums and annotations
651 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TypeDeclarationStatement)
654 public boolean visit(TypeDeclarationStatement node) {
655 add(fCreator.create(node));
660 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.TypeLiteral)
663 public boolean visit(TypeLiteral node) {
664 add(fCreator.create(node));
669 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.VariableDeclarationExpression)
672 public boolean visit(VariableDeclarationExpression node) {
673 add(fCreator.create(node));
678 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.VariableDeclarationFragment)
681 public boolean visit(VariableDeclarationFragment node) {
682 add(fCreator.create(node));
687 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.VariableDeclarationStatement)
690 public boolean visit(VariableDeclarationStatement node) {
691 add(fCreator.create(node));
696 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.WhileStatement)
699 public boolean visit(WhileStatement node) {
700 add(fCreator.create(node));
704 public List<ITypeConstraint> generated_1070897917906180055(ChangeTypeRefactoring changetyperefactoring, ICompilationUnit unit, CompilationUnit cu) {
705 if (changetyperefactoring.fMethodBinding != null && changetyperefactoring.fCuToSearchResultGroup.containsKey(unit)){
706 SearchResultGroup group= changetyperefactoring.fCuToSearchResultGroup.get(unit);
707 ASTNode[] nodes= ASTNodeSearchUtil.getAstNodes(group.getSearchResults(), cu);
708 for (int i=0; i < nodes.length; i++){
709 ASTNode node = nodes[i];
710 if (changetyperefactoring.fMethodBinding != null){
711 // find MethodDeclaration above it in the tree
713 while (!(n instanceof MethodDeclaration)){
716 MethodDeclaration md = (MethodDeclaration)n;
723 List<ITypeConstraint> constraints= Arrays.asList(getConstraints());
724 changetyperefactoring.fConstraintCache.put(unit, constraints);