Made fm live template available only on top level.

This commit is contained in:
Evgeny Gerashchenko
2012-01-30 15:36:39 +04:00
parent 31929c59ad
commit 150d856ff1
3 changed files with 55 additions and 6 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
<template resource-bundle="org.jetbrains.jet.plugin.JetBundle" key="livetemplate.description.fm"
name="fm" toReformat="true" toShortenFQNames="true" value="fun main(args : Array&lt;String&gt;) {&#10; $END$&#10;}">
<context>
<option name="KOTLIN" value="true" />
<option name="KOTLIN_NAMESPACE" value="true" />
</context>
</template>
<template resource-bundle="org.jetbrains.jet.plugin.JetBundle" key="livetemplate.description.sout"
+2 -1
View File
@@ -65,7 +65,8 @@
<completion.contributor language="jet" implementationClass="org.jetbrains.jet.plugin.completion.JetKeywordCompletionContributor"/>
<completion.contributor language="jet" implementationClass="org.jetbrains.jet.plugin.completion.JetCompletionContributor"/>
<liveTemplateContext implementation="org.jetbrains.jet.plugin.liveTemplates.JetTemplateContextType"/>
<liveTemplateContext implementation="org.jetbrains.jet.plugin.liveTemplates.JetTemplateContextType$Generic"/>
<liveTemplateContext implementation="org.jetbrains.jet.plugin.liveTemplates.JetTemplateContextType$Namespace"/>
<defaultLiveTemplatesProvider implementation="org.jetbrains.jet.plugin.liveTemplates.JetLiveTemplatesProvider"/>
<annotator language="jet" implementationClass="org.jetbrains.jet.plugin.annotations.SoftKeywordsAnnotator"/>
@@ -2,22 +2,70 @@ package org.jetbrains.jet.plugin.liveTemplates;
import com.intellij.codeInsight.template.EverywhereContextType;
import com.intellij.codeInsight.template.TemplateContextType;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiUtilBase;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.plugin.JetLanguage;
/**
* @author Evgeny Gerashchenko
* @since 1/27/12
*/
public class JetTemplateContextType extends TemplateContextType {
public JetTemplateContextType() {
super("KOTLIN", "Kotlin", EverywhereContextType.class);
public abstract class JetTemplateContextType extends TemplateContextType {
protected JetTemplateContextType(@NotNull @NonNls String id, @NotNull String presentableName, @Nullable Class<? extends TemplateContextType> baseContextType) {
super(id, presentableName, baseContextType);
}
@Override
public boolean isInContext(@NotNull PsiFile file, int offset) {
return PsiUtilBase.getLanguageAtOffset(file, offset).isKindOf(JetLanguage.INSTANCE);
if (PsiUtilBase.getLanguageAtOffset(file, offset).isKindOf(JetLanguage.INSTANCE)) {
PsiElement element = file.findElementAt(offset);
if (element instanceof PsiWhiteSpace) {
}
return element != null && isInContext(element);
}
return false;
}
protected abstract boolean isInContext(@NotNull PsiElement element);
public static class Generic extends JetTemplateContextType {
public Generic() {
super("KOTLIN", "Kotlin", EverywhereContextType.class);
}
@Override
protected boolean isInContext(@NotNull PsiElement element) {
return true;
}
}
public static class Namespace extends JetTemplateContextType {
public Namespace() {
super("KOTLIN_NAMESPACE", "Namespace", Generic.class);
}
@Override
protected boolean isInContext(@NotNull PsiElement element) {
PsiElement e = element;
while (e != null) {
if (e instanceof JetProperty || e instanceof JetNamedFunction
|| e instanceof JetClassOrObject) {
return false;
}
e = e.getParent();
}
return true;
}
}
}