diff --git a/bin/scripts/win/idea.bat b/bin/scripts/win/idea.bat index f5059ff959215..116b35516659b 100644 --- a/bin/scripts/win/idea.bat +++ b/bin/scripts/win/idea.bat @@ -29,7 +29,7 @@ IF EXIST "%USER_JDK64_FILE%" ( IF EXIST "%USER_JDK_FILE%" SET /P JDK=<%USER_JDK_FILE% ) IF NOT "%JDK%" == "" ( - IF NOT EXIST "%JDK%" SET JDK=%IDE_HOME%\%JDK% + IF NOT EXIST "%JDK%" SET JDK="%IDE_HOME%\%JDK%" GOTO check ) diff --git a/bin/appletviewer.policy b/build/conf/ideaCE/common/bin/appletviewer.policy similarity index 100% rename from bin/appletviewer.policy rename to build/conf/ideaCE/common/bin/appletviewer.policy diff --git a/build/groovy/org/jetbrains/intellij/build/IdeaCommunityProperties.groovy b/build/groovy/org/jetbrains/intellij/build/IdeaCommunityProperties.groovy index d8706727fac38..080e899b92fcc 100644 --- a/build/groovy/org/jetbrains/intellij/build/IdeaCommunityProperties.groovy +++ b/build/groovy/org/jetbrains/intellij/build/IdeaCommunityProperties.groovy @@ -26,6 +26,7 @@ class IdeaCommunityProperties extends ProductProperties { applicationInfoModule = "community-resources" additionalIDEPropertiesFilePaths = ["$home/build/conf/ideaCE.properties"] toolsJarRequired = true + buildCrossPlatformDistribution = true } @Override @@ -39,6 +40,9 @@ class IdeaCommunityProperties extends ProductProperties { fileset(file: "$buildContext.paths.communityHome/LICENSE.txt") fileset(file: "$buildContext.paths.communityHome/NOTICE.txt") } + buildContext.ant.copy(todir: "$targetDirectory/bin") { + fileset(dir: "$buildContext.paths.communityHome/build/conf/ideaCE/common/bin") + } } @Override diff --git a/build/groovy/org/jetbrains/intellij/build/ProductProperties.groovy b/build/groovy/org/jetbrains/intellij/build/ProductProperties.groovy index 56d89a174c07a..0e282ab003553 100644 --- a/build/groovy/org/jetbrains/intellij/build/ProductProperties.groovy +++ b/build/groovy/org/jetbrains/intellij/build/ProductProperties.groovy @@ -65,6 +65,11 @@ public abstract class ProductProperties { */ abstract String systemSelector(ApplicationInfoProperties applicationInfo) + /** + * If {@code true} cross-platform ZIP archive containing binaries for all OS will be built + */ + boolean buildCrossPlatformDistribution = false + /** * Paths to properties files the content of which should be appended to idea.properties file */ diff --git a/build/groovy/org/jetbrains/intellij/build/impl/BuildTasksImpl.groovy b/build/groovy/org/jetbrains/intellij/build/impl/BuildTasksImpl.groovy index f805b981d6f2f..9423700566422 100644 --- a/build/groovy/org/jetbrains/intellij/build/impl/BuildTasksImpl.groovy +++ b/build/groovy/org/jetbrains/intellij/build/impl/BuildTasksImpl.groovy @@ -231,14 +231,16 @@ idea.fatal.error.notification=disabled } } - if (windowsBuilder != null && linuxBuilder != null && macBuilder != null) { - buildContext.executeStep("Build cross-platform distribution", BuildOptions.CROSS_PLATFORM_DISTRIBUTION_STEP) { - def crossPlatformBuilder = new CrossPlatformDistributionBuilder(buildContext) - crossPlatformBuilder.buildCrossPlatformZip(windowsBuilder.winDistPath, linuxBuilder.unixDistPath, macBuilder.macDistPath) + if (buildContext.productProperties.buildCrossPlatformDistribution) { + if (windowsBuilder != null && linuxBuilder != null && macBuilder != null) { + buildContext.executeStep("Build cross-platform distribution", BuildOptions.CROSS_PLATFORM_DISTRIBUTION_STEP) { + def crossPlatformBuilder = new CrossPlatformDistributionBuilder(buildContext) + crossPlatformBuilder.buildCrossPlatformZip(windowsBuilder.winDistPath, linuxBuilder.unixDistPath, macBuilder.macDistPath) + } + } + else { + buildContext.messages.info("Skipping building cross-platform distribution because some OS-specific distributions were skipped") } - } - else { - buildContext.messages.info("Skipping building cross-platform distribution because some OS-specific distributions was skipeed") } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java b/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java index c53f80661f0f9..67f1e7b73cfd5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/CompoundPositionManager.java @@ -36,10 +36,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; public class CompoundPositionManager extends PositionManagerEx implements MultiRequestPositionManager{ private static final Logger LOG = Logger.getInstance(CompoundPositionManager.class); @@ -57,9 +54,10 @@ public CompoundPositionManager(PositionManager manager) { public void appendPositionManager(PositionManager manager) { myPositionManagers.remove(manager); myPositionManagers.add(0, manager); + mySourcePositionCache.clear(); } - private final Cache mySourcePositionCache = new Cache<>(); + private final Map mySourcePositionCache = new WeakHashMap<>(); private interface Processor { T process(PositionManager positionManager) throws NoDataException; @@ -196,21 +194,4 @@ public ThreeState evaluateCondition(@NotNull EvaluationContext context, } return ThreeState.UNSURE; } - - private static class Cache { - private K myKey; - private V myValue; - - public V get(@NotNull K key) { - if (key.equals(myKey)) { - return myValue; - } - return null; - } - - public void put(@NotNull K key, V value) { - myKey = key; - myValue = value; - } - } } diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java index e673f7c29cc61..954dd10592bbf 100644 --- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java @@ -85,7 +85,7 @@ public SdkSettingsStep(WizardContext context, sdkFilter = JdkComboBox.getSdkFilter(sdkTypeIdFilter); } - myJdkComboBox = new JdkComboBox(myModel, sdkFilter, sdkTypeIdFilter, true); + myJdkComboBox = new JdkComboBox(myModel, sdkTypeIdFilter, sdkFilter, sdkTypeIdFilter, true); myJdkPanel = new JPanel(new GridBagLayout()); final PropertiesComponent component = project == null ? PropertiesComponent.getInstance() : PropertiesComponent.getInstance(project); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java index f43b142cb80d2..6ef56538841b5 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java @@ -66,14 +66,15 @@ public JdkComboBox(@NotNull final ProjectSdksModel jdkModel) { public JdkComboBox(@NotNull final ProjectSdksModel jdkModel, @Nullable Condition filter) { - this(jdkModel, getSdkFilter(filter), filter, false); + this(jdkModel, filter, getSdkFilter(filter), filter, false); } public JdkComboBox(@NotNull final ProjectSdksModel jdkModel, + @Nullable Condition sdkTypeFilter, @Nullable Condition filter, @Nullable Condition creationFilter, boolean addSuggestedItems) { - super(new JdkComboBoxModel(jdkModel, filter, addSuggestedItems)); + super(new JdkComboBoxModel(jdkModel, sdkTypeFilter, filter, addSuggestedItems)); myFilter = filter; myCreationFilter = creationFilter; setRenderer(new ProjectJdkListRenderer() { @@ -289,7 +290,8 @@ public void reloadModel(JdkComboBoxItem firstItem, @Nullable Project project) { } private static class JdkComboBoxModel extends DefaultComboBoxModel { - public JdkComboBoxModel(final ProjectSdksModel jdksModel, @Nullable Condition sdkFilter, boolean addSuggested) { + public JdkComboBoxModel(final ProjectSdksModel jdksModel, @Nullable Condition sdkTypeFilter, + @Nullable Condition sdkFilter, boolean addSuggested) { Sdk[] jdks = jdksModel.getSdks(); Arrays.sort(jdks, (s1, s2) -> s1.getName().compareToIgnoreCase(s2.getName())); for (Sdk jdk : jdks) { @@ -298,14 +300,14 @@ public JdkComboBoxModel(final ProjectSdksModel jdksModel, @Nullable Condition sdkFilter, Sdk[] jdks) { + protected void addSuggestedItems(@Nullable Condition sdkTypeFilter, Sdk[] jdks) { SdkType[] types = SdkType.getAllTypes(); for (SdkType type : types) { - if (sdkFilter == null || ContainerUtil.find(jdks, sdkFilter) == null) { + if (sdkTypeFilter == null || sdkTypeFilter.value(type) && ContainerUtil.find(jdks, sdk -> sdk.getSdkType() == type) == null) { String homePath = type.suggestHomePath(); if (homePath != null && type.isValidSdkHome(homePath)) { addElement(new SuggestedJdkItem(type, homePath)); diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java index 56c6cf8ac3e96..50a4ef4ea5681 100644 --- a/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java +++ b/java/java-analysis-api/src/com/intellij/codeInsight/intention/QuickFixFactory.java @@ -272,5 +272,9 @@ public abstract IntentionAction createAddMissingRequiredAnnotationParametersFix( @NotNull public abstract IntentionAction createWrapWithOptionalFix(@Nullable PsiType type, @NotNull PsiExpression expression); - public abstract IntentionAction createNotIterableForEachLoopFix(PsiExpression expression); + @Nullable + public abstract IntentionAction createNotIterableForEachLoopFix(@NotNull PsiExpression expression); + + @NotNull + public abstract List createAddAnnotationAttributeNameFixes(@NotNull PsiNameValuePair pair); } \ No newline at end of file diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java index 2e8953bb4a38b..ca0bdef14229c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java @@ -33,6 +33,7 @@ import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.intellij.psi.impl.source.PsiImmediateClassType; +import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -72,7 +73,12 @@ static HighlightInfo checkNameValuePair(PsiNameValuePair pair) { else { String description = JavaErrorMessages.message("annotation.missing.method", ref.getCanonicalText()); PsiElement element = ref.getElement(); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(element).descriptionAndTooltip(description).create(); + final HighlightInfo highlightInfo = + HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(element).descriptionAndTooltip(description).create(); + for (IntentionAction action : QuickFixFactory.getInstance().createAddAnnotationAttributeNameFixes(pair)) { + QuickFixAction.registerQuickFixAction(highlightInfo, action); + } + return highlightInfo; } } else { @@ -152,7 +158,7 @@ static HighlightInfo checkMemberValueType(@Nullable PsiAnnotationMemberValue val final PsiClass psiClass = PsiUtil.resolveClassInType(type); if (psiClass != null && psiClass.isEnum() && !(expr instanceof PsiReferenceExpression && ((PsiReferenceExpression)expr).resolve() instanceof PsiEnumConstant)) { String description = JavaErrorMessages.message("annotation.non.enum.constant.attribute.value"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(value).descriptionAndTooltip(description).create(); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(value).descriptionAndTooltip(description).create(); } if (type != null && TypeConversionUtil.areTypesAssignmentCompatible(expectedType, expr) || @@ -749,7 +755,7 @@ static HighlightInfo checkReceiverType(PsiReceiverParameter parameter) { private static boolean isStatic(PsiModifierListOwner owner) { if (owner == null) return false; - if (owner instanceof PsiClass && ((PsiClass)owner).getContainingClass() == null) return true; + if (owner instanceof PsiClass && ClassUtil.isTopLevelClass((PsiClass)owner)) return true; PsiModifierList modifierList = owner.getModifierList(); return modifierList != null && modifierList.hasModifierProperty(PsiModifier.STATIC); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java index 833f6af6a2cc1..6abc17f6cb124 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/intention/EmptyQuickFixFactory.java @@ -16,7 +16,6 @@ package com.intellij.codeInsight.intention; import com.intellij.codeInsight.daemon.QuickFixActionRegistrar; -import com.intellij.codeInspection.IntentionAndQuickFixAction; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.codeInspection.LocalQuickFixOnPsiElement; @@ -627,8 +626,15 @@ public IntentionAction createWrapWithOptionalFix(@Nullable PsiType type, @NotNul return QuickFixes.EMPTY_FIX; } + @Nullable @Override - public IntentionAction createNotIterableForEachLoopFix(PsiExpression expression) { + public IntentionAction createNotIterableForEachLoopFix(@NotNull PsiExpression expression) { return QuickFixes.EMPTY_FIX; } + + @NotNull + @Override + public List createAddAnnotationAttributeNameFixes(@NotNull PsiNameValuePair pair) { + return Collections.emptyList(); + } } diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index 1f09a42310c11..84d58fb6818ab 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -78,9 +78,14 @@ public PsiField[] findDeclaredFields(@NotNull final PsiManager manager, @NotNull @Override @NotNull public PsiMethod[] findDeclaredMethods(@NotNull final PsiManager manager, @NotNull String name) { - final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(manager.getProject()); - GlobalSearchScope scope = GlobalSearchScope.allScope(manager.getProject()); - return cache.getMethodsByNameIfNotMoreThan(name, scope, MAX_COUNT); + Project project = manager.getProject(); + final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(project); + GlobalSearchScope sources = GlobalSearchScope.projectScope(project); + GlobalSearchScope libraries = GlobalSearchScope.notScope(sources); + PsiMethod[] sourceMethods = cache.getMethodsByNameIfNotMoreThan(name, sources, MAX_COUNT); + if (sourceMethods.length == MAX_COUNT) return sourceMethods; + PsiMethod[] libraryMethods = cache.getMethodsByNameIfNotMoreThan(name, libraries, MAX_COUNT-sourceMethods.length); + return ArrayUtil.mergeArrays(sourceMethods, libraryMethods); } }; private static final PsiType[] PRIMITIVE_TYPES = {PsiType.BYTE, PsiType.CHAR, PsiType.SHORT, PsiType.INT, PsiType.LONG, PsiType.FLOAT, PsiType.DOUBLE}; @@ -1274,9 +1279,11 @@ private ExpectedTypeInfo[] findClassesWithDeclaredField(@NotNull PsiReferenceExp * By default searches in the global scope (see ourGlobalScopeClassProvider), but caller can provide its own algorithm e.g. to narrow search scope */ public interface ExpectedClassProvider { - PsiField[] findDeclaredFields(final PsiManager manager, String name); + @NotNull + PsiField[] findDeclaredFields(@NotNull PsiManager manager, @NotNull String name); - PsiMethod[] findDeclaredMethods(final PsiManager manager, String name); + @NotNull + PsiMethod[] findDeclaredMethods(@NotNull PsiManager manager, @NotNull String name); } @NotNull diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/JavaRainbowVisitor.java b/java/java-impl/src/com/intellij/codeInsight/daemon/JavaRainbowVisitor.java new file mode 100644 index 0000000000000..34fb907a57a09 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/JavaRainbowVisitor.java @@ -0,0 +1,77 @@ +/* + * 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 com.intellij.codeInsight.daemon; + +import com.intellij.codeHighlighting.RainbowHighlighter; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.HighlightVisitor; +import com.intellij.ide.highlighter.JavaHighlightingColors; +import com.intellij.openapi.util.Pair; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class JavaRainbowVisitor extends RainbowVisitor { + @Override + public boolean suitableForFile(@NotNull PsiFile file) { + return file instanceof PsiJavaFile; + } + + @Override + public void visit(@NotNull PsiElement element) { + if (!RainbowHighlighter.isRainbowEnabled()) return; + + if (element instanceof PsiReferenceExpression + || element instanceof PsiLocalVariable + || element instanceof PsiParameter) { + PsiElement context = PsiTreeUtil.findFirstParent(element, p -> p instanceof PsiMethod); + if (context != null) { + HighlightInfo attrs = getRainbowSymbolKey( + context, + element instanceof PsiReferenceExpression + ? Pair.create(element, ((PsiReferenceExpression)element).resolve()) + : Pair.create(((PsiVariable)element).getNameIdentifier(), element)); + if (attrs != null) { + addInfo(attrs); + } + } + } + } + + @Nullable + private HighlightInfo getRainbowSymbolKey(@NotNull PsiElement context, @NotNull Pair rainbow) { + if (rainbow.first == null || rainbow.second == null) { + return null; + } + if (rainbow.second instanceof PsiLocalVariable || rainbow.second instanceof PsiParameter) { + String name = ((PsiVariable)rainbow.second).getName(); + if (name != null) { + return getInfo(context, rainbow.first, name, rainbow.second instanceof PsiLocalVariable + ? JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES + : JavaHighlightingColors.PARAMETER_ATTRIBUTES); + } + } + return null; + } + + @Override + @NotNull + public HighlightVisitor clone() { + return new JavaRainbowVisitor(); + } +} + diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddAnnotationAttributeNameFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddAnnotationAttributeNameFix.java new file mode 100644 index 0000000000000..f72211e76b8c5 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddAnnotationAttributeNameFix.java @@ -0,0 +1,160 @@ +/* + * 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 com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Pavel.Dolgov + */ +public class AddAnnotationAttributeNameFix extends LocalQuickFixAndIntentionActionOnPsiElement { + private final String myName; + + public AddAnnotationAttributeNameFix(PsiNameValuePair pair, String name) { + super(pair); + myName = name; + } + + @Nls + @NotNull + @Override + public String getText() { + return "Add '" + myName + "='"; + } + + @Nls + @NotNull + @Override + public String getFamilyName() { + return "Add annotation attribute name"; + } + + @Override + public void invoke(@NotNull Project project, + @NotNull PsiFile file, + @Nullable("is null when called from inspection") Editor editor, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + doFix((PsiNameValuePair)startElement, myName); + } + + @Override + public boolean isAvailable(@NotNull Project project, + @NotNull PsiFile file, + @NotNull PsiElement startElement, + @NotNull PsiElement endElement) { + return super.isAvailable(project, file, startElement, endElement) && startElement instanceof PsiNameValuePair; + } + + @NotNull + public static List createFixes(@NotNull PsiNameValuePair pair) { + final PsiAnnotationMemberValue value = pair.getValue(); + if (value == null || pair.getName() != null) { + return Collections.emptyList(); + } + + final Collection methodNames = getAvailableAnnotationMethodNames(pair); + return ContainerUtil.map2List(methodNames, name -> new AddAnnotationAttributeNameFix(pair, name)); + } + + public static void doFix(@NotNull PsiNameValuePair annotationParameter, @NotNull String name) { + final String text = buildReplacementText(annotationParameter, name); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(annotationParameter.getProject()); + final PsiAnnotation newAnnotation = factory.createAnnotationFromText("@A(" + text + " )", annotationParameter); + annotationParameter.replace(newAnnotation.getParameterList().getAttributes()[0]); + } + + private static String buildReplacementText(@NotNull PsiNameValuePair annotationParameter, @NotNull String name) { + final PsiAnnotationMemberValue value = annotationParameter.getValue(); + return value != null ? name + "=" + value.getText() : name + "="; + } + + public static boolean isCompatibleReturnType(@NotNull PsiMethod psiMethod, @Nullable PsiType valueType) { + final PsiType expectedType = psiMethod.getReturnType(); + if (expectedType == null || valueType == null || expectedType.isAssignableFrom(valueType)) { + return true; + } + if (expectedType instanceof PsiArrayType) { + final PsiType componentType = ((PsiArrayType)expectedType).getComponentType(); + return componentType.isAssignableFrom(valueType); + } + return false; + } + + @NotNull + private static Collection getAvailableAnnotationMethodNames(@NotNull PsiNameValuePair pair) { + final PsiAnnotationMemberValue value = pair.getValue(); + if (value != null && pair.getName() == null) { + final PsiElement parent = pair.getParent(); + if ((parent instanceof PsiAnnotationParameterList)) { + final PsiAnnotationParameterList parameterList = (PsiAnnotationParameterList)parent; + final PsiClass annotationClass = getAnnotationClass(parameterList); + + if (annotationClass != null) { + final Set usedNames = getUsedAttributeNames(parameterList); + + final Collection availableMethods = Arrays.stream(annotationClass.getMethods()) + .filter(PsiAnnotationMethod.class::isInstance) + .filter(psiMethod -> !usedNames.contains(psiMethod.getName())) + .collect(Collectors.toList()); + + if (!availableMethods.isEmpty()) { + final PsiType valueType = CreateAnnotationMethodFromUsageFix.getAnnotationValueType(value); + return availableMethods.stream() + .filter(psiMethod -> isCompatibleReturnType(psiMethod, valueType)) + .map(PsiMethod::getName) + .collect(Collectors.toSet()); + } + } + } + } + return Collections.emptyList(); + } + + @NotNull + public static Set getUsedAttributeNames(@NotNull PsiAnnotationParameterList parameterList) { + return Arrays.stream(parameterList.getAttributes()) + .map(PsiNameValuePair::getName) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + @Nullable + private static PsiClass getAnnotationClass(@NotNull PsiAnnotationParameterList parameterList) { + final PsiElement parent = parameterList.getParent(); + if (parent instanceof PsiAnnotation) { + final PsiJavaCodeReferenceElement reference = ((PsiAnnotation)parent).getNameReferenceElement(); + if (reference != null) { + final PsiElement resolved = reference.resolve(); + if (resolved instanceof PsiClass && ((PsiClass)resolved).isAnnotationType()) { + return (PsiClass)resolved; + } + } + } + return null; + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAnnotationMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAnnotationMethodFromUsageFix.java index 5027752e47d0c..1968389695372 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAnnotationMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAnnotationMethodFromUsageFix.java @@ -88,7 +88,7 @@ protected void invokeImpl(final PsiClass targetClass) { } @Nullable - private static PsiType getAnnotationValueType(PsiAnnotationMemberValue value) { + public static PsiType getAnnotationValueType(PsiAnnotationMemberValue value) { PsiType type = null; if (value instanceof PsiExpression) { type = ((PsiExpression)value).getType(); diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java index 2ca7932f26b0d..e4d6e190ec275 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java @@ -64,6 +64,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.proximity.PsiProximityComparator; import com.intellij.refactoring.util.RefactoringUtil; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; @@ -226,7 +227,7 @@ static void setupMethodParameters(PsiMethod method, TemplateBuilder builder, Psi public static void setupMethodParameters(final PsiMethod method, final TemplateBuilder builder, final PsiElement contextElement, final PsiSubstitutor substitutor, final PsiExpression[] arguments) { - setupMethodParameters(method, builder, contextElement, substitutor, ContainerUtil.map2List(arguments, Pair.createFunction(null))); + setupMethodParameters(method, builder, contextElement, substitutor, ContainerUtil.map2List(arguments, Pair.createFunction(null))); } static void setupMethodParameters(final PsiMethod method, final TemplateBuilder builder, final PsiElement contextElement, @@ -480,10 +481,12 @@ public static void scheduleFileOrPackageCreationFailedMessageBox(final Incorrect isPackage ? "cannot.create.java.package.error.title" : "cannot.create.java.file.error.title"))); } - public static PsiReferenceExpression[] collectExpressions(final PsiExpression expression, Class... scopes) { + @SafeVarargs + @NotNull + public static PsiReferenceExpression[] collectExpressions(final PsiExpression expression, @NotNull Class... scopes) { PsiElement parent = PsiTreeUtil.getParentOfType(expression, scopes); - final List result = new ArrayList(); + final List result = new ArrayList<>(); JavaRecursiveElementWalkingVisitor visitor = new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceExpression(PsiReferenceExpression expr) { if (expression instanceof PsiReferenceExpression) { @@ -512,13 +515,13 @@ public static PsiReferenceExpression[] collectExpressions(final PsiExpression ex } static PsiVariable[] guessMatchingVariables(final PsiExpression expression) { - List typesList = new ArrayList(); - List expectedMethodNames = new ArrayList(); - List expectedFieldNames = new ArrayList(); + List typesList = new ArrayList<>(); + List expectedMethodNames = new ArrayList<>(); + List expectedFieldNames = new ArrayList<>(); getExpectedInformation(expression, typesList, expectedMethodNames, expectedFieldNames); - final List list = new ArrayList(); + final List list = new ArrayList<>(); VariablesProcessor varproc = new VariablesProcessor("", true, list){ @Override public boolean execute(@NotNull PsiElement element, @NotNull ResolveState state) { @@ -534,7 +537,7 @@ public boolean execute(@NotNull PsiElement element, @NotNull ResolveState state) ExpectedTypeInfo[] infos = ExpectedTypeUtil.intersect(typesList); - List result = new ArrayList(); + List result = new ArrayList<>(); nextVar: for (PsiVariable variable : allVars) { PsiType varType = variable.getType(); @@ -631,13 +634,14 @@ private static ExpectedTypeInfo[] equalsExpectedTypes(PsiMethodCallExpression me return new ExpectedTypeInfo[]{ExpectedTypesProvider.createInfo(type, ExpectedTypeInfo.TYPE_STRICTLY, type, TailType.NONE)}; } - static ExpectedTypeInfo[] guessExpectedTypes(PsiExpression expression, boolean allowVoidType) { - PsiManager manager = expression.getManager(); + @NotNull + static ExpectedTypeInfo[] guessExpectedTypes(@NotNull PsiExpression expression, boolean allowVoidType) { + PsiManager manager = expression.getManager(); GlobalSearchScope resolveScope = expression.getResolveScope(); - List typesList = new ArrayList(); - List expectedMethodNames = new ArrayList(); - List expectedFieldNames = new ArrayList(); + List typesList = new ArrayList<>(); + List expectedMethodNames = new ArrayList<>(); + List expectedFieldNames = new ArrayList<>(); getExpectedInformation(expression, typesList, expectedMethodNames, expectedFieldNames); @@ -660,14 +664,16 @@ static ExpectedTypeInfo[] guessExpectedTypes(PsiExpression expression, boolean a } for (String methodName : expectedMethodNames) { - PsiMethod[] methods = cache.getMethodsByNameIfNotMoreThan(methodName, resolveScope, MAX_RAW_GUESSED_MEMBERS_COUNT); + PsiMethod[] projectMethods = cache.getMethodsByNameIfNotMoreThan(methodName, resolveScope.intersectWith(GlobalSearchScope.projectScope(manager.getProject())), MAX_RAW_GUESSED_MEMBERS_COUNT); + PsiMethod[] libraryMethods = cache.getMethodsByNameIfNotMoreThan(methodName, resolveScope.intersectWith(GlobalSearchScope.notScope(GlobalSearchScope.projectScope(manager.getProject()))), MAX_RAW_GUESSED_MEMBERS_COUNT); + PsiMethod[] methods = ArrayUtil.mergeArrays(projectMethods, libraryMethods); addMemberInfo(methods, expression, typesList, factory); } } ExpectedTypeInfo[] expectedTypes = ExpectedTypeUtil.intersect(typesList); if (expectedTypes.length == 0 && !typesList.isEmpty()) { - List union = new ArrayList(); + List union = new ArrayList<>(); for (ExpectedTypeInfo[] aTypesList : typesList) { ContainerUtil.addAll(union, (ExpectedTypeInfo[])aTypesList); } @@ -688,9 +694,9 @@ static PsiType[] guessType(PsiExpression expression, final boolean allowVoidType final PsiManager manager = expression.getManager(); final GlobalSearchScope resolveScope = expression.getResolveScope(); - List typesList = new ArrayList(); - final List expectedMethodNames = new ArrayList(); - final List expectedFieldNames = new ArrayList(); + List typesList = new ArrayList<>(); + final List expectedMethodNames = new ArrayList<>(); + final List expectedFieldNames = new ArrayList<>(); getExpectedInformation(expression, typesList, expectedMethodNames, expectedFieldNames); @@ -719,7 +725,7 @@ static PsiType[] guessType(PsiExpression expression, final boolean allowVoidType ExpectedTypeInfo[] expectedTypes = ExpectedTypeUtil.intersect(typesList); if (expectedTypes.length == 0 && !typesList.isEmpty()) { - List union = new ArrayList(); + List union = new ArrayList<>(); for (ExpectedTypeInfo[] aTypesList : typesList) { ContainerUtil.addAll(union, (ExpectedTypeInfo[])aTypesList); } @@ -731,7 +737,7 @@ static PsiType[] guessType(PsiExpression expression, final boolean allowVoidType } else { //Double check to avoid expensive operations on PsiClassTypes - final Set typesSet = new HashSet(); + final Set typesSet = new HashSet<>(); PsiTypeVisitor visitor = new PsiTypeVisitor() { @Override @@ -786,7 +792,7 @@ private static void addMemberInfo(PsiMember[] members, PsiElementFactory factory) { Arrays.sort(members, (m1, m2) -> compareMembers(m1, m2, expression)); - List l = new ArrayList(); + List l = new ArrayList<>(); PsiManager manager = expression.getManager(); JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject()); for (PsiMember member : members) { @@ -1026,13 +1032,13 @@ public LookupElement[] calculateLookupItems(ExpressionContext context) { PsiParameter parameter = PsiTreeUtil.getParentOfType(elementAt, PsiParameter.class); - Set parameterNames = new HashSet(); + Set parameterNames = new HashSet<>(); for (PsiParameter psiParameter : parameterList.getParameters()) { if (psiParameter == parameter) continue; parameterNames.add(psiParameter.getName()); } - Set set = new LinkedHashSet(); + Set set = new LinkedHashSet<>(); for (String name : myNames) { if (parameterNames.contains(name)) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java new file mode 100644 index 0000000000000..28db235e1e1bb --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java @@ -0,0 +1,109 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.FileModificationService; +import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.controlFlow.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.BitUtil; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author ven + */ +public class RemoveRedundantElseAction extends PsiElementBaseIntentionAction { + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.RemoveRedundantElseAction"); + + @Override + @NotNull + public String getText() { + return QuickFixBundle.message("remove.redundant.else.fix"); + } + + @Override + @NotNull + public String getFamilyName() { + return QuickFixBundle.message("remove.redundant.else.fix"); + } + + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) { + if (element instanceof PsiKeyword && + element.getParent() instanceof PsiIfStatement && + PsiKeyword.ELSE.equals(element.getText())) { + PsiIfStatement ifStatement = (PsiIfStatement)element.getParent(); + if (ifStatement.getElseBranch() == null) return false; + PsiStatement thenBranch = ifStatement.getThenBranch(); + if (thenBranch == null) return false; + PsiElement block = PsiTreeUtil.getParentOfType(ifStatement, PsiCodeBlock.class); + if (block != null) { + while (cantCompleteNormally(thenBranch, block)) { + thenBranch = getPrevThenBranch(thenBranch); + if (thenBranch == null) return true; + } + return false; + } + } + return false; + } + + @Nullable + private static PsiStatement getPrevThenBranch(@NotNull PsiElement thenBranch) { + final PsiElement ifStatement = thenBranch.getParent(); + final PsiElement parent = ifStatement.getParent(); + if (parent instanceof PsiIfStatement && ((PsiIfStatement)parent).getElseBranch() == ifStatement) { + return ((PsiIfStatement)parent).getThenBranch(); + } + return null; + } + + private static boolean cantCompleteNormally(@NotNull PsiStatement thenBranch, PsiElement block) { + try { + ControlFlow controlFlow = ControlFlowFactory.getInstance(thenBranch.getProject()).getControlFlow(block, LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance()); + int startOffset = controlFlow.getStartOffset(thenBranch); + int endOffset = controlFlow.getEndOffset(thenBranch); + return startOffset != -1 && endOffset != -1 && !BitUtil.isSet(ControlFlowUtil.getCompletionReasons(controlFlow, startOffset, endOffset), ControlFlowUtil.NORMAL_COMPLETION_REASON); + } + catch (AnalysisCanceledException e) { + return false; + } + } + + @Override + public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { + if (!FileModificationService.getInstance().preparePsiElementForWrite(element)) return; + PsiIfStatement ifStatement = (PsiIfStatement)element.getParent(); + LOG.assertTrue(ifStatement != null && ifStatement.getElseBranch() != null); + PsiStatement elseBranch = ifStatement.getElseBranch(); + if (elseBranch instanceof PsiBlockStatement) { + PsiElement[] statements = ((PsiBlockStatement)elseBranch).getCodeBlock().getStatements(); + if (statements.length > 0) { + ifStatement.getParent().addRangeAfter(statements[0], statements[statements.length-1], ifStatement); + } + } else { + ifStatement.getParent().addAfter(elseBranch, ifStatement); + } + ifStatement.getElseBranch().delete(); + } +} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertEqualsMethodToStaticIntention.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertEqualsMethodToStaticIntention.java deleted file mode 100644 index cc3f08e45a64c..0000000000000 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertEqualsMethodToStaticIntention.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2000-2015 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.intention.impl; - -import com.intellij.codeInsight.FileModificationService; -import com.intellij.codeInsight.intention.BaseElementAtCaretIntentionAction; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiUtil; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; - -/** - * @author Dmitry Batkovich - */ -public class ConvertEqualsMethodToStaticIntention extends BaseElementAtCaretIntentionAction { - private static final Logger LOG = Logger.getInstance(ConvertEqualsMethodToStaticIntention.class); - private static final String REPLACE_TEMPLATE = "java.util.Objects.equals(%s, %s)"; - public static final String TEXT = "Convert '.equals()' to 'java.util.Objects.equals()'"; - - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) { - if (!(element instanceof PsiIdentifier)) { - return false; - } - if (!PsiUtil.isLanguageLevel7OrHigher(element)) { - return false; - } - final PsiElement referenceExpression = element.getParent(); - if (!(referenceExpression instanceof PsiReferenceExpression)) { - return false; - } - if (!"equals".equals(((PsiReferenceExpression)referenceExpression).getReferenceName())) { - return false; - } - final PsiElement methodCallExpression = referenceExpression.getParent(); - if (!(methodCallExpression instanceof PsiMethodCallExpression)) { - return false; - } - final int argumentsCount = ((PsiMethodCallExpression)methodCallExpression).getArgumentList().getExpressions().length; - if (argumentsCount != 1) { - return false; - } - final PsiMethod method = ((PsiMethodCallExpression)methodCallExpression).resolveMethod(); - if (method == null) { - return false; - } - PsiClass javaLangObject = JavaPsiFacade.getInstance(project).findClass(CommonClassNames.JAVA_LANG_OBJECT, element.getResolveScope()); - if (javaLangObject == null) { - return false; - } - if (javaLangObject.isEquivalentTo(method.getContainingClass())) { - return true; - } - final PsiMethod[] superMethods = method.findSuperMethods(javaLangObject); - return superMethods.length == 1; - } - - @Override - public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement element) throws IncorrectOperationException { - if (!FileModificationService.getInstance().preparePsiElementsForWrite(element)) { - return; - } - final PsiElement parent = element.getParent().getParent(); - LOG.assertTrue(parent instanceof PsiMethodCallExpression); - PsiMethodCallExpression methodCall = (PsiMethodCallExpression) parent; - final PsiExpression qualifier = methodCall.getMethodExpression().getQualifierExpression(); - final String qualifierText = qualifier == null ? PsiKeyword.THIS : qualifier.getText(); - final PsiExpression parameter = methodCall.getArgumentList().getExpressions()[0]; - final String expressionText = String.format(REPLACE_TEMPLATE, qualifierText, parameter.getText()); - methodCall.replace(JavaPsiFacade.getElementFactory(project).createExpressionFromText(expressionText, null)); - } - - @Nls - @NotNull - @Override - public String getFamilyName() { - return TEXT; - } - - @NotNull - @Override - public String getText() { - return getFamilyName(); - } -} diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java index 0bdd72811484d..17ee364092fe7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/config/QuickFixFactoryImpl.java @@ -778,8 +778,9 @@ public IntentionAction createWrapWithOptionalFix(@Nullable PsiType type, @NotNul return WrapObjectWithOptionalOfNullableFix.createFix(type, expression); } + @Nullable @Override - public IntentionAction createNotIterableForEachLoopFix(PsiExpression expression) { + public IntentionAction createNotIterableForEachLoopFix(@NotNull PsiExpression expression) { final PsiElement parent = expression.getParent(); if (parent instanceof PsiForeachStatement) { final PsiType type = expression.getType(); @@ -790,6 +791,12 @@ public IntentionAction createNotIterableForEachLoopFix(PsiExpression expression) return null; } + @NotNull + @Override + public List createAddAnnotationAttributeNameFixes(@NotNull PsiNameValuePair pair) { + return AddAnnotationAttributeNameFix.createFixes(pair); + } + private static boolean timeToOptimizeImports(@NotNull PsiFile file) { if (!CodeInsightSettings.getInstance().OPTIMIZE_IMPORTS_ON_THE_FLY) return false; diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/SyntheticCodeBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/SyntheticCodeBlock.java index 30f1960119e3f..e1eb9c546eeb9 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/SyntheticCodeBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/SyntheticCodeBlock.java @@ -19,12 +19,14 @@ import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.TextRange; +import com.intellij.psi.JavaTokenType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.formatter.common.AbstractBlock; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -56,7 +58,7 @@ public SyntheticCodeBlock(List subBlocks, if (subBlocks.isEmpty()) { LOG.assertTrue(false); } - mySubBlocks = new ArrayList(subBlocks); + mySubBlocks = new ArrayList<>(subBlocks); myAlignment = alignment; mySettings = settings; myWrap = wrap; @@ -145,10 +147,56 @@ public ChildAttributes getChildAttributes(final int newChildIndex) { Block block = mySubBlocks.get(newChildIndex); alignment = block.getAlignment(); } + else if (mySubBlocks.size() == newChildIndex) { + if (isRParenth(getRightMostBlock())) { + alignment = getDotAlignment(); + } + } + return new ChildAttributes(getIndent(), alignment); } } + private static boolean isRParenth(Block sibling) { + if (sibling instanceof LeafBlock) { + ASTNode node = ((LeafBlock)sibling).getNode(); + return node != null && node.getElementType() == JavaTokenType.RPARENTH; + } + return false; + } + + @Nullable + private Alignment getDotAlignment() { + if (mySubBlocks.size() > 1) { + Block block = mySubBlocks.get(1); + if (isDotFirst(block)) { + return block.getAlignment(); + } + } + return null; + } + + private static boolean isDotFirst(final Block block) { + Block current = block; + while (!current.getSubBlocks().isEmpty()) { + current = block.getSubBlocks().get(0); + } + ASTNode node = current instanceof LeafBlock ? ((LeafBlock)current).getNode() : null; + return node != null && node.getElementType() == JavaTokenType.DOT; + } + + @Nullable + private Block getRightMostBlock() { + Block rightMost = null; + List subBlocks = getSubBlocks(); + while (!subBlocks.isEmpty()) { + int lastIndex = subBlocks.size() - 1; + rightMost = subBlocks.get(lastIndex); + subBlocks = rightMost.getSubBlocks(); + } + return rightMost; + } + @Override public boolean isIncomplete() { if (myIsIncomplete) return true; diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java index aa2f8bd60c04a..40472c6bc7461 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java @@ -230,6 +230,7 @@ protected OccurrenceManager createOccurrenceManager(final PsiExpression selected private static class IsStaticFinalInitializerExpression extends ClassMemberReferencesVisitor { private PsiElement myElementReference; private final PsiExpression myInitializer; + private boolean myCheckThrowables = true; public IsStaticFinalInitializerExpression(PsiClass aClass, PsiExpression initializer) { super(aClass); @@ -251,12 +252,25 @@ public void visitReferenceExpression(PsiReferenceExpression expression) { @Override public void visitCallExpression(PsiCallExpression callExpression) { super.visitCallExpression(callExpression); + if (!myCheckThrowables) return; final List checkedExceptions = ExceptionUtil.getThrownCheckedExceptions(new PsiElement[]{callExpression}); if (!checkedExceptions.isEmpty()) { myElementReference = callExpression; } } + @Override + public void visitClass(PsiClass aClass) { + myCheckThrowables = false; + super.visitClass(aClass); + } + + @Override + public void visitLambdaExpression(PsiLambdaExpression expression) { + myCheckThrowables = false; + super.visitLambdaExpression(expression); + } + protected void visitClassMemberReferenceElement(PsiMember classMember, PsiJavaCodeReferenceElement classMemberReference) { if (!classMember.hasModifierProperty(PsiModifier.STATIC)) { myElementReference = classMemberReference; diff --git a/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java b/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java index 34fd3241e3685..4cb8f4d30cf67 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java +++ b/java/java-impl/src/com/intellij/refactoring/util/classMembers/MemberInfoStorage.java @@ -61,15 +61,21 @@ protected void buildSubClassesMap(PsiClass aClass) { private void buildSubClassesMap(PsiClass aClass, Set visited) { final PsiReferenceList extendsList = aClass.getExtendsList(); if (extendsList != null) { - buildSubClassesMapForList(extendsList.getReferencedTypes(), aClass, visited); + buildSubClassesMapForList(aClass, visited, extendsList.getReferencedTypes()); } final PsiReferenceList implementsList = aClass.getImplementsList(); if (implementsList != null) { - buildSubClassesMapForList(implementsList.getReferencedTypes(), aClass, visited); + buildSubClassesMapForList(aClass, visited, implementsList.getReferencedTypes()); + } + + if (aClass instanceof PsiAnonymousClass) { + buildSubClassesMapForList(aClass, visited, ((PsiAnonymousClass)aClass).getBaseClassType()); } } - private void buildSubClassesMapForList(final PsiClassType[] classesList, PsiClass aClass, Set processed) { + private void buildSubClassesMapForList(final PsiClass aClass, + final Set processed, + final PsiClassType... classesList) { for (PsiClassType element : classesList) { PsiClass resolved = element.resolve(); if (resolved != null && processed.add(resolved)) { diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index 7adbeea3435b4..45605b6c727df 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -298,7 +298,7 @@ public static PsiType getVariableTypeByExpressionType(@Nullable PsiType type) { public static PsiType getVariableTypeByExpressionType(@Nullable PsiType type, final boolean openCaptured) { if (type == null) return null; if (type instanceof PsiCapturedWildcardType) { - type = ((PsiCapturedWildcardType)type).getWildcard(); + type = ((PsiCapturedWildcardType)type).getUpperBound(); } PsiType transformed = type.accept(new PsiTypeVisitor() { @Override diff --git a/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java b/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java index 98085e944c5ba..9daf181b10342 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/ClassUtil.java @@ -267,8 +267,12 @@ public static boolean isTopLevelClass(@NotNull PsiClass aClass) { return false; } - final PsiFile parentFile = aClass.getContainingFile(); - // do not select JspClass - return parentFile != null && parentFile.getLanguage() == JavaLanguage.INSTANCE; + PsiElement parent = aClass.getParent(); + if (parent instanceof PsiDeclarationStatement && parent.getParent() instanceof PsiCodeBlock) { + return false; + } + + PsiFile parentFile = aClass.getContainingFile(); + return parentFile != null && parentFile.getLanguage() == JavaLanguage.INSTANCE; // do not select JspClass } } \ No newline at end of file diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaStubElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaStubElementType.java index 35af99af74da9..ac7509c304e4e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaStubElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaStubElementType.java @@ -67,6 +67,7 @@ private PsiJavaFileStub getFileStub(StubT stub) { @SuppressWarnings("MethodOverloadsMethodOfSuperclass") public abstract PsiT createPsi(@NotNull ASTNode node); + @NotNull @Override public final StubT createStub(@NotNull final PsiT psi, final StubElement parentStub) { final String message = "Should not be called. Element=" + psi + "; class" + psi.getClass() + "; file=" + (psi.isValid() ? psi.getContainingFile() : "-"); diff --git a/java/java-tests/testData/codeInsight/completion/style/AfterNew15-out.java b/java/java-tests/testData/codeInsight/completion/style/AfterNew15-out.java index bcf00264728a1..bc7ec4e96e167 100644 --- a/java/java-tests/testData/codeInsight/completion/style/AfterNew15-out.java +++ b/java/java-tests/testData/codeInsight/completion/style/AfterNew15-out.java @@ -4,8 +4,8 @@ class A { { new java.io.File("aaa").list(new FilenameFilter() { - public boolean accept(File dir, String name) { - return false; + public boolean accept(File file, String s) { + return false; } }); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AccessInner.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AccessInner.java index a89666ceb11ab..186b47fd2cb42 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AccessInner.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AccessInner.java @@ -1,14 +1,13 @@ // access problems in inner classes -import java.awt.*; -import java.beans.beancontext.BeanContextServicesSupport; -import java.beans.beancontext.BeanContextServicesSupport.BCSSChild; +import x.BeanContextServicesSupport; +import x.BeanContextServicesSupport.BCSSChild; -class a extends Component { +class a extends x.Component { void f() { FlipBufferStrategy s = null; - int i = s.numBuffers; - s.createBuffers(1,null); + int i = s.numBuffers; + s.createBuffers(1); // TODO // now cannot distinquish private from package-private in class files @@ -19,9 +18,9 @@ void f() { class ddd extends BeanContextServicesSupport { - BCSSChild.BCSSCServiceClassRef fd = null; + BCSSChild.BCSSCServiceClassRef fd = null; void ff() { - fd.addRequestor(null,null); + fd.addRequestor(null,null); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java index de5212a4bf870..e879391009fef 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignToFinal.java @@ -1,6 +1,6 @@ // assign to final import java.io.*; -import java.net.*; + public class a21 { final int fi; { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignmentCompatible.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignmentCompatible.java index ebcf43e077729..478aa8ba76330 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignmentCompatible.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/AssignmentCompatible.java @@ -1,6 +1,6 @@ /// assignment compatible types import java.io.*; -import java.net.*; + public class a { final int FI = 2; final int FIBIG = 200000000; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/CyclicInheritance.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/CyclicInheritance.java index 141b59274c19c..1d838db9221fb 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/CyclicInheritance.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/CyclicInheritance.java @@ -1,6 +1,6 @@ // cyclic inhertiance import java.io.*; -import java.net.*; + class Foo extends Foo { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateSwitchLabels.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateSwitchLabels.java index d2f7c626be460..e73a99d998982 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateSwitchLabels.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/DuplicateSwitchLabels.java @@ -1,6 +1,6 @@ // duplicate labels import java.io.*; -import java.net.*; + public class a { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrown.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrown.java index ae86e0d54288a..01c8ac7978a8e 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrown.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrown.java @@ -1,7 +1,8 @@ // Exception is never thrown in method import java.io.*; -import java.sql.*; + +class SQLException extends Exception {} class a { private void f() throws IOException { @@ -50,7 +51,7 @@ protected void f2() throws java.io.IOException, SQLException{ + a1() throws java.io.IOException, SQLException{ } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrownInTry.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrownInTry.java index 38782c3bd9330..9144be5a4acd4 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrownInTry.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ExceptionNeverThrownInTry.java @@ -1,5 +1,5 @@ import java.io.*; -import java.sql.*; + //////////// class x { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FieldDoubleInitialization.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FieldDoubleInitialization.java index c3de37be1aa4a..0bce77b22be1b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FieldDoubleInitialization.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FieldDoubleInitialization.java @@ -1,6 +1,6 @@ // fields double initialization import java.io.*; -import java.net.*; + class Foo { final int k; final int ff = 5; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FinalFieldInit.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FinalFieldInit.java index 560e595affd54..9e0d2be82a031 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FinalFieldInit.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/FinalFieldInit.java @@ -1,7 +1,5 @@ // final Fields initialization import java.io.*; -import java.net.*; -import java.awt.event.*; class a { /** @@ -87,8 +85,8 @@ class s { } private final String text; public Test() { - new ActionListener() { - public void actionPerformed(ActionEvent e) { + new Runnable() { + public void run() { doSomething(text);//// } }; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/IllegalForwardReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/IllegalForwardReference.java index 45663a186dda3..05aee4dc14988 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/IllegalForwardReference.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/IllegalForwardReference.java @@ -1,6 +1,6 @@ /// forward references import java.io.*; -import java.net.*; + public class a { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InitializerCompletion.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InitializerCompletion.java index 2e270c0db875b..ff202b59fec1f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InitializerCompletion.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InitializerCompletion.java @@ -1,6 +1,5 @@ /// initalizers completion import java.io.*; -import java.net.*; public class a { @@ -26,12 +25,17 @@ class a2 { a2() {} } +class SocketException extends IOException { +} +class ConnectException extends SocketException { +} + class a3 { { - if (1==2) throw new SocketException(); + if (1==2) throw new SocketException(); } - a3() throws ConnectException {} + a3() throws ConnectException {} } class b { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Labels.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Labels.java index b98824c3da0fe..8017b820ef0cf 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Labels.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Labels.java @@ -1,6 +1,6 @@ // labels import java.io.*; -import java.net.*; + class a { void f() { @@ -66,4 +66,4 @@ void f() { } }; } -} \ No newline at end of file +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/LocalVariableInitialization.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/LocalVariableInitialization.java index cee122f9a51c2..a867a4c6d5a8f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/LocalVariableInitialization.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/LocalVariableInitialization.java @@ -1,5 +1,4 @@ import java.io.*; -import java.net.*; import java.util.*; public class a { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/MissingReturn.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/MissingReturn.java index 5a3b705d1aebf..6024dba5632f4 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/MissingReturn.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/MissingReturn.java @@ -1,6 +1,6 @@ //Missing return statement import java.io.*; -import java.net.*; + public class a { interface ii {} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/OverrideConflicts.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/OverrideConflicts.java index ef7cc7511756c..195030d67fdfc 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/OverrideConflicts.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/OverrideConflicts.java @@ -1,13 +1,17 @@ // throws conflicts on overriding/ override final import java.io.*; -import java.net.*; + public class a extends c3 { public void f() throws Exception { } } +class SocketException extends IOException { +} +class ConnectException extends SocketException { +} interface i { - void f() throws java.net.SocketException; + void f() throws SocketException; } class c2 implements i { public void f() throws java.io.IOException {} @@ -17,11 +21,11 @@ class c2i implements i { } class c3 implements i { - public void f() throws java.net.ConnectException {} + public void f() throws ConnectException {} } class c4 extends c3 { - public void f() throws java.net.ConnectException {} + public void f() throws ConnectException {} } interface MethodsFromObject { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java index 691b9e47906b6..c59cb32c67132 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/ReferenceMemberBeforeCtrCalled.java @@ -2,7 +2,6 @@ import java.io.*; import java.lang.Override; import java.lang.String; -import java.net.*; class A { A(int i) {} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java index 512efd3e1b0b8..6d4cc639b1f2f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SillyAssignment.java @@ -1,6 +1,9 @@ // silly asignment -import javax.swing.*; +class JPanel { + JPanel getSize() { return this; } + int height; +} class a { int f; JPanel fpanel; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SingleTypeImportConflicts.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SingleTypeImportConflicts.java index 21013a5bc89dc..fc41d6ef0c3df 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SingleTypeImportConflicts.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/SingleTypeImportConflicts.java @@ -1,7 +1,7 @@ // single import conflict -import java.sql.Date; -import java.util.Date; -import java.sql.*; +import sql.Date; +import java.util.Date; +import sql.*; import java.util.*; // multiple single-type import of the same class is fine import java.io.IOException; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StaticOverride.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StaticOverride.java index 157f2bda166a3..1ae5808438fcb 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StaticOverride.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/StaticOverride.java @@ -1,6 +1,6 @@ // method override import java.io.*; -import java.net.*; + class a extends a1 { public static void f() { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnclosedComment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnclosedComment.java index 24870ee08896e..44efee662ae1d 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnclosedComment.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnclosedComment.java @@ -2,7 +2,6 @@ import java.io.*; -import java.net.*; /** class a { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UndefinedLabel.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UndefinedLabel.java index f4630d2486172..c4e350c6dff9f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UndefinedLabel.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UndefinedLabel.java @@ -1,6 +1,4 @@ /// labels -import java.io.*; -import java.net.*; public class a { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnhandledExceptionsInSuperclass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnhandledExceptionsInSuperclass.java index fb12c28646ed1..fe0058af9099e 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnhandledExceptionsInSuperclass.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/UnhandledExceptionsInSuperclass.java @@ -1,6 +1,6 @@ // unhandled exceptions from superclases/etc import java.io.*; -import java.net.*; + class a { a(int i) {} } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Unreachable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Unreachable.java index 3eed64027e46a..7638e82809514 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Unreachable.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/Unreachable.java @@ -1,6 +1,6 @@ // unreachables import java.io.*; -import java.net.*; + public class a { interface ii {} @@ -135,16 +135,21 @@ void cf3() { int i = 6; } } - void cf4() throws java.net.SocketException { + void cf4() throws SocketException { try { bind(); - } catch (java.net.SocketException se) { + } catch (SocketException se) { throw se; - } catch(java.io.IOException e) { - throw new java.net.SocketException(e.getMessage()); + } catch(IOException e) { + throw new SocketException(e.getMessage()); } } - void bind() throws java.net.SocketException {} + static class SocketException extends IOException { + public SocketException(String message) { + super(message); + } + } + void bind() throws SocketException {} void cf5() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/VarDoubleInitialization.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/VarDoubleInitialization.java index de0f4f0f6d6db..3577fee0018a8 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/VarDoubleInitialization.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/VarDoubleInitialization.java @@ -1,6 +1,6 @@ // vars double initialization import java.io.*; -import java.net.*; + public class a21 { void f1(int i) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/receiverParameters.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/receiverParameters.java index d678332618189..d86ef51302169 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/receiverParameters.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/receiverParameters.java @@ -29,6 +29,12 @@ void m3b(@TA C.X.this) { } + void m5() { + class L { + L(C C.this) { } + } + } + static void sm1(@TA Object this) { } C(C this) { } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMatchingArrayItem.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMatchingArrayItem.java new file mode 100644 index 0000000000000..8e156f69aae87 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMatchingArrayItem.java @@ -0,0 +1,10 @@ +// "Add 'type='" "true" +class T { + @interface A { + String[] type(); + } + + @A(type = "t") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMatchingType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMatchingType.java new file mode 100644 index 0000000000000..e00f8239502d6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMatchingType.java @@ -0,0 +1,11 @@ +// "Add 'name='" "true" +class T { + @interface A { + int size(); + String name(); + } + + @A(name = "a") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMultiAttr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMultiAttr.java new file mode 100644 index 0000000000000..2727d0cf73efa --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/afterMultiAttr.java @@ -0,0 +1,11 @@ +// "Add 'type='" "true" +class T { + @interface A { + String name(); + String type(); + } + + @A(type = "a", name = "b") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMatchingArrayItem.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMatchingArrayItem.java new file mode 100644 index 0000000000000..1e4ea779d4409 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMatchingArrayItem.java @@ -0,0 +1,10 @@ +// "Add 'type='" "true" +class T { + @interface A { + String[] type(); + } + + @A("t") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMatchingType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMatchingType.java new file mode 100644 index 0000000000000..889a515247c78 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMatchingType.java @@ -0,0 +1,11 @@ +// "Add 'name='" "true" +class T { + @interface A { + int size(); + String name(); + } + + @A("a") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMultiAttr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMultiAttr.java new file mode 100644 index 0000000000000..7ffb63480e730 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMultiAttr.java @@ -0,0 +1,11 @@ +// "Add 'type='" "true" +class T { + @interface A { + String name(); + String type(); + } + + @A("a", name = "b") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMultiAttrUsedName.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMultiAttrUsedName.java new file mode 100644 index 0000000000000..0092bb77845ab --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeMultiAttrUsedName.java @@ -0,0 +1,11 @@ +// "Add 'name='" "false" +class T { + @interface A { + String name(); + String type(); + } + + @A("a", name = "b") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeNonmatchingArrayItem.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeNonmatchingArrayItem.java new file mode 100644 index 0000000000000..3aeaf59688ece --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeNonmatchingArrayItem.java @@ -0,0 +1,10 @@ +// "Add 'type='" "false" +class T { + @interface A { + String[] type(); + } + + @A(42) + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeNonmatchingType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeNonmatchingType.java new file mode 100644 index 0000000000000..58ff1a3c1de38 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName/beforeNonmatchingType.java @@ -0,0 +1,10 @@ +// "Add 'size='" "false" +class T { + @interface A { + int size(); + } + + @A("a") + void foo() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/after8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/after8.java index 32e5c7327efc2..1481a62bde582 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/after8.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/after8.java @@ -1,12 +1,14 @@ // "Create class 'MyTableModel'" "true" -import javax.swing.*; -import javax.swing.table.TableModel; public class Test { public static void main() { JTable table = new JTable(new MyTableModel()); } } +class JTable { + JTable(TableModel t) {} +} +interface TableModel {} public class MyTableModel implements TableModel { } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/before8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/before8.java index 419fcf96ea078..67bee3691fb62 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/before8.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createClassFromNew/before8.java @@ -1,8 +1,11 @@ // "Create class 'MyTableModel'" "true" -import javax.swing.*; public class Test { public static void main() { JTable table = new JTable(new MyTableModel()); } -} \ No newline at end of file +} +class JTable { + JTable(TableModel t) {} +} +interface TableModel {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/afterExpectedTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/afterExpectedTypes.java index 1e68bf47d2d8e..1602d72bf0036 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/afterExpectedTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/afterExpectedTypes.java @@ -1,14 +1,13 @@ // "Create field 'panel'" "true" -import javax.swing.*; +import java.io.*; class Test { - private JPanel panel; + private File panel; - void foo(JPanel container) { + Object foo(File container) { if (panel == null) { - panel = new JPanel(); - panel.setOpaque(true); - container.add(panel); + panel = new File(); + return new File(container, panel.getName()); } } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeExpectedTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeExpectedTypes.java index a57e165c43178..07f6d513206d3 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeExpectedTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createFieldFromUsage/beforeExpectedTypes.java @@ -1,12 +1,11 @@ // "Create field 'panel'" "true" -import javax.swing.*; +import java.io.*; class Test { - void foo(JPanel container) { + Object foo(File container) { if (panel == null) { - panel = new JPanel(); - panel.setOpaque(true); - container.add(panel); + panel = new File(); + return new File(container, panel.getName()); } } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java index 441ab889b797d..bda1de0fc8f97 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/after8.java @@ -1,6 +1,4 @@ // "Create inner class 'MyTableModel'" "true" -import javax.swing.*; -import javax.swing.table.TableModel; public class Test { public static void main() { @@ -9,4 +7,8 @@ public static void main() { private static class MyTableModel implements TableModel { } -} \ No newline at end of file +} +class JTable { + JTable(TableModel t) {} +} +interface TableModel {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/before8.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/before8.java index b4f27a4a75fe8..c998739c387a8 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/before8.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createInnerClassFromNew/before8.java @@ -1,8 +1,11 @@ // "Create inner class 'MyTableModel'" "true" -import javax.swing.*; public class Test { public static void main() { JTable table = new JTable(new MyTableModel()); } -} \ No newline at end of file +} +class JTable { + JTable(TableModel t) {} +} +interface TableModel {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/after1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/after1.java new file mode 100644 index 0000000000000..d0d55761f11b6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/after1.java @@ -0,0 +1,13 @@ +// "Remove redundant 'else'" "true" +class a { + void foo() { + int a = 0; + int b = 0; + if (a != b) { + return; + } + a = b; + a++; + } +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/before1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/before1.java new file mode 100644 index 0000000000000..ea4609835464b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/before1.java @@ -0,0 +1,14 @@ +// "Remove redundant 'else'" "true" +class a { + void foo() { + int a = 0; + int b = 0; + if (a != b) { + return; + } else { + a = b; + } + a++; + } +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/beforeCanThrowException.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/beforeCanThrowException.java new file mode 100644 index 0000000000000..8fd59ef094f32 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/beforeCanThrowException.java @@ -0,0 +1,15 @@ +// "Remove redundant 'else'" "false" +import java.io.IOException; +class a { + void foo(boolean condition) throws IOException{ + if (condition) { + tMethod(); + } + else { + System.out.println("else"); + } + } + + void tMethod() throws IOException {} +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/beforeIfElseChain.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/beforeIfElseChain.java new file mode 100644 index 0000000000000..f702178d781ff --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse/beforeIfElseChain.java @@ -0,0 +1,17 @@ +// "Remove redundant 'else'" "false" +class a { + void foo() { + int a = 0; + int b = 0; + if (a != b) { + a = 10; + } else if (a + 1 == b) { + return; + } + else { + a = b; + } + a++; + } +} + diff --git a/java/java-tests/testData/refactoring/extractMethod/AnonInner.java b/java/java-tests/testData/refactoring/extractMethod/AnonInner.java index 34a32465f82e0..6431f5b2c48f7 100644 --- a/java/java-tests/testData/refactoring/extractMethod/AnonInner.java +++ b/java/java-tests/testData/refactoring/extractMethod/AnonInner.java @@ -1,7 +1,4 @@ -import javax.swing.*; -import java.awt.event.ActionEvent; - public class ExtractMethods { } abstract class MyButton extends JButton @@ -13,9 +10,15 @@ protected MyButton( String text ) { class Foo { private JButton createOKButton() { return new MyButton( "OK" ) { - public void actionPerformed( ActionEvent e ) { + public void actionPerformed( int e ) { setVisible( false ); } }; } } + +class JButton { + public JButton(String text) { + } + public void setVisible(boolean b) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/AnonInner_after.java b/java/java-tests/testData/refactoring/extractMethod/AnonInner_after.java index c63341f6dc46f..86c3f649be03a 100644 --- a/java/java-tests/testData/refactoring/extractMethod/AnonInner_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/AnonInner_after.java @@ -1,7 +1,4 @@ -import javax.swing.*; -import java.awt.event.ActionEvent; - public class ExtractMethods { } abstract class MyButton extends JButton @@ -13,7 +10,7 @@ protected MyButton( String text ) { class Foo { private JButton createOKButton() { return new MyButton( "OK" ) { - public void actionPerformed( ActionEvent e ) { + public void actionPerformed( int e ) { newMethod(); } @@ -23,3 +20,9 @@ private void newMethod() { }; } } + +class JButton { + public JButton(String text) { + } + public void setVisible(boolean b) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/ArrayAccess1_after.java b/java/java-tests/testData/refactoring/extractMethod/ArrayAccess1_after.java index 1203bc98f7c24..a7148c29d7388 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ArrayAccess1_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ArrayAccess1_after.java @@ -7,8 +7,8 @@ void foo(String[] ss, String[] bb) { } } - private void newMethod(String s, String x) { + private void newMethod(String s, String s1) { System.out.println(s); - System.out.println(x); + System.out.println(s1); } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/ExtractUnresolvedLambdaExpression_after.java b/java/java-tests/testData/refactoring/extractMethod/ExtractUnresolvedLambdaExpression_after.java index 668bc271b59d6..4e179290fe530 100644 --- a/java/java-tests/testData/refactoring/extractMethod/ExtractUnresolvedLambdaExpression_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/ExtractUnresolvedLambdaExpression_after.java @@ -1,3 +1,5 @@ +import org.jetbrains.annotations.NotNull; + import java.util.function.Supplier; class Test { @@ -6,6 +8,7 @@ private void a() b(newMethod()); } + @NotNull private Supplier newMethod() { return (s) -> { System.out.println(s); diff --git a/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java b/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java index 3c28513617cfc..4cc18b440aff7 100644 --- a/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/FoldedWithNestedExpressions_after.java @@ -4,8 +4,8 @@ void h(int i, String[] s, String[] t) { System.out.println(s1); } - private String newMethod(String x, String s) { - System.out.println(x); - return s; + private String newMethod(String s, String s2) { + System.out.println(s2); + return s2; } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureSameParamNames_after.java b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureSameParamNames_after.java index 47d1ed9ed8c6d..d2665950376c2 100644 --- a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureSameParamNames_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureSameParamNames_after.java @@ -7,9 +7,9 @@ public class Test { newMethod(x, 3, 4); } - private void newMethod(int x, int x2, int x3) { - System.out.println(x2); - System.out.println(x3); + private void newMethod(int x, int i, int i2) { + System.out.println(i); + System.out.println(i2); System.out.println(x); } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithChangedParameterName_after.java b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithChangedParameterName_after.java index b3e5880154f3b..a30130b8df81c 100644 --- a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithChangedParameterName_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithChangedParameterName_after.java @@ -9,8 +9,8 @@ public class Test { newMethod(x, x + 2); } - private void newMethod(int p, int x) { + private void newMethod(int p, int i) { System.out.println(p); - System.out.println(x); + System.out.println(i); } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithFolding_after.java b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithFolding_after.java index 3c20ee9cc49a6..5ce16f25514ee 100644 --- a/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithFolding_after.java +++ b/java/java-tests/testData/refactoring/extractMethod/SuggestChangeSignatureWithFolding_after.java @@ -4,7 +4,7 @@ public static void main(String[] args, int i) { newMethod("world, " + args[i]); } - private static void newMethod(String x) { - System.out.println(x); + private static void newMethod(String s) { + System.out.println(s); } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java index fd9de11baf1f5..12e53ce5b3e20 100644 --- a/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java @@ -1,10 +1,13 @@ -import java.awt.event.*; class A { private ActionListener b = new Inner(); private class Inner implements ActionListener { - public void actionPerformed(ActionEvent e) { + public void actionPerformed(int e) { } } +} +interface ActionListener { + public void actionPerformed(int e); + } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java.after b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java.after index c59ba2b240067..9f32992f906c3 100644 --- a/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java.after +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/ImplementsInterface.java.after @@ -1,9 +1,12 @@ -import java.awt.event.*; class A { private ActionListener b = new ActionListener() { - public void actionPerformed(ActionEvent e) { + public void actionPerformed(int e) { } }; +} +interface ActionListener { + public void actionPerformed(int e); + } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java b/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java index 858459a551159..16c2735226e51 100644 --- a/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java @@ -1,4 +1,3 @@ -import java.awt.event.*; class A { private ActionListener b = new Inner(); @@ -7,7 +6,11 @@ private abstract class MyActionListener implements ActionListener { } private class Inner extends MyActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { + public void actionPerformed(int e) { } } +} +interface ActionListener { + public void actionPerformed(int e); + } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java.after b/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java.after index 7505f7843e3b8..f42afc0b0a1df 100644 --- a/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java.after +++ b/java/java-tests/testData/refactoring/inlineToAnonymousClass/RedundantImplementsInterface.java.after @@ -1,12 +1,15 @@ -import java.awt.event.*; class A { private ActionListener b = new MyActionListener() { - public void actionPerformed(ActionEvent e) { + public void actionPerformed(int e) { } }; private abstract class MyActionListener implements ActionListener { } +} +interface ActionListener { + public void actionPerformed(int e); + } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/AnonymousClassWithThrownClause.java b/java/java-tests/testData/refactoring/introduceConstant/AnonymousClassWithThrownClause.java new file mode 100644 index 0000000000000..c97d1d83217b8 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/AnonymousClassWithThrownClause.java @@ -0,0 +1,17 @@ +import java.io.IOException; +class Test { + void bar() throws IOException {} + + I get() { + return new I() { + @Override + public void foo() throws IOException { + bar(); + } + }; + } +} + +interface I { + void foo() throws IOException; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceConstant/AnonymousClassWithThrownClause_after.java b/java/java-tests/testData/refactoring/introduceConstant/AnonymousClassWithThrownClause_after.java new file mode 100644 index 0000000000000..4f348e7fb8cc7 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceConstant/AnonymousClassWithThrownClause_after.java @@ -0,0 +1,19 @@ +import java.io.IOException; +class Test { + public static final I xxx = new I() { + @Override + public void foo() throws IOException { + bar(); + } + }; + + void bar() throws IOException {} + + I get() { + return xxx; + } +} + +interface I { + void foo() throws IOException; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceField/after1.java b/java/java-tests/testData/refactoring/introduceField/after1.java index 033edeaac1661..7773423f553d1 100644 --- a/java/java-tests/testData/refactoring/introduceField/after1.java +++ b/java/java-tests/testData/refactoring/introduceField/after1.java @@ -1,8 +1,8 @@ class InStaticInitializer { - public static final String x = "Hello World"; + public static final String s = "Hello World"; static { - System.out.println(x); + System.out.println(s); } //Field must be placed before initializer or illegal forward reference will happen } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/CapturedWildcardUpperBoundSuggestedAsType.after.java b/java/java-tests/testData/refactoring/introduceVariable/CapturedWildcardUpperBoundSuggestedAsType.after.java new file mode 100644 index 0000000000000..af406f7750a73 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/CapturedWildcardUpperBoundSuggestedAsType.after.java @@ -0,0 +1,9 @@ +interface I {} + +abstract class Test { + void foo(Test t) { + I m = t.get(); + } + + abstract T get(); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/CapturedWildcardUpperBoundSuggestedAsType.java b/java/java-tests/testData/refactoring/introduceVariable/CapturedWildcardUpperBoundSuggestedAsType.java new file mode 100644 index 0000000000000..ee03c88653bc3 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/CapturedWildcardUpperBoundSuggestedAsType.java @@ -0,0 +1,9 @@ +interface I {} + +abstract class Test { + void foo(Test t) { + t.get() + } + + abstract T get(); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/makeMethodStatic/after20.java b/java/java-tests/testData/refactoring/makeMethodStatic/after20.java index e650a46f6ef33..191f66da6b40f 100644 --- a/java/java-tests/testData/refactoring/makeMethodStatic/after20.java +++ b/java/java-tests/testData/refactoring/makeMethodStatic/after20.java @@ -1,6 +1,3 @@ -import javax.swing.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; final class Bug extends JFrame { @@ -14,7 +11,15 @@ public static void foo(Bug anObject) { private class MyWindowListener extends WindowAdapter { - public void windowActivated(WindowEvent e) { + public void windowActivated(int e) { + } + } +} + +class JFrame { + public void addWindowListener(WindowAdapter e) {} + static class WindowAdapter { + public void windowActivated(int e) { } } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/makeMethodStatic/before20.java b/java/java-tests/testData/refactoring/makeMethodStatic/before20.java index 7e31c82738327..2d648b44266f0 100644 --- a/java/java-tests/testData/refactoring/makeMethodStatic/before20.java +++ b/java/java-tests/testData/refactoring/makeMethodStatic/before20.java @@ -1,6 +1,3 @@ -import javax.swing.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; final class Bug extends JFrame { @@ -14,7 +11,15 @@ public Bug() { private class MyWindowListener extends WindowAdapter { - public void windowActivated(WindowEvent e) { + public void windowActivated(int e) { + } + } +} + +class JFrame { + public void addWindowListener(WindowAdapter e) {} + static class WindowAdapter { + public void windowActivated(int e) { } } } \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java b/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java index 8ebd4a7e1c410..21c271429ba2f 100644 --- a/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java +++ b/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java @@ -1,5 +1,3 @@ -import java.awt.Component; -import javax.swing.JComponent; import java.util.ArrayList; import java.util.List; @@ -12,3 +10,5 @@ public void context() { Object o = list.get(0); } } +class JComponent extends Component {} +class Component {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java.after b/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java.after index 94d7e5285f9cf..1dbfa8673c0eb 100644 --- a/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java.after +++ b/java/java-tests/testData/refactoring/methodDuplicates/TypesGenericsConcrete2Super.java.after @@ -1,5 +1,3 @@ -import java.awt.Component; -import javax.swing.JComponent; import java.util.ArrayList; import java.util.List; @@ -12,3 +10,5 @@ class Types { method(list); } } +class JComponent extends Component {} +class Component {} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/PullUpFromAnonymousToInterface.java b/java/java-tests/testData/refactoring/pullUp/PullUpFromAnonymousToInterface.java new file mode 100644 index 0000000000000..a057fcedcc30c --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PullUpFromAnonymousToInterface.java @@ -0,0 +1,9 @@ +class Test { + { + I i = new I() { + public void foo() {} + }; + } + + interface I {} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/PullUpFromAnonymousToInterface_after.java b/java/java-tests/testData/refactoring/pullUp/PullUpFromAnonymousToInterface_after.java new file mode 100644 index 0000000000000..31a37f01bd242 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/PullUpFromAnonymousToInterface_after.java @@ -0,0 +1,12 @@ +class Test { + { + I i = new I() { + @Override + public void foo() {} + }; + } + + interface I { + void foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java b/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java index 8e37f928e7e26..4087126f034ad 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java @@ -1,10 +1,10 @@ -import static javax.swing.SwingConstants.BOTTOM; +import static java.io.File.separatorChar; public class RenameCollisions { public static class StaticInnerClass { public static void staticContext() { int localVar = 0; - int var1 = BOTTOM; + int var1 = separatorChar; } } } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java.after index 6260732fe5016..3aa760e143ce4 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarLocalToAlien.java.after @@ -1,10 +1,10 @@ -import javax.swing.*; +import java.io.File; public class RenameCollisions { public static class StaticInnerClass { public static void staticContext() { - int BOTTOM = 0; - int var1 = SwingConstants.BOTTOM; + int separatorChar = 0; + int var1 = File.separatorChar; } } } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java b/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java index 0aaf16e62546b..3014c60311be9 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java @@ -1,9 +1,9 @@ -import static javax.swing.SwingConstants.BOTTOM; +import static java.io.File.separatorChar; public class RenameCollisions { public static class StaticInnerClass { public static void staticContext(int param) { - int var1 = BOTTOM; + int var1 = separatorChar; } } } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java.after index 17f66c77a1948..a99314659cbe1 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameVarParamToAlien.java.after @@ -1,9 +1,9 @@ -import javax.swing.*; +import java.io.File; public class RenameCollisions { public static class StaticInnerClass { - public static void staticContext(int BOTTOM) { - int var1 = SwingConstants.BOTTOM; + public static void staticContext(int separatorChar) { + int var1 = File.separatorChar; } } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index 76a517c4e176a..ad5ffe02031c9 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -22,10 +22,8 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.LanguageLevelProjectExtension; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.GenericsUtil; -import com.intellij.psi.PsiClass; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiType; import com.intellij.psi.search.GlobalSearchScope; @@ -589,15 +587,6 @@ public void testLeastUpperBoundWithRecursiveTypes() throws Exception { assertEquals("Number & Comparable>", leastUpperBound.getPresentableText()); } - public void testJavaUtilCollections_NoVerify() throws Exception { - PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); - assertNotNull(collectionsClass); - collectionsClass = (PsiClass)collectionsClass.getNavigationElement(); - final String text = collectionsClass.getContainingFile().getText(); - configureFromFileText("Collections.java", StringUtil.convertLineSeparators(StringUtil.replace(text, "package java.util;", "package java.utilx; import java.util.*;"))); - doTestConfiguredFile(false, false, null); - } - public void testReturnTypeSubstitutableForSameOverrideEquivalentMethods() throws Exception { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/HighlightStressTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/HighlightStressTest.java index 07078dc5868cf..12d72c9ed2469 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/HighlightStressTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/HighlightStressTest.java @@ -221,7 +221,8 @@ public void testRandomEditingForUnused() throws Exception { final StringBuilder imports = new StringBuilder(); final StringBuilder usages = new StringBuilder(); int v = 0; - List aclasses = new ArrayList<>(); + List aClasses = new ArrayList<>(); + outer: for (String name : names) { PsiClass[] classes = cache.getClassesByName(name, GlobalSearchScope.allScope(getProject())); if (classes.length == 0) continue; @@ -229,12 +230,17 @@ public void testRandomEditingForUnused() throws Exception { if (!aClass.hasModifierProperty(PsiModifier.PUBLIC)) continue; if (aClass.getSuperClass() == null) continue; PsiClassType[] superTypes = aClass.getSuperTypes(); - if (superTypes.length == 0 || superTypes[0].resolve() == null) continue; + if (superTypes.length == 0) continue; + for (PsiClassType superType : superTypes) { + PsiClass superClass = superType.resolve(); + if (superClass == null || !superClass.hasModifierProperty(PsiModifier.PUBLIC)) continue outer; + } String qualifiedName = aClass.getQualifiedName(); if (qualifiedName.startsWith("java.lang.invoke")) continue; // java.lang.invoke.MethodHandle has weird access attributes in recent rt.jar which causes spurious highlighting errors + if ("Sink".equals(aClass.getName())) continue; imports.append("import " + qualifiedName + ";\n"); usages.append("/**/ "+aClass.getName() + " var" + v + " = null; var" + v + ".toString();\n"); - aclasses.add(aClass); + aClasses.add(aClass); v++; if (v>100) break; } @@ -278,7 +284,7 @@ public void visitElement(PsiElement element) { } }); - System.out.println("i = " + i + " " + next + " at "+offset); + //System.out.println("i = " + i + " " + next + " at "+offset); List infos = doHighlighting(); errors = DaemonAnalyzerTestCase.filter(infos, HighlightSeverity.ERROR); @@ -290,6 +296,4 @@ public void visitElement(PsiElement element) { } FileEditorManagerEx.getInstanceEx(getProject()).closeAllFiles(); } - - } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java index 46fa0849545c6..c2062de4ca187 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java @@ -30,8 +30,13 @@ import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.projectRoots.JavaSdkVersion; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiCompiledElement; import com.intellij.psi.PsiElement; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.IdeaTestUtil; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -49,6 +54,11 @@ protected void setUp() throws Exception { IdeaTestUtil.setTestVersion(JavaSdkVersion.JDK_1_7, getModule(), getTestRootDisposable()); } + @Override + protected Sdk getProjectJDK() { + return IdeaTestUtil.getMockJdk17(); // has to have src.zip and weird method handle signatures + } + private void doTest(boolean checkWarnings, boolean checkInfos, InspectionProfileEntry... inspections) { enableInspectionTools(inspections); doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkInfos); @@ -169,4 +179,14 @@ public void testDynamicallyAddIgnoredAnnotations() { public void testUncheckedExtendedWarnings() { doTest(true, false); } public void testInaccessibleInferredTypeForVarargsArgument() { doTest(false, false);} public void testRuntimeClassCast() { doTest(true, false);} + + public void testJavaUtilCollections_NoVerify() throws Exception { + PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule())); + assertNotNull(collectionsClass); + collectionsClass = (PsiClass)collectionsClass.getNavigationElement(); + assertTrue(!(collectionsClass instanceof PsiCompiledElement)); + final String text = collectionsClass.getContainingFile().getText(); + configureFromFileText("Collections.java", StringUtil.convertLineSeparators(StringUtil.replace(text, "package java.util;", "package java.utilx; import java.util.*;"))); + doTestConfiguredFile(false, false, null); + } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingPerformanceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingPerformanceTest.java index 1f2f0a821c11c..ecfd1e7976ee7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingPerformanceTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingPerformanceTest.java @@ -24,15 +24,15 @@ import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Disposer; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.impl.source.tree.injected.JavaConcatenationInjectorManager; +import com.intellij.testFramework.IdeaTestUtil; import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.SkipSlowTestLocally; import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; -import com.intellij.util.ThrowableRunnable; -import java.util.ArrayList; import java.util.List; @SkipSlowTestLocally @@ -51,6 +51,11 @@ protected void setUp() throws Exception { PathManagerEx.getTestDataPath(); // to cache stuff } + @Override + protected Sdk getProjectJDK() { + return IdeaTestUtil.getMockJdk17(); // has to have awt + } + @Override protected void tearDown() throws Exception { Disposer.dispose(my); @@ -101,12 +106,9 @@ private List startTest(int maxMillis) { getFile().getText(); //to load text CodeInsightTestFixtureImpl.ensureIndexesUpToDate(getProject()); - final List infos = new ArrayList(); PlatformTestUtil.startPerformanceTest(getTestName(false), maxMillis, () -> { - infos.clear(); DaemonCodeAnalyzer.getInstance(getProject()).restart(); - List h = doHighlighting(); - infos.addAll(h); + doHighlighting(); }).cpuBound().usesAllCPUCores().useLegacyScaling().assertTiming(); return highlightErrors(); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java index 8048bbfaaff82..aa75ed1b26286 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java @@ -39,9 +39,12 @@ import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.roots.LanguageLevelProjectExtension; @@ -54,6 +57,8 @@ import com.intellij.psi.xml.XmlToken; import com.intellij.psi.xml.XmlTokenType; import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.VfsTestUtil; +import com.intellij.util.ui.UIUtil; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -161,7 +166,42 @@ public void testSillyAssignment() { public void testDeprecated() { doTest(true, false); } public void testJavadoc() { enableInspectionTool(new JavaDocLocalInspection()); doTest(true, false); } public void testExpressionsInSwitch () { doTest(false, false); } - public void testAccessInner () { doTest(false, false); } + public void testAccessInner() throws IOException { + Editor e = createSaveAndOpenFile("x/BeanContextServicesSupport.java", + "" + + "package x;\n" + + "public class BeanContextServicesSupport {" + + " protected class BCSSChild {" + + " class BCSSCServiceClassRef {" + + " void addRequestor(Object requestor) {" + + " }" + + " }" + + " }" + + "}"); + Editor e2 = createSaveAndOpenFile("x/Component.java", + "" + + "package x;\n" + + "public class Component {" + + " protected class FlipBufferStrategy {" + + " protected int numBuffers;" + + " protected void createBuffers(int numBuffers){}" + + " }" + + "}"); + try { + UIUtil.dispatchAllInvocationEvents(); + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + doTest(false, false); + } + finally { + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + VirtualFile file = FileDocumentManager.getInstance().getFile(e.getDocument()); + FileEditorManager.getInstance(getProject()).closeFile(file); + VfsTestUtil.deleteFile(file); + VirtualFile file2 = FileDocumentManager.getInstance().getFile(e2.getDocument()); + FileEditorManager.getInstance(getProject()).closeFile(file2); + VfsTestUtil.deleteFile(file2); + } + } public void testExceptionNeverThrown() { doTest(true, false); } public void testExceptionNeverThrownInTry() { doTest(false, false); } @@ -173,7 +213,12 @@ public void testSillyAssignment() { public void testExtendMultipleClasses() { doTest(false, false); } public void testRecursiveConstructorInvocation() { doTest(false, false); } public void testMethodCalls() { doTest(false, false); } - public void testSingleTypeImportConflicts() { doTest(false, false); } + public void testSingleTypeImportConflicts() throws IOException { + createSaveAndOpenFile("sql/Date.java", "package sql; public class Date{}"); + UIUtil.dispatchAllInvocationEvents(); + PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); + doTest(false, false); + } public void testMultipleSingleTypeImports() { doTest(true, false); } //duplicate imports public void testNotAllowedInInterface() { doTest(false, false); } public void testQualifiedNew() { doTest(false, false); } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java new file mode 100644 index 0000000000000..a36934abd9abd --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java @@ -0,0 +1,84 @@ +/* + * 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 com.intellij.codeInsight.daemon; + +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; + +public class LightRainbowHighlightingTest extends LightCodeInsightFixtureTestCase { + + public void testRainbowOff() throws Exception { + checkRainbow( + "class TestClass {\n" + + " private static int field = 1;\n" + + " public static void main(String[] args) {\n" + + " ++field;\n" + + " String local1 = null;\n" + + " System.out.println(field + local1 + args[0]);\n" + + " }\n" + + "}", false, false); + } + + public void testRainbowSameColorsForSameIds() throws Exception { + checkRainbow( + "class TestClass {\n" + + " public static void main(String[] args) {\n" + + " String local1 = null;\n" + + " System.out.println(local1\n" + + " + args[0]);\n" + + " }\n" + + "}", true, true); + } + + public void testRainbowHighlightingIds() throws Exception { + // check no coloring for [this] and etc. + checkRainbow( + "class TestClass {\n" + + " private static int SFIELD = 1;\n" + + " private static int myField = 1;\n" + + " public void f(int param1,\n" + + " int param2,\n" + + " int param3) {\n" + + " SFIELD = param1 + param2 + param3 + myField;\n" + + " param1 = this.hashCode() + this.myField;\n" + + " }\n" + + "}", true, false); + } + + public void fixme_testRainbowParamsInJavadocHaveTheSameColorsAsInCode() throws Exception { + checkRainbow( + "class TestClass {\n" + + " /**\n" + + " * \n" + + " * @param param1\n" + + " * @param param2\n" + + " * @param param3\n" + + " */\n" + + " public void f(int param1,\n" + + " int param2,\n" + + " int param3) {\n" + + " }\n" + + "}", true, true); + } + + + void checkRainbow(@NotNull String code, boolean isRainbowOn, boolean withColor) throws Exception { + myFixture.testRainbow( + "rainbow.java", + code, + isRainbowOn, withColor); + } +} diff --git a/platform/platform-impl/src/com/intellij/ide/cloudConfiguration/CloudConfigurationProvider.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AddAnnotationAttributeNameTest.java similarity index 52% rename from platform/platform-impl/src/com/intellij/ide/cloudConfiguration/CloudConfigurationProvider.java rename to java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AddAnnotationAttributeNameTest.java index 425f0aa9d687d..f2f27d29cb7cb 100644 --- a/platform/platform-impl/src/com/intellij/ide/cloudConfiguration/CloudConfigurationProvider.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/AddAnnotationAttributeNameTest.java @@ -13,22 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.ide.cloudConfiguration; +package com.intellij.codeInsight.daemon.quickFix; -import com.intellij.openapi.keymap.KeymapManager; -import com.intellij.util.ParameterizedRunnable; -import org.jetbrains.annotations.Nullable; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.testFramework.IdeaTestUtil; /** - * @author Alexander Lobas + * @author Pavel.Dolgov */ -public interface CloudConfigurationProvider { - @Nullable - String getSharedLaf(); +public class AddAnnotationAttributeNameTest extends LightQuickFixParameterizedTestCase { + public void test() throws Exception { + doAllTests(); + } - @Nullable - String getSharedKeymap(); + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/addAnnotationAttributeName"; + } - @Nullable - ParameterizedRunnable createSharedKeymap(); -} \ No newline at end of file + @Override + protected Sdk getProjectJDK() { + return IdeaTestUtil.getMockJdk18(); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java index 35ffeb5a4990b..63309d6e21836 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateFieldFromUsageTest.java @@ -20,9 +20,12 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; +import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; /** @@ -63,7 +66,8 @@ protected void run(@NotNull Result result) throws Exception { PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); } }.execute(); - + PsiClass aClass = JavaPsiFacade.getInstance(getProject()).findClass("foo.Foo", GlobalSearchScope.allScope(getProject())); + assertNotNull(aClass); doSingleTest(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapChangeListener.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveRedundantElseActionTest.java similarity index 58% rename from platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapChangeListener.java rename to java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveRedundantElseActionTest.java index 7e10c2128d348..0a33ada748f82 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/KeymapChangeListener.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveRedundantElseActionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,15 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.openapi.keymap.impl; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; +package com.intellij.codeInsight.daemon.quickFix; /** - * @author Alexander Lobas + * User: anna + * Date: Aug 30, 2010 */ -public interface KeymapChangeListener { - void onShortcutChanged(@NotNull List actionIds); -} \ No newline at end of file +public class RemoveRedundantElseActionTest extends LightQuickFixParameterizedTestCase { + + public void test() throws Exception { doAllTests(); } + + @Override + protected String getBasePath() { + return "/codeInsight/daemonCodeAnalyzer/quickFix/removeRedundantElse"; + } + +} + diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/ConvertEqualsMethodToStaticTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/intention/ConvertEqualsMethodToStaticTest.java deleted file mode 100644 index 5377fe688dc3f..0000000000000 --- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/ConvertEqualsMethodToStaticTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2000-2015 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.intention; - -import com.intellij.JavaTestUtil; -import com.intellij.codeInsight.intention.impl.ConvertCompareToToEqualsIntention; -import com.intellij.codeInsight.intention.impl.ConvertEqualsMethodToStaticIntention; -import com.intellij.openapi.roots.LanguageLevelProjectExtension; -import com.intellij.pom.java.LanguageLevel; -import com.intellij.testFramework.fixtures.CodeInsightTestUtil; -import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase; - -/** - * @author Dmitry Batkovich - */ -public class ConvertEqualsMethodToStaticTest extends JavaCodeInsightFixtureTestCase { - @Override - protected String getTestDataPath() { - return JavaTestUtil.getJavaTestDataPath() + "/codeInsight/convertEqualsMethodToStatic/"; - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7); - } - - public void testSimple() { - doTest(); - } - - public void testComplexQualifierAndArgument() { - doTest(); - } - - public void testNotAvailable() { - doTestNotAvailable(); - } - - private void doTest() { - final String name = getTestName(true); - CodeInsightTestUtil.doIntentionTest(myFixture, ConvertEqualsMethodToStaticIntention.TEXT, name + ".java", name + "_after.java"); - } - - private void doTestNotAvailable() { - myFixture.configureByFile(getTestName(true) + ".java"); - assertEmpty(myFixture.filterAvailableIntentions(ConvertEqualsMethodToStaticIntention.TEXT)); - } -} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/ex/InspectionProfileTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/ex/InspectionProfileTest.java index 6b049b7d6ee56..d538376f91c29 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/ex/InspectionProfileTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/ex/InspectionProfileTest.java @@ -357,6 +357,18 @@ public void testDisabledUnusedDeclarationWithoutChanges() throws Exception { ""); } + public void testMergedThrowableNotThrownInspections() throws Exception { + checkMergedNoChanges("\n" + + " "); + checkMergedNoChanges("\n" + + " "); + } + public void testMergedMisspelledInspections() throws Exception { checkMergedNoChanges("\n" + "