From 2f1a8831b2ad02b38fe05dc23ddda4330316a858 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 14 Nov 2018 17:14:49 +0300 Subject: [PATCH] New J2K: Add basic annotations support --- .../jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt | 3 ++- .../org/jetbrains/kotlin/j2k/NewCodeBuilder.kt | 15 +++++++++++++++ .../JavaMethodToKotlinFunctionConversion.kt | 3 ++- .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 4 +++- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 14 ++++++++++++-- .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 7 ++++++- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt | 16 ++++++++++++++-- .../kotlin/j2k/tree/visitors/JKVisitor.kt | 5 ++++- .../kotlin/j2k/tree/visitors/JKVisitorVoid.kt | 14 ++++++++++---- 9 files changed, 68 insertions(+), 13 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt index 94abc952196..a818d37d13e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/JavaToJKTreeBuilder.kt @@ -304,7 +304,8 @@ class JavaToJKTreeBuilder(var symbolProvider: JKSymbolProvider) { JKNameIdentifierImpl(name), parameterList.parameters.map { it.toJK() }, body?.toJK() ?: JKBodyStub, - typeParameterList?.toJK() ?: JKTypeParameterListImpl() + typeParameterList?.toJK() ?: JKTypeParameterListImpl(), + JKAnnotationListImpl()//TODO get real annotations ).also { it.psi = this symbolProvider.provideUniverseSymbol(this, it) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt index 457f697a2e2..b2c25540928 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/NewCodeBuilder.kt @@ -311,6 +311,10 @@ class NewCodeBuilder { override fun visitKtFunction(ktFunction: JKKtFunction) { printer.printIndent() + if (ktFunction.annotationList.annotations.isNotEmpty()) { + ktFunction.annotationList.accept(this) + printer.printlnWithNoIndent(" ") + } ktFunction.modifierList.accept(this) printer.printWithNoIndent(" fun ") ktFunction.typeParameterList.accept(this) @@ -714,6 +718,17 @@ class NewCodeBuilder { } } + override fun visitAnnotationList(annotationList: JKAnnotationList) { + renderList(annotationList.annotations, " ") { + it.accept(this) + } + } + + override fun visitAnnotation(annotation: JKAnnotation) { + printer.printWithNoIndent("@") + annotation.name.accept(this) + } + override fun visitKtWhenCase(ktWhenCase: JKKtWhenCase) { renderList(ktWhenCase.labels, ", ") { it.accept(this) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt index bd9fb1e3c79..23eb2ceb18f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt @@ -37,7 +37,8 @@ class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { it.parameters, it.block, it.modifierList, - it.typeParameterList + it.typeParameterList, + it.annotationList ) } else { it diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 0153803a691..341fe81aa99 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -43,7 +43,8 @@ class JKJavaMethodImpl( name: JKNameIdentifier, parameters: List, block: JKBlock, - typeParameterList: JKTypeParameterList + typeParameterList: JKTypeParameterList, + annotationList: JKAnnotationList ) : JKJavaMethod, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaMethod(this, data) @@ -53,6 +54,7 @@ class JKJavaMethodImpl( override var parameters: List by children(parameters) override var block: JKBlock by child(block) override var typeParameterList: JKTypeParameterList by child(typeParameterList) + override var annotationList: JKAnnotationList by child(annotationList) } class JKJavaLiteralExpressionImpl( diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index a44ef60ad9c..4bf8ceec1e0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -273,7 +273,7 @@ class JKLocalVariableImpl(modifierList: JKModifierList, type: JKTypeElement, nam override var modifierList by child(modifierList) override var initializer by child(initializer) override var name by child(name) - override val type by child(type) + override var type by child(type) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitLocalVariable(this, data) } @@ -478,7 +478,7 @@ class JKEnumConstantImpl( ) : JKEnumConstant, JKBranchElementBase(), PsiOwner by PsiOwnerImpl() { override var name: JKNameIdentifier by child(name) override val arguments: JKExpressionList by child(arguments) - override val type: JKTypeElement by child(type) + override var type: JKTypeElement by child(type) override var initializer: JKExpression by child(JKStubExpressionImpl()) override var modifierList: JKModifierList by child(modifierList) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitEnumConstant(this, data) @@ -506,4 +506,14 @@ fun JKStatement.isEmpty(): Boolean = class JKPackageDeclarationImpl(packageName: JKNameIdentifier) : JKPackageDeclaration, JKBranchElementBase() { override var packageName: JKNameIdentifier by child(packageName) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitPackageDeclaration(this, data) +} + +class JKAnnotationListImpl(annotations: List = emptyList()) : JKAnnotationList, JKBranchElementBase() { + override var annotations: List by children(annotations) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitAnnotationList(this, data) +} + +class JKAnnotationImpl(name: JKNameIdentifier) : JKAnnotation, JKBranchElementBase() { + override var name: JKNameIdentifier by child(name) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitAnnotation(this, data) } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 026b4a0f73b..e2ff24c8d48 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -49,7 +49,8 @@ class JKKtFunctionImpl( parameters: List, block: JKBlock, modifierList: JKModifierList, - typeParameterList: JKTypeParameterList + typeParameterList: JKTypeParameterList, + annotationList: JKAnnotationList ) : JKBranchElementBase(), JKKtFunction { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtFunction(this, data) @@ -59,6 +60,7 @@ class JKKtFunctionImpl( override var block: JKBlock by child(block) override var modifierList: JKModifierList by child(modifierList) override var typeParameterList: JKTypeParameterList by child(typeParameterList) + override var annotationList: JKAnnotationList by child(annotationList) } sealed class JKKtQualifierImpl : JKQualifier, JKElementBase() { @@ -169,6 +171,8 @@ class JKKtConstructorImpl( override var modifierList: JKModifierList by child(modifierList) override var delegationCall: JKExpression by child(delegationCall) override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl()) + override var annotationList: JKAnnotationList by child(JKAnnotationListImpl()) + override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtConstructor(this, data) } @@ -187,6 +191,7 @@ class JKKtPrimaryConstructorImpl( override var modifierList: JKModifierList by child(modifierList) override var delegationCall: JKExpression by child(delegationCall) override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl()) + override var annotationList: JKAnnotationList by child(JKAnnotationListImpl()) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtPrimaryConstructor(this, data) } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index b3a21d5c2c3..2bd224517f4 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -62,7 +62,19 @@ interface JKInheritanceInfo : JKTreeElement, JKBranchElement { val inherit: List } -interface JKMethod : JKDeclaration, JKModifierListOwner, JKTypeParameterListOwner { +interface JKAnnotationList : JKTreeElement { + var annotations: List +} + +interface JKAnnotation : JKTreeElement { + var name: JKNameIdentifier//TODO +} + +interface JKAnnotationListOwner : JKTreeElement { + var annotationList: JKAnnotationList +} + +interface JKMethod : JKDeclaration, JKModifierListOwner, JKTypeParameterListOwner, JKAnnotationListOwner { val name: JKNameIdentifier var parameters: List val returnType: JKTypeElement @@ -70,7 +82,7 @@ interface JKMethod : JKDeclaration, JKModifierListOwner, JKTypeParameterListOwne } interface JKField : JKDeclaration, JKModifierListOwner { - val type: JKTypeElement + var type: JKTypeElement var name: JKNameIdentifier var initializer: JKExpression } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt index a68f7e5865d..bc11ae891c3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitor.kt @@ -8,6 +8,9 @@ interface JKVisitor { fun visitFile(file: JKFile, data: D): R = visitTreeElement(file, data) fun visitClass(klass: JKClass, data: D): R = visitDeclaration(klass, data) fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo, data: D): R = visitTreeElement(inheritanceInfo, data) + fun visitAnnotationList(annotationList: JKAnnotationList, data: D): R = visitTreeElement(annotationList, data) + fun visitAnnotation(annotation: JKAnnotation, data: D): R = visitTreeElement(annotation, data) + fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner, data: D): R = visitTreeElement(annotationListOwner, data) fun visitMethod(method: JKMethod, data: D): R = visitDeclaration(method, data) fun visitField(field: JKField, data: D): R = visitDeclaration(field, data) fun visitLocalVariable(localVariable: JKLocalVariable, data: D): R = visitField(localVariable, data) @@ -85,11 +88,11 @@ interface JKVisitor { fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement, data: D): R = visitStatement(javaThrowStatement, data) fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement, data: D): R = visitStatement(javaTryStatement, data) fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection, data: D): R = visitTreeElement(javaTryCatchSection, data) - fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: D): R = visitStatement(javaContinueStatement, data) fun visitJavaSwitchStatement(javaSwitchStatement: JKJavaSwitchStatement, data: D): R = visitStatement(javaSwitchStatement, data) fun visitJavaSwitchCase(javaSwitchCase: JKJavaSwitchCase, data: D): R = visitTreeElement(javaSwitchCase, data) fun visitJavaDefaultSwitchCase(javaDefaultSwitchCase: JKJavaDefaultSwitchCase, data: D): R = visitJavaSwitchCase(javaDefaultSwitchCase, data) fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: D): R = visitJavaSwitchCase(javaLabelSwitchCase, data) + fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: D): R = visitStatement(javaContinueStatement, data) fun visitKtProperty(ktProperty: JKKtProperty, data: D): R = visitField(ktProperty, data) fun visitKtFunction(ktFunction: JKKtFunction, data: D): R = visitMethod(ktFunction, data) fun visitKtConstructor(ktConstructor: JKKtConstructor, data: D): R = visitDeclaration(ktConstructor, data) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt index 7a042816bd2..8d511f45add 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/visitors/JKVisitorVoid.kt @@ -13,6 +13,12 @@ interface JKVisitorVoid : JKVisitor { override fun visitClass(klass: JKClass, data: Nothing?) = visitClass(klass) fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo) = visitTreeElement(inheritanceInfo, null) override fun visitInheritanceInfo(inheritanceInfo: JKInheritanceInfo, data: Nothing?) = visitInheritanceInfo(inheritanceInfo) + fun visitAnnotationList(annotationList: JKAnnotationList) = visitTreeElement(annotationList, null) + override fun visitAnnotationList(annotationList: JKAnnotationList, data: Nothing?) = visitAnnotationList(annotationList) + fun visitAnnotation(annotation: JKAnnotation) = visitTreeElement(annotation, null) + override fun visitAnnotation(annotation: JKAnnotation, data: Nothing?) = visitAnnotation(annotation) + fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner) = visitTreeElement(annotationListOwner, null) + override fun visitAnnotationListOwner(annotationListOwner: JKAnnotationListOwner, data: Nothing?) = visitAnnotationListOwner(annotationListOwner) fun visitMethod(method: JKMethod) = visitDeclaration(method, null) override fun visitMethod(method: JKMethod, data: Nothing?) = visitMethod(method) fun visitField(field: JKField) = visitDeclaration(field, null) @@ -163,6 +169,10 @@ interface JKVisitorVoid : JKVisitor { override fun visitJavaAssignmentExpression(javaAssignmentExpression: JKJavaAssignmentExpression, data: Nothing?) = visitJavaAssignmentExpression(javaAssignmentExpression) fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement) = visitStatement(javaThrowStatement, null) override fun visitJavaThrowStatement(javaThrowStatement: JKJavaThrowStatement, data: Nothing?) = visitJavaThrowStatement(javaThrowStatement) + fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement) = visitStatement(javaTryStatement, null) + override fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement, data: Nothing?) = visitJavaTryStatement(javaTryStatement) + fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection) = visitTreeElement(javaTryCatchSection, null) + override fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection, data: Nothing?) = visitJavaTryCatchSection(javaTryCatchSection) fun visitJavaSwitchStatement(javaSwitchStatement: JKJavaSwitchStatement) = visitStatement(javaSwitchStatement, null) override fun visitJavaSwitchStatement(javaSwitchStatement: JKJavaSwitchStatement, data: Nothing?) = visitJavaSwitchStatement(javaSwitchStatement) fun visitJavaSwitchCase(javaSwitchCase: JKJavaSwitchCase) = visitTreeElement(javaSwitchCase, null) @@ -173,10 +183,6 @@ interface JKVisitorVoid : JKVisitor { override fun visitJavaLabelSwitchCase(javaLabelSwitchCase: JKJavaLabelSwitchCase, data: Nothing?) = visitJavaLabelSwitchCase(javaLabelSwitchCase) fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement) = visitStatement(javaContinueStatement, null) override fun visitJavaContinueStatement(javaContinueStatement: JKJavaContinueStatement, data: Nothing?) = visitJavaContinueStatement(javaContinueStatement) - fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement) = visitStatement(javaTryStatement, null) - override fun visitJavaTryStatement(javaTryStatement: JKJavaTryStatement, data: Nothing?) = visitJavaTryStatement(javaTryStatement) - fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection) = visitTreeElement(javaTryCatchSection, null) - override fun visitJavaTryCatchSection(javaTryCatchSection: JKJavaTryCatchSection, data: Nothing?) = visitJavaTryCatchSection(javaTryCatchSection) fun visitKtProperty(ktProperty: JKKtProperty) = visitField(ktProperty, null) override fun visitKtProperty(ktProperty: JKKtProperty, data: Nothing?) = visitKtProperty(ktProperty) fun visitKtFunction(ktFunction: JKKtFunction) = visitMethod(ktFunction, null)