blob: 49830eb364f08ff2058570638583bc86f4927ae4 [file] [log] [blame]
package org.eclipse.jdt.internal.core.jdom;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import org.eclipse.jdt.internal.compiler.*;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.core.jdom.*;
import org.eclipse.jdt.internal.core.util.*;
import java.lang.reflect.Modifier;
import java.util.Enumeration;
import java.util.Stack;
/**
* A DOM builder that uses the SourceElementParser
*/
public class SimpleDOMBuilder extends AbstractDOMBuilder implements ISourceElementRequestor {
/**
*/
public void acceptImport(int declarationStart, int declarationEnd, char[] name, boolean onDemand) {
int[] sourceRange = {declarationStart, declarationEnd};
String importName = new String(name);
/** name is set to contain the '*' */
if (onDemand) {
importName+=".*"/*nonNLS*/;
}
fNode= new DOMImport(fDocument, sourceRange, importName, onDemand);
addChild(fNode);
}
/**
*/
public void acceptInitializer(int modifiers, int declarationSourceStart, int declarationSourceEnd) {
int[] sourceRange = {declarationSourceStart, declarationSourceEnd};
fNode = new DOMInitializer(fDocument, sourceRange, modifiers);
addChild(fNode);
}
/**
*/
public void acceptPackage(int declarationStart, int declarationEnd, char[] name) {
int[] sourceRange= new int[] {declarationStart, declarationEnd};
fNode= new DOMPackage(fDocument, sourceRange, CharArrayOps.charToString(name));
addChild(fNode);
}
/**
* @see IDOMFactory#createCompilationUnit(String)
*/
public IDOMCompilationUnit createCompilationUnit(String sourceCode, String name) {
return createCompilationUnit(sourceCode.toCharArray(), name.toCharArray());
}
/**
* @see IDOMFactory#createCompilationUnit(String)
*/
public IDOMCompilationUnit createCompilationUnit(ICompilationUnit compilationUnit) {
initializeBuild(compilationUnit.getContents(), true, true);
getParser().parseCompilationUnit(compilationUnit, false);
return super.createCompilationUnit(compilationUnit);
}
/**
* Creates a new DOMMethod and inizializes.
*
* @param declarationStart - a source position corresponding to the first character
* of this constructor declaration
* @param modifiers - the modifiers for this constructor converted to a flag
* @param returnType - the name of the return type
* @param name - the name of this constructor
* @param nameStart - a source position corresponding to the first character of the name
* @param nameEnd - a source position corresponding to the last character of the name
* @param parameterTypes - a list of parameter type names
* @param parameterNames - a list of the names of the parameters
* @param exceptionTypes - a list of the exception types
*/
protected void enterAbstractMethod(int declarationStart, int modifiers,
char[] returnType, char[] name, int nameStart, int nameEnd, char[][] parameterTypes,
char[][] parameterNames, char[][] exceptionTypes, boolean isConstructor) {
int[] sourceRange = {declarationStart, -1}; // will be fixed up on exit
int[] nameRange = {nameStart, nameEnd};
fNode = new DOMMethod(fDocument, sourceRange, CharArrayOps.charToString(name), nameRange, modifiers,
isConstructor, CharArrayOps.charToString(returnType),
CharArrayOps.charcharToString(parameterTypes),
CharArrayOps.charcharToString(parameterNames),
CharArrayOps.charcharToString(exceptionTypes));
addChild(fNode);
fStack.push(fNode);
}
/**
*/
public void enterClass(int declarationStart, int modifiers, char[] name, int nameStart, int nameEnd, char[] superclass, char[][] superinterfaces) {
enterType(declarationStart, modifiers, name, nameStart, nameEnd, superclass,
superinterfaces, true);
}
/**
*/
public void enterConstructor(int declarationStart, int modifiers, char[] name, int nameStart, int nameEnd, char[][] parameterTypes, char[][] parameterNames, char[][] exceptionTypes) {
/* see 1FVIIQZ */
String nameString = new String(fDocument, nameStart, nameEnd - nameStart);
int openParenPosition = nameString.indexOf('(');
if (openParenPosition > -1)
nameEnd = nameStart + openParenPosition - 1;
enterAbstractMethod(declarationStart, modifiers,
null, name, nameStart, nameEnd, parameterTypes,
parameterNames, exceptionTypes,true);
}
/**
*/
public void enterField(int declarationStart, int modifiers, char[] type, char[] name, int nameStart, int nameEnd) {
int[] sourceRange = {declarationStart, -1};
int[] nameRange = {nameStart, nameEnd};
boolean isSecondary= false;
if (fNode instanceof DOMField) {
isSecondary = declarationStart == fNode.fSourceRange[0];
}
fNode = new DOMField(fDocument, sourceRange, CharArrayOps.charToString(name), nameRange,
modifiers, CharArrayOps.charToString(type), isSecondary);
addChild(fNode);
fStack.push(fNode);
}
/**
*/
public void enterInterface(int declarationStart, int modifiers, char[] name, int nameStart, int nameEnd, char[][] superinterfaces) {
enterType(declarationStart, modifiers, name, nameStart, nameEnd, null,
superinterfaces, false);
}
/**
*/
public void enterMethod(int declarationStart, int modifiers, char[] returnType, char[] name, int nameStart, int nameEnd, char[][] parameterTypes, char[][] parameterNames, char[][] exceptionTypes) {
enterAbstractMethod(declarationStart, modifiers,
null, name, nameStart, nameEnd, parameterTypes,
parameterNames, exceptionTypes,false);
}
/**
*/
protected void enterType(int declarationStart, int modifiers, char[] name,
int nameStart, int nameEnd, char[] superclass, char[][] superinterfaces, boolean isClass) {
if (fBuildingType) {
int[] sourceRange = {declarationStart, -1}; // will be fixed in the exit
int[] nameRange = new int[] {nameStart, nameEnd};
fNode = new DOMType(fDocument, sourceRange, new String(name), nameRange,
modifiers, CharArrayOps.charcharToString(superinterfaces), isClass);
addChild(fNode);
fStack.push(fNode);
}
}
/**
* Finishes the configuration of the class DOM object which
* was created by a previous enterClass call.
*
* @see ISourceElementRequestor.exitClass(...);
*/
public void exitClass(int declarationEnd) {
exitType(declarationEnd);
}
/**
* Finishes the configuration of the method DOM object which
* was created by a previous enterConstructor call.
*
* @see ISourceElementRequestor.exitConstructor(...);
*/
public void exitConstructor(int declarationEnd) {
exitMember(declarationEnd);
}
/**
*/
public void exitField(int declarationEnd) {
exitMember(declarationEnd);
}
/**
*/
public void exitInterface(int declarationEnd) {
exitType(declarationEnd);
}
/**
* Finishes the configuration of the member.
*
* @param declarationEnd - a source position corresponding to the end of the method
* declaration. This can include whitespace and comments following the closing bracket.
*/
protected void exitMember(int declarationEnd) {
DOMMember m= (DOMMember) fStack.pop();
m.setSourceRangeEnd(declarationEnd);
fNode = m;
}
/**
*/
public void exitMethod(int declarationEnd) {
exitMember(declarationEnd);
}
/**
* @see AbstractDOMBuilder#exitType
*
* @param declarationEnd - a source position corresponding to the end of the class
* declaration. This can include whitespace and comments following the closing bracket.
*/
protected void exitType(int declarationEnd) {
exitType(declarationEnd, declarationEnd);
}
/**
* Creates a new parser.
*/
protected SourceElementParser getParser() {
return new SourceElementParser(this, new NullProblemFactory());
}
}