From 8eddb10870defe0c5c27e395e680d8e59a010cf4 Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Thu, 13 Jul 2017 22:42:49 +0300 Subject: [PATCH] UAST: Properly handle annotations on local variables --- .../testData/CycleInTypeParameters.types.txt | 2 +- plugins/uast-kotlin/testData/Elvis.render.txt | 2 +- .../testData/EnumValueMembers.render.txt | 4 ++-- .../testData/LocalVariableWithAnnotation.kt | 6 ++++++ .../testData/LocalVariableWithAnnotation.log.txt | 9 +++++++++ .../LocalVariableWithAnnotation.render.txt | 8 ++++++++ .../testData/PropertyAccessors.render.txt | 4 ++-- .../testData/PropertyDelegate.render.txt | 2 +- .../testData/PropertyInitializer.render.txt | 4 ++-- .../PropertyInitializerWithoutSetter.render.txt | 4 ++-- plugins/uast-kotlin/testData/Simple.render.txt | 2 +- plugins/uast-kotlin/testData/Simple.values.txt | 2 +- .../uast-kotlin/testData/StringTemplate.render.txt | 8 ++++---- .../UnexpectedContainerException.types.txt | 14 +++++++------- plugins/uast-kotlin/testData/WhenIs.render.txt | 2 +- .../uast-kotlin/tests/SimpleKotlinRenderLogTest.kt | 2 ++ 16 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 plugins/uast-kotlin/testData/LocalVariableWithAnnotation.kt create mode 100644 plugins/uast-kotlin/testData/LocalVariableWithAnnotation.log.txt create mode 100644 plugins/uast-kotlin/testData/LocalVariableWithAnnotation.render.txt diff --git a/plugins/uast-kotlin/testData/CycleInTypeParameters.types.txt b/plugins/uast-kotlin/testData/CycleInTypeParameters.types.txt index abfb578c83c..15ec7cc8522 100644 --- a/plugins/uast-kotlin/testData/CycleInTypeParameters.types.txt +++ b/plugins/uast-kotlin/testData/CycleInTypeParameters.types.txt @@ -1,6 +1,6 @@ UFile (package = ) [public final class CycleInTypeParametersKt {...] UClass (name = CycleInTypeParametersKt) [public final class CycleInTypeParametersKt {...}] - UField (name = a) [private static final var a: Device = null as? Device] + UField (name = a) [@org.jetbrains.annotations.Nullable private static final var a: Device = null as? Device] UAnnotation (fqName = org.jetbrains.annotations.Nullable) [@org.jetbrains.annotations.Nullable] UBinaryExpressionWithType [null as? Device] : PsiType:Device ULiteralExpression (value = null) [null] : PsiType:Void diff --git a/plugins/uast-kotlin/testData/Elvis.render.txt b/plugins/uast-kotlin/testData/Elvis.render.txt index 558f74c7731..1e60d647063 100644 --- a/plugins/uast-kotlin/testData/Elvis.render.txt +++ b/plugins/uast-kotlin/testData/Elvis.render.txt @@ -1,5 +1,5 @@ public final class ElvisKt { - public static final fun foo(bar: java.lang.String) : java.lang.String = null + public static final fun foo(@org.jetbrains.annotations.NotNull bar: java.lang.String) : java.lang.String = null public static final fun bar() : int = 42 public static final fun baz() : java.lang.String { return elvis { diff --git a/plugins/uast-kotlin/testData/EnumValueMembers.render.txt b/plugins/uast-kotlin/testData/EnumValueMembers.render.txt index a4325db460b..9544478939e 100644 --- a/plugins/uast-kotlin/testData/EnumValueMembers.render.txt +++ b/plugins/uast-kotlin/testData/EnumValueMembers.render.txt @@ -3,8 +3,8 @@ public enum Style { public fun getExitAnimation() : java.lang.String = "bar" fun SHEET() = UastEmptyExpression } - private final var value: java.lang.String + @org.jetbrains.annotations.NotNull private final var value: java.lang.String public abstract fun getExitAnimation() : java.lang.String = UastEmptyExpression public final fun getValue() : java.lang.String = UastEmptyExpression - protected fun Style(value: java.lang.String) = UastEmptyExpression + protected fun Style(@org.jetbrains.annotations.NotNull value: java.lang.String) = UastEmptyExpression } diff --git a/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.kt b/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.kt new file mode 100644 index 00000000000..91f36d09ada --- /dev/null +++ b/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.kt @@ -0,0 +1,6 @@ +annotation class TestAnnotation + +fun foo() { + @TestAnnotation + val bar = "lorem ipsum" +} \ No newline at end of file diff --git a/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.log.txt b/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.log.txt new file mode 100644 index 00000000000..b3033c06211 --- /dev/null +++ b/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.log.txt @@ -0,0 +1,9 @@ +UFile (package = ) + UClass (name = LocalVariableWithAnnotationKt) + UAnnotationMethod (name = foo) + UBlockExpression + UDeclarationsExpression + ULocalVariable (name = bar) + UAnnotation (fqName = TestAnnotation) + ULiteralExpression (value = "lorem ipsum") + UClass (name = TestAnnotation) diff --git a/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.render.txt b/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.render.txt new file mode 100644 index 00000000000..9ea15bbe75e --- /dev/null +++ b/plugins/uast-kotlin/testData/LocalVariableWithAnnotation.render.txt @@ -0,0 +1,8 @@ +public final class LocalVariableWithAnnotationKt { + public static final fun foo() : void { + @TestAnnotation var bar: = "lorem ipsum" + } +} + +public abstract annotation TestAnnotation { +} diff --git a/plugins/uast-kotlin/testData/PropertyAccessors.render.txt b/plugins/uast-kotlin/testData/PropertyAccessors.render.txt index 91e56d20bb0..45be6e01816 100644 --- a/plugins/uast-kotlin/testData/PropertyAccessors.render.txt +++ b/plugins/uast-kotlin/testData/PropertyAccessors.render.txt @@ -1,9 +1,9 @@ public final class PropertyTest { public final fun getStringRepresentation() : java.lang.String = this.toString() - public final fun setStringRepresentation(value: java.lang.String) : void { + public final fun setStringRepresentation(@org.jetbrains.annotations.NotNull value: java.lang.String) : void { setDataFromString(value) } - public final fun setDataFromString(data: java.lang.String) : void { + public final fun setDataFromString(@org.jetbrains.annotations.NotNull data: java.lang.String) : void { } public fun PropertyTest() = UastEmptyExpression } diff --git a/plugins/uast-kotlin/testData/PropertyDelegate.render.txt b/plugins/uast-kotlin/testData/PropertyDelegate.render.txt index ce4553ea29c..d496ac695d7 100644 --- a/plugins/uast-kotlin/testData/PropertyDelegate.render.txt +++ b/plugins/uast-kotlin/testData/PropertyDelegate.render.txt @@ -1,5 +1,5 @@ public final class PropertyDelegateKt { - private static final var sdCardPath$delegate: kotlin.Lazy + @org.jetbrains.annotations.NotNull private static final var sdCardPath$delegate: kotlin.Lazy public static final fun getSdCardPath() : java.lang.String = UastEmptyExpression public static final fun localPropertyTest() : void { var sdCardPathLocal: java.lang.String diff --git a/plugins/uast-kotlin/testData/PropertyInitializer.render.txt b/plugins/uast-kotlin/testData/PropertyInitializer.render.txt index 7d34908b700..817600566e0 100644 --- a/plugins/uast-kotlin/testData/PropertyInitializer.render.txt +++ b/plugins/uast-kotlin/testData/PropertyInitializer.render.txt @@ -1,7 +1,7 @@ public final class TestPropertyInitializer { - private var withSetter: java.lang.String = "/sdcard" + @org.jetbrains.annotations.NotNull private var withSetter: java.lang.String = "/sdcard" public final fun getWithSetter() : java.lang.String = field - public final fun setWithSetter(p: java.lang.String) : void { + public final fun setWithSetter(@org.jetbrains.annotations.NotNull p: java.lang.String) : void { field = p } public fun TestPropertyInitializer() = UastEmptyExpression diff --git a/plugins/uast-kotlin/testData/PropertyInitializerWithoutSetter.render.txt b/plugins/uast-kotlin/testData/PropertyInitializerWithoutSetter.render.txt index 9a5b0de74c5..35879033464 100644 --- a/plugins/uast-kotlin/testData/PropertyInitializerWithoutSetter.render.txt +++ b/plugins/uast-kotlin/testData/PropertyInitializerWithoutSetter.render.txt @@ -1,5 +1,5 @@ public final class PropertyInitializerWithoutSetterKt { - private static var withoutSetter: java.lang.String = "/sdcard" + @org.jetbrains.annotations.NotNull private static var withoutSetter: java.lang.String = "/sdcard" public static final fun getWithoutSetter() : java.lang.String = field - public static final fun setWithoutSetter(p: java.lang.String) : void = UastEmptyExpression + public static final fun setWithoutSetter(@org.jetbrains.annotations.NotNull p: java.lang.String) : void = UastEmptyExpression } diff --git a/plugins/uast-kotlin/testData/Simple.render.txt b/plugins/uast-kotlin/testData/Simple.render.txt index b354c83cca5..be960f24542 100644 --- a/plugins/uast-kotlin/testData/Simple.render.txt +++ b/plugins/uast-kotlin/testData/Simple.render.txt @@ -1,5 +1,5 @@ public final class Simple { - private final var property: java.lang.String = "Mary" + @org.jetbrains.annotations.NotNull private final var property: java.lang.String = "Mary" public final fun method() : void { println("Hello, world!") } diff --git a/plugins/uast-kotlin/testData/Simple.values.txt b/plugins/uast-kotlin/testData/Simple.values.txt index 1e41b670245..33ac2d9ce5e 100644 --- a/plugins/uast-kotlin/testData/Simple.values.txt +++ b/plugins/uast-kotlin/testData/Simple.values.txt @@ -1,6 +1,6 @@ UFile (package = ) [public final class Simple {...] UClass (name = Simple) [public final class Simple {...}] - UField (name = property) [private final var property: java.lang.String = "Mary"] + UField (name = property) [@org.jetbrains.annotations.NotNull private final var property: java.lang.String = "Mary"] UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull] ULiteralExpression (value = "Mary") ["Mary"] = "Mary" UAnnotationMethod (name = method) [public final fun method() : void {...}] diff --git a/plugins/uast-kotlin/testData/StringTemplate.render.txt b/plugins/uast-kotlin/testData/StringTemplate.render.txt index 2d56a3954b6..9146c91fb87 100644 --- a/plugins/uast-kotlin/testData/StringTemplate.render.txt +++ b/plugins/uast-kotlin/testData/StringTemplate.render.txt @@ -1,8 +1,8 @@ public final class StringTemplateKt { - private static final var foo: java.lang.String = "lorem" - private static final var bar: java.lang.String = "ipsum" - private static final var baz: java.lang.String = "dolor" - private static final var foobarbaz: java.lang.String = foo + " " + bar + " " + baz + @org.jetbrains.annotations.NotNull private static final var foo: java.lang.String = "lorem" + @org.jetbrains.annotations.NotNull private static final var bar: java.lang.String = "ipsum" + @org.jetbrains.annotations.NotNull private static final var baz: java.lang.String = "dolor" + @org.jetbrains.annotations.NotNull private static final var foobarbaz: java.lang.String = foo + " " + bar + " " + baz public static final fun getFoo() : java.lang.String = UastEmptyExpression public static final fun getBar() : java.lang.String = UastEmptyExpression public static final fun getBaz() : java.lang.String = UastEmptyExpression diff --git a/plugins/uast-kotlin/testData/UnexpectedContainerException.types.txt b/plugins/uast-kotlin/testData/UnexpectedContainerException.types.txt index 6ada6272f88..abfcfc69e45 100644 --- a/plugins/uast-kotlin/testData/UnexpectedContainerException.types.txt +++ b/plugins/uast-kotlin/testData/UnexpectedContainerException.types.txt @@ -1,13 +1,13 @@ UFile (package = ) [public abstract interface Callback {...] UClass (name = Callback) [public abstract interface Callback {...}] - UAnnotationMethod (name = onError) [public abstract fun onError(throwable: java.lang.Throwable) : void = UastEmptyExpression] - UParameter (name = throwable) [var throwable: java.lang.Throwable] + UAnnotationMethod (name = onError) [public abstract fun onError(@org.jetbrains.annotations.NotNull throwable: java.lang.Throwable) : void = UastEmptyExpression] + UParameter (name = throwable) [@org.jetbrains.annotations.NotNull var throwable: java.lang.Throwable] UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull] UClass (name = Model) [public final class Model {...}] - UAnnotationMethod (name = crashMe) [public final fun crashMe(clazz: java.lang.Class, factory: kotlin.jvm.functions.Function0) : void {...}] - UParameter (name = clazz) [var clazz: java.lang.Class] + UAnnotationMethod (name = crashMe) [public final fun crashMe(@org.jetbrains.annotations.NotNull clazz: java.lang.Class, @org.jetbrains.annotations.NotNull factory: kotlin.jvm.functions.Function0) : void {...}] + UParameter (name = clazz) [@org.jetbrains.annotations.NotNull var clazz: java.lang.Class] UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull] - UParameter (name = factory) [var factory: kotlin.jvm.functions.Function0] + UParameter (name = factory) [@org.jetbrains.annotations.NotNull var factory: kotlin.jvm.functions.Function0] UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull] UBlockExpression [{...}] : PsiType:Void UThrowExpression [throw ()] : PsiType:Void @@ -27,8 +27,8 @@ UFile (package = ) [public abstract interface Callback {...] UBlockExpression [{...}] UObjectLiteralExpression [anonymous object : Callback {... }] : PsiType:Callback UClass (name = null) [final class null {...}] - UAnnotationMethod (name = onError) [public fun onError(throwable: java.lang.Throwable) : void {...}] - UParameter (name = throwable) [var throwable: java.lang.Throwable] + UAnnotationMethod (name = onError) [public fun onError(@org.jetbrains.annotations.NotNull throwable: java.lang.Throwable) : void {...}] + UParameter (name = throwable) [@org.jetbrains.annotations.NotNull var throwable: java.lang.Throwable] UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull] UBlockExpression [{...}] : PsiType:Void UThrowExpression [throw ("")] : PsiType:Void diff --git a/plugins/uast-kotlin/testData/WhenIs.render.txt b/plugins/uast-kotlin/testData/WhenIs.render.txt index 63513a3aac2..cd40a1093e3 100644 --- a/plugins/uast-kotlin/testData/WhenIs.render.txt +++ b/plugins/uast-kotlin/testData/WhenIs.render.txt @@ -1,5 +1,5 @@ public final class WhenIsKt { - public static final fun foo(bar: java.lang.Object) : java.lang.String = switch (bar) { + public static final fun foo(@org.jetbrains.annotations.NotNull bar: java.lang.Object) : java.lang.String = switch (bar) { it is java.lang.String -> { bar break diff --git a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt index d86400a434a..86373fe8931 100644 --- a/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt +++ b/plugins/uast-kotlin/tests/SimpleKotlinRenderLogTest.kt @@ -31,6 +31,8 @@ class SimpleKotlinRenderLogTest : AbstractKotlinRenderLogTest() { @Test fun testPropertyDelegate() = doTest("PropertyDelegate") { testName, file -> check(testName, file, false) } + @Test fun testLocalVariableWithAnnotation() = doTest("LocalVariableWithAnnotation") + @Test fun testPropertyWithAnnotation() = doTest("PropertyWithAnnotation") @Test fun testIfStatement() = doTest("IfStatement")