diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index 4a09f41652c..6dbf6d625f3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -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()); + } + } } diff --git a/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java b/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java index 4a47d210ed2..d1d52eaa002 100644 --- a/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java +++ b/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java @@ -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); + } }