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..eae8473 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/CompilationUnitCompletion.java @@ -0,0 +1,250 @@ +/******************************************************************************* + * 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 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.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 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]; + // } + + // 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); + // if (type0 == null) + // return false; + // + // IType type1= project.findType(typeName1); + // if (type1 == null) + // return false; + // + // 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 net.sourceforge.phpdt.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 net.sourceforge.phpdt.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(); + } + +}