1 package spoon.examples.analysis.processing; 2 3 import java.util.ArrayList ; 4 import java.util.HashMap ; 5 import java.util.List ; 6 import java.util.Map ; 7 import java.util.Set ; 8 import java.util.Stack ; 9 import java.util.TreeSet ; 10 11 import spoon.processing.AbstractProcessor; 12 import spoon.processing.Environment; 13 import spoon.processing.FactoryAccessor; 14 import spoon.processing.Severity; 15 import spoon.reflect.Factory; 16 import spoon.reflect.declaration.CtPackage; 17 import spoon.reflect.declaration.CtSimpleType; 18 import spoon.reflect.reference.CtPackageReference; 19 import spoon.reflect.reference.CtTypeReference; 20 import spoon.reflect.visitor.Query; 21 import spoon.support.query.ReferenceTypeFilter; 22 23 26 public class ReferenceProcessor extends AbstractProcessor<CtPackage> { 27 28 List <CtTypeReference> ignoredTypes = new ArrayList <CtTypeReference>(); 29 30 @Override 31 public void init() { 32 ignoredTypes 33 .add(getFactory().Type().createReference(Environment.class)); 34 ignoredTypes.add(getFactory().Type().createReference(Factory.class)); 35 ignoredTypes.add(getFactory().Type().createReference( 36 FactoryAccessor.class)); 37 } 38 39 Map <CtPackageReference, Set <CtPackageReference>> packRefs = new HashMap <CtPackageReference, Set <CtPackageReference>>(); 40 41 public void process(CtPackage element) { 42 CtPackageReference pack = element.getReference(); 43 Set <CtPackageReference> refs = new TreeSet <CtPackageReference>(); 44 for (CtSimpleType t : element.getTypes()) { 45 for (CtTypeReference<?> tref : Query.getReferences(t, 46 new ReferenceTypeFilter<CtTypeReference>( 47 CtTypeReference.class))) { 48 if (tref.getPackage() != null 49 && !tref.getPackage().equals(pack)) { 50 if (ignoredTypes.contains(tref)) 51 continue; 52 refs.add(tref.getPackage()); 53 } 54 } 55 } 56 if (refs.size() > 0) 57 packRefs.put(pack, refs); 58 } 61 62 @Override 63 public void processingDone() { 64 for (CtPackageReference p : packRefs.keySet()) { 70 Stack <CtPackageReference> path = new Stack <CtPackageReference>(); 71 path.push(p); 72 scanDependencies(path); 73 } 74 } 75 76 Set <CtPackageReference> scanned = new TreeSet <CtPackageReference>(); 77 78 void scanDependencies(Stack <CtPackageReference> path) { 79 CtPackageReference ref = path.peek(); 81 if (scanned.contains(ref)) 83 return; 84 scanned.add(ref); 85 Set <CtPackageReference> refs = packRefs.get(ref); 86 if (refs != null) { 87 for (CtPackageReference p : refs) { 88 if (path.contains(p)) { 89 List <CtPackageReference> circularPath = new ArrayList <CtPackageReference>( 90 path.subList(path.indexOf(p), path.size())); 91 circularPath.add(p); 92 getFactory().getEnvironment().report(this, 93 Severity.WARNING, 94 "circular dependency " + circularPath); 95 break; 96 } else { 97 path.push(p); 98 scanDependencies(path); 99 path.pop(); 100 } 101 } 102 } 103 } 104 105 } 106 | Popular Tags |