summaryrefslogtreecommitdiff
path: root/plugins/devkit
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/devkit')
-rw-r--r--plugins/devkit/resources/META-INF/plugin.xml2
-rw-r--r--plugins/devkit/src/build/PluginBuildConfiguration.java6
-rw-r--r--plugins/devkit/src/build/PluginBuildParticipant.java213
-rw-r--r--plugins/devkit/src/build/PluginBuildParticipantProvider.java40
-rw-r--r--plugins/devkit/src/references/RegistryImplicitPropertyUsageProvider.java38
-rw-r--r--plugins/devkit/src/testAssistant/TestDataGuessByExistingFilesUtil.java21
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;
}