Implement getDebugText() which should be used instead of getText() for debug purposes

This commit is contained in:
Pavel V. Talanov
2014-04-25 16:26:36 +04:00
parent 409f677559
commit ef4c15a2c8
4 changed files with 578 additions and 3 deletions
@@ -0,0 +1,344 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.psi.debugText
import org.jetbrains.jet.lang.psi.JetElementImplStub
import org.jetbrains.jet.lang.psi.JetElement
import org.jetbrains.jet.lang.psi.JetClass
import org.jetbrains.jet.lang.psi.JetVisitor
import org.jetbrains.jet.lang.psi.JetModifierList
import org.jetbrains.jet.lang.psi.JetTypeParameterList
import org.jetbrains.jet.lang.psi.JetParameterList
import org.jetbrains.jet.lang.psi.JetDelegationSpecifierList
import org.jetbrains.jet.lang.psi.JetClassBody
import org.jetbrains.jet.lang.psi.JetStubbedPsiUtil
import org.jetbrains.jet.lang.psi.JetAnnotation
import org.jetbrains.jet.lang.psi.JetAnnotationEntry
import org.jetbrains.jet.lang.psi.JetClassInitializer
import org.jetbrains.jet.lang.psi.JetClassObject
import org.jetbrains.jet.lang.psi.JetConstructorCalleeExpression
import org.jetbrains.jet.lang.psi.JetDelegationSpecifier
import org.jetbrains.jet.lang.psi.JetDotQualifiedExpression
import org.jetbrains.jet.lang.psi.JetEnumEntry
import org.jetbrains.jet.lang.psi.JetInitializerList
import org.jetbrains.jet.lang.psi.JetFunctionType
import org.jetbrains.jet.lang.psi.JetTypeReference
import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.lang.psi.JetNamedFunction
import org.jetbrains.jet.lang.psi.JetTypeConstraintList
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.JetNullableType
import org.jetbrains.jet.lang.psi.JetObjectDeclaration
import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.JetPropertyAccessor
import org.jetbrains.jet.lang.psi.JetTypeArgumentList
import org.jetbrains.jet.lang.psi.JetTypeConstraint
import org.jetbrains.jet.lang.psi.JetTypeParameter
import org.jetbrains.jet.lang.psi.JetTypeProjection
import org.jetbrains.jet.lang.psi.JetUserType
import com.intellij.openapi.diagnostic.Logger
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.JetPackageDirective
import org.jetbrains.jet.lang.psi.JetImportDirective
import org.jetbrains.jet.lang.psi.JetImportList
// invoke this instead of getText() when you need debug text to identify some place in PSI without storing the element itself
// this is need to avoid unnecessary file parses
// this defaults to get text if the element is not stubbed
public fun JetElement.getDebugText(): String? {
if (this !is JetElementImplStub<*> || this.getStub() == null) {
return getText()
}
if (this is JetPackageDirective) {
val fqName = getFqName()
if (fqName.isRoot()) {
return ""
}
return "package " + fqName.asString()
}
return accept(DebugTextBuildingVisitor, Unit.VALUE)
}
private object DebugTextBuildingVisitor : JetVisitor<String, Unit>() {
private val LOG = Logger.getInstance(this.javaClass)
override fun visitJetFile(file: JetFile, data: Unit?): String? {
return "STUB file: ${file.getName()}"
}
override fun visitJetElement(element: JetElement, data: Unit?): String? {
if (element is JetElementImplStub<*>) {
LOG.error("getDebugText() is not defined for ${element.getClass()}")
}
return element.getText()
}
override fun visitImportDirective(importDirective: JetImportDirective, data: Unit?): String? {
val importPath = importDirective.getImportPath()
if (importPath == null) {
return "import <invalid>"
}
val aliasStr = if (importPath.hasAlias()) " as " + importPath.getAlias()!!.asString() else ""
return "import ${importPath.getPathStr()}" + aliasStr
}
override fun visitImportList(importList: JetImportList, data: Unit?): String? {
return renderChildren(importList, separator = "\n")
}
override fun visitAnnotationEntry(annotationEntry: JetAnnotationEntry, data: Unit?): String? {
return render(annotationEntry, annotationEntry.getCalleeExpression(), annotationEntry.getTypeArgumentList())
}
override fun visitTypeReference(typeReference: JetTypeReference, data: Unit?): String? {
return renderChildren(typeReference, " ")
}
override fun visitTypeArgumentList(typeArgumentList: JetTypeArgumentList, data: Unit?): String? {
return renderChildren(typeArgumentList, ", ", "<", ">")
}
override fun visitTypeConstraintList(list: JetTypeConstraintList, data: Unit?): String? {
return renderChildren(list, ", ", "where ", "")
}
override fun visitUserType(userType: JetUserType, data: Unit?): String? {
return render(userType, userType.getQualifier(), userType.getReferenceExpression(), userType.getTypeArgumentList())
}
override fun visitAnnotation(annotation: JetAnnotation, data: Unit?): String? {
return renderChildren(annotation, " ", "[", "]")
}
override fun visitConstructorCalleeExpression(constructorCalleeExpression: JetConstructorCalleeExpression, data: Unit?): String? {
return render(constructorCalleeExpression, constructorCalleeExpression.getConstructorReferenceExpression())
}
override fun visitDelegationSpecifier(specifier: JetDelegationSpecifier, data: Unit?): String? {
return render(specifier, specifier.getTypeReference())
}
override fun visitDelegationSpecifierList(list: JetDelegationSpecifierList, data: Unit?): String? {
return renderChildren(list, ", ")
}
override fun visitTypeParameterList(list: JetTypeParameterList, data: Unit?): String? {
return renderChildren(list, ", ", "<", ">")
}
override fun visitDotQualifiedExpression(expression: JetDotQualifiedExpression, data: Unit?): String? {
return renderChildren(expression, ".")
}
override fun visitInitializerList(list: JetInitializerList, data: Unit?): String? {
return renderChildren(list, ", ")
}
override fun visitParameterList(list: JetParameterList, data: Unit?): String? {
return renderChildren(list, ", ", "(", ")")
}
override fun visitEnumEntry(enumEntry: JetEnumEntry, data: Unit?): String? {
return buildText {
append("STUB: ")
appendInn(enumEntry.getModifierList(), suffix = " ")
append("enum entry ")
appendInn(enumEntry.getNameAsName())
appendInn(enumEntry.getInitializerList(), prefix = " : ")
}
}
override fun visitFunctionType(functionType: JetFunctionType, data: Unit?): String? {
return buildText {
appendInn(functionType.getReceiverTypeRef(), suffix = ".")
appendInn(functionType.getParameterList())
appendInn(functionType.getReturnTypeRef(), prefix = " -> ")
}
}
override fun visitTypeParameter(parameter: JetTypeParameter, data: Unit?): String? {
return buildText {
appendInn(parameter.getModifierList(), suffix = " ")
appendInn(parameter.getNameAsName())
appendInn(parameter.getExtendsBound(), prefix = " : ")
}
}
override fun visitTypeProjection(typeProjection: JetTypeProjection, data: Unit?): String? {
return buildText {
val token = typeProjection.getProjectionKind().getToken()
appendInn(token?.getValue())
val typeReference = typeProjection.getTypeReference()
if (token != null && typeReference != null) {
append(" ")
}
appendInn(typeReference)
}
}
override fun visitModifierList(list: JetModifierList, data: Unit?): String? {
return buildText {
var first = true
for (modifierKeywordToken in JetTokens.MODIFIER_KEYWORDS_ARRAY) {
if (list.hasModifier(modifierKeywordToken)) {
if (!first) {
append(" ")
}
append(modifierKeywordToken.getValue())
first = false
}
}
}
}
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression, data: Unit?): String? {
return expression.getReferencedName()
}
override fun visitNullableType(nullableType: JetNullableType, data: Unit?): String? {
return renderChildren(nullableType, "", "", "?")
}
override fun visitAnonymousInitializer(initializer: JetClassInitializer, data: Unit?): String? {
val containingDeclaration = JetStubbedPsiUtil.getContainingDeclaration(initializer)
return "initializer in " + (containingDeclaration?.getDebugText() ?: "...")
}
override fun visitClassObject(classObject: JetClassObject, data: Unit?): String? {
val containingDeclaration = JetStubbedPsiUtil.getContainingDeclaration(classObject)
return "class object in " + (containingDeclaration?.getDebugText() ?: "...")
}
override fun visitClassBody(classBody: JetClassBody, data: Unit?): String? {
val containingDeclaration = JetStubbedPsiUtil.getContainingDeclaration(classBody)
return "class body for " + (containingDeclaration?.getDebugText() ?: "...")
}
override fun visitPropertyAccessor(accessor: JetPropertyAccessor, data: Unit?): String? {
val containingProperty = JetStubbedPsiUtil.getContainingDeclaration(accessor, javaClass<JetProperty>())
val what = (if (accessor.isGetter()) "getter" else "setter")
return what + " for " + (if (containingProperty != null) containingProperty.getDebugText() else "...")
}
override fun visitClass(klass: JetClass, data: Unit?): String? {
return buildText {
append("STUB: ")
appendInn(klass.getModifierList(), suffix = " ")
append("class ")
appendInn(klass.getNameAsName())
appendInn(klass.getTypeParameterList())
appendInn(klass.getPrimaryConstructorModifierList(), prefix = " ", suffix = " ")
appendInn(klass.getPrimaryConstructorParameterList())
appendInn(klass.getDelegationSpecifierList(), prefix = " : ")
}
}
override fun visitNamedFunction(function: JetNamedFunction, data: Unit?): String? {
return buildText {
append("STUB: ")
appendInn(function.getModifierList(), suffix = " ")
append("fun ")
val typeParameterList = function.getTypeParameterList()
if (function.hasTypeParameterListBeforeFunctionName()) {
appendInn(typeParameterList, suffix = " ")
}
appendInn(function.getReceiverTypeRef(), suffix = ".")
appendInn(function.getNameAsName())
if (!function.hasTypeParameterListBeforeFunctionName()) {
appendInn(typeParameterList)
}
appendInn(function.getValueParameterList())
appendInn(function.getReturnTypeRef(), prefix = ": ")
appendInn(function.getTypeConstraintList(), prefix = " ")
}
}
override fun visitObjectDeclaration(declaration: JetObjectDeclaration, data: Unit?): String? {
return buildText {
append("STUB: ")
appendInn(declaration.getModifierList(), suffix = " ")
append("object ")
appendInn(declaration.getNameAsName())
appendInn(declaration.getDelegationSpecifierList(), prefix = " : ")
}
}
override fun visitParameter(parameter: JetParameter, data: Unit?): String? {
return buildText {
if (parameter.hasValOrVarNode()) {
if (parameter.isMutable()) append("var ") else append("val ")
}
val name = parameter.getNameAsName()
appendInn(name)
val typeReference = parameter.getTypeReference()
if (typeReference != null && name != null) {
append(": ")
}
appendInn(typeReference)
}
}
override fun visitProperty(property: JetProperty, data: Unit?): String? {
return buildText {
append("STUB: ")
appendInn(property.getModifierList(), suffix = " ")
append(if (property.isVar()) "var " else "val ")
appendInn(property.getNameAsName())
appendInn(property.getTypeRef(), prefix = ": ")
}
}
override fun visitTypeConstraint(constraint: JetTypeConstraint, data: Unit?): String? {
return buildText {
if (constraint.isClassObjectConstraint()) {
append("class object ")
}
appendInn(constraint.getSubjectTypeParameterName())
appendInn(constraint.getBoundTypeReference(), prefix = " : ")
}
}
fun buildText(body: StringBuilder.() -> Unit): String? {
val sb = StringBuilder()
sb.body()
return sb.toString()
}
fun renderChildren(element: JetElementImplStub<*>, separator: String, prefix: String = "", postfix: String = ""): String? {
val childrenTexts = element.getStub()?.getChildrenStubs()?.map { (it?.getPsi() as? JetElement)?.getDebugText() }
return childrenTexts?.filterNotNull()?.makeString(separator, prefix, postfix) ?: element.getText()
}
fun render(element: JetElementImplStub<*>, vararg relevantChildren: JetElement?): String? {
if (element.getStub() == null) return element.getText()
return relevantChildren.filterNotNull().map { it.getDebugText() }.makeString("", "", "")
}
}
private fun StringBuilder.appendInn(target: Any?, prefix: String = "", suffix: String = "") {
if (target == null) return
append(prefix)
append(when (target) {
is JetElement -> target.getDebugText()
else -> target.toString()
})
append(suffix)
}
@@ -21,7 +21,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
@@ -63,13 +63,18 @@ public class JetEnumEntry extends JetClass {
@NotNull
@Override
public List<JetDelegationSpecifier> getDelegationSpecifiers() {
JetInitializerList initializerList = getStubOrPsiChild(JetStubElementTypes.INITIALIZER_LIST);
JetInitializerList initializerList = getInitializerList();
if (initializerList == null) {
return Collections.emptyList();
}
return initializerList.getInitializers();
}
@Nullable
public JetInitializerList getInitializerList() {
return getStubOrPsiChild(JetStubElementTypes.INITIALIZER_LIST);
}
@Override
public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
return visitor.visitEnumEntry(this, data);
@@ -41,7 +41,7 @@ abstract class JetTypeParameterListOwnerStub<T extends PsiJetStubWithFqName> ext
}
@Nullable
JetTypeConstraintList getTypeConstraintList() {
public JetTypeConstraintList getTypeConstraintList() {
return getStubOrPsiChild(JetStubElementTypes.TYPE_CONSTRAINT_LIST);
}
@@ -0,0 +1,226 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.plugin.stubs
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.stubs.elements.JetFileStubBuilder
import com.intellij.psi.stubs.StubElement
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes
import org.junit.Assert
import org.jetbrains.jet.lang.psi.JetPackageDirective
import org.jetbrains.jet.lang.psi.stubs.PsiJetPlaceHolderStub
import org.jetbrains.jet.lang.psi.JetImportList
import org.jetbrains.jet.lang.psi.JetNamedFunction
import org.jetbrains.jet.lang.psi.stubs.PsiJetFunctionStub
import org.jetbrains.jet.lang.psi.JetTypeReference
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub
import org.jetbrains.jet.lang.psi.JetClass
import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub
import org.jetbrains.jet.lang.psi.JetObjectDeclaration
import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.stubs.PsiJetPropertyStub
import kotlin.test.assertEquals
import org.jetbrains.jet.lang.psi.JetClassBody
import org.jetbrains.jet.lang.psi.JetClassInitializer
import org.jetbrains.jet.lang.psi.JetClassObject
import org.jetbrains.jet.lang.psi.debugText.getDebugText
public class DebugTextByStubTest : LightCodeInsightFixtureTestCase() {
private fun createFileAndStubTree(text: String): Pair<JetFile, StubElement<*>> {
val file = myFixture.configureByText("test.kt", text) as JetFile
val stub = JetFileStubBuilder().buildStubTree(file)!!
return Pair(file, stub)
}
private fun createStubTree(text: String) = createFileAndStubTree(text).second
fun packageDirective(text: String) {
val (file, tree) = createFileAndStubTree(text)
val packageDirective = tree.findChildStubByType(JetStubElementTypes.PACKAGE_DIRECTIVE)
val psi = JetPackageDirective(packageDirective as PsiJetPlaceHolderStub)
Assert.assertEquals(file.getPackageDirective()!!.getText(), psi.getDebugText())
}
fun function(text: String) {
val (file, tree) = createFileAndStubTree(text)
val function = tree.findChildStubByType(JetStubElementTypes.FUNCTION)
val psi = JetNamedFunction(function as PsiJetFunctionStub)
Assert.assertEquals("STUB: " + file.findChildByClass(javaClass<JetNamedFunction>())!!.getText(), psi.getDebugText())
}
fun typeReference(text: String) {
val (file, tree) = createFileAndStubTree("fun foo(i: $text)")
val function = tree.findChildStubByType(JetStubElementTypes.FUNCTION)!!
val parameterList = function.findChildStubByType(JetStubElementTypes.VALUE_PARAMETER_LIST)!!
val valueParameter = parameterList.findChildStubByType(JetStubElementTypes.VALUE_PARAMETER)!!
val typeReferenceStub = valueParameter.findChildStubByType(JetStubElementTypes.TYPE_REFERENCE)
val psiFromStub = JetTypeReference(typeReferenceStub as PsiJetPlaceHolderStub)
val typeReferenceByPsi = file.findChildByClass(javaClass<JetNamedFunction>())!!.getValueParameters()[0].getTypeReference()
Assert.assertEquals(typeReferenceByPsi!!.getText(), psiFromStub.getDebugText())
}
fun clazz(text: String, expectedText: String? = null) {
val (file, tree) = createFileAndStubTree(text)
val clazz = tree.findChildStubByType(JetStubElementTypes.CLASS)!!
val psiFromStub = JetClass(clazz as PsiJetClassStub)
val classByPsi = file.findChildByClass(javaClass<JetClass>())
val toCheckAgainst = "STUB: " + (expectedText ?: classByPsi!!.getText())
Assert.assertEquals(toCheckAgainst, psiFromStub.getDebugText())
if (expectedText != null) {
Assert.assertNotEquals("Expected text should not be specified", classByPsi.getDebugText(), psiFromStub.getDebugText())
}
}
fun obj(text: String, expectedText: String? = null) {
val (file, tree) = createFileAndStubTree(text)
val obj = tree.findChildStubByType(JetStubElementTypes.OBJECT_DECLARATION)!!
val psiFromStub = JetObjectDeclaration(obj as PsiJetObjectStub)
val objectByPsi = file.findChildByClass(javaClass<JetObjectDeclaration>())
val toCheckAgainst = "STUB: " + (expectedText ?: objectByPsi!!.getText())
Assert.assertEquals(toCheckAgainst, psiFromStub.getDebugText())
}
fun property(text: String, expectedText: String? = null) {
val (file, tree) = createFileAndStubTree(text)
val property = tree.findChildStubByType(JetStubElementTypes.PROPERTY)!!
val psiFromStub = JetProperty(property as PsiJetPropertyStub)
val propertyByPsi = file.findChildByClass(javaClass<JetProperty>())
val toCheckAgainst = "STUB: " + (expectedText ?: propertyByPsi!!.getText())
Assert.assertEquals(toCheckAgainst, psiFromStub.getDebugText())
}
fun importList(text: String) {
val (file, tree) = createFileAndStubTree(text)
val importList = tree.findChildStubByType(JetStubElementTypes.IMPORT_LIST)
val psi = JetImportList(importList as PsiJetPlaceHolderStub)
Assert.assertEquals(file.getImportList()!!.getText(), psi.getDebugText())
}
fun testPackageDirective() {
packageDirective("package a.b.c")
packageDirective("")
packageDirective("package b")
}
fun testImportList() {
importList("import a\nimport b.c.d")
importList("import a.*")
importList("import a.c as Alias")
}
fun testFunction() {
function("fun foo()")
function("fun <T> foo()")
function("fun foo<T>()")
function("fun foo<T, G>()")
function("fun foo(a: Int, b: String)")
function("fun Int.foo()")
function("fun foo(): String")
function("fun <T> T.foo(b: T): List<T>")
function("fun <T, G> f() where T : G")
function("fun <T, G> f() where T : G, G : T")
function("fun <T, G> f() where class object T : G")
function("private final fun f()")
}
fun testTypeReference() {
typeReference("T")
typeReference("T<G>")
typeReference("T<G, H>")
typeReference("T<in G>")
typeReference("T<out G>")
typeReference("T<*>")
typeReference("T<*, in G>")
typeReference("T?")
typeReference("T<G?>")
typeReference("() -> T")
typeReference("(G?, H) -> T?")
typeReference("L.(G?, H) -> T?")
typeReference("L?.(G?, H) -> T?")
}
fun testClass() {
clazz("class A")
clazz("open private class A")
clazz("public class private A")
clazz("class A()")
clazz("class A() : B()", expectedText = "class A() : B")
clazz("class A() : B<T>")
clazz("class A() : B(), C()", expectedText = "class A() : B, C")
clazz("class A() : B by g", expectedText = "class A() : B")
clazz("class A() : B by g, C(), T", expectedText = "class A() : B, C, T")
clazz("class A(i: Int, g: String)")
clazz("class A(val i: Int, var g: String)")
}
fun testObject() {
obj("object Foo")
obj("public final object Foo")
obj("object Foo : A()", expectedText = "object Foo : A")
obj("object Foo : A by foo", expectedText = "object Foo : A")
obj("object Foo : A, T, C by g, B()", expectedText = "object Foo : A, T, C, B")
}
fun testProperty() {
property("val c: Int")
property("var c: Int")
property("var : Int")
property("private final var c: Int")
property("val g")
property("val g = 3", expectedText = "val g")
property("val g by z", expectedText = "val g")
property("val g: Int by z", expectedText = "val g: Int")
}
fun testClassBody() {
val tree = createStubTree("class A {\n {} fun f(): Int val c: Int}")
val classBody = tree.findChildStubByType(JetStubElementTypes.CLASS)!!.findChildStubByType(JetStubElementTypes.CLASS_BODY)
assertEquals("class body for STUB: class A", JetClassBody(classBody as PsiJetPlaceHolderStub).getDebugText())
}
fun testClassInitializer() {
val tree = createStubTree("class A {\n {} }")
val initializer = tree.findChildStubByType(JetStubElementTypes.CLASS)!!.findChildStubByType(JetStubElementTypes.CLASS_BODY)!!
.findChildStubByType(JetStubElementTypes.ANONYMOUS_INITIALIZER)
assertEquals("initializer in STUB: class A", JetClassInitializer(initializer as PsiJetPlaceHolderStub).getDebugText())
}
fun testClassObject() {
val tree = createStubTree("class A { class object {} }")
val classObject = tree.findChildStubByType(JetStubElementTypes.CLASS)!!.findChildStubByType(JetStubElementTypes.CLASS_BODY)!!
.findChildStubByType(JetStubElementTypes.CLASS_OBJECT)
assertEquals("class object in STUB: class A", JetClassObject(classObject as PsiJetPlaceHolderStub).getDebugText())
}
fun testPropertyAccessors() {
val tree = createStubTree("var c: Int\nget() = 3\nset(i: Int) {}")
val propertyStub = tree.findChildStubByType(JetStubElementTypes.PROPERTY)!!
val accessors = propertyStub.getChildrenByType(JetStubElementTypes.PROPERTY_ACCESSOR, JetStubElementTypes.PROPERTY_ACCESSOR.getArrayFactory())!!
assertEquals("getter for STUB: var c: Int", accessors[0].getDebugText())
assertEquals("setter for STUB: var c: Int", accessors[1].getDebugText())
}
fun testEnumEntry() {
val tree = createStubTree("enum class Enum { E1 E2: Enum() E3: Enum(1, 2)}")
val enumClass = tree.findChildStubByType(JetStubElementTypes.CLASS)!!.findChildStubByType(JetStubElementTypes.CLASS_BODY)!!
val entries = enumClass.getChildrenByType(JetStubElementTypes.ENUM_ENTRY, JetStubElementTypes.ENUM_ENTRY.getArrayFactory())!!
assertEquals("STUB: enum entry E1", entries[0].getDebugText())
assertEquals("STUB: enum entry E2 : Enum", entries[1].getDebugText())
assertEquals("STUB: enum entry E3 : Enum", entries[2].getDebugText())
}
}