X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/JavaContext.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/JavaContext.java
index 2d50010..30cebda 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/JavaContext.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/template/php/JavaContext.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * 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
@@ -13,15 +13,13 @@ package net.sourceforge.phpdt.internal.corext.template.php;
import java.lang.reflect.InvocationTargetException;
import net.sourceforge.phpdt.core.ICompilationUnit;
-import net.sourceforge.phpdt.core.JavaModelException;
import net.sourceforge.phpdt.internal.corext.Assert;
-import net.sourceforge.phpdt.internal.corext.template.ContextType;
-import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry;
-import net.sourceforge.phpdt.internal.corext.template.Template;
-import net.sourceforge.phpdt.internal.corext.template.TemplateBuffer;
-import net.sourceforge.phpdt.internal.corext.template.TemplateTranslator;
import net.sourceforge.phpdt.internal.corext.template.php.CompilationUnitCompletion.LocalVariable;
+import net.sourceforge.phpdt.internal.corext.util.Strings;
+import net.sourceforge.phpdt.internal.ui.preferences.CodeFormatterPreferencePage;
+import net.sourceforge.phpdt.internal.ui.text.template.contentassist.MultiVariable;
import net.sourceforge.phpdt.internal.ui.util.ExceptionHandler;
+import net.sourceforge.phpdt.ui.PreferenceConstants;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.core.runtime.CoreException;
@@ -32,12 +30,19 @@ import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateTranslator;
+import org.eclipse.jface.text.templates.TemplateVariable;
import org.eclipse.swt.widgets.Shell;
/**
* A context for java source.
*/
-public class JavaContext extends PHPUnitContext {
+public class JavaContext extends CompilationUnitContext {
/** The platform default line delimiter. */
private static final String PLATFORM_LINE_DELIMITER= System.getProperty("line.separator"); //$NON-NLS-1$
@@ -52,42 +57,51 @@ public class JavaContext extends PHPUnitContext {
* @param document the document.
* @param completionOffset the completion offset within the document.
* @param completionLength the completion length.
- * @param unit the compilation unit (may be null
).
+ * @param compilationUnit the compilation unit (may be null
).
*/
- public JavaContext(ContextType type, IDocument document, int completionOffset, int completionLength,
+ public JavaContext(TemplateContextType type, IDocument document, int completionOffset, int completionLength,
ICompilationUnit compilationUnit)
{
- super(type, document, completionOffset, completionLength); //, compilationUnit);
+ super(type, document, completionOffset, completionLength, compilationUnit);
}
/**
* Returns the indentation level at the position of code completion.
*/
private int getIndentation() {
-// int start= getStart();
-// IDocument document= getDocument();
-// try {
-// IRegion region= document.getLineInformationOfOffset(start);
-// String lineContent= document.get(region.getOffset(), region.getLength());
+ int start= getStart();
+ IDocument document= getDocument();
+ try {
+ IRegion region= document.getLineInformationOfOffset(start);
+ String lineContent= document.get(region.getOffset(), region.getLength());
+ return Strings.computeIndent(lineContent, CodeFormatterPreferencePage.getTabSize());
// return Strings.computeIndent(lineContent, CodeFormatterUtil.getTabWidth());
-// } catch (BadLocationException e) {
-// return 0;
-// }
-return 0;
+ } catch (BadLocationException e) {
+ return 0;
+ }
}
+
+
/*
* @see TemplateContext#evaluate(Template template)
*/
- public TemplateBuffer evaluate(Template template) throws CoreException {
+ public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException {
if (!canEvaluate(template))
- return null;
+ throw new TemplateException(JavaTemplateMessages.getString("Context.error.cannot.evaluate")); //$NON-NLS-1$
- TemplateTranslator translator= new TemplateTranslator();
- TemplateBuffer buffer= translator.translate(template.getPattern());
+ TemplateTranslator translator= new TemplateTranslator() {
+ /*
+ * @see org.eclipse.jface.text.templates.TemplateTranslator#createVariable(java.lang.String, java.lang.String, int[])
+ */
+ protected TemplateVariable createVariable(String type, String name, int[] offsets) {
+ return new MultiVariable(type, name, offsets);
+ }
+ };
+ TemplateBuffer buffer= translator.translate(template);
- getContextType().edit(buffer, this);
+ getContextType().resolve(buffer, this);
String lineDelimiter= null;
try {
@@ -99,11 +113,11 @@ return 0;
lineDelimiter= PLATFORM_LINE_DELIMITER;
IPreferenceStore prefs= PHPeclipsePlugin.getDefault().getPreferenceStore();
-// boolean useCodeFormatter= prefs.getBoolean(PreferenceConstants.TEMPLATES_USE_CODEFORMATTER);
-//
-// ITemplateEditor formatter= new JavaFormatter(lineDelimiter, getIndentation(), useCodeFormatter);
-// formatter.edit(buffer, this);
-
+ boolean useCodeFormatter= prefs.getBoolean(PreferenceConstants.TEMPLATES_USE_CODEFORMATTER);
+
+// JavaFormatter formatter= new JavaFormatter(lineDelimiter, getIndentation(), useCodeFormatter);
+// formatter.format(buffer, this);
+
return buffer;
}
@@ -117,10 +131,15 @@ return 0;
return true;
return
- template.matches(key, getContextType().getName()) &&
+ template.matches(key, getContextType().getId()) &&
key.length() != 0 && template.getName().toLowerCase().startsWith(key.toLowerCase());
}
+ public boolean canEvaluate(String identifier) {
+ String prefix = getKey();
+ return
+ identifier.toLowerCase().startsWith(prefix.toLowerCase());
+ }
/*
* @see DocumentTemplateContext#getCompletionPosition();
*/
@@ -163,11 +182,11 @@ return 0;
}
/*
- * @see org.eclipse.jdt.internal.corext.template.DocumentTemplateContext#getEnd()
+ * @see net.sourceforge.phpdt.internal.corext.template.DocumentTemplateContext#getEnd()
*/
public int getEnd() {
- if (getCompletionLength() == 0)
+ if (getCompletionLength() == 0)
return super.getEnd();
try {
@@ -187,7 +206,7 @@ return 0;
}
/*
- * @see org.eclipse.jdt.internal.corext.template.DocumentTemplateContext#getKey()
+ * @see net.sourceforge.phpdt.internal.corext.template.DocumentTemplateContext#getKey()
*/
public String getKey() {
@@ -224,28 +243,8 @@ return 0;
}
}
- private CompilationUnitCompletion guessVariableNames() {
-// ICompilationUnit unit= getCompilationUnit();
-// int start= getStart();
-//
-// if (unit == null)
-// return null;
-//
-// try {
-// CompilationUnitCompletion collector= new CompilationUnitCompletion(unit);
-// unit.codeComplete(start, collector);
-// return collector;
-//
-// } catch (JavaModelException e) {
-// handleException(null, e);
-// return null;
-// }
- return null;
- }
-
-
private static void handleException(Shell shell, Exception e) {
- String title= PHPTemplateMessages.getString("JavaContext.error.title"); //$NON-NLS-1$
+ String title= JavaTemplateMessages.getString("JavaContext.error.title"); //$NON-NLS-1$
if (e instanceof CoreException)
ExceptionHandler.handle((CoreException)e, shell, title, null);
else if (e instanceof InvocationTargetException)
@@ -256,7 +255,7 @@ return 0;
}
}
- private CompilationUnitCompletion getCompletion() {
+// private CompilationUnitCompletion getCompletion() {
// ICompilationUnit compilationUnit= getCompilationUnit();
// if (fCompletion == null) {
// fCompletion= new CompilationUnitCompletion(compilationUnit);
@@ -271,48 +270,95 @@ return 0;
// }
//
// return fCompletion;
- return null;
- }
+// }
/**
* Returns the name of a guessed local array, null
if no local
* array exists.
*/
- public String guessArray() {
- CompilationUnitCompletion completion= getCompletion();
- LocalVariable[] localArrays= completion.findLocalArrays();
-
- if (localArrays.length > 0)
- return localArrays[localArrays.length - 1].name;
-
- return null;
+// public String guessArray() {
+// return firstOrNull(guessArrays());
+// }
+
+ /**
+ * Returns the name of a guessed local array, null
if no local
+ * array exists.
+ */
+// public String[] guessArrays() {
+// CompilationUnitCompletion completion= getCompletion();
+// LocalVariable[] localArrays= completion.findLocalArrays();
+//
+// String[] ret= new String[localArrays.length];
+// for (int i= 0; i < ret.length; i++) {
+// ret[ret.length - i - 1]= localArrays[i].name;
+// }
+// return ret;
+// }
+
+ /**
+ * Returns the name of the type of a local array, null
if no local
+ * array exists.
+ */
+// public String guessArrayType() {
+// return firstOrNull(guessArrayTypes());
+// }
+
+ private String firstOrNull(String[] strings) {
+ if (strings.length > 0)
+ return strings[0];
+ else
+ return null;
}
/**
* Returns the name of the type of a local array, null
if no local
* array exists.
*/
- public String guessArrayType() {
- CompilationUnitCompletion completion= getCompletion();
- LocalVariable[] localArrays= completion.findLocalArrays();
-
- if (localArrays.length > 0) {
- LocalVariable localArray= localArrays[localArrays.length - 1];
-
- String arrayTypeName= localArray.typeName;
+// public String[][] guessGroupedArrayTypes() {
+// CompilationUnitCompletion completion= getCompletion();
+// LocalVariable[] localArrays= completion.findLocalArrays();
+//
+// String[][] ret= new String[localArrays.length][];
+//
+// for (int i= 0; i < localArrays.length; i++) {
+// String type= getArrayTypeFromLocalArray(completion, localArrays[localArrays.length - i - 1]);
+// ret[i]= new String[] {type};
+// }
+//
+// return ret;
+// }
+
+ /**
+ * Returns the name of the type of a local array, null
if no local
+ * array exists.
+ */
+// public String[] guessArrayTypes() {
+// CompilationUnitCompletion completion= getCompletion();
+// LocalVariable[] localArrays= completion.findLocalArrays();
+//
+// List ret= new ArrayList();
+//
+// for (int i= 0; i < localArrays.length; i++) {
+// String type= getArrayTypeFromLocalArray(completion, localArrays[localArrays.length - i - 1]);
+// if (!ret.contains(type))
+// ret.add(type);
+// }
+//
+// return (String[]) ret.toArray(new String[ret.size()]);
+// }
+
+ private String getArrayTypeFromLocalArray(CompilationUnitCompletion completion, LocalVariable array) {
+ String arrayTypeName= array.typeName;
String typeName= getScalarType(arrayTypeName);
int dimension= getArrayDimension(arrayTypeName) - 1;
Assert.isTrue(dimension >= 0);
- String qualifiedName= createQualifiedTypeName(localArray.typePackageName, typeName);
+ String qualifiedName= createQualifiedTypeName(array.typePackageName, typeName);
String innerTypeName= completion.simplifyTypeName(qualifiedName);
return innerTypeName == null
? createArray(typeName, dimension)
: createArray(innerTypeName, dimension);
- }
-
- return null;
}
private static String createArray(String type, int dimension) {
@@ -355,109 +401,212 @@ return 0;
* Returns a proposal for a variable name of a local array element, null
* if no local array exists.
*/
- public String guessArrayElement() {
+// public String guessArrayElement() {
+// return firstOrNull(guessArrayElements());
+// }
+ /**
+ * Returns a proposal for a variable name of a local array element, null
+ * if no local array exists.
+ */
+// public String[] guessArrayElements() {
+// ICompilationUnit cu= getCompilationUnit();
+// if (cu == null) {
+// return new String[0];
+// }
+//
// CompilationUnitCompletion completion= getCompletion();
// LocalVariable[] localArrays= completion.findLocalArrays();
//
-// if (localArrays.length > 0) {
-// int idx= localArrays.length - 1;
+// List ret= new ArrayList();
+//
+// for (int i= 0; i < localArrays.length; i++) {
+// int idx= localArrays.length - i - 1;
//
// LocalVariable var= localArrays[idx];
//
-// IJavaProject project= getCompilationUnit().getJavaProject();
+// IJavaProject project= cu.getJavaProject();
// String typeName= var.typeName;
// String baseTypeName= typeName.substring(0, typeName.lastIndexOf('['));
//
-// String[] proposals= NamingConventions.suggestLocalVariableNames(project, var.typePackageName, baseTypeName, 0, completion.getLocalVariableNames());
-// if (proposals.length > 0) {
-// return proposals[0];
+// String indexName= getIndex();
+// String[] excludedNames= completion.getLocalVariableNames();
+// if (indexName != null) {
+// ArrayList excludedNamesList= new ArrayList(Arrays.asList(excludedNames));
+// excludedNamesList.add(indexName);
+// excludedNames= (String[])excludedNamesList.toArray(new String[excludedNamesList.size()]);
+// }
+// String[] proposals= NamingConventions.suggestLocalVariableNames(project, var.typePackageName, baseTypeName, 0, excludedNames);
+// for (int j= 0; j < proposals.length; j++) {
+// if (!ret.contains(proposals[j]))
+// ret.add(proposals[j]);
// }
// }
+//
+// return (String[]) ret.toArray(new String[ret.size()]);
+// }
- return null;
- }
+ /**
+ * Returns a proposal for a variable name of a local array element, null
+ * if no local array exists.
+ */
+// public String[][] guessGroupedArrayElements() {
+// ICompilationUnit cu= getCompilationUnit();
+// if (cu == null) {
+// return new String[0][];
+// }
+//
+// CompilationUnitCompletion completion= getCompletion();
+// LocalVariable[] localArrays= completion.findLocalArrays();
+//
+// String[][] ret= new String[localArrays.length][];
+//
+// for (int i= 0; i < localArrays.length; i++) {
+// int idx= localArrays.length - i - 1;
+//
+// LocalVariable var= localArrays[idx];
+//
+// IJavaProject project= cu.getJavaProject();
+// String typeName= var.typeName;
+// int dim= -1; // we expect at least one array
+// int lastIndex= typeName.length();
+// int bracket= typeName.lastIndexOf('[');
+// while (bracket != -1) {
+// lastIndex= bracket;
+// dim++;
+// bracket= typeName.lastIndexOf('[', bracket - 1);
+// }
+// typeName= typeName.substring(0, lastIndex);
+//
+// String indexName= getIndex();
+// String[] excludedNames= completion.getLocalVariableNames();
+// if (indexName != null) {
+// ArrayList excludedNamesList= new ArrayList(Arrays.asList(excludedNames));
+// excludedNamesList.add(indexName);
+// excludedNames= (String[])excludedNamesList.toArray(new String[excludedNamesList.size()]);
+// }
+// String[] proposals= NamingConventions.suggestLocalVariableNames(project, var.typePackageName, typeName, dim, excludedNames);
+//
+// ret[i]= proposals;
+// }
+//
+// return ret;
+// }
/**
* Returns an array index name. 'i', 'j', 'k' are tried until no name collision with
* an existing local variable occurs. If all names collide, null
is returned.
*/
- public String getIndex() {
- CompilationUnitCompletion completion= getCompletion();
- String[] proposals= {"i", "j", "k"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
- for (int i= 0; i != proposals.length; i++) {
- String proposal = proposals[i];
-
- if (!completion.existsLocalName(proposal))
- return proposal;
- }
-
- return null;
- }
+// public String getIndex() {
+// CompilationUnitCompletion completion= getCompletion();
+// String[] proposals= {"i", "j", "k"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+//
+// for (int i= 0; i != proposals.length; i++) {
+// String proposal = proposals[i];
+//
+// if (!completion.existsLocalName(proposal))
+// return proposal;
+// }
+//
+// return null;
+// }
/**
* Returns the name of a local collection, null
if no local collection
* exists.
*/
- public String guessCollection() {
- CompilationUnitCompletion completion= getCompletion();
- try {
- LocalVariable[] localCollections= completion.findLocalCollections();
-
- if (localCollections.length > 0)
- return localCollections[localCollections.length - 1].name;
-
- } catch (JavaModelException e) {
- PHPeclipsePlugin.log(e);
- }
-
- return null;
- }
+// public String guessCollection() {
+// return firstOrNull(guessCollections());
+// }
+
+ /**
+ * Returns the names of local collections.
+ */
+// public String[] guessCollections() {
+// CompilationUnitCompletion completion= getCompletion();
+// try {
+// LocalVariable[] localCollections= completion.findLocalCollections();
+// String[] ret= new String[localCollections.length];
+// for (int i= 0; i < ret.length; i++) {
+// ret[ret.length - i - 1]= localCollections[i].name;
+// }
+//
+// return ret;
+//
+// } catch (JavaModelException e) {
+// JavaPlugin.log(e);
+// }
+//
+// return new String[0];
+// }
+
/**
* Returns an iterator name ('iter'). If 'iter' already exists as local variable,
* null
is returned.
*/
- public String getIterator() {
- CompilationUnitCompletion completion= getCompletion();
- String[] proposals= {"iter"}; //$NON-NLS-1$
-
- for (int i= 0; i != proposals.length; i++) {
- String proposal = proposals[i];
-
- if (!completion.existsLocalName(proposal))
- return proposal;
- }
-
- return null;
- }
+// public String getIterator() {
+// CompilationUnitCompletion completion= getCompletion();
+// String[] proposals= {"iter"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+//
+// for (int i= 0; i != proposals.length; i++) {
+// String proposal = proposals[i];
+//
+// if (!completion.existsLocalName(proposal))
+// return proposal;
+// }
+//
+// return null;
+// }
// public void addIteratorImport() {
+// ICompilationUnit cu= getCompilationUnit();
+// if (cu == null) {
+// return;
+// }
//
// try {
+// Position position= new Position(getCompletionOffset(), getCompletionLength());
+// IDocument document= getDocument();
+// final String category= "__template_position_importer" + System.currentTimeMillis(); //$NON-NLS-1$
+// IPositionUpdater updater= new DefaultPositionUpdater(category);
+// document.addPositionCategory(category);
+// document.addPositionUpdater(updater);
+// document.addPosition(position);
+//
// CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-// ImportsStructure structure= new ImportsStructure(getCompilationUnit(), settings.importOrder, settings.importThreshold, true);
+// ImportsStructure structure= new ImportsStructure(cu, settings.importOrder, settings.importThreshold, true);
// structure.addImport("java.util.Iterator"); //$NON-NLS-1$
// structure.create(false, null);
//
+// document.removePosition(position);
+// document.removePositionUpdater(updater);
+// document.removePositionCategory(category);
+//
+// setCompletionOffset(position.getOffset());
+// setCompletionLength(position.getLength());
+//
// } catch (CoreException e) {
// handleException(null, e);
+// } catch (BadLocationException e) {
+// handleException(null, e);
+// } catch (BadPositionCategoryException e) {
+// handleException(null, e);
// }
// }
/**
* Evaluates a 'java' template in thecontext of a compilation unit
*/
- public static String evaluateTemplate(Template template, ICompilationUnit compilationUnit, int position) throws CoreException {
+ public static String evaluateTemplate(Template template, ICompilationUnit compilationUnit, int position) throws CoreException, BadLocationException, TemplateException {
- ContextType contextType= ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$
+ TemplateContextType contextType= PHPeclipsePlugin.getDefault().getTemplateContextRegistry().getContextType("java"); //$NON-NLS-1$
if (contextType == null)
- throw new CoreException(new Status(IStatus.ERROR, PHPeclipsePlugin.PLUGIN_ID, IStatus.ERROR, PHPTemplateMessages.getString("JavaContext.error.message"), null)); //$NON-NLS-1$
+ throw new CoreException(new Status(IStatus.ERROR, PHPeclipsePlugin.PLUGIN_ID, IStatus.ERROR, JavaTemplateMessages.getString("JavaContext.error.message"), null)); //$NON-NLS-1$
IDocument document= new Document();
-// if (compilationUnit != null && compilationUnit.exists())
-// document.set(compilationUnit.getSource());
+ if (compilationUnit != null && compilationUnit.exists())
+ document.set(compilationUnit.getSource());
JavaContext context= new JavaContext(contextType, document, position, 0, compilationUnit);
context.setForceEvaluation(true);