diff --git a/idea/resources/liveTemplates/Kotlin.xml b/idea/resources/liveTemplates/Kotlin.xml
index 5c4a7de2eae..3190c245641 100644
--- a/idea/resources/liveTemplates/Kotlin.xml
+++ b/idea/resources/liveTemplates/Kotlin.xml
@@ -3,7 +3,7 @@
-
+
-
+
+
diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java
index c77621d55c9..fb553aa7f87 100644
--- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java
+++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetTemplateContextType.java
@@ -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;
+ }
}
}