diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaModuleCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaModuleCompletion.java index 0c609bdb8baf..2012662c9a62 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaModuleCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaModuleCompletion.java @@ -71,7 +71,12 @@ class JavaModuleCompletion { } private static void addFileHeaderKeywords(PsiElement position, Consumer result) { - if (PsiTreeUtil.prevVisibleLeaf(position) == null) { + PsiElement prev = PsiTreeUtil.prevVisibleLeaf(position); + if (prev == null) { + result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.MODULE), TailType.HUMBLE_SPACE_BEFORE_WORD)); + result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.OPEN), TailType.HUMBLE_SPACE_BEFORE_WORD)); + } + else if (PsiUtil.isJavaToken(prev, JavaTokenType.OPEN_KEYWORD)) { result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.MODULE), TailType.HUMBLE_SPACE_BEFORE_WORD)); } } @@ -79,6 +84,7 @@ class JavaModuleCompletion { private static void addModuleStatementKeywords(PsiElement position, Consumer result) { result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.REQUIRES), TailType.HUMBLE_SPACE_BEFORE_WORD)); result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.EXPORTS), TailType.HUMBLE_SPACE_BEFORE_WORD)); + result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.OPENS), TailType.HUMBLE_SPACE_BEFORE_WORD)); result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.USES), TailType.HUMBLE_SPACE_BEFORE_WORD)); result.consume(new OverrideableSpace(createKeyword(position, PsiKeyword.PROVIDES), TailType.HUMBLE_SPACE_BEFORE_WORD)); } @@ -89,6 +95,10 @@ class JavaModuleCompletion { private static void addModuleReferences(PsiElement context, Consumer result) { PsiElement statement = context.getParent(); + if (statement instanceof PsiRequiresStatement) { + result.consume(new OverrideableSpace(createKeyword(context, PsiKeyword.TRANSITIVE), TailType.HUMBLE_SPACE_BEFORE_WORD)); + result.consume(new OverrideableSpace(createKeyword(context, PsiKeyword.STATIC), TailType.HUMBLE_SPACE_BEFORE_WORD)); + } if (!(statement instanceof PsiJavaModule)) { PsiElement host = statement.getParent(); if (host instanceof PsiJavaModule) { diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/ModuleCompletionTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/completion/ModuleCompletionTest.kt index f8b08724043c..ed1eebae6816 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/ModuleCompletionTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/ModuleCompletionTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * 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. @@ -25,11 +25,17 @@ class ModuleCompletionTest : LightJava9ModulesCodeInsightFixtureTestCase() { addFile("module-info.java", "module M2 { }", M2) } - fun testFileHeader() = complete("", "module ") + fun testFileHeader1() = variants("", "module", "open") + fun testFileHeader2() = complete("open ", "open module ") fun testModuleName() = variants("module M") - fun testStatements1() = variants("module M { }", "requires", "exports", "uses", "provides") + fun testStatements1() = variants("module M { }", "requires", "exports", "opens", "uses", "provides") fun testStatements2() = complete("module M { requires X; ex }", "module M { requires X; exports }") - fun testModuleRef() = complete("module M { requires M }", "module M { requires M2; }") + + fun testRequires() { + variants("module M { requires ", "transitive", "static", "M2", "java.base", "lib.multi.release", "lib.named") + complete("module M { requires t }", "module M { requires transitive }") + complete("module M { requires M }", "module M { requires M2; }") + } fun testExports() { addFile("pkg/empty/package-info.java", "package pkg.empty;")