new version with WorkingCopy Management
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / jdom / SimpleDOMBuilder.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/jdom/SimpleDOMBuilder.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/jdom/SimpleDOMBuilder.java
new file mode 100644 (file)
index 0000000..c923015
--- /dev/null
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.core.jdom;
+
+import java.util.Map;
+
+import net.sourceforge.phpdt.core.jdom.IDOMCompilationUnit;
+import net.sourceforge.phpdt.internal.compiler.ISourceElementRequestor;
+import net.sourceforge.phpdt.internal.compiler.SourceElementParser;
+import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit;
+import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory;
+import net.sourceforge.phpdt.internal.core.util.CharArrayOps;
+import net.sourceforge.phpeclipse.PHPCore;
+
+/**
+ * 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+=".*"; //$NON-NLS-1$
+       }
+       fNode= new DOMImport(fDocument, sourceRange, importName, onDemand);
+       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, String)
+ */
+public IDOMCompilationUnit createCompilationUnit(String sourceCode, String name) {
+       return createCompilationUnit(sourceCode.toCharArray(), name.toCharArray());
+}
+/**
+ * @see IDOMFactory#createCompilationUnit(String, String)
+ */
+public IDOMCompilationUnit createCompilationUnit(ICompilationUnit compilationUnit) {
+       initializeBuild(compilationUnit.getContents(), true, true);
+       getParser(PHPCore.getOptions()).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 enterInitializer(int declarationSourceStart, int modifiers) {
+       int[] sourceRange = {declarationSourceStart, -1};
+       fNode = new DOMInitializer(fDocument, sourceRange, modifiers);
+       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, 
+               returnType, 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(int)
+ */
+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(int)
+ */
+public void exitConstructor(int declarationEnd) {
+       exitMember(declarationEnd);
+}
+/**
+ */
+public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd) {
+       exitMember(declarationEnd);
+}
+/**
+ */
+public void exitInitializer(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(Map settings) {
+       return new SourceElementParser(this, new DefaultProblemFactory());//, new CompilerOptions(settings));
+}
+}