JetPositionManager: fix finding psi file by source name

This commit is contained in:
Natalia Ukhorskaya
2015-05-26 18:08:18 +03:00
parent c77d448832
commit ffb7027680
@@ -78,7 +78,7 @@ public class DebuggerUtils {
return filesWithExactName.iterator().next(); return filesWithExactName.iterator().next();
} }
if (!isPackagePartClassName(className)) { if (isPackageClassName(className)) {
for (JetFile file : filesWithExactName) { for (JetFile file : filesWithExactName) {
boolean hasTopLevelMembers = KotlinPackage.any(file.getDeclarations(), new Function1<JetDeclaration, Boolean>() { boolean hasTopLevelMembers = KotlinPackage.any(file.getDeclarations(), new Function1<JetDeclaration, Boolean>() {
@Override @Override
@@ -90,42 +90,51 @@ public class DebuggerUtils {
} }
} }
JetFile file = getFileForPackagePartPrefixedName(filesWithExactName, className.getInternalName()); if (isPackagePartClassName(className)) {
if (file != null) { JetFile file = getFileForPackagePartPrefixedName(filesWithExactName, className.getInternalName());
return file; if (file != null) {
} return file;
boolean isInLibrary = KotlinPackage.all(filesWithExactName, new Function1<JetFile, Boolean>() {
@Override
public Boolean invoke(JetFile file) {
return LibraryUtil.findLibraryEntry(file.getVirtualFile(), file.getProject()) != null;
} }
});
if (isInLibrary) { boolean isInLibrary = KotlinPackage.all(filesWithExactName, new Function1<JetFile, Boolean>() {
return KotlinPackage.singleOrNull(KotlinPackage.filter(filesWithExactName, new Function1<JetFile, Boolean>() {
@Override @Override
public Boolean invoke(JetFile file) { public Boolean invoke(JetFile file) {
Integer startLineOffset = CodeInsightUtils.getStartLineOffset(file, lineNumber); return LibraryUtil.findLibraryEntry(file.getVirtualFile(), file.getProject()) != null;
assert startLineOffset != null : "Cannot find start line offset for file " + file.getName() + ", line " + lineNumber;
JetDeclaration elementAt = PsiTreeUtil.getParentOfType(file.findElementAt(startLineOffset), JetDeclaration.class);
return elementAt != null &&
className.getInternalName().equals(DebuggerPackage.findPackagePartInternalNameForLibraryFile(elementAt));
} }
})); });
if (isInLibrary) {
return KotlinPackage.singleOrNull(KotlinPackage.filter(filesWithExactName, new Function1<JetFile, Boolean>() {
@Override
public Boolean invoke(JetFile file) {
Integer startLineOffset = CodeInsightUtils.getStartLineOffset(file, lineNumber);
assert startLineOffset != null : "Cannot find start line offset for file " + file.getName() + ", line " + lineNumber;
JetDeclaration elementAt = PsiTreeUtil.getParentOfType(file.findElementAt(startLineOffset), JetDeclaration.class);
return elementAt != null &&
className.getInternalName().equals(DebuggerPackage.findPackagePartInternalNameForLibraryFile(elementAt));
}
}));
}
return null;
} }
return null; return filesWithExactName.iterator().next();
} }
private static boolean isPackagePartClassName(JvmClassName className) { private static boolean isPackagePartClassName(JvmClassName className) {
FqName packageFqName = PackageClassUtils.getPackageClassFqName(className.getPackageFqName()); String packageName = PackageClassUtils.getPackageClassInternalName(className.getPackageFqName());
String packageName = packageFqName.asString().replaceAll("\\.", "/");
String internalName = className.getInternalName(); String internalName = className.getInternalName();
return !internalName.equals(packageName) && internalName.startsWith(packageName); return !internalName.equals(packageName) && internalName.startsWith(packageName);
} }
private static boolean isPackageClassName(JvmClassName className) {
String packageName = PackageClassUtils.getPackageClassInternalName(className.getPackageFqName());
return packageName.equals(className.getInternalName());
}
@Nullable @Nullable
private static JetFile getFileForPackagePartPrefixedName( private static JetFile getFileForPackagePartPrefixedName(
@NotNull Collection<JetFile> allPackageFiles, @NotNull Collection<JetFile> allPackageFiles,