diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 3e306817c2d..594bc409ffc 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -22,11 +22,13 @@
+
+
diff --git a/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java b/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java
index 5be16bb37b4..054f879210c 100644
--- a/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java
+++ b/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java
@@ -11,19 +11,20 @@ import com.intellij.ide.util.DefaultPsiElementCellRenderer;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.IconLoader;
+import com.intellij.openapi.util.Iconable;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.Function;
import com.intellij.util.Icons;
+import com.intellij.util.PsiIconUtil;
import com.intellij.util.PsiNavigateUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext;
-import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.resolve.DescriptorRenderer;
import javax.swing.*;
@@ -38,7 +39,6 @@ import java.util.Set;
public class JetLineMarkerProvider implements LineMarkerProvider {
public static final Icon OVERRIDING_FUNCTION = IconLoader.getIcon("/general/overridingMethod.png");
- public static final Icon ICON_FOR_OBJECT = Icons.ANONYMOUS_CLASS_ICON;
@Override
public LineMarkerInfo getLineMarkerInfo(PsiElement element) {
@@ -49,47 +49,16 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
if (element instanceof JetClass) {
JetClass jetClass = (JetClass) element;
- Icon icon = jetClass.hasModifier(JetTokens.ENUM_KEYWORD) ? Icons.ENUM_ICON : Icons.CLASS_ICON;
- if (jetClass instanceof JetEnumEntry) {
- JetEnumEntry enumEntry = (JetEnumEntry) jetClass;
- if (enumEntry.getPrimaryConstructorParameterList() == null) {
- icon = ICON_FOR_OBJECT;
- }
- }
- return new LineMarkerInfo(jetClass, jetClass.getTextOffset(), icon, Pass.UPDATE_ALL,
- new Function() {
- @Override
- public String fun(JetClass jetClass) {
- ClassDescriptor classDescriptor = bindingContext.getClassDescriptor(jetClass);
- if (classDescriptor == null) {
- return "Unresolved";
- }
- return DescriptorRenderer.HTML.render(classDescriptor);
- }
- },
- new GutterIconNavigationHandler() {
- @Override
- public void navigate(MouseEvent e, JetClass elt) {
- }
- });
+ ClassDescriptor classDescriptor = bindingContext.getClassDescriptor(jetClass);
+ String text = classDescriptor == null ? "Unresolved" : DescriptorRenderer.HTML.render(classDescriptor);
+ return createLineMarkerInfo(jetClass, text);
}
if (element instanceof JetProperty) {
JetProperty jetProperty = (JetProperty) element;
final VariableDescriptor variableDescriptor = bindingContext.getVariableDescriptor(jetProperty);
if (variableDescriptor instanceof PropertyDescriptor) {
- return new LineMarkerInfo(jetProperty, jetProperty.getTextOffset(), Icons.PROPERTY_ICON, Pass.UPDATE_ALL,
- new Function() {
- @Override
- public String fun(JetProperty property) {
- return DescriptorRenderer.HTML.render(variableDescriptor);
- }
- },
- new GutterIconNavigationHandler() {
- @Override
- public void navigate(MouseEvent e, JetProperty elt) {
- }
- });
+ return createLineMarkerInfo(element, DescriptorRenderer.HTML.render(variableDescriptor));
}
}
@@ -164,22 +133,8 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
}
if (element instanceof JetNamespace) {
- JetNamespace jetNamespace = (JetNamespace) element;
- return new LineMarkerInfo(
- jetNamespace, jetNamespace.getTextOffset(), Icons.PACKAGE_ICON, Pass.UPDATE_ALL,
- new Function() {
- @Override
- public String fun(JetNamespace jetNamespace) {
- NamespaceDescriptor namespaceDescriptor = bindingContext.getNamespaceDescriptor(jetNamespace);
- return DescriptorRenderer.HTML.render(namespaceDescriptor);
- }
- },
- new GutterIconNavigationHandler() {
- @Override
- public void navigate(MouseEvent e, JetNamespace elt) {
- }
- }
- );
+ return createLineMarkerInfo((JetNamespace) element,
+ DescriptorRenderer.HTML.render(bindingContext.getNamespaceDescriptor((JetNamespace) element)));
}
if (element instanceof JetObjectDeclaration && !(element.getParent() instanceof JetExpression)) {
@@ -208,6 +163,23 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
return null;
}
+ private LineMarkerInfo createLineMarkerInfo(T element, final String text) {
+ return new LineMarkerInfo(
+ element, element.getTextOffset(), PsiIconUtil.getProvidersIcon(element, Iconable.ICON_FLAG_CLOSED), Pass.UPDATE_ALL,
+ new Function() {
+ @Override
+ public String fun(T jetNamespace) {
+ return text;
+ }
+ },
+ new GutterIconNavigationHandler() {
+ @Override
+ public void navigate(MouseEvent e, T elt) {
+ }
+ }
+ );
+ }
+
private boolean isMember(@NotNull FunctionDescriptor functionDescriptor) {
return functionDescriptor.getContainingDeclaration().getOriginal() instanceof ClassifierDescriptor;
}
diff --git a/idea/src/org/jetbrains/jet/plugin/JetIconProvider.java b/idea/src/org/jetbrains/jet/plugin/JetIconProvider.java
new file mode 100644
index 00000000000..23b24a0eb36
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/plugin/JetIconProvider.java
@@ -0,0 +1,55 @@
+package org.jetbrains.jet.plugin;
+
+import com.intellij.ide.IconProvider;
+import com.intellij.openapi.util.Iconable;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.util.Icons;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.jet.lexer.JetTokens;
+
+import javax.swing.*;
+
+/**
+ * @author yole
+ */
+public class JetIconProvider extends IconProvider {
+ public static final Icon ICON_FOR_OBJECT = Icons.ANONYMOUS_CLASS_ICON;
+
+ @Override
+ public Icon getIcon(@NotNull PsiElement psiElement, int flags) {
+ if (psiElement instanceof JetNamespace) {
+ return (flags & Iconable.ICON_FLAG_OPEN) != 0 ? Icons.PACKAGE_OPEN_ICON : Icons.PACKAGE_ICON;
+ }
+ if (psiElement instanceof JetFunction) {
+ return PsiTreeUtil.getParentOfType(psiElement, JetNamedDeclaration.class) instanceof JetClass
+ ? Icons.METHOD_ICON
+ : Icons.FUNCTION_ICON;
+ }
+ if (psiElement instanceof JetClass) {
+ JetClass jetClass = (JetClass) psiElement;
+ Icon icon = jetClass.hasModifier(JetTokens.ENUM_KEYWORD) ? Icons.ENUM_ICON : Icons.CLASS_ICON;
+ if (jetClass instanceof JetEnumEntry) {
+ JetEnumEntry enumEntry = (JetEnumEntry) jetClass;
+ if (enumEntry.getPrimaryConstructorParameterList() == null) {
+ icon = ICON_FOR_OBJECT;
+ }
+ }
+ return icon;
+ }
+ if (psiElement instanceof JetParameter) {
+ if (((JetParameter) psiElement).getValOrVarNode() != null) {
+ JetParameterList parameterList = PsiTreeUtil.getParentOfType(psiElement, JetParameterList.class);
+ if (parameterList != null && parameterList.getParent() instanceof JetClass) {
+ return Icons.PROPERTY_ICON;
+ }
+ }
+ return Icons.PARAMETER_ICON;
+ }
+ if (psiElement instanceof JetProperty) {
+ return Icons.PROPERTY_ICON;
+ }
+ return null;
+ }
+}
diff --git a/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewElement.java b/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewElement.java
index 95dc436c654..8a8d8e3b8d8 100644
--- a/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewElement.java
+++ b/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewElement.java
@@ -5,9 +5,14 @@ import com.intellij.ide.util.treeView.smartTree.TreeElement;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.util.Iconable;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.NavigatablePsiElement;
+import com.intellij.util.PsiIconUtil;
+import org.jetbrains.jet.lang.psi.*;
import javax.swing.*;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author yole
@@ -44,7 +49,13 @@ public class JetStructureViewElement implements StructureViewTreeElement {
return new ItemPresentation() {
@Override
public String getPresentableText() {
- return "";
+ String name = myElement.getName();
+ if (StringUtil.isEmpty(name)) {
+ if (myElement instanceof JetClassInitializer) {
+ return "";
+ }
+ }
+ return name;
}
@Override
@@ -54,7 +65,7 @@ public class JetStructureViewElement implements StructureViewTreeElement {
@Override
public Icon getIcon(boolean open) {
- return myElement.getIcon(open ? Iconable.ICON_FLAG_OPEN : Iconable.ICON_FLAG_CLOSED);
+ return PsiIconUtil.getProvidersIcon(myElement, open ? Iconable.ICON_FLAG_OPEN : Iconable.ICON_FLAG_CLOSED);
}
@Override
@@ -66,6 +77,36 @@ public class JetStructureViewElement implements StructureViewTreeElement {
@Override
public TreeElement[] getChildren() {
- return new TreeElement[0]; //To change body of implemented methods use File | Settings | File Templates.
+ if (myElement instanceof JetFile) {
+ JetNamespace rootNamespace = ((JetFile) myElement).getRootNamespace();
+ return new TreeElement[] { new JetStructureViewElement((rootNamespace)) };
+ }
+ else if (myElement instanceof JetNamespace) {
+ return wrapDeclarations(((JetNamespace) myElement).getDeclarations());
+ }
+ else if (myElement instanceof JetClass) {
+ JetClass jetClass = (JetClass) myElement;
+ List declarations = new ArrayList();
+ for (JetParameter parameter : jetClass.getPrimaryConstructorParameters()) {
+ if (parameter.getValOrVarNode() != null) {
+ declarations.add(parameter);
+ }
+ }
+ declarations.addAll(jetClass.getDeclarations());
+ return wrapDeclarations(declarations);
+
+ }
+ else if (myElement instanceof JetClassOrObject) {
+ return wrapDeclarations(((JetClassOrObject) myElement).getDeclarations());
+ }
+ return new TreeElement[0];
+ }
+
+ private static TreeElement[] wrapDeclarations(List declarations) {
+ TreeElement[] result = new TreeElement[declarations.size()];
+ for (int i = 0; i < declarations.size(); i++) {
+ result[i] = new JetStructureViewElement(declarations.get(i));
+ }
+ return result;
}
}
diff --git a/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewModel.java b/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewModel.java
index 3138e437d72..6a1f5167d35 100644
--- a/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewModel.java
+++ b/idea/src/org/jetbrains/jet/plugin/structureView/JetStructureViewModel.java
@@ -1,9 +1,9 @@
package org.jetbrains.jet.plugin.structureView;
import com.intellij.ide.structureView.StructureViewModelBase;
-import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.JetDeclaration;
/**
* @author yole
@@ -11,5 +11,6 @@ import org.jetbrains.annotations.NotNull;
public class JetStructureViewModel extends StructureViewModelBase {
public JetStructureViewModel(@NotNull PsiFile psiFile) {
super(psiFile, new JetStructureViewElement(psiFile));
+ withSuitableClasses(JetDeclaration.class);
}
}