/*******************************************************************************
* Copyright (c) 2005, 2012 eBay Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
/**
*
*/
package org.eclipse.vjet.eclipse.internal.ui.text.completion;
import org.eclipse.vjet.eclipse.codeassist.CodeassistUtils;
import org.eclipse.vjet.eclipse.codeassist.keywords.CompletionContext;
import org.eclipse.vjet.eclipse.codeassist.keywords.IVjoCompletionData;
import org.eclipse.vjet.eclipse.codeassist.keywords.VjoKeywordFactory;
import org.eclipse.vjet.eclipse.core.search.matching.ICategoryRequestor;
import org.eclipse.vjet.eclipse.ui.text.completion.MethodDeclarationCompletionProposal;
import org.eclipse.vjet.eclipse.ui.text.completion.VjoCompletionProposalLabelProvider;
import org.eclipse.vjet.eclipse.ui.text.completion.VjoOverrideCompletionProposal;
import org.eclipse.vjet.eclipse.ui.text.completion.VjoScriptMethodCompletionProposal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.mod.core.CompletionProposal;
import org.eclipse.dltk.mod.core.IMember;
import org.eclipse.dltk.mod.core.IModelElement;
import org.eclipse.dltk.mod.core.IScriptProject;
import org.eclipse.dltk.mod.core.ISourceModule;
import org.eclipse.dltk.mod.core.IType;
import org.eclipse.dltk.mod.internal.core.JSSourceField;
import org.eclipse.dltk.mod.internal.core.NativeVjoSourceModule;
import org.eclipse.dltk.mod.ui.DLTKUIPlugin;
import org.eclipse.dltk.mod.ui.text.completion.CompletionProposalLabelProvider;
import org.eclipse.dltk.mod.ui.text.completion.FieldProposalInfo;
import org.eclipse.dltk.mod.ui.text.completion.IScriptCompletionProposal;
import org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposal;
import org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector;
import org.eclipse.dltk.mod.ui.text.completion.ScriptContentAssistInvocationContext;
import org.eclipse.swt.graphics.Image;
/**
*
*
*
*/
// FIXME fill this class
public abstract class AbstractVjoCompletionProposalCollector extends
ScriptCompletionProposalCollector implements ICategoryRequestor {
protected final static char[] VAR_TRIGGER = new char[] { '\t', ' ', '=',
';', '.' };
public AbstractVjoCompletionProposalCollector(ISourceModule cu) {
super(cu);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector#createLabelProvider()
*/
@Override
protected CompletionProposalLabelProvider createLabelProvider() {
return new VjoCompletionProposalLabelProvider();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector#createOverrideCompletionProposal(org.eclipse.dltk.mod.core.IScriptProject,
* org.eclipse.dltk.mod.core.ISourceModule, java.lang.String,
* java.lang.String[], int, int, java.lang.String, java.lang.String)
*/
@Override
protected ScriptCompletionProposal createOverrideCompletionProposal(
IScriptProject scriptProject, ISourceModule compilationUnit,
String name, String[] paramTypes, int start, int length,
String label, String string) {
return new VjoOverrideCompletionProposal(scriptProject,
compilationUnit, name, paramTypes, start, length, label, string);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector#createScriptCompletionProposal(java.lang.String,
* int, int, org.eclipse.swt.graphics.Image, java.lang.String, int)
*/
@Override
protected ScriptCompletionProposal createScriptCompletionProposal(
String completion, int replaceStart, int length, Image image,
String displayString, int i) {
VjoCompletionProposal javaScriptCompletionProposal = new VjoCompletionProposal(
completion, replaceStart, length, image, displayString, i);
return javaScriptCompletionProposal;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector#createScriptCompletionProposal(java.lang.String,
* int, int, org.eclipse.swt.graphics.Image, java.lang.String, int,
* boolean)
*/
@Override
protected ScriptCompletionProposal createScriptCompletionProposal(
String completion, int replaceStart, int length, Image image,
String displayString, int i, boolean isInDoc) {
VjoCompletionProposal javaScriptCompletionProposal = new VjoCompletionProposal(
completion, replaceStart, length, image, displayString, i,
isInDoc);
return javaScriptCompletionProposal;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector#createScriptContentAssistInvocationContext(org.eclipse.dltk.mod.core.ISourceModule)
*/
@Override
protected ScriptContentAssistInvocationContext createScriptContentAssistInvocationContext(
ISourceModule sourceModule) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.text.completion.ScriptCompletionProposalCollector#getVarTrigger()
*/
@Override
protected char[] getVarTrigger() {
return VAR_TRIGGER;
}
protected IScriptCompletionProposal createScriptCompletionProposal(
CompletionProposal proposal) {
IScriptCompletionProposal scriptCompletionProposal = super
.createScriptCompletionProposal(proposal);
if (proposal.getKind() == CompletionProposal.KEYWORD) {
VjoCompletionProposal vjoCompletionProposal = (VjoCompletionProposal) scriptCompletionProposal;
IVjoCompletionData vjoKeyword = VjoKeywordFactory
.getKeywordByName(vjoCompletionProposal.getDisplayString());
if (vjoKeyword != null) {
vjoCompletionProposal.setCursorPosition(vjoKeyword
.getCursorOffsetAfterCompletion());
}
}
if (scriptCompletionProposal instanceof VjoCompletionProposal) {
VjoCompletionProposal p = (VjoCompletionProposal) scriptCompletionProposal;
p.setExtraInfo(proposal.extraInfo);
}
return scriptCompletionProposal;
}
@Override
public void accept(CompletionProposal proposal) {
if (proposal.getKind() == CompletionProposal.POTENTIAL_METHOD_DECLARATION) {
acceptPotentialMethodDeclaration(proposal);
}
super.accept(proposal);
}
private void acceptPotentialMethodDeclaration(CompletionProposal proposal) {
if (getSourceModule() == null)
return;
String prefix = String.valueOf(proposal.getName());
int completionStart = proposal.getReplaceStart();
int completionEnd = proposal.getReplaceEnd();
int relevance = computeRelevance(proposal);
try {
IModelElement element = getSourceModule().getElementAt(
proposal.getCompletionLocation() + 1);
if (element != null) {
IType type = (IType) element.getAncestor(IModelElement.TYPE);
if (type != null) {
// GetterSetterCompletionProposal.evaluateProposals(type,
// prefix, completionStart, completionEnd - completionStart,
// relevance + 1, fSuggestedMethodNames, fJavaProposals);
MethodDeclarationCompletionProposal.evaluateProposals(type,
prefix, completionStart, completionEnd
- completionStart, relevance,
fSuggestedMethodNames, fScriptProposals,
isStaticBlock(proposal));
}
}
} catch (CoreException e) {
DLTKUIPlugin.log(e);
}
}
private boolean isStaticBlock(CompletionProposal proposal) {
boolean isStaticBlock = false;
if (proposal.extraInfo instanceof Boolean) {
isStaticBlock = (Boolean) proposal.extraInfo;
}
return isStaticBlock;
}
@Override
protected IScriptCompletionProposal createMethodReferenceProposal(
CompletionProposal methodProposal) {
VjoScriptMethodCompletionProposal proposal = new VjoScriptMethodCompletionProposal(
methodProposal, getInvocationContext());
proposal.setSourceModule(getSourceModule());
adaptLength(proposal, methodProposal);
return proposal;
}
protected IScriptCompletionProposal createFieldProposal(
CompletionProposal proposal, CompletionContext context) {
String completion = createCompletionString(proposal, context);
int start = proposal.getReplaceStart();
int length = getLength(proposal);
String label = getLabelProvider().createLabelWithTypeAndDeclaration(
proposal);
Image image = getImage(getLabelProvider().createFieldImageDescriptor(
proposal));
int relevance = computeRelevance(proposal);
// CompletionContext context = getContext();
ScriptCompletionProposal scriptProposal = createScriptCompletionProposal(
completion, start, length, image, label, relevance, /*
* context
* .isInDoc ()
*/false);
if (fScriptProject != null)
scriptProposal.setProposalInfo(new FieldProposalInfo(
fScriptProject, proposal));
scriptProposal.setTriggerCharacters(getVarTrigger());
return scriptProposal;
}
private String createCompletionString(CompletionProposal proposal,
CompletionContext completionContext) {
IMember member = (IMember) proposal.getModelElement();
StringBuffer buffer = new StringBuffer();
if (CodeassistUtils.isStatic(member)) {
buffer.append(CodeassistUtils.getCompletionToken(member,
getSourceModule()));
} else if (!CodeassistUtils.isStatic(member)
&& !completionContext.isInstanceContext()
&& !isNativeObject(member)) {
buffer.append(CodeassistUtils.THIS_STATIC);
}
buffer.append(proposal.getCompletion());
return buffer.toString();
}
private static boolean isNativeObject(IMember member) {
return member.getAncestor(IModelElement.SOURCE_MODULE) instanceof NativeVjoSourceModule;
}
// eBay mod start
// transfer relevance info for proposal;
// eBay mod end
protected int computeRelevance(CompletionProposal proposal) {
int baseRelevance = CodeassistUtils.getRelevance(proposal);
switch (proposal.getKind()) {
case CompletionProposal.LABEL_REF:
return baseRelevance + 0;
case CompletionProposal.KEYWORD:
return baseRelevance + 1;
case CompletionProposal.PACKAGE_REF:
return baseRelevance + 2;
case CompletionProposal.TYPE_REF:
return baseRelevance + 3;
case CompletionProposal.METHOD_REF:
case CompletionProposal.METHOD_NAME_REFERENCE:
case CompletionProposal.METHOD_DECLARATION:
return baseRelevance + 4;
case CompletionProposal.POTENTIAL_METHOD_DECLARATION:
return baseRelevance + 4 /* + 99 */;
case CompletionProposal.FIELD_REF:
return baseRelevance + 5;
case CompletionProposal.LOCAL_VARIABLE_REF:
case CompletionProposal.VARIABLE_DECLARATION:
return baseRelevance + 6;
default:
return baseRelevance;
}
// eBay mod end
}
public String computeReplacementString(
CompletionProposal proposal) {
IModelElement element = proposal.getModelElement();
if (element instanceof JSSourceField) {
JSSourceField method = (JSSourceField)element;
StringBuffer buffer = new StringBuffer();
if (CodeassistUtils.isStatic(method)) {
buffer.append(CodeassistUtils.getCompletionToken(method,
method.getSourceModule()));
} else if (!CodeassistUtils.isStatic(method) && !CompletionContext.isInstanceContext()
&& !isNativeObject(method)) {
buffer.append(CodeassistUtils.THIS_STATIC);
}
return buffer.append(proposal.getCompletion()).toString();
} else {
return String.valueOf(proposal.getCompletion());
}
}
protected IScriptCompletionProposal createFieldProposal(
CompletionProposal proposal) {
String completion = computeReplacementString(proposal);
int start = proposal.getReplaceStart();
int length = getLength(proposal);
String label = getLabelProvider().createLabelWithTypeAndDeclaration(
proposal);
Image image = getImage(getLabelProvider().createFieldImageDescriptor(
proposal));
int relevance = computeRelevance(proposal);
// CompletionContext context = getContext();
ScriptCompletionProposal scriptProposal = createScriptCompletionProposal(
completion, start, length, image, label, relevance, /*
* context
* .isInDoc ()
*/false);
if (fScriptProject != null)
scriptProposal.setProposalInfo(new FieldProposalInfo(
fScriptProject, proposal));
scriptProposal.setTriggerCharacters(getVarTrigger());
return scriptProposal;
}
}