01: /*******************************************************************************
02: * Copyright (c) 2005, 2007 IBM Corporation and others.
03: * All rights reserved. This program and the accompanying materials
04: * are made available under the terms of the Eclipse Public License v1.0
05: * which accompanies this distribution, and is available at
06: * http://www.eclipse.org/legal/epl-v10.html
07: *
08: * Contributors:
09: * IBM Corporation - initial API and implementation
10: *******************************************************************************/package org.eclipse.jdt.internal.corext.refactoring.util;
11:
12: import java.util.HashSet;
13: import java.util.Iterator;
14: import java.util.List;
15:
16: import org.eclipse.jdt.core.dom.ASTNode;
17: import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor;
18: import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer;
19:
20: public class TightSourceRangeComputer extends TargetSourceRangeComputer {
21: private HashSet/*<ASTNode>*/fTightSourceRangeNodes = new HashSet();
22:
23: public void addTightSourceNode(ASTNode reference) {
24: fTightSourceRangeNodes.add(reference);
25:
26: List properties = reference.structuralPropertiesForType();
27: for (Iterator iterator = properties.iterator(); iterator
28: .hasNext();) {
29: StructuralPropertyDescriptor descriptor = (StructuralPropertyDescriptor) iterator
30: .next();
31: if (descriptor.isChildProperty()) {
32: ASTNode child = (ASTNode) reference
33: .getStructuralProperty(descriptor);
34: if (isExtending(child, reference)) {
35: addTightSourceNode(child);
36: }
37: } else if (descriptor.isChildListProperty()) {
38: List childs = (List) reference
39: .getStructuralProperty(descriptor);
40: for (Iterator iterator2 = childs.iterator(); iterator2
41: .hasNext();) {
42: ASTNode child = (ASTNode) iterator2.next();
43: if (isExtending(child, reference)) {
44: addTightSourceNode(child);
45: }
46: }
47: }
48: }
49: }
50:
51: public SourceRange computeSourceRange(ASTNode node) {
52: if (fTightSourceRangeNodes.contains(node)) {
53: return new TargetSourceRangeComputer.SourceRange(node
54: .getStartPosition(), node.getLength());
55: } else {
56: return super .computeSourceRange(node); // see bug 85850
57: }
58: }
59:
60: private boolean isExtending(ASTNode child, ASTNode parent) {
61: SourceRange extendedRange = super .computeSourceRange(child);
62:
63: int parentStart = parent.getStartPosition();
64: int extendedStart = extendedRange.getStartPosition();
65: if (parentStart > extendedStart)
66: return true;
67:
68: int parentEnd = parentStart + parent.getLength();
69: int extendedEnd = extendedStart + extendedRange.getLength();
70: if (parentEnd < extendedEnd)
71: return true;
72:
73: return false;
74: }
75: }
|