diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetDecompiledData.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetDecompiledData.java index 056e95d215d..dc9d539bad5 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetDecompiledData.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetDecompiledData.java @@ -28,6 +28,7 @@ import com.intellij.psi.impl.compiled.ClsElementImpl; import com.intellij.psi.impl.compiled.ClsFileImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; @@ -41,6 +42,7 @@ import java.util.Map; @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized") public class JetDecompiledData { private JetFile myJetFile; + private Map myClsElementsToJetElements = new HashMap(); private static final Object LOCK = new String("decompiled data lock"); @@ -96,4 +98,9 @@ public class JetDecompiledData { return decompiledData; } } + + @TestOnly + Map getClsElementsToJetElements() { + return myClsElementsToJetElements; + } } diff --git a/idea/testData/libraries/AbstractClass.kt b/idea/testData/libraries/AbstractClass.kt index 6ad215d3258..33cbc85ca07 100644 --- a/idea/testData/libraries/AbstractClass.kt +++ b/idea/testData/libraries/AbstractClass.kt @@ -3,5 +3,5 @@ package testData.libraries -abstract class AbstractClass { -} \ No newline at end of file +[abstract class AbstractClass { +}] \ No newline at end of file diff --git a/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt b/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt index 3b3f87f630c..b2c911f2cf0 100644 --- a/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt +++ b/idea/testData/libraries/ClassWithAbstractAndOpenMembers.kt @@ -3,20 +3,20 @@ package testData.libraries -abstract class ClassWithAbstractAndOpenMembers { - abstract fun abstractFun() : Unit +[abstract class ClassWithAbstractAndOpenMembers { + [abstract fun abstractFun() : Unit] - open fun openFun() : Unit { /* compiled code */ } + [open fun openFun() : Unit { /* compiled code */ }] - abstract val abstractVal : jet.String + [abstract val abstractVal : jet.String] - open val openVal : jet.String /* compiled code */ + [open val openVal : jet.String] /* compiled code */ - open val openValWithGetter : jet.String /* compiled code */ + [open val openValWithGetter : jet.String] /* compiled code */ - abstract var abstractVar : jet.String + [abstract var abstractVar : jet.String] - open var openVar : jet.String /* compiled code */ + [open var openVar : jet.String] /* compiled code */ - open var openVarWithGetter : jet.String /* compiled code */ -} + [open var openVarWithGetter : jet.String] /* compiled code */ +}] diff --git a/idea/testData/libraries/Color.kt b/idea/testData/libraries/Color.kt index 42977e16b4c..1e5516ba4ea 100644 --- a/idea/testData/libraries/Color.kt +++ b/idea/testData/libraries/Color.kt @@ -3,6 +3,6 @@ package testData.libraries -class Color { - val rgb : jet.Int /* compiled code */ -} +[class Color { + [val rgb : jet.Int] /* compiled code */ +}] diff --git a/idea/testData/libraries/SimpleClass.kt b/idea/testData/libraries/SimpleClass.kt index 518ff14ad8d..60528a70a69 100644 --- a/idea/testData/libraries/SimpleClass.kt +++ b/idea/testData/libraries/SimpleClass.kt @@ -3,5 +3,5 @@ package testData.libraries -class SimpleClass { -} +[class SimpleClass { +}] diff --git a/idea/testData/libraries/SimpleTrait.kt b/idea/testData/libraries/SimpleTrait.kt index 7c928aa062f..d25fc5a61ec 100644 --- a/idea/testData/libraries/SimpleTrait.kt +++ b/idea/testData/libraries/SimpleTrait.kt @@ -3,5 +3,5 @@ package testData.libraries -trait SimpleTrait { -} +[trait SimpleTrait { +}] diff --git a/idea/testData/libraries/SimpleTraitImpl.kt b/idea/testData/libraries/SimpleTraitImpl.kt index ab626c6ad59..8c4007af99f 100644 --- a/idea/testData/libraries/SimpleTraitImpl.kt +++ b/idea/testData/libraries/SimpleTraitImpl.kt @@ -3,5 +3,5 @@ package testData.libraries -class SimpleTraitImpl : testData.libraries.SimpleTrait { -} +[class SimpleTraitImpl : testData.libraries.SimpleTrait { +}] diff --git a/idea/testData/libraries/WithInnerAndObject.kt b/idea/testData/libraries/WithInnerAndObject.kt index 0db42b07e4b..4d788cd595e 100644 --- a/idea/testData/libraries/WithInnerAndObject.kt +++ b/idea/testData/libraries/WithInnerAndObject.kt @@ -3,14 +3,14 @@ package testData.libraries -class WithInnerAndObject { +[class WithInnerAndObject { class object { - fun foo() : Unit { /* compiled code */ } + [fun foo() : Unit { /* compiled code */ }] } - class MyInner { - trait MyInnerInner { - abstract fun innerInnerMethod() : Unit - } - } -} + [class MyInner { + [trait MyInnerInner { + [abstract fun innerInnerMethod() : Unit] + }] + }] +}] diff --git a/idea/testData/libraries/WithTraitClassObject.kt b/idea/testData/libraries/WithTraitClassObject.kt index 9292180ad5a..4529fc325bc 100644 --- a/idea/testData/libraries/WithTraitClassObject.kt +++ b/idea/testData/libraries/WithTraitClassObject.kt @@ -3,7 +3,7 @@ package testData.libraries -class WithTraitClassObject { +[class WithTraitClassObject { class object : testData.libraries.SimpleTrait { } -} +}] diff --git a/idea/testData/libraries/namespace.kt b/idea/testData/libraries/namespace.kt index 83f103921f2..405a7414dd9 100644 --- a/idea/testData/libraries/namespace.kt +++ b/idea/testData/libraries/namespace.kt @@ -3,5 +3,5 @@ package testData.libraries -fun main(val args : jet.Array) : Unit { /* compiled code */ } +[fun main(val args : jet.Array) : Unit { /* compiled code */ }] diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesTest.java index 096c0bc3744..3dd194c0784 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesTest.java @@ -23,13 +23,21 @@ import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.compiled.ClsElementImpl; +import com.intellij.psi.impl.compiled.ClsFileImpl; import com.intellij.testFramework.PlatformTestCase; import org.jetbrains.jet.cli.KotlinCompiler; +import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.plugin.PluginTestCaseBase; +import java.util.Map; + /** * @author Evgeny Gerashchenko * @since 3/11/12 @@ -39,6 +47,7 @@ public class LibrariesTest extends PlatformTestCase { private static final String PACKAGE = "testData.libraries"; private static final String TEST_DATA_PATH = PluginTestCaseBase.getTestDataPathBase() + "/libraries"; private VirtualFile myLibraryDir; + private VirtualFile myClassFile; public void testAbstractClass() { doTest(); @@ -77,15 +86,64 @@ public class LibrariesTest extends PlatformTestCase { } private void doTest() { - String testName = getTestName(false); + myClassFile = getClassFile(); + + Map map = getDecompiledData(myClassFile).getClsElementsToJetElements(); + checkNavigationElements(map); + String decompiledTextWithMarks = getDecompiledTextWithMarks(map); + + assertSameLinesWithFile(TEST_DATA_PATH + "/" + getTestName(false) + ".kt", decompiledTextWithMarks); + } + + private String getDecompiledTextWithMarks(Map map) { + String decompiledText = getDecompiledText(); + + int[] openings = new int[decompiledText.length() + 1]; + int[] closings = new int[decompiledText.length() + 1]; + for (JetDeclaration jetDeclaration : map.values()) { + TextRange textRange = jetDeclaration.getTextRange(); + openings[textRange.getStartOffset()]++; + closings[textRange.getEndOffset()]++; + } + + StringBuilder result = new StringBuilder(); + for (int i = 0; i <= decompiledText.length(); i++) { + result.append(StringUtil.repeat("]", closings[i])); + result.append(StringUtil.repeat("[", openings[i])); + if (i < decompiledText.length()) { + result.append(decompiledText.charAt(i)); + } + } + return result.toString(); + } + + private String getDecompiledText() { + Document document = FileDocumentManager.getInstance().getDocument(myClassFile); + assertNotNull(document); + return document.getText(); + } + + private JetDecompiledData getDecompiledData(VirtualFile classFile) { + PsiFile classPsiFile = getPsiManager().findFile(classFile); + assertInstanceOf(classPsiFile, ClsFileImpl.class); + ClsFileImpl clsFile = (ClsFileImpl) classPsiFile; + return JetDecompiledData.getDecompiledData(clsFile); + } + + private void checkNavigationElements(Map map) { + PsiFile classPsiFile = getPsiManager().findFile(myClassFile); + for (Map.Entry clsToJet : map.entrySet()) { + assertSame(classPsiFile, clsToJet.getKey().getContainingFile()); + assertSame(clsToJet.getValue(), clsToJet.getKey().getNavigationElement()); + } + } + + private VirtualFile getClassFile() { VirtualFile packageDir = myLibraryDir.findFileByRelativePath(PACKAGE.replace(".", "/")); assertNotNull(packageDir); - VirtualFile classFile = packageDir.findChild(testName + ".class"); + VirtualFile classFile = packageDir.findChild(getTestName(false) + ".class"); assertNotNull(classFile); - Document document = FileDocumentManager.getInstance().getDocument(classFile); - assert document != null; - String decompiledText = document.getText(); - assertSameLinesWithFile(TEST_DATA_PATH + "/" + testName + ".kt", decompiledText); + return classFile; } @Override