blob: 3936b22bf89d46fb47ac89980fef4fc334c3d507 [file] [log] [blame]
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.codeInsight.lookup.TypedLookupItem;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.impl.TemplateImpl;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiExpression;
import com.intellij.psi.PsiType;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
/**
* @author peter
*/
public class SmartCompletionTemplateItem extends LookupItem<Template> implements TypedLookupItem {
@NonNls private static final String PLACEHOLDER = "xxx";
private final PsiElement myContext;
public SmartCompletionTemplateItem(Template o, PsiElement context) {
super(o, o.getKey());
myContext = context;
}
@Override
public PsiType getType() {
final Template template = getObject();
String text = template.getTemplateText();
StringBuilder resultingText = new StringBuilder(text);
int segmentsCount = template.getSegmentsCount();
for (int j = segmentsCount - 1; j >= 0; j--) {
if (template.getSegmentName(j).equals(TemplateImpl.END)) {
continue;
}
int segmentOffset = template.getSegmentOffset(j);
resultingText.insert(segmentOffset, PLACEHOLDER);
}
try {
final PsiExpression templateExpression = JavaPsiFacade.getElementFactory(myContext.getProject()).createExpressionFromText(resultingText.toString(), myContext);
return templateExpression.getType();
}
catch (IncorrectOperationException e) { // can happen when text of the template does not form an expression
return null;
}
}
}