X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/DeclarationEngine.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/DeclarationEngine.java index 56e309e..91ce5e7 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/DeclarationEngine.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/DeclarationEngine.java @@ -8,12 +8,15 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.SortedMap; +import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; import net.sourceforge.phpdt.internal.corext.template.ContextType; import net.sourceforge.phpdt.internal.corext.template.php.CompilationUnitContextType; import net.sourceforge.phpdt.internal.corext.template.php.PHPUnitContext; -import net.sourceforge.phpdt.internal.ui.PHPUiImages; import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal; +import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpeclipse.builder.PHPIdentifierLocation; +import org.eclipse.core.resources.IFile; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; @@ -28,14 +31,27 @@ public class DeclarationEngine { private ContextType fContextType; /** The result proposals. */ private ArrayList fProposals = new ArrayList(); + /** Token determines last which declarations are allowed for proposal */ + private int fLastSignificantToken; + + private IFile fFile; + private String fFileName; /** * Creates the template engine for a particular context type. * See TemplateContext for supported context types. */ - public DeclarationEngine(ContextType contextType) { + public DeclarationEngine(ContextType contextType, int lastSignificantToken, IFile file) { // Assert.isNotNull(contextType); fContextType = contextType; + + fLastSignificantToken = lastSignificantToken; + fFile = file; + if (fFile != null) { + fFileName = fFile.getFullPath().toString(); + } else { + fFileName = ""; + } } /** @@ -62,18 +78,17 @@ public class DeclarationEngine { * @param completionPosition the context position in the document of the text viewer * @param compilationUnit the compilation unit (may be null) */ - public void complete(ITextViewer viewer, int completionPosition, SortedMap map) - //,ICompilationUnit compilationUnit) - //hrows JavaModelException - { + public void complete(ITextViewer viewer, int completionPosition, SortedMap map) { IDocument document = viewer.getDocument(); if (!(fContextType instanceof CompilationUnitContextType)) return; Point selection = viewer.getSelectedRange(); + // remember selected text String selectedText = null; + if (selection.y != 0) { try { selectedText = document.get(selection.x, selection.y); @@ -81,30 +96,57 @@ public class DeclarationEngine { } } - ((CompilationUnitContextType) fContextType).setContextParameters(document, completionPosition, selection.y); //mpilationUnit); + ((CompilationUnitContextType) fContextType).setContextParameters(document, completionPosition, selection.y); PHPUnitContext context = (PHPUnitContext) fContextType.createContext(); int start = context.getStart(); int end = context.getEnd(); - String prefix = context.getKey(); + String prefix = context.getKey(); IRegion region = new Region(start, end - start); String identifier = null; - - SortedMap subMap = map.subMap(prefix,prefix+'\255'); - Iterator iter = subMap.keySet().iterator(); + SortedMap subMap = map.subMap(prefix, prefix + '\255'); + Iterator iter = subMap.keySet().iterator(); + PHPIdentifierLocation location; + ArrayList list; + int maxProposals = PHPeclipsePlugin.MAX_PROPOSALS; while (iter.hasNext()) { identifier = (String) iter.next(); if (context.canEvaluate(identifier)) { - fProposals.add( - new DeclarationProposal( - identifier, - context, - region, - viewer, - PHPUiImages.get(PHPUiImages.IMG_FUN), - PHPUiImages.get(PHPUiImages.IMG_VAR))); + list = (ArrayList) subMap.get(identifier); + for (int i = 0; i < list.size(); i++) { + location = (PHPIdentifierLocation) list.get(i); + int type = location.getType(); + switch (fLastSignificantToken) { + case ITerminalSymbols.TokenNameMINUS_GREATER : + if (type != PHPIdentifierLocation.METHOD && type != PHPIdentifierLocation.VARIABLE) { + continue; // for loop + } + break; + case ITerminalSymbols.TokenNamethis : + if (type != PHPIdentifierLocation.METHOD && type != PHPIdentifierLocation.VARIABLE) { + continue; // for loop + } + if (!fFileName.equals(location.getFilename())) { + continue; // for loop + } + break; + case ITerminalSymbols.TokenNamenew : + if (type != PHPIdentifierLocation.CLASS && type != PHPIdentifierLocation.CONSTRUCTOR) { + continue; // for loop + } + break; + default : + if (type == PHPIdentifierLocation.METHOD || type == PHPIdentifierLocation.CONSTRUCTOR || type == PHPIdentifierLocation.VARIABLE) { + continue; // for loop + } + } + if (maxProposals-- < 0) { + return; + } + fProposals.add(new DeclarationProposal(identifier, location, context, region, viewer)); + } } }