package com.google.dart.tools.ui.internal.refactoring; import org.eclipse.ltk.core.refactoring.TextEditBasedChange; import org.eclipse.ltk.ui.refactoring.TextEditChangeNode; public class CompilationUnitChangeNode extends TextEditChangeNode { // private static class DartLanguageNode extends LanguageElementNode { // private Element element; // private static NewDartElementImageProvider fgImageProvider = new NewDartElementImageProvider(); // // public DartLanguageNode(ChildNode parent, Element element) { // super(parent); // this.element = element; // Assert.isNotNull(element); // } // // public DartLanguageNode(TextEditChangeNode parent, Element element) { // super(parent); // this.element = element; // Assert.isNotNull(element); // } // // @Override // public ImageDescriptor getImageDescriptor() { // return fgImageProvider.getDartImageDescriptor(element, DartElementImageProvider.OVERLAY_ICONS // | DartElementImageProvider.SMALL_ICONS); // } // // @Override // public String getText() { // return NewDartElementLabels.getElementLabel(element, DartElementLabels.ALL_DEFAULT); // } // // @Override // public IRegion getTextRange() throws CoreException { // SourceRange range = ((SourceReference) element).getSourceRange(); // return new Region(range.getOffset(), range.getLength()); // } // } // private static class OffsetComparator implements Comparator<TextEditBasedChangeGroup> { // @Override // public int compare(TextEditBasedChangeGroup c1, TextEditBasedChangeGroup c2) { // int p1 = getOffset(c1); // int p2 = getOffset(c2); // if (p1 < p2) { // return -1; // } // if (p1 > p2) { // return 1; // } // // same offset // return 0; // } // // private int getOffset(TextEditBasedChangeGroup edit) { // return edit.getRegion().getOffset(); // } // } // // static final ChildNode[] EMPTY_CHILDREN = new ChildNode[0]; public CompilationUnitChangeNode(TextEditBasedChange change) { super(change); } // @Override // protected ChildNode[] createChildNodes() { // CompilationUnitChange unitChange = (CompilationUnitChange) getTextEditBasedChange(); // CompilationUnit cunit = (CompilationUnit) change.getAdapter(CompilationUnit.class); // if (cunit != null) { // List<ChildNode> children = new ArrayList<ChildNode>(5); // Map<Element, DartLanguageNode> map = new HashMap<Element, DartLanguageNode>(20); // TextEditBasedChangeGroup[] changes = getSortedChangeGroups(change); // for (int i = 0; i < changes.length; i++) { // TextEditBasedChangeGroup tec = changes[i]; // try { // Element element = getModifiedDartElement(tec, cunit); // if (element.equals(cunit)) { // children.add(createTextEditGroupNode(this, tec)); // } else { // DartLanguageNode pjce = getChangeElement(map, element, children, this); // pjce.addChild(createTextEditGroupNode(pjce, tec)); // } // } catch (DartModelException e) { // children.add(createTextEditGroupNode(this, tec)); // } // } // return children.toArray(new ChildNode[children.size()]); // } else { // return EMPTY_CHILDREN; // } // } // private boolean coveredBy(TextEditBasedChangeGroup group, IRegion sourceRegion) { // int sLength = sourceRegion.getLength(); // if (sLength == 0) { // return false; // } // int sOffset = sourceRegion.getOffset(); // int sEnd = sOffset + sLength - 1; // TextEdit[] edits = group.getTextEdits(); // for (int i = 0; i < edits.length; i++) { // TextEdit edit = edits[i]; // if (edit.isDeleted()) { // return false; // } // int rOffset = edit.getOffset(); // int rLength = edit.getLength(); // int rEnd = rOffset + rLength - 1; // if (rLength == 0) { // if (!(sOffset < rOffset && rOffset <= sEnd)) { // return false; // } // } else { // if (!(sOffset <= rOffset && rEnd <= sEnd)) { // return false; // } // } // } // return true; // } // // private DartLanguageNode getChangeElement(Map<Element, DartLanguageNode> map, Element element, // List<ChildNode> children, TextEditChangeNode cunitChange) { // DartLanguageNode result = map.get(element); // if (result != null) { // return result; // } // Element parent = element.getParent(); // if (parent instanceof CompilationUnit) { // result = new DartLanguageNode(cunitChange, element); // children.add(result); // map.put(element, result); // } else { // DartLanguageNode parentChange = getChangeElement(map, parent, children, cunitChange); // result = new DartLanguageNode(parentChange, element); // parentChange.addChild(result); // map.put(element, result); // } // return result; // } // // private Element getModifiedDartElement(TextEditBasedChangeGroup edit, CompilationUnit cunit) // throws DartModelException { // IRegion range = edit.getRegion(); // if (range.getOffset() == 0 && range.getLength() == 0) { // return cunit; // } // Element result = cunit.getElementAt(range.getOffset()); // if (result == null) { // return cunit; // } // // try { // while (true) { // SourceReference ref = (SourceReference) result; // IRegion sRange = new Region( // ref.getSourceRange().getOffset(), // ref.getSourceRange().getLength()); // if (result.getElementType() == Element.COMPILATION_UNIT || result.getParent() == null // || coveredBy(edit, sRange)) { // break; // } // result = result.getParent(); // } // } catch (DartModelException e) { // // Do nothing, use old value. // } catch (ClassCastException e) { // // Do nothing, use old value. // } // return result; // } // // private TextEditBasedChangeGroup[] getSortedChangeGroups(TextEditBasedChange change) { // List<TextEditBasedChangeGroup> result = Lists.newArrayList(); // for (TextEditBasedChangeGroup edit : change.getChangeGroups()) { // if (!edit.getTextEditGroup().isEmpty()) { // result.add(edit); // } // } // Comparator<TextEditBasedChangeGroup> comparator = new OffsetComparator(); // Collections.sort(result, comparator); // return result.toArray(new TextEditBasedChangeGroup[result.size()]); // } }