X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java index c4ce375..976f385 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPCompletionProcessor.java @@ -16,8 +16,14 @@ import java.util.Arrays; import java.util.List; import java.util.SortedMap; +import net.sourceforge.phpdt.core.ToolFactory; +import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; +import net.sourceforge.phpdt.core.compiler.InvalidInputException; +import net.sourceforge.phpdt.internal.compiler.parser.Scanner; import net.sourceforge.phpdt.internal.corext.template.ContextType; import net.sourceforge.phpdt.internal.corext.template.ContextTypeRegistry; +import net.sourceforge.phpdt.internal.corext.template.php.CompilationUnitContextType; +import net.sourceforge.phpdt.internal.corext.template.php.PHPUnitContext; import net.sourceforge.phpdt.internal.ui.text.java.IPHPCompletionProposal; import net.sourceforge.phpdt.internal.ui.text.java.PHPCompletionProposalComparator; import net.sourceforge.phpdt.internal.ui.text.template.BuiltInEngine; @@ -29,11 +35,15 @@ import net.sourceforge.phpeclipse.builder.IdentifierIndexManager; import net.sourceforge.phpeclipse.phpeditor.AbstractContentOutlinePage; import net.sourceforge.phpeclipse.phpeditor.PHPContentOutlinePage; import net.sourceforge.phpeclipse.phpeditor.PHPEditor; +import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextPresentation; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; @@ -240,7 +250,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { // } // } - protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES; +// protected final static String[] fgProposals = PHPFunctionNames.FUNCTION_NAMES; private char[] fProposalAutoActivationSet; protected IContextInformationValidator fValidator = new Validator(); @@ -309,6 +319,68 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } + private boolean isReference(ITextViewer viewer, int completionPosition) { + IDocument document = viewer.getDocument(); + ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$ + ((CompilationUnitContextType) contextType).setContextParameters(document, completionPosition, 0); + + PHPUnitContext context = (PHPUnitContext) contextType.createContext(); + int start = context.getStart(); + int end = context.getEnd(); + String prefix = context.getKey(); + IRegion region = new Region(start, end - start); + + String startText; + boolean useClassEntries = false; + try { + // search begin of 2 lines behind this + int j = start; + if (j != 0) { + char ch; + while (j-- > 0) { + ch = document.getChar(j); + if (ch == '\n') { + break; + } + } + while (j-- > 0) { + ch = document.getChar(j); + if (ch == '\n') { + break; + } + } + } + if (j != start) { + // scan the line for the dereferencing operator '->' + startText = document.get(j, start - j); + // System.out.println(startText); + Scanner scanner = ToolFactory.createScanner(false, false, false); + scanner.setSource(startText.toCharArray()); + scanner.setPHPMode(true); + int token = ITerminalSymbols.TokenNameEOF; + int lastToken = ITerminalSymbols.TokenNameEOF; + + try { + token = scanner.getNextToken(); + lastToken = token; + while (token != ITerminalSymbols.TokenNameERROR && token != ITerminalSymbols.TokenNameEOF) { + lastToken = token; + // System.out.println(scanner.toStringAction(lastToken)); + token = scanner.getNextToken(); + } + } catch (InvalidInputException e1) { + } + if (lastToken == ITerminalSymbols.TokenNameMINUS_GREATER) { + // dereferencing operator '->' found + useClassEntries = true; + // System.out.println("useClassEntries = true"); + } + } + } catch (BadLocationException e) { + } + return useClassEntries; + } + private ICompletionProposal[] internalComputeCompletionProposals(ITextViewer viewer, int offset, int contextOffset) { IDocument document = viewer.getDocument(); Object[] identifiers = null; @@ -361,6 +433,7 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { } } + boolean useClassEntries = isReference(viewer, offset); IPHPCompletionProposal[] declarationResults = new IPHPCompletionProposal[0]; if (project != null) { DeclarationEngine identifierEngine; @@ -371,23 +444,23 @@ public class PHPCompletionProcessor implements IContentAssistProcessor { IdentifierIndexManager indexManager = PHPeclipsePlugin.getDefault().getIndexManager(project); SortedMap sortedMap = indexManager.getIdentifierMap(); - identifierEngine = new DeclarationEngine(contextType); + identifierEngine = new DeclarationEngine(contextType, useClassEntries); identifierEngine.complete(viewer, offset, sortedMap); identifierResults = identifierEngine.getResults(); } } // built in function names from phpsyntax.xml + ArrayList syntaxbuffer = PHPSyntaxRdr.getSyntaxData(); IPHPCompletionProposal[] builtinResults = new IPHPCompletionProposal[0]; - if (PHPFunctionNames.FUNCTION_NAMES != null) { + if ((!useClassEntries)&&syntaxbuffer != null) { BuiltInEngine builtinEngine; String proposal; ContextType contextType = ContextTypeRegistry.getInstance().getContextType("php"); //$NON-NLS-1$ if (contextType != null) { builtinEngine = new BuiltInEngine(contextType); - // TODO PHPFunctionNames.FUNCTION_NAMES should be taken from phpsyntax.xml - builtinEngine.complete(viewer, offset, PHPFunctionNames.FUNCTION_NAMES); + builtinEngine.complete(viewer, offset, syntaxbuffer); builtinResults = builtinEngine.getResults(); } }