Added completion in 'anonymous' live template.
This commit is contained in:
@@ -119,7 +119,7 @@
|
||||
</template>
|
||||
<template resource-bundle="org.jetbrains.jet.plugin.JetBundle" key="livetemplate.description.anonymous"
|
||||
name="anonymous" toReformat="true" toShortenFQNames="true" value="object : $SUPERTYPE$ { $END$ }">
|
||||
<variable alwaysStopAt="true" defaultValue="" expression="" name="SUPERTYPE" />
|
||||
<variable alwaysStopAt="true" defaultValue=""Object"" expression="anonymousSuper()" name="SUPERTYPE" />
|
||||
<context>
|
||||
<option name="KOTLIN_STATEMENT" value="true"/>
|
||||
<option name="KOTLIN_EXPRESSION" value="true"/>
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
<defaultLiveTemplatesProvider implementation="org.jetbrains.jet.plugin.liveTemplates.JetLiveTemplatesProvider"/>
|
||||
<liveTemplateMacro implementation="org.jetbrains.jet.plugin.liveTemplates.macro.JetVariableOfTypeMacro"/>
|
||||
<liveTemplateMacro implementation="org.jetbrains.jet.plugin.liveTemplates.macro.JetFunctionParametersMacro"/>
|
||||
<liveTemplateMacro implementation="org.jetbrains.jet.plugin.liveTemplates.macro.JetAnonymousSuperMacro"/>
|
||||
|
||||
<annotator language="jet" implementationClass="org.jetbrains.jet.plugin.annotations.SoftKeywordsAnnotator"/>
|
||||
<annotator language="jet" implementationClass="org.jetbrains.jet.plugin.annotations.LabelsAnnotator"/>
|
||||
|
||||
@@ -41,4 +41,5 @@ livetemplate.description.exfun=Extension function
|
||||
livetemplate.description.exval=Extension read-only property
|
||||
livetemplate.description.exvar=Extension read-write property
|
||||
macro.variable.of.type=kotlinVariableOfType(Type)
|
||||
macro.fun.parameters=functionParameters()
|
||||
macro.fun.parameters=functionParameters()
|
||||
macro.fun.anonymousSuper=anonymousSuper()
|
||||
@@ -0,0 +1,94 @@
|
||||
package org.jetbrains.jet.plugin.liveTemplates.macro;
|
||||
|
||||
import com.intellij.codeInsight.lookup.LookupElement;
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder;
|
||||
import com.intellij.codeInsight.template.Expression;
|
||||
import com.intellij.codeInsight.template.ExpressionContext;
|
||||
import com.intellij.codeInsight.template.Macro;
|
||||
import com.intellij.codeInsight.template.Result;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.PsiDocumentManager;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.jet.lang.psi.JetFile;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||
import org.jetbrains.jet.plugin.JetBundle;
|
||||
import org.jetbrains.jet.plugin.compiler.WholeProjectAnalyzerFacade;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author Evgeny Gerashchenko
|
||||
* @since 2/2/12
|
||||
*/
|
||||
public class JetAnonymousSuperMacro extends Macro {
|
||||
@Override
|
||||
public String getName() {
|
||||
return "anonymousSuper";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPresentableName() {
|
||||
return JetBundle.message("macro.fun.anonymousSuper");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result calculateResult(@NotNull Expression[] params, ExpressionContext context) {
|
||||
final PsiNamedElement[] vars = getSupertypes(params, context);
|
||||
if (vars == null || vars.length == 0) return null;
|
||||
return new JetPsiElementResult(vars[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LookupElement[] calculateLookupItems(@NotNull Expression[] params, ExpressionContext context) {
|
||||
final PsiNamedElement[] vars = getSupertypes(params, context);
|
||||
if (vars == null || vars.length < 2) return null;
|
||||
final Set<LookupElement> set = new LinkedHashSet<LookupElement>();
|
||||
for (PsiNamedElement var : vars) {
|
||||
set.add(LookupElementBuilder.create(var));
|
||||
}
|
||||
return set.toArray(new LookupElement[set.size()]);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiNamedElement[] getSupertypes(Expression[] params, ExpressionContext context) {
|
||||
if (params.length != 0) return null;
|
||||
|
||||
Project project = context.getProject();
|
||||
PsiDocumentManager.getInstance(project).commitAllDocuments();
|
||||
|
||||
PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument());
|
||||
if (!(psiFile instanceof JetFile)) return null;
|
||||
|
||||
BindingContext bc = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile((JetFile) psiFile);
|
||||
JetExpression expression = PsiTreeUtil.getParentOfType(psiFile.findElementAt(context.getStartOffset()), JetExpression.class);
|
||||
JetScope scope = bc.get(BindingContext.RESOLUTION_SCOPE, expression);
|
||||
if (scope == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<PsiNamedElement> result = new ArrayList<PsiNamedElement>();
|
||||
|
||||
for (DeclarationDescriptor descriptor : scope.getAllDescriptors()) {
|
||||
if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getModality().isOverridable()) {
|
||||
PsiElement declaration = bc.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
|
||||
if (declaration != null) {
|
||||
result.add((PsiNamedElement) declaration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result.toArray(new PsiNamedElement[result.size()]);
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
package org.jetbrains.jet.plugin.liveTemplates.macro;
|
||||
|
||||
import com.intellij.codeInsight.template.PsiElementResult;
|
||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration;
|
||||
import com.intellij.codeInsight.template.JavaPsiElementResult;
|
||||
import com.intellij.psi.PsiNamedElement;
|
||||
|
||||
/**
|
||||
* @author Evgeny Gerashchenko
|
||||
* @since 1/30/12
|
||||
*/
|
||||
public class JetPsiElementResult extends PsiElementResult {
|
||||
public JetPsiElementResult(JetNamedDeclaration element) {
|
||||
public class JetPsiElementResult extends JavaPsiElementResult {
|
||||
public JetPsiElementResult(PsiNamedElement element) {
|
||||
super(element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ((JetNamedDeclaration) getElement()).getName();
|
||||
return ((PsiNamedElement) getElement()).getName();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user