From 28b466d0693bcc2ce62cafa8f66366851c41c640 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 5 Nov 2014 09:52:27 +0200 Subject: [PATCH] Parsing dynamic types --- .../src/org/jetbrains/jet/JetNodeTypes.java | 1 + .../jet/lang/parsing/JetParsing.java | 11 +- .../jet/lang/psi/JetDynamicType.java | 46 ++++++ .../jetbrains/jet/lang/psi/JetVisitor.java | 4 + .../jet/lang/psi/JetVisitorVoid.java | 10 ++ .../lang/psi/JetVisitorVoidWithParameter.java | 10 ++ .../stubs/elements/JetStubElementTypes.java | 4 +- .../org/jetbrains/jet/lexer/JetTokens.java | 4 +- compiler/testData/psi/DynamicSoftKeyword.kt | 5 + compiler/testData/psi/DynamicSoftKeyword.txt | 77 ++++++++++ compiler/testData/psi/DynamicTypes.kt | 10 ++ compiler/testData/psi/DynamicTypes.txt | 138 ++++++++++++++++++ .../jet/parsing/JetParsingTestGenerated.java | 12 ++ grammar/src/types.grm | 1 + .../keywords/InFunctionTypePosition.kt | 3 +- idea/testData/stubs/DynamicType.expected | 5 + idea/testData/stubs/DynamicType.kt | 1 + .../stubs/StubBuilderTestGenerated.java | 6 + 18 files changed, 343 insertions(+), 5 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDynamicType.java create mode 100644 compiler/testData/psi/DynamicSoftKeyword.kt create mode 100644 compiler/testData/psi/DynamicSoftKeyword.txt create mode 100644 compiler/testData/psi/DynamicTypes.kt create mode 100644 compiler/testData/psi/DynamicTypes.txt create mode 100644 idea/testData/stubs/DynamicType.expected create mode 100644 idea/testData/stubs/DynamicType.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java index 7c882c60d8d..3d68bb0d8c0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java +++ b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java @@ -67,6 +67,7 @@ public interface JetNodeTypes { IElementType TYPE_REFERENCE = JetStubElementTypes.TYPE_REFERENCE; IElementType USER_TYPE = JetStubElementTypes.USER_TYPE; + IElementType DYNAMIC_TYPE = JetStubElementTypes.DYNAMIC_TYPE; IElementType FUNCTION_TYPE = JetStubElementTypes.FUNCTION_TYPE; IElementType FUNCTION_TYPE_RECEIVER = JetStubElementTypes.FUNCTION_TYPE_RECEIVER; JetNodeType SELF_TYPE = new JetNodeType("SELF_TYPE", JetSelfType.class); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java index d156cf20215..df88c619293 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetParsing.java @@ -53,7 +53,7 @@ public class JetParsing extends AbstractJetParsing { private static final TokenSet PARAMETER_NAME_RECOVERY_SET = TokenSet.create(COLON, EQ, COMMA, RPAR); private static final TokenSet PACKAGE_NAME_RECOVERY_SET = TokenSet.create(DOT, EOL_OR_SEMICOLON); private static final TokenSet IMPORT_RECOVERY_SET = TokenSet.create(AS_KEYWORD, DOT, EOL_OR_SEMICOLON); - /*package*/ static final TokenSet TYPE_REF_FIRST = TokenSet.create(LBRACKET, IDENTIFIER, LPAR, CAPITALIZED_THIS_KEYWORD, HASH); + /*package*/ static final TokenSet TYPE_REF_FIRST = TokenSet.create(LBRACKET, IDENTIFIER, LPAR, CAPITALIZED_THIS_KEYWORD, HASH, DYNAMIC_KEYWORD); private static final TokenSet RECEIVER_TYPE_TERMINATORS = TokenSet.create(DOT, SAFE_ACCESS); private static final TokenSet VALUE_PARAMETER_FIRST = TokenSet.orSet(TokenSet.create(IDENTIFIER, LBRACKET, VAL_KEYWORD, VAR_KEYWORD), MODIFIER_KEYWORDS); @@ -1501,6 +1501,7 @@ public class JetParsing extends AbstractJetParsing { * : userType * : tupleType * : nullableType + * : "dynamic" * ; * * nullableType @@ -1525,7 +1526,13 @@ public class JetParsing extends AbstractJetParsing { PsiBuilder.Marker typeRefMarker = mark(); parseAnnotations(REGULAR_ANNOTATIONS_ONLY_WITH_BRACKETS); - if (at(IDENTIFIER) || at(PACKAGE_KEYWORD) || atParenthesizedMutableForPlatformTypes(0)) { + IElementType lookahead = lookahead(1); + if (at(IDENTIFIER) && lookahead(1) != DOT && lookahead != LT && lookahead != LPAR && at(DYNAMIC_KEYWORD)) { + PsiBuilder.Marker dynamicType = mark(); + advance(); // DYNAMIC_KEYWORD + dynamicType.done(DYNAMIC_TYPE); + } + else if (at(IDENTIFIER) || at(PACKAGE_KEYWORD) || atParenthesizedMutableForPlatformTypes(0)) { parseUserType(); } else if (at(HASH)) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDynamicType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDynamicType.java new file mode 100644 index 00000000000..7b4869d1e5b --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDynamicType.java @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.stubs.KotlinPlaceHolderStub; +import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes; + +import java.util.Collections; +import java.util.List; + +public class JetDynamicType extends JetElementImplStub> implements JetTypeElement { + public JetDynamicType(@NotNull ASTNode node) { + super(node); + } + + public JetDynamicType(@NotNull KotlinPlaceHolderStub stub) { + super(stub, JetStubElementTypes.DYNAMIC_TYPE); + } + + @Override + public R accept(@NotNull JetVisitor visitor, D data) { + return visitor.visitDynamicType(this, data); + } + + @NotNull + @Override + public List getTypeArgumentsAsTypes() { + return Collections.emptyList(); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 545fe33ed25..8cd7e5cda97 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -338,6 +338,10 @@ public class JetVisitor extends PsiElementVisitor { return visitTypeElement(type, data); } + public R visitDynamicType(@NotNull JetDynamicType type, D data) { + return visitTypeElement(type, data); + } + public R visitFunctionType(@NotNull JetFunctionType type, D data) { return visitTypeElement(type, data); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java index daf7fe7cbc8..a0ef325f851 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java @@ -329,6 +329,10 @@ public class JetVisitorVoid extends JetVisitor { super.visitUserType(type, null); } + public void visitDynamicType(@NotNull JetDynamicType type) { + super.visitDynamicType(type, null); + } + public void visitFunctionType(@NotNull JetFunctionType type) { super.visitFunctionType(type, null); } @@ -872,6 +876,12 @@ public class JetVisitorVoid extends JetVisitor { return null; } + @Override + public Void visitDynamicType(@NotNull JetDynamicType type, Void data) { + visitDynamicType(type); + return null; + } + @Override public final Void visitFunctionType(@NotNull JetFunctionType type, Void data) { visitFunctionType(type); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java index a76307a724c..ac87d004db6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoidWithParameter.java @@ -330,6 +330,10 @@ public class JetVisitorVoidWithParameter

extends JetVisitor { super.visitUserType(type, data); } + public void visitDynamicTypeVoid(@NotNull JetDynamicType type, P data) { + super.visitDynamicType(type, data); + } + public void visitFunctionTypeVoid(@NotNull JetFunctionType type, P data) { super.visitFunctionType(type, data); } @@ -869,6 +873,12 @@ public class JetVisitorVoidWithParameter

extends JetVisitor { return null; } + @Override + public Void visitDynamicType(@NotNull JetDynamicType type, P data) { + visitDynamicTypeVoid(type, data); + return null; + } + @Override public final Void visitFunctionType(@NotNull JetFunctionType type, P data) { visitFunctionTypeVoid(type, data); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementTypes.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementTypes.java index e45554a20de..7e5283d293a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementTypes.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementTypes.java @@ -78,6 +78,8 @@ public interface JetStubElementTypes { new JetPlaceHolderStubElementType("TYPE_REFERENCE", JetTypeReference.class); JetUserTypeElementType USER_TYPE = new JetUserTypeElementType("USER_TYPE"); + JetPlaceHolderStubElementType DYNAMIC_TYPE = + new JetPlaceHolderStubElementType("DYNAMIC_TYPE", JetDynamicType.class); JetPlaceHolderStubElementType FUNCTION_TYPE = new JetPlaceHolderStubElementType("FUNCTION_TYPE", JetFunctionType.class); @@ -115,7 +117,7 @@ public interface JetStubElementTypes { TokenSet DELEGATION_SPECIFIER_TYPES = TokenSet.create(DELEGATOR_BY, DELEGATOR_SUPER_CALL, DELEGATOR_SUPER_CLASS, THIS_CALL); - TokenSet TYPE_ELEMENT_TYPES = TokenSet.create(USER_TYPE, NULLABLE_TYPE, FUNCTION_TYPE); + TokenSet TYPE_ELEMENT_TYPES = TokenSet.create(USER_TYPE, NULLABLE_TYPE, FUNCTION_TYPE, DYNAMIC_TYPE); TokenSet INSIDE_DIRECTIVE_EXPRESSIONS = TokenSet.create(REFERENCE_EXPRESSION, DOT_QUALIFIED_EXPRESSION); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java index 43d5e1c2e95..33b1bfa5dc3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java @@ -151,6 +151,7 @@ public interface JetTokens { JetModifierKeywordToken OUT_KEYWORD = JetModifierKeywordToken.softKeywordModifier("out"); JetModifierKeywordToken VARARG_KEYWORD = JetModifierKeywordToken.softKeywordModifier("vararg"); JetModifierKeywordToken REIFIED_KEYWORD = JetModifierKeywordToken.softKeywordModifier("reified"); + JetModifierKeywordToken DYNAMIC_KEYWORD = JetModifierKeywordToken.softKeywordModifier("dynamic"); JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally"); JetModifierKeywordToken FINAL_KEYWORD = JetModifierKeywordToken.softKeywordModifier("final"); @@ -167,7 +168,8 @@ public interface JetTokens { TokenSet SOFT_KEYWORDS = TokenSet.create(FILE_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, - CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD + CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD, + DYNAMIC_KEYWORD ); /* diff --git a/compiler/testData/psi/DynamicSoftKeyword.kt b/compiler/testData/psi/DynamicSoftKeyword.kt new file mode 100644 index 00000000000..9f76d2facc0 --- /dev/null +++ b/compiler/testData/psi/DynamicSoftKeyword.kt @@ -0,0 +1,5 @@ +dynamic class dynamic(dynamic: dynamic) : dynamic { + [dynamic] fun dynamic() { + val dynamic = 1 + } +} \ No newline at end of file diff --git a/compiler/testData/psi/DynamicSoftKeyword.txt b/compiler/testData/psi/DynamicSoftKeyword.txt new file mode 100644 index 00000000000..6492ef7aa09 --- /dev/null +++ b/compiler/testData/psi/DynamicSoftKeyword.txt @@ -0,0 +1,77 @@ +JetFile: DynamicSoftKeyword.kt + PACKAGE_DIRECTIVE + + CLASS + MODIFIER_LIST + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dynamic') + PsiWhiteSpace(' ') + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('dynamic') + TYPE_PARAMETER_LIST + PsiElement(LT)('<') + TYPE_PARAMETER + PsiElement(IDENTIFIER)('dynamic') + PsiElement(GT)('>') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('dynamic') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + DELEGATION_SPECIFIER_LIST + DELEGATOR_SUPER_CLASS + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiWhiteSpace(' ') + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + FUN + MODIFIER_LIST + ANNOTATION + PsiElement(LBRACKET)('[') + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dynamic') + PsiElement(RBRACKET)(']') + PsiWhiteSpace(' ') + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('dynamic') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + PROPERTY + PsiElement(val)('val') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('dynamic') + PsiWhiteSpace(' ') + PsiElement(EQ)('=') + PsiWhiteSpace(' ') + INTEGER_CONSTANT + PsiElement(INTEGER_LITERAL)('1') + PsiWhiteSpace('\n ') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/compiler/testData/psi/DynamicTypes.kt b/compiler/testData/psi/DynamicTypes.kt new file mode 100644 index 00000000000..24a0da87a41 --- /dev/null +++ b/compiler/testData/psi/DynamicTypes.kt @@ -0,0 +1,10 @@ +fun foo( + p1: dynamic, + p2: [a] dynamic, + p3: foo.dynamic, + p4: dynamic.foo, + p5: dynamic, + p6: Foo, + p7: dynamic?, + p8: (dynamic) -> dynamic +): dynamic \ No newline at end of file diff --git a/compiler/testData/psi/DynamicTypes.txt b/compiler/testData/psi/DynamicTypes.txt new file mode 100644 index 00000000000..180b7f58e48 --- /dev/null +++ b/compiler/testData/psi/DynamicTypes.txt @@ -0,0 +1,138 @@ +JetFile: DynamicTypes.kt + PACKAGE_DIRECTIVE + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p1') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p2') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + ANNOTATION + PsiElement(LBRACKET)('[') + ANNOTATION_ENTRY + CONSTRUCTOR_CALLEE + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('a') + PsiElement(RBRACKET)(']') + PsiWhiteSpace(' ') + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p3') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dynamic') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p4') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dynamic') + PsiElement(DOT)('.') + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p5') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('dynamic') + TYPE_ARGUMENT_LIST + PsiElement(LT)('<') + TYPE_PROJECTION + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('T') + PsiElement(GT)('>') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p6') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Foo') + TYPE_ARGUMENT_LIST + PsiElement(LT)('<') + TYPE_PROJECTION + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiElement(GT)('>') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p7') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + NULLABLE_TYPE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiElement(QUEST)('?') + PsiElement(COMMA)(',') + PsiWhiteSpace('\n ') + VALUE_PARAMETER + PsiElement(IDENTIFIER)('p8') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + FUNCTION_TYPE + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + VALUE_PARAMETER + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + PsiElement(ARROW)('->') + PsiWhiteSpace(' ') + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') + PsiWhiteSpace('\n') + PsiElement(RPAR)(')') + PsiElement(COLON)(':') + PsiWhiteSpace(' ') + TYPE_REFERENCE + DYNAMIC_TYPE + PsiElement(dynamic)('dynamic') \ 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 25e445498fc..cefe8e5e19a 100644 --- a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java @@ -166,6 +166,18 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest { doParsingTest(fileName); } + @TestMetadata("DynamicSoftKeyword.kt") + public void testDynamicSoftKeyword() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/DynamicSoftKeyword.kt"); + doParsingTest(fileName); + } + + @TestMetadata("DynamicTypes.kt") + public void testDynamicTypes() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/DynamicTypes.kt"); + doParsingTest(fileName); + } + @TestMetadata("EOLsInComments.kt") public void testEOLsInComments() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/psi/EOLsInComments.kt"); diff --git a/grammar/src/types.grm b/grammar/src/types.grm index 314601dbd78..2d4dde5247d 100644 --- a/grammar/src/types.grm +++ b/grammar/src/types.grm @@ -23,6 +23,7 @@ typeDescriptor : functionType : userType : nullableType + : "dynamic" ; nullableType diff --git a/idea/testData/completion/keywords/InFunctionTypePosition.kt b/idea/testData/completion/keywords/InFunctionTypePosition.kt index a5ca16c17c1..2d8d0e2354a 100644 --- a/idea/testData/completion/keywords/InFunctionTypePosition.kt +++ b/idea/testData/completion/keywords/InFunctionTypePosition.kt @@ -4,4 +4,5 @@ fun foo() { /*TODO: Is 'package' type qualifier syntax correct?*/ // EXIST: package -// NUMBER: 1 +// EXIST: dynamic +// NUMBER: 2 diff --git a/idea/testData/stubs/DynamicType.expected b/idea/testData/stubs/DynamicType.expected new file mode 100644 index 00000000000..1cbd96c5a8a --- /dev/null +++ b/idea/testData/stubs/DynamicType.expected @@ -0,0 +1,5 @@ +PsiJetFileStubImpl[package=] + PACKAGE_DIRECTIVE: + PROPERTY:[fqName=foo, hasDelegate=false, hasDelegateExpression=false, hasInitializer=false, hasReceiverTypeRef=false, hasReturnTypeRef=true, isProbablyNothingType=false, isTopLevel=true, isVar=false, name=foo] + TYPE_REFERENCE: + DYNAMIC_TYPE: diff --git a/idea/testData/stubs/DynamicType.kt b/idea/testData/stubs/DynamicType.kt new file mode 100644 index 00000000000..3b7ed01a479 --- /dev/null +++ b/idea/testData/stubs/DynamicType.kt @@ -0,0 +1 @@ +val foo: dynamic \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/StubBuilderTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/stubs/StubBuilderTestGenerated.java index 225b9d18bdd..0fa6b203e26 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/StubBuilderTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/StubBuilderTestGenerated.java @@ -84,6 +84,12 @@ public class StubBuilderTestGenerated extends AbstractStubBuilderTest { doTest(fileName); } + @TestMetadata("DynamicType.kt") + public void testDynamicType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/stubs/DynamicType.kt"); + doTest(fileName); + } + @TestMetadata("FilePackage.kt") public void testFilePackage() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/stubs/FilePackage.kt");