@Override public void visitCtCompilationUnit(CtCompilationUnit compilationUnit) { if (isVisitCompilationUnitContent()) { enter(compilationUnit); scan(CtRole.COMMENT, compilationUnit.getComments()); scan(CtRole.ANNOTATION, compilationUnit.getAnnotations()); scan(CtRole.PACKAGE_DECLARATION, compilationUnit.getPackageDeclaration()); scan(CtRole.DECLARED_IMPORT, compilationUnit.getImports()); //visit directly the module (instead of reference only) scan(CtRole.DECLARED_MODULE, compilationUnit.getDeclaredModule()); //visit directly the types (instead of references only) scan(CtRole.DECLARED_TYPE, compilationUnit.getDeclaredTypes()); exit(compilationUnit); } else { super.visitCtCompilationUnit(compilationUnit); } }
@Override public void scan(CtElement element) { if (element == null || isTerminated()) { return; } if (listener == null) { //the listener is not defined //visit this element and may be children doScan(scannedRole, element, ScanningMode.NORMAL); } else { //the listener is defined, call it's enter method first ScanningMode mode = listener.enter(scannedRole, element); if (mode != ScanningMode.SKIP_ALL) { //the listener decided to visit this element and may be children doScan(scannedRole, element, mode); //then call exit, only if enter returned true listener.exit(scannedRole, element); } //else the listener decided to skip this element and all children. Do not call exit. } }
@Override protected void onElement(CtRole role, CtElement element) { next.accept(element); super.onElement(role, element); }
@Override public void scan(CtRole role, Map<String, ? extends CtElement> elements) { if (isTerminated() || elements == null) { return; } for (CtElement obj : elements.values()) { scan(role, obj); if (isTerminated()) { return; } } }
/** * @return true if `element` still exist in the printed model. false if it was removed or was never there */ public boolean isElementExists(SourcePositionHolder element) { if (element instanceof CtExtendedModifier) { CtExtendedModifier modifier = (CtExtendedModifier) element; if (this.element instanceof CtModifiable) { return ((CtModifiable) this.element).hasModifier(modifier.getKind()); } } EarlyTerminatingScanner<Boolean> scanner = new EarlyTerminatingScanner<Boolean>() { @Override protected void enter(CtElement e) { if (element == e) { setResult(Boolean.TRUE); terminate(); } } }; scanner.scan(this.element); return scanner.getResult() == Boolean.TRUE; }
@Override public CtRole getRoleInParent() { if (isParentInitialized()) { EarlyTerminatingScanner<CtRole> ets = new EarlyTerminatingScanner<CtRole>() { @Override public void scan(CtRole role, CtElement element) { if (element == CtElementImpl.this) { setResult(role); terminate(); } //do not call super.scan, because we do not want scan children } }; getParent().accept(ets); return ets.getResult(); } return null; }
@Override public void scan(CtRole role, Map<String, ? extends CtElement> elements) { // TODO Auto-generated method stub super.scan(role, elements); } }
@Override protected void enter(CtElement e) { if (e.getPosition() instanceof NoSourcePosition) { return; } if (e.getPosition().getSourceStart() == patch.getSourceLocation().getBeginSource() && e.getPosition().getSourceEnd() == patch.getSourceLocation().getEndSource() && e.isImplicit() == false) { if (patch.getType() == RepairType.CONDITIONAL && e instanceof CtIf) { setResult(((CtIf) e).getCondition()); } else { setResult(e); } terminate(); return; } if (e.getPosition().getSourceStart() <= patch.getSourceLocation().getBeginSource() && e.getPosition().getSourceEnd() >= patch.getSourceLocation().getEndSource()) { super.enter(e); } } };
@Override public void scan(CtRole role, Collection<? extends CtElement> elements) { if (isTerminated() || elements == null) { return; } // we use defensive copy so as to be able to change the class while scanning // otherwise one gets a ConcurrentModificationException for (CtElement e : new ArrayList<>(elements)) { scan(role, e); if (isTerminated()) { return; } } }
private CtElement getTarget() { CtType type = factory.Type().get(patch.getSourceLocation().getRootClassName()); EarlyTerminatingScanner<CtElement> targetFinder = new EarlyTerminatingScanner<CtElement>() { @Override protected void enter(CtElement e) { if (e.getPosition() instanceof NoSourcePosition) { return; } if (e.getPosition().getSourceStart() == patch.getSourceLocation().getBeginSource() && e.getPosition().getSourceEnd() == patch.getSourceLocation().getEndSource() && e.isImplicit() == false) { if (patch.getType() == RepairType.CONDITIONAL && e instanceof CtIf) { setResult(((CtIf) e).getCondition()); } else { setResult(e); } terminate(); return; } if (e.getPosition().getSourceStart() <= patch.getSourceLocation().getBeginSource() && e.getPosition().getSourceEnd() >= patch.getSourceLocation().getEndSource()) { super.enter(e); } } }; type.accept(targetFinder); return targetFinder.getResult(); }
@Override public void scan(CtRole role, CtElement element) { //This is called only for elements which are in single value attribute. Like `CtType#superClass` if (searchMatchInList(role, Collections.singletonList(element), false) == 0) { super.scan(role, element); } }
@Override public void scan(CtRole role, Object o) { if (isTerminated() || o == null) { return; } if (o instanceof CtElement) { scan(role, (CtElement) o); } else if (o instanceof Collection<?>) { scan(role, (Collection<? extends CtElement>) o); } else if (o instanceof Map<?, ?>) { for (Object obj : ((Map) o).values()) { scan(role, obj); if (isTerminated()) { return; } } } }
.scan(element.getRoleInParent(), element);
/** * This method is called ONLY when the listener decides that the current element and children should be visited. * Subclasses can override it to react accordingly. */ protected void doScan(CtRole role, CtElement element, ScanningMode mode) { //send input to output if (mode.visitElement) { onElement(role, element); } if (mode.visitChildren) { //do not call scan(CtElement) nor scan(CtRole, CtElement), because they would cause StackOverflowError element.accept(this); } }
super.scan(element);
super.scan(role, object);
super.scan(role, tobeMatched.getTargets().get(0));