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(); + } + +} +