From 31fb4256212bcc6a9ccd0695c005eaea16823e71 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Thu, 5 Dec 2019 11:12:41 +0700 Subject: [PATCH] complete and highlight records GitOrigin-RevId: a7c20dfae6128194bbd6e02640072938cc07ff24 --- .../completion/JavaKeywordCompletion.java | 3 +++ .../intellij/lang/java/lexer/JavaLexer.java | 5 +++-- .../psi/impl/source/tree/ElementType.java | 2 +- .../completion/keywords/record.java | 1 + .../completion/keywords/recordInFileScope.java | 1 + .../completion/keywords/record_after.java | 1 + .../class/CompactConstructor0.txt | 2 +- .../class/CompactConstructor1.txt | 2 +- .../declarationParsing/class/Record.txt | 2 +- .../class/RecordNoClosingParenthesis.txt | 2 +- .../class/RecordNoClosingTypeBracket.txt | 2 +- .../class/RecordNoComponents.txt | 2 +- .../class/RecordWithComponents.txt | 2 +- .../class/RecordWithModifiers.txt | 2 +- .../class/RecordWithTypeParameters.txt | 2 +- .../completion/KeywordCompletionTest.java | 18 +++--------------- 16 files changed, 22 insertions(+), 27 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/record.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/recordInFileScope.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/record_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java index 146b8c1a7c20..306a9f649c4c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -546,6 +546,9 @@ public class JavaKeywordCompletion { PsiTreeUtil.getParentOfType(myPosition, PsiCodeBlock.class, true, PsiMember.class) == null) { addKeyword(new OverridableSpace(createKeyword(PsiKeyword.CLASS), TailType.HUMBLE_SPACE_BEFORE_WORD)); addKeyword(new OverridableSpace(createKeyword(PsiKeyword.INTERFACE), TailType.HUMBLE_SPACE_BEFORE_WORD)); + if (PsiUtil.getLanguageLevel(myPosition).isAtLeast(LanguageLevel.JDK_14)) { + addKeyword(new OverridableSpace(createKeyword(PsiKeyword.RECORD), TailType.HUMBLE_SPACE_BEFORE_WORD)); + } if (PsiUtil.isLanguageLevel5OrHigher(myPosition)) { addKeyword(new OverridableSpace(createKeyword(PsiKeyword.ENUM), TailType.INSERT_SPACE)); } diff --git a/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java b/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java index deb97cbe4a1a..f028598d198c 100644 --- a/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java +++ b/java/java-psi-impl/src/com/intellij/lang/java/lexer/JavaLexer.java @@ -23,7 +23,7 @@ public class JavaLexer extends LexerBase { ABSTRACT, BOOLEAN, BREAK, BYTE, CASE, CATCH, CHAR, CLASS, CONST, CONTINUE, DEFAULT, DO, DOUBLE, ELSE, EXTENDS, FINAL, FINALLY, FLOAT, FOR, GOTO, IF, IMPLEMENTS, IMPORT, INSTANCEOF, INT, INTERFACE, LONG, NATIVE, NEW, PACKAGE, PRIVATE, PROTECTED, PUBLIC, RETURN, SHORT, STATIC, STRICTFP, SUPER, SWITCH, SYNCHRONIZED, THIS, THROW, THROWS, TRANSIENT, TRY, VOID, VOLATILE, WHILE, - TRUE, FALSE, NULL); + TRUE, FALSE, NULL, RECORD); private static final Set JAVA9_KEYWORDS = ContainerUtil.newTroveSet( CharSequenceHashingStrategy.CASE_SENSITIVE, @@ -39,7 +39,8 @@ public class JavaLexer extends LexerBase { return id != null && (level.isAtLeast(LanguageLevel.JDK_1_9) && JAVA9_KEYWORDS.contains(id) || level.isAtLeast(LanguageLevel.JDK_10) && VAR.contentEquals(id) || - level.isAtLeast(LanguageLevel.JDK_13_PREVIEW) && YIELD.contentEquals(id)); + level.isAtLeast(LanguageLevel.JDK_13_PREVIEW) && YIELD.contentEquals(id) || + level.isAtLeast(LanguageLevel.JDK_14) && RECORD.contentEquals(id)); } private final _JavaLexer myFlexLexer; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ElementType.java index af1c34673e82..f50479d1fcc8 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ElementType.java @@ -19,7 +19,7 @@ public interface ElementType extends JavaTokenType, JavaDocTokenType, JavaElemen SWITCH_KEYWORD, SYNCHRONIZED_KEYWORD, THIS_KEYWORD, THROW_KEYWORD, THROWS_KEYWORD, TRANSIENT_KEYWORD, TRY_KEYWORD, VOID_KEYWORD, VOLATILE_KEYWORD, WHILE_KEYWORD, OPEN_KEYWORD, MODULE_KEYWORD, REQUIRES_KEYWORD, EXPORTS_KEYWORD, OPENS_KEYWORD, USES_KEYWORD, PROVIDES_KEYWORD, - TRANSITIVE_KEYWORD, TO_KEYWORD, WITH_KEYWORD, VAR_KEYWORD, YIELD_KEYWORD); + TRANSITIVE_KEYWORD, TO_KEYWORD, WITH_KEYWORD, VAR_KEYWORD, YIELD_KEYWORD, RECORD_KEYWORD); TokenSet LITERAL_BIT_SET = TokenSet.create(TRUE_KEYWORD, FALSE_KEYWORD, NULL_KEYWORD); diff --git a/java/java-tests/testData/codeInsight/completion/keywords/record.java b/java/java-tests/testData/codeInsight/completion/keywords/record.java new file mode 100644 index 000000000000..907b0953ab5b --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/record.java @@ -0,0 +1 @@ +rec A {} diff --git a/java/java-tests/testData/codeInsight/completion/keywords/recordInFileScope.java b/java/java-tests/testData/codeInsight/completion/keywords/recordInFileScope.java new file mode 100644 index 000000000000..113fdcf80684 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/recordInFileScope.java @@ -0,0 +1 @@ + diff --git a/java/java-tests/testData/codeInsight/completion/keywords/record_after.java b/java/java-tests/testData/codeInsight/completion/keywords/record_after.java new file mode 100644 index 000000000000..04d4a55fd5be --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/record_after.java @@ -0,0 +1 @@ +record A {} diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor0.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor0.txt index e1a1d62428c6..f189f7a5d6f8 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor0.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor0.txt @@ -4,7 +4,7 @@ PsiJavaFile:CompactConstructor0.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor1.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor1.txt index cc9117f08e33..40c71f413351 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor1.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/CompactConstructor1.txt @@ -4,7 +4,7 @@ PsiJavaFile:CompactConstructor1.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Record.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Record.txt index 15aafbd02ff5..a4c336a437ee 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/Record.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/Record.txt @@ -4,7 +4,7 @@ PsiJavaFile:Record.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingParenthesis.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingParenthesis.txt index 357793154d75..25fb65fdbf36 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingParenthesis.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingParenthesis.txt @@ -4,7 +4,7 @@ PsiJavaFile:RecordNoClosingParenthesis.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingTypeBracket.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingTypeBracket.txt index e6200d11ff8c..ed1d423383c9 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingTypeBracket.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoClosingTypeBracket.txt @@ -4,7 +4,7 @@ PsiJavaFile:RecordNoClosingTypeBracket.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoComponents.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoComponents.txt index 50618ed795ee..fef52ada2669 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoComponents.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordNoComponents.txt @@ -4,7 +4,7 @@ PsiJavaFile:RecordNoComponents.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithComponents.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithComponents.txt index 4277726de1dd..cd4b36ccb5cc 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithComponents.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithComponents.txt @@ -4,7 +4,7 @@ PsiJavaFile:RecordWithComponents.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithModifiers.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithModifiers.txt index c6ac9d19117b..062d2dce4d88 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithModifiers.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithModifiers.txt @@ -5,7 +5,7 @@ PsiJavaFile:RecordWithModifiers.java PsiModifierList:private PsiKeyword:private('private') PsiWhiteSpace(' ') - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithTypeParameters.txt b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithTypeParameters.txt index 01796d59e51b..70ca1c72c91c 100644 --- a/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithTypeParameters.txt +++ b/java/java-tests/testData/psi/parser-full/declarationParsing/class/RecordWithTypeParameters.txt @@ -4,7 +4,7 @@ PsiJavaFile:RecordWithTypeParameters.java PsiClass:ClassName PsiModifierList: - PsiJavaToken:RECORD('record') + PsiKeyword:record('record') PsiWhiteSpace(' ') PsiIdentifier:ClassName('ClassName') PsiTypeParameterList diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java index 7e590eb1cbae..29b8e73a74d4 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.java.codeInsight.completion; import com.intellij.JavaTestUtil; @@ -169,6 +155,8 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testSuggestModifiersAfterUnfinishedMethod() { doTest(1, "public"); } public void testPrivateInJava9Interface() { setLanguageLevel(LanguageLevel.JDK_1_9); doTest(); } public void testQualifiedNew() { doTest(1, "new"); } + public void testRecord() {setLanguageLevel(LanguageLevel.JDK_14); doTest(); } + public void testRecordInFileScope() {setLanguageLevel(LanguageLevel.JDK_14); doTest(1, "record"); } public void testOverwriteCatch() { configureByTestName();