From 675559f5ccfb6bd1779f079c96e087d97ef9d2df Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 10 Nov 2011 20:05:34 +0100 Subject: [PATCH] per-position language level checking when suggesting completion keywords (EA-29624) --- .../BasicExpressionCompletionContributor.java | 2 +- .../src/com/intellij/psi/PsiElementFactory.java | 1 + .../com/intellij/psi/impl/PsiElementFactoryImpl.java | 10 ++++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java index d3f1663b5f8e..cedc14ed900a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java @@ -48,7 +48,7 @@ public class BasicExpressionCompletionContributor { public static LookupElement createKeywordLookupItem(final PsiElement element, final String s) { try { - final PsiKeyword keyword = JavaPsiFacade.getInstance(element.getProject()).getElementFactory().createKeyword(s); + final PsiKeyword keyword = JavaPsiFacade.getInstance(element.getProject()).getElementFactory().createKeyword(s, element); return new KeywordLookupItem(keyword, element).setAutoCompletionPolicy(AutoCompletionPolicy.GIVE_CHANCE_TO_OVERWRITE); } catch (IncorrectOperationException e) { diff --git a/java/java-psi-api/src/com/intellij/psi/PsiElementFactory.java b/java/java-psi-api/src/com/intellij/psi/PsiElementFactory.java index 311197d8047c..333b7b9e94ab 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiElementFactory.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiElementFactory.java @@ -333,6 +333,7 @@ public interface PsiElementFactory extends PsiJavaParserFacade, JVMElementFactor * @throws IncorrectOperationException if text is not a valid Java keyword. */ @NotNull PsiKeyword createKeyword(@NotNull @NonNls String keyword) throws IncorrectOperationException; + @NotNull PsiKeyword createKeyword(@NotNull @NonNls String keyword, PsiElement context) throws IncorrectOperationException; /** * Creates an import statement for importing the specified class. diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java index 78903336d338..e71ee879602a 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl; import com.intellij.lang.*; import com.intellij.lang.java.parser.JavaParserUtil; import com.intellij.lang.java.parser.StatementParser; +import com.intellij.lexer.JavaLexer; import com.intellij.lexer.Lexer; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -503,6 +504,15 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps return new LightKeyword(myManager, text); } + @NotNull + @Override + public PsiKeyword createKeyword(@NotNull @NonNls String keyword, PsiElement context) throws IncorrectOperationException { + if (!JavaLexer.isKeyword(keyword, PsiUtil.getLanguageLevel(context))) { + throw new IncorrectOperationException("\"" + keyword + "\" is not a keyword."); + } + return new LightKeyword(myManager, keyword); + } + @NotNull @Override public PsiImportStatement createImportStatement(@NotNull final PsiClass aClass) throws IncorrectOperationException {