diff --git a/.idea/libraries/JPS.xml b/.idea/libraries/JPS.xml new file mode 100644 index 000000000000..b9dae8260f0d --- /dev/null +++ b/.idea/libraries/JPS.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/build/build.iml b/build/build.iml index 677960ccfaf4..00662eab0dae 100644 --- a/build/build.iml +++ b/build/build.iml @@ -7,6 +7,7 @@ + diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index a1eed990ad33..1b47080e930f 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -27,7 +27,7 @@ def String getLibraryName(Library lib) { def name = lib.name if (name.startsWith("moduleLibrary#")) { if (lib.classpath.size() != 1) { - project.error("Non-single entry module library $name: $lib.classpath"); + project.warning("Non-single entry module library $name: $lib.classpath"); } String filePath = lib.classpath[0] return filePath.substring(filePath.lastIndexOf('/')+1) @@ -72,24 +72,32 @@ binding.setVariable("checkLibLicensesAndGenerateTable", {String filePath -> }) binding.setVariable("generateLicensesTable", {String filePath -> - Set modules = project.modules.values().findAll {it["used"] != null} - Set usedLibraries = [] as Set - modules.each { - it.getClasspath(ClasspathKind.PRODUCTION_RUNTIME).each {item -> + Set usedModules = project.modules.values().findAll {it["used"] != null} + Map usedLibraries = [:] + usedModules.each {Module module -> + module.getClasspath(ClasspathKind.PRODUCTION_RUNTIME).each {item -> if (item instanceof Library) { - usedLibraries << getLibraryName(item) + usedLibraries[getLibraryName(item)] = module } } } - def licenses = licensesList.findAll {usedLibraries.contains(it.libraryName) } - List lines = licenses.collect { LibraryLicense lib -> + def licenses = licensesList.findAll {usedLibraries.containsKey(it.libraryName) } + project.info("Generating licenses table") + project.info("Used libraries:") + List lines = [] + licenses.each { LibraryLicense lib -> def name = lib.url != null ? "[$lib.name|$lib.url]" : lib.name def license = lib.licenseUrl != null ? "[$lib.license|$lib.licenseUrl]" : lib.license - return "|$name| $lib.version|$license|".toString() + project.info(" $lib.libraryName (in module ${usedLibraries[lib.libraryName]})") + lines << "|$name| $lib.version|$license|".toString() } - lines.sort(String.CASE_INSENSITIVE_ORDER) + //project.info("Unused libraries:") + //licensesList.findAll {!usedLibraries.containsKey(it.libraryName)}.each {LibraryLicense lib -> + // project.info(" $lib.libraryName") + //} + lines.sort(String.CASE_INSENSITIVE_ORDER) FileWriter out = new FileWriter(filePath) out.println("|| Software || Version || License ||") lines.each { @@ -108,12 +116,13 @@ libraryLicense(name: "Apache Commons BeanUtils", libraryName: "commons-beanutils libraryLicense(name: "Apache Commons Codec", libraryName: "commons-codec", version: "1.3", license: "Apache 2.0", url: "http://commons.apache.org/codec/", licenseUrl: "http://commons.apache.org/license.html") libraryLicense(name: "Apache Commons Collections", libraryName: "commons-collections", version: "3.1", license: "Apache 2.0", url: "http://commons.apache.org/collections/", licenseUrl: "http://commons.apache.org/license.html") libraryLicense(name: "Apache Commons HTTPClient", libraryName: "http-client-3.1", version: "3.1  (with patch by JetBrains)", license: "Apache 2.0", url: "http://hc.apache.org/httpclient-3.x") +libraryLicense(name: "Apache Commons Net", libraryName: "commons-net", version: "2.0", license: "Apache 2.0", url: "http://commons.apache.org/net/") libraryLicense(name: "Apache Commons Lang", libraryName: "commons-lang", version: "2.4", license: "Apache 2.0", url: "http://commons.apache.org/lang/", licenseUrl: "http://commons.apache.org/lang/license.html") libraryLicense(name: "Apache Commons Logging", libraryName: "commons-logging", version: "1.1.1", license: "Apache 2.0", url: "http://commons.apache.org/logging/") libraryLicense(name: "Apache Lucene", libraryName: "lucene-core-2.3.0.jar", version: "2.3.0", license: "Apache 2.0", url: "http://lucene.apache.org/java") libraryLicense(name: "Automaton", libraryName: "automaton.jar", version: "1.11", license: "BSD", url: "http://www.brics.dk/automaton/", licenseUrl: "http://www.opensource.org/licenses/bsd-license.php") libraryLicense(name: "DTDParser", version: "1.13", license: "LGPL", url: "http://sourceforge.net/projects/dtdparser/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1") -libraryLicense(name: "Ganymed", version: "bundled with SVNKit", license: "BSD", url: "http://www.ganymed.ethz.ch/ssh2/", licenseUrl: "http://www.ganymed.ethz.ch/ssh2/LICENSE.txt") +libraryLicense(name: "Ganymed", version: "bundled with SVNKit", libraryName: "svnkit.jar", license: "BSD", url: "http://www.ganymed.ethz.ch/ssh2/", licenseUrl: "http://www.ganymed.ethz.ch/ssh2/LICENSE.txt") libraryLicense(name: "Guava", version: "R6", license: "Apache 2.0", url: "http://code.google.com/p/guava-libraries/", licenseUrl: "http://ant.apache.org/license.html") libraryLicense(name: "Gradle API", libraryName: "gradle-open-api-0.8.jar", version: "0.8", license: "Apache 2.0", url: "http://www.gradle.org/") libraryLicense(name: "Groovy", version: "1.7.3", license: "Apache 2.0", url: "http://groovy.codehaus.org/") @@ -123,7 +132,7 @@ libraryLicense(name: "JavaCVS", version: "no version number available (with patc libraryLicense(name: "JAXB", libraryName: "JAXB", version: "2.1.10", license: "CDDL 1.1 & GPL 2", url: "http://jaxb.java.net/", licenseUrl: "http://glassfish.java.net/public/CDDL+GPL_1_1.html") libraryLicense(name: "Jaxen", version: "", license: "modified Apache", url: "http://www.jaxen.org/", licenseUrl: "http://www.jaxen.org/license.html") libraryLicense(name: "JavaHelp", version: "2.0_02", license: "included as license/javahelp_license.html in IntelliJ IDEA distribution", url: "http://java.sun.com/products/javahelp/") -libraryLicense(name: "JCIP Annotations", libraryName: "jcip-annotations.jar", license: "Creative Commons Attribution License", url: "http://www.jcip.net", licenseUrl: "http://creativecommons.org/licenses/by/2.5") +libraryLicense(name: "JCIP Annotations", libraryName: "jcip", license: "Creative Commons Attribution License", url: "http://www.jcip.net", licenseUrl: "http://creativecommons.org/licenses/by/2.5") libraryLicense(name: "JDOM", version: "1.1 (with patches by JetBrains)", license: "modified Apache", url: "http://www.jdom.org/", licenseUrl: "http://www.jdom.org/docs/faq.html#a0030") libraryLicense(name: "JGoodies Forms", libraryName: "jgoodies-forms", version: "CVS snapshot as of 5 May 2006", license: "BSD ", url: "http://www.jgoodies.com/freeware/forms/", licenseUrl: "http://www.jgoodies.com/downloads/libraries.html") libraryLicense(name: "JNA", libraryName: "jna", version: "3.2.4", license: "LGPL 2.1", url: "https://jna.dev.java.net/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1.php") @@ -141,7 +150,7 @@ libraryLicense(name: "Plexus Utils", libraryName: "plexus-utils-1.5.5.jar", vers libraryLicense(name: "Relax NG Object Model", libraryName: "rngom-20051226-patched.jar", license: "MIT", url: "http://java.net/projects/rngom/", licenseUrl: "http://www.opensource.org/licenses/mit-license.php") libraryLicense(name: "SVNKit", libraryName: "svnkit.jar", version: "SVN version, 1.1 branch as of 1 Oct 2007", license: "link (commercial license)", url: "http://www.svnkit.com/", licenseUrl: "http://svnkit.com/license.html") libraryLicense(name: "TestNG", version: "5.7 snapshot", license: "Apache 2.0", url: "http://testng.org/doc/", licenseUrl: "http://code.google.com/p/testng/") -libraryLicense(name: "Trilead SSH", libraryName: "trilead-ssh2-build213.jar", version: "build 213", license: "BSD style (see LICENSE.txt in trilead-ssh-build213.jar)", url: "http://www.trilead.com/SSH_Library/") +libraryLicense(name: "Trilead SSH", libraryName: "trilead-ssh2", version: "build 213", license: "BSD style (see LICENSE.txt in trilead.jar)", url: "http://www.trilead.com/SSH_Library/") libraryLicense(name: "Trove4j", version: "1.1 (with patches by JetBrains)", license: "LGPL", url: "http://trove4j.sourceforge.net/", licenseUrl: "http://trove4j.sourceforge.net/html/license.html") libraryLicense(name: "Velocity", version: "1.3", license: "Apache", url: "http://velocity.apache.org/", licenseUrl: "http://velocity.apache.org/index.html") libraryLicense(name: "winp", version: "1.14", license: "MIT", url: "http://winp.dev.java.net/", licenseUrl: "https://winp.dev.java.net/license.html") @@ -151,3 +160,4 @@ libraryLicense(name: "XMLBeans", libraryName: "XmlBeans", version: "2.3.0", lice libraryLicense(name: "XML-RPC", libraryName: "XmlRPC", version: "2.0", license: "Apache 2.0", url: "http://ws.apache.org/xmlrpc/xmlrpc2/", licenseUrl: "http://ws.apache.org/xmlrpc/xmlrpc2/license.html") libraryLicense(name: "XStream", version: "1.2.1", license: "BSD", url: "http://xstream.codehaus.org/", licenseUrl: "http://xstream.codehaus.org/license.html") libraryLicense(name: "YourKit Java Profiler", libraryName: "yjp-controller-api-redist.jar", version: "7.0.2", license: "link (commercial license)", url: "http://yourkit.com/", licenseUrl: "http://www.yourkit.com/purchase/license.html") +jetbrainsLibrary("JPS") \ No newline at end of file diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index 442a19ceb0f1..54ffe8819f26 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -1680,8 +1680,12 @@ public class CompileDriver { } if (LOG.isDebugEnabled() || ourDebugMode) { if (!toDelete.isEmpty()) { - final String message = "Found items to delete, compiler " + compiler.getDescription(); - LOG.debug(message); + final StringBuilder message = new StringBuilder(); + message.append("Found items to delete, compiler ").append(compiler.getDescription()); + for (Trinity trinity : toDelete) { + message.append("\n").append(trinity.getFirst()); + } + LOG.debug(message.toString()); if (ourDebugMode) { System.out.println(message); } diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ExternalCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ExternalCompiler.java index c882cc2c27de..9223cbd95a35 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ExternalCompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ExternalCompiler.java @@ -19,6 +19,7 @@ import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.EnvironmentUtil; import com.intellij.util.StringBuilderSpinAllocator; import org.jetbrains.annotations.NonNls; @@ -41,6 +42,18 @@ public abstract class ExternalCompiler implements BackendCompiler { return COMPILABLE_TYPES; } + /** + * Checks if the compiler can compile the specified file. + * + * @param file the file to check. + * @param context the context for the current compile operation. + * @return true if can compile the file, false otherwise. If the method returns false, file + * will not be included in the list of files passed to {@link #compile(CompileContext, com.intellij.util.Chunk < com.intellij.openapi.module.Module >,com.intellij.openapi.vfs.VirtualFile[], com.intellij.openapi.compiler.TranslatingCompiler.OutputSink)}. + */ + public boolean isCompilableFile(VirtualFile file, CompileContext context) { + return getCompilableFileTypes().contains(file.getFileType()); + } + @NotNull public Process launchProcess(@NotNull final ModuleChunk chunk, @NotNull final String outputDir, @NotNull final CompileContext compileContext) throws IOException { final String[] commands = createStartupCommand(chunk, compileContext, outputDir); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/JavaCompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/JavaCompiler.java index ffa69c25927a..8384fbc0bb18 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/JavaCompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/JavaCompiler.java @@ -50,7 +50,11 @@ public class JavaCompiler implements TranslatingCompiler { } public boolean isCompilableFile(VirtualFile file, CompileContext context) { - return getBackEndCompiler().getCompilableFileTypes().contains(file.getFileType()); + final BackendCompiler backEndCompiler = getBackEndCompiler(); + if (backEndCompiler instanceof ExternalCompiler) { + return ((ExternalCompiler)backEndCompiler).isCompilableFile(file, context); + } + return backEndCompiler.getCompilableFileTypes().contains(file.getFileType()); } public void compile(CompileContext context, Chunk moduleChunk, VirtualFile[] files, OutputSink sink) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java b/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java index c9e5c70a7bfd..00b8538dcc66 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/CastingLookupElementDecorator.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.*; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiType; import com.intellij.psi.codeStyle.CodeStyleSettings; @@ -27,6 +28,8 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class CastingLookupElementDecorator extends LookupElementDecorator implements TypedLookupItem { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(CastingLookupElementDecorator.class); + private final LookupElement myCastItem; private final PsiType myCastType; @@ -78,14 +81,4 @@ public class CastingLookupElementDecorator extends LookupElementDecorator implements TypedLookupItem { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaChainLookupElement.class); private final LookupElement myQualifier; private JavaChainLookupElement(LookupElement qualifier, LookupElement main) { @@ -72,7 +74,7 @@ public class JavaChainLookupElement extends LookupElementDecorator highlight(LookupElement decorator) { - return LookupElementDecorator.withRenderer(decorator, new LookupElementRenderer>() { - @Override - public void renderElement(LookupElementDecorator element, LookupElementPresentation presentation) { - element.getDelegate().renderElement(presentation); - presentation.setItemTextBold(true); - } - }); + private static LookupElement highlight(LookupElement decorator) { + return PrioritizedLookupElement.withGrouping( + LookupElementDecorator.withRenderer(decorator, new LookupElementRenderer>() { + @Override + public void renderElement(LookupElementDecorator element, LookupElementPresentation presentation) { + element.getDelegate().renderElement(presentation); + presentation.setItemTextBold(true); + } + }), 1); } private static LookupItem createLookupElement(CompletionElement completionElement, PsiType qualifierType) { @@ -974,7 +965,7 @@ public class JavaCompletionUtil { if (smart || needRightParenth && addCompletionChar) { TailType toInsert = tailType; - LookupItem lookupItem = item.as(LookupItem.class); + LookupItem lookupItem = item.as(LookupItem.CLASS_CONDITION_KEY); if (lookupItem == null || lookupItem.getAttribute(LookupItem.TAIL_TYPE_ATTR) != TailType.UNKNOWN) { if (!hasTail && item.getObject() instanceof PsiMethod && ((PsiMethod)item.getObject()).getReturnType() == PsiType.VOID) { PsiDocumentManager.getInstance(file.getProject()).commitAllDocuments(); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java index 1cb7537a2901..d91b3aba7e2b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodCallElement.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.JavaElementLookupRenderer; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -34,6 +35,7 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class JavaMethodCallElement extends LookupItem implements TypedLookupItem, StaticallyImportable { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(JavaMethodCallElement.class); private static final Key INFERENCE_SUBSTITUTOR = Key.create("INFERENCE_SUBSTITUTOR"); @Nullable private final PsiClass myContainingClass; private final PsiMethod myMethod; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java index 513302500f98..74bdc7ccc0a5 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaMethodMergingContributor.java @@ -49,7 +49,7 @@ public class JavaMethodMergingContributor extends CompletionContributor { } final PsiMethod method = (PsiMethod)o; - final JavaChainLookupElement chain = item.as(JavaChainLookupElement.class); + final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); final String name = method.getName() + "#" + (chain == null ? "" : chain.getQualifier().getLookupString()); if (commonName != null && !commonName.equals(name)) { return AutoCompletionDecision.SHOW_LOOKUP; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index 180ef6f374a8..57b98d2a4cc6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -200,7 +200,7 @@ public class JavaSmartCompletionContributor extends CompletionContributor { final CompletionService service = CompletionService.getCompletionService(); new BasicExpressionCompletionContributor().fillCompletionVariants(parameters, service.createResultSet(parameters, new Consumer() { public void consume(final LookupElement lookupElement) { - final TypedLookupItem typed = JavaCompletionUtil.typedFrom(lookupElement); + final TypedLookupItem typed = lookupElement.as(TypedLookupItem.CLASS_CONDITION_KEY); if (typed != null) { final PsiType psiType = typed.getType(); if (psiType != null && type.isAssignableFrom(psiType)) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java index 4a9c69361352..a3f8154cca60 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferNonGenericWeigher.java @@ -21,7 +21,6 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiType; import com.intellij.psi.PsiTypeParameter; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author peter @@ -29,13 +28,10 @@ import org.jetbrains.annotations.Nullable; public class PreferNonGenericWeigher extends CompletionWeigher { public Comparable weigh(@NotNull final LookupElement item, @NotNull final CompletionLocation location) { - if (location == null) { - return null; - } final Object object = item.getObject(); if (object instanceof PsiMethod) { PsiType type = ((PsiMethod)object).getReturnType(); - final JavaMethodCallElement callItem = item.as(JavaMethodCallElement.class); + final JavaMethodCallElement callItem = item.as(JavaMethodCallElement.CLASS_CONDITION_KEY); if (callItem != null) { type = callItem.getSubstitutor().substitute(type); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferSimpleWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferSimpleWeigher.java index 97339f0b33c7..c7361df1f7af 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferSimpleWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferSimpleWeigher.java @@ -18,7 +18,6 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.PsiTypeLookupItem; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author peter @@ -26,14 +25,11 @@ import org.jetbrains.annotations.Nullable; public class PreferSimpleWeigher extends CompletionWeigher { public Comparable weigh(@NotNull final LookupElement item, @NotNull final CompletionLocation location) { - if (location == null) { - return null; - } - final PsiTypeLookupItem lookupItem = PsiTypeLookupItem.from(item); + final PsiTypeLookupItem lookupItem = item.as(PsiTypeLookupItem.CLASS_CONDITION_KEY); if (lookupItem != null) { return -lookupItem.getBracketsCount(); } - if (CastingLookupElementDecorator.from(item) != null) { + if (item.as(CastingLookupElementDecorator.CLASS_CONDITION_KEY) != null) { return -239; } return 0; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index a420ee3fd001..1f92244fec69 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -167,7 +167,7 @@ public class ReferenceExpressionCompletionContributor { }), false, parameters); for (LookupElement lookupElement : elements) { if (lookupElement.getObject() instanceof PsiMethod) { - final JavaMethodCallElement item = lookupElement.as(JavaMethodCallElement.class); + final JavaMethodCallElement item = lookupElement.as(JavaMethodCallElement.CLASS_CONDITION_KEY); assert item != null; final PsiMethod method = (PsiMethod)lookupElement.getObject(); if (SmartCompletionDecorator.hasUnboundTypeParams(method)) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java index 2479f3a520fc..ef32d2520c77 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/SmartCompletionDecorator.java @@ -58,8 +58,9 @@ public class SmartCompletionDecorator extends TailTypeDecorator { return defType; } - LookupElement item = getDelegate(); - Object object = item.getObject(); + LookupElement delegate = getDelegate(); + LookupItem item = as(LookupItem.CLASS_CONDITION_KEY); + Object object = delegate.getObject(); if (!CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET && (object instanceof PsiMethod || object instanceof PsiClass)) { return TailType.NONE; } @@ -67,8 +68,8 @@ public class SmartCompletionDecorator extends TailTypeDecorator { final PsiExpression enclosing = PsiTreeUtil.getContextOfType(myPosition, PsiExpression.class, true); if (enclosing != null && object instanceof PsiElement) { - final PsiType type = getItemType(item); - final TailType itemType = item instanceof LookupItem ? ((LookupItem)item).getTailType() : TailType.NONE; + final PsiType type = JavaCompletionUtil.getLookupElementType(delegate); + final TailType itemType = item != null ? item.getTailType() : TailType.NONE; TailType cached = itemType; int cachedPrior = 0; if (type != null && type.isValid()) { @@ -108,11 +109,6 @@ public class SmartCompletionDecorator extends TailTypeDecorator { return null; } - @Nullable - private PsiType getItemType(LookupElement element) { - return JavaCompletionUtil.getLookupElementType(element); - } - @Override public void handleInsert(InsertionContext context) { myPosition = getPosition(context, this); diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java index 7d2494cdf827..d28cda96e8ed 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java @@ -15,33 +15,21 @@ */ package com.intellij.codeInsight.javadoc; +import com.intellij.codeInsight.documentation.AbstractExternalFilter; import com.intellij.codeInsight.documentation.DocumentationManager; +import com.intellij.codeInsight.documentation.PlatformDocumentationUtil; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtil; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.psi.*; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.util.io.UrlConnectionUtil; -import com.intellij.util.net.HttpConfigurable; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import java.io.*; -import java.net.URL; -import java.net.URLConnection; -import java.util.concurrent.Future; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -53,85 +41,19 @@ import java.util.regex.Pattern; * To change this template use Options | File Templates. */ -public class JavaDocExternalFilter { - private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.javadoc.JavaDocExternalFilter"); - +public class JavaDocExternalFilter extends AbstractExternalFilter { private final Project myProject; - private final PsiManager myManager; protected static @NonNls final Pattern ourHTMLsuffix = Pattern.compile("[.][hH][tT][mM][lL]?"); protected static @NonNls final Pattern ourParentFolderprefix = Pattern.compile("^[.][.]/"); protected static @NonNls final Pattern ourAnchorsuffix = Pattern.compile("#(.*)$"); protected static @NonNls final Pattern ourHTMLFilesuffix = Pattern.compile("/([^/]*[.][hH][tT][mM][lL]?)$"); private static @NonNls final Pattern ourHREFselector = Pattern.compile("\"]*)\"", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); - private static @NonNls final Pattern ourAnnihilator = Pattern.compile("/[^/^.]*/[.][.]/"); - private static @NonNls final Pattern ourIMGselector = Pattern.compile("]*)\"", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); private static @NonNls final Pattern ourMethodHeading = Pattern.compile("

(.+?)

", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); protected static @NonNls final String DOC_ELEMENT_PROTOCOL = "doc_element://"; - protected static @NonNls final String PSI_ELEMENT_PROTOCOL = "psi_element://"; - private static @NonNls final String JAR_PROTOCOL = "jar:"; - private static @NonNls final String DOC_START_MARKER = "Generated by javadoc"; - @NonNls private static final String HR = "
"; - @NonNls private static final String P = "

"; - @NonNls private static final String DL = "

"; @NonNls protected static final String H2 = ""; @NonNls protected static final String HTML_CLOSE = ""; @NonNls protected static final String HTML = ""; - @NonNls private static final String BR = "
"; - @NonNls private static final String DT = "
"; - - protected static abstract class RefConvertor { - private final Pattern mySelector; - - public RefConvertor(Pattern selector) { - mySelector = selector; - } - - protected abstract String convertReference(String root, String href); - - public String refFilter(final String root, String read) { - String toMatch = read.toUpperCase(); - StringBuffer ready = new StringBuffer(); - int prev = 0; - Matcher matcher = mySelector.matcher(toMatch); - - while (matcher.find()) { - String before = read.substring(prev, matcher.start(1) - 1); // Before reference - final String href = read.substring(matcher.start(1), matcher.end(1)); // The URL - prev = matcher.end(1) + 1; - ready.append(before); - ready.append("\""); - ready.append(ApplicationManager.getApplication().runReadAction( - new Computable() { - public String compute() { - return convertReference(root, href); - } - } - )); - ready.append("\""); - } - - ready.append(read.substring(prev, read.length())); - - return ready.toString(); - } - } - - protected final RefConvertor myIMGConvertor = new RefConvertor(ourIMGselector) { - protected String convertReference(String root, String href) { - if (StringUtil.startsWithChar(href, '#')) { - return DOC_ELEMENT_PROTOCOL + root + href; - } - - if (Comparing.strEqual(VirtualFileManager.extractProtocol(root), LocalFileSystem.PROTOCOL)) { - final String path = VirtualFileManager.extractPath(root); - if (!path.startsWith("/")) {//skip host for local file system files (format - file://host_name/path) - root = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, "/" + path); - } - } - return ourHTMLFilesuffix.matcher(root).replaceAll("/") + href; - } - }; private final RefConvertor[] myReferenceConvertors = new RefConvertor[]{ new RefConvertor(ourHREFselector) { @@ -155,7 +77,7 @@ public class JavaDocExternalFilter { final String classRef = ourAnchorsuffix.matcher(elementRef).replaceAll(""); return - (JavaPsiFacade.getInstance(myManager.getProject()).findClass(classRef, GlobalSearchScope.allScope(myProject)) != null) + (JavaPsiFacade.getInstance(myProject).findClass(classRef, GlobalSearchScope.allScope(myProject)) != null) ? PSI_ELEMENT_PROTOCOL + elementRef : DOC_ELEMENT_PROTOCOL + doAnnihilate(nakedRoot + href); } @@ -166,112 +88,9 @@ public class JavaDocExternalFilter { public JavaDocExternalFilter(Project project) { myProject = project; - myManager = PsiManager.getInstance(myProject); - } - - protected static String doAnnihilate(String path) { - int len = path.length(); - - do { - path = ourAnnihilator.matcher(path).replaceAll("/"); - } - while (len > (len = path.length())); - - return path; - } - - private interface Waiter{ - void sayYes(); - - boolean runMe(); - } - - public static boolean isJavaDocURL(final String url) throws Exception { - final Waiter waiter = new Waiter(){ - Boolean key = Boolean.FALSE; - final Object LOCK = new Object(); - - public void sayYes(){ - key = Boolean.TRUE; - synchronized (LOCK) { - LOCK.notify(); - } - } - - public boolean runMe(){ - try { - synchronized (LOCK) { - LOCK.wait(600); - } - } - catch (InterruptedException e) { - return false; - } - - return key.booleanValue(); - } - }; - - final boolean[] fail = new boolean[1]; - final Exception [] ex = new Exception[1]; - final HttpConfigurable httpConfigurable = HttpConfigurable.getInstance(); - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - public void run() { - Reader stream = null; - try { - stream = getReaderByUrl(url, httpConfigurable, ProgressManager.getInstance().getProgressIndicator()); - } - catch (IOException e) { - ex[0] = e; - } - if (stream == null) { - fail[0] = true; - return; - } - try { - BufferedReader reader = null; - try { - reader = new BufferedReader(stream); - int lookUp = 6; - - while (lookUp > 0) { - if (reader.readLine().indexOf(DOC_START_MARKER) != -1) { - waiter.sayYes(); - } - - lookUp--; - } - } - finally { - if (reader != null) { - reader.close(); - } - } - - - } - catch (final Exception e) { - ex[0] = e; - } - } - }); - - if (ex[0] != null) { - throw ex[0]; - } - return !fail[0] && waiter.runMe(); - } - - private String correctRefs(String root, String read) { - String result = read; - - for (RefConvertor myReferenceConvertor : getRefConvertors()) { - result = myReferenceConvertor.refFilter(root, result); - } - - return result; } + @Override protected RefConvertor[] getRefConvertors() { return myReferenceConvertors; } @@ -281,74 +100,13 @@ public class JavaDocExternalFilter { if (text == null) { return null; } - - text = JavaDocUtil.fixupText(text); - + text = PlatformDocumentationUtil.fixupText(text); return text; - - } - - - @Nullable - private static Reader getReaderByUrl(final String surl, final HttpConfigurable httpConfigurable, final ProgressIndicator pi) throws IOException { - if (surl.startsWith(JAR_PROTOCOL)) { - VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(BrowserUtil.getDocURL(surl)); - - if (file == null) { - return null; - } - - return new StringReader(VfsUtil.loadText(file)); - } - - URL url = BrowserUtil.getURL(surl); - if (url == null) { - return null; - } - httpConfigurable.prepareURL(url.toString()); - final URLConnection urlConnection = url.openConnection(); - final String contentEncoding = urlConnection.getContentEncoding(); - final InputStream inputStream = - pi != null ? UrlConnectionUtil.getConnectionInputStreamWithException(urlConnection, pi) : urlConnection.getInputStream(); - //noinspection IOResourceOpenedButNotSafelyClosed - return contentEncoding != null ? new InputStreamReader(inputStream, contentEncoding) : new InputStreamReader(inputStream); - } - - @Nullable - @SuppressWarnings({"HardCodedStringLiteral"}) - public String getExternalDocInfo(final String surl) throws Exception { - if (surl == null) return null; - if (MyJavadocFetcher.isFree()) { - final MyJavadocFetcher fetcher = new MyJavadocFetcher(surl, new MyDocBuilder() { - public void buildFromStream(String surl, Reader input, StringBuffer result) throws IOException { - doBuildFromStream(surl, input, result); - } - }); - final Future fetcherFuture = ApplicationManager.getApplication().executeOnPooledThread(fetcher); - try { - fetcherFuture.get(); - } - catch (Exception e) { - return null; - } - final Exception exception = fetcher.getException(); - if (exception != null) { - fetcher.cleanup(); - throw exception; - } - - final String docText = correctRefs(ourAnchorsuffix.matcher(surl).replaceAll(""), fetcher.getData()); - if (LOG.isDebugEnabled()) { - LOG.debug("Filtered JavaDoc: " + docText + "\n"); - } - return JavaDocUtil.fixupText(docText); - } - return null; } @Nullable public String getExternalDocInfoForElement(final String docURL, final PsiElement element) throws Exception { - String externalDoc = getExternalDocInfo(docURL); + String externalDoc = super.getExternalDocInfoForElement(docURL, element); if (externalDoc != null) { if (element instanceof PsiMethod) { final String className = ApplicationManager.getApplication().runReadAction( @@ -368,154 +126,4 @@ public class JavaDocExternalFilter { return externalDoc; } - protected void doBuildFromStream(String surl, Reader input, StringBuffer data) throws IOException { - final BufferedReader buf = new BufferedReader(input); - Matcher anchorMatcher = ourAnchorsuffix.matcher(surl); - @NonNls String startSection = ""; - @NonNls String endSection = "SUMMARY ========"; - @NonNls String greatestEndSection = ""; - boolean isClassDoc = true; - - if (anchorMatcher.find()) { - isClassDoc = false; - startSection = " - data.append(H2); - skip = true; - } - else if (!skip) { - appendLine(data, read); - } - } - - data.append(DL); - - StringBuffer classDetails = new StringBuffer(); - - while (((read = buf.readLine()) != null) && !read.toUpperCase().equals(HR) && !read.toUpperCase().equals(P)) { - appendLine(classDetails, read); - } - - while (((read = buf.readLine()) != null) && !read.toUpperCase().equals(P) && !read.toUpperCase().equals(HR)) { - appendLine(data, read.replaceAll(DT, DT + BR)); - } - - data.append(classDetails); - data.append(P); - } - - while (((read = buf.readLine()) != null) && read.indexOf(endSection) == -1 && read.indexOf(greatestEndSection) == -1) { - if (read.toUpperCase().indexOf(HR) == -1) { - appendLine(data, read); - } - } - - data.append(HTML_CLOSE); - } - - private static void appendLine(final StringBuffer buffer, final String read) { - buffer.append(read); - buffer.append("\n"); - } - - private interface MyDocBuilder { - void buildFromStream(String surl, Reader input, StringBuffer result) throws IOException; - } - - private static class MyJavadocFetcher implements Runnable { - private static boolean ourFree = true; - private final StringBuffer data = new StringBuffer(); - private final String surl; - private final MyDocBuilder myBuilder; - private final Exception [] myExceptions = new Exception[1]; - private final HttpConfigurable myHttpConfigurable; - - public MyJavadocFetcher(final String surl, MyDocBuilder builder) { - this.surl = surl; - myBuilder = builder; - ourFree = false; - myHttpConfigurable = HttpConfigurable.getInstance(); - } - - public static boolean isFree() { - return ourFree; - } - - public String getData() { - return data.toString(); - } - - public void run() { - try { - if (surl == null) { - return; - } - - Reader stream = null; - try { - stream = getReaderByUrl(surl, myHttpConfigurable, new ProgressIndicatorBase()); - } - catch (ProcessCanceledException e) { - return; - } - catch (IOException e) { - myExceptions[0] = e; - } - - if (stream == null) { - return; - } - - try { - myBuilder.buildFromStream(surl, stream, data); - } - catch (final IOException e) { - myExceptions[0] = e; - } - finally { - try { - stream.close(); - } - catch (IOException e) { - myExceptions[0] = e; - } - } - } - finally { - ourFree = true; - } - } - - public Exception getException() { - return myExceptions[0]; - } - - public void cleanup() { - myExceptions[0] = null; - } - } } diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java index 38e71b754c3a..bd8d2901c153 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java @@ -27,19 +27,14 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import java.util.LinkedList; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; public class JavaDocUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.javadoc.JavaDocUtil"); private static final @NonNls Pattern ourTypePattern = Pattern.compile("[ ]+[^ ^\\[^\\]]"); - private static final @NonNls Pattern ourLtFixupPattern = Pattern.compile("<([^/^\\w^!])"); - private static final @NonNls Pattern ourToQuote = Pattern.compile("[\\\\\\.\\^\\$\\?\\*\\+\\|\\)\\}\\]\\{\\(\\[]"); - private static final @NonNls String LT_ENTITY = "<"; private JavaDocUtil() { } @@ -350,41 +345,6 @@ public class JavaDocUtil { return memberText.substring(0, parenthIndex + 1) + buffer.toString() + ")"; } - private static String quote(String x) { - if (ourToQuote.matcher(x).find()) { - return "\\" + x; - } - - return x; - } - - public static String fixupText(String docText) { - Matcher fixupMatcher = ourLtFixupPattern.matcher(docText); - LinkedList secondSymbols = new LinkedList(); - - while (fixupMatcher.find()) { - String s = fixupMatcher.group(1); - - //[db] that's workaround to avoid internal bug - if (!s.equals("\\") && !secondSymbols.contains(s)) { - secondSymbols.addFirst(s); - } - } - - for (String s : secondSymbols) { - String pattern = "<" + quote(s); - - try { - docText = Pattern.compile(pattern).matcher(docText).replaceAll(LT_ENTITY + pattern); - } - catch (PatternSyntaxException e) { - LOG.error("Pattern syntax exception on " + pattern); - } - } - - return docText; - } - public static PsiClassType[] getImplementsList(PsiClass aClass) { if (aClass instanceof PsiAnonymousClass) { return new PsiClassType[]{((PsiAnonymousClass)aClass).getBaseClassType()}; @@ -405,4 +365,4 @@ public class JavaDocUtil { return list == null ? PsiClassType.EMPTY_ARRAY : list.getReferencedTypes(); } -} \ No newline at end of file +} diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java index a268b4339513..48d521bc9856 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/PsiTypeLookupItem.java @@ -18,9 +18,9 @@ package com.intellij.codeInsight.lookup; import com.intellij.codeInsight.completion.DefaultInsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.completion.JavaPsiClassReferenceElement; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.psi.*; import com.intellij.psi.impl.source.PsiClassReferenceType; -import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,6 +29,8 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class PsiTypeLookupItem extends LookupItem { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(PsiTypeLookupItem.class); + public PsiTypeLookupItem(Object o, @NotNull @NonNls String lookupString) { super(o, lookupString); } @@ -130,16 +132,6 @@ public class PsiTypeLookupItem extends LookupItem { } return new LookupItem(type, type.getPresentableText()); } - - public static @Nullable PsiTypeLookupItem from(LookupElement element) { - if (element instanceof PsiTypeLookupItem) return (PsiTypeLookupItem)element; - else if (element instanceof LookupElementDecorator) { - element = ((LookupElementDecorator)element).getDelegate(); - if (element instanceof PsiTypeLookupItem) return (PsiTypeLookupItem)element; - } - - return null; - } @Override public void renderElement(LookupElementPresentation presentation) { diff --git a/java/java-impl/src/com/intellij/codeInsight/lookup/TypedLookupItem.java b/java/java-impl/src/com/intellij/codeInsight/lookup/TypedLookupItem.java index e2bfb8945e78..34415abc0f16 100644 --- a/java/java-impl/src/com/intellij/codeInsight/lookup/TypedLookupItem.java +++ b/java/java-impl/src/com/intellij/codeInsight/lookup/TypedLookupItem.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.lookup; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.psi.PsiType; import org.jetbrains.annotations.Nullable; @@ -22,6 +23,8 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public interface TypedLookupItem { + ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(TypedLookupItem.class); + @Nullable PsiType getType(); } diff --git a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java index 657da24e9af0..6328cd086867 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java @@ -17,6 +17,7 @@ package com.intellij.lang.java; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.codeInsight.documentation.PlatformDocumentationUtil; import com.intellij.codeInsight.editorActions.CodeDocumentationUtil; import com.intellij.codeInsight.javadoc.JavaDocExternalFilter; import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator; @@ -36,9 +37,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.VirtualFileSystem; -import com.intellij.openapi.vfs.ex.http.HttpFileSystem; import com.intellij.psi.*; import com.intellij.psi.impl.beanProperties.BeanPropertyElement; import com.intellij.psi.impl.source.javadoc.PsiDocParamRef; @@ -639,7 +638,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext } if (module != null) { String[] javadocPaths = ModuleRootManager.getInstance(module).getRootUrls(JavadocOrderRootType.getInstance()); - final List httpRoots = getHttpRoots(javadocPaths, relPath); + final List httpRoots = PlatformDocumentationUtil.getHttpRoots(javadocPaths, relPath); // if found nothing and the file is from library classes, fall back to order entries if (httpRoots != null || !fileIndex.isInLibraryClasses(virtualFile)) { return httpRoots; @@ -649,33 +648,12 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext final List orderEntries = fileIndex.getOrderEntriesForFile(virtualFile); for (OrderEntry orderEntry : orderEntries) { final String[] files = orderEntry.getUrls(JavadocOrderRootType.getInstance()); - final List httpRoot = getHttpRoots(files, relPath); + final List httpRoot = PlatformDocumentationUtil.getHttpRoots(files, relPath); if (httpRoot != null) return httpRoot; } return null; } - @Nullable - public static List getHttpRoots(final String[] roots, String relPath) { - final ArrayList result = new ArrayList(); - for (String root : roots) { - final VirtualFile virtualFile = VirtualFileManager.getInstance().findFileByUrl(root); - if (virtualFile != null) { - if (virtualFile.getFileSystem() instanceof HttpFileSystem) { - String url = virtualFile.getUrl(); - if (!url.endsWith("/")) url += "/"; - result.add(url + relPath); - } - else { - VirtualFile file = virtualFile.findFileByRelativePath(relPath); - if (file != null) result.add(file.getUrl()); - } - } - } - - return result.isEmpty() ? null : result; - } - @Nullable public static List findUrlForPackage(PsiPackage aPackage) { String qName = aPackage.getQualifiedName(); diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java index 5da4faeb8fcf..d6881ee3e733 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java @@ -519,7 +519,7 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo AlignmentStrategy.wrap(arrangeChildAlignment(child, alignmentStrategy)), childOffset); if (childType == JavaElementType.MODIFIER_LIST && containsAnnotations(child)) { - myAnnotationWrap = Wrap.createWrap(getWrapType(getAnnotationWrapType()), true); + myAnnotationWrap = Wrap.createWrap(getWrapType(getAnnotationWrapType(child)), true); } if (block instanceof AbstractJavaBlock) { @@ -789,12 +789,27 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo return ((PsiModifierList)child.getPsi()).getAnnotations().length > 0; } - private int getAnnotationWrapType() { + private int getAnnotationWrapType(@NotNull ASTNode child) { final IElementType nodeType = myNode.getElementType(); if (nodeType == JavaElementType.METHOD) { return mySettings.METHOD_ANNOTATION_WRAP; } if (nodeType == JavaElementType.CLASS) { + // There is a possible case that current document state is invalid from language syntax point of view, e.g. the user starts + // typing field definition and re-formatting is triggered by 'auto insert javadocs' processing. Example: + // class Test { + // @NotNull Object + // } + // Here '@NotNull' has a 'class' node as a parent but we want to use field annotation setting value. Hence, we check if subsequent + // parsed info is valid. + for (ASTNode node = child.getTreeNext(); node != null; node = node.getTreeNext()) { + if (JavaTokenType.WHITE_SPACE == node.getElementType() || node instanceof PsiTypeElement) { + continue; + } + if (node instanceof PsiErrorElement) { + return mySettings.FIELD_ANNOTATION_WRAP; + } + } return mySettings.CLASS_ANNOTATION_WRAP; } if (nodeType == JavaElementType.FIELD) { diff --git a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java index 06f3f70cd596..c200d37825dd 100644 --- a/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java +++ b/java/java-impl/src/com/intellij/util/xml/PsiClassConverter.java @@ -111,7 +111,8 @@ public class PsiClassConverter extends Converter implements CustomRefe VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile == null) return null; ProjectFileIndex fileIndex = ProjectRootManager.getInstance(file.getProject()).getFileIndex(); - return GlobalSearchScope.moduleRuntimeScope(module, fileIndex.isInTestSourceContent(virtualFile)); + boolean tests = fileIndex.isInTestSourceContent(virtualFile); + return module.getModuleRuntimeScope(tests).union(module.getModuleWithDependenciesAndLibrariesScope(tests)); } public static class AnnotationType extends PsiClassConverter { diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/DeclaredMembersGoFirst.java b/java/java-tests/testData/codeInsight/completion/normalSorting/DeclaredMembersGoFirst.java new file mode 100644 index 000000000000..1f6474ada926 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/DeclaredMembersGoFirst.java @@ -0,0 +1,15 @@ +class Foo { + void fromSuper() {} + void overridden() {} +} + +class FooImpl extends Foo { + void overridden() {} + void fromThis() {} +} + +class Bar { + { + new FooImpl(). + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index afd34e187649..658c03401b20 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -444,4 +444,37 @@ class JavaAutoPopupTest extends CompletionAutoPopupTestCase { assert !lookup } + public void testResumeAfterBackspace() { + myFixture.configureByText("a.java", """ + class A { + Object foo() { this } + } + """) + type '.' + assert lookup + type 'a' + assert !lookup + type '\b' + assert !lookup + type 'c' + assert lookup + } + + public void testHideOnInvalidSymbolAfterBackspace() { + myFixture.configureByText("a.java", """ + class A { + Object foo() { this } + } + """) + type '.' + assert lookup + type 'c' + assert lookup + type '\b' + assert lookup + type 'x' + assert !lookup + } + + } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java index 3449fb725e8e..1467f74060d1 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java @@ -170,4 +170,9 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { assertEquals("foo.Foo", ((JavaPsiClassReferenceElement)getLookup().getCurrentItem()).getQualifiedName()); } + public void testDeclaredMembersGoFirst() throws Exception { + invokeCompletion(getBasePath() + "/" + getTestName(false) + ".java"); + assertStringItems("fromThis", "overridden", "fromSuper", "equals", "getClass", "hashCode", "notify", "notifyAll", "toString", "wait", "wait", "wait"); + } + } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterWrapTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterWrapTest.java index 23c2dfd2167f..b557661ee24f 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterWrapTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterWrapTest.java @@ -256,4 +256,14 @@ public class JavaFormatterWrapTest extends AbstractJavaFormatterTest { "int j = 2;" ); } + + public void testIncompleteFieldAndAnnotationWrap() throws Exception { + // Inspired by IDEA-64725 + + getSettings().FIELD_ANNOTATION_WRAP = CommonCodeStyleSettings.DO_NOT_WRAP; + doClassTest( + "@NotNull Comparable", + "@NotNull Comparable" + ); + } } diff --git a/java/openapi/src/com/intellij/util/xml/DomJavaUtil.java b/java/openapi/src/com/intellij/util/xml/DomJavaUtil.java index 996af38a3a63..0c2b022ac941 100644 --- a/java/openapi/src/com/intellij/util/xml/DomJavaUtil.java +++ b/java/openapi/src/com/intellij/util/xml/DomJavaUtil.java @@ -50,7 +50,8 @@ public class DomJavaUtil { } else { ProjectFileIndex fileIndex = ProjectRootManager.getInstance(file.getProject()).getFileIndex(); - scope = GlobalSearchScope.moduleRuntimeScope(module, fileIndex.isInTestSourceContent(virtualFile)); + boolean tests = fileIndex.isInTestSourceContent(virtualFile); + scope = module.getModuleRuntimeScope(tests).union(module.getModuleWithDependenciesAndLibrariesScope(tests)); } } else { diff --git a/java/openapi/src/com/intellij/util/xml/converters/values/ClassValueConverter.java b/java/openapi/src/com/intellij/util/xml/converters/values/ClassValueConverter.java index 813ae1498d50..af9bee8c8a83 100644 --- a/java/openapi/src/com/intellij/util/xml/converters/values/ClassValueConverter.java +++ b/java/openapi/src/com/intellij/util/xml/converters/values/ClassValueConverter.java @@ -63,6 +63,6 @@ public abstract class ClassValueConverter extends Converter implements } final boolean inTests = ProjectRootManager.getInstance(project).getFileIndex().isInTestSourceContent(file); - return module.getModuleWithDependenciesAndLibrariesScope(inTests); + return module.getModuleRuntimeScope(inTests).union(module.getModuleWithDependenciesAndLibrariesScope(inTests)); } } diff --git a/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java b/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java index 13df562fcc7b..3a801015849c 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java +++ b/platform/lang-api/src/com/intellij/codeInsight/completion/PrioritizedLookupElement.java @@ -18,7 +18,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementDecorator; -import org.jetbrains.annotations.Nullable; +import com.intellij.openapi.util.ClassConditionKey; /** * Use only when you want to control lookup sorting & preference in simple cases when you have control over ALL the items in lookup. @@ -28,6 +28,7 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class PrioritizedLookupElement extends LookupElementDecorator { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(PrioritizedLookupElement.class); private final double myPriority; private final int myGrouping; @@ -46,18 +47,12 @@ public class PrioritizedLookupElement extends LookupEle } public static LookupElement withPriority(LookupElement element, double priority) { - final PrioritizedLookupElement prioritized = PrioritizedLookupElement.from(element); + final PrioritizedLookupElement prioritized = element.as(CLASS_CONDITION_KEY); return new PrioritizedLookupElement(element, priority, prioritized == null ? 0 : prioritized.getGrouping()); } public static LookupElement withGrouping(LookupElement element, int grouping) { - final PrioritizedLookupElement prioritized = PrioritizedLookupElement.from(element); + final PrioritizedLookupElement prioritized = element.as(CLASS_CONDITION_KEY); return new PrioritizedLookupElement(element, prioritized == null ? 0 : prioritized.getPriority(), grouping); } - - public static @Nullable PrioritizedLookupElement from(LookupElement element) { - if (element instanceof PrioritizedLookupElement) return (PrioritizedLookupElement)element; - if (element instanceof LookupElementDecorator) return from (((LookupElementDecorator)element).getDelegate()); - return null; - } } diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java index 96c7ac02fc49..e9b76972dcde 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/AutoCompletionPolicy.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.lookup; +import com.intellij.openapi.util.ClassConditionKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,7 +57,7 @@ public enum AutoCompletionPolicy { @Nullable public static AutoCompletionPolicy getPolicy(LookupElement element) { - final PolicyDecorator decorator = element.as(PolicyDecorator.class); + final PolicyDecorator decorator = element.as(PolicyDecorator.CLASS_CONDITION_KEY); if (decorator != null) { return decorator.myPolicy; } @@ -64,6 +65,7 @@ public enum AutoCompletionPolicy { } private static class PolicyDecorator extends LookupElementDecorator { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(PolicyDecorator.class); private final AutoCompletionPolicy myPolicy; public PolicyDecorator(LookupElement element, AutoCompletionPolicy policy) { diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java index 10ad5a4984c0..af5581c3e8ff 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElement.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.lookup; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -82,10 +83,18 @@ public abstract class LookupElement extends UserDataHolderBase { presentation.setItemText(getLookupString()); } + /** + * use {@link #as(com.intellij.openapi.util.ClassConditionKey)} instead + */ + @Deprecated @Nullable - public T as(Class aClass) { - //noinspection unchecked - return aClass.isInstance(this) ? (T) this : null; + public final T as(Class aClass) { + return as(ClassConditionKey.create(aClass)); + } + + @Nullable + public T as(ClassConditionKey conditionKey) { + return conditionKey.isInstance(this) ? (T) this : null; } public boolean isCaseSensitive() { diff --git a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java index 1aab873ff062..3584b38fb685 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java +++ b/platform/lang-api/src/com/intellij/codeInsight/lookup/LookupElementDecorator.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.completion.CompletionService; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.openapi.util.ClassConditionKey; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -108,9 +109,9 @@ public abstract class LookupElementDecorator extends Lo } @Override - public T as(Class aClass) { - final T t = super.as(aClass); - return t == null ? myDelegate.as(aClass) : t; + public T as(ClassConditionKey conditionKey) { + final T t = super.as(conditionKey); + return t == null ? myDelegate.as(conditionKey) : t; } public boolean isCaseSensitive() { diff --git a/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java b/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java index d3676670a0ca..0a6439579472 100644 --- a/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java +++ b/platform/lang-api/src/com/intellij/psi/impl/ElementBase.java @@ -19,7 +19,7 @@ package com.intellij.psi.impl; import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.NativeFileType; +import com.intellij.openapi.fileTypes.INativeFileType; import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.IndexNotReadyException; @@ -136,7 +136,7 @@ public abstract class ElementBase extends UserDataHolderBase implements Iconable } public static boolean isNativeFileType(FileType fileType) { - return fileType instanceof NativeFileType || fileType instanceof UnknownFileType; + return fileType instanceof INativeFileType || fileType instanceof UnknownFileType; } protected Icon getAdjustedBaseIcon(Icon icon, int flags) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java b/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java index d058ddc4c223..e1cf188cc940 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java @@ -16,9 +16,7 @@ package com.intellij.codeInsight; -import com.intellij.codeInsight.completion.CodeCompletionHandlerBase; import com.intellij.codeInsight.completion.CompletionProgressIndicator; -import com.intellij.codeInsight.completion.CompletionType; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.editorActions.CompletionAutoPopupHandler; import com.intellij.codeInsight.hint.ShowParameterInfoHandler; @@ -101,7 +99,7 @@ public class AutoPopupController implements Disposable { if (!file.isValid()) return; if (condition != null && !condition.value(file)) return; - new CodeCompletionHandlerBase(CompletionType.BASIC, false, true).invoke(myProject, editor, file); + CompletionAutoPopupHandler.invokeAutoPopupCompletion(myProject, editor); } }; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 9035ea961bb7..af8c10fd19a6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -452,7 +452,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { return policy; } - final LookupItem item = element.as(LookupItem.class); + final LookupItem item = element.as(LookupItem.CLASS_CONDITION_KEY); if (item != null) { return item.getAutoCompletionPolicy(); } @@ -505,8 +505,8 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { protected void run(Result result) throws Throwable { String uniqueText = _uniqueText; - if (item.getObject() instanceof DeferredUserLookupValue && item.as(LookupItem.class) != null) { - if (!((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.class), context.getProject())) { + if (item.getObject() instanceof DeferredUserLookupValue && item.as(LookupItem.CLASS_CONDITION_KEY) != null) { + if (!((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.CLASS_CONDITION_KEY), context.getProject())) { return; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java index 10d7fda3fd4b..a452c63ec561 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/GroupingWeigher.java @@ -18,7 +18,6 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author peter @@ -26,10 +25,7 @@ import org.jetbrains.annotations.Nullable; public class GroupingWeigher extends CompletionWeigher { @Override public Integer weigh(@NotNull LookupElement element, @NotNull CompletionLocation location) { - if (location == null) { - return null; - } - final PrioritizedLookupElement prioritized = element.as(PrioritizedLookupElement.class); + final PrioritizedLookupElement prioritized = element.as(PrioritizedLookupElement.CLASS_CONDITION_KEY); if (prioritized != null) { return -prioritized.getGrouping(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/PriorityWeigher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/PriorityWeigher.java index b4eabfb4cc1b..196f443e8c07 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/PriorityWeigher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/PriorityWeigher.java @@ -19,7 +19,6 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author peter @@ -27,15 +26,12 @@ import org.jetbrains.annotations.Nullable; public class PriorityWeigher extends CompletionWeigher { @Override public Double weigh(@NotNull LookupElement element, @NotNull CompletionLocation location) { - if (location == null) { - return null; - } - final PrioritizedLookupElement prioritized = PrioritizedLookupElement.from(element); + final PrioritizedLookupElement prioritized = element.as(PrioritizedLookupElement.CLASS_CONDITION_KEY); if (prioritized != null) { return -prioritized.getPriority(); } - final LookupItem item = LookupItem.from(element); + final LookupItem item = element.as(LookupItem.CLASS_CONDITION_KEY); if (item != null) { return -item.getPriority(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java new file mode 100644 index 000000000000..b8d6f346bf7d --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java @@ -0,0 +1,359 @@ +/* + * Copyright 2000-2011 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.codeInsight.documentation; + +import com.intellij.ide.BrowserUtil; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.util.ProgressIndicatorBase; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.psi.*; +import com.intellij.util.io.UrlConnectionUtil; +import com.intellij.util.net.HttpConfigurable; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.util.concurrent.Future; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by IntelliJ IDEA. + * User: db + * Date: May 2, 2003 + * Time: 8:35:34 PM + * To change this template use Options | File Templates. + */ + +public abstract class AbstractExternalFilter { + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.javadoc.JavaDocExternalFilter"); + + protected static @NonNls final Pattern ourAnchorsuffix = Pattern.compile("#(.*)$"); + protected static @NonNls final Pattern ourHTMLFilesuffix = Pattern.compile("/([^/]*[.][hH][tT][mM][lL]?)$"); + private static @NonNls final Pattern ourAnnihilator = Pattern.compile("/[^/^.]*/[.][.]/"); + private static @NonNls final Pattern ourIMGselector = Pattern.compile("]*)\"", Pattern.CASE_INSENSITIVE|Pattern.DOTALL); + protected static @NonNls final String DOC_ELEMENT_PROTOCOL = "doc_element://"; + protected static @NonNls final String PSI_ELEMENT_PROTOCOL = "psi_element://"; + private static @NonNls final String JAR_PROTOCOL = "jar:"; + @NonNls private static final String HR = "
"; + @NonNls private static final String P = "

"; + @NonNls private static final String DL = "

"; + @NonNls protected static final String H2 = ""; + @NonNls protected static final String HTML_CLOSE = ""; + @NonNls protected static final String HTML = ""; + @NonNls private static final String BR = "
"; + @NonNls private static final String DT = "
"; + + protected static abstract class RefConvertor { + private final Pattern mySelector; + + public RefConvertor(Pattern selector) { + mySelector = selector; + } + + protected abstract String convertReference(String root, String href); + + public String refFilter(final String root, String read) { + String toMatch = read.toUpperCase(); + StringBuffer ready = new StringBuffer(); + int prev = 0; + Matcher matcher = mySelector.matcher(toMatch); + + while (matcher.find()) { + String before = read.substring(prev, matcher.start(1) - 1); // Before reference + final String href = read.substring(matcher.start(1), matcher.end(1)); // The URL + prev = matcher.end(1) + 1; + ready.append(before); + ready.append("\""); + ready.append(ApplicationManager.getApplication().runReadAction( + new Computable() { + public String compute() { + return convertReference(root, href); + } + } + )); + ready.append("\""); + } + + ready.append(read.substring(prev, read.length())); + + return ready.toString(); + } + } + + protected final RefConvertor myIMGConvertor = new RefConvertor(ourIMGselector) { + protected String convertReference(String root, String href) { + if (StringUtil.startsWithChar(href, '#')) { + return DOC_ELEMENT_PROTOCOL + root + href; + } + + if (Comparing.strEqual(VirtualFileManager.extractProtocol(root), LocalFileSystem.PROTOCOL)) { + final String path = VirtualFileManager.extractPath(root); + if (!path.startsWith("/")) {//skip host for local file system files (format - file://host_name/path) + root = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, "/" + path); + } + } + return ourHTMLFilesuffix.matcher(root).replaceAll("/") + href; + } + }; + + protected static String doAnnihilate(String path) { + int len = path.length(); + + do { + path = ourAnnihilator.matcher(path).replaceAll("/"); + } + while (len > (len = path.length())); + + return path; + } + + private String correctRefs(String root, String read) { + String result = read; + + for (RefConvertor myReferenceConvertor : getRefConvertors()) { + result = myReferenceConvertor.refFilter(root, result); + } + + return result; + } + + protected abstract RefConvertor[] getRefConvertors(); + + @Nullable + private static Reader getReaderByUrl(final String surl, final HttpConfigurable httpConfigurable, final ProgressIndicator pi) throws IOException { + if (surl.startsWith(JAR_PROTOCOL)) { + VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(BrowserUtil.getDocURL(surl)); + + if (file == null) { + return null; + } + + return new StringReader(VfsUtil.loadText(file)); + } + + URL url = BrowserUtil.getURL(surl); + if (url == null) { + return null; + } + httpConfigurable.prepareURL(url.toString()); + final URLConnection urlConnection = url.openConnection(); + final String contentEncoding = urlConnection.getContentEncoding(); + final InputStream inputStream = + pi != null ? UrlConnectionUtil.getConnectionInputStreamWithException(urlConnection, pi) : urlConnection.getInputStream(); + //noinspection IOResourceOpenedButNotSafelyClosed + return contentEncoding != null ? new InputStreamReader(inputStream, contentEncoding) : new InputStreamReader(inputStream); + } + + @Nullable + @SuppressWarnings({"HardCodedStringLiteral"}) + public String getExternalDocInfo(final String surl) throws Exception { + if (surl == null) return null; + if (MyJavadocFetcher.isFree()) { + final MyJavadocFetcher fetcher = new MyJavadocFetcher(surl, new MyDocBuilder() { + public void buildFromStream(String surl, Reader input, StringBuffer result) throws IOException { + doBuildFromStream(surl, input, result); + } + }); + final Future fetcherFuture = ApplicationManager.getApplication().executeOnPooledThread(fetcher); + try { + fetcherFuture.get(); + } + catch (Exception e) { + return null; + } + final Exception exception = fetcher.getException(); + if (exception != null) { + fetcher.cleanup(); + throw exception; + } + + final String docText = correctRefs(ourAnchorsuffix.matcher(surl).replaceAll(""), fetcher.getData()); + if (LOG.isDebugEnabled()) { + LOG.debug("Filtered JavaDoc: " + docText + "\n"); + } + return PlatformDocumentationUtil.fixupText(docText); + } + return null; + } + + @Nullable + public String getExternalDocInfoForElement(final String docURL, final PsiElement element) throws Exception { + return getExternalDocInfo(docURL); + } + + protected void doBuildFromStream(String surl, Reader input, StringBuffer data) throws IOException { + final BufferedReader buf = new BufferedReader(input); + Matcher anchorMatcher = ourAnchorsuffix.matcher(surl); + @NonNls String startSection = ""; + @NonNls String endSection = "SUMMARY ========"; + @NonNls String greatestEndSection = ""; + boolean isClassDoc = true; + + if (anchorMatcher.find()) { + isClassDoc = false; + startSection = " + data.append(H2); + skip = true; + } + else if (!skip) { + appendLine(data, read); + } + } + + data.append(DL); + + StringBuffer classDetails = new StringBuffer(); + + while (((read = buf.readLine()) != null) && !read.toUpperCase().equals(HR) && !read.toUpperCase().equals(P)) { + appendLine(classDetails, read); + } + + while (((read = buf.readLine()) != null) && !read.toUpperCase().equals(P) && !read.toUpperCase().equals(HR)) { + appendLine(data, read.replaceAll(DT, DT + BR)); + } + + data.append(classDetails); + data.append(P); + } + + while (((read = buf.readLine()) != null) && read.indexOf(endSection) == -1 && read.indexOf(greatestEndSection) == -1) { + if (read.toUpperCase().indexOf(HR) == -1) { + appendLine(data, read); + } + } + + data.append(HTML_CLOSE); + } + + private static void appendLine(final StringBuffer buffer, final String read) { + buffer.append(read); + buffer.append("\n"); + } + + private interface MyDocBuilder { + void buildFromStream(String surl, Reader input, StringBuffer result) throws IOException; + } + + private static class MyJavadocFetcher implements Runnable { + private static boolean ourFree = true; + private final StringBuffer data = new StringBuffer(); + private final String surl; + private final MyDocBuilder myBuilder; + private final Exception [] myExceptions = new Exception[1]; + private final HttpConfigurable myHttpConfigurable; + + public MyJavadocFetcher(final String surl, MyDocBuilder builder) { + this.surl = surl; + myBuilder = builder; + ourFree = false; + myHttpConfigurable = HttpConfigurable.getInstance(); + } + + public static boolean isFree() { + return ourFree; + } + + public String getData() { + return data.toString(); + } + + public void run() { + try { + if (surl == null) { + return; + } + + Reader stream = null; + try { + stream = getReaderByUrl(surl, myHttpConfigurable, new ProgressIndicatorBase()); + } + catch (ProcessCanceledException e) { + return; + } + catch (IOException e) { + myExceptions[0] = e; + } + + if (stream == null) { + return; + } + + try { + myBuilder.buildFromStream(surl, stream, data); + } + catch (final IOException e) { + myExceptions[0] = e; + } + finally { + try { + stream.close(); + } + catch (IOException e) { + myExceptions[0] = e; + } + } + } + finally { + ourFree = true; + } + } + + public Exception getException() { + return myExceptions[0]; + } + + public void cleanup() { + myExceptions[0] = null; + } + } +} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/PlatformDocumentationUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/PlatformDocumentationUtil.java new file mode 100644 index 000000000000..966d8173c150 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/PlatformDocumentationUtil.java @@ -0,0 +1,95 @@ +/* + * Copyright 2000-2011 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.codeInsight.documentation; + +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.openapi.vfs.ex.http.HttpFileSystem; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +public class PlatformDocumentationUtil { + + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.documentation.PlatformDocumentationUtil"); + + private static final @NonNls Pattern ourLtFixupPattern = Pattern.compile("<([^/^\\w^!])"); + private static final @NonNls Pattern ourToQuote = Pattern.compile("[\\\\\\.\\^\\$\\?\\*\\+\\|\\)\\}\\]\\{\\(\\[]"); + private static final @NonNls String LT_ENTITY = "<"; + + @Nullable + public static List getHttpRoots(final String[] roots, String relPath) { + final ArrayList result = new ArrayList(); + for (String root : roots) { + final VirtualFile virtualFile = VirtualFileManager.getInstance().findFileByUrl(root); + if (virtualFile != null) { + if (virtualFile.getFileSystem() instanceof HttpFileSystem) { + String url = virtualFile.getUrl(); + if (!url.endsWith("/")) url += "/"; + result.add(url + relPath); + } + else { + VirtualFile file = virtualFile.findFileByRelativePath(relPath); + if (file != null) result.add(file.getUrl()); + } + } + } + + return result.isEmpty() ? null : result; + } + + private static String quote(String x) { + if (ourToQuote.matcher(x).find()) { + return "\\" + x; + } + + return x; + } + + public static String fixupText(String docText) { + Matcher fixupMatcher = ourLtFixupPattern.matcher(docText); + LinkedList secondSymbols = new LinkedList(); + + while (fixupMatcher.find()) { + String s = fixupMatcher.group(1); + + //[db] that's workaround to avoid internal bug + if (!s.equals("\\") && !secondSymbols.contains(s)) { + secondSymbols.addFirst(s); + } + } + + for (String s : secondSymbols) { + String pattern = "<" + quote(s); + + try { + docText = Pattern.compile(pattern).matcher(docText).replaceAll(LT_ENTITY + pattern); + } + catch (PatternSyntaxException e) { + LOG.error("Pattern syntax exception on " + pattern); + } + } + + return docText; + } +} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java index 5c4b2a9c575e..1cf7cfa90d96 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java @@ -112,37 +112,41 @@ public class CompletionAutoPopupHandler extends TypedHandlerDelegate { if (ApplicationManager.getApplication().isWriteAccessAllowed()) return; //it will fail anyway if (DumbService.getInstance(project).isDumb()) return; - new CodeCompletionHandlerBase(CompletionType.BASIC, false, true).invoke(project, editor); - - final AutoPopupState state = new AutoPopupState(project, editor); - editor.putUserData(STATE_KEY, state); - - final Lookup lookup = LookupManager.getActiveLookup(editor); - if (lookup != null) { - lookup.addLookupListener(new LookupAdapter() { - @Override - public void itemSelected(LookupEvent event) { - final AutoPopupState state = getAutoPopupState(editor); - if (state != null) { - state.stopAutoPopup(); - } - } - - @Override - public void lookupCanceled(LookupEvent event) { - final AutoPopupState state = getAutoPopupState(editor); - if (event.isCanceledExplicitly() && state != null) { - state.stopAutoPopup(); - } - } - }); - } + invokeAutoPopupCompletion(project, editor); } }; AutoPopupController.getInstance(project).invokeAutoPopupRunnable(request, CodeInsightSettings.getInstance().AUTO_LOOKUP_DELAY); return Result.STOP; } + public static void invokeAutoPopupCompletion(Project project, final Editor editor) { + new CodeCompletionHandlerBase(CompletionType.BASIC, false, true).invoke(project, editor); + + final AutoPopupState state = new AutoPopupState(project, editor); + editor.putUserData(STATE_KEY, state); + + final Lookup lookup = LookupManager.getActiveLookup(editor); + if (lookup != null) { + lookup.addLookupListener(new LookupAdapter() { + @Override + public void itemSelected(LookupEvent event) { + final AutoPopupState state = getAutoPopupState(editor); + if (state != null) { + state.stopAutoPopup(); + } + } + + @Override + public void lookupCanceled(LookupEvent event) { + final AutoPopupState state = getAutoPopupState(editor); + if (event.isCanceledExplicitly() && state != null) { + state.stopAutoPopup(); + } + } + }); + } + } + @Nullable private static AutoPopupState getAutoPopupState(Editor editor) { return editor.getUserData(STATE_KEY); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java index 2583e8b97c13..4ba771b58efb 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupItem.java @@ -25,6 +25,7 @@ import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.impl.ElementLookupRenderer; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.util.ClassConditionKey; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; import com.intellij.util.containers.ContainerUtil; @@ -42,6 +43,8 @@ import java.util.Set; * This class represents an item of a lookup list. */ public class LookupItem extends MutableLookupElement implements Comparable { + public static final ClassConditionKey CLASS_CONDITION_KEY = ClassConditionKey.create(LookupItem.class); + public static final Object HIGHLIGHTED_ATTR = Key.create("highlighted"); public static final Object ICON_ATTR = Key.create("icon"); public static final Object TYPE_TEXT_ATTR = Key.create("typeText"); @@ -358,24 +361,8 @@ public class LookupItem extends MutableLookupElement implements Comparable return myAllLookupStrings; } - public void copyAttributes(final LookupItem item) { - if (myAttributes == null) { - if (item.myAttributes == null) return; - myAttributes = new HashMap(5); - } - myAttributes.putAll(item.myAttributes); - } - @Override public boolean isCaseSensitive() { return !Boolean.TRUE.equals(getAttribute(CASE_INSENSITIVE)); } - - public static @Nullable LookupItem from(LookupElement lookupElement) { - if (lookupElement instanceof LookupElementDecorator) { - lookupElement = ((LookupElementDecorator)lookupElement).getDelegate(); - } - if (lookupElement instanceof LookupItem) return (LookupItem)lookupElement; - return null; - } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java index 264afef7d421..f5c649b16ee1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/TailTypeDecorator.java @@ -46,7 +46,7 @@ public abstract class TailTypeDecorator extends LookupE final LookupElement delegate = getDelegate(); final TailType tailType = computeTailType(context); - final LookupItem lookupItem = delegate.as(LookupItem.class); + final LookupItem lookupItem = delegate.as(LookupItem.CLASS_CONDITION_KEY); if (lookupItem != null && tailType != null) { lookupItem.setTailType(TailType.UNKNOWN); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java index fb95e19ed5b9..9b77ae0ddd89 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/BackspaceHandler.java @@ -16,9 +16,8 @@ package com.intellij.codeInsight.lookup.impl; -import com.intellij.codeInsight.completion.CompletionProcess; import com.intellij.codeInsight.completion.CompletionProgressIndicator; -import com.intellij.codeInsight.completion.CompletionService; +import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; @@ -45,14 +44,14 @@ public class BackspaceHandler extends EditorActionHandler { } }); - if (lookup.truncatePrefix()) { + final CompletionProgressIndicator process = CompletionServiceImpl.getCompletionService().getCurrentCompletion(); + if (lookup.truncatePrefix(process == null || !process.isAutopopupCompletion())) { return; } if (lookup.getLookupStart() < editor.getCaretModel().getOffset()) { - final CompletionProcess process = CompletionService.getCompletionService().getCurrentCompletion(); - if (process instanceof CompletionProgressIndicator) { - ((CompletionProgressIndicator)process).scheduleRestart(); + if (process != null) { + process.scheduleRestart(); return; } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index bec42fbd1224..a6f963b4775a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -317,11 +317,13 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { ListScrollingUtil.ensureIndexIsVisible(myList, myList.getSelectedIndex(), 1); } - public boolean truncatePrefix() { + public boolean truncatePrefix(boolean preserveSelection) { final int len = myAdditionalPrefix.length(); if (len == 0) return false; - markSelectionTouched(); + if (preserveSelection) { + markSelectionTouched(); + } myAdditionalPrefix = myAdditionalPrefix.substring(0, len - 1); myInitialPrefix = null; @@ -593,8 +595,8 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { if (item == null || item instanceof EmptyLookupItem || item.getObject() instanceof DeferredUserLookupValue && - item.as(LookupItem.class) != null && - !((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.class), myProject)) { + item.as(LookupItem.CLASS_CONDITION_KEY) != null && + !((DeferredUserLookupValue)item.getObject()).handleUserSelection(item.as(LookupItem.CLASS_CONDITION_KEY), myProject)) { fireItemSelected(null, completionChar); return; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java index 244616a1f111..fff8e27635a3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/NavigationUtil.java @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.ElementBase; import com.intellij.psi.search.PsiElementProcessor; import com.intellij.ui.components.JBList; import org.jetbrains.annotations.NotNull; @@ -89,11 +90,20 @@ public final class NavigationUtil { } public static void activateFileWithPsiElement(@NotNull PsiElement elt) { - if (!activatePsiElementIfOpen(elt)) { + boolean openAsNative = false; + if (elt instanceof PsiFile) { + VirtualFile virtualFile = ((PsiFile)elt).getVirtualFile(); + if (virtualFile != null) { + openAsNative = ElementBase.isNativeFileType(virtualFile.getFileType()); + } + } + if (openAsNative || !activatePsiElementIfOpen(elt)) { ((NavigationItem)elt).navigate(true); } } + + private static boolean activatePsiElementIfOpen(@NotNull PsiElement elt) { if (!elt.isValid()) return false; elt = elt.getNavigationElement(); diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextProvider.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextProvider.java index 33a6324db490..443e67eaf6cb 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextProvider.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/LangScriptingContextProvider.java @@ -23,6 +23,8 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; + /** * @author Rustam Vishnyakov */ @@ -44,5 +46,11 @@ public abstract class LangScriptingContextProvider { @Nullable public abstract String getDefaultDocUrl(VirtualFile file); + + @Nullable + public abstract String getOfflineDocUrl(String defaultDocUrl); + + @Nullable + public abstract String downloadOfflineDoc(Project project, String offlineDocUrl, JComponent parent); } diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form index e547839fa495..413d843568fc 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form @@ -91,7 +91,7 @@ - + @@ -109,7 +109,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -136,14 +136,22 @@ - + - + + + + + + + + + diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java index 17cb54b3e73a..baf05e820c89 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java @@ -65,6 +65,7 @@ public class EditLibraryDialog extends DialogWrapper { private JButton myAddDocUrlButton; private JButton myRemoveDocUrlButton; private JBList myDocUrlList; + private JButton myDownloadButton; private Project myProject; private FileTableModel myFileTableModel; private VirtualFile mySelectedFile; @@ -110,6 +111,7 @@ public class EditLibraryDialog extends DialogWrapper { @Override public void intervalAdded(ListDataEvent e) { myRemoveDocUrlButton.setEnabled(true); + checkDownloadOfflineDocEnabled(); } @Override @@ -117,6 +119,7 @@ public class EditLibraryDialog extends DialogWrapper { Object source = e.getSource(); if (source instanceof MyDocUrlListModel && ((MyDocUrlListModel)source).getDocUrls().length == 0) { myRemoveDocUrlButton.setEnabled(false); + checkDownloadOfflineDocEnabled(); } } @@ -133,6 +136,14 @@ public class EditLibraryDialog extends DialogWrapper { } }); + myDownloadButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + downloadDocumentation(); + } + }); + myDownloadButton.setVisible(false); //TODO Remove + myRemoveDocUrlButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -161,6 +172,28 @@ public class EditLibraryDialog extends DialogWrapper { if (docUrls.length > 0) { myRemoveDocUrlButton.setEnabled(true); } + checkDownloadOfflineDocEnabled(); + } + + private void checkDownloadOfflineDocEnabled() { + for (String url : getDocUrls()) { + if (myProvider.getOfflineDocUrl(url) != null) { + myDownloadButton.setEnabled(true); + return; + } + } + myDownloadButton.setEnabled(false); + } + + private void downloadDocumentation() { + for (String url : getDocUrls()) { + String offlineDocUrl = myProvider.getOfflineDocUrl(url); + if (offlineDocUrl != null) { + String targetFile = myProvider.downloadOfflineDoc(myProject, offlineDocUrl, getRootPane()); + myDocUrlListModel.addUrl(targetFile); + return; + } + } } private class MyTableCellRenderer extends DefaultTableCellRenderer { @@ -454,10 +487,13 @@ public class EditLibraryDialog extends DialogWrapper { } public int addUrl(String url) { - myDocUrls.add(url); - int newIndex = myDocUrls.indexOf(url); - fireIntervalAdded(this, newIndex, newIndex); - return newIndex; + if (!myDocUrls.contains(url)) { + myDocUrls.add(url); + int newIndex = myDocUrls.indexOf(url); + fireIntervalAdded(this, newIndex, newIndex); + return newIndex; + } + return myDocUrls.indexOf(url); } public int indexOf(String url) { @@ -491,6 +527,7 @@ public class EditLibraryDialog extends DialogWrapper { int index = myDocUrlListModel.addUrl(url); myDocUrlList.ensureIndexIsVisible(index); myDocUrlList.setSelectedIndex(index); + checkDownloadOfflineDocEnabled(); } } diff --git a/platform/lang-impl/src/com/intellij/openapi/fileTypes/impl/NativeFileIconProvider.java b/platform/lang-impl/src/com/intellij/openapi/fileTypes/impl/NativeFileIconProvider.java index 1e2c24b65b1c..bd0627b22552 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileTypes/impl/NativeFileIconProvider.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileTypes/impl/NativeFileIconProvider.java @@ -17,8 +17,6 @@ package com.intellij.openapi.fileTypes.impl; import com.intellij.ide.FileIconProvider; -import com.intellij.openapi.fileTypes.NativeFileType; -import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.VirtualFile; diff --git a/platform/lvcs-impl/src/com/intellij/history/core/ChangeList.java b/platform/lvcs-impl/src/com/intellij/history/core/ChangeList.java index 19f07359b878..0bf5662a47fc 100644 --- a/platform/lvcs-impl/src/com/intellij/history/core/ChangeList.java +++ b/platform/lvcs-impl/src/com/intellij/history/core/ChangeList.java @@ -23,6 +23,7 @@ import com.intellij.history.utils.LocalHistoryLog; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Clock; import com.intellij.util.Consumer; +import gnu.trove.TIntHashSet; import org.jetbrains.annotations.TestOnly; import java.util.ArrayList; @@ -114,6 +115,8 @@ public class ChangeList { return new Iterable() { public Iterator iterator() { return new Iterator() { + private final TIntHashSet recursionGuard = new TIntHashSet(1000); + private ChangeSetHolder currentBlock; private ChangeSet next = fetchNext(); @@ -134,13 +137,13 @@ public class ChangeList { currentBlock = new ChangeSetHolder(-1, myCurrentChangeSet); } else { - currentBlock = myStorage.readPrevious(-1); + currentBlock = myStorage.readPrevious(-1, recursionGuard); } } } else { synchronized (ChangeList.this) { - currentBlock = myStorage.readPrevious(currentBlock.id); + currentBlock = myStorage.readPrevious(currentBlock.id, recursionGuard); } } if (currentBlock == null) return null; diff --git a/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorage.java b/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorage.java index a8e05a5b66b8..70f80f5566d9 100644 --- a/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorage.java +++ b/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorage.java @@ -18,6 +18,7 @@ package com.intellij.history.core; import com.intellij.history.core.changes.ChangeSet; import com.intellij.util.Consumer; +import gnu.trove.TIntHashSet; import org.jetbrains.annotations.Nullable; public interface ChangeListStorage { @@ -26,7 +27,7 @@ public interface ChangeListStorage { long nextId(); @Nullable - ChangeSetHolder readPrevious(int id); + ChangeSetHolder readPrevious(int id, TIntHashSet recursionGuard); void purge(long period, int intervalBetweenActivities, Consumer processor); diff --git a/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java b/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java index 3d74aaeb0cf4..241ed223ece2 100644 --- a/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java +++ b/platform/lvcs-impl/src/com/intellij/history/core/ChangeListStorageImpl.java @@ -18,12 +18,20 @@ package com.intellij.history.core; import com.intellij.history.core.changes.ChangeSet; import com.intellij.history.utils.LocalHistoryLog; +import com.intellij.ide.BrowserUtil; +import com.intellij.ide.actions.ShowFilePathAction; +import com.intellij.notification.*; +import com.intellij.openapi.application.PathManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.util.Consumer; import com.intellij.util.io.storage.AbstractStorage; +import gnu.trove.TIntHashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.swing.event.HyperlinkEvent; import java.io.DataInputStream; import java.io.File; import java.io.IOException; @@ -33,19 +41,19 @@ public class ChangeListStorageImpl implements ChangeListStorage { private static final int VERSION = 5; private static final String STORAGE_FILE = "changes"; - private final LocalHistoryStorage myStorage; + private final File myStorageDir; + private LocalHistoryStorage myStorage; - public ChangeListStorageImpl(File storageDir) { - try { - myStorage = createStorage(storageDir); - } - catch (IOException e) { - throw handleError(e); - } + private boolean isCompletelyBroken = false; + + public ChangeListStorageImpl(File storageDir) throws IOException { + myStorageDir = storageDir; + myStorage = createStorage(myStorageDir); } private static LocalHistoryStorage createStorage(File storageDir) throws IOException { String path = storageDir.getPath() + "/" + STORAGE_FILE; + LocalHistoryStorage result = new LocalHistoryStorage(path); long fsTimestamp = getVFSTimestamp(); @@ -74,26 +82,63 @@ public class ChangeListStorageImpl implements ChangeListStorage { return ((PersistentFS)ManagingFS.getInstance()).getCreationTimestamp(); } - private RuntimeException handleError(Throwable e) { + private void handleError(Throwable e) { long storageTimestamp = -1; - try { - if (myStorage != null) { - myStorage.setVersion(-1); - myStorage.force(); - storageTimestamp = myStorage.getFSTimestamp(); - } + long vfsTimestamp = getVFSTimestamp(); + long timestamp = System.currentTimeMillis(); + + try { + storageTimestamp = myStorage.getFSTimestamp(); + } + catch (Exception ex) { + LocalHistoryLog.LOG.warn("cannot read storage timestamp", ex); + } + + LocalHistoryLog.LOG.warn("Local history is broken" + + "(version:" + VERSION + + ",current timestamp:" + timestamp + + ",storage timestamp:" + storageTimestamp + + ",vfs timestamp:" + vfsTimestamp + ")", e); + + myStorage.dispose(); + try { + FileUtil.delete(myStorageDir); + myStorage = createStorage(myStorageDir); } catch (Throwable ex) { - LocalHistoryLog.LOG.error("cannot mark storage as broken", ex); + LocalHistoryLog.LOG.warn("cannot recreate storage", ex); + isCompletelyBroken = true; } - long vfsTimestamp = getVFSTimestamp(); - long timestamp = System.currentTimeMillis() ; - throw new RuntimeException("Local history is broken and will be rebuilt after restart " + - "(version:" + VERSION + - ",current timestamp:" + timestamp + - ",storage timestamp:" + storageTimestamp + - ",vfs timestamp:" + vfsTimestamp+ ")", e); + + notifyUser("Local History storage file has become corrupted and was rebuilt."); + } + + public static void notifyUser(String message) { + final String logFile = PathManager.getLogPath(); + + Notifications.Bus.notify(new Notification(Notifications.SYSTEM_MESSAGES_GROUP_ID, + "Local History is broken", + message + "
" + + "
" + + "Please create a
YouTrack issue
" + + "and attach log files from
" + logFile, + NotificationType.ERROR, + new NotificationListener() { + @Override + public void hyperlinkUpdate(@NotNull Notification notification, + @NotNull HyperlinkEvent event) { + if ("url".equals(event.getDescription())) { + BrowserUtil.launchBrowser("http://youtrack.jetbrains.net/issues/#newissue=yes"); + } + else { + File file = new File(logFile); + ShowFilePathAction.open(file, new File(logFile)); + } + } + }), + NotificationDisplayType.STICKY_BALLOON, + null); } public synchronized void close() { @@ -101,32 +146,47 @@ public class ChangeListStorageImpl implements ChangeListStorage { } public synchronized long nextId() { - return myStorage.nextId(); - } + if (isCompletelyBroken) return 0; - public synchronized ChangeSetHolder readPrevious(int id) { - int prevId = id == -1 ? myStorage.getLastRecord() : myStorage.getPrevRecord(id); - if (prevId == 0) return null; - - return doReadBlock(prevId); - } - - private ChangeSetHolder doReadBlock(int id) { try { - DataInputStream in = myStorage.readStream(id); - try { - return new ChangeSetHolder(id, new ChangeSet(in)); - } - finally { - in.close(); - } + return myStorage.nextId(); } catch (Throwable e) { - throw handleError(e); + handleError(e); + return myStorage.nextId(); + } + } + + @Nullable + public synchronized ChangeSetHolder readPrevious(int id, TIntHashSet recursionGuard) { + if (isCompletelyBroken) return null; + + try { + int prevId = id == -1 ? myStorage.getLastRecord() : doReadPrevSafely(id, recursionGuard); + if (prevId == 0) return null; + + return doReadBlock(prevId); + } + catch (Throwable e) { + handleError(e); + return null; + } + } + + @NotNull + private ChangeSetHolder doReadBlock(int id) throws IOException { + DataInputStream in = myStorage.readStream(id); + try { + return new ChangeSetHolder(id, new ChangeSet(in)); + } + finally { + in.close(); } } public synchronized void writeNextSet(ChangeSet changeSet) { + if (isCompletelyBroken) return; + try { int id = myStorage.createNextRecord(); AbstractStorage.StorageDataOutput out = myStorage.writeStream(id); @@ -139,27 +199,32 @@ public class ChangeListStorageImpl implements ChangeListStorage { myStorage.force(); } catch (IOException e) { - throw handleError(e); + handleError(e); } } public synchronized void purge(long period, int intervalBetweenActivities, Consumer processor) { - int eachBlockId = findFirstObsoleteBlock(period, intervalBetweenActivities); + if (isCompletelyBroken) return; + + TIntHashSet recursionGuard = new TIntHashSet(1000); + try { + int eachBlockId = findFirstObsoleteBlock(period, intervalBetweenActivities, recursionGuard); + while (eachBlockId != 0) { processor.consume(doReadBlock(eachBlockId).changeSet); int toDelete = eachBlockId; - eachBlockId = myStorage.getPrevRecord(eachBlockId); + eachBlockId = doReadPrevSafely(eachBlockId, recursionGuard); myStorage.deleteRecord(toDelete); } myStorage.force(); } catch (IOException e) { - throw handleError(e); + handleError(e); } } - private int findFirstObsoleteBlock(long period, int intervalBetweenActivities) { + private int findFirstObsoleteBlock(long period, int intervalBetweenActivities, TIntHashSet recursionGuard) throws IOException { long prevTimestamp = 0; long length = 0; @@ -176,9 +241,16 @@ public class ChangeListStorageImpl implements ChangeListStorage { if (length >= period) return last; - last = myStorage.getPrevRecord(last); + last = doReadPrevSafely(last, recursionGuard); } return 0; } + + private int doReadPrevSafely(int id, TIntHashSet recursionGuard) throws IOException { + recursionGuard.add(id); + int prev = myStorage.getPrevRecord(id); + if (!recursionGuard.add(prev)) throw new IOException("Recursive records found"); + return prev; + } } \ No newline at end of file diff --git a/platform/lvcs-impl/testSrc/com/intellij/history/core/InMemoryChangeListStorage.java b/platform/lvcs-impl/src/com/intellij/history/core/InMemoryChangeListStorage.java similarity index 90% rename from platform/lvcs-impl/testSrc/com/intellij/history/core/InMemoryChangeListStorage.java rename to platform/lvcs-impl/src/com/intellij/history/core/InMemoryChangeListStorage.java index 5a24f4e2c26f..5c9e04d5f89e 100644 --- a/platform/lvcs-impl/testSrc/com/intellij/history/core/InMemoryChangeListStorage.java +++ b/platform/lvcs-impl/src/com/intellij/history/core/InMemoryChangeListStorage.java @@ -17,6 +17,8 @@ package com.intellij.history.core; import com.intellij.history.core.changes.ChangeSet; import com.intellij.util.Consumer; +import gnu.trove.TIntHashSet; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -35,7 +37,8 @@ public class InMemoryChangeListStorage implements ChangeListStorage { } @Override - public ChangeSetHolder readPrevious(int id) { + @Nullable + public ChangeSetHolder readPrevious(int id, TIntHashSet recursionGuard) { if (mySets.isEmpty()) return null; if (id == -1) return new ChangeSetHolder(mySets.size() - 1, mySets.get(mySets.size() - 1)); return id == 0 ? null : new ChangeSetHolder(id -1, mySets.get(id - 1)); @@ -48,6 +51,5 @@ public class InMemoryChangeListStorage implements ChangeListStorage { @Override public void purge(long period, int intervalBetweenActivities, Consumer processor) { - throw new UnsupportedOperationException(); } } diff --git a/platform/lvcs-impl/src/com/intellij/history/integration/LocalHistoryImpl.java b/platform/lvcs-impl/src/com/intellij/history/integration/LocalHistoryImpl.java index aa6196b17c7f..ff9d30eaecc1 100644 --- a/platform/lvcs-impl/src/com/intellij/history/integration/LocalHistoryImpl.java +++ b/platform/lvcs-impl/src/com/intellij/history/integration/LocalHistoryImpl.java @@ -70,7 +70,16 @@ public class LocalHistoryImpl extends LocalHistory implements ApplicationCompone } protected void initHistory() { - myChangeList = new ChangeList(new ChangeListStorageImpl(getStorageDir())); + ChangeListStorage storage; + try { + storage = new ChangeListStorageImpl(getStorageDir()); + } + catch (Throwable e) { + LocalHistoryLog.LOG.warn("cannot create storage, in-memory implementation will be used", e); + storage = new InMemoryChangeListStorage(); + ChangeListStorageImpl.notifyUser("Local History storage file cannot be created. In-memory storage will be used."); + } + myChangeList = new ChangeList(storage); myVcs = new LocalHistoryFacade(myChangeList); myGateway = new IdeaGateway(); diff --git a/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/HistoryDialog.java b/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/HistoryDialog.java index 3fbf95bf8a47..fb4da97d1fc8 100644 --- a/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/HistoryDialog.java +++ b/platform/lvcs-impl/src/com/intellij/history/integration/ui/views/HistoryDialog.java @@ -467,7 +467,7 @@ public abstract class HistoryDialog extends FrameW return; } - CreatePatchConfigurationPanel p = new CreatePatchConfigurationPanel(); + CreatePatchConfigurationPanel p = new CreatePatchConfigurationPanel(myProject); p.setFileName(getDefaultPatchFile()); if (!showAsDialog(p)) return; myModel.createPatch(p.getFileName(), p.isReversePatch()); diff --git a/platform/platform-api/src/com/intellij/notification/Notifications.java b/platform/platform-api/src/com/intellij/notification/Notifications.java index 1b214dec7cb7..468b1ce2fcea 100644 --- a/platform/platform-api/src/com/intellij/notification/Notifications.java +++ b/platform/platform-api/src/com/intellij/notification/Notifications.java @@ -16,6 +16,7 @@ package com.intellij.notification; import com.intellij.ide.FrameStateManager; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; @@ -68,8 +69,9 @@ public interface Notifications { FrameStateManager.getInstance().getApplicationActive().doWhenDone(new Runnable() { @Override public void run() { + Application app = ApplicationManager.getApplication(); final MessageBus bus = - project == null ? ApplicationManager.getApplication().getMessageBus() : (project.isDisposed() ? null : project.getMessageBus()); + project == null ? (app.isDisposed() ? null : app.getMessageBus()) : (project.isDisposed() ? null : project.getMessageBus()); if (bus != null) { _notify(notification, defaultDisplayType, bus); } diff --git a/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java b/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java index 23ac76ea5acf..24c8ad2fb104 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java +++ b/platform/platform-api/src/com/intellij/openapi/fileEditor/OpenFileDescriptor.java @@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.editor.*; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.INativeFileType; import com.intellij.openapi.fileTypes.NativeFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -119,7 +120,7 @@ public class OpenFileDescriptor implements Navigatable { FileType type = FileTypeManager.getInstance().getKnownFileTypeOrAssociate(myFile); if (type == null || !myFile.isValid()) return false; - if (type instanceof NativeFileType) { + if (type instanceof INativeFileType) { return NativeFileType.openAssociatedApplication(myFile); } diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/INativeFileType.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/INativeFileType.java new file mode 100644 index 000000000000..842b009da270 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/INativeFileType.java @@ -0,0 +1,4 @@ +package com.intellij.openapi.fileTypes; + +public interface INativeFileType extends FileType { +} diff --git a/platform/platform-api/src/com/intellij/openapi/fileTypes/NativeFileType.java b/platform/platform-api/src/com/intellij/openapi/fileTypes/NativeFileType.java index 63054d33e92a..57a2c754d9f9 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileTypes/NativeFileType.java +++ b/platform/platform-api/src/com/intellij/openapi/fileTypes/NativeFileType.java @@ -29,7 +29,7 @@ import java.util.List; /** * @author yole */ -public class NativeFileType implements FileType { +public class NativeFileType implements INativeFileType { private static final Icon ICON = IconLoader.getIcon("/fileTypes/custom.png"); private NativeFileType() { } diff --git a/platform/platform-api/src/com/intellij/openapi/util/ClassConditionKey.java b/platform/platform-api/src/com/intellij/openapi/util/ClassConditionKey.java new file mode 100644 index 000000000000..fb47b5f635e3 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/util/ClassConditionKey.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2011 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.openapi.util; + +import com.intellij.util.InstanceofCheckerGenerator; + +/** + * @author peter + */ +public class ClassConditionKey { + private final Condition myCondition; + private final Class myConditionClass; + + private ClassConditionKey(Class aClass) { + myCondition = InstanceofCheckerGenerator.getInstance().getInstanceofChecker(aClass); + myConditionClass = aClass; + } + + public static ClassConditionKey create(Class aClass) { + return new ClassConditionKey(aClass); + } + + public boolean isInstance(Object o) { + return myCondition.value(o); + } + + @Override + public String toString() { + return myConditionClass.getName(); + } +} diff --git a/platform/platform-api/src/com/intellij/ui/switcher/SwitchManager.java b/platform/platform-api/src/com/intellij/ui/switcher/SwitchManager.java index 4df13d60182c..703d55e3f019 100644 --- a/platform/platform-api/src/com/intellij/ui/switcher/SwitchManager.java +++ b/platform/platform-api/src/com/intellij/ui/switcher/SwitchManager.java @@ -16,6 +16,7 @@ package com.intellij.ui.switcher; import com.intellij.ide.DataManager; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.AnActionListener; import com.intellij.openapi.components.ProjectComponent; @@ -32,24 +33,24 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.util.HashSet; import java.util.Set; public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnActionListener { - - private Project myProject; + private final Project myProject; private QuickAccessSettings myQa; private SwitchingSession mySession; private boolean myWaitingForAutoInitSession; - private Alarm myInitSessionAlarm = new Alarm(); + private final Alarm myInitSessionAlarm = new Alarm(); private KeyEvent myAutoInitSessionEvent; - private Set mySwitchActions = new HashSet(); + private final Set mySwitchActions = new HashSet(); - private Set myFadingWay = new HashSet(); + private final Set myFadingAway = new HashSet(); public SwitchManager(Project project, QuickAccessSettings quickAccess, ActionManager actionManager) { myProject = project; @@ -62,6 +63,14 @@ public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnAc mySwitchActions.add(actionManager.getAction(QuickAccessSettings.SWITCH_LEFT)); mySwitchActions.add(actionManager.getAction(QuickAccessSettings.SWITCH_RIGHT)); mySwitchActions.add(actionManager.getAction(QuickAccessSettings.SWITCH_APPLY)); + + KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); + Disposer.register(project, new Disposable() { + @Override + public void dispose() { + KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(SwitchManager.this); + } + }); } public void beforeActionPerformed(AnAction action, DataContext dataContext, AnActionEvent event) { @@ -77,7 +86,7 @@ public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnAc } public boolean dispatchKeyEvent(KeyEvent e) { - if (!myQa.isEnabled()) return false; + if (!myQa.isEnabled()) return false; if (mySession != null && !mySession.isFinished()) return false; @@ -109,13 +118,15 @@ public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnAc }); } }; - if (myFadingWay.size() == 0) { + if (myFadingAway.isEmpty()) { myInitSessionAlarm.addRequest(initRunnable, Registry.intValue("actionSystem.keyGestureHoldTime")); - } else { + } + else { initRunnable.run(); } } - } else { + } + else { if (myWaitingForAutoInitSession) { cancelWaitingForAutoInit(); } @@ -147,33 +158,30 @@ public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnAc int mask = 0; for (Integer each : modifierCodes) { if (each == KeyEvent.VK_SHIFT) { - mask |= KeyEvent.SHIFT_MASK; + mask |= InputEvent.SHIFT_MASK; } if (each == KeyEvent.VK_CONTROL) { - mask |= KeyEvent.CTRL_MASK; + mask |= InputEvent.CTRL_MASK; } if (each == KeyEvent.VK_META) { - mask |= KeyEvent.META_MASK; + mask |= InputEvent.META_MASK; } if (each == KeyEvent.VK_ALT) { - mask |= KeyEvent.ALT_MASK; + mask |= InputEvent.ALT_MASK; } } return (modifiers ^ mask) == 0; } - public void initComponent() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); } public void disposeComponent() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this); myQa = null; } @@ -234,7 +242,8 @@ public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnAc }); } }); - } else { + } + else { result.setDone(); } @@ -246,15 +255,14 @@ public class SwitchManager implements ProjectComponent, KeyEventDispatcher, AnAc } public boolean isSelectionWasMoved() { - if (!isSessionActive()) return false; - return mySession.isSelectionWasMoved(); + return isSessionActive() && mySession.isSelectionWasMoved(); } public void addFadingAway(SwitchingSession session) { - myFadingWay.add(session); + myFadingAway.add(session); } public void removeFadingAway(SwitchingSession session) { - myFadingWay.remove(session); + myFadingAway.remove(session); } } diff --git a/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java b/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java index 0aff01def2c9..00f4cb9ea63d 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/VMOptions.java @@ -41,7 +41,8 @@ public class VMOptions { @NonNls private static final Pattern XMX_PATTERN = Pattern.compile(XMX_OPTION + MEM_SIZE_EXPR); @NonNls private static final Pattern PERM_GEN_PATTERN = Pattern.compile(PERM_GEN_OPTION + MEM_SIZE_EXPR); - @NonNls private static final Pattern MAC_OS_VM_OPTIONS_PATTERN = Pattern.compile("(VMOptions(?:(?:\\s*)(?:(?:\\s*))*))(.*)()"); + @NonNls public static final String MAC_ARCH_VMOPTIONS = SystemInfo.is64Bit ? "VMOptions.x86_64" : "VMOptions.i386"; + @NonNls private static final Pattern MAC_OS_VM_OPTIONS_PATTERN = Pattern.compile("(" + MAC_ARCH_VMOPTIONS + "(?:(?:\\s*)(?:(?:\\s*))*))(.*)()"); @NonNls private static final String INFO_PLIST = "/Contents/Info.plist"; diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java index 64262238af3a..0bfe3de7e8e9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/FileTypeManagerImpl.java @@ -36,9 +36,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.ArrayUtil; -import com.intellij.util.PatternUtil; import com.intellij.util.PlatformUtils; -import com.intellij.util.containers.ConcurrentHashSet; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import gnu.trove.THashMap; @@ -52,7 +50,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.File; import java.util.*; -import java.util.regex.Pattern; /** * @author Yura Cangea @@ -63,12 +60,9 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME private final Set myDefaultTypes = new THashSet(); private final ArrayList mySpecialFileTypes = new ArrayList(); - private final ArrayList myIgnorePatterns = new ArrayList(); private FileTypeAssocTable myPatternsTable = new FileTypeAssocTable(); - private final Set myIgnoredFileMasksSet = new LinkedHashSet(); - private final Set myNotIgnoredFiles = new ConcurrentHashSet(); - private final Set myIgnoredFiles = new ConcurrentHashSet(); + private final IgnoredPatternSet myIgnoredPatterns = new IgnoredPatternSet(); private final FileTypeAssocTable myInitialAssociations = new FileTypeAssocTable(); private final Map myUnresolvedMappings = new THashMap(); private final Map myUnresolvedRemovedMappings = new THashMap(); @@ -352,67 +346,31 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME @NotNull public String getIgnoredFilesList() { - StringBuilder sb = new StringBuilder(); - for (String ignoreMask : myIgnoredFileMasksSet) { - sb.append(ignoreMask); - sb.append(';'); + final Set masks = myIgnoredPatterns.getIgnoreMasks(); + if (masks.isEmpty()) { + return ""; } - return sb.toString(); + + return StringUtil.join(masks, ";") + ";"; } public void setIgnoredFilesList(@NotNull String list) { fireBeforeFileTypesChanged(); - setIgnoredFilesListWithoutNotification(list); - + myIgnoredPatterns.setIgnoreMasks(list); fireFileTypesChanged(); } - private void setIgnoredFilesListWithoutNotification(String list) { - myIgnoredFileMasksSet.clear(); - myIgnorePatterns.clear(); - - StringTokenizer tokenizer = new StringTokenizer(list, ";"); - while (tokenizer.hasMoreTokens()) { - String ignoredFile = tokenizer.nextToken(); - if (ignoredFile != null && !myIgnoredFileMasksSet.contains(ignoredFile)) { - if (!myIgnoredFileMasksSet.contains(ignoredFile)) { - myIgnorePatterns.add(PatternUtil.fromMask(ignoredFile)); - } - myIgnoredFileMasksSet.add(ignoredFile); - } - } - - //[mike] - //To make async delete work. See FileUtil.asyncDelete. - //Quite a hack, but still we need to have some name, which - //won't be catched by VF for sure. - //noinspection HardCodedStringLiteral - Pattern p = Pattern.compile(".*\\.__del__"); - myIgnorePatterns.add(p); - } - public boolean isIgnoredFilesListEqualToCurrent(String list) { Set tempSet = new THashSet(); StringTokenizer tokenizer = new StringTokenizer(list, ";"); while (tokenizer.hasMoreTokens()) { tempSet.add(tokenizer.nextToken()); } - return tempSet.equals(myIgnoredFileMasksSet); + return tempSet.equals(myIgnoredPatterns.getIgnoreMasks()); } public boolean isFileIgnored(@NotNull String name) { - if (myNotIgnoredFiles.contains(name)) return false; - if (myIgnoredFiles.contains(name)) return true; - - for (Pattern pattern : myIgnorePatterns) { - if (pattern.matcher(name).matches()) { - myIgnoredFiles.add(name); - return true; - } - } - - myNotIgnoredFiles.add(name); - return false; + return myIgnoredPatterns.isIgnored(name); } @Override @@ -453,11 +411,7 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME } public void fireFileTypesChanged() { - myNotIgnoredFiles.clear(); - myIgnoredFiles.clear(); - - final FileTypeEvent event = new FileTypeEvent(this); - myMessageBus.syncPublisher(AppTopics.FILE_TYPES).fileTypesChanged(event); + myMessageBus.syncPublisher(AppTopics.FILE_TYPES).fileTypesChanged(new FileTypeEvent(this)); } private final Map myAdapters = new HashMap(); @@ -504,7 +458,7 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME } } else if (ELEMENT_IGNOREFILES.equals(e.getName())) { - setIgnoredFilesListWithoutNotification(e.getAttributeValue(ATTRIBUTE_LIST)); + myIgnoredPatterns.setIgnoreMasks(e.getAttributeValue(ATTRIBUTE_LIST)); } else if (AbstractFileType.ELEMENT_EXTENSIONMAP.equals(e.getName())) { readGlobalMappings(e); @@ -583,10 +537,7 @@ public class FileTypeManagerImpl extends FileTypeManagerEx implements NamedJDOME } private void addIgnore(@NonNls final String ignoreMask) { - if (!myIgnoredFileMasksSet.contains(ignoreMask)) { - myIgnorePatterns.add(PatternUtil.fromMask(ignoreMask)); - myIgnoredFileMasksSet.add(ignoreMask); - } + myIgnoredPatterns.addIgnoreMask(ignoreMask); } private void restoreStandardFileExtensions() { diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java new file mode 100644 index 000000000000..47ad35498d9a --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/impl/IgnoredPatternSet.java @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2011 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.openapi.fileTypes.impl; + +import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.StringTokenizer; + +/** + * @author peter + */ +public class IgnoredPatternSet { + private final Set myMasks = new LinkedHashSet(); + private final FileTypeAssocTable myIgnorePatterns = new FileTypeAssocTable().copy(); + + Set getIgnoreMasks() { + return Collections.unmodifiableSet(myMasks); + } + + void setIgnoreMasks(@NotNull String list) { + clearPatterns(); + + StringTokenizer tokenizer = new StringTokenizer(list, ";"); + while (tokenizer.hasMoreTokens()) { + String ignoredFile = tokenizer.nextToken(); + if (ignoredFile != null) { + addIgnoreMask(ignoredFile); + } + } + + } + + void addIgnoreMask(@NotNull String ignoredFile) { + if (myIgnorePatterns.findAssociatedFileType(ignoredFile) == null) { + myMasks.add(ignoredFile); + myIgnorePatterns.addAssociation(FileTypeManager.parseFromString(ignoredFile), Boolean.TRUE); + } + } + + boolean isIgnored(@NotNull String fileName) { + if (myIgnorePatterns.findAssociatedFileType(fileName) == Boolean.TRUE) { + return true; + } + + //Quite a hack, but still we need to have some name, which + //won't be catched by VFS for sure. + return fileName.endsWith(FileUtil.ASYNC_DELETE_EXTENSION); + } + + void clearPatterns() { + myMasks.clear(); + myIgnorePatterns.removeAllAssociations(Boolean.TRUE); + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/DefaultProject.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/DefaultProject.java index e9247d2823ed..05a8fa79a460 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/DefaultProject.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/DefaultProject.java @@ -19,8 +19,7 @@ package com.intellij.openapi.project.impl; * @author peter */ public class DefaultProject extends ProjectImpl { - protected DefaultProject(ProjectManagerImpl manager, String filePath, boolean isOptimiseTestLoadSpeed, - String projectName) { + protected DefaultProject(ProjectManagerImpl manager, String filePath, boolean isOptimiseTestLoadSpeed, String projectName) { super(manager, filePath, isOptimiseTestLoadSpeed, projectName); } diff --git a/platform/platform-resources-en/src/messages/VcsBundle.properties b/platform/platform-resources-en/src/messages/VcsBundle.properties index a6d3e11aba3b..7ca54b484685 100644 --- a/platform/platform-resources-en/src/messages/VcsBundle.properties +++ b/platform/platform-resources-en/src/messages/VcsBundle.properties @@ -272,7 +272,7 @@ commit.dialog.failed.commit.template=Failed commit: {0} commit.dialog.completed.successfully=Completed successfully commit.dialog.refresh.files=Synchronizing files... commit.dialog.rejected.commit.template=Rejected commit: {0} -commit.dialog.changelist.label=Change list: +commit.dialog.changelist.label=Change lis&t: commit.dialog.changed.files.label=Changed &Files commit.wait.util.synced.message=Please wait until VCS synchronization is finished. commit.wait.util.synced.title=Finishing VCS refresh @@ -548,3 +548,4 @@ line.annotation.aspect.author=Author line.annotation.aspect.date=Date line.annotation.aspect.revision=Revision annotation.commit.number=Commit number +create.patch.file.path=&Patch file: diff --git a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml index dcbdc60e0cb7..84a0e91e4ab8 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensionPoints.xml @@ -112,4 +112,5 @@ + diff --git a/platform/platform-resources/src/META-INF/XmlActions.xml b/platform/platform-resources/src/META-INF/XmlActions.xml index bec7f4d3634e..c4ff3781b549 100644 --- a/platform/platform-resources/src/META-INF/XmlActions.xml +++ b/platform/platform-resources/src/META-INF/XmlActions.xml @@ -62,6 +62,12 @@ + + + + diff --git a/platform/platform-resources/src/META-INF/XmlPlugin.xml b/platform/platform-resources/src/META-INF/XmlPlugin.xml index f298a0f4205b..7a6ad7f4de0f 100644 --- a/platform/platform-resources/src/META-INF/XmlPlugin.xml +++ b/platform/platform-resources/src/META-INF/XmlPlugin.xml @@ -43,6 +43,8 @@ + + diff --git a/platform/testFramework/src/_LastInSuiteTest.java b/platform/testFramework/src/_LastInSuiteTest.java index 13cd6b9eff84..6ef2c2afd273 100644 --- a/platform/testFramework/src/_LastInSuiteTest.java +++ b/platform/testFramework/src/_LastInSuiteTest.java @@ -37,8 +37,8 @@ public class _LastInSuiteTest extends TestCase { }.execute().throwException(); final Application application = ApplicationManager.getApplication(); - LeakHunter.checkProjectLeak(application); + // disposes default project too UIUtil.invokeAndWaitIfNeeded(new Runnable() { @Override public void run() { @@ -51,6 +51,7 @@ public class _LastInSuiteTest extends TestCase { } }); + LeakHunter.checkProjectLeak(application); Disposer.assertIsEmpty(); } } diff --git a/platform/testFramework/testFramework.iml b/platform/testFramework/testFramework.iml index b9e5a649297e..4182d8a35f18 100644 --- a/platform/testFramework/testFramework.iml +++ b/platform/testFramework/testFramework.iml @@ -21,7 +21,7 @@ - + diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index 2407d5463010..2b11d89dd871 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -53,6 +53,7 @@ public class FileUtil { // do not use channels to copy files larger than 5 Mb because of possible MapFailed error private static final long CHANNELS_COPYING_LIMIT = 5L * 1024L * 1024L; private static String ourCanonicalTempPathCache = null; + public static final String ASYNC_DELETE_EXTENSION = ".__del__"; @Nullable public static String getRelativePath(File base, File file) { @@ -488,7 +489,7 @@ public class FileUtil { private static File getTempFile(String originalFileName, File parent) { int randomSuffix = (int)(System.currentTimeMillis() % 1000); for (int i = randomSuffix; ; i++) { - @NonNls String name = "___" + originalFileName + i + ".__del__"; + @NonNls String name = "___" + originalFileName + i + ASYNC_DELETE_EXTENSION; File tempFile = new File(parent, name); if (!tempFile.exists()) return tempFile; } diff --git a/platform/util/src/com/intellij/util/TreeNodeState.java b/platform/util/src/com/intellij/util/TreeNodeState.java new file mode 100644 index 000000000000..0609d5cb7ebf --- /dev/null +++ b/platform/util/src/com/intellij/util/TreeNodeState.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-2011 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.util; + +/** + * @author irengrig + * Date: 2/4/11 + * Time: 3:36 PM + */ +public enum TreeNodeState { + SELECTED,CLEAR,HAVE_SELECTED_ABOVE,HAVE_SELECTED_BELOW +} diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java index 42ac02e16028..f72518bf367f 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchCommitExecutor.java @@ -112,7 +112,7 @@ public class CreatePatchCommitExecutor implements CommitExecutorWithHelp, Projec } private class CreatePatchCommitSession implements CommitSession { - private final CreatePatchConfigurationPanel myPanel = new CreatePatchConfigurationPanel(); + private final CreatePatchConfigurationPanel myPanel = new CreatePatchConfigurationPanel(myProject); @Nullable public JComponent getAdditionalConfigurationUI() { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.form b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.form index 25f224b6e0df..3626819b8639 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.form +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.form @@ -14,7 +14,7 @@ - + diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java index c7ed002c3f64..b0fb6d2d886a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/CreatePatchConfigurationPanel.java @@ -22,7 +22,17 @@ */ package com.intellij.openapi.vcs.changes.patch; +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserFactory; +import com.intellij.openapi.fileChooser.FileSaverDescriptor; +import com.intellij.openapi.fileChooser.FileSaverDialog; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileWrapper; import com.intellij.util.Consumer; import javax.swing.*; @@ -37,15 +47,22 @@ public class CreatePatchConfigurationPanel { private JLabel myErrorLabel; private Consumer myOkEnabledListener; - public CreatePatchConfigurationPanel() { + public CreatePatchConfigurationPanel(final Project project) { myFileNameField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setSelectedFile(new File(myFileNameField.getText())); - if (fileChooser.showSaveDialog(myFileNameField) != JFileChooser.APPROVE_OPTION) { - return; + final FileSaverDialog dialog = + FileChooserFactory.getInstance().createSaveFileDialog( + new FileSaverDescriptor("Save patch to", ""), myPanel); + final String path = FileUtil.toSystemIndependentName(myFileNameField.getText().trim()); + final int idx = path.lastIndexOf("/"); + VirtualFile baseDir = idx == -1 ? project.getBaseDir() : + (LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(path.substring(0, idx)))); + baseDir = baseDir == null ? project.getBaseDir() : baseDir; + final String name = idx == -1 ? path : path.substring(idx + 1); + final VirtualFileWrapper fileWrapper = dialog.save(baseDir, name); + if (fileWrapper != null) { + myFileNameField.setText(fileWrapper.getFile().getPath()); } - myFileNameField.setText(fileChooser.getSelectedFile().getPath()); } }); @@ -53,6 +70,7 @@ public class CreatePatchConfigurationPanel { public void inputMethodTextChanged(final InputMethodEvent event) { checkName(); } + public void caretPositionChanged(final InputMethodEvent event) { } }); @@ -60,9 +78,11 @@ public class CreatePatchConfigurationPanel { public void keyTyped(final KeyEvent e) { checkName(); } + public void keyPressed(final KeyEvent e) { checkName(); } + public void keyReleased(final KeyEvent e) { checkName(); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java index 633a3df95a5b..eb3fb4c5766c 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/MultipleChangeListBrowser.java @@ -260,7 +260,6 @@ public class MultipleChangeListBrowser extends ChangesBrowser { add(myChooser, BorderLayout.CENTER); JLabel label = new JLabel(VcsBundle.message("commit.dialog.changelist.label")); - label.setDisplayedMnemonic('l'); label.setLabelFor(myChooser); add(label, BorderLayout.WEST); } diff --git a/platform/vcs-impl/src/com/intellij/util/treeWithCheckedNodes/SelectedState.java b/platform/vcs-impl/src/com/intellij/util/treeWithCheckedNodes/SelectedState.java new file mode 100644 index 000000000000..76fd0120a5e5 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/util/treeWithCheckedNodes/SelectedState.java @@ -0,0 +1,94 @@ +/* + * Copyright 2000-2011 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.util.treeWithCheckedNodes; + +import com.intellij.util.Processor; +import com.intellij.util.TreeNodeState; +import com.intellij.util.containers.SLRUMap; +import com.intellij.util.containers.hash.HashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +/** +* @author irengrig +* Date: 2/7/11 +* Time: 10:40 AM + * + * We can have only limited number of nodes selected in a tree; + * and children of selected nodes (any level) cannot change their state + * used together with {@link SelectionManager} +*/ +public class SelectedState { + private final Set mySelected; + private final SLRUMap myCache; + private final int mySelectedSize; + + public SelectedState(final int selectedSize, final int queueSize) { + mySelectedSize = selectedSize; + assert queueSize > 0; + mySelected = new HashSet(); + myCache = new SLRUMap(queueSize,queueSize); + } + + @Nullable + public TreeNodeState get(final T node) { + if (mySelected.contains(node)) return TreeNodeState.SELECTED; + return myCache.get(node); + } + + public void clear(final T node) { + myCache.remove(node); + mySelected.remove(node); + } + + public void clearAllCachedMatching(final Processor processor) { + final Set> entries = myCache.entrySet(); + for (Map.Entry entry: entries){ + if(processor.process(entry.getKey())) { + myCache.remove(entry.getKey()); + } + } + } + + public void remove(final T node) { + mySelected.remove(node); + myCache.remove(node); + } + + @NotNull + public TreeNodeState putAndPass(final T node, @NotNull final TreeNodeState state) { + if (TreeNodeState.SELECTED.equals(state)) { + mySelected.add(node); + myCache.remove(node); + } else { + mySelected.remove(node); + myCache.put(node, state); + } + return state; + } + + public boolean canAddSelection() { + return mySelected.size() < mySelectedSize; + } + + public Set getSelected() { + return Collections.unmodifiableSet(mySelected); + } +} diff --git a/platform/vcs-impl/src/com/intellij/util/treeWithCheckedNodes/SelectionManager.java b/platform/vcs-impl/src/com/intellij/util/treeWithCheckedNodes/SelectionManager.java new file mode 100644 index 000000000000..c5daa37a0793 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/util/treeWithCheckedNodes/SelectionManager.java @@ -0,0 +1,151 @@ +/* + * Copyright 2000-2011 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.util.treeWithCheckedNodes; + +import com.intellij.openapi.util.Ref; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.PairProcessor; +import com.intellij.util.Processor; +import com.intellij.util.TreeNodeState; +import com.intellij.util.containers.Convertor; + +import javax.swing.tree.DefaultMutableTreeNode; + +/** +* @author irengrig +* Date: 2/7/11 +* Time: 10:43 AM + * + * see {@link SelectedState} +*/ +public class SelectionManager { + private final SelectedState myState; + private final Convertor myNodeConvertor; + + public SelectionManager(int selectedSize, int queueSize, final Convertor nodeConvertor) { + myNodeConvertor = nodeConvertor; + myState = new SelectedState(selectedSize, queueSize); + } + + public void toggleSelection(final DefaultMutableTreeNode node) { + final StateWorker stateWorker = new StateWorker(node, myNodeConvertor); + if (stateWorker.getVf() == null) return; + + final TreeNodeState state = getStateImpl(stateWorker); + if (TreeNodeState.HAVE_SELECTED_ABOVE.equals(state)) return; + if (TreeNodeState.CLEAR.equals(state) && (! myState.canAddSelection())) return; + + final TreeNodeState futureState = + myState.putAndPass(stateWorker.getVf(), TreeNodeState.SELECTED.equals(state) ? TreeNodeState.CLEAR : TreeNodeState.SELECTED); + + // for those possibly duplicate nodes (i.e. when we have root for module and root for VCS root, each file is shown twice in a tree -> + // clear all suspicious cached) + if (! TreeNodeState.SELECTED.equals(futureState)) { + myState.clearAllCachedMatching(new Processor() { + @Override + public boolean process(VirtualFile virtualFile) { + return VfsUtil.isAncestor(virtualFile, stateWorker.getVf(), false); + } + }); + } + stateWorker.iterateParents(myState, new PairProcessor() { + @Override + public boolean process(VirtualFile virtualFile, TreeNodeState state) { + if (TreeNodeState.SELECTED.equals(futureState)) { + myState.putAndPass(virtualFile, TreeNodeState.HAVE_SELECTED_BELOW); + } else { + myState.remove(virtualFile); + } + return true; + } + }); + myState.clearAllCachedMatching(new Processor() { + @Override + public boolean process(VirtualFile vf) { + return VfsUtil.isAncestor(stateWorker.getVf(), vf, false); + } + }); + for (VirtualFile selected : myState.getSelected()) { + if (VfsUtil.isAncestor(stateWorker.getVf(), selected, true)) { + myState.remove(selected); + } + } + } + + public TreeNodeState getState(final DefaultMutableTreeNode node) { + return getStateImpl(new StateWorker(node, myNodeConvertor)); + } + + private TreeNodeState getStateImpl(final StateWorker stateWorker) { + if (stateWorker.getVf() == null) return TreeNodeState.CLEAR; + + final TreeNodeState stateSelf = myState.get(stateWorker.getVf()); + if (stateSelf != null) return stateSelf; + + final Ref result = new Ref(); + stateWorker.iterateParents(myState, new PairProcessor() { + @Override + public boolean process(VirtualFile virtualFile, TreeNodeState state) { + if (state != null) { + if (TreeNodeState.SELECTED.equals(state) || TreeNodeState.HAVE_SELECTED_ABOVE.equals(state)) { + result.set(myState.putAndPass(stateWorker.getVf(), TreeNodeState.HAVE_SELECTED_ABOVE)); + } + return false; // exit + } + return true; + } + }); + + if (! result.isNull()) return result.get(); + + for (VirtualFile selected : myState.getSelected()) { + if (VfsUtil.isAncestor(stateWorker.getVf(), selected, true)) { + return myState.putAndPass(stateWorker.getVf(), TreeNodeState.HAVE_SELECTED_BELOW); + } + } + return TreeNodeState.CLEAR; + } + + private static class StateWorker { + private final DefaultMutableTreeNode myNode; + private final Convertor myConvertor; + private VirtualFile myVf; + + private StateWorker(DefaultMutableTreeNode node, final Convertor convertor) { + myNode = node; + myConvertor = convertor; + myVf = myConvertor.convert(node); + } + + public VirtualFile getVf() { + return myVf; + } + + public void iterateParents(final SelectedState states, final PairProcessor parentsProcessor) { + DefaultMutableTreeNode current = (DefaultMutableTreeNode) myNode.getParent(); + // up cycle + while (current != null) { + final VirtualFile file = myConvertor.convert(current); + if (file == null) return; + + final TreeNodeState state = states.get(file); + if (! parentsProcessor.process(file, state)) return; + current = (DefaultMutableTreeNode)current.getParent(); + } + } + } +} diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 4df0b02e1574..8948f9e10095 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -628,7 +628,7 @@ manual.array.copy.display.name=Manual array copy manual.array.to.collection.copy.display.name=Manual array to collection copy long.literals.ending.with.lowercase.l.display.name='long' literal ending with 'l' instead of 'L' overly.complex.arithmetic.expression.display.name=Overly complex arithmetic expression -j.unit.abstract.test.class.naming.convention.display.name=JUnit abstract test class naming convention +junit.abstract.test.class.naming.convention.display.name=JUnit abstract test class naming convention unnecessary.parentheses.display.name=Unnecessary parentheses test.case.in.product.code.display.name=JUnit TestCase in product source test.method.in.product.code.display.name=JUnit test method in product source @@ -805,7 +805,7 @@ class.in.top.level.package.display.name=Class without package statement confusing.else.display.name=Confusing 'else' branch public.field.accessed.in.synchronized.context.display.name=Non-private field accessed in synchronized context string.replaceable.by.string.buffer.display.name=Non-constant String should be StringBuilder -j.unit.test.class.naming.convention.display.name=JUnit test class naming convention +junit.test.class.naming.convention.display.name=JUnit test class naming convention method.coupling.display.name=Overly coupled method collections.must.have.initial.capacity.display.name=Collection without initial capacity anonymous.inner.class.display.name=Anonymous inner class @@ -1131,12 +1131,12 @@ instance.variable.name.convention.problem.descriptor.regex.mismatch=Instance fie interface.name.convention.problem.descriptor.short=Interface name #ref is too short #loc interface.name.convention.problem.descriptor.long=Interface name #ref is too long #loc interface.name.convention.problem.descriptor.regex.mismatch=Interface name #ref doesn''t match regex ''{0}'' #loc -j.unit.abstract.test.class.naming.convention.problem.descriptor.short=Abstract JUnit test class name #ref is too short #loc -j.unit.abstract.test.class.naming.convention.problem.descriptor.long=Abstract JUnit test class name #ref is too long #loc -j.unit.abstract.test.class.naming.convention.problem.descriptor.regex.mismatch=Abstract JUnit test class name #ref doesn''t match regex ''{0}'' #loc -j.unit.test.class.naming.convention.problem.descriptor.short=JUnit test class name #ref is too short #loc -j.unit.test.class.naming.convention.problem.descriptor.long=JUnit test class name #ref is too long #loc -j.unit.test.class.naming.convention.problem.descriptor.regex.mismatch=JUnit test class name #ref doesn''t match regex ''{0}'' #loc +junit.abstract.test.class.naming.convention.problem.descriptor.short=Abstract JUnit test class name #ref is too short #loc +junit.abstract.test.class.naming.convention.problem.descriptor.long=Abstract JUnit test class name #ref is too long #loc +junit.abstract.test.class.naming.convention.problem.descriptor.regex.mismatch=Abstract JUnit test class name #ref doesn''t match regex ''{0}'' #loc +junit.test.class.naming.convention.problem.descriptor.short=JUnit test class name #ref is too short #loc +junit.test.class.naming.convention.problem.descriptor.long=JUnit test class name #ref is too long #loc +junit.test.class.naming.convention.problem.descriptor.regex.mismatch=JUnit test class name #ref doesn''t match regex ''{0}'' #loc local.variable.naming.convention.problem.descriptor.short=Local variable name #ref is too short #loc local.variable.naming.convention.problem.descriptor.long=Local variable name #ref is too long #loc local.variable.naming.convention.problem.descriptor.regex.mismatch=Local variable name #ref doesn''t match regex ''{0}'' #loc @@ -1182,7 +1182,7 @@ unnecessary.boxing.remove.quickfix=Remove boxing unnecessary.unboxing.remove.quickfix=Remove unboxing misordered.assert.equals.parameters.flip.quickfix=Flip compared parameters setup.calls.super.setup.add.quickfix=Add call to 'super.setUp()' -simplify.j.unit.assertion.simplify.quickfix=Simplify assertion +simplify.junit.assertion.simplify.quickfix=Simplify assertion teardown.calls.super.teardown.add.quickfix=Add call to 'super.tearDown()' test.method.is.public.void.no.arg.problem.descriptor1=Test method #ref() should probably not have parameters #loc test.method.is.public.void.no.arg.problem.descriptor2=Test method #ref() is not declared 'public void' #loc @@ -1831,4 +1831,7 @@ shift.out.of.range.quickfix=Replace ''{0}'' with ''{1}'' boxing.boxed.value.display.name=Boxing of already boxed value boxing.boxed.value.problem.descriptor=Boxing of already boxed #ref boxing.boxed.value.quickfix=Remove unnecessary boxing -unnecessary.javadoc.link.option=Ignore inline links to super methods \ No newline at end of file +unnecessary.javadoc.link.option=Ignore inline links to super methods +constant.junit.assert.argument.display.name=Constant JUnit assert argument +constant.junit.assert.argument.problem.descriptor=Argument #ref is constant +test.case.with.no.test.methods.option=Ignore test cases which have super classes with test methods \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/BaseInspectionVisitor.java b/plugins/InspectionGadgets/src/com/siyeh/ig/BaseInspectionVisitor.java index 09cb9f13dea3..c365f9e72c54 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/BaseInspectionVisitor.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/BaseInspectionVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package com.siyeh.ig; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.*; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public abstract class BaseInspectionVisitor extends JavaElementVisitor{ @@ -49,7 +50,8 @@ public abstract class BaseInspectionVisitor extends JavaElementVisitor{ } protected final void registerMethodCallError( - @NotNull PsiMethodCallExpression expression, Object... infos) { + @NotNull PsiMethodCallExpression expression, + @NonNls Object... infos) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); final PsiElement nameToken = methodExpression.getReferenceNameElement(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/CollectionAddedToSelfInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/CollectionAddedToSelfInspection.java index dc5ff5783f1f..aab48ff11ff4 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/CollectionAddedToSelfInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/CollectionAddedToSelfInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,10 @@ package com.siyeh.ig.bugs; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.EquivalenceChecker; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -91,9 +91,9 @@ public class CollectionAddedToSelfInspection extends BaseInspection { if(qualifierClass == null){ return; } - if(!ClassUtils.isSubclass(qualifierClass, + if(!InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_UTIL_COLLECTION) && - !ClassUtils.isSubclass(qualifierClass, + !InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_UTIL_MAP)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspection.java index 77b68fe582cb..8b1f23cdcccb 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,12 @@ import com.intellij.codeInspection.ui.RemoveAction; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.LibraryUtil; -import com.siyeh.ig.ui.*; +import com.siyeh.ig.ui.ToggleAction; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -154,7 +154,7 @@ public class IgnoreResultOfCallInspection extends BaseInspection { continue; } final String className = classNames.get(i); - if (!ClassUtils.isSubclass(aClass, className)) { + if (!InheritanceUtil.isInheritor(aClass, className)) { continue; } registerMethodCallError(call, aClass); @@ -198,7 +198,6 @@ public class IgnoreResultOfCallInspection extends BaseInspection { JCheckBox nonLibraryCheckbox; Form(){ - super(); addButton.setAction(new AddAction(table)); removeButton.setAction(new RemoveAction(table)); nonLibraryCheckbox.setAction(new ToggleAction( diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/NewStringBufferWithCharArgumentInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/NewStringBufferWithCharArgumentInspection.java index e0934e695584..f46502d5c2b6 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/NewStringBufferWithCharArgumentInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/NewStringBufferWithCharArgumentInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2007-2010 Bas Leijdekkers + * Copyright 2007-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ package com.siyeh.ig.bugs; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -120,7 +120,7 @@ public class NewStringBufferWithCharArgumentInspection extends BaseInspection { return; } final PsiClass aClass = constructor.getContainingClass(); - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/StringConcatenationInMessageFormatCallInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/StringConcatenationInMessageFormatCallInspection.java index f30e49d16092..0d6a94accf16 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/StringConcatenationInMessageFormatCallInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/StringConcatenationInMessageFormatCallInspection.java @@ -18,13 +18,13 @@ package com.siyeh.ig.bugs; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; @@ -224,7 +224,8 @@ public class StringConcatenationInMessageFormatCallInspection return false; } final PsiClass aClass = (PsiClass) target; - return ClassUtils.isSubclass(aClass, "java.text.MessageFormat"); + return InheritanceUtil.isInheritor(aClass, + "java.text.MessageFormat"); } } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/SuspiciousToArrayCallInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/SuspiciousToArrayCallInspection.java index 8410adc1703a..bc97a8b76689 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/SuspiciousToArrayCallInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/SuspiciousToArrayCallInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2005-2010 Bas Leijdekkers + * Copyright 2005-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,10 @@ package com.siyeh.ig.bugs; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -76,7 +76,7 @@ public class SuspiciousToArrayCallInspection extends BaseInspection { final PsiClassType classType = (PsiClassType)type; final PsiClass aClass = classType.resolve(); if (aClass == null || - !ClassUtils.isSubclass(aClass, + !InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java index fc98f3ed36f7..3c83d5286c68 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/ThrowableResultOfMethodCallIgnoredInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Bas Leijdekkers + * Copyright 2008-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,24 +17,26 @@ package com.siyeh.ig.bugs; import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Query; +import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.psiutils.TypeUtils; -import com.siyeh.ig.psiutils.ClassUtils; -import com.siyeh.InspectionGadgetsBundle; import org.jetbrains.annotations.NotNull; public class ThrowableResultOfMethodCallIgnoredInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "throwable.result.of.method.call.ignored.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( @@ -46,6 +48,7 @@ public class ThrowableResultOfMethodCallIgnoredInspection return true; } + @Override public BaseInspectionVisitor buildVisitor() { return new ThrowableResultOfMethodCallIgnoredVisitor(); } @@ -75,7 +78,7 @@ public class ThrowableResultOfMethodCallIgnoredInspection } if (!method.hasModifierProperty(PsiModifier.STATIC)) { final PsiClass containingClass = method.getContainingClass(); - if (ClassUtils.isSubclass(containingClass, + if (InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_LANG_THROWABLE)) { return; } @@ -117,11 +120,9 @@ public class ThrowableResultOfMethodCallIgnoredInspection while (usageParent instanceof PsiParenthesizedExpression) { usageParent = usageParent.getParent(); } - if (usageParent instanceof PsiThrowStatement) { - return; - } else if (usageParent instanceof PsiReturnStatement) { - return; - } else if (usageParent instanceof PsiExpressionList) { + if (usageParent instanceof PsiThrowStatement || + usageParent instanceof PsiReturnStatement || + usageParent instanceof PsiExpressionList) { return; } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/UseOfPropertiesAsHashtableInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/UseOfPropertiesAsHashtableInspection.java index 37dc74eb8c17..f9db480acbd3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/UseOfPropertiesAsHashtableInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/bugs/UseOfPropertiesAsHashtableInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ package com.siyeh.ig.bugs; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.HardcodedMethodConstants; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; @@ -65,7 +65,8 @@ public class UseOfPropertiesAsHashtableInspection extends BaseInspection { if(containingClass == null){ return; } - if(!ClassUtils.isSubclass(containingClass, "java.util.Hashtable")){ + if(!InheritanceUtil.isInheritor(containingClass, + "java.util.Hashtable")){ return; } final PsiExpression qualifier = diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/MissingOverrideAnnotationInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/MissingOverrideAnnotationInspection.java index 449827a75c3f..190adb30e6bd 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/MissingOverrideAnnotationInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/MissingOverrideAnnotationInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -218,8 +218,8 @@ public class MissingOverrideAnnotationInspection extends BaseInspection { final List toExclude = new SmartList(); for (PsiMethod superMethod : superMethods) { final PsiClass superClass = superMethod.getContainingClass(); - if (!InheritanceUtil.isCorrectDescendant(methodClass, - superClass, true)) { + if (!InheritanceUtil.isInheritorOrSelf(methodClass, superClass, + true)) { toExclude.add(superMethod); } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ForLoopWithMissingComponentInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ForLoopWithMissingComponentInspection.java index 0c5997151f1d..1651cb9eeffe 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ForLoopWithMissingComponentInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/controlflow/ForLoopWithMissingComponentInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,13 +15,13 @@ */ package com.siyeh.ig.controlflow; +import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.HardcodedMethodConstants; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -144,7 +144,7 @@ public class ForLoopWithMissingComponentInspection extends BaseInspection { if(declaredClass == null){ continue; } - if(!ClassUtils.isSubclass(declaredClass, + if(!InheritanceUtil.isInheritor(declaredClass, CommonClassNames.JAVA_UTIL_ITERATOR)){ continue; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java index 7cd6b3e43d57..669577fcb923 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/CheckedExceptionClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.errorhandling; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class CheckedExceptionClassInspection extends BaseInspection { @@ -47,11 +47,11 @@ public class CheckedExceptionClassInspection extends BaseInspection { private static class CheckedExceptionClassVisitor extends BaseInspectionVisitor { @Override public void visitClass(@NotNull PsiClass aClass) { - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_THROWABLE)) { return; } - if (ClassUtils.isSubclass(aClass, + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/ErrorRethrownInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/ErrorRethrownInspection.java index 79377f6cb729..57c58eccd991 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/ErrorRethrownInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/ErrorRethrownInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ package com.siyeh.ig.errorhandling; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; @@ -73,7 +73,7 @@ public class ErrorRethrownInspection extends BaseInspection { if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ERROR)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/NonFinalFieldOfExceptionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/NonFinalFieldOfExceptionInspection.java index 3cbe78119b15..cf5598164f7d 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/NonFinalFieldOfExceptionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/NonFinalFieldOfExceptionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,12 +19,12 @@ import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; import com.intellij.psi.PsiModifier; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.MakeFieldFinalFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -69,7 +69,7 @@ public class NonFinalFieldOfExceptionInspection extends BaseInspection { if (containingClass == null) { return; } - if (!ClassUtils.isSubclass(containingClass, + if (!InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_LANG_EXCEPTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java index b6469ffe0b1b..07e1de3eb35c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/errorhandling/UncheckedExceptionClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.errorhandling; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class UncheckedExceptionClassInspection extends BaseInspection { @@ -48,13 +48,13 @@ public class UncheckedExceptionClassInspection extends BaseInspection { extends BaseInspectionVisitor { @Override public void visitClass(@NotNull PsiClass aClass) { - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_THROWABLE)) { return; } - if (ClassUtils.isSubclass(aClass, + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_EXCEPTION) && - !ClassUtils.isSubclass(aClass, + !InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java b/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java index d0b8b8623e65..91989e14ac8c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2009 Bas Leijdekkers + * Copyright 2008-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,11 +18,11 @@ package com.siyeh.ig.fixes; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.tree.IElementType; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; import com.siyeh.InspectionGadgetsBundle; @@ -74,9 +74,8 @@ public class ExtractParameterAsLocalVariableFix if (body == null) { return; } - final PsiManager manager = PsiManager.getInstance(project); final CodeStyleManager codeStyleManager = - manager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); final String parameterName = parameterReference.getText(); final JavaCodeStyleManager javaCodeStyleManager = JavaCodeStyleManager.getInstance(project); @@ -192,7 +191,7 @@ public class ExtractParameterAsLocalVariableFix (PsiAssignmentExpression)parent; final IElementType tokenType = assignmentExpression.getOperationTokenType(); - if (tokenType != JavaTokenType.EQ) { + if (!JavaTokenType.EQ.equals(tokenType)) { return false; } final PsiExpression lExpression = diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/initialization/OverriddenMethodCallDuringObjectConstructionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/initialization/OverriddenMethodCallDuringObjectConstructionInspection.java index 453cd1143070..4cf19a897d62 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/initialization/OverriddenMethodCallDuringObjectConstructionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/initialization/OverriddenMethodCallDuringObjectConstructionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,18 +29,21 @@ import org.jetbrains.annotations.NotNull; public class OverriddenMethodCallDuringObjectConstructionInspection extends BaseInspection{ + @Override @NotNull public String getDisplayName(){ return InspectionGadgetsBundle.message( "overridden.method.call.in.constructor.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos){ return InspectionGadgetsBundle.message( "overridden.method.call.in.constructor.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor(){ return new OverriddenMethodCallInConstructorVisitor(); } @@ -90,7 +93,7 @@ public class OverriddenMethodCallDuringObjectConstructionInspection } final PsiClass calledMethodClass = calledMethod.getContainingClass(); - if(!InheritanceUtil.isCorrectDescendant(containingClass, + if(!InheritanceUtil.isInheritorOrSelf(containingClass, calledMethodClass, true)){ return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java index fbd9866a28e4..2abb541aecdb 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,18 +28,21 @@ import org.jetbrains.annotations.NotNull; public class ClassWithoutConstructorInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "class.without.constructor.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "class.without.constructor.problem.descriptor"); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new ClassWithoutConstructorFix(); } @@ -53,12 +56,13 @@ public class ClassWithoutConstructorInspection extends BaseInspection { "class.without.constructor.create.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement classIdentifier = descriptor.getPsiElement(); final PsiClass aClass = (PsiClass)classIdentifier.getParent(); - final PsiManager psiManager = PsiManager.getInstance(project); - final PsiElementFactory factory = JavaPsiFacade.getInstance(psiManager.getProject()).getElementFactory(); + final PsiElementFactory factory = + JavaPsiFacade.getElementFactory(project); final PsiMethod constructor = factory.createConstructor(); final PsiModifierList modifierList = constructor.getModifierList(); if (aClass == null) { @@ -78,11 +82,12 @@ public class ClassWithoutConstructorInspection extends BaseInspection { } aClass.add(constructor); final CodeStyleManager styleManager = - psiManager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); styleManager.reformat(constructor); } } + @Override public BaseInspectionVisitor buildVisitor() { return new ClassWithoutConstructorVisitor(); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/EnumerationCanBeIterationInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/EnumerationCanBeIterationInspection.java index 19a715a24013..057ce0509bf3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/EnumerationCanBeIterationInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/EnumerationCanBeIterationInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Bas Leijdekkers + * Copyright 2007-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; @@ -28,7 +29,6 @@ import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.PsiElementOrderComparator; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NonNls; @@ -179,8 +179,7 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { PsiMethodCallExpression methodCallExpression, String variableName, PsiType parameterType) throws IncorrectOperationException { - final StringBuilder newStatementText = - new StringBuilder(); + @NonNls final StringBuilder newStatementText = new StringBuilder(); final Project project = methodCallExpression.getProject(); final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(project); @@ -231,12 +230,13 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { return null; } newStatementText.append(';'); - final PsiManager manager = methodCallExpression.getManager(); - final PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory(); + final PsiElementFactory factory = + JavaPsiFacade.getElementFactory(project); final PsiStatement statement = factory.createStatementFromText(newStatementText.toString(), methodExpression); - final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project); + final JavaCodeStyleManager styleManager = + JavaCodeStyleManager.getInstance(project); styleManager.shortenClassReferences(statement); return statement; } @@ -293,9 +293,9 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { (PsiMethodCallExpression) referenceGrandParent; final PsiReferenceExpression foundReferenceExpression = callExpression.getMethodExpression(); - final String foundName = + @NonNls final String foundName = foundReferenceExpression.getReferenceName(); - final String newExpressionText; + @NonNls final String newExpressionText; if ("hasMoreElements".equals(foundName)) { newExpressionText = newVariableName + ".hasNext()"; } else if ("nextElement".equals(foundName)) { @@ -312,6 +312,7 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { return result; } + @NonNls private static String createVariableName(PsiElement context) { final Project project = context.getProject(); final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); @@ -339,6 +340,7 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { } } + @Override public BaseInspectionVisitor buildVisitor() { return new EnumerationCanBeIterationVisitor(); } @@ -400,10 +402,10 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { return; } final PsiClass containingClass = method.getContainingClass(); - if (ClassUtils.isSubclass(containingClass, + if (InheritanceUtil.isInheritor(containingClass, "java.util.Vector")) { registerMethodCallError(expression, ITERATOR_TEXT); - } else if (ClassUtils.isSubclass(containingClass, + } else if (InheritanceUtil.isInheritor(containingClass, "java.util.Hashtable")) { registerMethodCallError(expression, VALUES_ITERATOR_TEXT); } @@ -413,7 +415,7 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { return; } final PsiClass containingClass = method.getContainingClass(); - if (ClassUtils.isSubclass(containingClass, + if (InheritanceUtil.isInheritor(containingClass, "java.util.Hashtable")) { registerMethodCallError(expression, KEY_SET_ITERATOR_TEXT); } @@ -446,7 +448,8 @@ public class EnumerationCanBeIterationInspection extends BaseInspection { super.visitMethodCallExpression(expression); final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); + @NonNls final String methodName = + methodExpression.getReferenceName(); if (!"hasMoreElements".equals(methodName) && !"nextElement".equals(methodName)) { return; diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/VarargParameterInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/VarargParameterInspection.java index 4ce271fd5929..1bde06bdb43c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/VarargParameterInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk/VarargParameterInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,23 +35,27 @@ import java.util.Collection; public class VarargParameterInspection extends BaseInspection { + @Override @NotNull public String getID(){ return "VariableArgumentMethod"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "variable.argument.method.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "variable.argument.method.problem.descriptor"); } + @Override @Nullable protected InspectionGadgetsFix buildFix(Object... infos) { return new VarargParameterFix(); @@ -65,6 +69,7 @@ public class VarargParameterInspection extends BaseInspection { "variable.argument.method.quickfix"); } + @Override protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement element = descriptor.getPsiElement(); @@ -121,8 +126,9 @@ public class VarargParameterInspection extends BaseInspection { } } builder.append('}'); - final PsiManager manager = referenceExpression.getManager(); - final PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory(); + final Project project = referenceExpression.getProject(); + final PsiElementFactory factory = + JavaPsiFacade.getElementFactory(project); final PsiExpression arrayExpression = factory.createExpressionFromText(builder.toString(), referenceExpression); @@ -136,12 +142,15 @@ public class VarargParameterInspection extends BaseInspection { argumentList.add(arrayExpression); } final CodeStyleManager codeStyleManager = - manager.getCodeStyleManager(); - JavaCodeStyleManager.getInstance(manager.getProject()).shortenClassReferences(argumentList); + CodeStyleManager.getInstance(project); + final JavaCodeStyleManager javaCodeStyleManager = + JavaCodeStyleManager.getInstance(project); + javaCodeStyleManager.shortenClassReferences(argumentList); codeStyleManager.reformat(argumentList); } } + @Override public BaseInspectionVisitor buildVisitor() { return new VarargParameterVisitor(); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/ForCanBeForeachInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/ForCanBeForeachInspection.java index 4add13d05f19..f8f3b37f7a87 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/ForCanBeForeachInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/ForCanBeForeachInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1066,7 +1066,7 @@ public class ForCanBeForeachInspection extends BaseInspection{ if(declaredClass == null){ return false; } - if(!ClassUtils.isSubclass(declaredClass, + if(!InheritanceUtil.isInheritor(declaredClass, CommonClassNames.JAVA_UTIL_ITERATOR)){ return false; } @@ -1107,9 +1107,9 @@ public class ForCanBeForeachInspection extends BaseInspection{ if(qualifierClass == null){ return false; } - if(!ClassUtils.isSubclass(qualifierClass, + if(!InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_LANG_ITERABLE) && - !ClassUtils.isSubclass(qualifierClass, + !InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_UTIL_COLLECTION)){ return false; } @@ -1288,7 +1288,8 @@ public class ForCanBeForeachInspection extends BaseInspection{ return false; } final PsiClass aClass = method.getContainingClass(); - return ClassUtils.isSubclass(aClass, CommonClassNames.JAVA_UTIL_LIST); + return InheritanceUtil.isInheritor(aClass, + CommonClassNames.JAVA_UTIL_LIST); } private static Holder getCollectionFromListMethodCall( @@ -1319,7 +1320,7 @@ public class ForCanBeForeachInspection extends BaseInspection{ return null; } final PsiClass containingClass = method.getContainingClass(); - if (!ClassUtils.isSubclass(containingClass, + if (!InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_LIST)) { return null; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/WhileCanBeForeachInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/WhileCanBeForeachInspection.java index de4d5b3e6670..3472dff50aba 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/WhileCanBeForeachInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/jdk15/WhileCanBeForeachInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -31,7 +32,6 @@ import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.StringUtils; import com.siyeh.ig.psiutils.TypeUtils; import com.siyeh.ig.psiutils.VariableAccessUtils; @@ -467,9 +467,9 @@ public class WhileCanBeForeachInspection extends BaseInspection { if (qualifierClass == null) { return false; } - if (!ClassUtils.isSubclass(qualifierClass, + if (!InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_LANG_ITERABLE) && - !ClassUtils.isSubclass(qualifierClass, + !InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { return false; } @@ -586,7 +586,6 @@ public class WhileCanBeForeachInspection extends BaseInspection { private final PsiVariable iterator; private NumCallsToIteratorNextVisitor(PsiVariable iterator) { - super(); this.iterator = iterator; } @@ -626,7 +625,6 @@ public class WhileCanBeForeachInspection extends BaseInspection { private final PsiVariable iterator; private IteratorRemoveVisitor(@NotNull PsiVariable iterator) { - super(); this.iterator = iterator; } @@ -670,7 +668,6 @@ public class WhileCanBeForeachInspection extends BaseInspection { private final PsiVariable iterator; private IteratorHasNextVisitor(PsiVariable iterator) { - super(); this.iterator = iterator; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertEqualsBetweenInconvertibleTypesInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertEqualsBetweenInconvertibleTypesInspection.java index 808e63ceceb5..bab32cc29680 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertEqualsBetweenInconvertibleTypesInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertEqualsBetweenInconvertibleTypesInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2007-2010 Bas Leijdekkers + * Copyright 2007-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,14 +15,14 @@ */ package com.siyeh.ig.junit; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.TypeConversionUtil; -import com.intellij.openapi.util.text.StringUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -77,8 +77,10 @@ public class AssertEqualsBetweenInconvertibleTypesInspection return; } final PsiClass containingClass = method.getContainingClass(); - if (!ClassUtils.isSubclass(containingClass, "junit.framework.Assert") && - !ClassUtils.isSubclass(containingClass, "org.junit.Assert")) { + if (!InheritanceUtil.isInheritor(containingClass, + "junit.framework.Assert") && + !InheritanceUtil.isInheritor(containingClass, + "org.junit.Assert")) { return; } final PsiParameterList parameterList = method.getParameterList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertsWithoutMessagesInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertsWithoutMessagesInspection.java index 2249f0dede0e..1e2398cd9170 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertsWithoutMessagesInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/AssertsWithoutMessagesInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,10 @@ package com.siyeh.ig.junit; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -30,23 +30,27 @@ import java.util.Set; public class AssertsWithoutMessagesInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "asserts.without.messages.display.name"); } + @Override @NotNull public String getID() { return "MessageMissingOnJUnitAssertion"; } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "asserts.without.messages.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new AssertionsWithoutMessagesVisitor(); } @@ -123,9 +127,10 @@ public class AssertsWithoutMessagesInspection extends BaseInspection { return false; } final PsiClass targetClass = method.getContainingClass(); - return targetClass != null && - (ClassUtils.isSubclass(targetClass, "junit.framework.Assert") || - ClassUtils.isSubclass(targetClass, "org.junit.Assert")); + return InheritanceUtil.isInheritor(targetClass, + "junit.framework.Assert") || + InheritanceUtil.isInheritor(targetClass, + "org.junit.Assert"); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ConstantJUnitAssertArgumentInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ConstantJUnitAssertArgumentInspection.java index 9d48846b082a..19eb4d8e936e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ConstantJUnitAssertArgumentInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ConstantJUnitAssertArgumentInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2009 Bas Leijdekkers + * Copyright 2009-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,20 +15,22 @@ */ package com.siyeh.ig.junit; +import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiUtil; +import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; -import java.util.Set; import java.util.HashSet; +import java.util.Set; public class ConstantJUnitAssertArgumentInspection extends BaseInspection { + @NonNls private static final Set ASSERT_METHODS = new HashSet(); static { @@ -42,21 +44,23 @@ public class ConstantJUnitAssertArgumentInspection extends BaseInspection { @Nls @NotNull public String getDisplayName() { - return "Constant JUnit assert argument"; + return InspectionGadgetsBundle.message( + "constant.junit.assert.argument.display.name"); } @Override @NotNull protected String buildErrorString(Object... infos) { - return "Argument #ref is constant"; + return InspectionGadgetsBundle.message( + "constant.junit.assert.argument.problem.descriptor"); } @Override public BaseInspectionVisitor buildVisitor() { - return new ConstantJUnitAssertArugmentVisitor(); + return new ConstantJUnitAssertArgumentVisitor(); } - private static class ConstantJUnitAssertArugmentVisitor + private static class ConstantJUnitAssertArgumentVisitor extends BaseInspectionVisitor { @Override @@ -74,8 +78,10 @@ public class ConstantJUnitAssertArgumentInspection extends BaseInspection { return; } final PsiClass containingClass = method.getContainingClass(); - if (!ClassUtils.isSubclass(containingClass, "junit.framework.Assert") && - !ClassUtils.isSubclass(containingClass, "org.junit.Assert")) { + if (!InheritanceUtil.isInheritor(containingClass, + "junit.framework.Assert") && + !InheritanceUtil.isInheritor(containingClass, + "org.junit.Assert")) { return; } final PsiExpressionList argumentList = expression.getArgumentList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java index 9e4a87d1a1c6..fc370c35a49e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2010 Bas Leijdekkers + * Copyright 2010-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.junit; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.ExceptionUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -89,7 +89,7 @@ public class ExpectedExceptionNeverThrownInspection } final PsiClassType classType = (PsiClassType) type; final PsiClass aClass = classType.resolve(); - if (ClassUtils.isSubclass(aClass, + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitAbstractTestClassNamingConventionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitAbstractTestClassNamingConventionInspection.java index 0837e6773b75..502b44a68634 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitAbstractTestClassNamingConventionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitAbstractTestClassNamingConventionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ package com.siyeh.ig.junit; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiTypeParameter; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; import com.siyeh.ig.naming.ConventionInspection; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class JUnitAbstractTestClassNamingConventionInspection @@ -32,47 +32,55 @@ public class JUnitAbstractTestClassNamingConventionInspection private static final int DEFAULT_MIN_LENGTH = 12; private static final int DEFAULT_MAX_LENGTH = 64; + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( - "j.unit.abstract.test.class.naming.convention.display.name"); + "junit.abstract.test.class.naming.convention.display.name"); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new RenameFix(); } + @Override protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { return true; } + @Override @NotNull public String buildErrorString(Object... infos) { final String className = (String)infos[0]; if (className.length() < getMinLength()) { return InspectionGadgetsBundle.message( - "j.unit.abstract.test.class.naming.convention.problem.descriptor.short"); + "junit.abstract.test.class.naming.convention.problem.descriptor.short"); } else if (className.length() > getMaxLength()) { return InspectionGadgetsBundle.message( - "j.unit.abstract.test.class.naming.convention.problem.descriptor.long"); + "junit.abstract.test.class.naming.convention.problem.descriptor.long"); } return InspectionGadgetsBundle.message( - "j.unit.abstract.test.class.naming.convention.problem.descriptor.regex.mismatch", + "junit.abstract.test.class.naming.convention.problem.descriptor.regex.mismatch", getRegex()); } + @Override protected String getDefaultRegex() { return "[A-Z][A-Za-z\\d]*TestCase"; } + @Override protected int getDefaultMinLength() { return DEFAULT_MIN_LENGTH; } + @Override protected int getDefaultMaxLength() { return DEFAULT_MAX_LENGTH; } + @Override public BaseInspectionVisitor buildVisitor() { return new NamingConventionsVisitor(); } @@ -90,7 +98,8 @@ public class JUnitAbstractTestClassNamingConventionInspection if(!aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { return; } - if(!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if(!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } final String name = aClass.getName(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java index fc84b0dc47ae..31131daaef03 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,12 +19,12 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiTypeParameter; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; import com.siyeh.ig.naming.ConventionInspection; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TestUtils; import org.jetbrains.annotations.NotNull; @@ -38,7 +38,7 @@ public class JUnitTestClassNamingConventionInspection @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( - "j.unit.test.class.naming.convention.display.name"); + "junit.test.class.naming.convention.display.name"); } @Override @@ -57,13 +57,13 @@ public class JUnitTestClassNamingConventionInspection final String className = (String)infos[0]; if (className.length() < getMinLength()) { return InspectionGadgetsBundle.message( - "j.unit.test.class.naming.convention.problem.descriptor.short"); + "junit.test.class.naming.convention.problem.descriptor.short"); } else if (className.length() > getMaxLength()) { return InspectionGadgetsBundle.message( - "j.unit.test.class.naming.convention.problem.descriptor.long"); + "junit.test.class.naming.convention.problem.descriptor.long"); } return InspectionGadgetsBundle.message( - "j.unit.test.class.naming.convention.problem.descriptor.regex.mismatch", + "junit.test.class.naming.convention.problem.descriptor.regex.mismatch", getRegex()); } @@ -100,7 +100,8 @@ public class JUnitTestClassNamingConventionInspection if(aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { return; } - if(!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if(!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { if (!hasJUnit4TestMethods(aClass)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisorderedAssertEqualsParametersInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisorderedAssertEqualsParametersInspection.java index 3cdc336c67c0..34efb304e567 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisorderedAssertEqualsParametersInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisorderedAssertEqualsParametersInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,30 +19,33 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class MisorderedAssertEqualsParametersInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "misordered.assert.equals.parameters.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "misordered.assert.equals.parameters.problem.descriptor"); } + @Override public InspectionGadgetsFix buildFix(Object... infos) { return new FlipParametersFix(); } @@ -55,6 +58,7 @@ public class MisorderedAssertEqualsParametersInspection "misordered.assert.equals.parameters.flip.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement methodNameIdentifier = descriptor.getPsiElement(); @@ -95,6 +99,7 @@ public class MisorderedAssertEqualsParametersInspection } } + @Override public BaseInspectionVisitor buildVisitor() { return new MisorderedAssertEqualsParametersVisitor(); } @@ -167,8 +172,8 @@ public class MisorderedAssertEqualsParametersInspection return false; } final PsiField field = (PsiField) target; - return !(!field.hasModifierProperty(PsiModifier.STATIC) || - !field.hasModifierProperty(PsiModifier.FINAL)); + return field.hasModifierProperty(PsiModifier.STATIC) && + field.hasModifierProperty(PsiModifier.FINAL); } private static boolean isAssertEquals( @@ -185,11 +190,10 @@ public class MisorderedAssertEqualsParametersInspection return false; } final PsiClass targetClass = method.getContainingClass(); - if (targetClass == null) { - return false; - } - return ClassUtils.isSubclass(targetClass, "junit.framework.Assert") - || ClassUtils.isSubclass(targetClass, "org.junit.Assert"); + return InheritanceUtil.isInheritor(targetClass, + "junit.framework.Assert") || + InheritanceUtil.isInheritor(targetClass, + "org.junit.Assert"); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledSetUpInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledSetUpInspection.java index d49baa10a2ae..9383be30dff0 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledSetUpInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledSetUpInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,37 +17,42 @@ package com.siyeh.ig.junit; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class MisspelledSetUpInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "misspelled.set.up.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "misspelled.set.up.problem.descriptor"); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new RenameFix("setUp"); } + @Override public BaseInspectionVisitor buildVisitor() { return new MisspelledSetUpVisitor(); } + @Override protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { return true; } @@ -64,7 +69,8 @@ public class MisspelledSetUpInspection extends BaseInspection { if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if (!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } registerMethodError(method); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledTearDownInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledTearDownInspection.java index 9e8b5da63f9e..97a556b12d60 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledTearDownInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/MisspelledTearDownInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,37 +17,42 @@ package com.siyeh.ig.junit; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class MisspelledTearDownInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "misspelled.tear.down.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "misspelled.tear.down.problem.descriptor"); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new RenameFix("tearDown"); } + @Override public BaseInspectionVisitor buildVisitor() { return new MisspelledSetUpVisitor(); } + @Override protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { return true; } @@ -64,7 +69,8 @@ public class MisspelledTearDownInspection extends BaseInspection { if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if (!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } registerMethodError(method); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupCallsSuperSetupInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupCallsSuperSetupInspection.java index 6fdcf5f74067..5bdbb661369c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupCallsSuperSetupInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupCallsSuperSetupInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,28 +19,31 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class SetupCallsSuperSetupInspection extends BaseInspection { + @Override @NotNull public String getID() { return "SetUpDoesntCallSuperSetUp"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "setup.calls.super.setup.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( @@ -55,6 +58,7 @@ public class SetupCallsSuperSetupInspection extends BaseInspection { "setup.calls.super.setup.add.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement methodName = descriptor.getPsiElement(); @@ -64,22 +68,24 @@ public class SetupCallsSuperSetupInspection extends BaseInspection { if (body == null) { return; } - final PsiManager psiManager = PsiManager.getInstance(project); - final PsiElementFactory factory = JavaPsiFacade.getInstance(psiManager.getProject()).getElementFactory(); + final PsiElementFactory factory = + JavaPsiFacade.getElementFactory(project); final PsiStatement newStatement = factory.createStatementFromText("super.setUp();", null); final CodeStyleManager styleManager = - psiManager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); final PsiJavaToken brace = body.getLBrace(); body.addAfter(newStatement, brace); styleManager.reformat(body); } } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new AddSuperSetUpCall(); } + @Override public BaseInspectionVisitor buildVisitor() { return new SetupCallsSuperSetupVisitor(); } @@ -107,7 +113,7 @@ public class SetupCallsSuperSetupInspection extends BaseInspection { if (targetClass == null) { return; } - if (!ClassUtils.isSubclass(targetClass, + if (!InheritanceUtil.isInheritor(targetClass, "junit.framework.TestCase")) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupIsPublicVoidNoArgInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupIsPublicVoidNoArgInspection.java index fffe3808727d..9526e3cb5d59 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupIsPublicVoidNoArgInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SetupIsPublicVoidNoArgInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,32 +16,36 @@ package com.siyeh.ig.junit; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class SetupIsPublicVoidNoArgInspection extends BaseInspection { + @Override @NotNull public String getID() { return "SetUpWithIncorrectSignature"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "setup.is.public.void.no.arg.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "setup.is.public.void.no.arg.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new SetupIsPublicVoidNoArgVisitor(); } @@ -63,16 +67,14 @@ public class SetupIsPublicVoidNoArgInspection extends BaseInspection { if (targetClass == null) { return; } - if (!ClassUtils.isSubclass(targetClass, + if (!InheritanceUtil.isInheritor(targetClass, "junit.framework.TestCase")) { return; } final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 0) { - registerMethodError(method); - } else if (!returnType.equals(PsiType.VOID)) { - registerMethodError(method); - } else if (!method.hasModifierProperty(PsiModifier.PUBLIC) && + if (parameterList.getParametersCount() != 0 || + !returnType.equals(PsiType.VOID) || + !method.hasModifierProperty(PsiModifier.PUBLIC) && !method.hasModifierProperty(PsiModifier.PROTECTED)) { registerMethodError(method); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SimplifiableJUnitAssertionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SimplifiableJUnitAssertionInspection.java index 71ce06fe07a8..1feb199cc7d7 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SimplifiableJUnitAssertionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/SimplifiableJUnitAssertionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,7 +54,7 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { @NotNull public String getName() { return InspectionGadgetsBundle.message( - "simplify.j.unit.assertion.simplify.quickfix"); + "simplify.junit.assertion.simplify.quickfix"); } @Override @@ -163,7 +163,8 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { return; } @NonNls final StringBuilder newExpression = new StringBuilder(); - addStaticImportIfPossible(callExpression, "assertEquals", newExpression); + addStaticImportIfPossible(callExpression, "assertEquals", + newExpression); newExpression.append("assertEquals("); if (message != null) { newExpression.append(message.getText()); @@ -222,9 +223,11 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { @NonNls final StringBuilder newExpression = new StringBuilder(); final PsiReferenceExpression methodExpression = callExpression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - final String memberName; - if ("assertFalse".equals(methodName) ^ tokenType.equals(JavaTokenType.NE)) { + @NonNls final String methodName = + methodExpression.getReferenceName(); + @NonNls final String memberName; + if ("assertFalse".equals(methodName) ^ + tokenType.equals(JavaTokenType.NE)) { memberName = "assertNotNull"; } else { memberName = "assertNull"; @@ -286,8 +289,9 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { @NonNls final StringBuilder newExpression = new StringBuilder(); final PsiReferenceExpression methodExpression = callExpression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - final String memberName; + @NonNls final String methodName = + methodExpression.getReferenceName(); + @NonNls final String memberName; if ("assertFalse".equals(methodName) ^ tokenType.equals(JavaTokenType.NE)) { memberName = "assertNotSame"; @@ -338,8 +342,10 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { secondTestPosition = 1; message = null; } - final PsiExpression firstTestArgument = arguments[firstTestPosition]; - final PsiExpression secondTestArgument = arguments[secondTestPosition]; + final PsiExpression firstTestArgument = + arguments[firstTestPosition]; + final PsiExpression secondTestArgument = + arguments[secondTestPosition]; final String literalValue; final String compareValue; if (isSimpleLiteral(firstTestArgument, secondTestArgument)) { @@ -353,7 +359,7 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { Character.toUpperCase(literalValue.charAt(0)) + literalValue.substring(1); @NonNls final StringBuilder newExpression = new StringBuilder(); - final String methodName = "assert" + uppercaseLiteralValue; + @NonNls final String methodName = "assert" + uppercaseLiteralValue; addStaticImportIfPossible(callExpression, methodName, newExpression); newExpression.append(methodName); newExpression.append('('); @@ -367,8 +373,9 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { newExpression.toString()); } - private static void addStaticImportIfPossible(PsiMethodCallExpression context, - String memberName, StringBuilder out) { + private static void addStaticImportIfPossible( + PsiMethodCallExpression context, @NonNls String memberName, + @NonNls StringBuilder out) { final PsiMethod containingMethod = PsiTreeUtil.getParentOfType( context, PsiMethod.class); if (TestUtils.isJUnit4TestMethod(containingMethod)) { @@ -470,7 +477,7 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { (PsiBinaryExpression) argument; final IElementType tokenType = binaryExpression.getOperationTokenType(); - return tokenType == JavaTokenType.EQEQ; + return JavaTokenType.EQEQ.equals(tokenType); } } @@ -768,7 +775,7 @@ public class SimplifiableJUnitAssertionInspection extends BaseInspection { private static boolean isAssertMethodCall( @NotNull PsiMethodCallExpression expression, - @NotNull String assertMethodName) { + @NonNls @NotNull String assertMethodName) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); @NonNls final String methodName = methodExpression.getReferenceName(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/StaticSuiteInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/StaticSuiteInspection.java index c5c888851988..f2c2b036d52c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/StaticSuiteInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/StaticSuiteInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,31 +19,35 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiParameterList; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class StaticSuiteInspection extends BaseInspection { + @Override @NotNull public String getID() { return "SuiteNotDeclaredStatic"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message("static.suite.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "static.suite.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new StaticSuiteVisitor(); } @@ -60,7 +64,8 @@ public class StaticSuiteInspection extends BaseInspection { if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if (!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } final PsiParameterList parameterList = method.getParameterList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownCallsSuperTeardownInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownCallsSuperTeardownInspection.java index 5fdb4575e98a..520908a3e6d4 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownCallsSuperTeardownInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownCallsSuperTeardownInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,34 +19,42 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class TeardownCallsSuperTeardownInspection extends BaseInspection { + @Override @NotNull public String getID() { return "TearDownDoesntCallSuperTearDown"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "teardown.calls.super.teardown.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "teardown.calls.super.teardown.problem.descriptor"); } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new AddSuperTearDownCall(); + } + private static class AddSuperTearDownCall extends InspectionGadgetsFix { @NotNull @@ -54,7 +62,7 @@ public class TeardownCallsSuperTeardownInspection extends BaseInspection { return InspectionGadgetsBundle.message( "teardown.calls.super.teardown.add.quickfix"); } - + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement methodName = descriptor.getPsiElement(); @@ -66,22 +74,19 @@ public class TeardownCallsSuperTeardownInspection extends BaseInspection { if (body == null) { return; } - final PsiManager psiManager = PsiManager.getInstance(project); - final PsiElementFactory factory = JavaPsiFacade.getInstance(psiManager.getProject()).getElementFactory(); + final PsiElementFactory factory = + JavaPsiFacade.getElementFactory(project); final PsiStatement newStatement = factory.createStatementFromText("super.tearDown();", null); final CodeStyleManager styleManager = - psiManager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); final PsiJavaToken brace = body.getRBrace(); body.addBefore(newStatement, brace); styleManager.reformat(body); } } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new AddSuperTearDownCall(); - } - + @Override public BaseInspectionVisitor buildVisitor() { return new TeardownCallsSuperTeardownVisitor(); } @@ -109,7 +114,7 @@ public class TeardownCallsSuperTeardownInspection extends BaseInspection { if (targetClass == null) { return; } - if (!ClassUtils.isSubclass(targetClass, + if (!InheritanceUtil.isInheritor(targetClass, "junit.framework.TestCase")) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownIsPublicVoidNoArgInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownIsPublicVoidNoArgInspection.java index 04f72d2dd5dd..e1939c49a48a 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownIsPublicVoidNoArgInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TeardownIsPublicVoidNoArgInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,32 +16,36 @@ package com.siyeh.ig.junit; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class TeardownIsPublicVoidNoArgInspection extends BaseInspection { + @Override @NotNull public String getID() { return "TearDownWithIncorrectSignature"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "teardown.is.public.void.no.arg.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "teardown.is.public.void.no.arg.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new TeardownIsPublicVoidNoArgVisitor(); } @@ -63,18 +67,14 @@ public class TeardownIsPublicVoidNoArgInspection extends BaseInspection { if (targetClass == null) { return; } - if (!ClassUtils.isSubclass(targetClass, + if (!InheritanceUtil.isInheritor(targetClass, "junit.framework.TestCase")) { return; } final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 0) { - registerMethodError(method); - } - else if (!returnType.equals(PsiType.VOID)) { - registerMethodError(method); - } - else if (!method.hasModifierProperty(PsiModifier.PUBLIC) && + if (parameterList.getParametersCount() != 0 || + !returnType.equals(PsiType.VOID) || + !method.hasModifierProperty(PsiModifier.PUBLIC) && !method.hasModifierProperty(PsiModifier.PROTECTED)) { registerMethodError(method); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseInProductCodeInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseInProductCodeInspection.java index 3418c02921a5..874dc12f4e31 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseInProductCodeInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseInProductCodeInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,42 +16,48 @@ package com.siyeh.ig.junit; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.MoveClassFix; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TestUtils; import org.jetbrains.annotations.NotNull; public class TestCaseInProductCodeInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "test.case.in.product.code.display.name"); } + @Override @NotNull public String getID() { return "JUnitTestCaseInProductSource"; } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "test.case.in.product.code.problem.descriptor"); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new MoveClassFix(); } + @Override protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { return true; } + @Override public BaseInspectionVisitor buildVisitor() { return new TestCaseInProductCodeVisitor(); } @@ -63,7 +69,8 @@ public class TestCaseInProductCodeInspection extends BaseInspection { if (TestUtils.isTest(aClass)) { return; } - if (!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if (!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } registerClassError(aClass); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseWithNoTestMethodsInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseWithNoTestMethodsInspection.java index 9f16b6d4f3ca..74b12e135e43 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseWithNoTestMethodsInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestCaseWithNoTestMethodsInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,15 +15,15 @@ */ package com.siyeh.ig.junit; +import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiTypeParameter; -import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TestUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,28 +35,36 @@ public class TestCaseWithNoTestMethodsInspection extends BaseInspection { @SuppressWarnings({"PublicField"}) public boolean ignoreSupers = false; + @Override @NotNull public String getID() { return "JUnitTestCaseWithNoTests"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "test.case.with.no.test.methods.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "test.case.with.no.test.methods.problem.descriptor"); } + @Override @Nullable public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel("Ignore test cases which have super classes with test methods", this, "ignoreSupers"); + return new SingleCheckboxOptionsPanel( + InspectionGadgetsBundle.message( + "test.case.with.no.test.methods.option"), this, + "ignoreSupers"); } + @Override public BaseInspectionVisitor buildVisitor() { return new TestCaseWithNoTestMethodsVisitor(); } @@ -74,7 +82,8 @@ public class TestCaseWithNoTestMethodsInspection extends BaseInspection { if (aClass instanceof PsiTypeParameter) { return; } - if (!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if (!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } final PsiMethod[] methods = aClass.getMethods(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodIsPublicVoidNoArgInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodIsPublicVoidNoArgInspection.java index 2a1e669a6aa0..d7d0e27e8f13 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodIsPublicVoidNoArgInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodIsPublicVoidNoArgInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.junit; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TestUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -94,7 +94,7 @@ public class TestMethodIsPublicVoidNoArgInspection extends BaseInspection { final PsiClass targetClass = method.getContainingClass(); if (!AnnotationUtil.isAnnotated(method, "org.junit.Test", true)) { if (targetClass == null || - !ClassUtils.isSubclass(targetClass, + !InheritanceUtil.isInheritor(targetClass, "junit.framework.TestCase")) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodWithoutAssertionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodWithoutAssertionInspection.java index 34f9037f511d..aa810246d46c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodWithoutAssertionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/TestMethodWithoutAssertionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +16,17 @@ package com.siyeh.ig.junit; import com.intellij.codeInspection.ui.ListTable; +import com.intellij.codeInspection.ui.ListWrappingTableModel; import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.ui.ScrollPaneFactory; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TestUtils; -import com.intellij.codeInspection.ui.ListWrappingTableModel; import com.siyeh.ig.ui.CheckBox; import com.siyeh.ig.ui.UiUtils; import org.jdom.Element; @@ -53,6 +53,7 @@ public class TestMethodWithoutAssertionInspection extends BaseInspection { private final List classNames = new ArrayList(); private Map patternCache = null; + @SuppressWarnings({"PublicField"}) public boolean assertKeywordIsAssertion = false; public TestMethodWithoutAssertionInspection() { @@ -197,8 +198,8 @@ public class TestMethodWithoutAssertionInspection extends BaseInspection { if (methodName == null) { return; } - for (int i = 0, methodNamesSize = methodNamePatterns.size(); - i < methodNamesSize; i++) { + final int methodNamesSize = methodNamePatterns.size(); + for (int i = 0; i < methodNamesSize; i++) { final String pattern = methodNamePatterns.get(i); if (!methodNamesMatch(methodName, pattern)) { continue; @@ -208,7 +209,7 @@ public class TestMethodWithoutAssertionInspection extends BaseInspection { continue; } final PsiClass aClass = method.getContainingClass(); - if (!ClassUtils.isSubclass(aClass, classNames.get(i))) { + if (!InheritanceUtil.isInheritor(aClass, classNames.get(i))) { continue; } containsAssertion = true; diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/UnconstructableTestCaseInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/UnconstructableTestCaseInspection.java index f7cd60625381..f02031dba664 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/UnconstructableTestCaseInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/UnconstructableTestCaseInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,10 @@ package com.siyeh.ig.junit; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; @@ -62,7 +62,8 @@ public class UnconstructableTestCaseInspection extends BaseInspection { if (aClass instanceof PsiTypeParameter) { return; } - if (!ClassUtils.isSubclass(aClass, "junit.framework.TestCase")) { + if (!InheritanceUtil.isInheritor(aClass, + "junit.framework.TestCase")) { return; } final PsiMethod[] constructors = aClass.getConstructors(); @@ -81,7 +82,8 @@ public class UnconstructableTestCaseInspection extends BaseInspection { hasNoArgConstructor = true; } if (parametersCount == 1) { - final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter[] parameters = + parameterList.getParameters(); final PsiType type = parameters[0].getType(); if (TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING, type)) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ExceptionNameDoesntEndWithExceptionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ExceptionNameDoesntEndWithExceptionInspection.java index 161ed2333a67..5476cd868d2a 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ExceptionNameDoesntEndWithExceptionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ExceptionNameDoesntEndWithExceptionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ package com.siyeh.ig.naming; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiTypeParameter; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -81,7 +81,7 @@ public class ExceptionNameDoesntEndWithExceptionInspection if (className.endsWith(exception)) { return; } - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_EXCEPTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/NonExceptionNameEndsWithExceptionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/NonExceptionNameEndsWithExceptionInspection.java index ed0e58e1db38..c4a6a676ab90 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/NonExceptionNameEndsWithExceptionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/NonExceptionNameEndsWithExceptionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,13 +19,13 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -123,11 +123,12 @@ public class NonExceptionNameEndsWithExceptionInspection if (!className.endsWith(exception)) { return; } - if (ClassUtils.isSubclass(aClass, + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_EXCEPTION)) { return; } - registerClassError(aClass, className, Boolean.valueOf(isOnTheFly())); + registerClassError(aClass, className, + Boolean.valueOf(isOnTheFly())); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InnerClassReferenceVisitor.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InnerClassReferenceVisitor.java index 1851742e87ba..fdac6edef080 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InnerClassReferenceVisitor.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/InnerClassReferenceVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,6 @@ public class InnerClassReferenceVisitor extends JavaRecursiveElementVisitor { private boolean referencesStaticallyAccessible = true; public InnerClassReferenceVisitor(PsiClass innerClass) { - super(); this.innerClass = innerClass; } @@ -42,14 +41,14 @@ public class InnerClassReferenceVisitor extends JavaRecursiveElementVisitor { return true; } } - if (InheritanceUtil.isCorrectDescendant(innerClass, aClass, true)) { + if (InheritanceUtil.isInheritorOrSelf(innerClass, aClass, true)) { return true; } PsiClass classScope = aClass; final PsiClass outerClass = ClassUtils.getContainingClass(innerClass); while (classScope != null) { - if (InheritanceUtil.isCorrectDescendant(outerClass, classScope, + if (InheritanceUtil.isInheritorOrSelf(outerClass, classScope, true)) { return false; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayToCollectionCopyInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayToCollectionCopyInspection.java index a05b1233ee26..040d0ecfe925 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayToCollectionCopyInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ManualArrayToCollectionCopyInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2010 Bas Leijdekkers + * Copyright 2006-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,12 +19,16 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.*; +import com.siyeh.ig.psiutils.ExpressionUtils; +import com.siyeh.ig.psiutils.ParenthesesUtils; +import com.siyeh.ig.psiutils.SideEffectChecker; +import com.siyeh.ig.psiutils.VariableAccessUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -563,7 +567,7 @@ public class ManualArrayToCollectionCopyInspection extends BaseInspection { return false; } final PsiClass containingClass = method.getContainingClass(); - return ClassUtils.isSubclass(containingClass, + return InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_COLLECTION); } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MethodReferenceVisitor.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MethodReferenceVisitor.java index fb30cf14be3f..41d751c462a4 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MethodReferenceVisitor.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/MethodReferenceVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2005 Dave Griffith + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,6 @@ class MethodReferenceVisitor extends JavaRecursiveElementVisitor{ private final PsiMember m_method; MethodReferenceVisitor(PsiMember method){ - super(); m_method = method; } @@ -40,7 +39,8 @@ class MethodReferenceVisitor extends JavaRecursiveElementVisitor{ super.visitElement(element); } - @Override public void visitReferenceElement(PsiJavaCodeReferenceElement reference){ + @Override public void visitReferenceElement( + PsiJavaCodeReferenceElement reference){ super.visitReferenceElement(reference); final PsiElement resolvedElement = reference.resolve(); if(!(resolvedElement instanceof PsiClass)){ @@ -77,7 +77,8 @@ class MethodReferenceVisitor extends JavaRecursiveElementVisitor{ m_referencesStaticallyAccessible = false; } - @Override public void visitThisExpression(@NotNull PsiThisExpression expression){ + @Override public void visitThisExpression( + @NotNull PsiThisExpression expression){ super.visitThisExpression(expression); m_referencesStaticallyAccessible = false; } @@ -91,7 +92,7 @@ class MethodReferenceVisitor extends JavaRecursiveElementVisitor{ } final PsiClass referenceContainingClass = m_method.getContainingClass(); final PsiClass containingClass = member.getContainingClass(); - return !InheritanceUtil.isCorrectDescendant(referenceContainingClass, + return !InheritanceUtil.isInheritorOrSelf(referenceContainingClass, containingClass, true); } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/TailRecursionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/TailRecursionInspection.java index 2ddff0d1affa..1756be7fda7c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/TailRecursionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/TailRecursionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,17 +33,20 @@ import org.jetbrains.annotations.Nullable; public class TailRecursionInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message("tail.recursion.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "tail.recursion.problem.descriptor"); } + @Override @Nullable protected InspectionGadgetsFix buildFix(Object... infos) { final PsiMethod containingMethod = (PsiMethod) infos[0]; @@ -74,6 +77,7 @@ public class TailRecursionInspection extends BaseInspection { "tail.recursion.replace.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement tailCallToken = descriptor.getPsiElement(); @@ -87,9 +91,12 @@ public class TailRecursionInspection extends BaseInspection { if (body == null) { return; } - final StringBuilder builder = new StringBuilder(); + @NonNls final StringBuilder builder = new StringBuilder(); builder.append('{'); final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } final String thisVariableName; final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project); @@ -121,9 +128,8 @@ public class TailRecursionInspection extends BaseInspection { tailCallIsContainedInLoop = false; } builder.append("while(true)"); - final PsiManager psiManager = PsiManager.getInstance(project); final CodeStyleManager codeStyleManager = - psiManager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); replaceTailCalls(body, method, thisVariableName, tailCallIsContainedInLoop, builder); builder.append('}'); @@ -222,13 +228,8 @@ public class TailRecursionInspection extends BaseInspection { out.append('.'); } out.append(text); - } else if (element instanceof PsiThisExpression) { - if (thisVariableName == null) { - out.append(text); - } else { - out.append(thisVariableName); - } - } else if (element instanceof PsiSuperExpression) { + } else if (element instanceof PsiThisExpression || + element instanceof PsiSuperExpression) { if (thisVariableName == null) { out.append(text); } else { @@ -358,6 +359,7 @@ public class TailRecursionInspection extends BaseInspection { } } + @Override public BaseInspectionVisitor buildVisitor() { return new TailRecursionVisitor(); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspection.java index bbcfa234ee1c..1a5088351af8 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2007-2010 Bas Leijdekkers + * Copyright 2007-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ package com.siyeh.ig.performance; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.CollectionUtils; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.Nls; @@ -135,7 +135,7 @@ public class ToArrayCallWithZeroLengthArrayArgumentInspection final PsiType componentType = type.getComponentType(); final String typeText = componentType.getCanonicalText(); @NonNls final String replacementText = - "new " + typeText + "[" + qualifierText + ".size()]"; + "new " + typeText + '[' + qualifierText + ".size()]"; return getElementText(expression, referenceExpression, replacementText); } @@ -191,7 +191,7 @@ public class ToArrayCallWithZeroLengthArrayArgumentInspection return; } final PsiClass containingClass = method.getContainingClass(); - if (!ClassUtils.isSubclass(containingClass, + if (!InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfAWTPeerClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfAWTPeerClassInspection.java index e4575fc777b9..08aa49f703a3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfAWTPeerClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfAWTPeerClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,32 +16,35 @@ package com.siyeh.ig.portability; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class UseOfAWTPeerClassInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "use.of.awt.peer.class.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "use.of.awt.peer.class.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new UseOfAWTPeerClassVisitor(); } - private static class UseOfAWTPeerClassVisitor extends BaseInspectionVisitor { - + private static class UseOfAWTPeerClassVisitor + extends BaseInspectionVisitor { @Override public void visitVariable(@NotNull PsiVariable variable) { super.visitVariable(variable); @@ -65,7 +68,7 @@ public class UseOfAWTPeerClassInspection extends BaseInspection { if(resolveClass instanceof PsiTypeParameter){ return; } - if(!ClassUtils.isSubclass(resolveClass, + if(!InheritanceUtil.isInheritor(resolveClass, "java.awt.peer.ComponentPeer")) { return; } @@ -97,7 +100,7 @@ public class UseOfAWTPeerClassInspection extends BaseInspection { if(resolveClass instanceof PsiTypeParameter) { return; } - if(!ClassUtils.isSubclass(resolveClass, + if(!InheritanceUtil.isInheritor(resolveClass, "java.awt.peer.ComponentPeer")) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfJDBCDriverClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfJDBCDriverClassInspection.java index b26ece8ae58a..9fd737a56b35 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfJDBCDriverClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/portability/UseOfJDBCDriverClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,26 +16,29 @@ package com.siyeh.ig.portability; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class UseOfJDBCDriverClassInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "use.of.concrete.jdbc.driver.class.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "use.of.concrete.jdbc.driver.class.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new UseOfJDBCDriverClassVisitor(); } @@ -65,7 +68,7 @@ public class UseOfJDBCDriverClassInspection extends BaseInspection { if(resolveClass instanceof PsiTypeParameter){ return; } - if(!ClassUtils.isSubclass(resolveClass, "java.sql.Driver")) { + if(!InheritanceUtil.isInheritor(resolveClass, "java.sql.Driver")) { return; } final PsiTypeElement typeElement = variable.getTypeElement(); @@ -96,7 +99,7 @@ public class UseOfJDBCDriverClassInspection extends BaseInspection { if(resolveClass instanceof PsiTypeParameter){ return; } - if(!ClassUtils.isSubclass(resolveClass, "java.sql.Driver")) { + if(!InheritanceUtil.isInheritor(resolveClass, "java.sql.Driver")) { return; } registerNewExpressionError(newExpression); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java index 751b5b4c6cb2..1898696cb975 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ClassUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,15 +15,11 @@ */ package com.siyeh.ig.psiutils; -import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; -import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.Query; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import java.util.HashSet; @@ -81,19 +77,6 @@ public class ClassUtils { private ClassUtils() { } - public static boolean isSubclass(@Nullable PsiClass aClass, - @NonNls String ancestorName) { - if (aClass == null) { - return false; - } - final PsiManager psiManager = aClass.getManager(); - final Project project = psiManager.getProject(); - final GlobalSearchScope scope = GlobalSearchScope.allScope(project); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiClass ancestorClass = psiFacade.findClass(ancestorName, scope); - return InheritanceUtil.isCorrectDescendant(aClass, ancestorClass, true); - } - public static boolean isPrimitive(PsiType type) { return TypeConversionUtil.isPrimitiveAndNotNull(type); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/CloneUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/CloneUtils.java index 3d7a244d43d6..552af71556ef 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/CloneUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/CloneUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,17 @@ package com.siyeh.ig.psiutils; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import com.siyeh.HardcodedMethodConstants; import org.jetbrains.annotations.NotNull; public class CloneUtils{ - private CloneUtils(){ - super(); - } + private CloneUtils(){} public static boolean isCloneable(@NotNull PsiClass aClass){ - return ClassUtils.isSubclass(aClass, + return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_CLONEABLE); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ImportUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ImportUtils.java index 5eeeac20ebb8..c05ffab36204 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ImportUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ImportUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,10 +30,9 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -public class ImportUtils{ +public class ImportUtils { - private ImportUtils(){ - } + private ImportUtils() {} public static void addImportIfNeeded(PsiJavaFile file, PsiClass aClass) { final PsiFile containingFile = aClass.getContainingFile(); @@ -78,7 +77,7 @@ public class ImportUtils{ if (containingClass == null) { return false; } - if (ClassUtils.isSubclass(containingClass, fqName)) { + if (InheritanceUtil.isInheritor(containingClass, fqName)) { return true; } final PsiField field = @@ -424,7 +423,7 @@ public class ImportUtils{ throws IncorrectOperationException { final PsiClass containingClass = PsiTreeUtil.getParentOfType(context, PsiClass.class); - if (ClassUtils.isSubclass(containingClass, qualifierClass)) { + if (InheritanceUtil.isInheritor(containingClass, qualifierClass)) { return; } final PsiFile psiFile = context.getContainingFile(); @@ -524,7 +523,7 @@ public class ImportUtils{ } final PsiClass containingClass = PsiTreeUtil.getParentOfType(context, PsiClass.class); - if (InheritanceUtil.isCorrectDescendant(containingClass, memberClass, + if (InheritanceUtil.isInheritorOrSelf(containingClass, memberClass, true)) { return false; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/IteratorUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/IteratorUtils.java index 2be1ad75404d..7ca1cf7bfec9 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/IteratorUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/IteratorUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2006 Bas Leijdekkers + * Copyright 2003-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,10 +55,6 @@ public class IteratorUtils { CommonClassNames.JAVA_UTIL_ITERATOR, PsiType.BOOLEAN, "hasNext"); } - public static boolean isIterator(PsiClass aClass) { - return ClassUtils.isSubclass(aClass, CommonClassNames.JAVA_UTIL_ITERATOR); - } - private static class CallsIteratorNextVisitor extends JavaRecursiveElementVisitor { @@ -91,7 +87,8 @@ public class IteratorUtils { super.visitMethodCallExpression(expression); if (checkScanner) { if (!MethodCallUtils.isCallToMethod(expression, - CommonClassNames.JAVA_UTIL_ITERATOR, null, SCANNER_PATTERN)) { + CommonClassNames.JAVA_UTIL_ITERATOR, null, + SCANNER_PATTERN)) { return; } } else { @@ -119,7 +116,7 @@ public class IteratorUtils { final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) qualifier; final PsiElement element = referenceExpression.resolve(); - if (target != element) { + if (!target.equals(element)) { return; } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/MethodUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/MethodUtils.java index 8dc1f47c8ed4..1ce3326f6f22 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/MethodUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/MethodUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -130,7 +130,8 @@ public class MethodUtils{ } if (containingClassName != null) { final PsiClass containingClass = method.getContainingClass(); - return ClassUtils.isSubclass(containingClass, containingClassName); + return InheritanceUtil.isInheritor(containingClass, + containingClassName); } return true; } @@ -186,7 +187,8 @@ public class MethodUtils{ } if (containingClassName != null) { final PsiClass containingClass = method.getContainingClass(); - return ClassUtils.isSubclass(containingClass, containingClassName); + return InheritanceUtil.isInheritor(containingClass, + containingClassName); } return true; } @@ -335,7 +337,7 @@ public class MethodUtils{ } final PsiClass fieldContainingClass = field.getContainingClass(); final PsiClass methodContainingClass = method.getContainingClass(); - if (InheritanceUtil.isCorrectDescendant(methodContainingClass, + if (InheritanceUtil.isInheritorOrSelf(methodContainingClass, fieldContainingClass, true)) { return field; } else { @@ -408,7 +410,7 @@ public class MethodUtils{ final PsiField field = (PsiField) referent; final PsiClass fieldContainingClass = field.getContainingClass(); final PsiClass methodContainingClass = method.getContainingClass(); - if(!InheritanceUtil.isCorrectDescendant(methodContainingClass, + if(!InheritanceUtil.isInheritorOrSelf(methodContainingClass, fieldContainingClass, true)){ return null; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/SerializationUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/SerializationUtils.java index 24f804d6fa41..a79afaae9967 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/SerializationUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/SerializationUtils.java @@ -18,6 +18,7 @@ package com.siyeh.ig.psiutils; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,12 +27,12 @@ public class SerializationUtils { private SerializationUtils() {} public static boolean isSerializable(@Nullable PsiClass aClass) { - return ClassUtils.isSubclass(aClass, + return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_IO_SERIALIZABLE); } public static boolean isExternalizable(@Nullable PsiClass aClass) { - return ClassUtils.isSubclass(aClass, + return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_IO_EXTERNALIZABLE); } @@ -56,7 +57,8 @@ public class SerializationUtils { } public static boolean hasReadObject(@NotNull PsiClass aClass) { - final PsiMethod[] methods = aClass.findMethodsByName("readObject", false); + final PsiMethod[] methods = + aClass.findMethodsByName("readObject", false); for (final PsiMethod method : methods) { if (isReadObject(method)) { return true; @@ -130,9 +132,9 @@ public class SerializationUtils { if (isExternalizable(psiClass)) { return true; } - if (ClassUtils.isSubclass(psiClass, + if (InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_COLLECTION) || - ClassUtils.isSubclass(psiClass, + InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_MAP)) { final PsiType[] parameters = classTYpe.getParameters(); for (PsiType parameter : parameters) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TestUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TestUtils.java index da09ad52e032..4276b02dcaa3 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TestUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,16 +21,15 @@ import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.*; +import com.intellij.psi.util.InheritanceUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class TestUtils { - private TestUtils() { - super(); - } + private TestUtils() {} public static boolean isTest(@Nullable PsiClass aClass) { if (aClass == null) { @@ -104,6 +103,7 @@ public class TestUtils { public static boolean isJUnitTestClass(@Nullable PsiClass targetClass){ return targetClass != null && - ClassUtils.isSubclass(targetClass, "junit.framework.TestCase"); + InheritanceUtil.isInheritor(targetClass, + "junit.framework.TestCase"); } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TypeUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TypeUtils.java index 3bf1c26e149e..989262a3fc45 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TypeUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/TypeUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package com.siyeh.ig.psiutils; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.*; +import com.intellij.psi.util.InheritanceUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,7 +31,8 @@ public class TypeUtils { private TypeUtils() {} public static boolean expressionHasType( - @Nullable PsiExpression expression, @NonNls @NotNull String typeName) { + @Nullable PsiExpression expression, + @NonNls @NotNull String typeName) { if (expression == null) { return false; } @@ -79,7 +82,7 @@ public class TypeUtils { } final PsiClassType classType = (PsiClassType) type; final PsiClass aClass = classType.resolve(); - return aClass != null && ClassUtils.isSubclass(aClass, typeName); + return aClass != null && InheritanceUtil.isInheritor(aClass, typeName); } //getTypeIfOneOfOrSubtype @@ -102,7 +105,7 @@ public class TypeUtils { return null; } for (String typeName : typeNames) { - if (ClassUtils.isSubclass(aClass, typeName)) { + if (InheritanceUtil.isInheritor(aClass, typeName)) { return typeName; } } @@ -128,7 +131,7 @@ public class TypeUtils { return false; } for (String typeName : typeNames) { - if (ClassUtils.isSubclass(aClass, typeName)) { + if (InheritanceUtil.isInheritor(aClass, typeName)) { return true; } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java index 571e45796e65..50ae091a5efd 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2010 Bas Leijdekkers + * Copyright 2008-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -305,9 +305,9 @@ public class WeakestTypeFinder { HardcodedMethodConstants.INDEX_OF.equals(methodName) || HardcodedMethodConstants.LAST_INDEX_OF.equals(methodName)) { final PsiClass containingClass = method.getContainingClass(); - if (ClassUtils.isSubclass(containingClass, + if (InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_MAP) || - ClassUtils.isSubclass(containingClass, + InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); @@ -521,9 +521,9 @@ public class WeakestTypeFinder { if (aClass == null) { return true; } - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION) && - !ClassUtils.isSubclass(aClass, + !InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ERROR)) { return true; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomClassloaderInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomClassloaderInspection.java index 4b22cdd0c2f2..4f8261e42314 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomClassloaderInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomClassloaderInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,34 +16,38 @@ package com.siyeh.ig.security; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class CustomClassloaderInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "custom.classloader.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "custom.classloader.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new CustomClassloaderVisitor(); } - private static class CustomClassloaderVisitor extends BaseInspectionVisitor { + private static class CustomClassloaderVisitor + extends BaseInspectionVisitor { @Override public void visitClass(@NotNull PsiClass aClass) { - if (!ClassUtils.isSubclass(aClass, "java.lang.ClassLoader")) { + if (!InheritanceUtil.isInheritor(aClass, "java.lang.ClassLoader")) { return; } if ("java.lang.ClassLoader".equals(aClass.getQualifiedName())) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomSecurityManagerInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomSecurityManagerInspection.java index ece9f3a26dfd..77976d22d576 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomSecurityManagerInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/security/CustomSecurityManagerInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,26 +16,29 @@ package com.siyeh.ig.security; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class CustomSecurityManagerInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "custom.security.manager.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "custom.security.manager.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new CustomSecurityManagerVisitor(); } @@ -44,7 +47,8 @@ public class CustomSecurityManagerInspection extends BaseInspection { extends BaseInspectionVisitor { @Override public void visitClass(@NotNull PsiClass aClass) { - if (!ClassUtils.isSubclass(aClass, "java.lang.SecurityManager")) { + if (!InheritanceUtil.isInheritor(aClass, + "java.lang.SecurityManager")) { return; } if ("java.lang.SecurityManager".equals(aClass.getQualifiedName())) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCExecuteWithNonConstantStringInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCExecuteWithNonConstantStringInspection.java index 9672698927fb..0c2cae24b5c6 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCExecuteWithNonConstantStringInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCExecuteWithNonConstantStringInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.security; import com.intellij.psi.*; import com.intellij.psi.util.ConstantExpressionUtil; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -82,7 +82,7 @@ public class JDBCExecuteWithNonConstantStringInspection if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "java.sql.Statement")) { + if (!InheritanceUtil.isInheritor(aClass, "java.sql.Statement")) { return; } final PsiExpressionList argumentList = expression.getArgumentList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCPrepareStatementWithNonConstantStringInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCPrepareStatementWithNonConstantStringInspection.java index 45e7be17045b..480307a66650 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCPrepareStatementWithNonConstantStringInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/security/JDBCPrepareStatementWithNonConstantStringInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.security; import com.intellij.psi.*; import com.intellij.psi.util.ConstantExpressionUtil; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -80,7 +80,7 @@ public class JDBCPrepareStatementWithNonConstantStringInspection if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "java.sql.Connection")) { + if (!InheritanceUtil.isInheritor(aClass, "java.sql.Connection")) { return; } final PsiExpressionList argumentList = expression.getArgumentList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/security/LoadLibraryWithNonConstantStringInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/security/LoadLibraryWithNonConstantStringInspection.java index aa7d1882eb3a..5405d5ea548f 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/security/LoadLibraryWithNonConstantStringInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/security/LoadLibraryWithNonConstantStringInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.siyeh.ig.security; import com.intellij.psi.*; import com.intellij.psi.util.ConstantExpressionUtil; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -66,7 +66,7 @@ public class LoadLibraryWithNonConstantStringInspection if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "java.lang.System")) { + if (!InheritanceUtil.isInheritor(aClass, "java.lang.System")) { return; } final PsiExpressionList argumentList = expression.getArgumentList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/security/UnsecureRandomNumberGenerationInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/security/UnsecureRandomNumberGenerationInspection.java index 9f46ee14edd2..bdc2eeb2f49c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/security/UnsecureRandomNumberGenerationInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/security/UnsecureRandomNumberGenerationInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,22 +16,24 @@ package com.siyeh.ig.security; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class UnsecureRandomNumberGenerationInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "unsecure.random.number.generation.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { @NonNls final String text = ((PsiElement)infos[0]).getText(); @@ -47,6 +49,7 @@ public class UnsecureRandomNumberGenerationInspection } } + @Override public BaseInspectionVisitor buildVisitor() { return new InsecureRandomNumberGenerationVisitor(); } @@ -54,7 +57,8 @@ public class UnsecureRandomNumberGenerationInspection private static class InsecureRandomNumberGenerationVisitor extends BaseInspectionVisitor { - @Override public void visitNewExpression(@NotNull PsiNewExpression expression) { + @Override public void visitNewExpression( + @NotNull PsiNewExpression expression) { super.visitNewExpression(expression); final PsiJavaCodeReferenceElement reference = expression.getClassReference(); @@ -66,7 +70,7 @@ public class UnsecureRandomNumberGenerationInspection return; } final PsiClass aClass = (PsiClass) element; - if (!ClassUtils.isSubclass(aClass, "java.util.Random")) { + if (!InheritanceUtil.isInheritor(aClass, "java.util.Random")) { return; } final String qualifiedName = aClass.getQualifiedName(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/ComparatorNotSerializableInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/ComparatorNotSerializableInspection.java index 382f61343232..ea9174a44eaa 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/ComparatorNotSerializableInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/ComparatorNotSerializableInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2006-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,12 @@ package com.siyeh.ig.serialization; import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiAnonymousClass; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.MakeSerializableFix; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.SerializationUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -63,7 +63,7 @@ public class ComparatorNotSerializableInspection extends BaseInspection { if (aClass instanceof PsiAnonymousClass) { return; } - if (!ClassUtils.isSubclass(aClass, + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_COMPARATOR)) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/SerializableInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/SerializableInspection.java index fd11cb0eb5c4..dfecdac65843 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/SerializableInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/serialization/SerializableInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 Bas Leijdekkers + * Copyright 2007-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,22 +15,20 @@ */ package com.siyeh.ig.serialization; +import com.intellij.codeInspection.ui.AddAction; import com.intellij.codeInspection.ui.ListTable; import com.intellij.codeInspection.ui.ListWrappingTableModel; import com.intellij.codeInspection.ui.RemoveAction; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiClass; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; -import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.SerializationUtils; -import com.intellij.codeInspection.ui.AddAction; import org.jdom.Element; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JPanel; +import javax.swing.*; import java.util.ArrayList; import java.util.List; @@ -44,16 +42,19 @@ public abstract class SerializableInspection extends BaseInspection { parseString(superClassString, superClassList); } + @Override public JComponent createOptionsPanel() { final Form form = new Form(); return form.getContentPanel(); } + @Override public void readSettings(Element node) throws InvalidDataException { super.readSettings(node); parseString(superClassString, superClassList); } + @Override public void writeSettings(Element node) throws WriteExternalException { superClassString = formatString(superClassList); super.writeSettings(node); @@ -64,7 +65,7 @@ public abstract class SerializableInspection extends BaseInspection { return false; } for (String superClassName : superClassList) { - if (ClassUtils.isSubclass(aClass, superClassName)) { + if (InheritanceUtil.isInheritor(aClass, superClassName)) { return true; } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/style/ImplicitCallToSuperInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/style/ImplicitCallToSuperInspection.java index 20d592f9fbbe..80557649207e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/style/ImplicitCallToSuperInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/style/ImplicitCallToSuperInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,9 +81,8 @@ public class ImplicitCallToSuperInspection extends BaseInspection { JavaPsiFacade.getElementFactory(project); final PsiStatement newStatement = factory.createStatementFromText("super();", null); - final PsiManager psiManager = PsiManager.getInstance(project); final CodeStyleManager styleManager = - psiManager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); if (body == null) { return; } @@ -116,7 +115,8 @@ public class ImplicitCallToSuperInspection extends BaseInspection { final PsiClass superClass = containingClass.getSuperClass(); if (superClass != null) { final String superClassName = superClass.getQualifiedName(); - if (CommonClassNames.JAVA_LANG_OBJECT.equals(superClassName)) { + if (CommonClassNames.JAVA_LANG_OBJECT.equals( + superClassName)) { return; } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ConditionSignalInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ConditionSignalInspection.java index bd557b4f42ff..bc875905351f 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ConditionSignalInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ConditionSignalInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,37 +18,42 @@ package com.siyeh.ig.threading; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class ConditionSignalInspection extends BaseInspection { + @Override @NotNull public String getID() { return "CallToSignalInsteadOfSignalAll"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message("condition.signal.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "condition.signal.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new ConditionSignalVisitor(); } + @Override public InspectionGadgetsFix buildFix(Object... infos) { return new ConditionSignalFix(); } @@ -61,6 +66,7 @@ public class ConditionSignalInspection extends BaseInspection { "condition.signal.replace.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement methodNameElement = descriptor.getPsiElement(); @@ -105,9 +111,8 @@ public class ConditionSignalInspection extends BaseInspection { if (containingClass == null) { return; } - if (!ClassUtils - .isSubclass(containingClass, - "java.util.concurrent.locks.Condition")) { + if (!InheritanceUtil.isInheritor(containingClass, + "java.util.concurrent.locks.Condition")) { return; } registerMethodCallError(expression); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SleepWhileHoldingLockInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SleepWhileHoldingLockInspection.java index 850d19a61efb..429264eadf69 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SleepWhileHoldingLockInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SleepWhileHoldingLockInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,28 +16,31 @@ package com.siyeh.ig.threading; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class SleepWhileHoldingLockInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "sleep.while.holding.lock.display.name"); } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "sleep.while.holding.lock.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new SleepWhileHoldingLockVisitor(); } @@ -50,7 +53,8 @@ public class SleepWhileHoldingLockInspection extends BaseInspection { super.visitMethodCallExpression(expression); final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); + @NonNls final String methodName = + methodExpression.getReferenceName(); if (!"sleep".equals(methodName)) { return; } @@ -76,7 +80,8 @@ public class SleepWhileHoldingLockInspection extends BaseInspection { } final PsiClass methodClass = method.getContainingClass(); if (methodClass == null || - !ClassUtils.isSubclass(methodClass, "java.lang.Thread")) { + !InheritanceUtil.isInheritor(methodClass, + "java.lang.Thread")) { return; } registerMethodCallError(expression); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SynchronizedMethodInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SynchronizedMethodInspection.java index 65d0fb982cce..1cdbb6eceea9 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SynchronizedMethodInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/SynchronizedMethodInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,12 +36,14 @@ public class SynchronizedMethodInspection extends BaseInspection { public boolean m_includeNativeMethods = true; + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "synchronized.method.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { final PsiMethod method = (PsiMethod)infos[0]; @@ -49,6 +51,7 @@ public class SynchronizedMethodInspection extends BaseInspection { "synchronized.method.problem.descriptor", method.getName()); } + @Override protected InspectionGadgetsFix buildFix(Object... infos) { final PsiMethod method = (PsiMethod)infos[0]; if (method.getBody() == null) { @@ -57,10 +60,12 @@ public class SynchronizedMethodInspection extends BaseInspection { return new SynchronizedMethodFix(); } + @Override public BaseInspectionVisitor buildVisitor() { return new SynchronizedMethodVisitor(); } + @Override public JComponent createOptionsPanel() { return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message( "synchronized.method.include.option"), @@ -75,6 +80,7 @@ public class SynchronizedMethodInspection extends BaseInspection { "synchronized.method.move.quickfix"); } + @Override public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement nameElement = descriptor.getPsiElement(); @@ -100,14 +106,14 @@ public class SynchronizedMethodInspection extends BaseInspection { replacementText = "{ synchronized(this){" + text.substring(1) + '}'; } - final PsiManager psiManager = PsiManager.getInstance(project); - final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(psiManager.getProject()).getElementFactory(); + final PsiElementFactory elementFactory = + JavaPsiFacade.getElementFactory(project); final PsiCodeBlock block = elementFactory.createCodeBlockFromText(replacementText, null); body.replace(block); final CodeStyleManager codeStyleManager = - psiManager.getCodeStyleManager(); + CodeStyleManager.getInstance(project); codeStyleManager.reformat(method); } } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadLocalNotStaticFinalInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadLocalNotStaticFinalInspection.java index df7ed165308e..90c60113ec7b 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadLocalNotStaticFinalInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadLocalNotStaticFinalInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2009 Bas Leijdekkers + * Copyright 2009-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,12 @@ package com.siyeh.ig.threading; import com.intellij.psi.*; -import com.siyeh.InspectionGadgetsBundle;import com.siyeh.ig.BaseInspection; +import com.intellij.psi.util.InheritanceUtil; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.MakeFieldStaticFinalFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -66,7 +67,7 @@ public class ThreadLocalNotStaticFinalInspection extends BaseInspection { if (aClass == null) { return; } - if (!ClassUtils.isSubclass(aClass, "java.lang.ThreadLocal")) { + if (!InheritanceUtil.isInheritor(aClass, "java.lang.ThreadLocal")) { return; } final PsiModifierList modifierList = field.getModifierList(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadRunInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadRunInspection.java index e5c2edbb5ee3..5e156a0bec18 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadRunInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadRunInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package com.siyeh.ig.threading; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.siyeh.HardcodedMethodConstants; @@ -25,26 +26,29 @@ import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class ThreadRunInspection extends BaseInspection { + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message("thread.run.display.name"); } + @Override @NotNull public String getID() { return "CallToThreadRun"; } + @Override @NotNull protected String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message("thread.run.problem.descriptor"); } + @Override public InspectionGadgetsFix buildFix(Object... infos) { return new ThreadRunFix(); } @@ -57,6 +61,7 @@ public class ThreadRunInspection extends BaseInspection { "thread.run.replace.quickfix"); } + @Override public void doFix(@NotNull Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement methodNameIdentifier = descriptor.getPsiElement(); @@ -101,7 +106,7 @@ public class ThreadRunInspection extends BaseInspection { if (methodClass == null) { return; } - if (!ClassUtils.isSubclass(methodClass, "java.lang.Thread")) { + if (!InheritanceUtil.isInheritor(methodClass, "java.lang.Thread")) { return; } if (isInsideThreadRun(expression)) { @@ -125,7 +130,7 @@ public class ThreadRunInspection extends BaseInspection { if (methodClass == null) { return false; } - return ClassUtils.isSubclass(methodClass, "java.lang.Thread"); + return InheritanceUtil.isInheritor(methodClass, "java.lang.Thread"); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadStartInConstructionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadStartInConstructionInspection.java index e1d0f296c0b9..bc55c7d33d94 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadStartInConstructionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadStartInConstructionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package com.siyeh.ig.threading; import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -25,23 +26,27 @@ import org.jetbrains.annotations.NotNull; public class ThreadStartInConstructionInspection extends BaseInspection { + @Override @NotNull public String getID() { return "CallToThreadStartDuringObjectConstruction"; } + @Override @NotNull public String getDisplayName() { return InspectionGadgetsBundle.message( "thread.start.in.construction.display.name"); } + @Override @NotNull public String buildErrorString(Object... infos) { return InspectionGadgetsBundle.message( "thread.start.in.construction.problem.descriptor"); } + @Override public BaseInspectionVisitor buildVisitor() { return new ThreadStartInConstructionVisitor(); } @@ -83,13 +88,14 @@ public class ThreadStartInConstructionInspection extends BaseInspection { if (method == null) { return; } - final PsiParameterList parameterList = method.getParameterList(); + final PsiParameterList parameterList = + method.getParameterList(); if (parameterList.getParametersCount() != 0) { return; } final PsiClass methodClass = method.getContainingClass(); if (methodClass == null || - !ClassUtils.isSubclass(methodClass, + !InheritanceUtil.isInheritor(methodClass, "java.lang.Thread")) { return; } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadingUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadingUtils.java index de07d7af82ad..4f0e523165bb 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadingUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/ThreadingUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2011 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,20 +16,19 @@ package com.siyeh.ig.threading; import com.intellij.psi.*; -import com.siyeh.ig.psiutils.ClassUtils; +import com.intellij.psi.util.InheritanceUtil; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; class ThreadingUtils { - private ThreadingUtils() { - super(); - } + private ThreadingUtils() {} public static boolean isWaitCall( @NotNull PsiMethodCallExpression expression) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); + @NonNls final String methodName = methodExpression.getReferenceName(); if (!"wait".equals(methodName)) { return false; } @@ -62,7 +61,7 @@ class ThreadingUtils { @NotNull PsiMethodCallExpression expression) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); + @NonNls final String methodName = methodExpression.getReferenceName(); if (!"notify".equals(methodName) && !"notifyAll".equals(methodName)) { return false; } @@ -75,7 +74,7 @@ class ThreadingUtils { @NotNull PsiMethodCallExpression expression) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); + @NonNls final String methodName = methodExpression.getReferenceName(); if (!"signal".equals(methodName) && !"signalAll".equals(methodName)) { return false; } @@ -92,15 +91,15 @@ class ThreadingUtils { if (containingClass == null) { return false; } - return ClassUtils.isSubclass(containingClass, - "java.util.concurrent.locks.Condition"); + return InheritanceUtil.isInheritor(containingClass, + "java.util.concurrent.locks.Condition"); } public static boolean isAwaitCall( @NotNull PsiMethodCallExpression expression) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); + @NonNls final String methodName = methodExpression.getReferenceName(); if (!"await".equals(methodName) && !"awaitUntil".equals(methodName) && !"awaitUninterruptibly".equals(methodName) @@ -115,7 +114,7 @@ class ThreadingUtils { if (containingClass == null) { return false; } - return ClassUtils.isSubclass(containingClass, - "java.util.concurrent.locks.Condition"); + return InheritanceUtil.isInheritor(containingClass, + "java.util.concurrent.locks.Condition"); } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/ui/TreeClassChooserAction.java b/plugins/InspectionGadgets/src/com/siyeh/ig/ui/TreeClassChooserAction.java deleted file mode 100644 index 7aeb1b7e8764..000000000000 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/ui/TreeClassChooserAction.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2010 Bas Leijdekkers - * - * 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.siyeh.ig.ui; - -import com.intellij.codeInspection.ui.ListTable; -import com.intellij.codeInspection.ui.ListWrappingTableModel; -import com.intellij.ide.DataManager; -import com.intellij.ide.util.ClassFilter; -import com.intellij.ide.util.TreeClassChooser; -import com.intellij.ide.util.TreeClassChooserFactory; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.DataKeys; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiClass; -import com.intellij.psi.search.GlobalSearchScope; -import com.siyeh.InspectionGadgetsBundle; -import com.siyeh.ig.psiutils.ClassUtils; -import org.jetbrains.annotations.NonNls; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; - -public class TreeClassChooserAction extends AbstractAction { - - private final ListTable table; - private final String chooserTitle; - private final String[] ancestorClasses; - - public TreeClassChooserAction(ListTable table, String chooserTitle, - @NonNls String... ancestorClasses) { - this.table = table; - this.chooserTitle = chooserTitle; - this.ancestorClasses = ancestorClasses; - putValue(NAME, InspectionGadgetsBundle.message("button.add")); - } - - public void actionPerformed(ActionEvent e) { - final DataManager dataManager = DataManager.getInstance(); - final Object source = e.getSource(); - if (!(source instanceof Component)) { - return; - } - final DataContext dataContext = - dataManager.getDataContext((Component) source); - final Project project = DataKeys.PROJECT.getData(dataContext); - if (project == null) { - return; - } - final TreeClassChooserFactory chooserFactory = - TreeClassChooserFactory.getInstance(project); - final ClassFilter filter; - if (ancestorClasses.length == 0) { - filter = ClassFilter.ALL; - } else { - filter = new ClassFilter() { - public boolean isAccepted(PsiClass aClass) { - for (String ancestorClass : ancestorClasses) { - if (ClassUtils.isSubclass(aClass, ancestorClass)) { - return true; - } - } - return false; - } - }; - } - final TreeClassChooser classChooser = - chooserFactory.createWithInnerClassesScopeChooser(chooserTitle, - GlobalSearchScope.allScope(project), filter, null); - classChooser.showDialog(); - final PsiClass selectedClass = classChooser.getSelected(); - if (selectedClass == null) { - return; - } - final String qualifiedName = selectedClass.getQualifiedName(); - final ListWrappingTableModel tableModel = table.getModel(); - final int index = tableModel.indexOf(qualifiedName, 0); - final int rowIndex; - if (index < 0) { - tableModel.addRow(qualifiedName); - rowIndex = tableModel.getRowCount() - 1; - } else { - rowIndex = index; - } - final ListSelectionModel selectionModel = - table.getSelectionModel(); - selectionModel.setSelectionInterval(rowIndex, rowIndex); - EventQueue.invokeLater(new Runnable() { - public void run() { - final Rectangle rectangle = - table.getCellRect(rowIndex, 0, true); - table.scrollRectToVisible(rectangle); - } - }); - } -} diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/ui/UiUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/ui/UiUtils.java index a5fe7c1521d5..e6f2efe99e14 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/ui/UiUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/ui/UiUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2010 Bas Leijdekkers + * Copyright 2010-2011 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,9 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.Icons; import com.siyeh.InspectionGadgetsBundle; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -251,7 +251,7 @@ public class UiUtils { public boolean isAccepted(PsiClass aClass) { for (String ancestorClass : ancestorClasses) { - if (ClassUtils.isSubclass(aClass, ancestorClass)) { + if (InheritanceUtil.isInheritor(aClass, ancestorClass)) { return true; } } diff --git a/plugins/cvs/cvs-core/cvs-core.iml b/plugins/cvs/cvs-core/cvs-core.iml index 53189febbd11..f03fefa6352e 100644 --- a/plugins/cvs/cvs-core/cvs-core.iml +++ b/plugins/cvs/cvs-core/cvs-core.iml @@ -11,7 +11,7 @@ - + diff --git a/plugins/git4idea/git4idea.iml b/plugins/git4idea/git4idea.iml index 830aa37f58f3..c923afcd21fc 100644 --- a/plugins/git4idea/git4idea.iml +++ b/plugins/git4idea/git4idea.iml @@ -12,7 +12,7 @@ - + diff --git a/plugins/git4idea/src/git4idea/GitBranch.java b/plugins/git4idea/src/git4idea/GitBranch.java index 760fde91957e..aba9ab2189ff 100644 --- a/plugins/git4idea/src/git4idea/GitBranch.java +++ b/plugins/git4idea/src/git4idea/GitBranch.java @@ -40,7 +40,7 @@ public class GitBranch extends GitReference { @NonNls public static final String REFS_REMOTES_PREFIX = "refs/remotes/"; // Prefix for remote branches ({@value}) private final boolean myRemote; - private final boolean myActive; + private boolean myActive; public GitBranch(@NotNull String name, boolean active, boolean remote) { super(name); @@ -179,6 +179,7 @@ public class GitBranch extends GitReference { // origin/HEAD -> origin/master final String[] split = output.split("\n"); GitBranch currentBranch = null; + String activeRemoteName = null; for (String b : split) { boolean current = b.charAt(0) == '*'; b = b.substring(2).trim(); @@ -191,8 +192,15 @@ public class GitBranch extends GitReference { remotePrefix = REFS_REMOTES_PREFIX; } boolean isRemote = remotePrefix != null || remoteOnly; - if (isRemote && !remoteOnly) { - b = b.substring(remotePrefix.length()); + if (isRemote) { + if (! remoteOnly) { + b = b.substring(remotePrefix.length()); + } + final int idx = b.indexOf("HEAD ->"); + if (idx > 0) { + activeRemoteName = b.substring(idx + "HEAD ->".length() + remotePrefix.length()); + continue; + } } final GitBranch branch = new GitBranch(b, current, isRemote); if (current) { @@ -202,6 +210,14 @@ public class GitBranch extends GitReference { branches.add(branch); } } + if (activeRemoteName != null) { + for (GitBranch branch : branches) { + if (activeRemoteName.equals(branch.getName())) { + branch.setActive(true); + break; + } + } + } return currentBranch; } @@ -294,4 +310,8 @@ public class GitBranch extends GitReference { return GitRevisionNumber.resolve(project, root, output); } } + + public void setActive(boolean active) { + myActive = active; + } } diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index e5162b693c5d..4fede4094319 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -220,6 +220,7 @@ + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java index ded4e33da138..0c80b0d05c5d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/GroovyAnnotator.java @@ -88,6 +88,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUt import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightParameter; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; import org.jetbrains.plugins.groovy.lang.psi.impl.types.GrClosureSignatureUtil; +import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import org.jetbrains.plugins.groovy.lang.resolve.noncode.GrInheritConstructorContributor; @@ -1439,12 +1440,22 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator { final PsiElement refNameElement = getElementToHighlight(refExpr); Annotation annotation = holder.createInfoAnnotation(refNameElement, null); - if (member instanceof PsiField || member instanceof GrAccessorMethod) { + if (member instanceof PsiField) { annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_FIELD : DefaultHighlighter.INSTANCE_FIELD); return; } + else if (member instanceof GrAccessorMethod) { + annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_PROPERTY_REFERENCE : DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE); + return; + } if (member instanceof PsiMethod) { - annotation.setTextAttributes(!isStatic ? DefaultHighlighter.METHOD_CALL : DefaultHighlighter.STATIC_METHOD_ACCESS); + if (GroovyPropertyUtils.isSimplePropertyAccessor((PsiMethod)member)) { + annotation + .setTextAttributes(isStatic ? DefaultHighlighter.STATIC_PROPERTY_REFERENCE : DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE); + } + else { + annotation.setTextAttributes(isStatic ? DefaultHighlighter.STATIC_METHOD_ACCESS : DefaultHighlighter.METHOD_CALL); + } } if (member instanceof PsiClass) { highligtClassReference(holder, refExpr); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyResultOfAssignmentUsedInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyResultOfAssignmentUsedInspection.java index b8513d3b350f..c8c90d9334cd 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyResultOfAssignmentUsedInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyResultOfAssignmentUsedInspection.java @@ -21,10 +21,15 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.BaseInspection; import org.jetbrains.plugins.groovy.codeInspection.BaseInspectionVisitor; +import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; +import org.jetbrains.plugins.groovy.lang.psi.api.formatter.GrControlStatement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression; +import java.util.List; + public class GroovyResultOfAssignmentUsedInspection extends BaseInspection { @Nls @@ -54,7 +59,9 @@ public class GroovyResultOfAssignmentUsedInspection extends BaseInspection { public void visitAssignmentExpression(GrAssignmentExpression grAssignmentExpression) { super.visitAssignmentExpression(grAssignmentExpression); final PsiElement parent = grAssignmentExpression.getParent(); - if (parent instanceof GrCodeBlock || parent instanceof GroovyFile || parent == null) { + final List returns = ControlFlowUtils.collectReturns(ControlFlowUtils.findControlFlowOwner(grAssignmentExpression)); + if (!returns.contains(grAssignmentExpression) && + (parent instanceof GrCodeBlock || parent instanceof GroovyFile || parent instanceof GrControlStatement || parent == null)) { return; } registerError(grAssignmentExpression); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyFindUsagesHandlerFactory.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyFindUsagesHandlerFactory.java index d3cbc97a606c..d53d33a9874d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyFindUsagesHandlerFactory.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyFindUsagesHandlerFactory.java @@ -57,33 +57,35 @@ public class GroovyFindUsagesHandlerFactory extends JavaFindUsagesHandlerFactory @Override public PsiElement[] getSecondaryElements() { PsiElement element = getPsiElement(); - if (ApplicationManager.getApplication().isUnitTestMode()) return PsiElement.EMPTY_ARRAY; final PsiField field = (PsiField)element; PsiClass containingClass = field.getContainingClass(); if (containingClass != null) { - PsiMethod getter = GroovyPropertyUtils.findGetterForField(field); - PsiMethod setter = GroovyPropertyUtils.findSetterForField(field); - if (getter != null || setter != null) { + PsiMethod[] getters = GroovyPropertyUtils.getAllGettersByField(field); + PsiMethod[] setters = GroovyPropertyUtils.getAllSettersByField(field); + if (getters.length + setters.length > 0) { final boolean doSearch; - if ((getter == null || !getter.isPhysical()) && (setter == null || !setter.isPhysical())) { - doSearch = true; - } - else { + if (arePhysical(getters) || arePhysical(setters)) { + if (ApplicationManager.getApplication().isUnitTestMode()) return PsiElement.EMPTY_ARRAY; doSearch = Messages.showDialog(FindBundle.message("find.field.accessors.prompt", field.getName()), FindBundle.message("find.field.accessors.title"), new String[]{CommonBundle.getYesButtonText(), CommonBundle.getNoButtonText()}, 0, Messages.getQuestionIcon()) == DialogWrapper.OK_EXIT_CODE; } + else { + doSearch = true; + } if (doSearch) { final List elements = new ArrayList(); - if (getter != null) { + for (PsiMethod getter : getters) { ContainerUtil.addAll(elements, SuperMethodWarningUtil.checkSuperMethods(getter, ACTION_STRING)); } - if (setter != null) { + + for (PsiMethod setter : setters) { ContainerUtil.addAll(elements, SuperMethodWarningUtil.checkSuperMethods(setter, ACTION_STRING)); } return elements.toArray(new PsiElement[elements.size()]); - } else { + } + else { return PsiElement.EMPTY_ARRAY; } } @@ -92,4 +94,11 @@ public class GroovyFindUsagesHandlerFactory extends JavaFindUsagesHandlerFactory } }; } + + private static boolean arePhysical(PsiMethod[] methods) { + for (PsiMethod method : methods) { + if (method.isPhysical()) return true; + } + return false; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java index ccd8127030bb..e8ba1f3f4142 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/DefaultHighlighter.java @@ -76,7 +76,10 @@ public class DefaultHighlighter { static final String STATIC_METHOD_ACCESS_ID = "Static method access"; @NonNls static final String CLASS_REFERENCE_ID = "Class"; - + @NonNls + static final String INSTANCE_PROPERTY_REFERENCE_ID = "Instance property reference ID"; + @NonNls + static final String STATIC_PROPERTY_REFERENCE_ID = "Static property reference ID"; @NonNls static final String MAP_KEY_ID = "Map key"; @@ -115,6 +118,18 @@ public class DefaultHighlighter { public static TextAttributesKey CLASS_REFERENCE = TextAttributesKey.createTextAttributesKey(CLASS_REFERENCE_ID, HighlighterColors.TEXT.getDefaultAttributes().clone()); + public static final TextAttributes INSTANCE_PROPERTY_REFERENCE_ATTRIBUTES = INSTANCE_FIELD.getDefaultAttributes().clone(); + public static final TextAttributes STATIC_PROPERTY_REFERENCE_ATTRIBUTES = STATIC_FIELD.getDefaultAttributes().clone(); + static { + INSTANCE_PROPERTY_REFERENCE_ATTRIBUTES.setFontType(Font.PLAIN); + STATIC_PROPERTY_REFERENCE_ATTRIBUTES.setFontType(Font.ITALIC); + } + public static TextAttributesKey INSTANCE_PROPERTY_REFERENCE = + TextAttributesKey.createTextAttributesKey(INSTANCE_PROPERTY_REFERENCE_ID, INSTANCE_PROPERTY_REFERENCE_ATTRIBUTES); + + public static TextAttributesKey STATIC_PROPERTY_REFERENCE = + TextAttributesKey.createTextAttributesKey(STATIC_PROPERTY_REFERENCE_ID, STATIC_PROPERTY_REFERENCE_ATTRIBUTES); + public static final TextAttributes KEYWORD_ATTRIBUTES = SyntaxHighlighterColors.KEYWORD.getDefaultAttributes().clone(); static{ diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java index 194a5318b54a..46d7d091a58d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyColorsAndFontsPage.java @@ -72,6 +72,8 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage { new AttributesDescriptor(DefaultHighlighter.INSTANCE_FIELD_ID, DefaultHighlighter.INSTANCE_FIELD), new AttributesDescriptor(DefaultHighlighter.CLASS_REFERENCE_ID, DefaultHighlighter.CLASS_REFERENCE), new AttributesDescriptor(DefaultHighlighter.MAP_KEY_ID, DefaultHighlighter.MAP_KEY), + new AttributesDescriptor(DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE_ID, DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE), + new AttributesDescriptor(DefaultHighlighter.STATIC_PROPERTY_REFERENCE_ID, DefaultHighlighter.STATIC_PROPERTY_REFERENCE), }; @NotNull @@ -111,7 +113,8 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage { "'JetBrains'.matches(/Jw+Bw+/) \n" + "def x=1 + unresolved\n" + "def f1 = []\n" + - "File f=['path']" + "File f=['path']\n" + + "print new Demo().property" ; } @@ -128,6 +131,8 @@ public class GroovyColorsAndFontsPage implements ColorSettingsPage { map.put("classref", DefaultHighlighter.CLASS_REFERENCE); map.put("literal", DefaultHighlighter.LITERAL_CONVERSION); map.put("mapkey", DefaultHighlighter.MAP_KEY); + map.put("prop", DefaultHighlighter.INSTANCE_PROPERTY_REFERENCE); + map.put("staticprop", DefaultHighlighter.STATIC_PROPERTY_REFERENCE); return map; } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java new file mode 100644 index 000000000000..d781e5445d22 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/highlighter/GroovyTodoIndexer.java @@ -0,0 +1,35 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.highlighter; + +import com.intellij.lexer.FilterLexer; +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.todo.LexerBasedTodoIndexer; +import com.intellij.psi.impl.cache.impl.todo.TodoOccurrenceConsumer; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyFilterLexer; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyLexer; +import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; + +/** + * @author Maxim.Medvedev + */ +public class GroovyTodoIndexer extends LexerBasedTodoIndexer { + @Override + protected Lexer createLexer(TodoOccurrenceConsumer consumer) { + final GroovyFilterLexer groovyFilterLexer = new GroovyFilterLexer(new GroovyLexer(), consumer); + return new FilterLexer(groovyFilterLexer, new FilterLexer.SetFilter(GroovyTokenTypes.WHITE_SPACES_OR_COMMENTS)); + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java index 9af0d1b949b3..08bc54b2eccc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GrMethodMergingContributor.java @@ -57,7 +57,7 @@ public class GrMethodMergingContributor extends CompletionContributor { } final PsiMethod method = (PsiMethod)o; - final JavaChainLookupElement chain = item.as(JavaChainLookupElement.class); + final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); final String name = method.getName() + "#" + (chain == null ? "" : chain.getQualifier().getLookupString()); if (commonName != null && !commonName.equals(name)) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index d1d663dbf9fa..23c74940a745 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -36,13 +36,8 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; import com.intellij.util.PairConsumer; import com.intellij.util.ProcessingContext; -import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.hash.HashMap; -import com.intellij.util.containers.hash.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.GroovyBundle; -import org.jetbrains.plugins.groovy.GroovyIcons; -import org.jetbrains.plugins.groovy.lang.completion.handlers.NamedArgumentInsertHandler; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.lexer.TokenSets; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; @@ -56,29 +51,23 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgument import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; -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.GrReferenceExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrCallExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrGdkMethod; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; -import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; import org.jetbrains.plugins.groovy.lang.resolve.processors.CompletionProcessor; import org.jetbrains.plugins.groovy.lang.resolve.processors.ResolverProcessor; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; import static com.intellij.patterns.PlatformPatterns.psiElement; import static com.intellij.patterns.PsiJavaPatterns.elementType; @@ -170,78 +159,6 @@ public class GroovyCompletionContributor extends CompletionContributor { } }; - private static final CompletionProvider MAP_ARGUMENT_COMPLETION_PROVIDER = - new CompletionProvider() { - @Override - protected void addCompletions(@NotNull CompletionParameters parameters, - ProcessingContext context, - @NotNull CompletionResultSet result) { - final GrArgumentList argumentList; - - PsiElement parent = parameters.getPosition().getParent(); - if (parent instanceof GrReferenceExpression) { - if (((GrReferenceExpression)parent).getQualifier() != null) return; - argumentList = (GrArgumentList)parent.getParent(); - } - else { - argumentList = (GrArgumentList)parent.getParent().getParent(); - } - - final GrCall call = (GrCall)argumentList.getParent(); - List results = new ArrayList(); - //constructor call - if (call instanceof GrConstructorCall) { - GrConstructorCall constructorCall = (GrConstructorCall)call; - ContainerUtil.addAll(results, constructorCall.multiResolveConstructor()); - ContainerUtil.addAll(results, constructorCall.multiResolveClass()); - } - else if (call instanceof GrCallExpression) { - GrCallExpression constructorCall = (GrCallExpression)call; - ContainerUtil.addAll(results, constructorCall.getCallVariants(null)); - final PsiType type = ((GrCallExpression)call).getType(); - if (type instanceof PsiClassType) { - final PsiClass psiClass = ((PsiClassType)type).resolve(); - results.add(new GroovyResolveResultImpl(psiClass, true)); - } - } - - Set usedClasses = new HashSet(); - Set usedNames = new HashSet(); - for (GrNamedArgument argument : argumentList.getNamedArguments()) { - final GrArgumentLabel label = argument.getLabel(); - if (label != null) { - final String name = label.getName(); - if (name != null) { - usedNames.add(name); - } - } - } - - for (GroovyResolveResult resolveResult : results) { - PsiElement element = resolveResult.getElement(); - if (element instanceof PsiMethod) { - final PsiMethod method = (PsiMethod)element; - final PsiClass containingClass = method.getContainingClass(); - if (containingClass != null) { - addPropertiesForClass(result, usedClasses, usedNames, containingClass, call); - } - if (method instanceof GrMethod) { - for (String parameter : ((GrMethod)method).getNamedParametersArray()) { - if (!usedNames.contains(parameter)) { - final LookupElementBuilder lookup = - LookupElementBuilder.create(parameter).setIcon(GroovyIcons.DYNAMIC).setInsertHandler(NamedArgumentInsertHandler.INSTANCE); - result.addElement(lookup); - } - } - } - } - else if (element instanceof PsiClass) { - addPropertiesForClass(result, usedClasses, usedNames, (PsiClass)element, call); - } - } - } - }; - private static final PsiElementPattern.Capture STATEMENT_START = psiElement(GroovyElementTypes.mIDENT).andOr( psiElement().afterLeaf(StandardPatterns.or( @@ -374,8 +291,8 @@ public class GroovyCompletionContributor extends CompletionContributor { } }); - extend(CompletionType.BASIC, IN_ARGUMENT_LIST_OF_CALL, MAP_ARGUMENT_COMPLETION_PROVIDER); - extend(CompletionType.BASIC, IN_MAP_KEY_ARGUMENT_LIST_OF_CALL, MAP_ARGUMENT_COMPLETION_PROVIDER); + extend(CompletionType.BASIC, IN_ARGUMENT_LIST_OF_CALL, new MapArgumentCompletionProvider()); + extend(CompletionType.BASIC, IN_MAP_KEY_ARGUMENT_LIST_OF_CALL, new MapArgumentCompletionProvider()); // class name stuff @@ -451,13 +368,7 @@ public class GroovyCompletionContributor extends CompletionContributor { result.restartCompletionOnPrefixChange(IS_PREFIX); final Map staticMembers = hashMap(); final PsiElement qualifier = reference.getQualifier(); - final PsiType qualifierType; - if (qualifier instanceof GrExpression) { - qualifierType = ((GrExpression)qualifier).getType(); - } - else { - qualifierType = null; - } + final PsiType qualifierType = qualifier instanceof GrExpression ? ((GrExpression)qualifier).getType() : null; final ElementFilter classFilter = getClassFilter(position); @@ -531,7 +442,7 @@ public class GroovyCompletionContributor extends CompletionContributor { if (object instanceof PsiClass && !classFilter.isAcceptable(object, position)) { return; } - result.addElement(lookupElement); + result.addElement(JavaCompletionUtil.highlightIfNeeded(qualifierType, lookupElement, object)); } }); @@ -616,62 +527,6 @@ public class GroovyCompletionContributor extends CompletionContributor { return processor; } - private static void addPropertiesForClass(CompletionResultSet result, - Set usedClasses, - Set usedNames, - PsiClass containingClass, - GrCall call) { - if (usedClasses.contains(containingClass)) return; - usedClasses.add(containingClass); - final PsiClass eventListener = - JavaPsiFacade.getInstance(call.getProject()).findClass("java.util.EventListener", call.getResolveScope()); - Map writableProperties = new HashMap(); - for (PsiMethod method : containingClass.getAllMethods()) { - if (GroovyPropertyUtils.isSimplePropertySetter(method)) { - if (PsiUtil.isStaticsOK(method, call)) { - final String name = GroovyPropertyUtils.getPropertyNameBySetter(method); - if (name != null && !writableProperties.containsKey(name)) { - writableProperties.put(name, method); - } - } - } - else if (eventListener != null) { - consumeListenerProperties(result, usedNames, method, eventListener); - } - } - - for (String name : writableProperties.keySet()) { - if (usedNames.contains(name)) continue; - usedNames.add(name); - final LookupElementBuilder builder = - LookupElementBuilder.create(writableProperties.get(name), name).setIcon(GroovyIcons.PROPERTY) - .setInsertHandler(NamedArgumentInsertHandler.INSTANCE); - result.addElement(builder); - } - } - - private static void consumeListenerProperties(CompletionResultSet result, - Set usedNames, PsiMethod method, PsiClass eventListenerClass) { - if (method.getName().startsWith("add") && method.getParameterList().getParametersCount() == 1) { - final PsiParameter parameter = method.getParameterList().getParameters()[0]; - final PsiType type = parameter.getType(); - if (type instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)type; - final PsiClass listenerClass = classType.resolve(); - if (listenerClass != null) { - final PsiMethod[] listenerMethods = listenerClass.getMethods(); - if (InheritanceUtil.isInheritorOrSelf(listenerClass, eventListenerClass, true)) { - for (PsiMethod listenerMethod : listenerMethods) { - final String name = listenerMethod.getName(); - usedNames.add(name); - result.addElement(LookupElementBuilder.create(name).setIcon(GroovyIcons.PROPERTY).setInsertHandler(NamedArgumentInsertHandler.INSTANCE)); - } - } - } - } - } - } - public void beforeCompletion(@NotNull final CompletionInitializationContext context) { if (context.getCompletionType() == CompletionType.BASIC && context.getFile() instanceof GroovyFile) { if (semicolonNeeded(context)) { @@ -729,5 +584,4 @@ public class GroovyCompletionContributor extends CompletionContributor { } return true; } - } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java new file mode 100644 index 000000000000..b804471b5b2a --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java @@ -0,0 +1,177 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.completion; + +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionProvider; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.psi.*; +import com.intellij.psi.util.InheritanceUtil; +import com.intellij.util.ProcessingContext; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.hash.HashMap; +import com.intellij.util.containers.hash.HashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.GroovyIcons; +import org.jetbrains.plugins.groovy.lang.completion.handlers.NamedArgumentInsertHandler; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConstructorCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrCallExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; +import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyResolveResultImpl; +import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** +* @author peter +*/ +class MapArgumentCompletionProvider extends CompletionProvider { + @Override + protected void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull CompletionResultSet result) { + final GrArgumentList argumentList; + + PsiElement parent = parameters.getPosition().getParent(); + if (parent instanceof GrReferenceExpression) { + if (((GrReferenceExpression)parent).getQualifier() != null) return; + argumentList = (GrArgumentList)parent.getParent(); + } + else { + argumentList = (GrArgumentList)parent.getParent().getParent(); + } + + final GrCall call = (GrCall)argumentList.getParent(); + List results = new ArrayList(); + //constructor call + if (call instanceof GrConstructorCall) { + GrConstructorCall constructorCall = (GrConstructorCall)call; + ContainerUtil.addAll(results, constructorCall.multiResolveConstructor()); + ContainerUtil.addAll(results, constructorCall.multiResolveClass()); + } + else if (call instanceof GrCallExpression) { + GrCallExpression constructorCall = (GrCallExpression)call; + ContainerUtil.addAll(results, constructorCall.getCallVariants(null)); + final PsiType type = ((GrCallExpression)call).getType(); + if (type instanceof PsiClassType) { + final PsiClass psiClass = ((PsiClassType)type).resolve(); + results.add(new GroovyResolveResultImpl(psiClass, true)); + } + } + + Set usedClasses = new HashSet(); + Set usedNames = new HashSet(); + for (GrNamedArgument argument : argumentList.getNamedArguments()) { + final GrArgumentLabel label = argument.getLabel(); + if (label != null) { + final String name = label.getName(); + if (name != null) { + usedNames.add(name); + } + } + } + + for (GroovyResolveResult resolveResult : results) { + PsiElement element = resolveResult.getElement(); + if (element instanceof PsiMethod) { + final PsiMethod method = (PsiMethod)element; + final PsiClass containingClass = method.getContainingClass(); + if (containingClass != null) { + addPropertiesForClass(result, usedClasses, usedNames, containingClass, call); + } + if (method instanceof GrMethod) { + for (String parameter : ((GrMethod)method).getNamedParametersArray()) { + if (!usedNames.contains(parameter)) { + final LookupElementBuilder lookup = + LookupElementBuilder.create(parameter).setIcon(GroovyIcons.DYNAMIC).setInsertHandler(NamedArgumentInsertHandler.INSTANCE); + result.addElement(lookup); + } + } + } + } + else if (element instanceof PsiClass) { + addPropertiesForClass(result, usedClasses, usedNames, (PsiClass)element, call); + } + } + } + + private static void addPropertiesForClass(CompletionResultSet result, + Set usedClasses, + Set usedNames, + PsiClass containingClass, + GrCall call) { + if (usedClasses.contains(containingClass)) return; + usedClasses.add(containingClass); + final PsiClass eventListener = + JavaPsiFacade.getInstance(call.getProject()).findClass("java.util.EventListener", call.getResolveScope()); + Map writableProperties = new HashMap(); + for (PsiMethod method : containingClass.getAllMethods()) { + if (GroovyPropertyUtils.isSimplePropertySetter(method)) { + if (PsiUtil.isStaticsOK(method, call)) { + final String name = GroovyPropertyUtils.getPropertyNameBySetter(method); + if (name != null && !writableProperties.containsKey(name)) { + writableProperties.put(name, method); + } + } + } + else if (eventListener != null) { + consumeListenerProperties(result, usedNames, method, eventListener); + } + } + + for (String name : writableProperties.keySet()) { + if (usedNames.contains(name)) continue; + usedNames.add(name); + final LookupElementBuilder builder = + LookupElementBuilder.create(writableProperties.get(name), name).setIcon(GroovyIcons.PROPERTY) + .setInsertHandler(NamedArgumentInsertHandler.INSTANCE); + result.addElement(builder); + } + } + + private static void consumeListenerProperties(CompletionResultSet result, + Set usedNames, PsiMethod method, PsiClass eventListenerClass) { + if (method.getName().startsWith("add") && method.getParameterList().getParametersCount() == 1) { + final PsiParameter parameter = method.getParameterList().getParameters()[0]; + final PsiType type = parameter.getType(); + if (type instanceof PsiClassType) { + final PsiClassType classType = (PsiClassType)type; + final PsiClass listenerClass = classType.resolve(); + if (listenerClass != null) { + final PsiMethod[] listenerMethods = listenerClass.getMethods(); + if (InheritanceUtil.isInheritorOrSelf(listenerClass, eventListenerClass, true)) { + for (PsiMethod listenerMethod : listenerMethods) { + final String name = listenerMethod.getName(); + usedNames.add(name); + result.addElement(LookupElementBuilder.create(name).setIcon(GroovyIcons.PROPERTY).setInsertHandler(NamedArgumentInsertHandler.INSTANCE)); + } + } + } + } + } + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyFilterLexer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyFilterLexer.java new file mode 100644 index 000000000000..618f07ee6c2b --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/lexer/GroovyFilterLexer.java @@ -0,0 +1,55 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang.lexer; + +import com.intellij.lexer.Lexer; +import com.intellij.psi.impl.cache.impl.BaseFilterLexer; +import com.intellij.psi.tree.IElementType; + +import static com.intellij.psi.search.UsageSearchContext.*; +import static org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes.*; +import static org.jetbrains.plugins.groovy.lang.lexer.TokenSets.STRING_LITERALS; + +/** + * @author Maxim.Medvedev + */ +public class GroovyFilterLexer extends BaseFilterLexer { + + public GroovyFilterLexer(Lexer originalLexer, OccurrenceConsumer occurrenceConsumer) { + super(originalLexer, occurrenceConsumer); + } + + + public void advance() { + final IElementType tokenType = getDelegate().getTokenType(); + + if (tokenType == mIDENT || KEYWORDS.contains(tokenType)) { + addOccurrenceInToken(IN_CODE); + } + else if (STRING_LITERALS.contains(tokenType)) { + scanWordsInToken(IN_STRINGS | IN_FOREIGN_LANGUAGES, false, true); + } + else if (COMMENT_SET.contains(tokenType)) { + scanWordsInToken(IN_COMMENTS, false, false); + advanceTodoItemCountsInToken(); + } + else { + scanWordsInToken(IN_PLAIN_TEXT, false, false); + } + + getDelegate().advance(); + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java index 7703bfdeee05..f7549ed0b22a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/util/GroovyPropertyUtils.java @@ -42,6 +42,15 @@ public class GroovyPropertyUtils { private GroovyPropertyUtils() { } + public static PsiMethod[] getAllSettersByField(PsiField field) { + return getAllSetters(field.getContainingClass(), field.getName(), field.hasModifierProperty(GrModifier.STATIC), false); + } + + @NotNull + public static PsiMethod[] getAllGettersByField(PsiField field) { + return getAllGetters(field.getContainingClass(), field.getName(), field.hasModifierProperty(GrModifier.STATIC), false); + } + @Nullable public static PsiMethod findSetterForField(PsiField field) { final PsiClass containingClass = field.getContainingClass(); @@ -84,11 +93,9 @@ public class GroovyPropertyUtils { return null; } - /** - * @deprecated use PropertyUtil.getAllProperties() instead. - */ - @Deprecated() - public static List getAllPropertyGetters(@NotNull PsiClass aClass, @Nullable Boolean isStatic, boolean checkSuperClasses) { + @NotNull + public static PsiMethod[] getAllGetters(PsiClass aClass, String propertyName, boolean isStatic, boolean checkSuperClasses) { + if (aClass == null) return PsiMethod.EMPTY_ARRAY; PsiMethod[] methods; if (checkSuperClasses) { methods = aClass.getAllMethods(); @@ -97,19 +104,46 @@ public class GroovyPropertyUtils { methods = aClass.getMethods(); } - List res = new ArrayList(methods.length); - + List result = new ArrayList(); for (PsiMethod method : methods) { - if (isStatic != null && method.hasModifierProperty(PsiModifier.STATIC) != isStatic) continue; + if (method.hasModifierProperty(PsiModifier.STATIC) != isStatic) continue; if (isSimplePropertyGetter(method)) { - res.add(method); + if (propertyName.equals(getPropertyNameByGetter(method))) { + result.add(method); + } } } - return res; + return result.toArray(new PsiMethod[result.size()]); } + @NotNull + public static PsiMethod[] getAllSetters(PsiClass aClass, String propertyName, boolean isStatic, boolean checkSuperClasses) { + if (aClass == null) return PsiMethod.EMPTY_ARRAY; + PsiMethod[] methods; + if (checkSuperClasses) { + methods = aClass.getAllMethods(); + } + else { + methods = aClass.getMethods(); + } + + List result = new ArrayList(); + for (PsiMethod method : methods) { + if (method.hasModifierProperty(PsiModifier.STATIC) != isStatic) continue; + + if (isSimplePropertySetter(method)) { + if (propertyName.equals(getPropertyNameBySetter(method))) { + result.add(method); + } + } + } + + return result.toArray(new PsiMethod[result.size()]); + } + + @Nullable public static PsiMethod findPropertyGetter(@Nullable PsiClass aClass, String propertyName, diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionTestWithLibrary.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionTestWithLibrary.groovy index 7ccd12a9a202..cf5bb0c9d232 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionTestWithLibrary.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GrCompletionTestWithLibrary.groovy @@ -110,4 +110,57 @@ for (def ch: "abc".toCharArray()) { print ch.toUpperCase() }""" } + + public void testDeclaredMembersGoFirst() { + myFixture.configureByText "a.groovy", """ + class Foo { + def superProp + void fromSuper() {} + void fromSuper2() {} + void overridden() {} + } + + class FooImpl extends Foo { + def thisProp + void overridden() {} + void fromThis() {} + void fromThis2() {} + void fromThis3() {} + void fromThis4() {} + void fromThis5() {} + } + + new FooImpl(). + """ + myFixture.completeBasic() + assertOrderedEquals myFixture.lookupElementStrings,"""\ +fromThis +fromThis2 +fromThis3 +fromThis4 +fromThis5 +overridden +thisProp +class +equals +fromSuper +fromSuper2 +getProperty +hashCode +invokeMethod +metaClass +metaPropertyValues +notify +notifyAll +properties +setProperty +superProp +toString +wait +wait +wait +with\ +""".split('\n') + } + } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index f760de060c87..ccf5d4ac2afa 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -19,6 +19,7 @@ import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.codeInspection.GroovyImportsTracker; import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyAssignabilityCheckInspection; +import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyResultOfAssignmentUsedInspection; import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyUncheckedAssignmentOfMemberOfRawTypeInspection; import org.jetbrains.plugins.groovy.codeInspection.bugs.GroovyAccessibilityInspection; import org.jetbrains.plugins.groovy.codeInspection.bugs.GroovyLabeledStatementInspection; @@ -347,4 +348,8 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { public void testTestMarkupStubs() { doTest(); } + + public void testResultOfAssignmentUsed() { + doTest(new GroovyResultOfAssignmentUsedInspection()); + } } \ No newline at end of file diff --git a/plugins/groovy/testdata/highlighting/ResultOfAssignmentUsed.groovy b/plugins/groovy/testdata/highlighting/ResultOfAssignmentUsed.groovy new file mode 100644 index 000000000000..6724c412bf18 --- /dev/null +++ b/plugins/groovy/testdata/highlighting/ResultOfAssignmentUsed.groovy @@ -0,0 +1,9 @@ +public class AssResult { + public void context(boolean b, String ps) { + String vs = 'prefix' + if (b) vs += ps // warning + if (b) { vs += ps } // no warning + print vs = 4 + println ps + } +} \ No newline at end of file diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java b/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java index 349f68ae987b..ae717723db89 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java @@ -47,12 +47,7 @@ import com.intellij.util.containers.Convertor; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.messages.Topic; import org.jetbrains.annotations.Nullable; -import org.zmlx.hg4idea.provider.HgCachingCommitedChangesProvider; -import org.zmlx.hg4idea.provider.HgChangeProvider; -import org.zmlx.hg4idea.provider.HgDiffProvider; -import org.zmlx.hg4idea.provider.HgHistoryProvider; -import org.zmlx.hg4idea.provider.HgMergeProvider; -import org.zmlx.hg4idea.provider.HgRollbackEnvironment; +import org.zmlx.hg4idea.provider.*; import org.zmlx.hg4idea.provider.annotate.HgAnnotationProvider; import org.zmlx.hg4idea.provider.commit.HgCheckinEnvironment; import org.zmlx.hg4idea.provider.update.HgIntegrateEnvironment; @@ -136,6 +131,10 @@ public class HgVcs extends AbstractVcs { return new HgProjectConfigurable(projectSettings); } + public HgProjectSettings getProjectSettings() { + return projectSettings; + } + @Override public ChangeProvider getChangeProvider() { return changeProvider; diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgChangesetsCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgChangesetsCommand.java index bbbd4e8e8ad1..266d457f085c 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgChangesetsCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgChangesetsCommand.java @@ -16,6 +16,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import org.apache.commons.lang.StringUtils; +import org.jetbrains.annotations.Nullable; import org.zmlx.hg4idea.HgRevisionNumber; import java.nio.charset.Charset; @@ -33,8 +34,8 @@ public abstract class HgChangesetsCommand { private static final String SEPARATOR_STRING = "\u0017"; //ascii: end of transmission block - private final Project project; - private final String command; + protected final Project project; + protected final String command; public HgChangesetsCommand(Project project, String command) { this.project = project; @@ -46,9 +47,6 @@ public abstract class HgChangesetsCommand { } protected List getRevisions(VirtualFile repo) { - HgCommandService commandService = HgCommandService.getInstance(project); - - List args = new ArrayList(Arrays.asList( "--template", "{rev}|{node|short}|{author}|{desc|firstline}" + SEPARATOR_STRING, @@ -57,13 +55,7 @@ public abstract class HgChangesetsCommand { addArguments(args); - HgCommandResult result; - if (isAuthenticationNeeded()) { - String repositoryURL = new HgShowConfigCommand(project).getDefaultPath(repo); - result = new HgCommandAuthenticator().executeCommandAndAuthenticateIfNecessary(project, repo, repositoryURL, command, args, args.size()-1); - } else { - result = commandService.execute(repo, HgCommandService.DEFAULT_OPTIONS, command, args, Charset.defaultCharset(), isSilentCommand()); - } + HgCommandResult result = executeCommand(repo, args); if (result == null) { return Collections.emptyList(); @@ -89,14 +81,12 @@ public abstract class HgChangesetsCommand { return revisions; } - protected boolean isSilentCommand() { - return false; + @Nullable + protected HgCommandResult executeCommand(VirtualFile repo, List args) { + return HgCommandService.getInstance(project).execute(repo, HgCommandService.DEFAULT_OPTIONS, command, args, Charset.defaultCharset(), isSilentCommand()); } - /** - * Return false for local operations, true - for remote, which may require authenticate on the server. - */ - protected boolean isAuthenticationNeeded() { + protected boolean isSilentCommand() { return false; } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandAuthenticator.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandAuthenticator.java index 9df9d4a6d07a..5007815066f6 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandAuthenticator.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandAuthenticator.java @@ -33,6 +33,7 @@ import java.net.URISyntaxException; import java.util.List; import java.util.Map; +import static org.zmlx.hg4idea.command.HgErrorUtil.isAbort; import static org.zmlx.hg4idea.command.HgErrorUtil.isAuthorizationError; /** @@ -67,23 +68,27 @@ class HgCommandAuthenticator { HgUrl hgUrl = new HgUrl(remoteRepository); if (hgUrl.supportsAuthentication()) { final GetPasswordRunnable runnable = new GetPasswordRunnable(project, hgUrl); - // first time try to get info from password safe if it's there, or show auth dialog if not - result = tryToAuthenticate(project, localRepository, hgUrl, runnable, command, arguments, urlArgumentPosition); - if (!isAuthorizationError(result)) { - saveCredentials(project, runnable); - } else { - // then twice request auth info from user - runnable.setForceShowDialog(true); - for (int i = 0; i < 2; i++) { - result = tryToAuthenticate(project, localRepository, hgUrl, runnable, command, arguments, urlArgumentPosition); - if (!isAuthorizationError(result)) { - saveCredentials(project, runnable); + for (int i = 0; i < 3; i++) { + if (i == 1) { + runnable.setForceShowDialog(true); // first time try to get info from password safe if it's there, next time don't even try, + // because it means that the saved data didn't pass the authentication + } + result = tryToAuthenticate(project, localRepository, hgUrl, runnable, command, arguments, urlArgumentPosition); + if (result == HgCommandResult.CANCELLED) { + return result; + } + if (isAbort(result)) { + if (isAuthorizationError(result)) { + continue; + } else { return result; } } - HgUtil.notifyError(project, "Authentication failed", "Authentication to " + remoteRepository + " failed"); + saveCredentials(project, runnable); return result; } + HgUtil.notifyError(project, "Authentication failed", "Authentication to " + remoteRepository + " failed"); + return result; } else { HgUtil.notifyError(project, "Authentication error", "Authentication was requested, but " + hgUrl.getScheme() + " doesn't support it."); } @@ -106,6 +111,8 @@ class HgCommandAuthenticator { if (runnable.isOk()) { hgUrl.setUsername(runnable.getUserName()); hgUrl.setPassword(String.valueOf(runnable.getPassword())); + } else { + return HgCommandResult.CANCELLED; } arguments.set(urlArgumentPosition, hgUrl.asString()); @@ -198,7 +205,14 @@ class HgCommandAuthenticator { return; } - final HgUsernamePasswordDialog dialog = new HgUsernamePasswordDialog(project, login, password); + String url; + try { + url = hgUrl.asString(false); + } + catch (URISyntaxException e) { + url = null; + } + final HgUsernamePasswordDialog dialog = new HgUsernamePasswordDialog(project, url, login, password); dialog.show(); if (dialog.isOK()) { userName = dialog.getUsername(); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandResult.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandResult.java index 8c5988fc3e3a..8057b46f08f1 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandResult.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandResult.java @@ -20,7 +20,8 @@ import java.util.List; public final class HgCommandResult { - static final HgCommandResult EMPTY = new HgCommandResult(new StringWriter(), new StringWriter(), 0); + public static final HgCommandResult EMPTY = new HgCommandResult(new StringWriter(), new StringWriter(), 0); + public static final HgCommandResult CANCELLED = new HgCommandResult(new StringWriter(), new StringWriter(), 1); private final StringWriter out; private final StringWriter err; diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgIncomingCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgIncomingCommand.java index 8470e5f3424f..b905c3459071 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgIncomingCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgIncomingCommand.java @@ -14,26 +14,10 @@ package org.zmlx.hg4idea.command; import com.intellij.openapi.project.Project; -import java.util.List; - -public class HgIncomingCommand extends HgChangesetsCommand { +public class HgIncomingCommand extends HgRemoteChangesetsCommand { public HgIncomingCommand(Project project) { super(project, "incoming"); } - @Override - protected void addArguments(List args) { - args.add("--newest-first"); - } - - @Override - protected boolean isSilentCommand() { - return true; - } - - @Override - protected boolean isAuthenticationNeeded() { - return true; - } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgOutgoingCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgOutgoingCommand.java index 0304578f9c76..a14eb43e2cac 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgOutgoingCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgOutgoingCommand.java @@ -14,26 +14,10 @@ package org.zmlx.hg4idea.command; import com.intellij.openapi.project.Project; -import java.util.List; - -public class HgOutgoingCommand extends HgChangesetsCommand { +public class HgOutgoingCommand extends HgRemoteChangesetsCommand { public HgOutgoingCommand(Project project) { super(project, "outgoing"); } - @Override - protected void addArguments(List args) { - args.add("--newest-first"); - } - - @Override - protected boolean isSilentCommand() { - return true; - } - - @Override - protected boolean isAuthenticationNeeded() { - return true; - } } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPullCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPullCommand.java index 62379eaaf2ad..c5d1a3fb1287 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPullCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPullCommand.java @@ -69,7 +69,7 @@ public class HgPullCommand { arguments.add(source); - HgCommandResult result = authenticator.executeCommandAndAuthenticateIfNecessary(project, repo, source, "pull", arguments); + HgCommandResult result = authenticator.executeCommandAndAuthenticateIfNecessary(project, repo, source, "pull", arguments, arguments.size()-1); project.getMessageBus().syncPublisher(HgVcs.REMOTE_TOPIC).update(project); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPushCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPushCommand.java index 3ae51ac0613a..8a80c2cbc925 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPushCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgPushCommand.java @@ -65,7 +65,7 @@ public class HgPushCommand { } arguments.add(myDestination); - final HgCommandResult result = authenticator.executeCommandAndAuthenticateIfNecessary(myProject, myRepo, myDestination, "push", arguments); + final HgCommandResult result = authenticator.executeCommandAndAuthenticateIfNecessary(myProject, myRepo, myDestination, "push", arguments, arguments.size()-1); myProject.getMessageBus().syncPublisher(HgVcs.REMOTE_TOPIC).update(myProject); return result; } diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgRemoteChangesetsCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgRemoteChangesetsCommand.java new file mode 100644 index 000000000000..5166952b3166 --- /dev/null +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgRemoteChangesetsCommand.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zmlx.hg4idea.command; + +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationListener; +import com.intellij.notification.NotificationType; +import com.intellij.notification.Notifications; +import com.intellij.openapi.options.ShowSettingsUtil; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.zmlx.hg4idea.HgProjectSettings; +import org.zmlx.hg4idea.HgVcs; + +import javax.swing.event.HyperlinkEvent; +import java.util.List; + +/** + * Common ancestor for HgIncomingCommand and HgOutgoingCommand - changeset commands which need connection to the server. + * @author Kirill Likhodedov + */ +public abstract class HgRemoteChangesetsCommand extends HgChangesetsCommand { + public HgRemoteChangesetsCommand(Project project, String command) { + super(project, command); + } + + @Override + protected void addArguments(List args) { + args.add("--newest-first"); + } + + @Override + protected boolean isSilentCommand() { + return true; + } + + @Override + protected HgCommandResult executeCommand(VirtualFile repo, List args) { + String repositoryURL = new HgShowConfigCommand(project).getDefaultPath(repo); + HgCommandResult result = new HgCommandAuthenticator().executeCommandAndAuthenticateIfNecessary(project, repo, repositoryURL, command, args, args.size()-1); + if (result == HgCommandResult.CANCELLED) { + final HgVcs vcs = HgVcs.getInstance(project); + Notifications.Bus.notify(new Notification(HgVcs.NOTIFICATION_GROUP_ID, "Checking for incoming/outgoing changes disabled", + "Authentication is required to check incoming/outgoing changes in " + repositoryURL + + "
You may enable checking for changes in the Settings." + , NotificationType.ERROR, new NotificationListener() { + @Override + public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { + ShowSettingsUtil.getInstance().showSettingsDialog(project, vcs.getConfigurable()); + } + }), project); + final HgProjectSettings projectSettings = vcs.getProjectSettings(); + projectSettings.setCheckIncoming(false); + projectSettings.setCheckOutgoing(false); + } + return result; + } + +} diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgShowConfigCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgShowConfigCommand.java index 737eac4f7acb..726708f20d3e 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgShowConfigCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgShowConfigCommand.java @@ -33,6 +33,15 @@ public class HgShowConfigCommand { return execute(repo).get("paths.default"); } + public String getDefaultPushPath(VirtualFile repo) { + final Map map = execute(repo); + String path = map.get("paths.default-push"); + if (path == null) { + path = map.get("paths.default"); + } + return path; + } + public Map execute(VirtualFile repo) { if (repo == null) { return Collections.emptyMap(); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgUrl.java b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgUrl.java index 17be744cfe3d..0b6bdf1747f5 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgUrl.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/command/HgUrl.java @@ -74,9 +74,13 @@ public class HgUrl { } public String asString() throws URISyntaxException { + return asString(true); + } + + public String asString(boolean authData) throws URISyntaxException { return new URI( uri.getScheme(), - username + ":" + password, + authData ? username + ":" + password : null, uri.getHost(), uri.getPort(), uri.getPath(), @@ -84,7 +88,7 @@ public class HgUrl { uri.getFragment() ).toString(); } - + private String findUserInfoPart(int index) { String userInfo = uri.getUserInfo(); if (StringUtils.isBlank(userInfo)) { diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgPushDialog.java b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgPushDialog.java index 76002d0bb29e..425f2fe95a98 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgPushDialog.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgPushDialog.java @@ -105,7 +105,7 @@ public class HgPushDialog extends DialogWrapper { private void updateRepository() { final VirtualFile repo = hgRepositorySelectorComponent.getRepository(); final HgShowConfigCommand configCommand = new HgShowConfigCommand(myProject); - final String defaultPath = configCommand.getDefaultPath(repo); + final String defaultPath = configCommand.getDefaultPushPath(repo); repositoryTxt.setText(defaultPath); loadBranches(repo); update(); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgUsernamePasswordDialog.java b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgUsernamePasswordDialog.java index 8d156eff623d..8980b31f7a3c 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgUsernamePasswordDialog.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/ui/HgUsernamePasswordDialog.java @@ -23,10 +23,11 @@ import javax.swing.*; public class HgUsernamePasswordDialog extends DialogWrapper { private AuthenticationPanel authPanel; - public HgUsernamePasswordDialog(Project project, String login, String password) { + public HgUsernamePasswordDialog(Project project, String url, String login, String password) { super(project, false); setTitle(HgVcsMessages.message("hgidea.dialog.login.password.required")); - authPanel = new AuthenticationPanel(null, login, password, !StringUtils.isBlank(password)); + final String desc = (url == null ? null : "Login to " + url); + authPanel = new AuthenticationPanel(desc, login, password, false); init(); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java index b334ae07c122..b354c6de223f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java @@ -459,7 +459,7 @@ public class SvnConfiguration implements ProjectComponent, JDOMExternalizable { } private static final List ourAuthKinds = Arrays.asList(ISVNAuthenticationManager.PASSWORD, ISVNAuthenticationManager.SSH, - ISVNAuthenticationManager.SSL, ISVNAuthenticationManager.USERNAME, "svn.ssl.server"); + ISVNAuthenticationManager.SSL, ISVNAuthenticationManager.USERNAME, "svn.ssl.server", "svn.ssh.server"); public void clearAuthenticationDirectory() { final File authDir = new File(getConfigurationDirectory(), "auth"); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SSHCredentialsDialog.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SSHCredentialsDialog.java index 1fa1a5070926..1ed586766ba8 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SSHCredentialsDialog.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SSHCredentialsDialog.java @@ -24,6 +24,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.Consumer; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.idea.svn.SvnBundle; @@ -363,18 +364,19 @@ public class SSHCredentialsDialog extends DialogWrapper implements ActionListene public void actionPerformed(ActionEvent e) { if (e.getSource() == myPasswordButton || e.getSource() == myKeyButton) { updateFields(); + updateOKButton(); } else { - String path = myKeyFileText.getText(); + final String[] path = {myKeyFileText.getText()}; VirtualFile file; - if (path != null && path.trim().length() > 0) { - path = "file://" + path.replace(File.separatorChar, '/'); - file = VirtualFileManager.getInstance().findFileByUrl(path); + if (path[0] != null && path[0].trim().length() > 0) { + path[0] = "file://" + path[0].replace(File.separatorChar, '/'); + file = VirtualFileManager.getInstance().findFileByUrl(path[0]); } else { - path = "file://" + System.getProperty(USER_HOME_PROPERTY) + "/.ssh/identity"; - path = path.replace(File.separatorChar, '/'); - file = VirtualFileManager.getInstance().findFileByUrl(path); + path[0] = "file://" + System.getProperty(USER_HOME_PROPERTY) + "/.ssh/identity"; + path[0] = path[0].replace(File.separatorChar, '/'); + file = VirtualFileManager.getInstance().findFileByUrl(path[0]); } FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false); @@ -383,18 +385,21 @@ public class SSHCredentialsDialog extends DialogWrapper implements ActionListene descriptor.setDescription(SvnBundle.message("dialog.description.openssh.v2.private.key")); descriptor.setHideIgnored(false); - String oldValue = PropertiesComponent.getInstance().getValue("FileChooser.showHiddens"); + final String oldValue = PropertiesComponent.getInstance().getValue("FileChooser.showHiddens"); PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", Boolean.TRUE.toString()); - VirtualFile[] files = FileChooser.chooseFiles(myProject, descriptor, file); - - PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", oldValue); - if (files != null && files.length == 1) { - path = files[0].getPath().replace('/', File.separatorChar); - myKeyFileText.setText(path); - } + FileChooser.chooseFilesWithSlideEffect(descriptor, myProject, file, new Consumer() { + @Override + public void consume(VirtualFile[] files) { + PropertiesComponent.getInstance().setValue("FileChooser.showHiddens", oldValue); + if (files != null && files.length == 1) { + path[0] = files[0].getPath().replace('/', File.separatorChar); + myKeyFileText.setText(path[0]); + } + updateOKButton(); + } + }); } - updateOKButton(); } private void updateOKButton() { diff --git a/plugins/svn4idea/svn4idea.iml b/plugins/svn4idea/svn4idea.iml index fd765b400568..f67dd2fc60b3 100644 --- a/plugins/svn4idea/svn4idea.iml +++ b/plugins/svn4idea/svn4idea.iml @@ -29,7 +29,7 @@
- + diff --git a/xml/impl/src/com/intellij/ide/actions/NavigateToRelatedFileAction.java b/xml/impl/src/com/intellij/ide/actions/NavigateToRelatedFileAction.java new file mode 100644 index 000000000000..84beafb68561 --- /dev/null +++ b/xml/impl/src/com/intellij/ide/actions/NavigateToRelatedFileAction.java @@ -0,0 +1,77 @@ +package com.intellij.ide.actions; + +import com.intellij.navigation.RelatedFilesContributor; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.util.containers.HashSet; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * @author Eugene.Kudelevsky + */ +public class NavigateToRelatedFileAction extends QuickSwitchSchemeAction { + @Override + protected void fillActions(Project project, DefaultActionGroup group, DataContext dataContext) { + PsiFile psiFile = LangDataKeys.PSI_FILE.getData(dataContext); + assert psiFile != null; + Set relatedFiles = collectRelatedFiles(psiFile); + for (PsiFile file : relatedFiles) { + VirtualFile vFile = file.getVirtualFile(); + if (vFile != null) { + group.add(new MyAction(file, vFile)); + } + } + } + + @Override + protected boolean isEnabled() { + return true; + } + + @Override + public void update(AnActionEvent e) { + super.update(e); + PsiFile psiFile = LangDataKeys.PSI_FILE.getData(e.getDataContext()); + boolean visible = false; + if (psiFile != null) { + for (RelatedFilesContributor contributor : RelatedFilesContributor.EP_NAME.getExtensions()) { + if (contributor.isAvailable(psiFile)) { + visible = true; + break; + } + } + } + e.getPresentation().setVisible(visible); + } + + public static Set collectRelatedFiles(@NotNull PsiFile file) { + Set resultSet = new HashSet(); + for (RelatedFilesContributor contributor : RelatedFilesContributor.EP_NAME.getExtensions()) { + if (contributor.isAvailable(file)) { + contributor.fillRelatedFiles(file, resultSet); + } + } + return resultSet; + } + + private static class MyAction extends AnAction { + private final PsiFile myFile; + + MyAction(@NotNull PsiFile file, @NotNull VirtualFile virtualFile) { + super(file.getName(), "Navigate to " + FileUtil.toSystemDependentName(virtualFile.getPath()), file.getFileType().getIcon()); + myFile = file; + } + + @Override + public void actionPerformed(AnActionEvent e) { + if (myFile.canNavigate()) { + myFile.navigate(true); + } + } + } +} diff --git a/xml/impl/src/com/intellij/navigation/RelatedFilesContributor.java b/xml/impl/src/com/intellij/navigation/RelatedFilesContributor.java new file mode 100644 index 000000000000..516e33eb2e42 --- /dev/null +++ b/xml/impl/src/com/intellij/navigation/RelatedFilesContributor.java @@ -0,0 +1,33 @@ +/* + * Copyright 2000-2011 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.navigation; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * @author Eugene.Kudelevsky + */ +public interface RelatedFilesContributor { + ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.xml.relatedFilesContributor"); + + void fillRelatedFiles(@NotNull PsiFile file, @NotNull Set resultSet); + + boolean isAvailable(@NotNull PsiFile file); +} diff --git a/xml/impl/src/com/intellij/navigation/RelatedToHtmlFilesContributor.java b/xml/impl/src/com/intellij/navigation/RelatedToHtmlFilesContributor.java new file mode 100644 index 000000000000..49fc409e6f19 --- /dev/null +++ b/xml/impl/src/com/intellij/navigation/RelatedToHtmlFilesContributor.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2011 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.navigation; + +import com.intellij.lang.Language; +import com.intellij.lang.html.HTMLLanguage; +import com.intellij.lang.xhtml.XHTMLLanguage; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlFile; +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * @author Eugene.Kudelevsky + */ +public abstract class RelatedToHtmlFilesContributor implements RelatedFilesContributor { + @Override + public boolean isAvailable(@NotNull PsiFile psiFile) { + for (PsiFile file : psiFile.getViewProvider().getAllFiles()) { + Language language = file.getLanguage(); + if (language.isKindOf(HTMLLanguage.INSTANCE) || language.isKindOf(XHTMLLanguage.INSTANCE)) { + return true; + } + } + return false; + } + + @Override + public void fillRelatedFiles(@NotNull PsiFile file, @NotNull Set resultSet) { + for (PsiFile psiFile : file.getViewProvider().getAllFiles()) { + if (psiFile instanceof XmlFile) { + doFindRelatedFiles((XmlFile)psiFile, resultSet); + } + } + } + + protected abstract void doFindRelatedFiles(@NotNull XmlFile xmlFile, @NotNull Set resultSet); +}