blob: e06d1bbb327bdf13248ec2885d940b5e32062e19 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.jdom;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.jdom.*;
import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
import org.eclipse.jdt.internal.core.util.CharArrayBuffer;
import org.eclipse.jdt.internal.core.util.Messages;
import org.eclipse.jdt.internal.core.util.Util;
/**
* DOMCompilation unit provides an implementation of IDOMCompilationUnit.
*
* @see IDOMCompilationUnit
* @see DOMNode
* @deprecated The JDOM was made obsolete by the addition in 2.0 of the more
* powerful, fine-grained DOM/AST API found in the
* org.eclipse.jdt.core.dom package.
*/
class DOMCompilationUnit extends DOMNode implements IDOMCompilationUnit, SuffixConstants {
/**
* The comment and/or whitespace preceding the
* first document fragment in this compilation
* unit.
*/
protected String fHeader;
/**
* Creates a new empty COMPILATION_UNIT document fragment.
*/
DOMCompilationUnit() {
fHeader=""; //$NON-NLS-1$
}
/**
* Creates a new COMPILATION_UNIT on the given range of the document.
*
* @param document - the document containing this node's original contents
* @param sourceRange - a two element array of integers describing the
* entire inclusive source range of this node within its document.
* A compilation unit's source range is the entire document -
* the first integer is zero, and the second integer is the position
* of the last character in the document.
*/
DOMCompilationUnit(char[] document, int[] sourceRange) {
super(document, sourceRange, null, new int[]{-1, -1});
fHeader = ""; //$NON-NLS-1$
}
/**
* @see DOMNode#appendContents(CharArrayBuffer)
*/
protected void appendFragmentedContents(CharArrayBuffer buffer) {
buffer.append(getHeader());
appendContentsOfChildren(buffer);
}
/**
* @see IDOMNode#canHaveChildren()
*/
public boolean canHaveChildren() {
return true;
}
/**
* @see IDOMCompilationUnit#getHeader()
*/
public String getHeader() {
return fHeader;
}
/**
* @see IDOMNode#getJavaElement
*/
public IJavaElement getJavaElement(IJavaElement parent) throws IllegalArgumentException {
if (parent.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
return ((IPackageFragment)parent).getCompilationUnit(getName());
} else {
throw new IllegalArgumentException(Messages.element_illegalParent);
}
}
/**
* @see IDOMCompilationUnit#getName()
*/
public String getName() {
IDOMType topLevelType= null;
IDOMType firstType= null;
IDOMNode child= fFirstChild;
while (child != null) {
if (child.getNodeType() == IDOMNode.TYPE) {
IDOMType type= (IDOMType)child;
if (firstType == null) {
firstType= type;
}
if (Flags.isPublic(type.getFlags())) {
topLevelType= type;
break;
}
}
child= child.getNextNode();
}
if (topLevelType == null) {
topLevelType= firstType;
}
if (topLevelType != null) {
return topLevelType.getName() + Util.defaultJavaExtension();
} else {
return null;
}
}
/**
* @see IDOMNode#getNodeType()
*/
public int getNodeType() {
return IDOMNode.COMPILATION_UNIT;
}
/**
* Sets the header
*/
protected void initalizeHeader() {
DOMNode child = (DOMNode)getFirstChild();
if (child != null) {
int childStart = child.getStartPosition();
if (childStart > 1) {
setHeader(new String(fDocument, 0, childStart));
}
}
}
/**
* @see IDOMNode#isAllowableChild(IDOMNode)
*/
public boolean isAllowableChild(IDOMNode node) {
if (node != null) {
int type= node.getNodeType();
return type == IDOMNode.PACKAGE || type == IDOMNode.IMPORT || type == IDOMNode.TYPE;
} else {
return false;
}
}
/**
* @see DOMNode
*/
protected DOMNode newDOMNode() {
return new DOMCompilationUnit();
}
/**
* Normalizes this <code>DOMNode</code>'s source positions to include whitespace preceeding
* the node on the line on which the node starts, and all whitespace after the node up to
* the next node's start
*/
void normalize(ILineStartFinder finder) {
super.normalize(finder);
initalizeHeader();
}
/**
* @see IDOMCompilationUnit#setHeader(String)
*/
public void setHeader(String comment) {
fHeader= comment;
fragment();
}
/**
* @see IDOMCompilationUnit#setName(String)
*/
public void setName(String name) {
// nothing to do
}
/**
* @see DOMNode#shareContents(DOMNode)
*/
protected void shareContents(DOMNode node) {
super.shareContents(node);
fHeader= ((DOMCompilationUnit)node).fHeader;
}
/**
* @see IDOMNode#toString()
*/
public String toString() {
return "COMPILATION_UNIT: " + getName(); //$NON-NLS-1$
}
}