classNamesForPosition always returns one class name
This commit is contained in:
@@ -23,7 +23,7 @@ import com.intellij.debugger.engine.DebugProcess;
|
||||
import com.intellij.debugger.requests.ClassPrepareRequestor;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.util.Ref;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.search.FilenameIndex;
|
||||
@@ -114,16 +114,17 @@ public class JetPositionManager implements PositionManager {
|
||||
if (!(sourcePosition.getFile() instanceof JetFile)) {
|
||||
throw new NoDataException();
|
||||
}
|
||||
final Collection<String> names = classNamesForPosition(sourcePosition);
|
||||
String name = classNameForPosition(sourcePosition);
|
||||
List<ReferenceType> result = new ArrayList<ReferenceType>();
|
||||
for (String name : names) {
|
||||
if (name != null) {
|
||||
result.addAll(myDebugProcess.getVirtualMachineProxy().classesByName(name));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private Collection<String> classNamesForPosition(final SourcePosition sourcePosition) {
|
||||
final Collection<String> names = new ArrayList<String>();
|
||||
@Nullable
|
||||
private String classNameForPosition(final SourcePosition sourcePosition) {
|
||||
final Ref<String> result = Ref.create();
|
||||
|
||||
ApplicationManager.getApplication().runReadAction(new Runnable() {
|
||||
@Override
|
||||
@@ -134,37 +135,37 @@ public class JetPositionManager implements PositionManager {
|
||||
|
||||
PsiElement element = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetClassOrObject.class, JetFunctionLiteralExpression.class, JetNamedFunction.class);
|
||||
if (element instanceof JetClassOrObject) {
|
||||
names.add(typeMapper.getJvmInternalName((JetClassOrObject)element));
|
||||
result.set(typeMapper.getJvmInternalName((JetClassOrObject) element));
|
||||
}
|
||||
else if (element instanceof JetFunctionLiteralExpression) {
|
||||
names.add(typeMapper.getClosureAnnotator().classNameForAnonymousClass((JetFunctionLiteralExpression)element).getInternalName());
|
||||
result.set(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));
|
||||
result.set(typeMapper.getJvmInternalName((JetClassOrObject) parent));
|
||||
}
|
||||
else if (parent instanceof JetFunctionLiteralExpression || parent instanceof JetNamedFunction) {
|
||||
names.add(typeMapper.getClosureAnnotator().classNameForAnonymousClass((JetElement)element).getInternalName());
|
||||
result.set(typeMapper.getClosureAnnotator().classNameForAnonymousClass((JetElement)element).getInternalName());
|
||||
}
|
||||
}
|
||||
|
||||
if (names.isEmpty()) {
|
||||
if (result.isNull()) {
|
||||
FqName fqName = JetPsiUtil.getFQName(namespace);
|
||||
boolean multiFileNamespace = typeMapper.getClosureAnnotator().isMultiFileNamespace(fqName);
|
||||
String namespaceInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName();
|
||||
if (multiFileNamespace) {
|
||||
String name = namespace.getName();
|
||||
names.add(namespaceInternalName + "$src$" + name.substring(0, name.lastIndexOf('.')));
|
||||
result.set(namespaceInternalName + "$src$" + name.substring(0, name.lastIndexOf('.')));
|
||||
}
|
||||
else {
|
||||
names.add(namespaceInternalName);
|
||||
result.set(namespaceInternalName);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return names;
|
||||
return result.get();
|
||||
}
|
||||
|
||||
private JetTypeMapper prepareTypeMapper(final JetFile file) {
|
||||
@@ -215,20 +216,10 @@ public class JetPositionManager implements PositionManager {
|
||||
if (!(sourcePosition.getFile() instanceof JetFile)) {
|
||||
throw new NoDataException();
|
||||
}
|
||||
final Collection<String> classNames = classNamesForPosition(sourcePosition);
|
||||
if (classNames.isEmpty()) {
|
||||
final String className = classNameForPosition(sourcePosition);
|
||||
if (className == null) {
|
||||
return null;
|
||||
}
|
||||
final Iterator<String> iterator = classNames.iterator();
|
||||
boolean wildcard = false;
|
||||
String namePattern = iterator.next();
|
||||
while (iterator.hasNext()) {
|
||||
namePattern = StringUtil.commonPrefix(namePattern, iterator.next());
|
||||
wildcard = true;
|
||||
}
|
||||
if (wildcard) {
|
||||
namePattern += "*";
|
||||
}
|
||||
return myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, namePattern.replace('/', '.'));
|
||||
return myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, className.replace('/', '.'));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user