classNamesForPosition always returns one class name

This commit is contained in:
Alexander Udalov
2012-08-14 19:28:27 +04:00
parent 0adf6d615a
commit 90c7683f3c
@@ -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('/', '.'));
}
}