Psi: Introduce KtScriptInitializer, a separate entity for script initializers which are quite a bit different from class initializers

This commit is contained in:
Pavel V. Talanov
2015-11-19 15:32:44 +03:00
parent 321364102a
commit dbd49c37c1
28 changed files with 93 additions and 63 deletions
@@ -35,7 +35,8 @@ public interface KtNodeTypes {
IElementType OBJECT_DECLARATION = KtStubElementTypes.OBJECT_DECLARATION;
IElementType ENUM_ENTRY = KtStubElementTypes.ENUM_ENTRY;
IElementType ANONYMOUS_INITIALIZER = KtStubElementTypes.ANONYMOUS_INITIALIZER;
IElementType CLASS_INITIALIZER = KtStubElementTypes.CLASS_INITIALIZER;
IElementType SCRIPT_INITIALIZER = new KtNodeType("SCRIPT_INITIALIZER", KtScriptInitializer.class);
IElementType SECONDARY_CONSTRUCTOR = KtStubElementTypes.SECONDARY_CONSTRUCTOR;
IElementType PRIMARY_CONSTRUCTOR = KtStubElementTypes.PRIMARY_CONSTRUCTOR;
@@ -1230,7 +1230,7 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing {
else if (isScriptTopLevel){
PsiBuilder.Marker scriptInitializer = mark();
parseExpression();
scriptInitializer.done(ANONYMOUS_INITIALIZER);
scriptInitializer.done(SCRIPT_INITIALIZER);
}
else {
parseExpression();
@@ -1083,7 +1083,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
else {
mark().error("Expecting '{' after 'init'");
}
declType = ANONYMOUS_INITIALIZER;
declType = CLASS_INITIALIZER;
}
else if (at(CONSTRUCTOR_KEYWORD)) {
parseSecondaryConstructor();
@@ -18,40 +18,39 @@ package org.jetbrains.kotlin.psi
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.utils.sure
interface KtAnonymousInitializer : KtDeclaration, KtStatementExpression {
val containingDeclaration: KtDeclaration
val body: KtExpression?
}
class KtClassInitializer : KtDeclarationStub<KotlinPlaceHolderStub<KtClassInitializer>>, KtAnonymousInitializer {
constructor(node: ASTNode) : super(node)
constructor(stub: KotlinPlaceHolderStub<KtClassInitializer>) : super(stub, KtStubElementTypes.ANONYMOUS_INITIALIZER)
constructor(stub: KotlinPlaceHolderStub<KtClassInitializer>) : super(stub, KtStubElementTypes.CLASS_INITIALIZER)
override fun <R, D> accept(visitor: KtVisitor<R, D>, data: D) = visitor.visitAnonymousInitializer(this, data)
override fun <R, D> accept(visitor: KtVisitor<R, D>, data: D) = visitor.visitClassInitializer(this, data)
override val body: KtExpression?
get() = findChildByClass(KtExpression::class.java)
override val openBraceNode: PsiElement?
get() {
val body = body
return if (body is KtBlockExpression) body.lBrace else null
}
val openBraceNode: PsiElement?
get() = (body as? KtBlockExpression)?.lBrace
override val containingDeclaration: KtDeclaration
get() {
val classOrObject = PsiTreeUtil.getParentOfType(this, KtClassOrObject::class.java, true)
if (classOrObject != null) {
return classOrObject
}
val type = PsiTreeUtil.getParentOfType(this, KtScript::class.java, true)
return type.sure { "Should only be present in class, object or script" }
}
get() = getParentOfType<KtClassOrObject>(true).sure { "Should only be present in class or object" }
}
public interface KtAnonymousInitializer : KtDeclaration, KtStatementExpression {
val containingDeclaration: KtDeclaration
val body: KtExpression?
val openBraceNode: PsiElement?
class KtScriptInitializer(node: ASTNode) : KtDeclarationImpl(node), KtAnonymousInitializer {
override val body: KtExpression?
get() = findChildByClass(KtExpression::class.java)
override val containingDeclaration: KtDeclaration
get() = getParentOfType<KtScript>(true).sure { "Should only be present in script" }
override fun <R, D> accept(visitor: KtVisitor<R, D>, data: D) = visitor.visitScriptInitializer(this, data)
}
@@ -38,7 +38,7 @@ class KtClassBody : KtElementImplStub<KotlinPlaceHolderStub<KtClassBody>>, KtDec
override fun <R, D> accept(visitor: KtVisitor<R, D>, data: D) = visitor.visitClassBody(this, data)
val anonymousInitializers: List<KtAnonymousInitializer>
get() = findChildrenByType(KtNodeTypes.ANONYMOUS_INITIALIZER)
get() = findChildrenByType(KtNodeTypes.CLASS_INITIALIZER)
internal val secondaryConstructors: List<KtSecondaryConstructor>
get() = getStubOrPsiChildrenAsList(KtStubElementTypes.SECONDARY_CONSTRUCTOR)
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.psi.findDocComment.FindDocCommentKt;
import java.util.Collections;
import java.util.List;
abstract class KtDeclarationImpl extends KtExpressionImpl implements KtDeclaration {
public abstract class KtDeclarationImpl extends KtExpressionImpl implements KtDeclaration {
public KtDeclarationImpl(@NotNull ASTNode node) {
super(node);
}
@@ -342,6 +342,14 @@ public class KtVisitor<R, D> extends PsiElementVisitor {
return visitDeclaration(initializer, data);
}
public R visitScriptInitializer(@NotNull KtScriptInitializer initializer, D data) {
return visitAnonymousInitializer(initializer, data);
}
public R visitClassInitializer(@NotNull KtClassInitializer initializer, D data) {
return visitAnonymousInitializer(initializer, data);
}
public R visitPropertyAccessor(@NotNull KtPropertyAccessor accessor, D data) {
return visitDeclaration(accessor, data);
}
@@ -329,6 +329,14 @@ public class KtVisitorVoid extends KtVisitor<Void, Void> {
super.visitAnonymousInitializer(initializer, null);
}
public void visitScriptInitializer(@NotNull KtScriptInitializer initializer) {
super.visitScriptInitializer(initializer, null);
}
public void visitClassInitializer(@NotNull KtClassInitializer initializer) {
super.visitClassInitializer(initializer, null);
}
public void visitPropertyAccessor(@NotNull KtPropertyAccessor accessor) {
super.visitPropertyAccessor(accessor, null);
}
@@ -1043,4 +1051,16 @@ public class KtVisitorVoid extends KtVisitor<Void, Void> {
visitPackageDirective(directive);
return null;
}
@Override
public Void visitScriptInitializer(@NotNull KtScriptInitializer initializer, Void data) {
visitScriptInitializer(initializer);
return null;
}
@Override
public Void visitClassInitializer(@NotNull KtClassInitializer initializer, Void data) {
visitClassInitializer(initializer);
return null;
}
}
@@ -31,8 +31,8 @@ public interface KtStubElementTypes {
KtClassElementType ENUM_ENTRY = new KtClassElementType("ENUM_ENTRY");
KtObjectElementType OBJECT_DECLARATION = new KtObjectElementType("OBJECT_DECLARATION");
KtPlaceHolderStubElementType<KtClassInitializer> ANONYMOUS_INITIALIZER =
new KtPlaceHolderStubElementType<KtClassInitializer>("ANONYMOUS_INITIALIZER", KtClassInitializer.class);
KtPlaceHolderStubElementType<KtClassInitializer> CLASS_INITIALIZER =
new KtPlaceHolderStubElementType<KtClassInitializer>("CLASS_INITIALIZER", KtClassInitializer.class);
KtPlaceHolderStubElementType<KtSecondaryConstructor> SECONDARY_CONSTRUCTOR =
new KtPlaceHolderStubElementType<KtSecondaryConstructor>("SECONDARY_CONSTRUCTOR", KtSecondaryConstructor.class);
KtPlaceHolderStubElementType<KtPrimaryConstructor> PRIMARY_CONSTRUCTOR =
@@ -119,7 +119,7 @@ public interface KtStubElementTypes {
KtScriptElementType SCRIPT = new KtScriptElementType("SCRIPT");
TokenSet DECLARATION_TYPES =
TokenSet.create(CLASS, OBJECT_DECLARATION, FUNCTION, PROPERTY, ANONYMOUS_INITIALIZER, SECONDARY_CONSTRUCTOR, ENUM_ENTRY);
TokenSet.create(CLASS, OBJECT_DECLARATION, FUNCTION, PROPERTY, CLASS_INITIALIZER, SECONDARY_CONSTRUCTOR, ENUM_ENTRY);
TokenSet DELEGATION_SPECIFIER_TYPES = TokenSet.create(DELEGATOR_BY, DELEGATOR_SUPER_CALL, DELEGATOR_SUPER_CLASS);
+1 -1
View File
@@ -11,7 +11,7 @@ JetFile: AnonymousInitializer.kt
CLASS_BODY
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
+2 -2
View File
@@ -124,7 +124,7 @@ JetFile: PropertiesFollowedByInitializers.kt
PROPERTY_ACCESSOR
PsiElement(get)('get')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
@@ -180,7 +180,7 @@ JetFile: PropertiesFollowedByInitializers.kt
PsiElement(get)('get')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace(' ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
+1 -1
View File
@@ -613,7 +613,7 @@ JetFile: ShortAnnotations.kt
PsiErrorElement:Expecting member declaration
PsiElement(IDENTIFIER)('zoo')
PsiWhiteSpace(' ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
+1 -1
View File
@@ -435,7 +435,7 @@ JetFile: validDeclarations.kt
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
MODIFIER_LIST
ANNOTATION_ENTRY
PsiElement(AT)('@')
+1 -1
View File
@@ -1808,7 +1808,7 @@ JetFile: BinaryTree.kt
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('TreeNode')
PsiWhiteSpace('\n\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
+6 -6
View File
@@ -11,7 +11,7 @@ JetFile: initRecovery.kt
CLASS_BODY
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiErrorElement:Expecting '{' after 'init'
<empty list>
@@ -26,7 +26,7 @@ JetFile: initRecovery.kt
CLASS_BODY
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
MODIFIER_LIST
ANNOTATION_ENTRY
PsiElement(AT)('@')
@@ -50,7 +50,7 @@ JetFile: initRecovery.kt
INTEGER_CONSTANT
PsiElement(INTEGER_LITERAL)('1')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiErrorElement:Expecting '{' after 'init'
<empty list>
@@ -67,17 +67,17 @@ JetFile: initRecovery.kt
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiErrorElement:Expecting '{' after 'init'
<empty list>
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiErrorElement:Expecting '{' after 'init'
<empty list>
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
+2 -2
View File
@@ -58,7 +58,7 @@ JetFile: ComplexScript.kts
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
IF
PsiElement(if)('if')
PsiWhiteSpace(' ')
@@ -98,7 +98,7 @@ JetFile: ComplexScript.kts
PsiWhiteSpace('\n')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n')
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
FOR
PsiElement(for)('for')
PsiWhiteSpace(' ')
+1 -1
View File
@@ -7,7 +7,7 @@ JetFile: Shebang.kts
PsiWhiteSpace('\n\n')
SCRIPT
BLOCK
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
+2 -2
View File
@@ -5,7 +5,7 @@ JetFile: ShebangIncorrect.kts
<empty list>
SCRIPT
BLOCK
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
@@ -19,7 +19,7 @@ JetFile: ShebangIncorrect.kts
PsiWhiteSpace(' ')
PsiErrorElement:Expecting an element
PsiElement(HASH)('#')
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
BINARY_EXPRESSION
PREFIX_EXPRESSION
OPERATION_REFERENCE
+1 -1
View File
@@ -5,7 +5,7 @@ JetFile: SimpleScript.kts
<empty list>
SCRIPT
BLOCK
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
+1 -1
View File
@@ -5,7 +5,7 @@ JetFile: unexpectedSymbol.kts
<empty list>
SCRIPT
BLOCK
ANONYMOUS_INITIALIZER
SCRIPT_INITIALIZER
CALL_EXPRESSION
REFERENCE_EXPRESSION
PsiElement(IDENTIFIER)('println')
@@ -11,14 +11,14 @@ JetFile: anonymousInitializer.kt
CLASS_BODY
PsiElement(LBRACE)('{')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
MODIFIER_LIST
PsiElement(private)('private')
PsiWhiteSpace(' ')
@@ -42,7 +42,7 @@ JetFile: anonymousInitializer.kt
PsiElement(LPAR)('(')
PsiElement(RPAR)(')')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
@@ -93,7 +93,7 @@ JetFile: enumParsing.kt
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
@@ -126,7 +126,7 @@ JetFile: enumParsing.kt
PsiElement(LBRACE)('{')
PsiElement(RBRACE)('}')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
+2 -2
View File
@@ -96,7 +96,7 @@ JetFile: semicolonBetweenDeclarations.kt
PsiElement(RPAR)(')')
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiWhiteSpace(' ')
BLOCK
@@ -162,7 +162,7 @@ JetFile: semicolonBetweenDeclarations.kt
<empty list>
PsiElement(SEMICOLON)(';')
PsiWhiteSpace('\n ')
ANONYMOUS_INITIALIZER
CLASS_INITIALIZER
PsiElement(init)('init')
PsiErrorElement:Expecting '{' after 'init'
<empty list>
@@ -21,7 +21,9 @@ import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -87,7 +89,7 @@ public class KotlinDeclarationMover extends AbstractKotlinUpDownMover {
declaration.accept(
new KtVisitorVoid() {
@Override
public void visitAnonymousInitializer(@NotNull KtAnonymousInitializer initializer) {
public void visitClassInitializer(@NotNull KtClassInitializer initializer) {
PsiElement brace = initializer.getOpenBraceNode();
if (brace != null) {
memberSuspects.add(brace);
@@ -49,7 +49,7 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder {
return rules(settings) {
val DECLARATIONS =
TokenSet.create(PROPERTY, FUN, CLASS, OBJECT_DECLARATION, ENUM_ENTRY, SECONDARY_CONSTRUCTOR, ANONYMOUS_INITIALIZER)
TokenSet.create(PROPERTY, FUN, CLASS, OBJECT_DECLARATION, ENUM_ENTRY, SECONDARY_CONSTRUCTOR, CLASS_INITIALIZER)
custom {
inPosition(left = CLASS, right = CLASS).emptyLinesIfLineBreakInLeft(1)
@@ -102,7 +102,7 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder {
between(OBJECT_DECLARATION, DECLARATIONS).blankLines(1)
between(SECONDARY_CONSTRUCTOR, DECLARATIONS).blankLines(1)
between(ANONYMOUS_INITIALIZER, DECLARATIONS).blankLines(1)
between(CLASS_INITIALIZER, DECLARATIONS).blankLines(1)
// ENUM_ENTRY - ENUM_ENTRY is exception
between(ENUM_ENTRY, DECLARATIONS).blankLines(1)
@@ -292,7 +292,7 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder {
inPosition(parent = FUN, right = BLOCK).customRule(leftBraceRule())
inPosition(parent = SECONDARY_CONSTRUCTOR, right = BLOCK).customRule(leftBraceRule())
inPosition(parent = ANONYMOUS_INITIALIZER, right = BLOCK).customRule(leftBraceRule())
inPosition(parent = CLASS_INITIALIZER, right = BLOCK).customRule(leftBraceRule())
inPosition(parent = PROPERTY_ACCESSOR, right = BLOCK).customRule(leftBraceRule())
inPosition(right = CLASS_BODY).customRule(leftBraceRule(blockType = CLASS_BODY))
+1 -1
View File
@@ -6,6 +6,6 @@ PsiJetFileStubImpl[package=]
VALUE_PARAMETER_LIST:
CLASS_BODY:
PROPERTY:[fqName=Test.test, hasDelegate=false, hasDelegateExpression=false, hasInitializer=true, hasReturnTypeRef=false, isExtension=false, isTopLevel=false, isVar=false, name=test]
ANONYMOUS_INITIALIZER:
CLASS_INITIALIZER:
FUN:[fqName=Test.more, hasBlockBody=true, hasBody=true, hasTypeParameterListBeforeFunctionName=false, isExtension=false, isTopLevel=false, name=more]
VALUE_PARAMETER_LIST:
+2 -2
View File
@@ -10,7 +10,7 @@ PsiJetFileStubImpl[package=test]
USER_TYPE:[isAbsoluteInRootPackage=false]
REFERENCE_EXPRESSION:[referencedName=Boolean]
CLASS_BODY:
ANONYMOUS_INITIALIZER:
CLASS_INITIALIZER:
SECONDARY_CONSTRUCTOR:
MODIFIER_LIST:[]
ANNOTATION_ENTRY:[hasValueArguments=false, shortName=anno]
@@ -23,7 +23,7 @@ PsiJetFileStubImpl[package=test]
TYPE_REFERENCE:
USER_TYPE:[isAbsoluteInRootPackage=false]
REFERENCE_EXPRESSION:[referencedName=String]
ANONYMOUS_INITIALIZER:
CLASS_INITIALIZER:
SECONDARY_CONSTRUCTOR:
MODIFIER_LIST:[private]
VALUE_PARAMETER_LIST:
@@ -194,7 +194,7 @@ public class DebugTextByStubTest : LightCodeInsightFixtureTestCase() {
fun testClassInitializer() {
val tree = createStubTree("class A {\n init {} }")
val initializer = tree.findChildStubByType(KtStubElementTypes.CLASS)!!.findChildStubByType(KtStubElementTypes.CLASS_BODY)!!
.findChildStubByType(KtStubElementTypes.ANONYMOUS_INITIALIZER)
.findChildStubByType(KtStubElementTypes.CLASS_INITIALIZER)
assertEquals("initializer in STUB: class A", KtClassInitializer(initializer as KotlinPlaceHolderStub).getDebugText())
}