Proper checking for a qualified name
When i18n plugin is enabled, it looks for classes like "java.lang.Object...)" while highlighting annotations.xml EA-43709 - IAE: NameUtils.requireIdentifier
This commit is contained in:
@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.name;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -70,12 +69,6 @@ public class FqName extends FqNameBase {
|
|||||||
return qualifiedName.indexOf('<') < 0;
|
return qualifiedName.indexOf('<') < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isValid(@Nullable String qualifiedName) {
|
|
||||||
return qualifiedName != null &&
|
|
||||||
FqNameUnsafe.isValid(qualifiedName) &&
|
|
||||||
isValidAfterUnsafeCheck(qualifiedName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public String getFqName() {
|
public String getFqName() {
|
||||||
|
|||||||
@@ -142,4 +142,36 @@ public final class QualifiedNamesUtil {
|
|||||||
|
|
||||||
return isImported(alreadyImported, newImport.fqnPart());
|
return isImported(alreadyImported, newImport.fqnPart());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isValidJavaFqName(@Nullable String qualifiedName) {
|
||||||
|
if (qualifiedName == null) return false;
|
||||||
|
|
||||||
|
// Check that it is javaName(\.javaName)* or an empty string
|
||||||
|
|
||||||
|
class State {}
|
||||||
|
State BEGINNING = new State();
|
||||||
|
State MIDDLE = new State();
|
||||||
|
State AFTER_DOT = new State();
|
||||||
|
|
||||||
|
State state = BEGINNING;
|
||||||
|
|
||||||
|
int length = qualifiedName.length();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
char c = qualifiedName.charAt(i);
|
||||||
|
if (state == BEGINNING || state == AFTER_DOT) {
|
||||||
|
if (!Character.isJavaIdentifierPart(c)) return false;
|
||||||
|
state = MIDDLE;
|
||||||
|
}
|
||||||
|
else if (state == MIDDLE) {
|
||||||
|
if (c == '.') {
|
||||||
|
state = AFTER_DOT;
|
||||||
|
}
|
||||||
|
else if (!Character.isJavaIdentifierPart(c)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return state != AFTER_DOT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaPsiFacadeKotlinHacks;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
|
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
import org.jetbrains.jet.util.QualifiedNamesUtil;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -77,7 +78,7 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public PsiClass[] findClasses(@NotNull String qualifiedNameString, @NotNull GlobalSearchScope scope) {
|
public PsiClass[] findClasses(@NotNull String qualifiedNameString, @NotNull GlobalSearchScope scope) {
|
||||||
if (!FqName.isValid(qualifiedNameString)) {
|
if (!QualifiedNamesUtil.isValidJavaFqName(qualifiedNameString)) {
|
||||||
return PsiClass.EMPTY_ARRAY;
|
return PsiClass.EMPTY_ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +163,7 @@ public class JavaElementFinder extends PsiElementFinder implements JavaPsiFacade
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PsiPackage findPackage(@NotNull String qualifiedNameString) {
|
public PsiPackage findPackage(@NotNull String qualifiedNameString) {
|
||||||
if (!FqName.isValid(qualifiedNameString)) {
|
if (!QualifiedNamesUtil.isValidJavaFqName(qualifiedNameString)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.google.common.collect.Lists;
|
|||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
import org.jetbrains.jet.util.QualifiedNamesUtil;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
@@ -100,4 +101,25 @@ public class FqNameTest {
|
|||||||
FqNameUnsafe fqName = new FqNameUnsafe("ru.yandex");
|
FqNameUnsafe fqName = new FqNameUnsafe("ru.yandex");
|
||||||
Assert.assertSame(fqName, fqName.toSafe().toUnsafe());
|
Assert.assertSame(fqName, fqName.toSafe().toUnsafe());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isValidJavaFqName() {
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName(""));
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName("a"));
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName("1"));
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName("a.a"));
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName("org.jetbrains"));
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName("$"));
|
||||||
|
Assert.assertTrue(QualifiedNamesUtil.isValidJavaFqName("org.A$B"));
|
||||||
|
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("."));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName(".."));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("a."));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName(".a"));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("a..b"));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("a.b.."));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("a.b."));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("a.b...)"));
|
||||||
|
Assert.assertFalse(QualifiedNamesUtil.isValidJavaFqName("a.b.<special>"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -23,10 +23,10 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
|||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.ImportPath;
|
import org.jetbrains.jet.lang.resolve.ImportPath;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||||
import org.jetbrains.jet.plugin.completion.JetLookupObject;
|
import org.jetbrains.jet.plugin.completion.JetLookupObject;
|
||||||
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper;
|
import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper;
|
||||||
|
import org.jetbrains.jet.util.QualifiedNamesUtil;
|
||||||
|
|
||||||
// class ExplicitlyImportedWeigher extends ProximityWeigher {
|
// class ExplicitlyImportedWeigher extends ProximityWeigher {
|
||||||
public class JetExplicitlyImportedWeigher extends LookupElementWeigher {
|
public class JetExplicitlyImportedWeigher extends LookupElementWeigher {
|
||||||
@@ -55,7 +55,7 @@ public class JetExplicitlyImportedWeigher extends LookupElementWeigher {
|
|||||||
if (descriptor != null) {
|
if (descriptor != null) {
|
||||||
FqNameUnsafe fqName = DescriptorUtils.getFQName(descriptor);
|
FqNameUnsafe fqName = DescriptorUtils.getFQName(descriptor);
|
||||||
// Invalid name can be met for class object descriptor: Test.MyTest.A.<no name provided>.testOther
|
// Invalid name can be met for class object descriptor: Test.MyTest.A.<no name provided>.testOther
|
||||||
if (FqName.isValid(fqName.toString())) {
|
if (QualifiedNamesUtil.isValidJavaFqName(fqName.toString())) {
|
||||||
ImportPath importPath = new ImportPath(fqName.toString());
|
ImportPath importPath = new ImportPath(fqName.toString());
|
||||||
if (ImportInsertHelper.doNeedImport(importPath, file)) {
|
if (ImportInsertHelper.doNeedImport(importPath, file)) {
|
||||||
return MyResult.notImported;
|
return MyResult.notImported;
|
||||||
|
|||||||
Reference in New Issue
Block a user