Minor cleanup +
JET-32 Display left bar icons for classes, properties and namespaces
This commit is contained in:
@@ -19,10 +19,8 @@ import com.intellij.util.Function;
|
|||||||
import com.intellij.util.Icons;
|
import com.intellij.util.Icons;
|
||||||
import com.intellij.util.PsiNavigateUtil;
|
import com.intellij.util.PsiNavigateUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetFunction;
|
|
||||||
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
|
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.resolve.DescriptorRenderer;
|
import org.jetbrains.jet.resolve.DescriptorRenderer;
|
||||||
@@ -42,12 +40,53 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LineMarkerInfo getLineMarkerInfo(PsiElement element) {
|
public LineMarkerInfo getLineMarkerInfo(PsiElement element) {
|
||||||
|
JetFile file = PsiTreeUtil.getParentOfType(element, JetFile.class);
|
||||||
|
|
||||||
|
if (file == null) return null;
|
||||||
|
final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
|
||||||
|
|
||||||
|
if (element instanceof JetClass) {
|
||||||
|
JetClass jetClass = (JetClass) element;
|
||||||
|
return new LineMarkerInfo<JetClass>(jetClass, jetClass.getTextOffset(), Icons.CLASS_ICON, Pass.UPDATE_ALL,
|
||||||
|
new Function<JetClass, String>() {
|
||||||
|
@Override
|
||||||
|
public String fun(JetClass jetClass) {
|
||||||
|
ClassDescriptor classDescriptor = bindingContext.getClassDescriptor(jetClass);
|
||||||
|
if (classDescriptor == null) {
|
||||||
|
return "<it>Unresolved</it>";
|
||||||
|
}
|
||||||
|
return DescriptorRenderer.HTML.render(classDescriptor);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new GutterIconNavigationHandler<JetClass>() {
|
||||||
|
@Override
|
||||||
|
public void navigate(MouseEvent e, JetClass elt) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element instanceof JetProperty) {
|
||||||
|
JetProperty jetProperty = (JetProperty) element;
|
||||||
|
final VariableDescriptor variableDescriptor = bindingContext.getVariableDescriptor(jetProperty);
|
||||||
|
if (variableDescriptor instanceof PropertyDescriptor) {
|
||||||
|
return new LineMarkerInfo<JetProperty>(jetProperty, jetProperty.getTextOffset(), Icons.PROPERTY_ICON, Pass.UPDATE_ALL,
|
||||||
|
new Function<JetProperty, String>() {
|
||||||
|
@Override
|
||||||
|
public String fun(JetProperty property) {
|
||||||
|
return DescriptorRenderer.HTML.render(variableDescriptor);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new GutterIconNavigationHandler<JetProperty>() {
|
||||||
|
@Override
|
||||||
|
public void navigate(MouseEvent e, JetProperty elt) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (element instanceof JetFunction) {
|
if (element instanceof JetFunction) {
|
||||||
JetFunction jetFunction = (JetFunction) element;
|
JetFunction jetFunction = (JetFunction) element;
|
||||||
|
|
||||||
JetFile file = PsiTreeUtil.getParentOfType(element, JetFile.class);
|
|
||||||
assert file != null;
|
|
||||||
final BindingContext bindingContext = AnalyzingUtils.analyzeFileWithCache(file);
|
|
||||||
final FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(jetFunction);
|
final FunctionDescriptor functionDescriptor = bindingContext.getFunctionDescriptor(jetFunction);
|
||||||
if (functionDescriptor == null) return null;
|
if (functionDescriptor == null) return null;
|
||||||
final Set<? extends FunctionDescriptor> overriddenFunctions = functionDescriptor.getOverriddenFunctions();
|
final Set<? extends FunctionDescriptor> overriddenFunctions = functionDescriptor.getOverriddenFunctions();
|
||||||
@@ -77,6 +116,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
|
|||||||
new GutterIconNavigationHandler<JetFunction>() {
|
new GutterIconNavigationHandler<JetFunction>() {
|
||||||
@Override
|
@Override
|
||||||
public void navigate(MouseEvent event, JetFunction elt) {
|
public void navigate(MouseEvent event, JetFunction elt) {
|
||||||
|
if (overriddenFunctions.isEmpty()) return;
|
||||||
final List<PsiElement> list = Lists.newArrayList();
|
final List<PsiElement> list = Lists.newArrayList();
|
||||||
for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
|
for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
|
||||||
PsiElement declarationPsiElement = bindingContext.getDeclarationPsiElement(overriddenFunction);
|
PsiElement declarationPsiElement = bindingContext.getDeclarationPsiElement(overriddenFunction);
|
||||||
@@ -113,6 +153,25 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element instanceof JetNamespace) {
|
||||||
|
JetNamespace jetNamespace = (JetNamespace) element;
|
||||||
|
return new LineMarkerInfo<JetNamespace>(
|
||||||
|
jetNamespace, jetNamespace.getTextOffset(), Icons.PACKAGE_ICON, Pass.UPDATE_ALL,
|
||||||
|
new Function<JetNamespace, String>() {
|
||||||
|
@Override
|
||||||
|
public String fun(JetNamespace jetNamespace) {
|
||||||
|
NamespaceDescriptor namespaceDescriptor = bindingContext.getNamespaceDescriptor(jetNamespace);
|
||||||
|
return DescriptorRenderer.HTML.render(namespaceDescriptor);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new GutterIconNavigationHandler<JetNamespace>() {
|
||||||
|
@Override
|
||||||
|
public void navigate(MouseEvent e, JetNamespace elt) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -84,10 +84,10 @@ public class TopDownAnalyzer {
|
|||||||
resolveTypesInClassHeaders(); // Generic bounds and types in supertype lists (no expressions or constructor resolution)
|
resolveTypesInClassHeaders(); // Generic bounds and types in supertype lists (no expressions or constructor resolution)
|
||||||
checkGenericBoundsInClassHeaders(); // For the types resolved so far
|
checkGenericBoundsInClassHeaders(); // For the types resolved so far
|
||||||
|
|
||||||
resolveFunctionAndPropertyHeaders(declarations); // TODO : for now, fail fast if something is unknown yet (i.e. some type annotation is omitted)
|
resolveFunctionAndPropertyHeaders(declarations); // Constructor headers are resolved as well
|
||||||
// Constructor headers are resolved as well
|
|
||||||
|
|
||||||
resolveExecutableCode();
|
readyToProcessExpressions = true;
|
||||||
|
resolveBehaviorDeclarationBodies();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void collectNamespacesAndClassifiers(
|
private void collectNamespacesAndClassifiers(
|
||||||
@@ -252,11 +252,6 @@ public class TopDownAnalyzer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resolveExecutableCode() {
|
|
||||||
readyToProcessExpressions = true;
|
|
||||||
resolveBehaviorDeclarationBodies();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processPrimaryConstructor(MutableClassDescriptor classDescriptor, JetClass klass) {
|
private void processPrimaryConstructor(MutableClassDescriptor classDescriptor, JetClass klass) {
|
||||||
if (!klass.hasPrimaryConstructor()) return;
|
if (!klass.hasPrimaryConstructor()) return;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user