diff options
Diffstat (limited to 'plugins/devkit')
6 files changed, 52 insertions, 268 deletions
diff --git a/plugins/devkit/resources/META-INF/plugin.xml b/plugins/devkit/resources/META-INF/plugin.xml index d92839c2df6c..9bb838c8e02c 100644 --- a/plugins/devkit/resources/META-INF/plugin.xml +++ b/plugins/devkit/resources/META-INF/plugin.xml @@ -27,7 +27,6 @@ <junitPatcher implementation="org.jetbrains.idea.devkit.run.JUnitDevKitPatcher"/> <antBuildGen implementation="org.jetbrains.idea.devkit.build.ant.ChunkBuildPluginExtension"/> - <compiler.buildParticipantProvider implementation="org.jetbrains.idea.devkit.build.PluginBuildParticipantProvider"/> <compiler.buildTargetScopeProvider implementation="org.jetbrains.idea.devkit.build.PluginModuleBuildScopeProvider"/> <dom.fileDescription implementation="org.jetbrains.idea.devkit.dom.impl.PluginXmlDomFileDescription"/> @@ -46,6 +45,7 @@ <dom.implementation interfaceClass="org.jetbrains.idea.devkit.dom.Extensions" implementationClass="org.jetbrains.idea.devkit.dom.impl.ExtensionsImpl"/> <useScopeEnlarger implementation="org.jetbrains.idea.devkit.DevKitUseScopeEnlarger"/> + <properties.implicitPropertyUsageProvider implementation="org.jetbrains.idea.devkit.references.RegistryImplicitPropertyUsageProvider"/> <configurationType implementation="org.jetbrains.idea.devkit.run.PluginConfigurationType"/> <moduleType id="PLUGIN_MODULE" implementationClass="org.jetbrains.idea.devkit.module.PluginModuleType" classpathProvider="true"/> diff --git a/plugins/devkit/src/build/PluginBuildConfiguration.java b/plugins/devkit/src/build/PluginBuildConfiguration.java index 3604b0f0d13a..1155402e3f39 100644 --- a/plugins/devkit/src/build/PluginBuildConfiguration.java +++ b/plugins/devkit/src/build/PluginBuildConfiguration.java @@ -54,13 +54,11 @@ public class PluginBuildConfiguration implements ModuleComponent, JDOMExternaliz @NonNls private static final String MANIFEST_ATTR = "manifest"; @NonNls private static final String META_INF = "META-INF"; @NonNls private static final String PLUGIN_XML = "plugin.xml"; - private final PluginBuildParticipant myBuildParticipant; public PluginBuildConfiguration(Module module) { myModule = module; myPluginXmlContainer = ConfigFileFactory.getInstance().createSingleFileContainer(myModule.getProject(), PluginDescriptorConstants.META_DATA); Disposer.register(module, myPluginXmlContainer); - myBuildParticipant = new PluginBuildParticipant(module, this); } @Nullable @@ -203,8 +201,4 @@ public class PluginBuildConfiguration implements ModuleComponent, JDOMExternaliz public void setUseUserManifest(final boolean useUserManifest) { myUseUserManifest = useUserManifest; } - - public PluginBuildParticipant getBuildParticipant() { - return myBuildParticipant; - } } diff --git a/plugins/devkit/src/build/PluginBuildParticipant.java b/plugins/devkit/src/build/PluginBuildParticipant.java deleted file mode 100644 index 75f6c7cf3046..000000000000 --- a/plugins/devkit/src/build/PluginBuildParticipant.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 2000-2012 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.idea.devkit.build; - -import com.intellij.openapi.compiler.CompileContext; -import com.intellij.openapi.compiler.CompilerMessageCategory; -import com.intellij.openapi.compiler.make.BuildParticipant; -import com.intellij.openapi.deployment.DeploymentUtil; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.OrderRootType; -import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.JarFileSystem; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VfsUtilCore; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.packaging.artifacts.Artifact; -import com.intellij.packaging.elements.ArtifactRootElement; -import com.intellij.packaging.elements.CompositePackagingElement; -import com.intellij.packaging.elements.PackagingElement; -import com.intellij.packaging.elements.PackagingElementFactory; -import com.intellij.packaging.impl.artifacts.ArtifactImpl; -import com.intellij.packaging.impl.artifacts.PlainArtifactType; -import com.intellij.psi.xml.XmlDocument; -import com.intellij.psi.xml.XmlFile; -import com.intellij.psi.xml.XmlTag; -import com.intellij.util.descriptors.ConfigFile; -import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.DomManager; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.idea.devkit.DevKitBundle; -import org.jetbrains.idea.devkit.dom.Dependency; -import org.jetbrains.idea.devkit.dom.IdeaPlugin; -import org.jetbrains.idea.devkit.module.PluginModuleType; -import org.jetbrains.idea.devkit.projectRoots.IdeaJdk; -import org.jetbrains.idea.devkit.util.DescriptorUtil; - -import java.util.HashSet; -import java.util.List; - -/** - * @author peter -*/ -public class PluginBuildParticipant extends BuildParticipant { - @NonNls private static final String CLASSES = "/classes"; - @NonNls private static final String LIB = "/lib/"; - @NonNls private static final String LIB_DIRECTORY = "lib"; - private final Module myModule; - private final PluginBuildConfiguration myPluginBuildConfiguration; - - public PluginBuildParticipant(final Module module, final PluginBuildConfiguration pluginBuildConfiguration) { - super(); - myModule = module; - myPluginBuildConfiguration = pluginBuildConfiguration; - } - - @Override - public Artifact createArtifact(CompileContext context) { - Sdk sdk = IdeaJdk.findIdeaJdk(ModuleRootManager.getInstance(myModule).getSdk()); - if (sdk != null && IdeaJdk.isFromIDEAProject(sdk.getHomePath())) { - return null; - } - - if (sdk == null) { - context.addMessage(CompilerMessageCategory.ERROR, DevKitBundle.message("sdk.type.incorrect", myModule.getName()), null, -1, -1); - return null; - } - - final String outputPath = PluginBuildUtil.getPluginExPath(myModule); - if (outputPath == null) { - return null; - } - - if (!checkDependencies(context)) { - return null; - } - - - final PackagingElementFactory factory = PackagingElementFactory.getInstance(); - final ArtifactRootElement<?> root = factory.createArtifactRootElement(); - - ConfigFile configFile = myPluginBuildConfiguration.getPluginXML(); - if (configFile != null) { - DeploymentUtil.getInstance().checkConfigFile(configFile, context, myModule); - factory.addFileCopy(root, "META-INF/", VfsUtil.urlToPath(configFile.getUrl())); - - final XmlFile xmlFile = configFile.getXmlFile(); - if (xmlFile != null) { - final XmlDocument document = xmlFile.getDocument(); - if (document != null) { - final DomElement domElement = DomManager.getDomManager(xmlFile.getProject()).getDomElement(document.getRootTag()); - if (domElement instanceof IdeaPlugin) { - for(Dependency dependency: ((IdeaPlugin)domElement).getDependencies()) { - final String file = dependency.getConfigFile().getStringValue(); - if (file != null) { - final VirtualFile virtualFile = configFile.getVirtualFile(); - assert virtualFile != null; - final VirtualFile parent = virtualFile.getParent(); - assert parent != null; - final String url = parent.getUrl(); - factory.addFileCopy(root, "META-INF/", VfsUtil.urlToPath(url) + "/" + file); - } - } - } - } - } - } - - HashSet<Module> modules = new HashSet<Module>(); - PluginBuildUtil.getDependencies(myModule, modules); - - final CompositePackagingElement<?> classesDir = factory.getOrCreateDirectory(root, CLASSES); - for (Module dep : modules) { - classesDir.addOrFindChild(factory.createModuleOutput(dep)); - } - classesDir.addOrFindChild(factory.createModuleOutput(myModule)); - - HashSet<Library> libs = new HashSet<Library>(); - PluginBuildUtil.getLibraries(myModule, libs); - for (Module dependentModule : modules) { - PluginBuildUtil.getLibraries(dependentModule, libs); - } - - - // libraries - final VirtualFile libDir = sdk.getHomeDirectory().findFileByRelativePath(LIB_DIRECTORY); - for (Library library : libs) { - boolean hasDirsOnly = true; - VirtualFile[] files = library.getFiles(OrderRootType.CLASSES); - for (VirtualFile file : files) { - if (file.getFileSystem() instanceof JarFileSystem) { - hasDirsOnly = false; - file = ((JarFileSystem)file.getFileSystem()).getVirtualFileForJar(file); - } - if (libDir != null && file != null && VfsUtilCore.isAncestor(libDir, file, false)) { - context.addMessage(CompilerMessageCategory.ERROR, DevKitBundle.message("dont.add.idea.libs.to.classpath", file.getName()), null, - -1, -1); - } - } - - final List<? extends PackagingElement<?>> elements = factory.createLibraryElements(library); - if (hasDirsOnly) { - //todo split one lib into 2 separate libs if there are jars and dirs - classesDir.addOrFindChildren(elements); - } - else { - factory.getOrCreateDirectory(root, LIB).addOrFindChildren(elements); - } - } - - return new ArtifactImpl(getArtifactName(), PlainArtifactType.getInstance(), false, root, FileUtil.toSystemIndependentName(outputPath)); - } - - private String getArtifactName() { - return myModule.getName() + ":plugin"; - } - - private boolean checkDependencies(CompileContext context) { - final Module[] wrongSetDependencies = PluginBuildUtil.getWrongSetDependencies(myModule); - if (wrongSetDependencies.length != 0) { - boolean realProblems = false; - final String pluginId = DescriptorUtil.getPluginId(myModule); - - for (Module dependency : wrongSetDependencies) { - if (!PluginModuleType.isOfType(dependency)) { - realProblems = true; - context.addMessage(CompilerMessageCategory.ERROR, - DevKitBundle.message("incorrect.dependency.non-plugin-module", dependency.getName(), myModule.getName()), null, - -1, -1); - } - else { - final XmlFile pluginXml = PluginModuleType.getPluginXml(dependency); - boolean isDeclared = false; - if (pluginXml != null) { - final XmlTag rootTag = pluginXml.getDocument().getRootTag(); - final XmlTag[] dependencies = rootTag != null ? rootTag.findSubTags("depends") : XmlTag.EMPTY; - for (XmlTag dep : dependencies) { - if (dep.getValue().getTrimmedText().equals(pluginId)) { - isDeclared = true; - break; - } - } - } - if (!isDeclared) { - // make this a warning instead? - realProblems = true; - context.addMessage(CompilerMessageCategory.ERROR, - DevKitBundle.message("incorrect.dependency.not-declared", dependency.getName(), myModule.getName()), null, -1, - -1); - } - } - } - if (realProblems) return false; - } - return true; - } - -} diff --git a/plugins/devkit/src/build/PluginBuildParticipantProvider.java b/plugins/devkit/src/build/PluginBuildParticipantProvider.java deleted file mode 100644 index b8a35d377a96..000000000000 --- a/plugins/devkit/src/build/PluginBuildParticipantProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2009 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.idea.devkit.build; - -import com.intellij.openapi.compiler.make.BuildParticipantProvider; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleType; -import org.jetbrains.idea.devkit.module.PluginModuleType; - -import java.util.Collection; -import java.util.Collections; - -/** - * @author nik - */ -public class PluginBuildParticipantProvider extends BuildParticipantProvider { - public Collection<PluginBuildParticipant> getParticipants(final Module module) { - if (ModuleType.get(module) != PluginModuleType.getInstance()) { - return Collections.emptyList(); - } - - final PluginBuildConfiguration configuration = PluginBuildConfiguration.getInstance(module); - return configuration != null ? Collections.singletonList(configuration.getBuildParticipant()) - : Collections.<PluginBuildParticipant>emptyList(); - } -} diff --git a/plugins/devkit/src/references/RegistryImplicitPropertyUsageProvider.java b/plugins/devkit/src/references/RegistryImplicitPropertyUsageProvider.java new file mode 100644 index 000000000000..d40f100e4111 --- /dev/null +++ b/plugins/devkit/src/references/RegistryImplicitPropertyUsageProvider.java @@ -0,0 +1,38 @@ +/* + * 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.idea.devkit.references; + +import com.intellij.codeInspection.unused.ImplicitPropertyUsageProvider; +import com.intellij.lang.properties.psi.Property; +import com.intellij.psi.PsiFile; +import org.jetbrains.idea.devkit.util.PsiUtil; + +/** + * @author Konstantin Bulenkov + */ +public class RegistryImplicitPropertyUsageProvider extends ImplicitPropertyUsageProvider { + @Override + protected boolean isUsed(Property property) { + if (PsiUtil.isIdeaProject(property.getProject())) { + final PsiFile file = property.getContainingFile(); + if (file != null && file.getName().equals("registry.properties")) { + final String name = property.getName(); + return name.endsWith(".description") || name.endsWith(".restartRequired"); + } + } + return false; + } +} diff --git a/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java b/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java index e37fb720c25a..b5763cc663c7 100644 --- a/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java +++ b/plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java @@ -34,6 +34,7 @@ import com.intellij.psi.codeStyle.NameUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testIntegration.TestFramework; import com.intellij.util.PathUtil; +import com.intellij.util.Processor; import com.intellij.util.containers.ConcurrentHashMap; import com.intellij.util.containers.HashSet; import com.intellij.util.containers.LinkedMultiMap; @@ -389,17 +390,21 @@ public class TestDataGuessByExistingFilesUtil { return new TestDataDescriptor(descriptors); } - private static synchronized MultiMap<String, Trinity<Matcher, String, String>> getAllFileNames(List<Trinity<Matcher, String, String>> input, + private static MultiMap<String, Trinity<Matcher, String, String>> getAllFileNames(final List<Trinity<Matcher, String, String>> input, final GotoFileModel model) { - LinkedMultiMap<String, Trinity<Matcher, String, String>> map = new LinkedMultiMap<String, Trinity<Matcher, String, String>>(); - for (String name : model.getNames(false)) { - ProgressManager.checkCanceled(); - for (Trinity<Matcher, String, String> trinity : input) { - if (trinity.first.matches(name)) { - map.putValue(name, trinity); + final LinkedMultiMap<String, Trinity<Matcher, String, String>> map = new LinkedMultiMap<String, Trinity<Matcher, String, String>>(); + model.processNames(new Processor<String>() { + @Override + public boolean process(String name) { + ProgressManager.checkCanceled(); + for (Trinity<Matcher, String, String> trinity : input) { + if (trinity.first.matches(name)) { + map.putValue(name, trinity); + } } + return true; } - } + }, false); return map; } |