X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CompilationUnitCompletion.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CompilationUnitCompletion.java
new file mode 100644
index 0000000..2332163
--- /dev/null
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CompilationUnitCompletion.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * 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.corext.template.php;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import net.sourceforge.phpdt.core.CompletionRequestorAdapter;
+import net.sourceforge.phpdt.core.ICompilationUnit;
+import net.sourceforge.phpdt.core.JavaModelException;
+import net.sourceforge.phpdt.core.compiler.IProblem;
+
+
+
+/**
+ * A completion requestor to collect informations on local variables.
+ * This class is used for guessing variable names like arrays, collections, etc.
+ */
+class CompilationUnitCompletion extends CompletionRequestorAdapter {
+
+ static class LocalVariable {
+ String name;
+ String typePackageName;
+ String typeName;
+
+ LocalVariable(String name, String typePackageName, String typeName) {
+ this.name= name;
+ this.typePackageName= typePackageName;
+ this.typeName= typeName;
+ }
+ }
+
+ private ICompilationUnit fUnit;
+
+ private List fLocalVariables= new ArrayList();
+ private Map fTypes= new HashMap();
+
+
+ private boolean fError;
+
+ /**
+ * Creates a compilation unit completion.
+ *
+ * @param unit the compilation unit, may be null
.
+ */
+ public CompilationUnitCompletion(ICompilationUnit unit) {
+ reset(unit);
+ }
+
+ /**
+ * Resets the completion requestor.
+ *
+ * @param unit the compilation unit, may be null
.
+ */
+ public void reset(ICompilationUnit unit) {
+ fUnit= unit;
+
+ fLocalVariables.clear();
+ fTypes.clear();
+
+ fError= false;
+ }
+
+ /*
+ * @see ICompletionRequestor#acceptError(IProblem)
+ */
+ public void acceptError(IProblem error) {
+ fError= true;
+ }
+
+
+ /*
+ * @see ICodeCompletionRequestor#acceptLocalVariable
+ */
+ public void acceptLocalVariable(char[] name, char[] typePackageName, char[] typeName,
+ int modifiers, int completionStart, int completionEnd, int relevance)
+ {
+ fLocalVariables.add(new LocalVariable(
+ new String(name), new String(typePackageName), new String(typeName)));
+ }
+
+
+ // ---
+
+ /**
+ * Tests if the code completion process produced errors.
+ */
+ public boolean hasErrors() {
+ return fError;
+ }
+
+
+ boolean existsLocalName(String name) {
+ for (Iterator iterator = fLocalVariables.iterator(); iterator.hasNext();) {
+ LocalVariable localVariable = (LocalVariable) iterator.next();
+
+ if (localVariable.name.equals(name))
+ return true;
+ }
+
+ return false;
+ }
+
+ String[] getLocalVariableNames() {
+ String[] res= new String[fLocalVariables.size()];
+ int i= 0;
+ for (Iterator iterator = fLocalVariables.iterator(); iterator.hasNext();) {
+ LocalVariable localVariable = (LocalVariable) iterator.next();
+ res[i++]= localVariable.name;
+ }
+ return res;
+ }
+
+ LocalVariable[] findLocalArrays() {
+ Vector vector= new Vector();
+
+ for (Iterator iterator= fLocalVariables.iterator(); iterator.hasNext();) {
+ LocalVariable localVariable= (LocalVariable) iterator.next();
+
+ if (isArray(localVariable.typeName))
+ vector.add(localVariable);
+ }
+
+ return (LocalVariable[]) vector.toArray(new LocalVariable[vector.size()]);
+ }
+
+ LocalVariable[] findLocalCollections() throws JavaModelException {
+ Vector vector= new Vector();
+
+ for (Iterator iterator= fLocalVariables.iterator(); iterator.hasNext();) {
+ LocalVariable localVariable= (LocalVariable) iterator.next();
+
+ String typeName= qualify(localVariable.typeName);
+
+ if (typeName == null)
+ continue;
+
+ if (isSubclassOf(typeName, "java.util.Collection")) //$NON-NLS-1$
+ vector.add(localVariable);
+ }
+
+ return (LocalVariable[]) vector.toArray(new LocalVariable[vector.size()]);
+ }
+
+ String simplifyTypeName(String qualifiedName) {
+ return (String) fTypes.get(qualifiedName);
+ }
+
+ private LocalVariable[] findLocalIntegers() {
+ Vector vector= new Vector();
+
+ for (Iterator iterator= fLocalVariables.iterator(); iterator.hasNext();) {
+ LocalVariable localVariable= (LocalVariable) iterator.next();
+
+ if (localVariable.typeName.equals("int")) //$NON-NLS-1$
+ vector.add(localVariable);
+ }
+
+ return (LocalVariable[]) vector.toArray(new LocalVariable[vector.size()]);
+ }
+
+ private LocalVariable[] findLocalIterator() throws JavaModelException {
+ Vector vector= new Vector();
+
+ for (Iterator iterator= fLocalVariables.iterator(); iterator.hasNext();) {
+ LocalVariable localVariable= (LocalVariable) iterator.next();
+
+ String typeName= qualify(localVariable.typeName);
+
+ if (typeName == null)
+ continue;
+
+ if (isSubclassOf(typeName, "java.util.Iterator")) //$NON-NLS-1$
+ vector.add(localVariable);
+ }
+
+ return (LocalVariable[]) vector.toArray(new LocalVariable[vector.size()]);
+ }
+
+ private static boolean isArray(String type) {
+ return type.endsWith("[]"); //$NON-NLS-1$
+ }
+
+ // returns fully qualified name if successful
+ private String qualify(String typeName) throws JavaModelException {
+ if (fUnit == null)
+ return null;
+
+// IType[] types= fUnit.getTypes();
+//
+// if (types.length == 0)
+// return null;
+//
+// String[][] resolvedTypeNames= types[0].resolveType(typeName);
+//
+// if (resolvedTypeNames == null)
+// return null;
+//
+// return resolvedTypeNames[0][0] + '.' + resolvedTypeNames[0][1];
+ return null;
+ }
+
+ // type names must be fully qualified
+ private boolean isSubclassOf(String typeName0, String typeName1) throws JavaModelException {
+ if (typeName0.equals(typeName1))
+ return true;
+
+ if (fUnit == null)
+ return false;
+
+// IJavaProject project= fUnit.getJavaProject();
+// IType type0= project.findType(typeName0);
+// IType type1= project.findType(typeName1);
+//
+// ITypeHierarchy hierarchy= type0.newSupertypeHierarchy(null);
+// IType[] superTypes= hierarchy.getAllSupertypes(type0);
+//
+// for (int i= 0; i < superTypes.length; i++)
+// if (superTypes[i].equals(type1))
+// return true;
+
+ return false;
+ }
+
+ /*
+ * @see org.eclipse.jdt.core.ICompletionRequestor#acceptClass(char[], char[], char[], int, int, int, int)
+ */
+ public void acceptClass(char[] packageName, char[] className, char[] completionName, int modifiers,
+ int completionStart, int completionEnd, int relevance)
+ {
+ final String qualifiedName= createQualifiedTypeName(packageName, className);
+ fTypes.put(qualifiedName, String.valueOf(completionName));
+ }
+
+ /*
+ * @see org.eclipse.jdt.core.ICompletionRequestor#acceptInterface(char[], char[], char[], int, int, int, int)
+ */
+ public void acceptInterface(char[] packageName, char[] interfaceName, char[] completionName,
+ int modifiers, int completionStart, int completionEnd, int relevance)
+ {
+ final String qualifiedName= createQualifiedTypeName(packageName, interfaceName);
+ fTypes.put(qualifiedName, String.valueOf(completionName));
+ }
+
+ private static String createQualifiedTypeName(char[] packageName, char[] className) {
+ StringBuffer buffer= new StringBuffer();
+
+ if (packageName.length != 0) {
+ buffer.append(packageName);
+ buffer.append('.');
+ }
+ buffer.append(className);
+
+ return buffer.toString();
+ }
+
+}
+