JetPositionManager now correctly calculates class names for a given position
This commit is contained in:
@@ -1044,13 +1044,13 @@ public class JetTypeMapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<String> allJvmNames(JetClassOrObject jetClass) {
|
@Nullable
|
||||||
Set<String> result = new HashSet<String>();
|
public String getJvmInternalName(JetClassOrObject jetClass) {
|
||||||
final ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, jetClass);
|
final ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, jetClass);
|
||||||
if (classDescriptor != null) {
|
if (classDescriptor == null) {
|
||||||
result.add(mapType(classDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName());
|
return null;
|
||||||
}
|
}
|
||||||
return result;
|
return mapType(classDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isForceReal(JvmClassName className) {
|
private static boolean isForceReal(JvmClassName className) {
|
||||||
|
|||||||
@@ -33,18 +33,14 @@ import com.sun.jdi.AbsentInformationException;
|
|||||||
import com.sun.jdi.Location;
|
import com.sun.jdi.Location;
|
||||||
import com.sun.jdi.ReferenceType;
|
import com.sun.jdi.ReferenceType;
|
||||||
import com.sun.jdi.request.ClassPrepareRequest;
|
import com.sun.jdi.request.ClassPrepareRequest;
|
||||||
import com.sun.jna.TypeMapper;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
||||||
import org.jetbrains.jet.codegen.JetTypeMapper;
|
import org.jetbrains.jet.codegen.JetTypeMapper;
|
||||||
import org.jetbrains.jet.codegen.NamespaceCodegen;
|
import org.jetbrains.jet.codegen.NamespaceCodegen;
|
||||||
import org.jetbrains.jet.di.InjectorForJetTypeMapper;
|
import org.jetbrains.jet.di.InjectorForJetTypeMapper;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.JetFilesProvider;
|
import org.jetbrains.jet.lang.resolve.java.JetFilesProvider;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade;
|
import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade;
|
||||||
|
|
||||||
@@ -127,53 +123,42 @@ public class JetPositionManager implements PositionManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Collection<String> classNamesForPosition(final SourcePosition sourcePosition) {
|
private Collection<String> classNamesForPosition(final SourcePosition sourcePosition) {
|
||||||
|
|
||||||
final Collection<String> names = new ArrayList<String>();
|
final Collection<String> names = new ArrayList<String>();
|
||||||
|
|
||||||
ApplicationManager.getApplication().runReadAction(new Runnable() {
|
ApplicationManager.getApplication().runReadAction(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void run() {
|
public void run() {
|
||||||
final JetFile file = (JetFile)sourcePosition.getFile();
|
final JetFile namespace = (JetFile)sourcePosition.getFile();
|
||||||
JetTypeMapper typeMapper = prepareTypeMapper(file);
|
final JetTypeMapper typeMapper = prepareTypeMapper(namespace);
|
||||||
|
|
||||||
PsiElement psiElement = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetClassOrObject.class, JetFunctionLiteralExpression.class, JetNamedFunction.class);
|
PsiElement element = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetClassOrObject.class, JetFunctionLiteralExpression.class, JetNamedFunction.class);
|
||||||
if (psiElement == null) {
|
if (element instanceof JetClassOrObject) {
|
||||||
JetFile namespace = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetFile.class);
|
names.add(typeMapper.getJvmInternalName((JetClassOrObject)element));
|
||||||
if (namespace != null) {
|
}
|
||||||
names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(namespace)).getInternalName());
|
else if (element instanceof JetFunctionLiteralExpression) {
|
||||||
|
names.add(typeMapper.getClosureAnnotator().classNameForAnonymousClass((JetFunctionLiteralExpression)element).getInternalName());
|
||||||
|
}
|
||||||
|
else if (element instanceof JetNamedFunction) {
|
||||||
|
PsiElement parent = PsiTreeUtil.getParentOfType(element, JetClassOrObject.class, JetFunctionLiteralExpression.class, JetNamedFunction.class);
|
||||||
|
if (parent instanceof JetClassOrObject) {
|
||||||
|
names.add(typeMapper.getJvmInternalName((JetClassOrObject)parent));
|
||||||
}
|
}
|
||||||
else {
|
else if (parent instanceof JetFunctionLiteralExpression || parent instanceof JetNamedFunction) {
|
||||||
names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(file)).getInternalName());
|
names.add(typeMapper.getClosureAnnotator().classNameForAnonymousClass((JetElement)element).getInternalName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (psiElement instanceof JetClassOrObject) {
|
if (names.isEmpty()) {
|
||||||
names.addAll(typeMapper.allJvmNames((JetClassOrObject) psiElement));
|
FqName fqName = JetPsiUtil.getFQName(namespace);
|
||||||
}
|
boolean multiFileNamespace = typeMapper.getClosureAnnotator().isMultiFileNamespace(fqName);
|
||||||
else if(psiElement instanceof JetNamedFunction) {
|
String namespaceInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName();
|
||||||
if(psiElement.getParent() instanceof JetFile) {
|
if (multiFileNamespace) {
|
||||||
JetFile namespace = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetFile.class);
|
String name = namespace.getName();
|
||||||
boolean multiFileNamespace = typeMapper.getClosureAnnotator().isMultiFileNamespace(JetPsiUtil.getFQName(namespace));
|
names.add(namespaceInternalName + "$src$" + name.substring(0, name.lastIndexOf('.')));
|
||||||
if(multiFileNamespace) {
|
|
||||||
String name = namespace.getName();
|
|
||||||
names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(namespace)).getInternalName() + "$src$" + name.substring(0,name.lastIndexOf('.')));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(namespace)).getInternalName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
JetFile namespace = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetFile.class);
|
|
||||||
if (namespace != null) {
|
|
||||||
names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(namespace)).getInternalName());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(file)).getInternalName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
names.add(typeMapper.getClosureAnnotator().classNameForAnonymousClass((JetElement) psiElement).getInternalName());
|
names.add(namespaceInternalName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user