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