diff --git a/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java b/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java index c0800908d71a..2667df01bfd2 100644 --- a/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java +++ b/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java @@ -69,7 +69,17 @@ public abstract class RequestResultProcessor { /** * A variant of {@link RequestResultProcessor} that processes all text occurrences at once, e.g. for performance purposes. */ + @SuppressWarnings("unused") public static abstract class BulkResultProcessor extends RequestResultProcessor { + + public BulkResultProcessor() { + super(); + } + + public BulkResultProcessor(@NotNull Object... equality) { + super(equality); + } + @Override public boolean processTextOccurrence(@NotNull PsiElement element, int offsetInElement, @NotNull Processor consumer) { return processTextOccurrences(element, new int[]{offsetInElement}, consumer); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java index 793e430c0b70..da77b2377cae 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionPhase.java @@ -104,11 +104,14 @@ public abstract class CompletionPhase implements Disposable { } public void ignoreCurrentDocumentChange() { + final CommandProcessor commandProcessor = CommandProcessor.getInstance(); + if (commandProcessor.getCurrentCommand() == null) return; + ignoreDocumentChanges = true; - CommandProcessor.getInstance().addCommandListener(new CommandAdapter() { + commandProcessor.addCommandListener(new CommandAdapter() { @Override public void commandFinished(CommandEvent event) { - CommandProcessor.getInstance().removeCommandListener(this); + commandProcessor.removeCommandListener(this); ignoreDocumentChanges = false; } }); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java index 10447f32f876..80d86330a91b 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 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. @@ -544,6 +544,7 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile, Ps @Override public boolean shouldChangeModificationCount(PsiElement place) { + if (!isContentsLoaded()) return true; // 1. We actually should never get GrTypeDefinition as a parent, because it is a PsiClass, // and PsiClasses prevent to go up in a tree any further // 2. If place is under a variable then @BaseScript or @Field may be changed, diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java index d80090d694bc..0986a22a1553 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -651,15 +651,10 @@ public class ClassWriter { if (attr != null) { descriptor = GenericMain.parseMethodSignature(attr.getSignature()); if (descriptor != null) { - int actualParams = md.params.length; + long actualParams = md.params.length; List sigFields = methodWrapper.signatureFields; if (sigFields != null) { - actualParams = 0; - for (VarVersionPair field : methodWrapper.signatureFields) { - if (field == null) { - actualParams++; - } - } + actualParams = sigFields.stream().filter(Objects::isNull).count(); } else if (isEnum && init) actualParams -= 2; if (actualParams != descriptor.params.size()) { diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java index b456cc849785..897b3944951d 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/main/rels/NestedClassProcessor.java @@ -405,8 +405,10 @@ public class NestedClassProcessor { MethodWrapper method = nestedNode.getWrapper().getMethodWrapper(CodeConstants.INIT_NAME, entry.getKey()); method.signatureFields = new ArrayList<>(); + boolean firstSignField = nestedNode.type != ClassNode.CLASS_ANONYMOUS; for (VarFieldPair pair : entry.getValue()) { - method.signatureFields.add(pair == null || pair.fieldKey.isEmpty() ? null : pair.varPair); + method.signatureFields.add(pair == null || (!firstSignField && pair.fieldKey.isEmpty()) ? null : pair.varPair); + firstSignField = false; } } } diff --git a/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java b/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java index 7c1cc3356f11..7a69a8e2c02f 100644 --- a/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java +++ b/plugins/java-decompiler/engine/test/org/jetbrains/java/decompiler/SingleClassesTest.java @@ -96,6 +96,7 @@ public class SingleClassesTest { @Test public void testAsserts() { doTest("pkg/TestAsserts"); } @Test public void testLocalsNames() { doTest("pkg/TestLocalsNames"); } @Test public void testAnonymousParamNames() { doTest("pkg/TestAnonymousParamNames"); } + @Test public void testAnonymousParams() { doTest("pkg/TestAnonymousParams"); } private void doTest(String testFile, String... companionFiles) { ConsoleDecompiler decompiler = fixture.getDecompiler(); diff --git a/plugins/java-decompiler/engine/testData/classes/pkg/TestAnonymousParams$1.class b/plugins/java-decompiler/engine/testData/classes/pkg/TestAnonymousParams$1.class new file mode 100644 index 000000000000..dccd219da7f3 Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/pkg/TestAnonymousParams$1.class differ diff --git a/plugins/java-decompiler/engine/testData/classes/pkg/TestAnonymousParams.class b/plugins/java-decompiler/engine/testData/classes/pkg/TestAnonymousParams.class new file mode 100644 index 000000000000..0946b63019f3 Binary files /dev/null and b/plugins/java-decompiler/engine/testData/classes/pkg/TestAnonymousParams.class differ diff --git a/plugins/java-decompiler/engine/testData/results/TestAnonymousParams.dec b/plugins/java-decompiler/engine/testData/results/TestAnonymousParams.dec new file mode 100644 index 000000000000..c48794179eea --- /dev/null +++ b/plugins/java-decompiler/engine/testData/results/TestAnonymousParams.dec @@ -0,0 +1,36 @@ +package pkg; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class TestAnonymousParams { + void foo(InputStream in, final int a) throws IOException { + FilterInputStream filterInputStream = new FilterInputStream(in) { + public int read() throws IOException { + return a;// 27 + } + };// 24 + filterInputStream.read();// 30 + }// 31 +} + +class 'pkg/TestAnonymousParams$1' { + method 'read ()I' { + 4 10 + } +} + +class 'pkg/TestAnonymousParams' { + method 'foo (Ljava/io/InputStream;I)V' { + a 12 + c 13 + 10 14 + } +} + +Lines mapping: +24 <-> 13 +27 <-> 11 +30 <-> 14 +31 <-> 15 diff --git a/plugins/java-decompiler/engine/testData/src/pkg/TestAnonymousParams.java b/plugins/java-decompiler/engine/testData/src/pkg/TestAnonymousParams.java new file mode 100644 index 000000000000..55e58bf42613 --- /dev/null +++ b/plugins/java-decompiler/engine/testData/src/pkg/TestAnonymousParams.java @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2016 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 pkg; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class TestAnonymousParams { + void foo(InputStream in, int a) throws IOException { + FilterInputStream filterInputStream = new FilterInputStream(in) { + @Override + public int read() throws IOException { + return a; + } + }; + filterInputStream.read(); + } +} diff --git a/python/pluginResources/META-INF/plugin.xml b/python/pluginResources/META-INF/plugin.xml index af5cd342fc5c..36953b3ee410 100644 --- a/python/pluginResources/META-INF/plugin.xml +++ b/python/pluginResources/META-INF/plugin.xml @@ -24,6 +24,7 @@ The Python plug-in provides smart editing for Python scripts. The feature set of com.intellij.modules.java com.intellij.modules.clion + com.intellij.modules.webstorm com.intellij.modules.rider