From 80737bdfcfce6b40c63204d21e4e7771277e3e9a Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 25 Mar 2014 14:04:23 +0400 Subject: [PATCH] Fix PSI behavior for "val x : ()?' case --- .../TypeTransformingVisitor.java | 4 +++- .../jet/lang/psi/JetNullableType.java | 8 +++++-- .../jet/lang/resolve/DescriptorResolver.java | 2 +- compiler/testData/psi/AbsentInnerType.kt | 1 + compiler/testData/psi/AbsentInnerType.txt | 21 +++++++++++++++++++ .../jet/parsing/JetParsingTestGenerated.java | 5 +++++ .../jet/plugin/libraries/MemberMatching.java | 4 +++- .../plugin/quickfix/RemoveNullableFix.java | 3 ++- .../move/JetMoveTestGenerated.java | 10 +++++++-- 9 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/psi/AbsentInnerType.kt create mode 100644 compiler/testData/psi/AbsentInnerType.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java index 3af05a7294f..33c9c909cb1 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java @@ -76,7 +76,9 @@ public class TypeTransformingVisitor extends JetVisitor { throw new AlternativeSignatureMismatchException("Auto type '%s' is not-null, while type in alternative signature is nullable: '%s'", DescriptorRenderer.TEXT.renderType(originalType), nullableType.getText()); } - return TypeUtils.makeNullable(computeType(nullableType.getInnerType(), originalType, originalToAltTypeParameters, typeUsage)); + JetTypeElement innerType = nullableType.getInnerType(); + assert innerType != null : "Syntax error: " + nullableType.getText(); + return TypeUtils.makeNullable(computeType(innerType, originalType, originalToAltTypeParameters, typeUsage)); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNullableType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNullableType.java index 1bbf9d0260c..250de87c3dc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNullableType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNullableType.java @@ -18,8 +18,10 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lexer.JetTokens; +import java.util.Collections; import java.util.List; public class JetNullableType extends JetTypeElement { @@ -35,7 +37,8 @@ public class JetNullableType extends JetTypeElement { @NotNull @Override public List getTypeArgumentsAsTypes() { - return getInnerType().getTypeArgumentsAsTypes(); + JetTypeElement innerType = getInnerType(); + return innerType == null ? Collections.emptyList() : innerType.getTypeArgumentsAsTypes(); } @Override @@ -43,7 +46,8 @@ public class JetNullableType extends JetTypeElement { return visitor.visitNullableType(this, data); } - @NotNull + @Nullable + @IfNotParsed public JetTypeElement getInnerType() { return findChildByClass(JetTypeElement.class); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 454f58c50a9..55147f1db30 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -241,7 +241,7 @@ public class DescriptorResolver { JetNullableType nullableType = (JetNullableType) typeElement; typeElement = nullableType.getInnerType(); // report only for innermost '?', the rest gets a 'redundant' warning - if (!(typeElement instanceof JetNullableType)) { + if (!(typeElement instanceof JetNullableType) && typeElement != null) { trace.report(NULLABLE_SUPERTYPE.on(nullableType)); } } diff --git a/compiler/testData/psi/AbsentInnerType.kt b/compiler/testData/psi/AbsentInnerType.kt new file mode 100644 index 00000000000..4b0509fe3cf --- /dev/null +++ b/compiler/testData/psi/AbsentInnerType.kt @@ -0,0 +1 @@ +val x: ()? = 1 \ No newline at end of file diff --git a/compiler/testData/psi/AbsentInnerType.txt b/compiler/testData/psi/AbsentInnerType.txt new file mode 100644 index 00000000000..b0923861b20 --- /dev/null +++ b/compiler/testData/psi/AbsentInnerType.txt @@ -0,0 +1,21 @@ +JetFile: AbsentInnerType.kt + PACKAGE_DIRECTIVE + + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('x') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + NULLABLE_TYPE + PsiElement(LPAR)('(') + PsiErrorElement:Type expected + + PsiElement(RPAR)(')') + PsiElement(QUEST)('?') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java index cd6ca0676f8..73ec7b30e0b 100644 --- a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java @@ -33,6 +33,11 @@ import org.jetbrains.jet.parsing.AbstractJetParsingTest; @TestMetadata("compiler/testData/psi") @InnerTestClasses({JetParsingTestGenerated.Examples.class, JetParsingTestGenerated.FunctionReceivers.class, JetParsingTestGenerated.GreatSyntacticShift.class, JetParsingTestGenerated.Kdoc.class, JetParsingTestGenerated.PropertyDelegate.class, JetParsingTestGenerated.Recovery.class, JetParsingTestGenerated.StringTemplates.class}) public class JetParsingTestGenerated extends AbstractJetParsingTest { + @TestMetadata("AbsentInnerType.kt") + public void testAbsentInnerType() throws Exception { + doParsingTest("compiler/testData/psi/AbsentInnerType.kt"); + } + public void testAllFilesPresentInPsi() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/psi"), Pattern.compile("^(.+)\\.kt$"), true); } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java b/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java index bfd8d63c98a..fa037a8c598 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/MemberMatching.java @@ -96,7 +96,9 @@ public class MemberMatching { @Override public String visitNullableType(@NotNull JetNullableType nullableType, Void data) { - return nullableType.getInnerType().accept(this, null); + JetTypeElement innerType = nullableType.getInnerType(); + assert innerType != null : "No inner type: " + nullableType; + return innerType.accept(this, null); } }, null); } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveNullableFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveNullableFix.java index e5268b037ff..bf82e2fcef0 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveNullableFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveNullableFix.java @@ -59,6 +59,7 @@ public class RemoveNullableFix extends JetIntentionAction { @Override public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException { JetTypeElement type = super.element.getInnerType(); + assert type != null : "No inner type " + element.getText() + ", should have been rejected in createFactory()"; super.element.replace(type); } @@ -67,7 +68,7 @@ public class RemoveNullableFix extends JetIntentionAction { @Override public JetIntentionAction createAction(Diagnostic diagnostic) { JetNullableType nullType = QuickFixUtil.getParentElementOfType(diagnostic, JetNullableType.class); - if (nullType == null) return null; + if (nullType == null || nullType.getInnerType() == null) return null; return new RemoveNullableFix(nullType, typeOfError); } }; diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/move/JetMoveTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/move/JetMoveTestGenerated.java index 5f489b5c0f5..a690efac091 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/move/JetMoveTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/move/JetMoveTestGenerated.java @@ -16,11 +16,17 @@ package org.jetbrains.jet.plugin.refactoring.move; -import org.jetbrains.jet.JetTestUtils; -import org.jetbrains.jet.test.TestMetadata; +import junit.framework.Assert; +import junit.framework.Test; +import junit.framework.TestSuite; import java.io.File; import java.util.regex.Pattern; +import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.test.InnerTestClasses; +import org.jetbrains.jet.test.TestMetadata; + +import org.jetbrains.jet.plugin.refactoring.move.AbstractJetMoveTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all")