Fix PSI behavior for "val x : ()?' case

This commit is contained in:
Andrey Breslav
2014-03-25 14:04:23 +04:00
parent 6725b4f1b0
commit 80737bdfcf
9 changed files with 50 additions and 8 deletions
@@ -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'",
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
@@ -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<JetTypeReference> getTypeArgumentsAsTypes() {
return getInnerType().getTypeArgumentsAsTypes();
JetTypeElement innerType = getInnerType();
return innerType == null ? Collections.<JetTypeReference>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);
}
@@ -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));
}
}
+1
View File
@@ -0,0 +1 @@
val x: ()? = 1
+21
View File
@@ -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")
@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);
}
@@ -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);
}
@@ -59,6 +59,7 @@ public class RemoveNullableFix extends JetIntentionAction<JetNullableType> {
@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<JetNullableType> {
@Override
public JetIntentionAction<JetNullableType> 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);
}
};
@@ -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")