Fix PSI behavior for "val x : ()?' case
This commit is contained in:
+3
-1
@@ -76,7 +76,9 @@ public class TypeTransformingVisitor extends JetVisitor<JetType, Void> {
|
|||||||
throw new AlternativeSignatureMismatchException("Auto type '%s' is not-null, while type in alternative signature is nullable: '%s'",
|
throw new AlternativeSignatureMismatchException("Auto type '%s' is not-null, while type in alternative signature is nullable: '%s'",
|
||||||
DescriptorRenderer.TEXT.renderType(originalType), nullableType.getText());
|
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
|
@Override
|
||||||
|
|||||||
@@ -18,8 +18,10 @@ package org.jetbrains.jet.lang.psi;
|
|||||||
|
|
||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class JetNullableType extends JetTypeElement {
|
public class JetNullableType extends JetTypeElement {
|
||||||
@@ -35,7 +37,8 @@ public class JetNullableType extends JetTypeElement {
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public List<JetTypeReference> getTypeArgumentsAsTypes() {
|
public List<JetTypeReference> getTypeArgumentsAsTypes() {
|
||||||
return getInnerType().getTypeArgumentsAsTypes();
|
JetTypeElement innerType = getInnerType();
|
||||||
|
return innerType == null ? Collections.<JetTypeReference>emptyList() : innerType.getTypeArgumentsAsTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -43,7 +46,8 @@ public class JetNullableType extends JetTypeElement {
|
|||||||
return visitor.visitNullableType(this, data);
|
return visitor.visitNullableType(this, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@Nullable
|
||||||
|
@IfNotParsed
|
||||||
public JetTypeElement getInnerType() {
|
public JetTypeElement getInnerType() {
|
||||||
return findChildByClass(JetTypeElement.class);
|
return findChildByClass(JetTypeElement.class);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ public class DescriptorResolver {
|
|||||||
JetNullableType nullableType = (JetNullableType) typeElement;
|
JetNullableType nullableType = (JetNullableType) typeElement;
|
||||||
typeElement = nullableType.getInnerType();
|
typeElement = nullableType.getInnerType();
|
||||||
// report only for innermost '?', the rest gets a 'redundant' warning
|
// 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));
|
trace.report(NULLABLE_SUPERTYPE.on(nullableType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
val x: ()? = 1
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
JetFile: AbsentInnerType.kt
|
||||||
|
PACKAGE_DIRECTIVE
|
||||||
|
<empty list>
|
||||||
|
PROPERTY
|
||||||
|
PsiElement(val)('val')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(IDENTIFIER)('x')
|
||||||
|
PsiElement(COLON)(':')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
TYPE_REFERENCE
|
||||||
|
NULLABLE_TYPE
|
||||||
|
PsiElement(LPAR)('(')
|
||||||
|
PsiErrorElement:Type expected
|
||||||
|
<empty list>
|
||||||
|
PsiElement(RPAR)(')')
|
||||||
|
PsiElement(QUEST)('?')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
PsiElement(EQ)('=')
|
||||||
|
PsiWhiteSpace(' ')
|
||||||
|
INTEGER_CONSTANT
|
||||||
|
PsiElement(INTEGER_LITERAL)('1')
|
||||||
@@ -33,6 +33,11 @@ import org.jetbrains.jet.parsing.AbstractJetParsingTest;
|
|||||||
@TestMetadata("compiler/testData/psi")
|
@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})
|
@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 {
|
public class JetParsingTestGenerated extends AbstractJetParsingTest {
|
||||||
|
@TestMetadata("AbsentInnerType.kt")
|
||||||
|
public void testAbsentInnerType() throws Exception {
|
||||||
|
doParsingTest("compiler/testData/psi/AbsentInnerType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
public void testAllFilesPresentInPsi() throws Exception {
|
public void testAllFilesPresentInPsi() throws Exception {
|
||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/psi"), Pattern.compile("^(.+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/psi"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,9 @@ public class MemberMatching {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitNullableType(@NotNull JetNullableType nullableType, Void data) {
|
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);
|
}, null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ public class RemoveNullableFix extends JetIntentionAction<JetNullableType> {
|
|||||||
@Override
|
@Override
|
||||||
public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException {
|
public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException {
|
||||||
JetTypeElement type = super.element.getInnerType();
|
JetTypeElement type = super.element.getInnerType();
|
||||||
|
assert type != null : "No inner type " + element.getText() + ", should have been rejected in createFactory()";
|
||||||
super.element.replace(type);
|
super.element.replace(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +68,7 @@ public class RemoveNullableFix extends JetIntentionAction<JetNullableType> {
|
|||||||
@Override
|
@Override
|
||||||
public JetIntentionAction<JetNullableType> createAction(Diagnostic diagnostic) {
|
public JetIntentionAction<JetNullableType> createAction(Diagnostic diagnostic) {
|
||||||
JetNullableType nullType = QuickFixUtil.getParentElementOfType(diagnostic, JetNullableType.class);
|
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);
|
return new RemoveNullableFix(nullType, typeOfError);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,11 +16,17 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.plugin.refactoring.move;
|
package org.jetbrains.jet.plugin.refactoring.move;
|
||||||
|
|
||||||
import org.jetbrains.jet.JetTestUtils;
|
import junit.framework.Assert;
|
||||||
import org.jetbrains.jet.test.TestMetadata;
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.regex.Pattern;
|
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 */
|
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||||
@SuppressWarnings("all")
|
@SuppressWarnings("all")
|
||||||
|
|||||||
Reference in New Issue
Block a user