Test for ImportPath and JetImportDirective coherence

This commit is contained in:
Nikolay Krasko
2013-01-17 19:00:10 +04:00
parent 70ce304c93
commit 6141d0305a
2 changed files with 83 additions and 6 deletions
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.util.QualifiedNamesUtil;
import java.util.Collection;
import java.util.HashSet;
@@ -262,8 +263,8 @@ public class JetPsiUtil {
return null;
}
final JetExpression importedReference = importDirective.getImportedReference();
if (importedReference == null) {
FqName importFqn = getFQName(importDirective.getImportedReference());
if (importFqn == null) {
return null;
}
@@ -273,7 +274,7 @@ public class JetPsiUtil {
alias = Name.identifier(aliasName);
}
return new ImportPath(new FqName(importedReference.getText().replaceAll(" ", "")), importDirective.isAllUnder(), alias);
return new ImportPath(importFqn, importDirective.isAllUnder(), alias);
}
@Nullable
@@ -378,7 +379,8 @@ public class JetPsiUtil {
}
public static boolean isFirstPartInQualified(@NotNull JetSimpleNameExpression nameExpression) {
@SuppressWarnings("unchecked") JetUserType userType = PsiTreeUtil.getParentOfType(nameExpression, JetUserType.class, true, JetDeclaration.class);
@SuppressWarnings("unchecked") JetUserType userType = PsiTreeUtil.getParentOfType(nameExpression, JetUserType.class, true,
JetDeclaration.class);
if (userType != null) {
return PsiTreeUtil.isAncestor(userType.getFirstChild(), nameExpression, false);
}
@@ -490,4 +492,40 @@ public class JetPsiUtil {
public static boolean isBackingFieldReference(@Nullable JetElement element) {
return element instanceof JetSimpleNameExpression && isBackingFieldReference((JetSimpleNameExpression)element);
}
@Nullable
private static FqName getFQName(@Nullable JetExpression expression) {
if (expression == null) {
return null;
}
if (expression instanceof JetDotQualifiedExpression) {
JetDotQualifiedExpression dotQualifiedExpression = (JetDotQualifiedExpression) expression;
FqName parentFqn = getFQName(dotQualifiedExpression.getReceiverExpression());
Name child = getName(dotQualifiedExpression.getSelectorExpression());
return parentFqn != null && child != null ? parentFqn.child(child) : null;
}
else if (expression instanceof JetSimpleNameExpression) {
JetSimpleNameExpression simpleNameExpression = (JetSimpleNameExpression) expression;
return FqName.topLevel(simpleNameExpression.getReferencedNameAsName());
}
else {
throw new IllegalArgumentException("Can't construct fqn for: " + expression.getClass().toString());
}
}
@Nullable
private static Name getName(@Nullable JetExpression expression) {
if (expression == null) {
return null;
}
if (expression instanceof JetSimpleNameExpression) {
return ((JetSimpleNameExpression) expression).getReferencedNameAsName();
}
else {
throw new IllegalArgumentException("Can't construct name for: " + expression.getClass().toString());
}
}
}
@@ -16,10 +16,16 @@
package org.jetbrains.jet.lang.psi;
import com.intellij.psi.util.PsiTreeUtil;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.jetbrains.jet.JetLiteFixture;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
public class JetPsiUtilTest extends TestCase {
public class JetPsiUtilTest extends JetLiteFixture {
public void testUnquotedIdentifier() {
Assert.assertEquals("", JetPsiUtil.unquoteIdentifier(""));
@@ -37,4 +43,37 @@ public class JetPsiUtilTest extends TestCase {
Assert.assertEquals("$a2", JetPsiUtil.unquoteIdentifierOrFieldReference("$`a2`"));
}
public void testConvertToImportPath() {
Assert.assertEquals(null, getImportPathFromParsed("import "));
Assert.assertEquals(null, getImportPathFromParsed("import some."));
Assert.assertEquals(null, getImportPathFromParsed("import *"));
Assert.assertEquals(null, getImportPathFromParsed("import some.test.* as SomeTest"));
Assert.assertEquals(new ImportPath(new FqName("some"), false), getImportPathFromParsed("import some?.Test"));
Assert.assertEquals(new ImportPath(new FqName("some"), false), getImportPathFromParsed("import some"));
Assert.assertEquals(new ImportPath(new FqName("some"), true), getImportPathFromParsed("import some.*"));
Assert.assertEquals(new ImportPath(new FqName("some.Test"), false), getImportPathFromParsed("import some.Test"));
Assert.assertEquals(new ImportPath(new FqName("some.test"), true), getImportPathFromParsed("import some.test.*"));
Assert.assertEquals(new ImportPath(new FqName("some.test"), false, Name.identifier("SomeTest")), getImportPathFromParsed("import some.test as SomeTest"));
Assert.assertEquals(new ImportPath(new FqName("some.Test"), false), getImportPathFromParsed("import some.\nTest"));
Assert.assertEquals(new ImportPath(new FqName("some.Test"), false), getImportPathFromParsed("import some./* hello world */Test"));
Assert.assertEquals(new ImportPath(new FqName("some.Test"), false), getImportPathFromParsed("import some. Test"));
Assert.assertNotSame(new ImportPath(new FqName("some.test"), false), getImportPathFromParsed("import some.Test"));
}
@Override
protected JetCoreEnvironment createEnvironment() {
return new JetCoreEnvironment(getTestRootDisposable(), new CompilerConfiguration());
}
private ImportPath getImportPathFromParsed(String text) {
JetImportDirective importDirective =
PsiTreeUtil.findChildOfType(JetPsiFactory.createFile(getProject(), text), JetImportDirective.class);
assertNotNull("At least one import directive is expected", importDirective);
return JetPsiUtil.getImportPath(importDirective);
}
}