diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ClassKind.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ClassKind.java
new file mode 100644
index 000000000000..fd1c7e0fa75f
--- /dev/null
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ClassKind.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInsight.daemon.impl.quickfix;
+
+/**
+ * Created by Max Medvedev on 28/05/14
+ */
+public interface ClassKind {
+ String getDescription();
+}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassKind.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassKind.java
index 5aa7b63cfb16..1f78bbab94ab 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassKind.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateClassKind.java
@@ -20,7 +20,7 @@ import com.intellij.codeInsight.daemon.QuickFixBundle;
/**
* @author ven
*/
-public enum CreateClassKind {
+public enum CreateClassKind implements ClassKind {
CLASS (QuickFixBundle.message("create.class")),
INTERFACE (QuickFixBundle.message("create.interface")),
ENUM (QuickFixBundle.message("create.enum")),
@@ -32,6 +32,7 @@ public enum CreateClassKind {
myDescription = description;
}
+ @Override
public String getDescription() {
return myDescription;
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java
index e21f032c5d2e..a9a6d60b759a 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java
@@ -17,7 +17,7 @@ package com.intellij.codeInsight.intention.impl;
import com.intellij.CommonBundle;
import com.intellij.codeInsight.CodeInsightBundle;
-import com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind;
+import com.intellij.codeInsight.daemon.impl.quickfix.ClassKind;
import com.intellij.ide.util.PackageUtil;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -88,7 +88,7 @@ public class CreateClassDialog extends DialogWrapper {
@NotNull String title,
@NotNull String targetClassName,
@NotNull String targetPackageName,
- @NotNull CreateClassKind kind,
+ @NotNull ClassKind kind,
boolean classNameEditable,
@Nullable Module defaultModule) {
super(project, true);
diff --git a/plugins/groovy/groovy-psi/gen/icons/JetgroovyIcons.java b/plugins/groovy/groovy-psi/gen/icons/JetgroovyIcons.java
index d540e46e3998..622af34de0fb 100644
--- a/plugins/groovy/groovy-psi/gen/icons/JetgroovyIcons.java
+++ b/plugins/groovy/groovy-psi/gen/icons/JetgroovyIcons.java
@@ -57,6 +57,7 @@ public class JetgroovyIcons {
public static final Icon Interface = load("/icons/groovy/interface.png"); // 16x16
public static final Icon Method = load("/icons/groovy/method.png"); // 16x16
public static final Icon Property = load("/icons/groovy/property.png"); // 16x16
+ public static final Icon Trait = load("/icons/groovy/trait.png"); // 16x16
public static final Icon Variable = load("/icons/groovy/variable.png"); // 16x16
}
diff --git a/plugins/groovy/groovy-psi/resources/fileTemplates/j2ee/GroovyTrait.groovy.ft b/plugins/groovy/groovy-psi/resources/fileTemplates/j2ee/GroovyTrait.groovy.ft
new file mode 100644
index 000000000000..f2d385d675e0
--- /dev/null
+++ b/plugins/groovy/groovy-psi/resources/fileTemplates/j2ee/GroovyTrait.groovy.ft
@@ -0,0 +1,7 @@
+#if (${PACKAGE_NAME} && $PACKAGE_NAME != "" )package ${PACKAGE_NAME}
+#end
+
+#parse("File Header.java")
+public trait ${NAME} {
+
+}
\ No newline at end of file
diff --git a/plugins/groovy/groovy-psi/resources/fileTemplates/j2ee/GroovyTrait.groovy.html b/plugins/groovy/groovy-psi/resources/fileTemplates/j2ee/GroovyTrait.groovy.html
new file mode 100644
index 000000000000..42e0eee678e0
--- /dev/null
+++ b/plugins/groovy/groovy-psi/resources/fileTemplates/j2ee/GroovyTrait.groovy.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ |
+
+ This is a built-in template used each time you create a
+ Groovy trait
+
+ |
+
+
+
+
\ No newline at end of file
diff --git a/plugins/groovy/groovy-psi/resources/icons/groovy/trait.png b/plugins/groovy/groovy-psi/resources/icons/groovy/trait.png
new file mode 100644
index 000000000000..332a16437c69
Binary files /dev/null and b/plugins/groovy/groovy-psi/resources/icons/groovy/trait.png differ
diff --git a/plugins/groovy/groovy-psi/resources/icons/groovy/trait@2x.png b/plugins/groovy/groovy-psi/resources/icons/groovy/trait@2x.png
new file mode 100644
index 000000000000..8f2683c19658
Binary files /dev/null and b/plugins/groovy/groovy-psi/resources/icons/groovy/trait@2x.png differ
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/GroovyQuickFixFactory.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/GroovyQuickFixFactory.java
index 5574cd9f7758..edb0ebb4aff5 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/GroovyQuickFixFactory.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/GroovyQuickFixFactory.java
@@ -15,12 +15,12 @@
*/
package org.jetbrains.plugins.groovy.codeInspection;
-import com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiType;
+import org.jetbrains.plugins.groovy.lang.GrCreateClassKind;
import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
@@ -44,7 +44,7 @@ public abstract class GroovyQuickFixFactory {
public abstract IntentionAction createClassFromNewAction(GrNewExpression parent);
- public abstract IntentionAction createClassFixAction(GrReferenceElement element, CreateClassKind anInterface);
+ public abstract IntentionAction createClassFixAction(GrReferenceElement element, GrCreateClassKind anInterface);
public abstract IntentionAction createCreateFieldFromUsageFix(GrReferenceExpression expr);
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/GrUnresolvedAccessChecker.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/GrUnresolvedAccessChecker.java
index e0c2409dc5cd..1ea9e6becc53 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/GrUnresolvedAccessChecker.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/codeInspection/untypedUnresolvedAccess/GrUnresolvedAccessChecker.java
@@ -19,7 +19,6 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.daemon.HighlightDisplayKey;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
-import com.intellij.codeInsight.daemon.impl.quickfix.CreateClassKind;
import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction;
import com.intellij.codeInsight.intention.EmptyIntentionAction;
import com.intellij.codeInsight.intention.QuickFixFactory;
@@ -41,11 +40,12 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyBundle;
import org.jetbrains.plugins.groovy.annotator.GrHighlightUtil;
-import org.jetbrains.plugins.groovy.annotator.intentions.*;
+import org.jetbrains.plugins.groovy.annotator.intentions.QuickfixUtil;
import org.jetbrains.plugins.groovy.codeInspection.GroovyQuickFixFactory;
import org.jetbrains.plugins.groovy.extensions.GroovyUnresolvedHighlightFilter;
import org.jetbrains.plugins.groovy.findUsages.MissingMethodAndPropertyUtil;
import org.jetbrains.plugins.groovy.highlighter.DefaultHighlighter;
+import org.jetbrains.plugins.groovy.lang.GrCreateClassKind;
import org.jetbrains.plugins.groovy.lang.groovydoc.psi.api.GroovyDocPsiElement;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement;
@@ -534,26 +534,26 @@ public class GrUnresolvedAccessChecker {
else if (canBeClassOrPackage(refElement)) {
if (shouldBeInterface(refElement)) {
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.INTERFACE), key);
+ GrCreateClassKind.INTERFACE), key);
}
else if (shouldBeClass(refElement)) {
- QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement, CreateClassKind.CLASS), key);
+ QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement, GrCreateClassKind.CLASS), key);
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.ENUM), key);
+ GrCreateClassKind.ENUM), key);
}
else if (shouldBeAnnotation(refElement)) {
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.ANNOTATION), key);
+ GrCreateClassKind.ANNOTATION), key);
}
else {
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.CLASS), key);
+ GrCreateClassKind.CLASS), key);
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.INTERFACE), key);
+ GrCreateClassKind.INTERFACE), key);
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.ENUM), key);
+ GrCreateClassKind.ENUM), key);
QuickFixAction.registerQuickFixAction(info, GroovyQuickFixFactory.getInstance().createClassFixAction(refElement,
- CreateClassKind.ANNOTATION), key);
+ GrCreateClassKind.ANNOTATION), key);
}
}
}
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GrCreateClassKind.groovy b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GrCreateClassKind.groovy
new file mode 100644
index 000000000000..87285024e237
--- /dev/null
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GrCreateClassKind.groovy
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.groovy.lang
+
+import com.intellij.codeInsight.daemon.impl.quickfix.ClassKind
+
+/**
+ * Created by Max Medvedev on 28/05/14
+ */
+enum GrCreateClassKind implements ClassKind {
+ CLASS ("class"),
+ INTERFACE ("interface"),
+ TRAIT ("trait"),
+ ENUM ("enum"),
+ ANNOTATION("annotation");
+
+ private final String myDescription;
+
+ public GrCreateClassKind(final String description) {
+ myDescription = description;
+ }
+
+ public String getDescription() {
+ return myDescription;
+ }
+}
diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java
index bc52bd696eb9..b54b7a8e78f8 100644
--- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java
+++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionImpl.java
@@ -68,8 +68,8 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyFileImpl;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.stubs.GrTypeDefinitionStub;
import org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil;
-import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyRunnerPsiUtil;
+import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import javax.swing.*;
import java.util.ArrayList;
@@ -644,6 +644,8 @@ public abstract class GrTypeDefinitionImpl extends GrStubElementBase