diff options
Diffstat (limited to 'plugins/devkit/src')
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; |