diff --git a/.idea/modules.xml b/.idea/modules.xml index f5a152e858e6..6c7b87a32dd8 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,15 +3,14 @@ + - - @@ -68,6 +67,7 @@ + diff --git a/.idea/runConfigurations/IDEA.xml b/.idea/runConfigurations/IDEA.xml index 75c3b359ab37..16d0af8f13ff 100644 --- a/.idea/runConfigurations/IDEA.xml +++ b/.idea/runConfigurations/IDEA.xml @@ -1,6 +1,6 @@ - + diff --git a/plugins/IntelliLang/IntelliLang-javaee.iml b/plugins/IntelliLang/IntelliLang-javaee.iml index bfbccd5a1eac..00e420c8ab6f 100644 --- a/plugins/IntelliLang/IntelliLang-javaee.iml +++ b/plugins/IntelliLang/IntelliLang-javaee.iml @@ -7,7 +7,7 @@ - + diff --git a/plugins/IntelliLang/IntelliLang-standalone.iml b/plugins/IntelliLang/IntelliLang-standalone.iml new file mode 100644 index 000000000000..19eeddb4d796 --- /dev/null +++ b/plugins/IntelliLang/IntelliLang-standalone.iml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/IntelliLang/IntelliLang-standalone.ipr b/plugins/IntelliLang/IntelliLang-standalone.ipr index 602e7f2214d6..569835e49db6 100644 --- a/plugins/IntelliLang/IntelliLang-standalone.ipr +++ b/plugins/IntelliLang/IntelliLang-standalone.ipr @@ -530,7 +530,7 @@ - + diff --git a/plugins/IntelliLang/IntelliLang-xml.iml b/plugins/IntelliLang/IntelliLang-xml.iml index d57e3f2a4b2d..62d3a331f7ee 100644 --- a/plugins/IntelliLang/IntelliLang-xml.iml +++ b/plugins/IntelliLang/IntelliLang-xml.iml @@ -16,7 +16,7 @@ - + diff --git a/plugins/IntelliLang/IntelliLang.iml b/plugins/IntelliLang/IntelliLang.iml index 19eeddb4d796..c286c6a5c90f 100644 --- a/plugins/IntelliLang/IntelliLang.iml +++ b/plugins/IntelliLang/IntelliLang.iml @@ -1,25 +1,17 @@ - - - - - + + - - - - - - - - - - + + + + + diff --git a/plugins/IntelliLang/IntelliLangJava.iml b/plugins/IntelliLang/IntelliLangJava.iml deleted file mode 100644 index c286c6a5c90f..000000000000 --- a/plugins/IntelliLang/IntelliLangJava.iml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/devkit/src/dom/Action.java b/plugins/devkit/src/dom/Action.java index 773d3a5ebfa5..bd03efde2566 100644 --- a/plugins/devkit/src/dom/Action.java +++ b/plugins/devkit/src/dom/Action.java @@ -142,6 +142,9 @@ public interface Action extends DomElement { */ AddToGroup addAddToGroup(); - @NotNull - GenericAttributeValue getUseShortcutOf(); + @NotNull + GenericAttributeValue getUseShortcutOf(); + + @NotNull + GenericAttributeValue getKeymap(); } diff --git a/plugins/devkit/src/dom/Actions.java b/plugins/devkit/src/dom/Actions.java index 4e06ec6da85f..3fa4320c2596 100644 --- a/plugins/devkit/src/dom/Actions.java +++ b/plugins/devkit/src/dom/Actions.java @@ -39,4 +39,6 @@ public interface Actions extends DomElement { @NotNull List getReferences(); + + Reference addReference(); } diff --git a/plugins/devkit/src/dom/Component.java b/plugins/devkit/src/dom/Component.java index c21a21f1ef18..0ec760843349 100644 --- a/plugins/devkit/src/dom/Component.java +++ b/plugins/devkit/src/dom/Component.java @@ -39,9 +39,11 @@ public interface Component extends DomElement { @NotNull @ExtendClass(instantiatable = false) + @Convert(PluginPsiClassConverter.class) GenericDomValue getInterfaceClass(); @NotNull + @Convert(PluginPsiClassConverter.class) GenericDomValue getHeadlessImplementationClass(); @NotNull diff --git a/plugins/devkit/src/dom/Group.java b/plugins/devkit/src/dom/Group.java index cadec21dc3aa..451e036f551a 100644 --- a/plugins/devkit/src/dom/Group.java +++ b/plugins/devkit/src/dom/Group.java @@ -22,13 +22,14 @@ package org.jetbrains.idea.devkit.dom; import com.intellij.psi.PsiClass; import com.intellij.util.xml.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.devkit.dom.impl.PluginPsiClassConverter; import java.util.List; /** * plugin.dtd:group interface. */ -public interface Group extends DomElement { +public interface Group extends Actions { /** * Returns the value of the popup child. @@ -66,6 +67,7 @@ public interface Group extends DomElement { @com.intellij.util.xml.Attribute ("class") @ExtendClass(value = "com.intellij.openapi.actionSystem.ActionGroup", instantiatable = true, allowAbstract = false, allowInterface = false) + @Convert(PluginPsiClassConverter.class) GenericAttributeValue getClazz(); diff --git a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java index 071e6450b422..c4f7df3613da 100644 --- a/plugins/devkit/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/src/dom/impl/ExtensionDomExtender.java @@ -20,6 +20,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlFile; import com.intellij.util.containers.ContainerUtil; @@ -27,7 +28,10 @@ import com.intellij.util.xml.*; import com.intellij.util.xml.reflect.DomExtender; import com.intellij.util.xml.reflect.DomExtension; import com.intellij.util.xml.reflect.DomExtensionsRegistrar; +import com.intellij.util.xmlb.Constants; +import com.intellij.util.xmlb.annotations.AbstractCollection; import com.intellij.util.xmlb.annotations.Attribute; +import com.intellij.util.xmlb.annotations.Property; import com.intellij.util.xmlb.annotations.Tag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,7 +69,8 @@ public class ExtensionDomExtender extends DomExtender { final Collection dependencies = getDependencies(ideaPlugin); for (IdeaPlugin plugin : IdeaPluginConverter.collectAllVisiblePlugins(DomUtil.getFile(extensions))) { final String value = plugin.getPluginId(); - if (value != null && dependencies.contains(value)) { + // value == null for "included" platform plugins like DomPlugin.xml, XmlPlugin.xml, etc. + if (value == null || dependencies.contains(value)) { registerExtensions(prefix, plugin, registrar, psiManager); } } @@ -74,7 +79,7 @@ public class ExtensionDomExtender extends DomExtender { private static void registerExtensions(final String prefix, final IdeaPlugin plugin, final DomExtensionsRegistrar registrar, final PsiManager psiManager) { - final String pluginId = plugin.getPluginId(); + final String pluginId = StringUtil.notNullize(plugin.getPluginId(), "com.intellij"); for (ExtensionPoints points : plugin.getExtensionPoints()) { for (ExtensionPoint point : points.getExtensionPoints()) { registerExtensionPoint(registrar, point, psiManager, prefix, pluginId); @@ -95,8 +100,7 @@ public class ExtensionDomExtender extends DomExtender { public void registerExtensions(@NotNull final DomElement domElement, @NotNull final DomExtensionsRegistrar registrar) { final String interfaceName = extensionPoint.getInterface().getStringValue(); if (interfaceName != null) { - registrar.registerGenericAttributeValueChildExtension(new XmlName("implementation"), PsiClass.class).setConverter( - CLASS_CONVERTER); + registrar.registerGenericAttributeValueChildExtension(new XmlName("implementation"), PsiClass.class).setConverter(CLASS_CONVERTER); final PsiClass implClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(interfaceName, GlobalSearchScope.allScope(manager.getProject())); @@ -129,36 +133,112 @@ public class ExtensionDomExtender extends DomExtender { } private static void registerField(final DomExtensionsRegistrar registrar, @NotNull final PsiField field) { - final PsiAnnotation[] annotations = field.getModifierList().getAnnotations(); + final PsiModifierList modifierList = field.getModifierList(); + if (modifierList == null) return; + final String fieldName = field.getName(); final PsiConstantEvaluationHelper evalHelper = JavaPsiFacade.getInstance(field.getProject()).getConstantEvaluationHelper(); - for (PsiAnnotation annotation : annotations) { - final String qName = annotation.getQualifiedName(); - if (qName != null) { - if (qName.equals(Attribute.class.getName())) { - final PsiAnnotationMemberValue attributeName = annotation.findAttributeValue("value"); - if (attributeName != null && attributeName instanceof PsiExpression) { - final Class type = String.class; - PsiExpression expression = (PsiExpression)attributeName; - final Object evaluatedExpression = evalHelper.computeConstantExpression(expression, false); - if (evaluatedExpression != null) { - registrar.registerGenericAttributeValueChildExtension(new XmlName(evaluatedExpression.toString()), type); - } - } - } else if (qName.equals(Tag.class.getName())) { - final PsiAnnotationMemberValue attributeName = annotation.findAttributeValue("value"); - if (attributeName != null && attributeName instanceof PsiExpression) { - PsiExpression expression = (PsiExpression)attributeName; - final Object evaluatedExpression = evalHelper.computeConstantExpression(expression, false); - if (evaluatedExpression != null) { - // I guess this actually needs something like registrar.registerGenericTagValueChildExtension... - registrar.registerFixedNumberChildExtension(new XmlName(evaluatedExpression.toString()), SimpleTagValue.class); - } - } + final PsiAnnotation attrAnno = modifierList.findAnnotation(Attribute.class.getName()); + if (attrAnno != null) { + final String attrName = getStringAttribute(attrAnno, "value", evalHelper); + if (attrName != null) { + final DomExtension extension = + registrar.registerGenericAttributeValueChildExtension(new XmlName(attrName), String.class); + if (fieldName.endsWith("Class")) { + extension.setConverter(CLASS_CONVERTER); } } + return; + } + final PsiAnnotation tagAnno = modifierList.findAnnotation(Tag.class.getName()); + final PsiAnnotation propAnno = modifierList.findAnnotation(Property.class.getName()); + final PsiAnnotation absColAnno = modifierList.findAnnotation(AbstractCollection.class.getName()); + //final PsiAnnotation colAnno = modifierList.findAnnotation(Collection.class.getName()); // todo + final String tagName = tagAnno != null? getStringAttribute(tagAnno, "value", evalHelper) : + propAnno != null && getBooleanAttribute(propAnno, "surroundWithTag", evalHelper)? Constants.OPTION : null; + if (tagName != null) { + if (absColAnno == null) { + final DomExtension extension = registrar.registerFixedNumberChildExtension(new XmlName(tagName), SimpleTagValue.class); + if (fieldName.endsWith("Class")) { + extension.setConverter(CLASS_CONVERTER); + } + } + else { + registrar.registerFixedNumberChildExtension(new XmlName(tagName), DomElement.class).addExtender(new DomExtender() { + @Override + public void registerExtensions(@NotNull DomElement domElement, @NotNull DomExtensionsRegistrar registrar) { + registerCollectionBinding(field.getType(), registrar, absColAnno, evalHelper); + } + }); + } + } + else if (absColAnno != null) { + registerCollectionBinding(field.getType(), registrar, absColAnno, evalHelper); + } + } + + private static void registerCollectionBinding(PsiType type, + DomExtensionsRegistrar registrar, + PsiAnnotation anno, + PsiConstantEvaluationHelper evalHelper) { + final boolean surroundWithTag = getBooleanAttribute(anno, "surroundWithTag", evalHelper); + if (surroundWithTag) return; // todo Set, List, Array + final String tagName = getStringAttribute(anno, "elementTag", evalHelper); + final String attrName = getStringAttribute(anno, "elementValueAttribute", evalHelper); + final PsiClass psiClass = getElementType(type); + if (tagName != null && attrName == null) { + registrar.registerCollectionChildrenExtension(new XmlName(tagName), SimpleTagValue.class); + } + else if (tagName != null) { + registrar.registerCollectionChildrenExtension(new XmlName(tagName), DomElement.class).addExtender(new DomExtender() { + @Override + public void registerExtensions(@NotNull DomElement domElement, @NotNull DomExtensionsRegistrar registrar) { + registrar.registerGenericAttributeValueChildExtension(new XmlName(attrName), String.class); + } + }); + } + else if (psiClass != null) { + final PsiModifierList modifierList = psiClass.getModifierList(); + final PsiAnnotation tagAnno = modifierList == null? null : modifierList.findAnnotation(Tag.class.getName()); + final String classTagName = tagAnno == null? psiClass.getName() : getStringAttribute(tagAnno, "value", evalHelper); + if (classTagName != null) { + registrar.registerCollectionChildrenExtension(new XmlName(classTagName), DomElement.class).addExtender(new DomExtender() { + @Override + public void registerExtensions(@NotNull DomElement domElement, @NotNull DomExtensionsRegistrar registrar) { + registerXmlb(registrar, psiClass); + } + }); + } } } + @Nullable + private static String getStringAttribute(final PsiAnnotation annotation, + final String name, + final PsiConstantEvaluationHelper evalHelper) { + final Object o = evalHelper.computeConstantExpression(annotation.findAttributeValue(name), false); + return o instanceof String && StringUtil.isNotEmpty((String)o)? (String)o : null; + } + + private static boolean getBooleanAttribute(final PsiAnnotation annotation, + final String name, + final PsiConstantEvaluationHelper evalHelper) { + final Object o = evalHelper.computeConstantExpression(annotation.findAttributeValue(name), false); + return o instanceof Boolean? ((Boolean)o).booleanValue() : false; + } + + @Nullable + public static PsiClass getElementType(final PsiType psiType) { + final PsiType elementType; + if (psiType instanceof PsiArrayType) elementType = ((PsiArrayType)psiType).getComponentType(); + else if (psiType instanceof PsiClassType) { + final PsiType[] types = ((PsiClassType)psiType).getParameters(); + elementType = types.length == 1? types[0] : null; + } + else elementType = null; + return PsiTypesUtil.getPsiClass(elementType); + } + + public static Collection getDependencies(IdeaPlugin ideaPlugin) { Set result = new HashSet(); diff --git a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java index 3e5e18deeb30..766603b59f51 100644 --- a/plugins/devkit/src/dom/impl/IdeaPluginConverter.java +++ b/plugins/devkit/src/dom/impl/IdeaPluginConverter.java @@ -19,17 +19,18 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.xml.XmlFile; import com.intellij.util.Function; -import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.DomFileElement; import com.intellij.util.xml.DomService; import com.intellij.util.xml.ResolvingConverter; +import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.devkit.DevKitBundle; import org.jetbrains.idea.devkit.dom.IdeaPlugin; +import org.jetbrains.idea.devkit.dom.PluginModule; import java.util.Collection; import java.util.List; @@ -39,11 +40,6 @@ import java.util.Set; * @author mike */ public class IdeaPluginConverter extends ResolvingConverter { - @NonNls private static final Set PLATFORM_MODULES = CollectionFactory.newTroveSet("com.intellij.modules.platform", - "com.intellij.modules.lang", - "com.intellij.modules.vcs", - "com.intellij.modules.xdebugger", - "com.intellij.modules.xml"); @NotNull public Collection getVariants(final ConvertContext context) { @@ -53,7 +49,13 @@ public class IdeaPluginConverter extends ResolvingConverter { @NotNull @Override public Set getAdditionalVariants(@NotNull final ConvertContext context) { - return PLATFORM_MODULES; + final THashSet result = new THashSet(); + for (IdeaPlugin ideaPlugin : getVariants(context)) { + for (PluginModule module : ideaPlugin.getModules()) { + ContainerUtil.addIfNotNull(module.getValue().getValue(), result); + } + } + return result; } @Override @@ -78,6 +80,10 @@ public class IdeaPluginConverter extends ResolvingConverter { final String otherId = ideaPlugin.getPluginId(); if (otherId == null) continue; if (otherId.equals(s)) return ideaPlugin; + for (PluginModule module : ideaPlugin.getModules()) { + final String moduleName = module.getValue().getValue(); + if (moduleName != null && moduleName.equals(s)) return ideaPlugin; + } } return null; } diff --git a/plugins/devkit/testData/codeInsight/DependsHighlighting.xml b/plugins/devkit/testData/codeInsight/DependsHighlighting.xml index 8f64ff62008b..243fc2fffcad 100644 --- a/plugins/devkit/testData/codeInsight/DependsHighlighting.xml +++ b/plugins/devkit/testData/codeInsight/DependsHighlighting.xml @@ -2,7 +2,7 @@ com.intellij.myPlugin com.intellij - com.intellij.modules.vcs + com.intellij.modules.vcs com.intellij.custom com.intellij.xxx diff --git a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java index b9a3ec0226ea..1a5ad0f47b4a 100644 --- a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java +++ b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java @@ -67,6 +67,7 @@ public class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { final String root = "idea_core"; addPluginXml(root, "\n" + " com.intellij\n" + + " \n" + ""); addPluginXml("custom", "\n" + " com.intellij.custom\n" + diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/CachedXmlDocumentSet.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/CachedXmlDocumentSet.java index 8b81adf3b2fd..548d19048989 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/CachedXmlDocumentSet.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/config/CachedXmlDocumentSet.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.HashMap; +import com.intellij.util.io.fs.IFile; import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.output.EclipseJDOMUtil; @@ -30,10 +31,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.*; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; public class CachedXmlDocumentSet implements FileSet { protected final Map nameToDir = new HashMap(); @@ -183,6 +181,19 @@ public class CachedXmlDocumentSet implements FileSet { } } + @Override + public void listModifiedFiles(List list) { + for (String key : modifiedContent.keySet()) { + try { + if (hasChanged(key)) { + list.add(getOrCreateVFile(key)); + } + } + catch (IOException ignore) { + } + } + } + public boolean hasChanged() { for (String key : modifiedContent.keySet()) { if (hasChanged(key)) { diff --git a/plugins/eclipse/testData/iml/allProps/expected/expected.iml b/plugins/eclipse/testData/iml/allProps/expected/expected.iml index 03ebc91eb508..e859b2f34993 100644 --- a/plugins/eclipse/testData/iml/allProps/expected/expected.iml +++ b/plugins/eclipse/testData/iml/allProps/expected/expected.iml @@ -94,6 +94,8 @@ + + @@ -101,6 +103,8 @@ + + diff --git a/plugins/eclipse/testData/iml/emptySrc/expected/expected.iml b/plugins/eclipse/testData/iml/emptySrc/expected/expected.iml index 6043d6eda204..739c0f9ea674 100644 --- a/plugins/eclipse/testData/iml/emptySrc/expected/expected.iml +++ b/plugins/eclipse/testData/iml/emptySrc/expected/expected.iml @@ -12,6 +12,7 @@ + diff --git a/plugins/eclipse/testData/iml/resolvedVariables/expected/expected.iml b/plugins/eclipse/testData/iml/resolvedVariables/expected/expected.iml index 24c383002455..0eced5ed6f50 100644 --- a/plugins/eclipse/testData/iml/resolvedVariables/expected/expected.iml +++ b/plugins/eclipse/testData/iml/resolvedVariables/expected/expected.iml @@ -12,6 +12,7 @@ + @@ -22,6 +23,7 @@ + diff --git a/plugins/eclipse/testData/modification/varAddJavadoc/expected/.classpath b/plugins/eclipse/testData/modification/varAddJavadoc/expected/.classpath new file mode 100644 index 000000000000..f53870069b97 --- /dev/null +++ b/plugins/eclipse/testData/modification/varAddJavadoc/expected/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/varAddJavadoc/expected/ws-internals.eml b/plugins/eclipse/testData/modification/varAddJavadoc/expected/ws-internals.eml new file mode 100644 index 000000000000..7025e8384962 --- /dev/null +++ b/plugins/eclipse/testData/modification/varAddJavadoc/expected/ws-internals.eml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/varAddJavadoc/jars/test.jar b/plugins/eclipse/testData/modification/varAddJavadoc/jars/test.jar new file mode 100644 index 000000000000..69d35ecffe38 Binary files /dev/null and b/plugins/eclipse/testData/modification/varAddJavadoc/jars/test.jar differ diff --git a/plugins/eclipse/testData/modification/varAddJavadoc/test/.classpath b/plugins/eclipse/testData/modification/varAddJavadoc/test/.classpath new file mode 100644 index 000000000000..65e495d45cd3 --- /dev/null +++ b/plugins/eclipse/testData/modification/varAddJavadoc/test/.classpath @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/eclipse/testData/modification/varAddJavadoc/test/.project b/plugins/eclipse/testData/modification/varAddJavadoc/test/.project new file mode 100644 index 000000000000..3c7030a86519 --- /dev/null +++ b/plugins/eclipse/testData/modification/varAddJavadoc/test/.project @@ -0,0 +1,17 @@ + + + ws-internals + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/plugins/eclipse/testData/modification/varAddJavadoc/variableidea/test.jar b/plugins/eclipse/testData/modification/varAddJavadoc/variableidea/test.jar new file mode 100644 index 000000000000..69d35ecffe38 Binary files /dev/null and b/plugins/eclipse/testData/modification/varAddJavadoc/variableidea/test.jar differ diff --git a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java index 08a2d1c44152..9a6fcdb8b5e0 100644 --- a/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java +++ b/plugins/eclipse/testSources/org/jetbrains/idea/eclipse/EclipseLibrariesModificationsTest.java @@ -128,6 +128,12 @@ public class EclipseLibrariesModificationsTest extends EclipseVarsTest { new String[]{}); } + public void testVarAddJavadoc() throws Exception { + doTestExisting(new String[]{"/variableidea/test.jar!/"}, + new String[]{"/variableidea/test.jar!/"}, + new String[]{"/jars/test.jar!/"}); + } + public void testVarAddVarSource() throws Exception { doTestExisting(new String[]{"/variableidea/test.jar!/"}, new String[]{"/variableidea/test.jar!/", "/srcvariableidea/test.jar!/"}, diff --git a/plugins/groovy/jetgroovy.iml b/plugins/groovy/jetgroovy.iml index 3ead47ab4a1e..75c0ecccfd80 100644 --- a/plugins/groovy/jetgroovy.iml +++ b/plugins/groovy/jetgroovy.iml @@ -30,7 +30,7 @@ - + diff --git a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java index 04e21e9cde4c..0ed28380d1f8 100644 --- a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java +++ b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/PatternEditorContextMembersProvider.java @@ -16,11 +16,14 @@ package org.intellij.plugins.intelliLang.inject.groovy; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.patterns.compiler.PatternClassBean; import com.intellij.patterns.compiler.PatternCompilerFactory; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiManagerEx; +import com.intellij.psi.impl.search.LowLevelSearchUtil; import com.intellij.psi.impl.source.resolve.FileContextUtil; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.search.GlobalSearchScope; @@ -33,7 +36,10 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlText; import com.intellij.util.ArrayUtil; +import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.text.StringSearcher; +import com.intellij.util.xml.DomManager; import org.intellij.plugins.intelliLang.inject.InjectorUtils; import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.jetbrains.annotations.NotNull; @@ -132,7 +138,7 @@ public class PatternEditorContextMembersProvider extends NonCodeMembersContribut if (beanClass != null) { final GlobalSearchScope scope = GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.allScope(project), StdFileTypes.XML); - beanClass.getManager().getSearchHelper().processElementsWithWord(new TextOccurenceProcessor() { + final TextOccurenceProcessor occurenceProcessor = new TextOccurenceProcessor() { @Override public boolean execute(PsiElement element, int offsetInElement) { final XmlTag tag = PsiTreeUtil.getParentOfType(element, XmlTag.class); @@ -142,7 +148,15 @@ public class PatternEditorContextMembersProvider extends NonCodeMembersContribut } return true; } - }, scope, "patterns.patternClass", UsageSearchContext.IN_FOREIGN_LANGUAGES, true); + }; + final StringSearcher searcher = new StringSearcher("patternClass", true, true); + ((PsiManagerEx)beanClass.getManager()).getCacheManager().processFilesWithWord(new Processor() { + @Override + public boolean process(PsiFile psiFile) { + LowLevelSearchUtil.processElementsContainingWordInElement(occurenceProcessor, psiFile, searcher, false, new EmptyProgressIndicator()); + return true; + } + }, searcher.getPattern(), UsageSearchContext.IN_FOREIGN_LANGUAGES, scope, searcher.isCaseSensitive()); } final Class[] classes = PatternCompilerFactory.getFactory().getPatternClasses(type); if (classes.length != 0) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java index a308f70f04f4..e1dca6a60a14 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java @@ -20,6 +20,8 @@ import com.intellij.compiler.CompilerConfiguration; import com.intellij.compiler.impl.CompilerUtil; import com.intellij.compiler.impl.FileSetCompileScope; import com.intellij.compiler.impl.javaCompiler.ModuleChunk; +import com.intellij.compiler.make.CacheCorruptedException; +import com.intellij.compiler.make.DependencyCache; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.configurations.JavaParameters; @@ -34,6 +36,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.module.Module; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdkType; import com.intellij.openapi.projectRoots.JdkUtil; @@ -58,6 +62,7 @@ import com.intellij.util.Chunk; import com.intellij.util.PathUtil; import com.intellij.util.PathsList; import com.intellij.util.SmartList; +import com.intellij.util.cls.ClsFormatException; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -207,6 +212,33 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { } addStubsToCompileScope(outputPaths, compileContext, module); outputItems = Collections.emptyList(); + } else { + final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); + if (indicator != null) { + indicator.setText("Updating caches..."); + } + + final DependencyCache dependencyCache = ((CompileContextEx)compileContext).getDependencyCache(); + for (OutputItem outputItem : outputItems) { + if (indicator != null) { + indicator.setText2(outputItem.getSourceFile().getName()); + } + + final String path = outputItem.getOutputPath(); + final File classFile = new File(path); + try { + dependencyCache.reparseClassFile(classFile, FileUtil.loadFileBytes(classFile)); + } + catch (ClsFormatException e) { + LOG.error(e); + } + catch (CacheCorruptedException e) { + LOG.error(e); + } + catch (IOException e) { + LOG.error(e); + } + } } sink.add(outputDir.getPath(), outputItems, VfsUtil.toVirtualFileArray(toRecompile)); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java index 3423c99e5816..d3ea103a2b8e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearchHelper.java @@ -35,6 +35,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrNewExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; @@ -88,11 +89,19 @@ public class GroovyConstructorUsagesSearchHelper { @Override public boolean processInReadAction(PsiReference ref) { final PsiElement element = ref.getElement(); - if (element instanceof GrCodeReferenceElement && element.getParent() instanceof GrNewExpression) { - final GrNewExpression newExpression = (GrNewExpression)element.getParent(); - final PsiMethod resolvedConstructor = newExpression.resolveConstructor(); - final PsiManager manager = constructor.getManager(); - if (manager.areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) return false; + if (element instanceof GrCodeReferenceElement) { + GrNewExpression newExpression = null; + if (element.getParent() instanceof GrNewExpression) { + newExpression = (GrNewExpression)element.getParent(); + } + else if (element.getParent() instanceof GrAnonymousClassDefinition) { + newExpression = (GrNewExpression)element.getParent().getParent(); + } + if (newExpression != null) { + final PsiMethod resolvedConstructor = newExpression.resolveConstructor(); + final PsiManager manager = constructor.getManager(); + if (manager.areElementsEquivalent(resolvedConstructor, constructor) && !consumer.process(ref)) return false; + } } return true; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java index 64ba6c939cad..b03125b76fd1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppTypeConverter.java @@ -66,6 +66,11 @@ public class GppTypeConverter extends GrTypeConverter { (!TypesUtil.isAssignable(lKeyType, parameters[0], context) || !TypesUtil.isAssignable(lValueType, parameters[1], context))) { return null; } + + if (((GrMapType)rType).getValueType("super") != null) { + return true; + } + if (hasDefaultConstructor(lType)) { return true; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClassReferenceType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClassReferenceType.java index 6e988f3b13f2..8a5af195f087 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClassReferenceType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrClassReferenceType.java @@ -19,12 +19,16 @@ package org.jetbrains.plugins.groovy.lang.psi.impl; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; +import java.util.ArrayList; +import java.util.List; + /** * @author ven */ @@ -62,8 +66,7 @@ public class GrClassReferenceType extends PsiClassType { @NotNull public PsiType[] getParameters() { - //todo - return PsiType.EMPTY_ARRAY; + return myReferenceElement.getTypeArguments(); } @NotNull diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java index 2a45e985ae61..3fbe912f1cc7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GrMapType.java @@ -26,6 +26,7 @@ import com.intellij.psi.PsiType; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -149,6 +150,11 @@ public class GrMapType extends GrLiteralClassType { return super.equals(obj); } + @Nullable + public PsiType getValueType(@NotNull String key) { + return myStringEntries.get(key); + } + public boolean isAssignableFrom(@NotNull PsiType type) { return type instanceof GrMapType || myFacade.getElementFactory().createTypeFromText(getJavaClassName(), null).isAssignableFrom(type); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java index fbce8d317fcd..7109cb41489b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/arguments/GrArgumentLabelImpl.java @@ -103,7 +103,7 @@ public class GrArgumentLabelImpl extends GroovyPsiElementImpl implements GrArgum } final IElementType elemType = element.getNode().getElementType(); - if (GroovyTokenTypes.mIDENT == elemType) { + if (GroovyTokenTypes.mIDENT == elemType || GroovyTokenTypes.KEYWORDS.contains(elemType)) { return element.getText(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyNameSuggestionProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyNameSuggestionProvider.java index 08a0a2ff85dc..79d2b7cc642c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyNameSuggestionProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/GroovyNameSuggestionProvider.java @@ -22,7 +22,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.SuggestedNameInfo; import com.intellij.psi.statistics.JavaStatisticsManager; import com.intellij.refactoring.rename.NameSuggestionProvider; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import java.util.Arrays; @@ -34,8 +34,8 @@ import java.util.Set; */ public class GroovyNameSuggestionProvider implements NameSuggestionProvider { @Override - public SuggestedNameInfo getSuggestedNames(final PsiElement element, PsiElement nameSuggestionContext, Set result) { - if (!(element instanceof GroovyPsiElement)) return null; + public SuggestedNameInfo getSuggestedNames(final PsiElement element, @Nullable PsiElement nameSuggestionContext, Set result) { + if (nameSuggestionContext == null) nameSuggestionContext = element; if (element instanceof GrVariable) { final PsiType type = ((GrVariable)element).getTypeGroovy(); if (type != null) { @@ -56,7 +56,7 @@ public class GroovyNameSuggestionProvider implements NameSuggestionProvider { } @Override - public Collection completeName(PsiElement element, PsiElement nameSuggestionContext, String prefix) { + public Collection completeName(PsiElement element, @Nullable PsiElement nameSuggestionContext, String prefix) { return null; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureConflictSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureConflictSearcher.java index 27acb2f08c76..6a9e1fb90e7d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureConflictSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrChangeSignatureConflictSearcher.java @@ -98,7 +98,7 @@ class GrChangeSignatureConflictSearcher { if (!JavaPsiFacade.getInstance(element.getProject()).getResolveHelper() .isAccessible(method, modifierList, element, accessObjectClass, null)) { String message = - RefactoringBundle.message("0.with.1.visibility.is.not.accesible.from.2", + RefactoringBundle.message("0.with.1.visibility.is.not.accessible.from.2", RefactoringUIUtil.getDescription(method, true), myChangeInfo.getNewVisibility(), RefactoringUIUtil.getDescription(ConflictsUtil.getContainer(element), true)); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java index 787f7e3e3dfe..d5496e22307e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/changeSignature/GrMethodCallUsageInfo.java @@ -27,8 +27,8 @@ import com.intellij.usageView.UsageInfo; import com.intellij.util.containers.hash.HashMap; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrConstructorInvocation; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConstructorCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; @@ -110,8 +110,8 @@ public class GrMethodCallUsageInfo extends UsageInfo implements PossiblyIncorrec return ((GrReferenceExpression)expression).advancedResolve(); } } - else if (parent instanceof GrConstructorInvocation) { - return ((GrConstructorInvocation)parent).resolveConstructorGenerics(); + else if (parent instanceof GrConstructorCall) { + return ((GrConstructorCall)parent).resolveConstructorGenerics(); } return null; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GppCompilerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GppCompilerTest.groovy index 3de2fac8e4ab..7d951d2ef99d 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GppCompilerTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GppCompilerTest.groovy @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.compiler; +import com.intellij.openapi.vfs.VfsUtil import com.intellij.testFramework.PsiTestUtil import org.jetbrains.plugins.groovy.util.TestUtils @@ -58,4 +59,60 @@ class Foo implements SomeTrait { assertEmpty(make()); } + public void testRecompileDependentGroovyClasses() throws Exception { + def a = myFixture.addFileToProject("A.gpp", """ +class A { + void foo() { + print "239" + } +} +""") + myFixture.addFileToProject("b.gpp", """ +new A().foo() +""") + assertEmpty make() + assertOutput "b", "239" + + VfsUtil.saveText a.virtualFile, """ +class A { + def foo() { + print "239" + } +} +""" + + assertEmpty make() + assertOutput "b", "239" + } + + public void testRecompileDependentJavaClasses() throws Exception { + def a = myFixture.addFileToProject("A.gpp", """ +class A { + void foo() { + print "239" + } +} +""") + myFixture.addFileToProject("B.java", """ +public class B { + public static void main(String[] args) { + new A().foo(); + } +} +""") + assertEmpty make() + assertOutput "B", "239" + + VfsUtil.saveText a.virtualFile, """ +class A { + def foo() { + print "239" + } +} +""" + + assertEmpty make() + assertOutput "B", "239" + } + } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy index 345efb7e3450..f5d5fb58dfd0 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy @@ -375,6 +375,16 @@ s.doSmth() assertEquals "doSmth", ((PsiMethod) findReference().resolve()).name } + public void testBaseConstructorCallInMapLiteras() throws Exception { + configureScript """ +@Typed File foo() { ['super':['a']] } +@Typed File goo() { [:] } +File bar() { [:] } +""" + myFixture.enableInspections new GroovyAssignabilityCheckInspection() + myFixture.checkHighlighting(true, false, false) + } + } class GppProjectDescriptor extends DefaultLightProjectDescriptor { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/findUsages/FindUsagesTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/findUsages/FindUsagesTest.java index fa3f4f128256..224db22aa5a1 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/findUsages/FindUsagesTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/findUsages/FindUsagesTest.java @@ -152,7 +152,7 @@ public class FindUsagesTest extends LightGroovyTestCase { assertEquals(1, query.findAll().size()); } - private void doTestImpl(String filePath, int expectedUsagesCount) throws Throwable { + private void doTestImpl(String filePath, int expectedUsagesCount) { myFixture.configureByFile(filePath); assertUsageCount(expectedUsagesCount); } @@ -197,7 +197,11 @@ public class FindUsagesTest extends LightGroovyTestCase { assertEquals(2, ReferencesSearch.search(file.getTopStatements()[0]).findAll().size()); } - private void doSuperMethodTest(String... firstParameterTypes) throws Exception { + public void testConstructorUsageInAnonymousClass() { + doTestImpl("A.groovy", 1); + } + + private void doSuperMethodTest(String... firstParameterTypes) { myFixture.configureByFile(getTestName(false) + ".groovy"); final GroovyFile file = (GroovyFile)myFixture.getFile(); final GrTypeDefinition psiClass = (GrTypeDefinition)file.getClasses()[0]; diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/IntroduceParameterTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/IntroduceParameterTest.java index d2e11e031e63..109853732d1b 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/IntroduceParameterTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/introduceParameter/IntroduceParameterTest.java @@ -155,7 +155,7 @@ public class IntroduceParameterTest extends LightCodeInsightFixtureTestCase { } public void testThisSubstitutionInQualifier() throws Throwable { - doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE, false, false, false, "field Test.i is not accesible from method XTest.n(). Value for introduced parameter in that method call will be incorrect."); + doTest(IntroduceParameterRefactoring.REPLACE_FIELDS_WITH_GETTERS_NONE, false, false, false, "field Test.i is not accessible from method XTest.n(). Value for introduced parameter in that method call will be incorrect."); } public void testFieldAccess() throws Throwable { diff --git a/plugins/groovy/testdata/findUsages/constructorUsageInAnonymousClass/A.groovy b/plugins/groovy/testdata/findUsages/constructorUsageInAnonymousClass/A.groovy new file mode 100644 index 000000000000..e55f07d9e782 --- /dev/null +++ b/plugins/groovy/testdata/findUsages/constructorUsageInAnonymousClass/A.groovy @@ -0,0 +1,8 @@ +class Foo { + + def Foo(int a) { + } + def Foo(){} +} + +def z = new Foo() {} \ No newline at end of file diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java index 72e4ab484949..dceaf3e1518d 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java @@ -27,6 +27,7 @@ import com.intellij.execution.junit2.ui.JUnitTreeConsoleView; import com.intellij.execution.junit2.ui.TestsPacketsReceiver; import com.intellij.execution.junit2.ui.actions.RerunFailedTestsAction; import com.intellij.execution.junit2.ui.model.JUnitRunningModel; +import com.intellij.execution.junit2.ui.model.RootTestInfo; import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; @@ -258,15 +259,18 @@ public abstract class TestObject implements JavaCommandLine { for(final RunConfigurationExtension ext: Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { ext.handleStartProcess(myConfiguration, handler); } + final TestProxy unboundOutputRoot = new TestProxy(new RootTestInfo()); final JUnitConsoleProperties consoleProperties = new JUnitConsoleProperties(myConfiguration); - final JUnitTreeConsoleView consoleView = new JUnitTreeConsoleView(consoleProperties, getRunnerSettings(), getConfigurationSettings()); + final JUnitTreeConsoleView consoleView = new JUnitTreeConsoleView(consoleProperties, getRunnerSettings(), getConfigurationSettings(), unboundOutputRoot); consoleView.initUI(); consoleView.attachToProcess(handler); + unboundOutputRoot.setPrinter(consoleView.getPrinter()); final TestsPacketsReceiver packetsReceiver = new TestsPacketsReceiver(consoleView) { @Override public void notifyStart(TestProxy root) { super.notifyStart(root); + unboundOutputRoot.addChild(root); final JUnitRunningModel model = getModel(); if (model != null) { handler.getOut().setDispatchListener(model.getNotifier()); @@ -308,11 +312,17 @@ public abstract class TestObject implements JavaCommandLine { final String text = event.getText(); final ConsoleViewContentType consoleViewType = ConsoleViewContentType.getConsoleViewType(outputType); final TestProxy currentTest = packetsReceiver.getCurrentTest(); + final Printable printable = new Printable() { + public void printOn(final Printer printer) { + printer.print(text, consoleViewType); + } + }; + if (currentTest != null) { - currentTest.onOutput(text, consoleViewType); + currentTest.addLast(printable); } else { - consoleView.getPrinter().onNewAvailable(new ExternalOutput(text, consoleViewType)); + unboundOutputRoot.addLast(printable); } } }); diff --git a/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java b/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java index 17a9cc5e0c11..a9b57d0d690f 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java +++ b/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java @@ -19,12 +19,9 @@ package com.intellij.execution.junit2; import com.intellij.execution.Location; import com.intellij.execution.junit2.events.*; import com.intellij.execution.junit2.info.TestInfo; -import com.intellij.execution.junit2.segments.InputConsumer; import com.intellij.execution.junit2.states.Statistics; import com.intellij.execution.junit2.states.TestState; import com.intellij.execution.testframework.*; -import com.intellij.execution.testframework.ui.PrintableTestProxy; -import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.pom.Navigatable; @@ -36,20 +33,18 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -public class TestProxy extends CompositePrintable implements PrintableTestProxy, InputConsumer, ChangingPrintable { +public class TestProxy extends AbstractTestProxy { private static final Logger LOG = Logger.getInstance("#com.intellij.execution.junit2.TestProxy"); private final TestInfo myInfo; private TestState myState = TestState.DEFAULT; - private Printer myPrinter = Printer.DEAF; private final TestProxyListenersNotifier myNotifier = new TestProxyListenersNotifier(); private Statistics myStatistics = new Statistics(); private TestEventsConsumer myEventsConsumer; private int myPreviousMagnitude = -1; private int myStateTimestamp = 0; - private boolean myMarked = false; -// private ArrayList myChildren = new ArrayList(); + // private ArrayList myChildren = new ArrayList(); private final FilterCache myChildren = new FilterCache(); private TestProxy myParent = null; public static final Filter NOT_LEAF = Filter.LEAF.not(); @@ -62,27 +57,8 @@ public class TestProxy extends CompositePrintable implements PrintableTestProxy, return getInfo().getComment() + "." + getInfo().getName(); } - public void onOutput(final String text, final ConsoleViewContentType contentType) { - if (!myMarked && contentType == ConsoleViewContentType.ERROR_OUTPUT) { - myPrinter.mark(); - myMarked = true; - } - final ExternalOutput printable = new ExternalOutput(text, contentType); - addLast(printable); - } - - public void addLast(final Printable printable) { - super.addLast(printable); - fireOnNewPrintable(printable); - } - - private void fireOnNewPrintable(final Printable printable) { - myPrinter.onNewAvailable(printable); - } - public void printOn(final Printer printer) { super.printOn(printer); - CompositePrintable.printAllOn(myChildren.getList(), printer); myState.printOn(printer); } @@ -114,10 +90,6 @@ public class TestProxy extends CompositePrintable implements PrintableTestProxy, return myStateTimestamp; } - public TestProxy getChildAt(final int childIndex) { - return myChildren.getList().get(childIndex); - } - public int getChildCount() { return myChildren.getList().size(); } @@ -178,22 +150,13 @@ public class TestProxy extends CompositePrintable implements PrintableTestProxy, return;//todo throw new RuntimeException("Test: "+child + " already has parent: " + child.getParent()); myChildren.add(child); child.myParent = this; - if (myPrinter != Printer.DEAF) { - child.setPrintLinstener(myPrinter); - child.fireOnNewPrintable(child); - } + addLast(child); + child.setPrinter(myPrinter); pullEvent(new NewChildEvent(this, child)); getState().changeStateAfterAddingChildTo(this, child); myNotifier.onChildAdded(this, child); } - public void setPrintLinstener(final Printer printer) { - myPrinter = printer; - for (Iterator iterator = myChildren.iterator(); iterator.hasNext();) { - final TestProxy testProxy = (TestProxy) iterator.next(); - testProxy.setPrintLinstener(printer); - } - } public TestInfo getInfo() { return myInfo; @@ -296,8 +259,4 @@ public class TestProxy extends CompositePrintable implements PrintableTestProxy, return parents.toArray(new TestProxy[parents.size()]); } - public boolean isRoot() { - return getParent() == null; - } - } diff --git a/plugins/junit/src/com/intellij/execution/junit2/TestRootImpl.java b/plugins/junit/src/com/intellij/execution/junit2/TestRootImpl.java deleted file mode 100644 index 64e6a7fb5d85..000000000000 --- a/plugins/junit/src/com/intellij/execution/junit2/TestRootImpl.java +++ /dev/null @@ -1,68 +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 com.intellij.execution.junit2; - -import com.intellij.execution.junit2.info.ClassBasedInfo; -import com.intellij.execution.junit2.info.DisplayTestInfoExtractor; -import com.intellij.execution.junit2.segments.ObjectReader; -import com.intellij.util.containers.HashMap; - -import java.util.List; - -public class TestRootImpl implements TestRoot { - private final TestProxy myRootTest; - private final HashMap myKnownDynamicParents = new HashMap(); - - public TestRootImpl(final TestProxy rootTest) { - myRootTest = rootTest; - } - - public void addChild(final TestProxy child) { - if (child == myRootTest) - return; - getDynamicParentFor(child).addChild(child); - } - - private TestProxy getDynamicParentFor(final TestProxy child) { - final String parentClass = child.getInfo().getComment(); - TestProxy dynamicParent = myKnownDynamicParents.get(parentClass); - if (dynamicParent == null) { - dynamicParent = new TestProxy(new DynamicParentInfo(parentClass)); - myKnownDynamicParents.put(parentClass, dynamicParent); - myRootTest.addChild(dynamicParent); - } - return dynamicParent; - } - - public TestProxy getRootTest() { - return myRootTest; - } - - public List getAllTests() { - return getRootTest().getAllTests(); - } - - private static class DynamicParentInfo extends ClassBasedInfo { - public DynamicParentInfo(final String className) { - super(DisplayTestInfoExtractor.FOR_CLASS); - setClassName(className); - } - - public void readFrom(final ObjectReader reader) { - } - } -} diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java index a27a2cc70cdf..6128e3a710e2 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java @@ -356,7 +356,7 @@ public class JUnitConfigurable extends SettingsEditor { } private String getClassName() { - return ((LabeledComponent)getTestLocation(JUnitConfigurationModel.CLASS).getComponent()).getText(); + return ((LabeledComponent)getTestLocation(JUnitConfigurationModel.CLASS)).getComponent().getText(); } private void setPackage(final PsiPackage aPackage) { diff --git a/plugins/junit/src/com/intellij/execution/junit2/states/FaultyState.java b/plugins/junit/src/com/intellij/execution/junit2/states/FaultyState.java index 519e03569f5f..b29137523911 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/states/FaultyState.java +++ b/plugins/junit/src/com/intellij/execution/junit2/states/FaultyState.java @@ -20,8 +20,9 @@ import com.intellij.execution.Location; import com.intellij.execution.PsiLocation; import com.intellij.execution.junit2.segments.ObjectReader; import com.intellij.execution.stacktrace.StackTraceLine; +import com.intellij.execution.testframework.AbstractTestProxy; +import com.intellij.execution.testframework.CompositePrintable; import com.intellij.execution.testframework.Printer; -import com.intellij.execution.testframework.ui.PrintableTestProxy; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.openapi.diff.LineTokenizer; import com.intellij.pom.Navigatable; @@ -44,11 +45,11 @@ public class FaultyState extends ReadableState { } public void printOn(final Printer printer) { - printer.print(PrintableTestProxy.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); + printer.print(CompositePrintable.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); printer.mark(); for (int i = 0; i < myMessages.size(); i++) { printExceptionHeader(printer, myMessages.get(i)); - printer.print(myStackTraces.get(i) + PrintableTestProxy.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); + printer.print(myStackTraces.get(i) + CompositePrintable.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); } } diff --git a/plugins/junit/src/com/intellij/execution/junit2/states/IgnoredState.java b/plugins/junit/src/com/intellij/execution/junit2/states/IgnoredState.java index fba1b82b200c..54ce283592d0 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/states/IgnoredState.java +++ b/plugins/junit/src/com/intellij/execution/junit2/states/IgnoredState.java @@ -19,8 +19,9 @@ package com.intellij.execution.junit2.states; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.junit2.TestProxy; import com.intellij.execution.junit2.segments.ObjectReader; +import com.intellij.execution.testframework.AbstractTestProxy; +import com.intellij.execution.testframework.CompositePrintable; import com.intellij.execution.testframework.Printer; -import com.intellij.execution.testframework.ui.PrintableTestProxy; import com.intellij.execution.ui.ConsoleViewContentType; public class IgnoredState extends ReadableState { @@ -39,12 +40,12 @@ public class IgnoredState extends ReadableState { public void printOn(final Printer printer) { String parentName = myPeformedTest.getParent() == null ? myPeformedTest.getInfo().getComment() : myPeformedTest.getParent().toString(); String message = ExecutionBundle.message("junit.runing.info.ignored.console.message", parentName, myPeformedTest.getInfo().getName()); - printer.print(message + (myIgnoredMessage.length() > 0 ? " (" + myIgnoredMessage + ")": "") + PrintableTestProxy.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); + printer.print(message + (myIgnoredMessage.length() > 0 ? " (" + myIgnoredMessage + ")": "") + CompositePrintable.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); if (myMessage.length() > 0) { - printer.print(myMessage + PrintableTestProxy.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); + printer.print(myMessage + CompositePrintable.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); } if (myStackTrace.length() > 0) { - printer.print(myStackTrace + PrintableTestProxy.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); + printer.print(myStackTrace + CompositePrintable.NEW_LINE, ConsoleViewContentType.ERROR_OUTPUT); } } } diff --git a/plugins/junit/src/com/intellij/execution/junit2/states/SkippedState.java b/plugins/junit/src/com/intellij/execution/junit2/states/SkippedState.java index 6634c1f74cc3..dfb25753cfaf 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/states/SkippedState.java +++ b/plugins/junit/src/com/intellij/execution/junit2/states/SkippedState.java @@ -19,8 +19,9 @@ package com.intellij.execution.junit2.states; import com.intellij.execution.junit2.TestProxy; import com.intellij.execution.junit2.segments.ObjectReader; import com.intellij.execution.junit2.ui.Formatters; +import com.intellij.execution.testframework.AbstractTestProxy; +import com.intellij.execution.testframework.CompositePrintable; import com.intellij.execution.testframework.Printer; -import com.intellij.execution.testframework.ui.PrintableTestProxy; import com.intellij.execution.ui.ConsoleViewContentType; public class SkippedState extends ReadableState { @@ -31,7 +32,7 @@ public class SkippedState extends ReadableState { } public void printOn(final Printer printer) { - printer.print(Formatters.printTest(myPeformedTest) + ":" + PrintableTestProxy.NEW_LINE, + printer.print(Formatters.printTest(myPeformedTest) + ":" + CompositePrintable.NEW_LINE, ConsoleViewContentType.SYSTEM_OUTPUT); myPeformedTest.printOn(printer); } diff --git a/plugins/junit/src/com/intellij/execution/junit2/ui/JUnitTreeConsoleView.java b/plugins/junit/src/com/intellij/execution/junit2/ui/JUnitTreeConsoleView.java index d2311ceb6758..b8179f52552c 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/ui/JUnitTreeConsoleView.java +++ b/plugins/junit/src/com/intellij/execution/junit2/ui/JUnitTreeConsoleView.java @@ -18,10 +18,12 @@ package com.intellij.execution.junit2.ui; import com.intellij.execution.configurations.ConfigurationPerRunnerSettings; import com.intellij.execution.configurations.RunnerSettings; +import com.intellij.execution.junit2.TestProxy; import com.intellij.execution.junit2.ui.model.JUnitRunningModel; import com.intellij.execution.junit2.ui.model.TreeCollapser; import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties; import com.intellij.execution.process.ProcessHandler; +import com.intellij.execution.testframework.AbstractTestProxy; import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView; import com.intellij.execution.testframework.ui.TestResultsPanel; @@ -35,12 +37,12 @@ public class JUnitTreeConsoleView extends BaseTestsOutputConsoleView { public JUnitTreeConsoleView(final JUnitConsoleProperties properties, final RunnerSettings runnerSettings, - final ConfigurationPerRunnerSettings configurationSettings) { - super(properties); + final ConfigurationPerRunnerSettings configurationSettings, + final AbstractTestProxy unboundOutputRoot) { + super(properties, unboundOutputRoot); myProperties = properties; myRunnerSettings = runnerSettings; myConfigurationSettings = configurationSettings; - getPrinter().setCollectOutput(true); } protected TestResultsPanel createTestResultsPanel() { @@ -64,7 +66,6 @@ public class JUnitTreeConsoleView extends BaseTestsOutputConsoleView { } public void attachToModel(JUnitRunningModel model) { - getPrinter().setCollectOutput(false); myConsolePanel.getTreeView().attachToModel(model); model.attachToTree(myConsolePanel.getTreeView()); myConsolePanel.setModel(model); diff --git a/plugins/junit/src/com/intellij/execution/junit2/ui/model/RootTestInfo.java b/plugins/junit/src/com/intellij/execution/junit2/ui/model/RootTestInfo.java new file mode 100644 index 000000000000..aebcbfa39109 --- /dev/null +++ b/plugins/junit/src/com/intellij/execution/junit2/ui/model/RootTestInfo.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2010 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 com.intellij.execution.junit2.ui.model; + +import com.intellij.execution.Location; +import com.intellij.execution.junit2.info.TestInfo; +import com.intellij.execution.junit2.segments.ObjectReader; +import com.intellij.openapi.project.Project; + +/** +* User: anna +* Date: Jul 21, 2010 +*/ +public class RootTestInfo extends TestInfo { + private String myName = SpecialNode.TESTS_IN_PROGRESS; + + public String getComment() { + return ""; + } + + public String getName() { return myName; } + + public void setName(final String name) { myName = name; } + + public boolean shouldRun() { + return false; + } + + public int getTestsCount() { + return 0; + } + + @Override + public void readFrom(ObjectReader reader) { + } + + public Location getLocation(final Project project) { + return null; + } + +} diff --git a/plugins/junit/src/com/intellij/execution/junit2/ui/model/SpecialNode.java b/plugins/junit/src/com/intellij/execution/junit2/ui/model/SpecialNode.java index a5e62e2d1cc6..0771d642175b 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/ui/model/SpecialNode.java +++ b/plugins/junit/src/com/intellij/execution/junit2/ui/model/SpecialNode.java @@ -16,22 +16,18 @@ package com.intellij.execution.junit2.ui.model; -import com.intellij.execution.Location; import com.intellij.execution.ExecutionBundle; -import com.intellij.execution.junit2.segments.ObjectReader; import com.intellij.execution.junit2.ui.TestProgress; import com.intellij.execution.junit2.TestProxy; -import com.intellij.execution.junit2.info.TestInfo; import com.intellij.execution.junit2.states.NotFailedState; import com.intellij.ide.util.treeView.AbstractTreeBuilder; -import com.intellij.openapi.project.Project; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class SpecialNode extends TestProxy { - private static final String ALL_PASSED = ExecutionBundle.message("junit.all.tests.passed.label"); - private static final String TESTS_IN_PROGRESS = ExecutionBundle.message("junit.tests.in.progress.label"); + public static final String ALL_PASSED = ExecutionBundle.message("junit.all.tests.passed.label"); + public static final String TESTS_IN_PROGRESS = ExecutionBundle.message("junit.tests.in.progress.label"); private final JUnitRunningModel myModel; private final AbstractTreeBuilder myBuilder; @@ -40,7 +36,7 @@ public class SpecialNode extends TestProxy { private CompletionEvent myCompletionEvent; public SpecialNode(final TestTreeBuilder treeBuilder, final JUnitRunningModel model) { - super(new MyTestInfo()); + super(new RootTestInfo()); myModel = model; myBuilder = treeBuilder; final MyJUnitAdapter listener = new MyJUnitAdapter(); @@ -59,35 +55,6 @@ public class SpecialNode extends TestProxy { updateName(); } - private static class MyTestInfo extends TestInfo { - private String myName = TESTS_IN_PROGRESS; - - public String getComment() { - return ""; - } - - public String getName() { return myName; } - - public void setName(final String name) { myName = name; } - - public boolean shouldRun() { - return false; - } - - public int getTestsCount() { - return 0; - } - - @Override - public void readFrom(ObjectReader reader) { - } - - public Location getLocation(final Project project) { - return null; - } - - } - private class MyJUnitAdapter extends JUnitAdapter implements ChangeListener { public void stateChanged(final ChangeEvent e) { if (myCompletionEvent != null) updateName(); @@ -107,7 +74,7 @@ public class SpecialNode extends TestProxy { private void updateName() { if (!myIsVisible) return; - final MyTestInfo myTestInfo = (MyTestInfo)getInfo(); + final RootTestInfo myTestInfo = (RootTestInfo)getInfo(); final String newName; final TestProgress progress = myModel.getProgress(); if (myCompletionEvent == null) { diff --git a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java index 7bd1c2672ff0..8b87d1aa369c 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java @@ -39,6 +39,7 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner { myListeners = listeners; try { Test suite = TestRunnerUtil.getTestSuite(this, args); + if (suite == null) return -1; TestResult result = doRun(suite); if (!result.wasSuccessful()) { return -1; diff --git a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java index 0e9aeb55c489..43d4baa8a535 100644 --- a/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java +++ b/plugins/relaxng/src/org/intellij/plugins/relaxNG/model/resolve/RelaxSymbolIndex.java @@ -7,6 +7,7 @@ import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FileStatus; +import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -19,6 +20,8 @@ import com.intellij.psi.xml.XmlFile; import com.intellij.util.indexing.*; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; +import com.intellij.util.text.CharArrayUtil; +import com.intellij.util.text.CharSequenceReader; import com.intellij.util.xml.NanoXmlUtil; import org.intellij.plugins.relaxNG.ProjectLoader; import org.intellij.plugins.relaxNG.compact.RncFileType; @@ -30,11 +33,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /* * Created by IntelliJ IDEA. @@ -68,7 +67,9 @@ public class RelaxSymbolIndex extends ScalarIndexExtension { public Map map(FileContent inputData) { final HashMap map = new HashMap(); if (inputData.getFileType() == XmlFileType.INSTANCE) { - NanoXmlUtil.parse(new ByteArrayInputStream(inputData.getContent()), new NanoXmlUtil.IXMLBuilderAdapter() { + CharSequence inputDataContentAsText = inputData.getContentAsText(); + if (CharArrayUtil.indexOf(inputDataContentAsText, ProjectLoader.RNG_NAMESPACE, 0) == -1) return Collections.EMPTY_MAP; + NanoXmlUtil.parse(new CharSequenceReader(inputDataContentAsText), new NanoXmlUtil.IXMLBuilderAdapter() { NanoXmlUtil.IXMLBuilderAdapter attributeHandler; int depth; @@ -131,6 +132,9 @@ public class RelaxSymbolIndex extends ScalarIndexExtension { public FileBasedIndex.InputFilter getInputFilter() { return new FileBasedIndex.InputFilter() { public boolean acceptInput(VirtualFile file) { + if (file.getFileSystem() instanceof JarFileSystem) { + return false; // there is lots and lots of custom XML inside zip files + } return file.getFileType() == StdFileTypes.XML || file.getFileType() == RncFileType.getInstance(); } }; diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java index 93f14f39c44d..d9669df9ee23 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java @@ -31,9 +31,7 @@ import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ProgramRunner; -import com.intellij.execution.testframework.TestConsoleProperties; -import com.intellij.execution.testframework.TestFrameworkRunningModel; -import com.intellij.execution.testframework.TestSearchScope; +import com.intellij.execution.testframework.*; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.openapi.application.PathManager; @@ -60,10 +58,7 @@ import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.pom.java.LanguageLevel; import com.intellij.util.PathUtil; import com.intellij.util.net.NetUtils; -import com.theoryinpractice.testng.model.IDEARemoteTestRunnerClient; -import com.theoryinpractice.testng.model.TestData; -import com.theoryinpractice.testng.model.TestNGRemoteListener; -import com.theoryinpractice.testng.model.TestType; +import com.theoryinpractice.testng.model.*; import com.theoryinpractice.testng.ui.TestNGConsoleView; import com.theoryinpractice.testng.ui.TestNGResults; import com.theoryinpractice.testng.ui.actions.RerunFailedTestsAction; @@ -131,8 +126,10 @@ public class TestNGRunnableState extends JavaCommandLineState { } throw e; } - final TestNGConsoleView console = new TestNGConsoleView(config, runnerSettings, myConfigurationPerRunnerSettings); + final TreeRootNode unboundOutputRoot = new TreeRootNode(); + final TestNGConsoleView console = new TestNGConsoleView(config, runnerSettings, myConfigurationPerRunnerSettings, unboundOutputRoot); console.initUI(); + unboundOutputRoot.setPrinter(console.getPrinter()); for (RunConfigurationExtension ext : Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { ext.handleStartProcess(config, processHandler); } @@ -166,8 +163,9 @@ public class TestNGRunnableState extends JavaCommandLineState { @Override public void startNotified(final ProcessEvent event) { - TestNGRemoteListener listener = new TestNGRemoteListener(console); + TestNGRemoteListener listener = new TestNGRemoteListener(console, unboundOutputRoot); client.startListening(listener, listener, port); + } @Override @@ -180,9 +178,20 @@ public class TestNGRunnableState extends JavaCommandLineState { @Override public void onTextAvailable(final ProcessEvent event, final Key outputType) { - //we override this since we wrap the underlying console, and proxy the attach call, - //so we never get a chance to intercept the text. - console.print(event.getText(), ConsoleViewContentType.getConsoleViewType(outputType)); + final TestProxy currentTest = console.getCurrentTest(); + final String text = event.getText(); + final ConsoleViewContentType consoleViewType = ConsoleViewContentType.getConsoleViewType(outputType); + final Printable printable = new Printable() { + public void printOn(final Printer printer) { + printer.print(text, consoleViewType); + } + }; + if (currentTest != null) { + currentTest.addLast(printable); + } + else { + unboundOutputRoot.addLast(printable); + } } }); console.attachToProcess(processHandler); diff --git a/plugins/testng/src/com/theoryinpractice/testng/model/TestNGRemoteListener.java b/plugins/testng/src/com/theoryinpractice/testng/model/TestNGRemoteListener.java index 5bd7e5f3d89e..eaec7f802dcc 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/model/TestNGRemoteListener.java +++ b/plugins/testng/src/com/theoryinpractice/testng/model/TestNGRemoteListener.java @@ -27,58 +27,60 @@ import com.theoryinpractice.testng.ui.TestNGResults; import org.testng.remote.strprotocol.*; public class TestNGRemoteListener implements IRemoteSuiteListener, IRemoteTestListener { - private final TestNGConsoleView console; + private final TestNGConsoleView console; + private final TreeRootNode unboundOutputRoot; - public TestNGRemoteListener(TestNGConsoleView console) { - this.console = console; - } + public TestNGRemoteListener(TestNGConsoleView console, TreeRootNode unboundOutputRoot) { + this.console = console; + this.unboundOutputRoot = unboundOutputRoot; + } - public void onInitialization(GenericMessage genericMessage) { - } + public void onInitialization(GenericMessage genericMessage) { + } - public void onStart(SuiteMessage suiteMessage) { - console.flushOutput(); - final TestNGResults view = console.getResultsView(); - if (view != null) { - view.start(); - } + public void onStart(SuiteMessage suiteMessage) { + final TestNGResults view = console.getResultsView(); + if (view != null) { + view.start(); } + } - public void onFinish(SuiteMessage suiteMessage) { - console.flush(); - final TestNGResults view = console.getResultsView(); - if (view != null) { - view.finish(); - } + public void onFinish(SuiteMessage suiteMessage) { + console.finish(); + final TestNGResults view = console.getResultsView(); + if (view != null) { + view.finish(); } + } - public void onStart(TestMessage tm) { - final TestNGResults view = console.getResultsView(); - if (view != null) { - view.setTotal(tm.getTestMethodCount()); - } + public void onStart(TestMessage tm) { + unboundOutputRoot.addChild(console.getResultsView().getRoot()); + final TestNGResults view = console.getResultsView(); + if (view != null) { + view.setTotal(tm.getTestMethodCount()); } + } - public void onTestStart(TestResultMessage trm) { - console.testStarted(trm); - } + public void onTestStart(TestResultMessage trm) { + console.testStarted(trm); + } - public void onFinish(TestMessage tm) { - console.rebuildTree(); - } + public void onFinish(TestMessage tm) { + console.rebuildTree(); + } - public void onTestSuccess(TestResultMessage trm) { - console.addTestResult(trm); - } + public void onTestSuccess(TestResultMessage trm) { + console.addTestResult(trm); + } - public void onTestFailure(TestResultMessage trm) { - console.addTestResult(trm); - } + public void onTestFailure(TestResultMessage trm) { + console.addTestResult(trm); + } - public void onTestSkipped(TestResultMessage trm) { - console.addTestResult(trm); - } + public void onTestSkipped(TestResultMessage trm) { + console.addTestResult(trm); + } - public void onTestFailedButWithinSuccessPercentage(TestResultMessage trm) { - } + public void onTestFailedButWithinSuccessPercentage(TestResultMessage trm) { + } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/model/TestProxy.java b/plugins/testng/src/com/theoryinpractice/testng/model/TestProxy.java index c7426e894bfd..ca98bbbcc88b 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/model/TestProxy.java +++ b/plugins/testng/src/com/theoryinpractice/testng/model/TestProxy.java @@ -21,6 +21,7 @@ import com.intellij.execution.stacktrace.StackTraceLine; import com.intellij.execution.testframework.AbstractTestProxy; import com.intellij.execution.testframework.Filter; import com.intellij.execution.testframework.Printable; +import com.intellij.execution.testframework.Printer; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.ide.util.EditSourceUtil; import com.intellij.openapi.application.ApplicationManager; @@ -35,19 +36,17 @@ import org.testng.remote.strprotocol.MessageHelper; import org.testng.remote.strprotocol.TestResultMessage; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; /** * @author Hani Suleiman Date: Jul 28, 2005 Time: 10:52:51 PM */ -public class TestProxy implements AbstractTestProxy { +public class TestProxy extends AbstractTestProxy { private final List results = new ArrayList(); private TestResultMessage resultMessage; private String name; private TestProxy parent; - private List output; private SmartPsiElementPointer psiElement; private boolean inProgress; private int myExceptionMark; @@ -63,10 +62,6 @@ public class TestProxy implements AbstractTestProxy { return name; } - public void setName(String name) { - this.name = name; - } - @Nullable public PsiElement getPsiElement() { return psiElement != null ? psiElement.getElement() : null; @@ -90,19 +85,6 @@ public class TestProxy implements AbstractTestProxy { return filter.select(results); } - public List getOutput() { - if (output != null) return output; - List total = new ArrayList(); - for (TestProxy child : results) { - final List out = child.getOutput(); - if (total.size() > 0 && out.size() > 0) { - total.add(new TestNGConsoleView.Chunk("\n===============================================\n\n", ConsoleViewContentType.NORMAL_OUTPUT)); - } - total.addAll(out); - } - return total; - } - public List getChildren() { return results; } @@ -172,55 +154,22 @@ public class TestProxy implements AbstractTestProxy { return new PsiLocation(project, element); } + @Nullable public Navigatable getDescriptor(final Location location) { if (location == null) return null; - if (isNotPassed() && output != null) { - final PsiLocation psiLocation = location.toPsiLocation(); - final PsiClass containingClass = psiLocation.getParentElement(PsiClass.class); - if (containingClass != null) { - String containingMethod = null; - for (Iterator> iterator = psiLocation.getAncestors(PsiMethod.class, false); iterator.hasNext();) { - final PsiMethod psiMethod = iterator.next().getPsiElement(); - if (containingClass.equals(psiMethod.getContainingClass())) containingMethod = psiMethod.getName(); - } - if (containingMethod != null) { - final String qualifiedName = containingClass.getQualifiedName(); - for (Printable aStackTrace : output) { - if (aStackTrace instanceof TestNGConsoleView.Chunk) { - final String[] stackTrace = new LineTokenizer(((TestNGConsoleView.Chunk)aStackTrace).text).execute(); - for (String line : stackTrace) { - final StackTraceLine stackLine = new StackTraceLine(containingClass.getProject(), line); - if (containingMethod.equals(stackLine.getMethodName()) && Comparing.strEqual(qualifiedName, stackLine.getClassName())) { - return stackLine.getOpenFileDescriptor(containingClass.getContainingFile().getVirtualFile()); - } - } - } - } - } - } - } return EditSourceUtil.getDescriptor(location.getPsiElement()); } - public TestProxy[] getPathFromRoot() { - ArrayList arraylist = new ArrayList(); - TestProxy testproxy = this; - do { - arraylist.add(testproxy); - } - while ((testproxy = testproxy.getParent()) != null); - Collections.reverse(arraylist); - return arraylist.toArray(new TestProxy[arraylist.size()]); - } - @Override public String toString() { return name + ' ' + results; } - public void addResult(TestProxy proxy) { + public void addChild(TestProxy proxy) { results.add(proxy); proxy.setParent(this); + proxy.setPrinter(myPrinter); + addLast(proxy); } public void setParent(TestProxy parent) { @@ -231,10 +180,6 @@ public class TestProxy implements AbstractTestProxy { return parent; } - public void setOutput(List output) { - this.output = output; - } - public boolean isNotPassed() { if (resultNotPassed()) return true; //we just added the node, so we don't know if it has passes or fails @@ -275,18 +220,9 @@ public class TestProxy implements AbstractTestProxy { return null; } - public boolean childExists(String child) { - for (int count = 0; count < getChildCount(); count++) { - if (child.equals(getChildAt(count).getName())) { - return true; - } - } - return false; - } - - public int getExceptionMark() { + public int getExceptionMark() {//todo if (myExceptionMark == 0 && getChildCount() > 0) { - return (output != null ? output.size() : 0) + getChildAt(0).getExceptionMark(); + return getChildAt(0).getExceptionMark(); } return myExceptionMark; } @@ -295,6 +231,14 @@ public class TestProxy implements AbstractTestProxy { myExceptionMark = exceptionMark; } + @Override + public void printOn(Printer printer) { + for (int i = 0; i < myNestedPrintables.size(); i++) { + if (i == myExceptionMark && i > 0) printer.mark(); + myNestedPrintables.get(i).printOn(printer); + } + } + public boolean isInterrupted() { return !isInProgress() && inProgress; } diff --git a/plugins/testng/src/com/theoryinpractice/testng/model/TestTreeBuilder.java b/plugins/testng/src/com/theoryinpractice/testng/model/TestTreeBuilder.java index 531b249228b1..1bf037826de8 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/model/TestTreeBuilder.java +++ b/plugins/testng/src/com/theoryinpractice/testng/model/TestTreeBuilder.java @@ -50,7 +50,7 @@ public class TestTreeBuilder extends AbstractTestTreeBuilder } public void addItem(TestProxy parent, TestProxy proxy) { - parent.addResult(proxy); + parent.addChild(proxy); DefaultMutableTreeNode parentNode = getNodeForElement(parent); if (parentNode != null) updateSubtree(parentNode); diff --git a/plugins/testng/src/com/theoryinpractice/testng/model/TreeRootNode.java b/plugins/testng/src/com/theoryinpractice/testng/model/TreeRootNode.java index c99f9f9120f0..c5edc3c12a64 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/model/TreeRootNode.java +++ b/plugins/testng/src/com/theoryinpractice/testng/model/TreeRootNode.java @@ -33,7 +33,8 @@ public class TreeRootNode extends TestProxy return inProgress; } - public void setInProgress(boolean inProgress) { + + public void setInProgress(boolean inProgress) { this.inProgress = inProgress; } diff --git a/plugins/testng/src/com/theoryinpractice/testng/ui/ResultTreeRenderer.java b/plugins/testng/src/com/theoryinpractice/testng/ui/ResultTreeRenderer.java index 9ba78be31a4b..ecfb304133f7 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/ui/ResultTreeRenderer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/ui/ResultTreeRenderer.java @@ -103,6 +103,13 @@ public class ResultTreeRenderer extends ColoredTreeCellRenderer return PoolOfTestIcons.TERMINATED_ICON; } } else { + if (node.getChildCount() == 0) { + final TestProxy nodeParent = node.getParent(); + if (nodeParent.getResultMessage().getResult() == MessageHelper.PASSED_TEST && nodeParent.isTearDownFailure()) { + return PoolOfTestIcons.FAILED_ICON; + } + return PoolOfTestIcons.NOT_RAN; + } boolean hasFail = false; boolean hasSkipped = false; boolean hasTerminated = false; diff --git a/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGConsoleView.java b/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGConsoleView.java index 310e28496e87..4d67bccc0add 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGConsoleView.java +++ b/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGConsoleView.java @@ -28,6 +28,7 @@ import com.intellij.execution.filters.HyperlinkInfo; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.testframework.Printable; import com.intellij.execution.testframework.Printer; +import com.intellij.execution.testframework.TestTreeView; import com.intellij.execution.testframework.stacktrace.DiffHyperlink; import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView; import com.intellij.execution.testframework.ui.TestResultsPanel; @@ -37,10 +38,13 @@ import com.intellij.openapi.application.ApplicationManager; import com.theoryinpractice.testng.configuration.TestNGConfiguration; import com.theoryinpractice.testng.model.TestNGConsoleProperties; import com.theoryinpractice.testng.model.TestProxy; +import com.theoryinpractice.testng.model.TreeRootNode; import org.jetbrains.annotations.NonNls; import org.testng.remote.strprotocol.TestResultMessage; import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -54,8 +58,7 @@ public class TestNGConsoleView extends BaseTestsOutputConsoleView { @NonNls private static final Pattern EXPECTED_NOT_SAME_BUT_WAS_PATTERN = Pattern.compile("(.*)expected not same with:\\<(.*)\\> but was:\\<(.*)\\>.*", Pattern.DOTALL); private TestNGResults testNGResults; - private final List currentTestOutput = new ArrayList(); - private final List nonTestOutput = new ArrayList(); + private TestProxy currentTest; private int myExceptionalMark = -1; private final TestNGConfiguration myConfiguration; @@ -64,8 +67,9 @@ public class TestNGConsoleView extends BaseTestsOutputConsoleView { public TestNGConsoleView(TestNGConfiguration config, final RunnerSettings runnerSettings, - final ConfigurationPerRunnerSettings configurationPerRunnerSettings) { - super(new TestNGConsoleProperties(config)); + final ConfigurationPerRunnerSettings configurationPerRunnerSettings, + final TreeRootNode unboundOutputRoot) { + super(new TestNGConsoleProperties(config), unboundOutputRoot); myConfiguration = config; myRunnerSettings = runnerSettings; myConfigurationPerRunnerSettings = configurationPerRunnerSettings; @@ -76,6 +80,16 @@ public class TestNGConsoleView extends BaseTestsOutputConsoleView { return testNGResults; } + @Override + public void initUI() { + super.initUI(); + final TestTreeView testTreeView = testNGResults.getTreeView(); + testTreeView.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(TreeSelectionEvent e) { + getPrinter().updateOnTestSelected(testTreeView.getSelectedTest()); + } + }); + } @Override public void dispose() { @@ -96,50 +110,29 @@ public class TestNGConsoleView extends BaseTestsOutputConsoleView { public void addTestResult(TestResultMessage result) { if (testNGResults != null) { int exceptionMark = myExceptionalMark == -1 ? 0 : myExceptionalMark; + final String stackTrace = result.getStackTrace(); if (stackTrace != null && stackTrace.length() > 10) { + exceptionMark = currentTest.getCurrentSize(); //trim useless crud from stacktrace String trimmed = trimStackTrace(stackTrace); List printables = getPrintables(result, trimmed); for (Printable printable : printables) { - printable.printOn(wrapConsoleView(getConsole())); //enable for root element - } - synchronized (currentTestOutput) { - exceptionMark = currentTestOutput.size(); - currentTestOutput.addAll(printables); + currentTest.addLast(printable); } } - testNGResults.addTestResult(result, new ArrayList(currentTestOutput), exceptionMark); - + final TestProxy failedToStart = testNGResults.getFailedToStart(); + if (failedToStart != null) { + currentTest.addChild(failedToStart); + } + testNGResults.addTestResult(result, exceptionMark); myExceptionalMark = -1; - synchronized (currentTestOutput) { - currentTestOutput.clear(); - } } } public void testStarted(TestResultMessage result) { if (testNGResults != null) { - testNGResults.testStarted(result); - } - } - - public void flushOutput() { - synchronized (currentTestOutput) { - if (!currentTestOutput.isEmpty()) { //non empty for first test only - nonTestOutput.addAll(currentTestOutput); - currentTestOutput.clear(); - } - } - } - - public void flush() { - final TestProxy failedToStart = testNGResults.getFailedToStart(); - if (failedToStart != null) { - final List output = failedToStart.getOutput(); - if (output != null) { - nonTestOutput.addAll(output); - } + currentTest = testNGResults.testStarted(result); } } @@ -204,66 +197,15 @@ public class TestNGConsoleView extends BaseTestsOutputConsoleView { return printables; } - public void print(String s, ConsoleViewContentType contentType) { - if (myExceptionalMark == -1 && contentType == ConsoleViewContentType.ERROR_OUTPUT) { - myExceptionalMark = currentTestOutput.size(); - } - Chunk chunk = new Chunk(s, contentType); - synchronized (currentTestOutput) { - currentTestOutput.add(chunk); - } - } - - public void reset() { - final List printables = new ArrayList(); - printables.addAll(nonTestOutput); - printables.addAll(testNGResults.getRoot().getOutput()); - printables.addAll(currentTestOutput); - setView(printables, 0); - } - public void attachToProcess(ProcessHandler processHandler) { - getConsole().attachToProcess(processHandler); - } - - public void setView(final List output, final int i) { - if (!ApplicationManager.getApplication().isDispatchThread()) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - setView(output, i); - } - }); - } - else { - final ConsoleView consoleView = getConsole(); - consoleView.clear(); - int idx = 0; - int offset = 0; - for (Printable chunk : new ArrayList(output)) { - chunk.printOn(wrapConsoleView(consoleView)); - if (idx++ < i) { - offset = consoleView.getContentSize(); - } - } - consoleView.scrollTo(offset); - } } - private static Printer wrapConsoleView(final ConsoleView consoleView) { - return new Printer() { - public void print(String text, ConsoleViewContentType contentType) { - consoleView.print(text, contentType); - } + public TestProxy getCurrentTest() { + return currentTest; + } - public void onNewAvailable(Printable printable) {} - - public void printHyperlink(String text, HyperlinkInfo info) { - consoleView.printHyperlink(text, info); - } - - public void mark() { - } - }; + public void finish() { + currentTest = null; } public static class Chunk implements Printable { diff --git a/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java b/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java index d6c45d8b1649..ddde6b7f8af0 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java +++ b/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java @@ -33,6 +33,7 @@ import com.intellij.openapi.progress.util.ColorProgressBar; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.ClassUtil; import com.intellij.ui.table.TableView; @@ -55,7 +56,6 @@ import java.awt.event.MouseEvent; import java.text.NumberFormat; import java.util.*; import java.util.List; -import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestNGResults extends TestResultsPanel implements TestFrameworkRunningModel { @@ -77,11 +77,9 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn private TestTreeBuilder treeBuilder; private Animator animator; - private final Pattern packagePattern = Pattern.compile("(.*)\\.(.*)"); private final TreeRootNode rootNode; private static final String NO_PACKAGE = "No Package"; private TestNGResults.OpenSourceSelectionListener openSourceListener; - private final TestNGConsoleView myConsole; private int myStatus = MessageHelper.PASSED_TEST; private Set startedMethods = new HashSet(); @@ -92,7 +90,6 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn final ConfigurationPerRunnerSettings configurationSettings) { super(component, console.createConsoleActions(), console.getProperties(), runnerSettings, configurationSettings, TESTNG_SPLITTER_PROPERTY, 0.5f); - myConsole = console; this.project = configuration.getProject(); model = new TestNGResultsTableModel(); @@ -132,7 +129,7 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn animator = new Animator(this, treeBuilder); - openSourceListener = new OpenSourceSelectionListener(structure, myConsole); + openSourceListener = new OpenSourceSelectionListener(); tree.getSelectionModel().addTreeSelectionListener(openSourceListener); return tree; @@ -181,15 +178,7 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn } public TestProxy testStarted(TestResultMessage result) { - // TODO This should be an action button which rebuilds the tree when toggled. - boolean flattenPackages = true; - TestProxy classNode; - if (flattenPackages) { - classNode = getPackageClassNodeFor(result); - } - else { - classNode = getClassNodeFor(result); - } + TestProxy classNode = getPackageClassNodeFor(result); TestProxy proxy = new TestProxy(); proxy.setParent(classNode); proxy.setResultMessage(result); @@ -218,12 +207,7 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn return proxy; } - public void addTestResult(final TestResultMessage result, List output, int exceptionMark) { - if (failedToStart != null) { - output.addAll(failedToStart.getOutput()); - exceptionMark += failedToStart.getExceptionMark(); - } - + public void addTestResult(final TestResultMessage result, int exceptionMark) { TestProxy testCase; synchronized (started) { final List dups = started.get(result); @@ -257,11 +241,10 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn } else { //do not remember testresultmessage: test hierarchy is not set - testCase = new TestProxy(); + testCase = new TestProxy(result.toDisplayString()); failedToStart = testCase; } - testCase.setOutput(output); testCase.setExceptionMark(exceptionMark); if (result.getResult() == MessageHelper.FAILED_TEST) { @@ -274,34 +257,15 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn updateStatusLine(); } - private String packageNameFor(String fqnClassName) { - Matcher matcher = packagePattern.matcher(fqnClassName); - if (matcher.matches()) { - return matcher.group(1); - } - else { - return NO_PACKAGE; - } - } - - private String classNameFor(String fqnClassName) { - Matcher matcher = packagePattern.matcher(fqnClassName); - if (matcher.matches()) { - return matcher.group(2); - } - else { - return fqnClassName; - } - } - private TestProxy getPackageClassNodeFor(final TestResultMessage result) { TestProxy owner = treeBuilder.getRoot(); - String packageName = packageNameFor(result.getTestClass()); + final String packageName1 = StringUtil.getPackageName(result.getTestClass()); + String packageName = packageName1.length() == 0 ? NO_PACKAGE : packageName1; owner = getChildNodeNamed(owner, packageName); if (owner.getPsiElement() == null) { owner.setPsiElement(JavaPsiFacade.getInstance(project).findPackage(packageName)); } - owner = getChildNodeNamed(owner, classNameFor(result.getTestClass())); + owner = getChildNodeNamed(owner, StringUtil.getShortName(result.getTestClass())); //look up the psiclass now if (owner.getPsiElement() == null) { final TestProxy finalOwner = owner; @@ -314,16 +278,6 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn return owner; } - private TestProxy getClassNodeFor(TestResultMessage result) { - - String[] nodes = result.getTestClass().split("\\."); - TestProxy owner = treeBuilder.getRoot(); - for (String node : nodes) { - owner = getChildNodeNamed(owner, node); - } - return owner; - } - private TestProxy getChildNodeNamed(TestProxy currentNode, String node) { for (TestProxy child : currentNode.getChildren()) { if (child.getName().equals(node)) { @@ -415,8 +369,6 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn public void dispose() { super.dispose(); - openSourceListener.structure = null; - openSourceListener.console = null; tree.getSelectionModel().removeTreeSelectionListener(openSourceListener); } @@ -425,13 +377,6 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn } private class OpenSourceSelectionListener implements TreeSelectionListener { - private TestTreeStructure structure; - private TestNGConsoleView console; - - public OpenSourceSelectionListener(TestTreeStructure structure, TestNGConsoleView console) { - this.structure = structure; - this.console = console; - } public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getPath(); @@ -441,13 +386,6 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn if (ScrollToTestSourceAction.isScrollEnabled(TestNGResults.this)) { OpenSourceUtil.openSourcesFrom(tree, false); } - if (proxy == structure.getRootElement()) { - console.reset(); - } - else { - console - .setView(proxy.getOutput(), TestNGConsoleProperties.SCROLL_TO_STACK_TRACE.value(getProperties()) ? proxy.getExceptionMark() : 0); - } } } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormReferenceProvider.java b/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormReferenceProvider.java index 511042ddb875..bb2c59a8c9e1 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormReferenceProvider.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormReferenceProvider.java @@ -154,7 +154,12 @@ public class FormReferenceProvider extends PsiReferenceProvider { classReference = referencesByString[referencesByString.length - 1]; } - processReferences(rootTag, classReference, file, processor); + final PsiReference finalClassReference = classReference; + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + processReferences(rootTag, finalClassReference, file, processor); + } + }); } private static TextRange getValueRange(final XmlAttribute classToBind) { diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltSymbolIndex.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltSymbolIndex.java index 49d229f70036..a6f7a518c616 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltSymbolIndex.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/impl/XsltSymbolIndex.java @@ -19,6 +19,7 @@ package org.intellij.lang.xpath.xslt.impl; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; @@ -32,6 +33,7 @@ import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumDataDescriptor; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; +import com.intellij.util.text.CharArrayUtil; import com.intellij.util.xml.NanoXmlUtil; import org.intellij.lang.xpath.xslt.XsltSupport; import org.intellij.lang.xpath.xslt.psi.*; @@ -40,10 +42,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /* * Created by IntelliJ IDEA. @@ -90,6 +89,10 @@ public class XsltSymbolIndex extends FileBasedIndexExtension() { @NotNull public Map map(FileContent inputData) { + CharSequence inputDataContentAsText = inputData.getContentAsText(); + if (CharArrayUtil.indexOf(inputDataContentAsText, XsltSupport.XSLT_NS, 0) == -1) { + return Collections.emptyMap(); + } final HashMap map = new HashMap(); NanoXmlUtil.parse(new ByteArrayInputStream(inputData.getContent()), new NanoXmlUtil.IXMLBuilderAdapter() { NanoXmlUtil.IXMLBuilderAdapter attributeHandler; @@ -139,6 +142,9 @@ public class XsltSymbolIndex extends FileBasedIndexExtension + + @@ -82,7 +85,7 @@ interface="com.intellij.debugger.engine.JVMDebugProvider"/> + interface="com.intellij.execution.runners.JavaProgramPatcher"/> diff --git a/resources/src/idea/IdeaActions.xml b/resources/src/idea/IdeaActions.xml index 57745c3c45dc..c34d1bd90657 100644 --- a/resources/src/idea/IdeaActions.xml +++ b/resources/src/idea/IdeaActions.xml @@ -161,10 +161,6 @@ - - - - diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java index 97c49723b40e..7aaeffa377a9 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java @@ -167,6 +167,31 @@ public class XmlHighlightVisitor extends XmlElementVisitor implements HighlightV bindMessageToAstNode(childByRole, warning, 0, messageLength, localizedMessage, quickFixActions); } + + @Override + public void visitXmlProcessingInstruction(XmlProcessingInstruction processingInstruction) { + super .visitXmlProcessingInstruction(processingInstruction); + PsiElement parent = processingInstruction.getParent(); + + if (parent instanceof XmlProlog && processingInstruction.getText().startsWith("