Index object declarations as inheritors
This commit is contained in:
@@ -218,50 +218,6 @@ public class JetClass extends JetTypeParameterListOwnerStub<PsiJetClassStub> imp
|
|||||||
return StringUtil.join(parts, ".");
|
return StringUtil.join(parts, ".");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the list of unqualified names that are indexed as the superclass names of this class. For the names that might be imported
|
|
||||||
* via an aliased import, includes both the original and the aliased name (reference resolution during inheritor search will sort this out).
|
|
||||||
*
|
|
||||||
* @return the list of possible superclass names
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
public List<String> getSuperNames() {
|
|
||||||
PsiJetClassStub stub = getStub();
|
|
||||||
if (stub != null) {
|
|
||||||
return stub.getSuperNames();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<JetDelegationSpecifier> specifiers = getDelegationSpecifiers();
|
|
||||||
if (specifiers.size() == 0) return Collections.emptyList();
|
|
||||||
List<String> result = new ArrayList<String>();
|
|
||||||
for (JetDelegationSpecifier specifier : specifiers) {
|
|
||||||
JetUserType superType = specifier.getTypeAsUserType();
|
|
||||||
if (superType != null) {
|
|
||||||
String referencedName = superType.getReferencedName();
|
|
||||||
if (referencedName != null) {
|
|
||||||
addSuperName(result, referencedName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addSuperName(List<String> result, String referencedName) {
|
|
||||||
result.add(referencedName);
|
|
||||||
if (getContainingFile() instanceof JetFile) {
|
|
||||||
JetImportDirective directive = ((JetFile) getContainingFile()).findImportByAlias(referencedName);
|
|
||||||
if (directive != null) {
|
|
||||||
JetExpression reference = directive.getImportedReference();
|
|
||||||
while (reference instanceof JetDotQualifiedExpression) {
|
|
||||||
reference = ((JetDotQualifiedExpression) reference).getSelectorExpression();
|
|
||||||
}
|
|
||||||
if (reference instanceof JetSimpleNameExpression) {
|
|
||||||
result.add(((JetSimpleNameExpression) reference).getReferencedName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemPresentation getPresentation() {
|
public ItemPresentation getPresentation() {
|
||||||
return ItemPresentationProviders.getItemPresentation(this);
|
return ItemPresentationProviders.getItemPresentation(this);
|
||||||
|
|||||||
@@ -23,10 +23,18 @@ import org.jetbrains.jet.lang.psi.JetDeclaration
|
|||||||
import org.jetbrains.jet.lang.psi.JetClass
|
import org.jetbrains.jet.lang.psi.JetClass
|
||||||
import org.jetbrains.jet.lang.psi.JetClassOrObject
|
import org.jetbrains.jet.lang.psi.JetClassOrObject
|
||||||
import org.jetbrains.jet.lexer.JetTokens
|
import org.jetbrains.jet.lexer.JetTokens
|
||||||
|
import java.util.Collections
|
||||||
|
import com.intellij.extapi.psi.StubBasedPsiElementBase
|
||||||
|
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassOrObjectStub
|
||||||
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
|
||||||
|
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
|
||||||
|
import java.util.ArrayList
|
||||||
import org.jetbrains.jet.lang.psi.JetElement
|
import org.jetbrains.jet.lang.psi.JetElement
|
||||||
import org.jetbrains.jet.lang.psi.JetBlockExpression
|
import org.jetbrains.jet.lang.psi.JetBlockExpression
|
||||||
import org.jetbrains.jet.lang.psi.JetPsiUtil
|
import org.jetbrains.jet.lang.psi.JetPsiUtil
|
||||||
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
fun PsiElement.getParentByTypeAndPredicate<T: PsiElement>(
|
fun PsiElement.getParentByTypeAndPredicate<T: PsiElement>(
|
||||||
parentClass : Class<T>, strict : Boolean = false, predicate: (T) -> Boolean
|
parentClass : Class<T>, strict : Boolean = false, predicate: (T) -> Boolean
|
||||||
@@ -91,4 +99,52 @@ fun JetElement.wrapInBlock(): JetBlockExpression {
|
|||||||
val block = JetPsiFactory.createEmptyBody(getProject()) as JetBlockExpression
|
val block = JetPsiFactory.createEmptyBody(getProject()) as JetBlockExpression
|
||||||
block.appendElement(this)
|
block.appendElement(this)
|
||||||
return block
|
return block
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the list of unqualified names that are indexed as the superclass names of this class. For the names that might be imported
|
||||||
|
* via an aliased import, includes both the original and the aliased name (reference resolution during inheritor search will sort this out).
|
||||||
|
*
|
||||||
|
* @return the list of possible superclass names
|
||||||
|
*/
|
||||||
|
fun <T: JetClassOrObject> StubBasedPsiElementBase<out PsiJetClassOrObjectStub<T>>.getSuperNames(): List<String> {
|
||||||
|
fun addSuperName(result: MutableList<String>, referencedName: String): Unit {
|
||||||
|
result.add(referencedName)
|
||||||
|
|
||||||
|
val file = getContainingFile()
|
||||||
|
if (file is JetFile) {
|
||||||
|
val directive = file.findImportByAlias(referencedName)
|
||||||
|
if (directive != null) {
|
||||||
|
var reference = directive.getImportedReference()
|
||||||
|
while (reference is JetDotQualifiedExpression) {
|
||||||
|
reference = (reference as JetDotQualifiedExpression).getSelectorExpression()
|
||||||
|
}
|
||||||
|
if (reference is JetSimpleNameExpression) {
|
||||||
|
result.add((reference as JetSimpleNameExpression).getReferencedName())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue(this is JetClassOrObject)
|
||||||
|
|
||||||
|
val stub = getStub()
|
||||||
|
if (stub != null) {
|
||||||
|
return stub.getSuperNames()
|
||||||
|
}
|
||||||
|
|
||||||
|
val specifiers = (this as JetClassOrObject).getDelegationSpecifiers()
|
||||||
|
if (specifiers.isEmpty()) return Collections.emptyList<String>()
|
||||||
|
|
||||||
|
val result = ArrayList<String>()
|
||||||
|
for (specifier in specifiers) {
|
||||||
|
val superType = specifier.getTypeAsUserType()
|
||||||
|
if (superType != null) {
|
||||||
|
val referencedName = superType.getReferencedName()
|
||||||
|
if (referencedName != null) {
|
||||||
|
addSuperName(result, referencedName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 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.jet.lang.psi.stubs;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface PsiJetClassOrObjectStub<T extends JetClassOrObject> extends PsiJetStubWithFqName<T> {
|
||||||
|
@NotNull
|
||||||
|
List<String> getSuperNames();
|
||||||
|
}
|
||||||
@@ -16,13 +16,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.psi.stubs;
|
package org.jetbrains.jet.lang.psi.stubs;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
import org.jetbrains.jet.lang.psi.JetClass;
|
||||||
|
|
||||||
import java.util.List;
|
public interface PsiJetClassStub extends PsiJetClassOrObjectStub<JetClass> {
|
||||||
|
|
||||||
public interface PsiJetClassStub extends PsiJetStubWithFqName<JetClass> {
|
|
||||||
|
|
||||||
boolean isTrait();
|
boolean isTrait();
|
||||||
|
|
||||||
boolean isAnnotation();
|
boolean isAnnotation();
|
||||||
@@ -32,7 +28,4 @@ public interface PsiJetClassStub extends PsiJetStubWithFqName<JetClass> {
|
|||||||
boolean isInner();
|
boolean isInner();
|
||||||
|
|
||||||
boolean isEnumEntry();
|
boolean isEnumEntry();
|
||||||
|
|
||||||
@NotNull
|
|
||||||
List<String> getSuperNames();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ package org.jetbrains.jet.lang.psi.stubs;
|
|||||||
|
|
||||||
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
||||||
|
|
||||||
public interface PsiJetObjectStub extends PsiJetStubWithFqName<JetObjectDeclaration> {
|
public interface PsiJetObjectStub extends PsiJetClassOrObjectStub<JetObjectDeclaration> {
|
||||||
boolean isTopLevel();
|
boolean isTopLevel();
|
||||||
boolean isClassObject();
|
boolean isClassObject();
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -27,6 +27,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
import org.jetbrains.jet.lang.psi.JetClass;
|
||||||
import org.jetbrains.jet.lang.psi.JetEnumEntry;
|
import org.jetbrains.jet.lang.psi.JetEnumEntry;
|
||||||
import org.jetbrains.jet.lang.psi.JetPsiUtil;
|
import org.jetbrains.jet.lang.psi.JetPsiUtil;
|
||||||
|
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
|
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetClassStubImpl;
|
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetClassStubImpl;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
@@ -35,7 +36,6 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class JetClassElementType extends JetStubElementType<PsiJetClassStub, JetClass> {
|
public class JetClassElementType extends JetStubElementType<PsiJetClassStub, JetClass> {
|
||||||
|
|
||||||
public JetClassElementType(@NotNull @NonNls String debugName) {
|
public JetClassElementType(@NotNull @NonNls String debugName) {
|
||||||
super(debugName);
|
super(debugName);
|
||||||
}
|
}
|
||||||
@@ -54,8 +54,9 @@ public class JetClassElementType extends JetStubElementType<PsiJetClassStub, Jet
|
|||||||
public PsiJetClassStub createStub(@NotNull JetClass psi, StubElement parentStub) {
|
public PsiJetClassStub createStub(@NotNull JetClass psi, StubElement parentStub) {
|
||||||
FqName fqName = JetPsiUtil.getFQName(psi);
|
FqName fqName = JetPsiUtil.getFQName(psi);
|
||||||
boolean isEnumEntry = psi instanceof JetEnumEntry;
|
boolean isEnumEntry = psi instanceof JetEnumEntry;
|
||||||
|
List<String> superNames = PsiUtilPackage.getSuperNames(psi);
|
||||||
return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, fqName != null ? fqName.asString() : null, psi.getName(),
|
return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, fqName != null ? fqName.asString() : null, psi.getName(),
|
||||||
psi.getSuperNames(), psi.isTrait(), psi.isEnum(), isEnumEntry, psi.isAnnotation(), psi.isInner());
|
superNames, psi.isTrait(), psi.isEnum(), isEnumEntry, psi.isAnnotation(), psi.isInner());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+23
-3
@@ -27,11 +27,13 @@ import org.jetbrains.annotations.NonNls;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.JetClassObject;
|
import org.jetbrains.jet.lang.psi.JetClassObject;
|
||||||
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
||||||
|
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
|
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl;
|
import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, JetObjectDeclaration> {
|
public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, JetObjectDeclaration> {
|
||||||
public JetObjectElementType(@NotNull @NonNls String debugName) {
|
public JetObjectElementType(@NotNull @NonNls String debugName) {
|
||||||
@@ -62,19 +64,30 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PsiJetObjectStub createStub(@NotNull JetObjectDeclaration psi, @NotNull StubElement parentStub) {
|
public PsiJetObjectStub createStub(@NotNull JetObjectDeclaration psi, StubElement parentStub) {
|
||||||
String name = psi.getName();
|
String name = psi.getName();
|
||||||
FqName fqName = psi.getFqName();
|
FqName fqName = psi.getFqName();
|
||||||
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, psi.isTopLevel(), isClassObject(psi));
|
List<String> superNames = PsiUtilPackage.getSuperNames(psi);
|
||||||
|
return new PsiJetObjectStubImpl(
|
||||||
|
JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, superNames, psi.isTopLevel(), isClassObject(psi)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void serialize(@NotNull PsiJetObjectStub stub, @NotNull StubOutputStream dataStream) throws IOException {
|
public void serialize(@NotNull PsiJetObjectStub stub, @NotNull StubOutputStream dataStream) throws IOException {
|
||||||
dataStream.writeName(stub.getName());
|
dataStream.writeName(stub.getName());
|
||||||
|
|
||||||
FqName fqName = stub.getFqName();
|
FqName fqName = stub.getFqName();
|
||||||
dataStream.writeName(fqName != null ? fqName.toString() : null);
|
dataStream.writeName(fqName != null ? fqName.toString() : null);
|
||||||
|
|
||||||
dataStream.writeBoolean(stub.isTopLevel());
|
dataStream.writeBoolean(stub.isTopLevel());
|
||||||
dataStream.writeBoolean(stub.isClassObject());
|
dataStream.writeBoolean(stub.isClassObject());
|
||||||
|
|
||||||
|
List<String> superNames = stub.getSuperNames();
|
||||||
|
dataStream.writeVarInt(superNames.size());
|
||||||
|
for (String name : superNames) {
|
||||||
|
dataStream.writeName(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -83,10 +96,17 @@ public class JetObjectElementType extends JetStubElementType<PsiJetObjectStub, J
|
|||||||
StringRef name = dataStream.readName();
|
StringRef name = dataStream.readName();
|
||||||
StringRef fqNameStr = dataStream.readName();
|
StringRef fqNameStr = dataStream.readName();
|
||||||
FqName fqName = fqNameStr != null ? new FqName(fqNameStr.toString()) : null;
|
FqName fqName = fqNameStr != null ? new FqName(fqNameStr.toString()) : null;
|
||||||
|
|
||||||
boolean isTopLevel = dataStream.readBoolean();
|
boolean isTopLevel = dataStream.readBoolean();
|
||||||
boolean isClassObject = dataStream.readBoolean();
|
boolean isClassObject = dataStream.readBoolean();
|
||||||
|
|
||||||
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, isTopLevel, isClassObject);
|
int superCount = dataStream.readVarInt();
|
||||||
|
StringRef[] superNames = StringRef.createArray(superCount);
|
||||||
|
for (int i = 0; i < superCount; i++) {
|
||||||
|
superNames[i] = dataStream.readName();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PsiJetObjectStubImpl(JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, superNames, isTopLevel, isClassObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+23
-3
@@ -16,9 +16,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.psi.stubs.impl;
|
package org.jetbrains.jet.lang.psi.stubs.impl;
|
||||||
|
|
||||||
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import com.intellij.psi.stubs.IStubElementType;
|
import com.intellij.psi.stubs.IStubElementType;
|
||||||
import com.intellij.psi.stubs.StubBase;
|
import com.intellij.psi.stubs.StubBase;
|
||||||
import com.intellij.psi.stubs.StubElement;
|
import com.intellij.psi.stubs.StubElement;
|
||||||
|
import com.intellij.util.ArrayUtil;
|
||||||
import com.intellij.util.io.StringRef;
|
import com.intellij.util.io.StringRef;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -26,34 +28,41 @@ import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
|||||||
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
|
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> implements PsiJetObjectStub {
|
public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> implements PsiJetObjectStub {
|
||||||
private final StringRef name;
|
private final StringRef name;
|
||||||
private final FqName fqName;
|
private final FqName fqName;
|
||||||
|
private final StringRef[] superNames;
|
||||||
private final boolean isTopLevel;
|
private final boolean isTopLevel;
|
||||||
private final boolean isClassObject;
|
private final boolean isClassObject;
|
||||||
|
|
||||||
public PsiJetObjectStubImpl(
|
public PsiJetObjectStubImpl(
|
||||||
@NotNull IStubElementType elementType,
|
@NotNull IStubElementType elementType,
|
||||||
@NotNull StubElement parent,
|
StubElement parent,
|
||||||
@Nullable String name,
|
@Nullable String name,
|
||||||
@Nullable FqName fqName,
|
@Nullable FqName fqName,
|
||||||
|
@NotNull List<String> superNames,
|
||||||
boolean isTopLevel,
|
boolean isTopLevel,
|
||||||
boolean isClassObject
|
boolean isClassObject
|
||||||
) {
|
) {
|
||||||
this(elementType, parent, StringRef.fromString(name), fqName, isTopLevel, isClassObject);
|
this(elementType, parent, StringRef.fromString(name), fqName, Utils.instance$.wrapStrings(superNames), isTopLevel, isClassObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PsiJetObjectStubImpl(
|
public PsiJetObjectStubImpl(
|
||||||
@NotNull IStubElementType elementType,
|
@NotNull IStubElementType elementType,
|
||||||
@NotNull StubElement parent,
|
StubElement parent,
|
||||||
@Nullable StringRef name,
|
@Nullable StringRef name,
|
||||||
@Nullable FqName fqName,
|
@Nullable FqName fqName,
|
||||||
|
@NotNull StringRef[] superNames,
|
||||||
boolean isTopLevel,
|
boolean isTopLevel,
|
||||||
boolean isClassObject) {
|
boolean isClassObject) {
|
||||||
super(parent, elementType);
|
super(parent, elementType);
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.fqName = fqName;
|
this.fqName = fqName;
|
||||||
|
this.superNames = superNames;
|
||||||
this.isTopLevel = isTopLevel;
|
this.isTopLevel = isTopLevel;
|
||||||
this.isClassObject = isClassObject;
|
this.isClassObject = isClassObject;
|
||||||
}
|
}
|
||||||
@@ -69,6 +78,16 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
|
|||||||
return fqName;
|
return fqName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<String> getSuperNames() {
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
for (StringRef ref : superNames) {
|
||||||
|
result.add(ref.toString());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isTopLevel() {
|
public boolean isTopLevel() {
|
||||||
return isTopLevel;
|
return isTopLevel;
|
||||||
@@ -95,6 +114,7 @@ public class PsiJetObjectStubImpl extends StubBase<JetObjectDeclaration> impleme
|
|||||||
|
|
||||||
builder.append("name=").append(getName());
|
builder.append("name=").append(getName());
|
||||||
builder.append(" fqName=").append(fqName != null ? fqName.toString() : "null");
|
builder.append(" fqName=").append(fqName != null ? fqName.toString() : "null");
|
||||||
|
builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]");
|
||||||
builder.append("]");
|
builder.append("]");
|
||||||
|
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 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.jet.lang.psi.stubs.impl
|
||||||
|
|
||||||
|
import com.intellij.util.io.StringRef
|
||||||
|
|
||||||
|
object Utils {
|
||||||
|
fun wrapStrings(names : List<String>) : Array<StringRef> {
|
||||||
|
return Array<StringRef>(names.size()) { i -> StringRef.fromString(names.get(i))!! }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,7 +25,6 @@ import com.intellij.util.Processor;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
@@ -61,7 +60,6 @@ public class KotlinDirectInheritorsSearcher extends QueryExecutorBase<PsiClass,
|
|||||||
GlobalSearchScope scope = (GlobalSearchScope) queryParameters.getScope();
|
GlobalSearchScope scope = (GlobalSearchScope) queryParameters.getScope();
|
||||||
Collection<JetClassOrObject> candidates = JetSuperClassIndex.getInstance().get(name, clazz.getProject(), scope);
|
Collection<JetClassOrObject> candidates = JetSuperClassIndex.getInstance().get(name, clazz.getProject(), scope);
|
||||||
for (JetClassOrObject candidate : candidates) {
|
for (JetClassOrObject candidate : candidates) {
|
||||||
if (!(candidate instanceof JetClass)) continue;
|
|
||||||
JetFile containingFile = (JetFile) candidate.getContainingFile();
|
JetFile containingFile = (JetFile) candidate.getContainingFile();
|
||||||
KotlinCodeAnalyzer sessionForFile = AnalyzerFacadeWithCache.getLazyResolveSessionForFile(containingFile);
|
KotlinCodeAnalyzer sessionForFile = AnalyzerFacadeWithCache.getLazyResolveSessionForFile(containingFile);
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) sessionForFile.resolveToDescriptor(candidate);
|
ClassDescriptor classDescriptor = (ClassDescriptor) sessionForFile.resolveToDescriptor(candidate);
|
||||||
|
|||||||
@@ -53,11 +53,15 @@ public class StubIndexServiceImpl implements StubIndexService {
|
|||||||
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqn.asString());
|
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqn.asString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
indexSuperNames(stub, sink);
|
||||||
|
|
||||||
|
recordClassOrObjectByPackage(stub, sink);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T extends JetClassOrObject> void indexSuperNames(PsiJetClassOrObjectStub<T> stub, IndexSink sink) {
|
||||||
for (String superName : stub.getSuperNames()) {
|
for (String superName : stub.getSuperNames()) {
|
||||||
sink.occurrence(JetSuperClassIndex.getInstance().getKey(), superName);
|
sink.occurrence(JetSuperClassIndex.getInstance().getKey(), superName);
|
||||||
}
|
}
|
||||||
|
|
||||||
recordClassOrObjectByPackage(stub, sink);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -90,6 +94,8 @@ public class StubIndexServiceImpl implements StubIndexService {
|
|||||||
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqName.asString());
|
sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqName.asString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
indexSuperNames(stub, sink);
|
||||||
|
|
||||||
recordClassOrObjectByPackage(stub, sink);
|
recordClassOrObjectByPackage(stub, sink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="O ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
object O: A()
|
||||||
|
|
||||||
|
open class <caret>A
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<node text="A ()" base="true">
|
||||||
|
<node text="O ()"/>
|
||||||
|
</node>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
object O: A
|
||||||
|
|
||||||
|
trait <caret>A
|
||||||
@@ -189,6 +189,15 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest {
|
|||||||
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ClassFromClass");
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ClassFromClass");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ObjectFromClass")
|
||||||
|
public void testObjectFromClass() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ObjectFromClass");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ObjectFromTrait")
|
||||||
|
public void testObjectFromTrait() throws Exception {
|
||||||
|
doSubClassHierarchyTest("idea/testData/hierarchy/class/sub/ObjectFromTrait");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/hierarchy/calls/callers")
|
@TestMetadata("idea/testData/hierarchy/calls/callers")
|
||||||
|
|||||||
@@ -27,7 +27,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
import org.jetbrains.jet.lang.psi.JetClass;
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
|
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
|
||||||
|
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.elements.JetFileStubBuilder;
|
import org.jetbrains.jet.lang.psi.stubs.elements.JetFileStubBuilder;
|
||||||
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
|
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
|
||||||
import org.jetbrains.jet.plugin.JetFileType;
|
import org.jetbrains.jet.plugin.JetFileType;
|
||||||
@@ -76,7 +78,7 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
|
|||||||
doBuildTest("class C { class object { fun foo() {} }}",
|
doBuildTest("class C { class object { fun foo() {} }}",
|
||||||
"PsiJetFileStubImpl[package=]\n" +
|
"PsiJetFileStubImpl[package=]\n" +
|
||||||
" CLASS:PsiJetClassStubImpl[name=C fqn=C superNames=[]]\n" +
|
" CLASS:PsiJetClassStubImpl[name=C fqn=C superNames=[]]\n" +
|
||||||
" OBJECT_DECLARATION:PsiJetObjectStubImpl[class-object name=null fqName=null]\n" +
|
" OBJECT_DECLARATION:PsiJetObjectStubImpl[class-object name=null fqName=null superNames=[]]\n" +
|
||||||
" FUN:PsiJetFunctionStubImpl[name=foo]\n" +
|
" FUN:PsiJetFunctionStubImpl[name=foo]\n" +
|
||||||
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
|
" VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n");
|
||||||
}
|
}
|
||||||
@@ -174,9 +176,11 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testNamedObject() {
|
public void testNamedObject() {
|
||||||
doBuildTest("object Test {}",
|
doBuildTest("class A\ntrait T\nobject Test: A(), T {}",
|
||||||
"PsiJetFileStubImpl[package=]\n" +
|
"PsiJetFileStubImpl[package=]\n" +
|
||||||
" OBJECT_DECLARATION:PsiJetObjectStubImpl[top name=Test fqName=Test]\n");
|
" CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" +
|
||||||
|
" CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" +
|
||||||
|
" OBJECT_DECLARATION:PsiJetObjectStubImpl[top name=Test fqName=Test superNames=[AT]]\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAnnotationOnClass() {
|
public void testAnnotationOnClass() {
|
||||||
|
|||||||
Reference in New Issue
Block a user