summaryrefslogtreecommitdiff
path: root/plugins/devkit/src
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/devkit/src')
-rw-r--r--plugins/devkit/src/dom/Action.java3
-rw-r--r--plugins/devkit/src/dom/impl/ExtensionDomExtender.java155
-rw-r--r--plugins/devkit/src/dom/impl/PluginXmlDomFileDescription.java99
-rw-r--r--plugins/devkit/src/inspections/PluginXmlDomInspection.java126
-rw-r--r--plugins/devkit/src/navigation/DescriptionTypeRelatedItemLineMarkerProvider.java14
-rw-r--r--plugins/devkit/src/navigation/DevkitRelatedLineMarkerProviderBase.java44
-rw-r--r--plugins/devkit/src/navigation/ExtensionPointDeclarationRelatedItemLineMarkerProvider.java3
-rw-r--r--plugins/devkit/src/projectRoots/IdeaJdk.java12
-rw-r--r--plugins/devkit/src/run/PluginRunConfigurationEditor.java20
-rw-r--r--plugins/devkit/src/testAssistant/NavigateToTestDataAction.java3
-rw-r--r--plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java16
-rw-r--r--plugins/devkit/src/testAssistant/TestLocationDataRule.java3
-rw-r--r--plugins/devkit/src/util/PsiUtil.java5
13 files changed, 301 insertions, 202 deletions
diff --git a/plugins/devkit/src/dom/Action.java b/plugins/devkit/src/dom/Action.java
index ac879140fd4b..e28f2d13b9b4 100644
--- a/plugins/devkit/src/dom/Action.java
+++ b/plugins/devkit/src/dom/Action.java
@@ -165,4 +165,7 @@ public interface Action extends DomElement {
@NotNull
GenericAttributeValue<String> getKeymap();
+
+ @NotNull
+ GenericAttributeValue<String> getProjectType();
}
diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java
index f5c83ccb66bc..538ee7e70243 100644
--- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java
+++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java
@@ -15,7 +15,7 @@
*/
package org.jetbrains.idea.devkit.dom.impl;
-import com.intellij.ide.plugins.PluginManager;
+import com.intellij.ide.plugins.PluginManagerCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -50,57 +50,6 @@ import java.util.*;
public class ExtensionDomExtender extends DomExtender<Extensions> {
private static final PsiClassConverter CLASS_CONVERTER = new PluginPsiClassConverter();
private static final Converter LANGUAGE_CONVERTER = new LanguageResolvingConverter();
-
- private static class MyRequired implements Required {
- @Override
- public boolean value() {
- return true;
- }
-
- @Override
- public boolean nonEmpty() {
- return true;
- }
-
- @Override
- public boolean identifier() {
- return false;
- }
-
- @Override
- public Class<? extends Annotation> annotationType() {
- return Required.class;
- }
- }
-
- private static class MyExtendClass extends ExtendClassImpl {
- private final String myInterfaceName;
-
- private MyExtendClass(String interfaceName) {
- myInterfaceName = interfaceName;
- }
-
- @Override
- public boolean allowAbstract() {
- return false;
- }
-
- @Override
- public boolean allowInterface() {
- return false;
- }
-
- @Override
- public boolean allowEnum() {
- return false;
- }
-
- @Override
- public String value() {
- return myInterfaceName;
- }
- }
-
private static final DomExtender EXTENSION_EXTENDER = new DomExtender() {
public void registerExtensions(@NotNull final DomElement domElement, @NotNull final DomExtensionsRegistrar registrar) {
final ExtensionPoint extensionPoint = (ExtensionPoint)domElement.getChildDescription().getDomDeclaration();
@@ -127,31 +76,6 @@ public class ExtensionDomExtender extends DomExtender<Extensions> {
}
};
-
- public void registerExtensions(@NotNull final Extensions extensions, @NotNull final DomExtensionsRegistrar registrar) {
- final XmlElement xmlElement = extensions.getXmlElement();
- if (xmlElement == null) return;
-
- IdeaPlugin ideaPlugin = extensions.getParentOfType(IdeaPlugin.class, true);
-
- if (ideaPlugin == null) return;
-
- String epPrefix = extensions.getEpPrefix();
- for (IdeaPlugin plugin : getVisiblePlugins(ideaPlugin)) {
- final String pluginId = StringUtil.notNullize(plugin.getPluginId(), "com.intellij");
- for (ExtensionPoints points : plugin.getExtensionPoints()) {
- for (ExtensionPoint point : points.getExtensionPoints()) {
- registerExtensionPoint(registrar, point, epPrefix, pluginId);
- }
- }
- }
- }
-
- @Override
- public boolean supportsStubs() {
- return false;
- }
-
private static Set<IdeaPlugin> getVisiblePlugins(IdeaPlugin ideaPlugin) {
Set<IdeaPlugin> result = ContainerUtil.newHashSet();
MultiMap<String, IdeaPlugin> byId = getPluginMap(ideaPlugin.getManager().getProject());
@@ -385,11 +309,10 @@ public class ExtensionDomExtender extends DomExtender<Extensions> {
return PsiTypesUtil.getPsiClass(elementType);
}
-
public static Collection<String> getDependencies(IdeaPlugin ideaPlugin) {
Set<String> result = new HashSet<String>();
- result.add(PluginManager.CORE_PLUGIN_ID);
+ result.add(PluginManagerCore.CORE_PLUGIN_ID);
for (Dependency dependency : ideaPlugin.getDependencies()) {
ContainerUtil.addIfNotNull(dependency.getStringValue(), result);
@@ -422,10 +345,84 @@ public class ExtensionDomExtender extends DomExtender<Extensions> {
return result;
}
+ public void registerExtensions(@NotNull final Extensions extensions, @NotNull final DomExtensionsRegistrar registrar) {
+ final XmlElement xmlElement = extensions.getXmlElement();
+ if (xmlElement == null) return;
+
+ IdeaPlugin ideaPlugin = extensions.getParentOfType(IdeaPlugin.class, true);
+
+ if (ideaPlugin == null) return;
+
+ String epPrefix = extensions.getEpPrefix();
+ for (IdeaPlugin plugin : getVisiblePlugins(ideaPlugin)) {
+ final String pluginId = StringUtil.notNullize(plugin.getPluginId(), "com.intellij");
+ for (ExtensionPoints points : plugin.getExtensionPoints()) {
+ for (ExtensionPoint point : points.getExtensionPoints()) {
+ registerExtensionPoint(registrar, point, epPrefix, pluginId);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean supportsStubs() {
+ return false;
+ }
+
interface SimpleTagValue extends DomElement {
@SuppressWarnings("UnusedDeclaration")
@TagValue
String getTagValue();
}
+ private static class MyRequired implements Required {
+ @Override
+ public boolean value() {
+ return true;
+ }
+
+ @Override
+ public boolean nonEmpty() {
+ return true;
+ }
+
+ @Override
+ public boolean identifier() {
+ return false;
+ }
+
+ @Override
+ public Class<? extends Annotation> annotationType() {
+ return Required.class;
+ }
+ }
+
+ private static class MyExtendClass extends ExtendClassImpl {
+ private final String myInterfaceName;
+
+ private MyExtendClass(String interfaceName) {
+ myInterfaceName = interfaceName;
+ }
+
+ @Override
+ public boolean allowAbstract() {
+ return false;
+ }
+
+ @Override
+ public boolean allowInterface() {
+ return false;
+ }
+
+ @Override
+ public boolean allowEnum() {
+ return false;
+ }
+
+ @Override
+ public String value() {
+ return myInterfaceName;
+ }
+ }
+
}
diff --git a/plugins/devkit/src/dom/impl/PluginXmlDomFileDescription.java b/plugins/devkit/src/dom/impl/PluginXmlDomFileDescription.java
index b3d7fda2c19a..091c172d0a60 100644
--- a/plugins/devkit/src/dom/impl/PluginXmlDomFileDescription.java
+++ b/plugins/devkit/src/dom/impl/PluginXmlDomFileDescription.java
@@ -15,109 +15,18 @@
*/
package org.jetbrains.idea.devkit.dom.impl;
-import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.icons.AllIcons;
-import com.intellij.lang.annotation.Annotation;
-import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.util.Iconable;
-import com.intellij.psi.PsiClass;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiField;
-import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomFileDescription;
-import com.intellij.util.xml.DomUtil;
-import com.intellij.util.xml.GenericAttributeValue;
-import com.intellij.util.xml.highlighting.DomElementAnnotationHolder;
-import com.intellij.util.xml.highlighting.DomElementsAnnotator;
-import com.intellij.util.xml.reflect.DomAttributeChildDescription;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.idea.devkit.dom.*;
+import org.jetbrains.idea.devkit.dom.IdeaPlugin;
import javax.swing.*;
-import java.util.List;
/**
* @author mike
*/
public class PluginXmlDomFileDescription extends DomFileDescription<IdeaPlugin> {
- private static final DomElementsAnnotator ANNOTATOR = new DomElementsAnnotator() {
- @Override
- public void annotate(DomElement element, DomElementAnnotationHolder holder) {
- if (element instanceof Extension) {
- annotateExtension((Extension)element, holder);
- }
- else if (element instanceof Vendor) {
- annotateVendor((Vendor)element, holder);
- }
- else if (element instanceof IdeaVersion) {
- annotateIdeaVersion((IdeaVersion)element, holder);
- }
- else if (element instanceof Extensions) {
- annotateExtensions((Extensions)element, holder);
- }
- }
-
- private void annotateExtensions(Extensions extensions, DomElementAnnotationHolder holder) {
- final GenericAttributeValue<IdeaPlugin> xmlnsAttribute = extensions.getXmlns();
- if (!DomUtil.hasXml(xmlnsAttribute)) return;
-
- final Annotation annotation = holder.createAnnotation(xmlnsAttribute,
- HighlightSeverity.WARNING,
- "Use defaultExtensionNs instead");
- annotation.setHighlightType(ProblemHighlightType.LIKE_DEPRECATED);
- }
-
- private void annotateIdeaVersion(IdeaVersion ideaVersion, DomElementAnnotationHolder holder) {
- highlightNotUsedAnymore(ideaVersion.getMin(), holder);
- highlightNotUsedAnymore(ideaVersion.getMax(), holder);
- }
-
- private void annotateExtension(Extension extension, DomElementAnnotationHolder holder) {
- final ExtensionPoint extensionPoint = extension.getExtensionPoint();
- if (extensionPoint == null) return;
- final GenericAttributeValue<PsiClass> interfaceAttribute = extensionPoint.getInterface();
- if (DomUtil.hasXml(interfaceAttribute)) {
- final PsiClass value = interfaceAttribute.getValue();
- if (value != null && value.isDeprecated()) {
- final Annotation annotation = holder.createAnnotation(extension, HighlightSeverity.WARNING, "Deprecated EP");
- annotation.setHighlightType(ProblemHighlightType.LIKE_DEPRECATED);
- return;
- }
- }
-
- final List<? extends DomAttributeChildDescription> descriptions = extension.getGenericInfo().getAttributeChildrenDescriptions();
- for (DomAttributeChildDescription attributeDescription : descriptions) {
- final GenericAttributeValue attributeValue = attributeDescription.getDomAttributeValue(extension);
- if (attributeValue == null || !DomUtil.hasXml(attributeValue)) continue;
-
- final PsiElement declaration = attributeDescription.getDeclaration(extension.getManager().getProject());
- if (declaration instanceof PsiField) {
- PsiField psiField = (PsiField)declaration;
- if (psiField.isDeprecated()) {
- final Annotation annotation = holder.createAnnotation(attributeValue, HighlightSeverity.WARNING,
- "Deprecated attribute '" + attributeDescription.getName() + "'");
- annotation.setHighlightType(ProblemHighlightType.LIKE_DEPRECATED);
- }
- }
- }
- }
-
- private void annotateVendor(Vendor vendor, DomElementAnnotationHolder holder) {
- highlightNotUsedAnymore(vendor.getLogo(), holder);
- }
-
- private void highlightNotUsedAnymore(GenericAttributeValue attributeValue,
- DomElementAnnotationHolder holder) {
- if (!DomUtil.hasXml(attributeValue)) return;
-
- final Annotation annotation = holder.createAnnotation(attributeValue,
- HighlightSeverity.WARNING,
- "Not used anymore");
- annotation.setHighlightType(ProblemHighlightType.LIKE_DEPRECATED);
- }
- };
-
public PluginXmlDomFileDescription() {
super(IdeaPlugin.class, "idea-plugin");
}
@@ -127,12 +36,6 @@ public class PluginXmlDomFileDescription extends DomFileDescription<IdeaPlugin>
return AllIcons.Nodes.Plugin;
}
- @Nullable
- @Override
- public DomElementsAnnotator createAnnotator() {
- return ANNOTATOR;
- }
-
@Override
public boolean hasStubs() {
return true;
diff --git a/plugins/devkit/src/inspections/PluginXmlDomInspection.java b/plugins/devkit/src/inspections/PluginXmlDomInspection.java
index b160cbf5dbd1..af691d283e0e 100644
--- a/plugins/devkit/src/inspections/PluginXmlDomInspection.java
+++ b/plugins/devkit/src/inspections/PluginXmlDomInspection.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * 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.
@@ -15,12 +15,28 @@
*/
package org.jetbrains.idea.devkit.inspections;
+import com.intellij.codeInspection.ProblemHighlightType;
+import com.intellij.openapi.module.Module;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiField;
+import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.xml.DomElement;
+import com.intellij.util.xml.DomUtil;
+import com.intellij.util.xml.GenericAttributeValue;
import com.intellij.util.xml.highlighting.BasicDomElementsInspection;
+import com.intellij.util.xml.highlighting.DomElementAnnotationHolder;
+import com.intellij.util.xml.highlighting.DomHighlightingHelper;
+import com.intellij.util.xml.highlighting.RemoveDomElementQuickFix;
+import com.intellij.util.xml.reflect.DomAttributeChildDescription;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.devkit.DevKitBundle;
-import org.jetbrains.idea.devkit.dom.IdeaPlugin;
+import org.jetbrains.idea.devkit.dom.*;
+import org.jetbrains.idea.devkit.util.PsiUtil;
+
+import java.util.List;
/**
* @author mike
@@ -47,4 +63,110 @@ public class PluginXmlDomInspection extends BasicDomElementsInspection<IdeaPlugi
public String getShortName() {
return "PluginXmlValidity";
}
+
+ @Override
+ protected void checkDomElement(DomElement element, DomElementAnnotationHolder holder, DomHighlightingHelper helper) {
+ super.checkDomElement(element, holder, helper);
+
+ if (element instanceof IdeaPlugin) {
+ checkJetBrainsPlugin((IdeaPlugin)element, holder);
+ }
+ else if (element instanceof Extension) {
+ annotateExtension((Extension)element, holder);
+ }
+ else if (element instanceof Vendor) {
+ annotateVendor((Vendor)element, holder);
+ }
+ else if (element instanceof IdeaVersion) {
+ annotateIdeaVersion((IdeaVersion)element, holder);
+ }
+ else if (element instanceof Extensions) {
+ annotateExtensions((Extensions)element, holder);
+ }
+ }
+
+ private static void checkJetBrainsPlugin(IdeaPlugin ideaPlugin, DomElementAnnotationHolder holder) {
+ final Module module = ideaPlugin.getModule();
+ if (module == null) return;
+ if (!PsiUtil.isIdeaProject(module.getProject())) return;
+
+ if (ideaPlugin.getPluginId() == null) return;
+
+ final Vendor vendor = ContainerUtil.getFirstItem(ideaPlugin.getVendors());
+ if (vendor == null) return;
+ if (!"JetBrains".equals(vendor.getValue())) return;
+
+ for (Extensions extensions : ideaPlugin.getExtensions()) {
+ final List<Extension> definedEps = DomUtil.getDefinedChildrenOfType(extensions, Extension.class, true, false);
+ for (Extension extension : definedEps) {
+ final ExtensionPoint extensionPoint = extension.getExtensionPoint();
+ if (extensionPoint == null) continue;
+ if ("com.intellij.errorHandler".equals(extensionPoint.getEffectiveQualifiedName())) {
+ return;
+ }
+ }
+ }
+
+ holder.createProblem(DomUtil.getFileElement(ideaPlugin),
+ "JetBrains plugin should provide <errorHandler>");
+ }
+
+ private static void annotateExtensions(Extensions extensions, DomElementAnnotationHolder holder) {
+ final GenericAttributeValue<IdeaPlugin> xmlnsAttribute = extensions.getXmlns();
+ if (!DomUtil.hasXml(xmlnsAttribute)) return;
+
+ holder.createProblem(xmlnsAttribute,
+ ProblemHighlightType.LIKE_DEPRECATED,
+ "Use defaultExtensionNs instead", null).highlightWholeElement();
+ }
+
+ private static void annotateIdeaVersion(IdeaVersion ideaVersion, DomElementAnnotationHolder holder) {
+ highlightNotUsedAnymore(ideaVersion.getMin(), holder);
+ highlightNotUsedAnymore(ideaVersion.getMax(), holder);
+ }
+
+ private static void annotateExtension(Extension extension, DomElementAnnotationHolder holder) {
+ final ExtensionPoint extensionPoint = extension.getExtensionPoint();
+ if (extensionPoint == null) return;
+ final GenericAttributeValue<PsiClass> interfaceAttribute = extensionPoint.getInterface();
+ if (DomUtil.hasXml(interfaceAttribute)) {
+ final PsiClass value = interfaceAttribute.getValue();
+ if (value != null && value.isDeprecated()) {
+ holder.createProblem(extension, ProblemHighlightType.LIKE_DEPRECATED, "Deprecated EP", null);
+ return;
+ }
+ }
+
+ final List<? extends DomAttributeChildDescription> descriptions = extension.getGenericInfo().getAttributeChildrenDescriptions();
+ for (DomAttributeChildDescription attributeDescription : descriptions) {
+ final GenericAttributeValue attributeValue = attributeDescription.getDomAttributeValue(extension);
+ if (attributeValue == null || !DomUtil.hasXml(attributeValue)) continue;
+
+ final PsiElement declaration = attributeDescription.getDeclaration(extension.getManager().getProject());
+ if (declaration instanceof PsiField) {
+ PsiField psiField = (PsiField)declaration;
+ if (psiField.isDeprecated()) {
+ holder.createProblem(attributeValue, ProblemHighlightType.LIKE_DEPRECATED,
+ "Deprecated attribute '" + attributeDescription.getName() + "'",
+ null)
+ .highlightWholeElement();
+ }
+ }
+ }
+ }
+
+ private static void annotateVendor(Vendor vendor, DomElementAnnotationHolder holder) {
+ highlightNotUsedAnymore(vendor.getLogo(), holder);
+ }
+
+ private static void highlightNotUsedAnymore(GenericAttributeValue attributeValue,
+ DomElementAnnotationHolder holder) {
+ if (!DomUtil.hasXml(attributeValue)) return;
+
+ holder.createProblem(attributeValue,
+ ProblemHighlightType.LIKE_DEPRECATED,
+ "Not used anymore",
+ null, new RemoveDomElementQuickFix(attributeValue))
+ .highlightWholeElement();
+ }
}
diff --git a/plugins/devkit/src/navigation/DescriptionTypeRelatedItemLineMarkerProvider.java b/plugins/devkit/src/navigation/DescriptionTypeRelatedItemLineMarkerProvider.java
index 1d759b6a8669..a5c4fba2db15 100644
--- a/plugins/devkit/src/navigation/DescriptionTypeRelatedItemLineMarkerProvider.java
+++ b/plugins/devkit/src/navigation/DescriptionTypeRelatedItemLineMarkerProvider.java
@@ -16,7 +16,6 @@
package org.jetbrains.idea.devkit.navigation;
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
-import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
import com.intellij.icons.AllIcons;
import com.intellij.navigation.GotoRelatedItem;
@@ -24,8 +23,10 @@ import com.intellij.openapi.editor.markup.GutterIconRenderer;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.psi.*;
-import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.util.NotNullFunction;
import com.intellij.util.containers.ContainerUtil;
@@ -41,7 +42,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-public class DescriptionTypeRelatedItemLineMarkerProvider extends RelatedItemLineMarkerProvider {
+public class DescriptionTypeRelatedItemLineMarkerProvider extends DevkitRelatedLineMarkerProviderBase {
private static final NotNullFunction<PsiFile, Collection<? extends PsiElement>> CONVERTER =
new NotNullFunction<PsiFile, Collection<? extends PsiElement>>() {
@@ -74,11 +75,6 @@ public class DescriptionTypeRelatedItemLineMarkerProvider extends RelatedItemLin
Module module = ModuleUtilCore.findModuleForPsiElement(psiClass);
if (module == null) return;
- final GlobalSearchScope scope = GlobalSearchScope.moduleRuntimeScope(module, false);
- final PsiClass actionClass = JavaPsiFacade.getInstance(psiClass.getProject())
- .findClass(DescriptionType.INSPECTION.getClassName(), scope);
- if (actionClass == null) return;
-
PsiElement highlightingElement = psiClass.getNameIdentifier();
if (highlightingElement == null) return;
diff --git a/plugins/devkit/src/navigation/DevkitRelatedLineMarkerProviderBase.java b/plugins/devkit/src/navigation/DevkitRelatedLineMarkerProviderBase.java
new file mode 100644
index 000000000000..e81c38ec6936
--- /dev/null
+++ b/plugins/devkit/src/navigation/DevkitRelatedLineMarkerProviderBase.java
@@ -0,0 +1,44 @@
+/*
+ * 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.navigation;
+
+import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
+import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
+import com.intellij.psi.PsiElement;
+import com.intellij.util.containers.ContainerUtil;
+import org.jetbrains.idea.devkit.util.PsiUtil;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Do not process when current project is not a Plugin project.
+ */
+public abstract class DevkitRelatedLineMarkerProviderBase extends RelatedItemLineMarkerProvider {
+
+ @Override
+ public void collectNavigationMarkers(List<PsiElement> elements,
+ Collection<? super RelatedItemLineMarkerInfo> result,
+ boolean forNavigation) {
+ final PsiElement psiElement = ContainerUtil.getFirstItem(elements);
+ if (psiElement == null ||
+ !PsiUtil.isPluginProject(psiElement.getProject())) {
+ return;
+ }
+
+ super.collectNavigationMarkers(elements, result, forNavigation);
+ }
+}
diff --git a/plugins/devkit/src/navigation/ExtensionPointDeclarationRelatedItemLineMarkerProvider.java b/plugins/devkit/src/navigation/ExtensionPointDeclarationRelatedItemLineMarkerProvider.java
index 8ecdbac61291..d71b54a540f6 100644
--- a/plugins/devkit/src/navigation/ExtensionPointDeclarationRelatedItemLineMarkerProvider.java
+++ b/plugins/devkit/src/navigation/ExtensionPointDeclarationRelatedItemLineMarkerProvider.java
@@ -16,7 +16,6 @@
package org.jetbrains.idea.devkit.navigation;
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
-import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
import com.intellij.icons.AllIcons;
import com.intellij.navigation.GotoRelatedItem;
@@ -37,7 +36,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
-public class ExtensionPointDeclarationRelatedItemLineMarkerProvider extends RelatedItemLineMarkerProvider {
+public class ExtensionPointDeclarationRelatedItemLineMarkerProvider extends DevkitRelatedLineMarkerProviderBase {
private static final NotNullFunction<ExtensionPointCandidate, Collection<? extends PsiElement>> CONVERTER =
new NotNullFunction<ExtensionPointCandidate, Collection<? extends PsiElement>>() {
diff --git a/plugins/devkit/src/projectRoots/IdeaJdk.java b/plugins/devkit/src/projectRoots/IdeaJdk.java
index 1539a893dbad..a5fabf928c5d 100644
--- a/plugins/devkit/src/projectRoots/IdeaJdk.java
+++ b/plugins/devkit/src/projectRoots/IdeaJdk.java
@@ -86,6 +86,15 @@ public class IdeaJdk extends JavaDependentSdkType implements JavaSdkType {
return PathManager.getHomePath().replace(File.separatorChar, '/');
}
+ @Override
+ public String adjustSelectedSdkHome(String homePath) {
+ if (SystemInfo.isMac) {
+ File home = new File(homePath, "Contents");
+ if (home.exists()) return home.getPath();
+ }
+ return super.adjustSelectedSdkHome(homePath);
+ }
+
public boolean isValidSdkHome(String path) {
if (isFromIDEAProject(path)) {
return true;
@@ -153,6 +162,9 @@ public class IdeaJdk extends JavaDependentSdkType implements JavaSdkType {
else if (new File(sdkHome, "license/AppCode_license.txt").exists()) {
productName = "AppCode ";
}
+ else if (new File(sdkHome, "license/CLion_Preview_License.txt").exists()) {
+ productName = "CLion ";
+ }
else {
productName = "IDEA ";
}
diff --git a/plugins/devkit/src/run/PluginRunConfigurationEditor.java b/plugins/devkit/src/run/PluginRunConfigurationEditor.java
index f65bd28a8fc4..9749d3adca18 100644
--- a/plugins/devkit/src/run/PluginRunConfigurationEditor.java
+++ b/plugins/devkit/src/run/PluginRunConfigurationEditor.java
@@ -15,6 +15,7 @@
*/
package org.jetbrains.idea.devkit.run;
+import com.intellij.application.options.ModulesComboBox;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.configurations.LogFileOptions;
import com.intellij.execution.ui.AlternativeJREPanel;
@@ -24,7 +25,6 @@ import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.application.options.ModulesComboBox;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.ui.PanelWithAnchor;
import com.intellij.ui.RawCommandLineEditor;
@@ -46,7 +46,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfiguration> implements PanelWithAnchor {
private final ModulesComboBox myModules = new ModulesComboBox();
@@ -54,7 +53,7 @@ public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfig
private final LabeledComponent<RawCommandLineEditor> myVMParameters = new LabeledComponent<RawCommandLineEditor>();
private final LabeledComponent<RawCommandLineEditor> myProgramParameters = new LabeledComponent<RawCommandLineEditor>();
private JComponent anchor;
- private AlternativeJREPanel myAlternativeJREPanel = new AlternativeJREPanel();
+ private final AlternativeJREPanel myAlternativeJREPanel = new AlternativeJREPanel();
@NonNls private final JCheckBox myShowLogs = new JCheckBox(DevKitBundle.message("show.smth", "idea.log"));
@@ -65,12 +64,14 @@ public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfig
myPRC = prc;
myShowLogs.setSelected(isShow(prc));
myShowLogs.addChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
+ @Override
+ public void stateChanged(@NotNull ChangeEvent e) {
setShow(prc, myShowLogs.isSelected());
}
});
myModules.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
+ @Override
+ public void actionPerformed(@NotNull ActionEvent e) {
final Module selectedModule = myModules.getSelectedModule();
if (selectedModule != null){
prc.removeAllLogFiles();
@@ -113,20 +114,19 @@ public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfig
}
private static void setShow(PluginRunConfiguration prc, boolean show){
- final ArrayList<LogFileOptions> logFiles = prc.getLogFiles();
- for (LogFileOptions logFile: logFiles) {
+ for (LogFileOptions logFile: prc.getLogFiles()) {
logFile.setEnable(show);
}
}
private static boolean isShow(PluginRunConfiguration prc){
- final ArrayList<LogFileOptions> logFiles = prc.getLogFiles();
- for (LogFileOptions logFile : logFiles) {
+ for (LogFileOptions logFile : prc.getLogFiles()) {
if (logFile.isEnabled()) return true;
}
return false;
}
+ @Override
public void resetEditorFrom(PluginRunConfiguration prc) {
myModules.setSelectedModule(prc.getModule());
getVMParameters().setText(prc.VM_PARAMETERS);
@@ -135,6 +135,7 @@ public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfig
}
+ @Override
public void applyEditorTo(PluginRunConfiguration prc) throws ConfigurationException {
prc.setModule(myModules.getSelectedModule());
prc.VM_PARAMETERS = getVMParameters().getText();
@@ -143,6 +144,7 @@ public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfig
prc.setAlternativeJreEnabled(myAlternativeJREPanel.isPathEnabled());
}
+ @Override
@NotNull
public JComponent createEditor() {
myModules.fillModules(myPRC.getProject(), PluginModuleType.getInstance());
diff --git a/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java b/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java
index 89e10e019632..2bcebc807d4e 100644
--- a/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java
+++ b/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.execution.Location;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.execution.junit2.PsiMemberParameterizedLocation;
+import com.intellij.execution.testframework.TestTreeViewAction;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
@@ -45,7 +46,7 @@ import java.util.List;
/**
* @author yole
*/
-public class NavigateToTestDataAction extends AnAction {
+public class NavigateToTestDataAction extends AnAction implements TestTreeViewAction {
@Override
public void actionPerformed(AnActionEvent e) {
final DataContext dataContext = e.getDataContext();
diff --git a/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java b/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java
index 73f0ae40d4a2..60d805044f0c 100644
--- a/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java
+++ b/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java
@@ -34,6 +34,7 @@ import com.intellij.util.Function;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.idea.devkit.util.PsiUtil;
import java.awt.event.MouseEvent;
import java.io.File;
@@ -53,6 +54,16 @@ public class TestDataLineMarkerProvider implements LineMarkerProvider {
if (ApplicationManager.getApplication().isUnitTestMode()) {
return null;
}
+
+ if (!(element instanceof PsiMethod) &&
+ !(element instanceof PsiClass)) {
+ return null;
+ }
+
+ if (!PsiUtil.isPluginProject(element.getProject())) {
+ return null;
+ }
+
final VirtualFile file = PsiUtilCore.getVirtualFile(element);
if (file == null || !ProjectFileIndex.SERVICE.getInstance(element.getProject()).isInTestSourceContent(file)) {
return null;
@@ -64,7 +75,7 @@ public class TestDataLineMarkerProvider implements LineMarkerProvider {
method, method.getModifierList().getTextRange(), PlatformIcons.TEST_SOURCE_FOLDER, Pass.UPDATE_ALL, null, new TestDataNavigationHandler(),
GutterIconRenderer.Alignment.LEFT);
}
- } else if (element instanceof PsiClass) {
+ } else {
final PsiClass psiClass = (PsiClass)element;
final String basePath = getTestDataBasePath(psiClass);
if (basePath != null) {
@@ -115,7 +126,8 @@ public class TestDataLineMarkerProvider implements LineMarkerProvider {
@Nullable
public static String getTestDataBasePath(PsiClass psiClass) {
final PsiAnnotation annotation = AnnotationUtil.findAnnotationInHierarchy(psiClass,
- Collections.singleton(TEST_DATA_PATH_ANNOTATION_QUALIFIED_NAME));
+ Collections.singleton(
+ TEST_DATA_PATH_ANNOTATION_QUALIFIED_NAME));
if (annotation != null) {
final PsiAnnotationMemberValue value = annotation.findAttributeValue(PsiAnnotation.DEFAULT_REFERENCED_METHOD_NAME);
if (value instanceof PsiExpression) {
diff --git a/plugins/devkit/src/testAssistant/TestLocationDataRule.java b/plugins/devkit/src/testAssistant/TestLocationDataRule.java
index 6dccd0f808da..74c9d34c5a96 100644
--- a/plugins/devkit/src/testAssistant/TestLocationDataRule.java
+++ b/plugins/devkit/src/testAssistant/TestLocationDataRule.java
@@ -23,6 +23,7 @@ import com.intellij.execution.junit2.info.MethodLocation;
import com.intellij.ide.impl.dataRules.GetDataRule;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataProvider;
+import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
@@ -58,6 +59,8 @@ public class TestLocationDataRule implements GetDataRule {
@NotNull
protected static List<Location> collectRelativeLocations(Project project, VirtualFile file) {
+ if (DumbService.isDumb(project)) return Collections.emptyList();
+
final List<Location> locations = new ArrayList<Location>();
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
if (fileIndex.isInContent(file) && !fileIndex.isInSource(file) && !fileIndex.isInLibraryClasses(file)) {
diff --git a/plugins/devkit/src/util/PsiUtil.java b/plugins/devkit/src/util/PsiUtil.java
index 8d093acb8017..2be3719c214a 100644
--- a/plugins/devkit/src/util/PsiUtil.java
+++ b/plugins/devkit/src/util/PsiUtil.java
@@ -125,6 +125,11 @@ public class PsiUtil {
return flag;
}
+ public static boolean isPluginProject(Project project) {
+ return JavaPsiFacade.getInstance(project).findClass(IDE_PROJECT_MARKER_CLASS,
+ GlobalSearchScope.allScope(project)) != null;
+ }
+
private static boolean isIntelliJBasedDir(VirtualFile baseDir) {
if (baseDir == null) {
return false;