diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java index 696ef2f66fb2..0143c83caa1b 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java @@ -15,6 +15,8 @@ */ package org.jetbrains.plugins.groovy.dgm; +import com.intellij.lang.properties.IProperty; +import com.intellij.lang.properties.psi.PropertiesFile; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Couple; import com.intellij.psi.*; @@ -26,13 +28,15 @@ import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import java.util.List; import java.util.concurrent.ConcurrentMap; +import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.DEFAULT_INSTANCE_EXTENSIONS; +import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.DEFAULT_STATIC_EXTENSIONS; + /** * Provides members from extension classes referenced in {@code META-INF/services/org.codehaus.groovy.runtime.ExtensionModule}. */ @@ -72,7 +76,7 @@ public class DGMMemberContributor extends NonCodeMembersContributor { List gdkMethods = ContainerUtil.newArrayList(); JavaPsiFacade facade = JavaPsiFacade.getInstance(project); - Couple> extensions = GroovyExtensionProvider.getInstance(project).collectExtensions(resolveScope); + Couple> extensions = collectExtensions(project, resolveScope); for (String category : extensions.getFirst()) { PsiClass clazz = facade.findClass(category, resolveScope); if (clazz != null) { @@ -87,4 +91,39 @@ public class DGMMemberContributor extends NonCodeMembersContributor { } return gdkMethods; } + + @NotNull + private static Couple> collectExtensions(@NotNull Project project, @NotNull GlobalSearchScope resolveScope) { + List instanceClasses = ContainerUtil.newArrayList(DEFAULT_INSTANCE_EXTENSIONS); + List staticClasses = ContainerUtil.newArrayList(DEFAULT_STATIC_EXTENSIONS); + doCollectExtensions(project, resolveScope, instanceClasses, staticClasses); + return Couple.of(instanceClasses, staticClasses); + } + + private static void doCollectExtensions(@NotNull Project project, + @NotNull GlobalSearchScope resolveScope, + List instanceClasses, + List staticClasses) { + PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage("META-INF.services"); + if (aPackage == null) return; + + for (PsiDirectory directory : aPackage.getDirectories(resolveScope)) { + PsiFile file = directory.findFile(DGMUtil.ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE); + if (file instanceof PropertiesFile) { + IProperty inst = ((PropertiesFile)file).findPropertyByKey("extensionClasses"); + IProperty stat = ((PropertiesFile)file).findPropertyByKey("staticExtensionClasses"); + + if (inst != null) collectClasses(inst, instanceClasses); + if (stat != null) collectClasses(stat, staticClasses); + } + } + } + + private static void collectClasses(IProperty pr, List classes) { + String value = pr.getUnescapedValue(); + if (value == null) return; + value = value.trim(); + String[] qnames = value.split("\\s*,\\s*"); + ContainerUtil.addAll(classes, qnames); + } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMUtil.java index 09c00afbfd4a..faf605c098f2 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/DGMUtil.java @@ -25,12 +25,13 @@ import com.intellij.psi.PsiFile; * @author Max Medvedev */ public class DGMUtil { + public static final String ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE = "org.codehaus.groovy.runtime.ExtensionModule"; public static final String[] KEYS = new String[]{"moduleName", "moduleVersion", "extensionClasses", "staticExtensionClasses",}; public static boolean isInDGMFile(PsiElement e) { PsiFile file = e.getContainingFile(); return file instanceof PropertiesFile && - Comparing.equal(file.getName(), GroovyExtensionProvider.ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE, + Comparing.equal(file.getName(), ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE, SystemInfo.isFileSystemCaseSensitive); } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/GroovyExtensionProvider.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/GroovyExtensionProvider.java deleted file mode 100644 index f1963f84f03c..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/GroovyExtensionProvider.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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 org.jetbrains.plugins.groovy.dgm; - -import com.intellij.lang.properties.IProperty; -import com.intellij.lang.properties.psi.PropertiesFile; -import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Couple; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiPackage; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.DEFAULT_INSTANCE_EXTENSIONS; -import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.DEFAULT_STATIC_EXTENSIONS; - -/** - * @author Max Medvedev - */ -public class GroovyExtensionProvider { - @NonNls public static final String ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE = "org.codehaus.groovy.runtime.ExtensionModule"; - private final Project myProject; - - public GroovyExtensionProvider(Project project) { - myProject = project; - } - - public static GroovyExtensionProvider getInstance(Project project) { - return ServiceManager.getService(project, GroovyExtensionProvider.class); - } - - public Couple> collectExtensions(@NotNull GlobalSearchScope resolveScope) { - List instanceClasses = ContainerUtil.newArrayList(DEFAULT_INSTANCE_EXTENSIONS); - List staticClasses = ContainerUtil.newArrayList(DEFAULT_STATIC_EXTENSIONS); - doCollectExtensions(resolveScope, instanceClasses, staticClasses); - return Couple.of(instanceClasses, staticClasses); - } - - private void doCollectExtensions(@NotNull GlobalSearchScope resolveScope, List instanceClasses, List staticClasses) { - PsiPackage aPackage = JavaPsiFacade.getInstance(myProject).findPackage("META-INF.services"); - if (aPackage == null) return; - - for (PsiDirectory directory : aPackage.getDirectories(resolveScope)) { - PsiFile file = directory.findFile(ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE); - if (file instanceof PropertiesFile) { - IProperty inst = ((PropertiesFile)file).findPropertyByKey("extensionClasses"); - IProperty stat = ((PropertiesFile)file).findPropertyByKey("staticExtensionClasses"); - - if (inst != null) collectClasses(inst, instanceClasses); - if (stat != null) collectClasses(stat, staticClasses); - } - } - } - - private static void collectClasses(IProperty pr, List classes) { - String value = pr.getUnescapedValue(); - if (value == null) return; - value = value.trim(); - String[] qnames = value.split("\\s*,\\s*"); - ContainerUtil.addAll(classes, qnames); - } - - public static class GroovyExtensionVetoSPI implements Condition { - - @Override - public boolean value(String s) { - return ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE.equals(s); - } - } -} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/GroovyExtensionVetoSPI.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/GroovyExtensionVetoSPI.java new file mode 100644 index 000000000000..1c99743f8281 --- /dev/null +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/dgm/GroovyExtensionVetoSPI.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2016 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.plugins.groovy.dgm; + +import com.intellij.openapi.util.Condition; + +public class GroovyExtensionVetoSPI implements Condition { + + @Override + public boolean value(String s) { + return DGMUtil.ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE.equals(s); + } +} diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java index 3a90f63ba359..585c6321d66b 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java @@ -66,7 +66,6 @@ import org.jetbrains.plugins.groovy.configSlurper.ConfigSlurperMapContentProvide import org.jetbrains.plugins.groovy.configSlurper.GroovyMapValueTypeEnhancer; import org.jetbrains.plugins.groovy.dgm.DGMImplicitPropertyUsageProvider; import org.jetbrains.plugins.groovy.dgm.DGMMemberContributor; -import org.jetbrains.plugins.groovy.dgm.GroovyExtensionProvider; import org.jetbrains.plugins.groovy.dsl.DslActivationStatus; import org.jetbrains.plugins.groovy.dsl.GroovyDslAnnotator; import org.jetbrains.plugins.groovy.dsl.GroovyDslFileIndex; @@ -359,7 +358,6 @@ public class GroovyCoreEnvironment { project.registerService(GroovyPsiManager.class, GroovyPsiManager.class); project.registerService(GroovyCodeStyleManager.class, CoreGroovyCodeStyleManager.class); project.registerService(GroovyCodeStyleSettingsFacade.class, CoreGroovyCodeStyleSettingsFacade.class); - project.registerService(GroovyExtensionProvider.class, GroovyExtensionProvider.class); projectEnvironment.addProjectExtension(PsiShortNamesCache.EP_NAME, new GroovyShortNamesCache(project)); projectEnvironment.addProjectExtension(PsiElementFinder.EP_NAME, new GroovyClassFinder(project)); TextEditorHighlightingPassRegistrar registrar = TextEditorHighlightingPassRegistrar.getInstance(project); diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index 9ac4d73c13f1..a1d2009df337 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -576,7 +576,7 @@ - + @@ -626,9 +626,6 @@ - - diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMFileTypeFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMFileTypeFactory.java index e82c560e4571..d3cbd33d66ff 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMFileTypeFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMFileTypeFactory.java @@ -29,7 +29,7 @@ public class DGMFileTypeFactory extends FileTypeFactory { @Override public void createFileTypes(@NotNull FileTypeConsumer consumer) { - ExactFileNameMatcher matcher = new ExactFileNameMatcher(GroovyExtensionProvider.ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE, + ExactFileNameMatcher matcher = new ExactFileNameMatcher(DGMUtil.ORG_CODEHAUS_GROOVY_RUNTIME_EXTENSION_MODULE, !SystemInfo.isFileSystemCaseSensitive); consumer.consume(PropertiesFileType.INSTANCE, matcher); }