diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ContentEntriesEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ContentEntriesEditor.java index 421d94cb05a9..d4677c1f7a09 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ContentEntriesEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ContentEntriesEditor.java @@ -16,7 +16,7 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.roots.LanguageLevelModuleExtension; +import com.intellij.openapi.roots.LanguageLevelModuleExtensionImpl; import javax.swing.*; import java.awt.*; @@ -48,8 +48,8 @@ public class ContentEntriesEditor extends JavaContentEntriesEditor { protected void addAdditionalSettingsToPanel(final JPanel mainPanel) { myLanguageLevelConfigurable = new LanguageLevelConfigurable() { @Override - public LanguageLevelModuleExtension getLanguageLevelExtension() { - return getModel().getModuleExtension(LanguageLevelModuleExtension.class); + public LanguageLevelModuleExtensionImpl getLanguageLevelExtension() { + return getModel().getModuleExtension(LanguageLevelModuleExtensionImpl.class); } }; mainPanel.add(myLanguageLevelConfigurable.createComponent(), BorderLayout.NORTH); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelConfigurable.java index dfa56b220b4c..1ed84cda2c7f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelConfigurable.java @@ -19,7 +19,7 @@ package com.intellij.openapi.roots.ui.configuration; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.ProjectBundle; -import com.intellij.openapi.roots.LanguageLevelModuleExtension; +import com.intellij.openapi.roots.LanguageLevelModuleExtensionImpl; import com.intellij.pom.java.LanguageLevel; import javax.swing.*; @@ -78,5 +78,5 @@ public abstract class LanguageLevelConfigurable implements UnnamedConfigurable { myLanguageLevelCombo = null; } - public abstract LanguageLevelModuleExtension getLanguageLevelExtension(); + public abstract LanguageLevelModuleExtensionImpl getLanguageLevelExtension(); } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java index a2a7e6b5c76f..3886a4db1a3f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java @@ -925,7 +925,8 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple modifiableRootModel.getModuleExtension(CompilerModuleExtension.class).inheritCompilerOutputPath(true); - modifiableRootModel.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(LanguageLevelModuleExtension.getInstance(rootModel.getModule()).getLanguageLevel()); + modifiableRootModel.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel( + LanguageLevelModuleExtensionImpl.getInstance(rootModel.getModule()).getLanguageLevel()); for (OrderEntry entry : rootModel.getOrderEntries()) { if (entry instanceof JdkOrderEntry) continue; diff --git a/java/java-analysis-api/src/com/intellij/openapi/module/EffectiveLanguageLevelUtil.java b/java/java-analysis-api/src/com/intellij/openapi/module/EffectiveLanguageLevelUtil.java index 1bf588c2e732..e8d1f7b362a6 100644 --- a/java/java-analysis-api/src/com/intellij/openapi/module/EffectiveLanguageLevelUtil.java +++ b/java/java-analysis-api/src/com/intellij/openapi/module/EffectiveLanguageLevelUtil.java @@ -17,6 +17,7 @@ package com.intellij.openapi.module; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.roots.LanguageLevelModuleExtension; +import com.intellij.openapi.roots.LanguageLevelModuleExtensionImpl; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.pom.java.LanguageLevel; import org.jetbrains.annotations.NotNull; @@ -25,7 +26,7 @@ public class EffectiveLanguageLevelUtil { @NotNull public static LanguageLevel getEffectiveLanguageLevel(@NotNull final Module module) { ApplicationManager.getApplication().assertReadAccessAllowed(); - LanguageLevelModuleExtension moduleLevel = LanguageLevelModuleExtension.getInstance(module); + LanguageLevelModuleExtension moduleLevel = LanguageLevelModuleExtensionImpl.getInstance(module); LanguageLevel level = moduleLevel == null ? null : moduleLevel.getLanguageLevel(); if (level != null) return level; return LanguageLevelProjectExtension.getInstance(module.getProject()).getLanguageLevel(); diff --git a/java/java-analysis-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtension.java b/java/java-analysis-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtensionImpl.java similarity index 82% rename from java/java-analysis-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtension.java rename to java/java-analysis-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtensionImpl.java index c7068ec43482..934e50910b86 100644 --- a/java/java-analysis-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtension.java +++ b/java/java-analysis-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtensionImpl.java @@ -29,42 +29,38 @@ import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -public class LanguageLevelModuleExtension extends ModuleExtension { +public class LanguageLevelModuleExtensionImpl extends ModuleExtension implements LanguageLevelModuleExtension { @NonNls private static final String LANGUAGE_LEVEL_ELEMENT_NAME = "LANGUAGE_LEVEL"; private Module myModule; private final boolean myWritable; - private static final Logger LOG = Logger.getInstance("#" + LanguageLevelModuleExtension.class.getName()); - - public static LanguageLevelModuleExtension getInstance(final Module module) { - return ModuleRootManager.getInstance(module).getModuleExtension(LanguageLevelModuleExtension.class); - } + private static final Logger LOG = Logger.getInstance("#" + LanguageLevelModuleExtensionImpl.class.getName()); private LanguageLevel myLanguageLevel; - private final LanguageLevelModuleExtension mySource; + private final LanguageLevelModuleExtensionImpl mySource; - public LanguageLevelModuleExtension(Module module) { + public static LanguageLevelModuleExtensionImpl getInstance(final Module module) { + return ModuleRootManager.getInstance(module).getModuleExtension(LanguageLevelModuleExtensionImpl.class); + } + + public LanguageLevelModuleExtensionImpl(Module module) { myModule = module; mySource = null; myWritable = false; } - public LanguageLevelModuleExtension(final LanguageLevelModuleExtension source, boolean writable) { + public LanguageLevelModuleExtensionImpl(final LanguageLevelModuleExtensionImpl source, boolean writable) { myWritable = writable; myModule = source.myModule; myLanguageLevel = source.myLanguageLevel; mySource = source; } + @Override public void setLanguageLevel(final LanguageLevel languageLevel) { LOG.assertTrue(myWritable, "Writable model can be retrieved from writable ModifiableRootModel"); myLanguageLevel = languageLevel; } - @Nullable - public LanguageLevel getLanguageLevel() { - return myLanguageLevel; - } - @Override public void readExternal(final Element element) throws InvalidDataException { final String languageLevel = element.getAttributeValue(LANGUAGE_LEVEL_ELEMENT_NAME); @@ -90,7 +86,7 @@ public class LanguageLevelModuleExtension extends ModuleExtension languageLevels = new HashSet(); for (Module module : ModuleManager.getInstance(project).getModules()) { - final LanguageLevelModuleExtension instance = LanguageLevelModuleExtension.getInstance(module); + final LanguageLevelModuleExtension instance = LanguageLevelModuleExtensionImpl.getInstance(module); final LanguageLevel languageLevel = instance.getLanguageLevel(); if (languageLevel != null) { languageLevels.add(languageLevel.toString()); diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java index fcaf5b726f9f..cb5d6be103fd 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaFunctionalExpressionSearcher.java @@ -16,8 +16,14 @@ package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.impl.scopes.ModulesScope; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.LanguageLevelModuleExtension; +import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Computable; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.impl.java.stubs.JavaMethodElementType; import com.intellij.psi.impl.java.stubs.index.JavaMethodParameterTypesIndex; @@ -31,10 +37,12 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; +import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.LinkedHashSet; +import java.util.Set; public class JavaFunctionalExpressionSearcher implements QueryExecutor { @@ -42,10 +50,26 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor consumer) { final PsiClass aClass = queryParameters.getElementToSearch(); + final Set highLevelModules = new HashSet(); if (ApplicationManager.getApplication().runReadAction(new Computable() { @Override public Boolean compute() { - return !LambdaUtil.isFunctionalClass(aClass) || !PsiUtil.isLanguageLevel8OrHigher(aClass); + if (LambdaUtil.isFunctionalClass(aClass)) { + final Project project = aClass.getProject(); + final boolean projectLevelIsHigh = PsiUtil.getLanguageLevel(project).isAtLeast(LanguageLevel.JDK_1_8); + + for (Module module : ModuleManager.getInstance(project).getModules()) { + final LanguageLevelModuleExtension extension = ModuleRootManager.getInstance(module).getModuleExtension(LanguageLevelModuleExtension.class); + if (extension != null) { + final LanguageLevel level = extension.getLanguageLevel(); + if (level == null && projectLevelIsHigh || level != null && level.isAtLeast(LanguageLevel.JDK_1_8)) { + highLevelModules.add(module); + } + } + } + return highLevelModules.isEmpty(); + } + return true; } })) { return true; @@ -55,12 +79,13 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor consumer) { + final Processor consumer, + final Set highLevelModules) { final SearchScope classScope = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public SearchScope compute() { @@ -74,7 +99,8 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor lambdaCandidates = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override public Collection compute() { @@ -82,7 +108,8 @@ public class JavaFunctionalExpressionSearcher implements QueryExecutor methods = new LinkedHashSet(parameterTypesIndex.get(functionalInterfaceName, project, useClassScope)); - methods.addAll(parameterTypesIndex.get(JavaMethodElementType.TYPE_PARAMETER_PSEUDO_NAME, project, GlobalSearchScope.allScope(project))); + methods.addAll(parameterTypesIndex.get(JavaMethodElementType.TYPE_PARAMETER_PSEUDO_NAME, project, + GlobalSearchScope.allScope(project))); return methods; } }); diff --git a/java/java-psi-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtension.java b/java/java-psi-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtension.java new file mode 100644 index 000000000000..ea5d41ea8d09 --- /dev/null +++ b/java/java-psi-api/src/com/intellij/openapi/roots/LanguageLevelModuleExtension.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-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 com.intellij.openapi.roots; + +import com.intellij.pom.java.LanguageLevel; +import org.jetbrains.annotations.Nullable; + +public interface LanguageLevelModuleExtension { + void setLanguageLevel(LanguageLevel languageLevel); + @Nullable + LanguageLevel getLanguageLevel(); +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java index e7c19bf19c3f..3b651cff08a4 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java @@ -15,11 +15,14 @@ */ package com.intellij.codeInsight.daemon.lambda; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiType; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.ChangeSignatureBaseTest; import com.intellij.refactoring.changeSignature.ParameterInfoImpl; import com.intellij.refactoring.changeSignature.ThrownExceptionInfo; +import com.intellij.testFramework.IdeaTestUtil; public class ChangeSignatureTouchLambdaTest extends ChangeSignatureBaseTest { diff --git a/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java b/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java index e0a2806d4668..9a068da38878 100644 --- a/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java +++ b/java/testFramework/src/com/intellij/testFramework/IdeaTestUtil.java @@ -23,10 +23,7 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkModificator; import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl; -import com.intellij.openapi.roots.LanguageLevelModuleExtension; -import com.intellij.openapi.roots.LanguageLevelProjectExtension; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.LocalFileSystem; @@ -51,7 +48,7 @@ public class IdeaTestUtil extends PlatformTestUtil { final LanguageLevelProjectExtension projectExt = LanguageLevelProjectExtension.getInstance(module.getProject()); final LanguageLevel projectLevel = projectExt.getLanguageLevel(); - final LanguageLevel moduleLevel = LanguageLevelModuleExtension.getInstance(module).getLanguageLevel(); + final LanguageLevel moduleLevel = LanguageLevelModuleExtensionImpl.getInstance(module).getLanguageLevel(); try { projectExt.setLanguageLevel(level); setModuleLanguageLevel(module, level); @@ -64,7 +61,8 @@ public class IdeaTestUtil extends PlatformTestUtil { } public static void setModuleLanguageLevel(Module module, final LanguageLevel level) { - final LanguageLevelModuleExtension modifiable = (LanguageLevelModuleExtension)LanguageLevelModuleExtension.getInstance(module).getModifiableModel(true); + final LanguageLevelModuleExtensionImpl + modifiable = (LanguageLevelModuleExtensionImpl)LanguageLevelModuleExtensionImpl.getInstance(module).getModifiableModel(true); modifiable.setLanguageLevel(level); modifiable.commit(); } diff --git a/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModulesScope.java b/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModulesScope.java new file mode 100644 index 000000000000..4919ad67c95a --- /dev/null +++ b/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModulesScope.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-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 com.intellij.openapi.module.impl.scopes; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Set; + +public class ModulesScope extends GlobalSearchScope { + + private final ProjectFileIndex myProjectFileIndex; + private final Set myModules; + + public ModulesScope(@NotNull Set modules, Project project) { + super(project); + myProjectFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + myModules = modules; + } + + @Override + public boolean contains(@NotNull VirtualFile file) { + Module moduleOfFile = myProjectFileIndex.getModuleForFile(file); + return moduleOfFile != null && myModules.contains(moduleOfFile); + } + + @Override + public int compare(@NotNull VirtualFile file1, @NotNull VirtualFile file2) { + return 0; + } + + @Override + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return myModules.contains(aModule); + } + + @Override + public boolean isSearchInLibraries() { + return false; + } + + @NonNls + public String toString() { + return "Modules:" + Arrays.toString(myModules.toArray(new Module[myModules.size()])); + } +} diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java index 4541cf57f7a7..5be9a0e0bc27 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java @@ -152,7 +152,7 @@ public class IdeaSpecificSettings extends AbstractIdeaSpecificSettings - +