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.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('/', '.'));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user