From 77a5d567be639293325b454166945b088c40951f Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Wed, 26 Apr 2017 13:02:26 +0300 Subject: [PATCH 01/11] `JvmCommonCodeModifications` EP as registry for language-abstracted modifications for creating language-independent quickfixes + `ImplicitSubclassInspection` uses it --- .../intention/JvmCommonCodeModifications.kt | 45 +++++++++ .../inheritance/ImplicitSubclassInspection.kt | 91 +++++++++++++++---- .../impl/JavaCommonCodeModifications.kt | 30 ++++++ resources/src/META-INF/IdeaPlugin.xml | 6 ++ 4 files changed, 152 insertions(+), 20 deletions(-) create mode 100644 java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonCodeModifications.kt create mode 100644 java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonCodeModifications.kt diff --git a/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonCodeModifications.kt b/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonCodeModifications.kt new file mode 100644 index 000000000000..2e05135f834b --- /dev/null +++ b/java/java-analysis-api/src/com/intellij/codeInsight/intention/JvmCommonCodeModifications.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.lang.LanguageExtension +import com.intellij.psi.PsiModifier +import com.intellij.psi.PsiType +import org.jetbrains.annotations.ApiStatus +import org.jetbrains.annotations.NonNls +import org.jetbrains.uast.UClass +import org.jetbrains.uast.UDeclaration + +/** + * Extension Point provides language-abstracted code modifications for JVM-based languages. + * + * Each method should return nullable code modification (preferable [IntentionAction] as most generic). + * If method returns `null` this means that operation on given elements is not supported or not yet implemented for a language. + * + * Every new added method should return `null` by default and then be overridden in implementations for each language if it is possible. + * + * @since 2017.2 + */ +@ApiStatus.Experimental +abstract class JvmCommonCodeModifications { + + open fun createChangeModifierAction(declaration: UDeclaration, @PsiModifier.ModifierConstant @NonNls modifier: String, shouldPresent: Boolean): IntentionAction? = null + + open fun createAddMethodAction(u: UClass, methodName: String, returnType: PsiType, vararg arguments: PsiType): IntentionAction? = null + + companion object : LanguageExtension("com.intellij.codeInsight.intention.jvmCommonCodeModifications") +} + diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt index 96872d10f566..00a296861715 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/inheritance/ImplicitSubclassInspection.kt @@ -17,6 +17,8 @@ package com.intellij.codeInspection.inheritance import com.intellij.CommonBundle import com.intellij.codeInsight.daemon.QuickFixBundle +import com.intellij.codeInsight.intention.JvmCommonCodeModifications +import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInspection.* import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.Logger @@ -56,11 +58,13 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { val smartPointerManager = SmartPointerManager.getInstance(aClass.project) + val commonModifications = JvmCommonCodeModifications.forLanguage(aClass.language) + for ((method, description) in methodsToOverride) { if (method.isFinal || method.isStatic || method.hasModifierProperty(PsiModifier.PRIVATE)) { methodsToAttachToClassFix?.add(smartPointerManager.createSmartPsiElementPointer(method, method.containingFile)) - val methodFixes = arrayOf(MakeExtendableFix(method, method.name)) + val methodFixes = createFixesIfApplicable(commonModifications, method, method.name) problemTargets(method, methodHighlightableModifiersSet).forEach { problems.add(manager.createProblemDescriptor( it, description, isOnTheFly, @@ -77,7 +81,7 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { problems.add(manager.createProblemDescriptor( it, classReasonToBeSubclassed ?: InspectionsBundle.message("inspection.implicit.subclass.display.forClass", aClass.name), isOnTheFly, - arrayOf(MakeExtendableFix(aClass, aClass.name ?: "class", methodsToAttachToClassFix ?: emptyList())), + createFixesIfApplicable(commonModifications, aClass, aClass.name ?: "class", methodsToAttachToClassFix ?: emptyList()), ProblemHighlightType.GENERIC_ERROR_OR_WARNING) ) } @@ -87,6 +91,16 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { return problems.toTypedArray() } + private fun createFixesIfApplicable(commonModifications: JvmCommonCodeModifications?, + aClass: UDeclaration, + hintTargetName: String, + methodsToAttachToClassFix: List> = emptyList()): Array { + if (commonModifications == null) return emptyArray() + val fix = MakeExtendableFix(aClass, hintTargetName, commonModifications, methodsToAttachToClassFix) + if (!fix.hasActionsToPerform) return emptyArray() + return arrayOf(fix) + } + private fun problemTargets(declaration: UDeclaration, highlightableModifiersSet: Set): List { val modifiersElements = declaration.modifierList?.let { it.getChildren().filter { @@ -106,6 +120,7 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { private class MakeExtendableFix(uDeclaration: UDeclaration, hintTargetName: String, + val changeModifiers: JvmCommonCodeModifications, val siblings: List> = emptyList()) : LocalQuickFixOnPsiElement(uDeclaration) { @@ -113,18 +128,32 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { private val LOG = Logger.getInstance("#com.intellij.codeInspection.inheritance.MakeExtendableFix") } + private val actionsToPerform = SmartList() + + val hasActionsToPerform: Boolean + get() = actionsToPerform.isNotEmpty() + + init { + collectMakeExtendable(uDeclaration, actionsToPerform) + for (sibling in siblings) { + sibling.element?.let { + collectMakeExtendable(it, actionsToPerform, checkParent = false) + } + } + } + override fun getFamilyName(): String = QuickFixBundle.message("fix.modifiers.family") override fun invoke(project: Project, file: PsiFile, startElement: PsiElement, endElement: PsiElement) { try { - makeExtendable(startElement as UDeclaration) - for (sibling in siblings) { - sibling.element?.let { - makeExtendable(it) - } + for (intentionAction in actionsToPerform) { + if (intentionAction.isAvailable(project, null, file)) + intentionAction.invoke(project, null, file) } } catch (e: IncorrectOperationException) { + if (ApplicationManager.getApplication().isUnitTestMode) + throw e ApplicationManager.getApplication().invokeLater { Messages.showErrorDialog(project, e.message, CommonBundle.getErrorTitle()) } @@ -132,29 +161,51 @@ class ImplicitSubclassInspection : AbstractBaseUastLocalInspectionTool() { } } - private fun makeExtendable(declaration: UDeclaration) { + private fun collectMakeExtendable(declaration: UDeclaration, + actionsList: SmartList, + checkParent: Boolean = true) { val isClassMember = !(declaration is UClass) declaration.modifierList?.apply { - setModifierProperty(PsiModifier.FINAL, false) - setModifierProperty(PsiModifier.PRIVATE, false) + addIfApplicable(declaration, PsiModifier.FINAL, false, actionsList) + addIfApplicable(declaration, PsiModifier.PRIVATE, false, actionsList) if (isClassMember) { - setModifierProperty(PsiModifier.STATIC, false) + addIfApplicable(declaration, PsiModifier.STATIC, false, actionsList) } } - if (isClassMember) { - (declaration.uastParent as? UClass)?.modifierList?.apply { - setModifierProperty(PsiModifier.FINAL, false) - setModifierProperty(PsiModifier.PRIVATE, false) + if (checkParent && isClassMember) { + (declaration.uastParent as? UClass)?.apply { + addIfApplicable(this, PsiModifier.FINAL, false, actionsList) + addIfApplicable(this, PsiModifier.PRIVATE, false, actionsList) } } } + private fun addIfApplicable(declaration: UDeclaration, + name: String, + shouldPresent: Boolean, + actionsList: SmartList) { + if (declaration.modifierList?.hasModifierProperty(name) != shouldPresent) { + (changeModifiers.createChangeModifierAction(declaration, name, shouldPresent))?.let { + actionsList.add(it) + } + } + } + + private val MAX_MESSAGES_TO_COMBINE = 3 + private val text = when (uDeclaration) { - is UClass -> InspectionsBundle.message("inspection.implicit.subclass.make.class.extendable", - hintTargetName, - siblings.size, - siblingsDescription()) - else -> InspectionsBundle.message("inspection.implicit.subclass.extendable", hintTargetName) + is UClass -> + if (actionsToPerform.size <= MAX_MESSAGES_TO_COMBINE) + actionsToPerform.map { it.text }.joinToString() + else InspectionsBundle.message("inspection.implicit.subclass.make.class.extendable", + hintTargetName, + siblings.size, + siblingsDescription()) + else -> + if (actionsToPerform.size <= MAX_MESSAGES_TO_COMBINE) + actionsToPerform.joinToString { it.text } + else + InspectionsBundle.message("inspection.implicit.subclass.extendable", hintTargetName) } private fun siblingsDescription() = diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonCodeModifications.kt b/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonCodeModifications.kt new file mode 100644 index 000000000000..2c7297f8380c --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/JavaCommonCodeModifications.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.daemon.impl.quickfix.ModifierFix +import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.uast.UDeclaration +import com.intellij.codeInsight.intention.JvmCommonCodeModifications + + +class JavaCommonCodeModifications : JvmCommonCodeModifications() { + + override fun createChangeModifierAction(declaration: UDeclaration, modifier: String, shouldPresent: Boolean): IntentionAction { + return ModifierFix(declaration.modifierList, modifier, shouldPresent, false) + } + +} \ No newline at end of file diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index e69552ea4176..5b04e3975a65 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -324,6 +324,11 @@ + + + + + @@ -1962,6 +1967,7 @@ + From 1ce7bf3eacc5d8e467ece86f12105a22a50eb2ab Mon Sep 17 00:00:00 2001 From: Alexey Ushakov Date: Tue, 2 May 2017 13:19:28 +0300 Subject: [PATCH 02/11] Updating versions of project dependencies: jdkBuild->u152b845.1 Alexey Ushakov --- build/dependencies/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies/gradle.properties b/build/dependencies/gradle.properties index 013e0bd096ea..62d9c35c1d87 100644 --- a/build/dependencies/gradle.properties +++ b/build/dependencies/gradle.properties @@ -1,4 +1,4 @@ # The file might be automatically updated. Comments and empty lines will be removed. kotlinPluginBuild=1.1.2-release-IJ2017.2-1 jetSignBuild=42.30 -jdkBuild=u152b837.5 +jdkBuild=u152b845.1 From 9064b5006e73d91b0a78869a4e0a1f7e3eea8983 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Sat, 22 Apr 2017 14:24:35 +0300 Subject: [PATCH 03/11] [groovy] get rid of GroovyCoreEnvironment --- .../groovy/lang/GroovyCoreEnvironment.java | 385 ------------------ 1 file changed, 385 deletions(-) delete mode 100644 plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java deleted file mode 100644 index 978319a5023d..000000000000 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/GroovyCoreEnvironment.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.plugins.groovy.lang; - -import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar; -import com.intellij.codeInsight.daemon.ImplicitUsageProvider; -import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector; -import com.intellij.codeInspection.unused.ImplicitPropertyUsageProvider; -import com.intellij.core.CoreApplicationEnvironment; -import com.intellij.core.CoreProjectEnvironment; -import com.intellij.ide.FileIconProvider; -import com.intellij.javaee.CoreExternalResourceManager; -import com.intellij.javaee.ExternalResourceManagerEx; -import com.intellij.lang.LanguageAnnotators; -import com.intellij.lang.LanguageParserDefinitions; -import com.intellij.lang.LanguageStructureViewBuilder; -import com.intellij.lang.findUsages.LanguageFindUsages; -import com.intellij.lang.folding.LanguageFolding; -import com.intellij.mock.MockProject; -import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.fileTypes.FileTypeRegistry; -import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.PomDeclarationSearcher; -import com.intellij.problems.WolfTheProblemSolver; -import com.intellij.psi.ClassTypePointerFactory; -import com.intellij.psi.PsiElementFinder; -import com.intellij.psi.ResolveScopeProvider; -import com.intellij.psi.codeStyle.ReferenceAdjuster; -import com.intellij.psi.impl.ExpressionConverter; -import com.intellij.psi.impl.LanguageConstantExpressionEvaluator; -import com.intellij.psi.impl.compiled.ClsCustomNavigationPolicy; -import com.intellij.psi.search.PsiShortNamesCache; -import com.intellij.psi.search.UseScopeEnlarger; -import com.intellij.psi.search.searches.*; -import com.intellij.psi.stubs.StubIndexExtension; -import com.intellij.util.QueryExecutor; -import com.intellij.util.indexing.FileBasedIndexExtension; -import org.jetbrains.plugins.groovy.*; -import org.jetbrains.plugins.groovy.annotator.GrAnnotatorImpl; -import org.jetbrains.plugins.groovy.annotator.GrReferenceHighlighterFactory; -import org.jetbrains.plugins.groovy.annotator.GroovyFrameworkConfigNotification; -import org.jetbrains.plugins.groovy.annotator.checkers.*; -import org.jetbrains.plugins.groovy.builder.XmlMarkupBuilderNonCodeMemberContributor; -import org.jetbrains.plugins.groovy.codeInsight.GroovyClsCustomNavigationPolicy; -import org.jetbrains.plugins.groovy.codeInspection.GroovyQuickFixFactory; -import org.jetbrains.plugins.groovy.codeInspection.declaration.GrMethodMayBeStaticInspectionFilter; -import org.jetbrains.plugins.groovy.codeInspection.local.GroovyUnusedImportsPassFactory; -import org.jetbrains.plugins.groovy.codeStyle.GrReferenceAdjuster; -import org.jetbrains.plugins.groovy.configSlurper.ConfigSlurperMapContentProvider; -import org.jetbrains.plugins.groovy.configSlurper.GroovyMapValueTypeEnhancer; -import org.jetbrains.plugins.groovy.dgm.DGMImplicitPropertyUsageProvider; -import org.jetbrains.plugins.groovy.dgm.DGMMemberContributor; -import org.jetbrains.plugins.groovy.dsl.DslActivationStatus; -import org.jetbrains.plugins.groovy.dsl.GroovyDslAnnotator; -import org.jetbrains.plugins.groovy.dsl.GroovyDslFileIndex; -import org.jetbrains.plugins.groovy.dsl.dsltop.GdslMembersProvider; -import org.jetbrains.plugins.groovy.dsl.dsltop.GroovyDslDefaultMembers; -import org.jetbrains.plugins.groovy.dsl.psi.*; -import org.jetbrains.plugins.groovy.ext.spock.SpockMemberContributor; -import org.jetbrains.plugins.groovy.ext.spock.SpockPomDeclarationSearcher; -import org.jetbrains.plugins.groovy.extensions.*; -import org.jetbrains.plugins.groovy.findUsages.*; -import org.jetbrains.plugins.groovy.geb.*; -import org.jetbrains.plugins.groovy.gpp.GppClosureParameterTypeProvider; -import org.jetbrains.plugins.groovy.gpp.GppExpectedTypesContributor; -import org.jetbrains.plugins.groovy.gpp.GppTypeConverter; -import org.jetbrains.plugins.groovy.highlighter.GroovyDeclarationHighlightingPassFactory; -import org.jetbrains.plugins.groovy.highlighter.GroovyKeywordHighlightingPassFactory; -import org.jetbrains.plugins.groovy.lang.folding.GroovyFoldingBuilder; -import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; -import org.jetbrains.plugins.groovy.lang.parser.GroovyParserDefinition; -import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrIndexProperty; -import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.GroovyExpectedTypesContributor; -import org.jetbrains.plugins.groovy.lang.psi.impl.*; -import org.jetbrains.plugins.groovy.lang.psi.impl.javaView.GroovyClassFinder; -import org.jetbrains.plugins.groovy.lang.psi.impl.search.GrPrivateFieldScopeEnlarger; -import org.jetbrains.plugins.groovy.lang.psi.impl.smartPointers.GrClassReferenceTypePointerFactory; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path.DefaultCallExpressionTypeCalculator; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path.GrDGMTypeCalculator; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path.GrDescriptorReturnTypeCalculator; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path.GrWithTraitTypeCalculator; -import org.jetbrains.plugins.groovy.lang.psi.stubs.index.*; -import org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.*; -import org.jetbrains.plugins.groovy.lang.psi.util.GroovyConstantExpressionEvaluator; -import org.jetbrains.plugins.groovy.lang.resolve.*; -import org.jetbrains.plugins.groovy.lang.resolve.ast.AutoExternalizeContributor; -import org.jetbrains.plugins.groovy.lang.resolve.ast.ConstructorAnnotationsProcessor; -import org.jetbrains.plugins.groovy.lang.resolve.ast.InheritConstructorContributor; -import org.jetbrains.plugins.groovy.lang.resolve.ast.LoggingContributor; -import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport; -import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.ExternalBuilderStrategySupport; -import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.InitializerBuilderStrategySupport; -import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.SimpleBuilderStrategySupport; -import org.jetbrains.plugins.groovy.lang.resolve.noncode.GrCollectionTypeMembersProvider; -import org.jetbrains.plugins.groovy.lang.resolve.noncode.MixinMemberContributor; -import org.jetbrains.plugins.groovy.lang.stubs.GroovyShortNamesCache; -import org.jetbrains.plugins.groovy.lang.typing.*; -import org.jetbrains.plugins.groovy.structure.GroovyStructureViewFactory; -import org.jetbrains.plugins.groovy.swingBuilder.SwingBuilderNamedArgumentProvider; -import org.jetbrains.plugins.groovy.swingBuilder.SwingBuilderNonCodeMemberContributor; -import org.jetbrains.plugins.groovy.transformations.AstTransformationSupport; -import org.jetbrains.plugins.groovy.transformations.impl.*; -import org.jetbrains.plugins.groovy.transformations.impl.autoClone.AutoCloneTransformationSupport; - -/** - * Upsource - */ -@SuppressWarnings("UnusedDeclaration") -public class GroovyCoreEnvironment { - public static class ApplicationEnvironment { - public ApplicationEnvironment(CoreApplicationEnvironment appEnvironment) { - appEnvironment.registerFileType(GroovyFileType.GROOVY_FILE_TYPE, GroovyFileType.DEFAULT_EXTENSION); - - appEnvironment.addExplicitExtension(SyntaxHighlighterFactory.LANGUAGE_FACTORY, GroovyLanguage.INSTANCE, - new GroovySyntaxHighlighterFactory()); - - appEnvironment.addExplicitExtension(LanguageParserDefinitions.INSTANCE, GroovyLanguage.INSTANCE, new GroovyParserDefinition()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrMethodComparator.EP_NAME, GrMethodComparator.class); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), NonCodeMembersContributor.EP_NAME, NonCodeMembersContributor.class); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GebBrowserMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GebJUnitTestMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GebModuleMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GebPageMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GebSpockTestMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GebTestNGTestMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new GrCollectionTypeMembersProvider()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new MixinMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new SpockMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new XmlMarkupBuilderNonCodeMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new DGMMemberContributor()); - appEnvironment.addExtension(NonCodeMembersContributor.EP_NAME, new SwingBuilderNonCodeMemberContributor()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrImportContributor.EP_NAME, GrImportContributor.class); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), AstTransformationSupport.EP_NAME, AstTransformationSupport.class); - - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new AutoExternalizeContributor()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new AutoCloneTransformationSupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new ConstructorAnnotationsProcessor()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new InheritConstructorContributor()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new DefaultBuilderStrategySupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new SimpleBuilderStrategySupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new ExternalBuilderStrategySupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new InitializerBuilderStrategySupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new BindableTransformationSupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new VetoableTransformationSupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new LoggingContributor()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new CategoryTransformationSupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new DelegateTransformationSupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new DefaultTransformationSupport()); - appEnvironment.addExtension(AstTransformationSupport.EP_NAME, new TraitTransformationSupport()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ClosureMissingMethodContributor.EP_NAME, - ClosureMissingMethodContributor.class); - appEnvironment.addExtension(ClosureMissingMethodContributor.EP_NAME, new PluginXmlClosureMemberContributor()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrVariableEnhancer.EP_NAME, GrVariableEnhancer.class); - appEnvironment.addExtension(GrVariableEnhancer.EP_NAME, new ClosureAsAnonymousParameterEnhancer()); - appEnvironment.addExtension(GrVariableEnhancer.EP_NAME, new ClosureParameterEnhancer()); - appEnvironment.addExtension(GrVariableEnhancer.EP_NAME, new ClosureParamsEnhancer()); - appEnvironment.addExtension(GrVariableEnhancer.EP_NAME, new GppClosureParameterTypeProvider()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrReferenceTypeEnhancer.EP_NAME, - GrReferenceTypeEnhancer.class); - appEnvironment.addExtension(GrReferenceTypeEnhancer.EP_NAME, new GroovyMapValueTypeEnhancer()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrTypeConverter.EP_NAME, GrTypeConverter.class); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrBooleanTypeConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrGenericTypeConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrClassConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrNullVoidConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrCharConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrNumberConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrStringConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrEnumConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrContainerTypeConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new ClosureToSamConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GrContainerConverter()); - appEnvironment.addExtension(GrTypeConverter.EP_NAME, new GppTypeConverter()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyExpectedTypesContributor.EP_NAME, - GroovyExpectedTypesContributor.class); - appEnvironment.addExtension(GroovyExpectedTypesContributor.EP_NAME, new GppExpectedTypesContributor()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyScriptTypeDetector.EP_NAME, - GroovyScriptTypeDetector.class); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyNamedArgumentProvider.EP_NAME, GroovyNamedArgumentProvider.class); - appEnvironment.addExtension(GroovyNamedArgumentProvider.EP_NAME, new GroovyConstructorNamedArgumentProvider()); - appEnvironment.addExtension(GroovyNamedArgumentProvider.EP_NAME, new GroovyMethodReturnNamedArgumentProvider()); - appEnvironment.addExtension(GroovyNamedArgumentProvider.EP_NAME, new GroovySourceCodeNamedArgumentProvider()); - appEnvironment.addExtension(GroovyNamedArgumentProvider.EP_NAME, new SwingBuilderNamedArgumentProvider()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyMapContentProvider.EP_NAME, - GroovyMapContentProvider.class); - appEnvironment.addExtension(GroovyMapContentProvider.EP_NAME, new ConfigSlurperMapContentProvider()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyUnresolvedHighlightFilter.EP_NAME, - GroovyUnresolvedHighlightFilter.class); - appEnvironment.addExtension(GroovyUnresolvedHighlightFilter.EP_NAME, new GroovyUnresolvedReferenceFilterByFile()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyUnresolvedHighlightFileFilter.EP_NAME, - GroovyUnresolvedHighlightFileFilter.class); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrCallExpressionTypeCalculator.EP_NAME, GrCallExpressionTypeCalculator.class); - appEnvironment.addExtension(GrCallExpressionTypeCalculator.EP_NAME, new DefaultCallExpressionTypeCalculator()); - appEnvironment.addExtension(GrCallExpressionTypeCalculator.EP_NAME, new GrDescriptorReturnTypeCalculator()); - appEnvironment.addExtension(GrCallExpressionTypeCalculator.EP_NAME, new GrDGMTypeCalculator()); - appEnvironment.addExtension(GrCallExpressionTypeCalculator.EP_NAME, new GrWithTraitTypeCalculator()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrExpressionTypeCalculator.EP_NAME, GrExpressionTypeCalculator.class); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyClassDescriptor.EP_NAME, - GroovyClassDescriptor.class); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyMethodDescriptorExtension.EP_NAME, - GroovyMethodDescriptorExtension.class); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), PsiEnhancerCategory.EP_NAME, PsiEnhancerCategory.class); - appEnvironment.addExtension(PsiEnhancerCategory.EP_NAME, new GrExpressionCategory()); - appEnvironment.addExtension(PsiEnhancerCategory.EP_NAME, new PsiClassCategory()); - appEnvironment.addExtension(PsiEnhancerCategory.EP_NAME, new PsiElementCategory()); - appEnvironment.addExtension(PsiEnhancerCategory.EP_NAME, new PsiExpressionCategory()); - appEnvironment.addExtension(PsiEnhancerCategory.EP_NAME, new PsiMethodCategory()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GdslMembersProvider.EP_NAME, GdslMembersProvider.class); - appEnvironment.addExtension(GdslMembersProvider.EP_NAME, new GdkMethodDslProvider()); - appEnvironment.addExtension(GdslMembersProvider.EP_NAME, new GroovyDslDefaultMembers()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GroovyFrameworkConfigNotification.EP_NAME, - GroovyFrameworkConfigNotification.class); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), GrMethodMayBeStaticInspectionFilter.EP_NAME, GrMethodMayBeStaticInspectionFilter.class); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), CustomAnnotationChecker.EP_NAME, CustomAnnotationChecker.class); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new AnnotationCollectorChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new BaseScriptAnnotationChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new DelegatesToAnnotationChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new FieldAnnotationChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new GrabAnnotationChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new GrAliasAnnotationChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new NewifyAnnotationChecker()); - appEnvironment.addExtension(CustomAnnotationChecker.EP_NAME, new TypeCheckedAnnotationChecker()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ImplicitPropertyUsageProvider.EP_NAME, - ImplicitPropertyUsageProvider.class); - appEnvironment.addExtension(ImplicitPropertyUsageProvider.EP_NAME, new DGMImplicitPropertyUsageProvider()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ImplicitUsageProvider.EP_NAME, - ImplicitUsageProvider.class); - appEnvironment.addExtension(ImplicitUsageProvider.EP_NAME, new GrImplicitUsageProvider()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), FileTypeRegistry.FileTypeDetector.EP_NAME, - FileTypeRegistry.FileTypeDetector.class); - appEnvironment.addExtension(FileTypeRegistry.FileTypeDetector.EP_NAME, new GroovyHashBangFileTypeDetector()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ClsCustomNavigationPolicy.EP_NAME, - ClsCustomNavigationPolicy.class); - appEnvironment.addExtension(ClsCustomNavigationPolicy.EP_NAME, new GroovyClsCustomNavigationPolicy()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), PomDeclarationSearcher.EP_NAME, - PomDeclarationSearcher.class); - appEnvironment.addExtension(PomDeclarationSearcher.EP_NAME, new GebContentDeclarationSearcher()); - appEnvironment.addExtension(PomDeclarationSearcher.EP_NAME, new SpockPomDeclarationSearcher()); - - appEnvironment.addExplicitExtension(LanguageConstantExpressionEvaluator.INSTANCE, GroovyLanguage.INSTANCE, - new GroovyConstantExpressionEvaluator()); - - appEnvironment.addExplicitExtension(ExpressionConverter.EP, GroovyLanguage.INSTANCE, new GroovyExpressionConverter()); - appEnvironment.addExplicitExtension(LanguageAnnotators.INSTANCE, GroovyLanguage.INSTANCE, new GrAnnotatorImpl()); - appEnvironment.addExplicitExtension(LanguageAnnotators.INSTANCE, GroovyLanguage.INSTANCE, new GroovyDslAnnotator()); - - appEnvironment.addExplicitExtension(LanguageStructureViewBuilder.INSTANCE, GroovyLanguage.INSTANCE, new GroovyStructureViewFactory()); - appEnvironment.addExplicitExtension(LanguageFolding.INSTANCE, GroovyLanguage.INSTANCE, new GroovyFoldingBuilder()); - appEnvironment.addExplicitExtension(LanguageFindUsages.INSTANCE, GroovyLanguage.INSTANCE, new GroovyFindUsagesProvider()); - appEnvironment.addExplicitExtension(ReferenceAdjuster.Extension.INSTANCE, GroovyLanguage.INSTANCE, new GrReferenceAdjuster()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), UseScopeEnlarger.EP_NAME, UseScopeEnlarger.class); - appEnvironment.addExtension(UseScopeEnlarger.EP_NAME, new GrPrivateFieldScopeEnlarger()); - - DirectClassInheritorsSearch.INSTANCE.registerExecutor(new GroovyDirectInheritorsSearcher()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), MethodReferencesSearch.EP_NAME, QueryExecutor.class); - appEnvironment.addExtension(MethodReferencesSearch.EP_NAME, new AccessorMethodReferencesSearcher()); - appEnvironment.addExtension(MethodReferencesSearch.EP_NAME, new MethodLateBoundReferencesSearcher()); - appEnvironment.addExtension(MethodReferencesSearch.EP_NAME, new GroovyConstructorUsagesSearcher()); - appEnvironment.addExtension(MethodReferencesSearch.EP_NAME, new GroovyReflectedMethodReferenceSearcher()); - appEnvironment.addExtension(MethodReferencesSearch.EP_NAME, new GrLiteralMethodSearcher()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), AnnotatedElementsSearch.EP_NAME, QueryExecutor.class); - appEnvironment.addExtension(AnnotatedElementsSearch.EP_NAME, new AnnotatedMembersSearcher()); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), SuperMethodsSearch.EP_NAME, QueryExecutor.class); - appEnvironment.addExtension(SuperMethodsSearch.EP_NAME, new GDKSuperMethodSearcher()); - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), DefinitionsScopedSearch.EP_NAME, QueryExecutor.class); - appEnvironment.addExtension(DefinitionsScopedSearch.EP_NAME, new GroovyImplementationSearch()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), StubIndexExtension.EP_NAME, StubIndexExtension.class); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrAnnotationMethodNameIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrAnnotatedMemberIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrAnonymousClassIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrDirectInheritorsIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrFieldNameIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrFullClassNameIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrFullScriptNameIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrMethodNameIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrScriptClassNameIndex()); - appEnvironment.addExtension(StubIndexExtension.EP_NAME, new GrScriptClassNameIndex()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), FileBasedIndexExtension.EXTENSION_POINT_NAME, - FileBasedIndexExtension.class); - appEnvironment.addExtension(FileBasedIndexExtension.EXTENSION_POINT_NAME, new GroovyDslFileIndex()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ReferencesSearch.EP_NAME, QueryExecutor.class); - appEnvironment.addExtension(ReferencesSearch.EP_NAME, new ConstructorReferencesSearcher()); - appEnvironment.addExtension(ReferencesSearch.EP_NAME, new GrAliasedImportedElementSearcher()); - appEnvironment.addExtension(ReferencesSearch.EP_NAME, new AccessorReferencesSearcher()); - appEnvironment.addExtension(ReferencesSearch.EP_NAME, new GroovyTraitFieldSearcher()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), FileIconProvider.EP_NAME, FileIconProvider.class); - appEnvironment.addExtension(FileIconProvider.EP_NAME, new GroovyFileIconProvider()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ResolveScopeProvider.EP_NAME, ResolveScopeProvider.class); - appEnvironment.addExtension(ResolveScopeProvider.EP_NAME, new GroovyResolveScopeProvider()); - - - Class> conditionClass = (Class)Condition.class; - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), WolfTheProblemSolver.FILTER_EP_NAME, conditionClass); - appEnvironment.addExtension(WolfTheProblemSolver.FILTER_EP_NAME, new GroovyProblemFileHighlightFilter()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ClassTypePointerFactory.EP_NAME, ClassTypePointerFactory.class); - appEnvironment.addExtension(ClassTypePointerFactory.EP_NAME, new GrClassReferenceTypePointerFactory()); - - appEnvironment.registerApplicationService(GroovyQuickFixFactory.class, new EmptyGroovyQuickFixFactory()); - appEnvironment.registerApplicationComponent(DslActivationStatus.class, new DslActivationStatus()); - - CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ReadWriteAccessDetector.EP_NAME, ReadWriteAccessDetector.class); - appEnvironment.addExtension(ReadWriteAccessDetector.EP_NAME, new GroovyReadWriteAccessDetector()); - - appEnvironment.addExplicitExtension(GrTypeCalculator.EP, GrReferenceExpression.class, new GrClosureDelegateTypeCalculator()); - appEnvironment.addExplicitExtension(GrTypeCalculator.EP, GrListOrMap.class, new DefaultListOrMapTypeCalculator()); - appEnvironment.addExplicitExtension(GrTypeCalculator.EP, GrIndexProperty.class, new DefaultIndexAccessTypeCalculator()); - appEnvironment.addExplicitExtension(GrTypeCalculator.EP, GrReferenceExpression.class, new ReferenceExpressionTypeCalculator()); - appEnvironment.addExplicitExtension(GrTypeCalculator.EP, GrMethodCall.class, new MethodCallTypeCalculator()); - - if (GroovyElementTypes.ADDITIVE_EXPRESSION == null) throw new IllegalStateException(); // initialize tokens - } - - protected ExternalResourceManagerEx createExternalResourceManager() { - return new CoreExternalResourceManager(); - } - } - - public static class ProjectEnvironment { - public ProjectEnvironment(CoreProjectEnvironment projectEnvironment) { - MockProject project = projectEnvironment.getProject(); - project.registerService(GroovyPsiElementFactory.class, GroovyPsiElementFactoryImpl.class); - - project.registerService(GroovyPsiManager.class, GroovyPsiManager.class); - project.registerService(GroovyCodeStyleManager.class, CoreGroovyCodeStyleManager.class); - project.registerService(GroovyCodeStyleSettingsFacade.class, CoreGroovyCodeStyleSettingsFacade.class); - projectEnvironment.addProjectExtension(PsiShortNamesCache.EP_NAME, new GroovyShortNamesCache(project)); - projectEnvironment.addProjectExtension(PsiElementFinder.EP_NAME, new GroovyClassFinder(project)); - TextEditorHighlightingPassRegistrar registrar = TextEditorHighlightingPassRegistrar.getInstance(project); - projectEnvironment.registerProjectComponent(GroovyUnusedImportsPassFactory.class, new GroovyUnusedImportsPassFactory(project, registrar)); - projectEnvironment.registerProjectComponent(GroovyKeywordHighlightingPassFactory.class, new GroovyKeywordHighlightingPassFactory(project, registrar)); - projectEnvironment.registerProjectComponent(GroovyDeclarationHighlightingPassFactory.class, new GroovyDeclarationHighlightingPassFactory(project, registrar)); - projectEnvironment.registerProjectComponent(GrReferenceHighlighterFactory.class, new GrReferenceHighlighterFactory(project, registrar)); - } - } -} From 0da7b8681741b33d2d1cf7339d9dbbf54b994a9e Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 2 May 2017 13:31:40 +0200 Subject: [PATCH 04/11] change modality deterministically in progress indicators namely, on EDT, before ProgressWindow is started and whenever its dialog is closed previously, the modality was entered at some later moment (invokeLater from start() method), and some runnables could sneak before that --- .../openapi/wm/ex/ProgressIndicatorEx.java | 2 - .../util/AbstractProgressIndicatorExBase.java | 52 ------------------- .../openapi/progress/util/ProgressDialog.java | 5 ++ .../openapi/progress/util/ProgressWindow.java | 16 ++++++ .../progress/impl/ProgressIndicatorTest.java | 5 -- 5 files changed, 21 insertions(+), 59 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/wm/ex/ProgressIndicatorEx.java b/platform/core-impl/src/com/intellij/openapi/wm/ex/ProgressIndicatorEx.java index 5c85e6230f98..4128ea353b12 100644 --- a/platform/core-impl/src/com/intellij/openapi/wm/ex/ProgressIndicatorEx.java +++ b/platform/core-impl/src/com/intellij/openapi/wm/ex/ProgressIndicatorEx.java @@ -22,8 +22,6 @@ import org.jetbrains.annotations.NotNull; public interface ProgressIndicatorEx extends ProgressIndicatorStacked { void addStateDelegate(@NotNull ProgressIndicatorEx delegate); - boolean isModalityEntered(); - void finish(@NotNull TaskInfo task); boolean isFinished(@NotNull TaskInfo task); diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java index 24c8f58efbf5..4de0bfd0abec 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/AbstractProgressIndicatorExBase.java @@ -15,13 +15,10 @@ */ package com.intellij.openapi.progress.util; -import com.intellij.openapi.application.*; -import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.TaskInfo; import com.intellij.openapi.wm.ex.ProgressIndicatorEx; -import com.intellij.ui.GuiUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.WeakList; import org.jetbrains.annotations.NotNull; @@ -31,7 +28,6 @@ import java.util.List; public class AbstractProgressIndicatorExBase extends AbstractProgressIndicatorBase implements ProgressIndicatorEx { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.progress.util.ProgressIndicatorBase"); private final boolean myReusable; - private volatile boolean myModalityEntered; private volatile List myStateDelegates; private volatile WeakList myFinished; private volatile boolean myWasStarted; @@ -52,48 +48,13 @@ public class AbstractProgressIndicatorExBase extends AbstractProgressIndicatorBa delegateRunningChange(ProgressIndicator::start); } myWasStarted = true; - - enterModality(); } - protected final void enterModality() { - if (myModalityProgress == this) { - ModalityState modalityState = ModalityState.defaultModalityState(); - if (!myModalityEntered && - !ApplicationManager.getApplication().isDispatchThread() && - !((TransactionGuardImpl)TransactionGuard.getInstance()).isWriteSafeModality(modalityState)) { - // exceptions here should be assigned to Peter - LOG.error("Non-modal progress should be started in a write-safe context: an action or modality-aware invokeLater. See also TransactionGuard documentation."); - } - GuiUtils.invokeLaterIfNeeded(this::doEnterModality, modalityState); - } - } - - private void doEnterModality() { - if (!myModalityEntered) { - LaterInvocator.enterModal(this); - myModalityEntered = true; - } - } @Override public void stop() { super.stop(); delegateRunningChange(ProgressIndicator::stop); - exitModality(); - } - - protected final void exitModality() { - if (myModalityProgress == this) { - GuiUtils.invokeLaterIfNeeded(this::doExitModality, ModalityState.defaultModalityState()); - } - } - - private void doExitModality() { - if (myModalityEntered) { - myModalityEntered = false; - LaterInvocator.leaveModal(this); - } } @Override @@ -246,19 +207,6 @@ public class AbstractProgressIndicatorExBase extends AbstractProgressIndicatorBa } - @Override - public boolean isModalityEntered() { - return myModalityEntered; - } - - @Override - public synchronized void initStateFrom(@NotNull final ProgressIndicator indicator) { - super.initStateFrom(indicator); - if (indicator instanceof ProgressIndicatorEx) { - myModalityEntered = ((ProgressIndicatorEx)indicator).isModalityEntered(); - } - } - @Override public boolean wasStarted() { return myWasStarted; diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java index b38a2d276e05..65c9620a39bb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java @@ -18,6 +18,8 @@ package com.intellij.openapi.progress.util; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.application.impl.LaterInvocator; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.DialogWrapperDialog; @@ -25,6 +27,7 @@ import com.intellij.openapi.ui.DialogWrapperPeer; import com.intellij.openapi.ui.impl.DialogWrapperPeerImpl; import com.intellij.openapi.ui.impl.FocusTrackbackProvider; import com.intellij.openapi.ui.impl.GlassPaneDialogWrapperPeer; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.WindowManagerEx; @@ -322,6 +325,8 @@ class ProgressDialog implements Disposable { } }); + Disposer.register(myPopup.getDisposable(), () -> myProgressWindow.exitModality()); + myPopup.show(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java index 8404c0b9e994..ce6de9bc5acb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressWindow.java @@ -18,6 +18,7 @@ package com.intellij.openapi.progress.util; import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; @@ -62,6 +63,7 @@ public class ProgressWindow extends ProgressIndicatorBase implements BlockingPro private String myProcessId = ""; @Nullable private volatile Runnable myBackgroundHandler; protected int myDelayInMillis = DEFAULT_PROGRESS_DIALOG_POSTPONE_TIME_MILLIS; + private boolean myModalityEntered; @FunctionalInterface public interface Listener { @@ -181,6 +183,20 @@ public class ProgressWindow extends ProgressIndicatorBase implements BlockingPro timer.start(); } + final void enterModality() { + if (myModalityProgress == this && !myModalityEntered) { + LaterInvocator.enterModal(this); + myModalityEntered = true; + } + } + + final void exitModality() { + if (myModalityProgress == this && myModalityEntered) { + myModalityEntered = false; + LaterInvocator.leaveModal(this); + } + } + @Override public void startBlocking() { startBlocking(EmptyRunnable.getInstance()); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java index 39bbce3c812f..3379f2dde24a 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/progress/impl/ProgressIndicatorTest.java @@ -422,11 +422,6 @@ public class ProgressIndicatorTest extends LightPlatformTestCase { throw new RuntimeException(); } - @Override - public boolean isModalityEntered() { - throw new RuntimeException(); - } - @Override public void finish(@NotNull TaskInfo task) { } From 99ed6941756f705e9e10c038c66e6f6fa9e9cfb0 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 2 May 2017 14:52:15 +0300 Subject: [PATCH 05/11] project structure dialog: show warning if user tries to rename a library imported from an external model (IDEA-171948) --- .../libraryEditor/LibraryRootsComponent.java | 13 +++++++++++-- .../projectRoot/LibraryConfigurable.java | 3 +++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java index b1d9695b6888..a5c21cc87360 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraryEditor/LibraryRootsComponent.java @@ -325,6 +325,10 @@ public class LibraryRootsComponent implements Disposable, LibraryEditorComponent return ArrayUtil.toObjectArray(elements); } + public void onLibraryRenamed() { + updateModificationOfImportedModelWarning(); + } + @Nullable private static Object getPathElement(final TreePath selectionPath) { if (selectionPath == null) { @@ -496,9 +500,14 @@ public class LibraryRootsComponent implements Disposable, LibraryEditorComponent for (Runnable listener : myListeners) { listener.run(); } - ProjectModelExternalSource externalSource = getLibraryEditor().getExternalSource(); + updateModificationOfImportedModelWarning(); + } + + private void updateModificationOfImportedModelWarning() { + LibraryEditor libraryEditor = getLibraryEditor(); + ProjectModelExternalSource externalSource = libraryEditor.getExternalSource(); if (externalSource != null && hasChanges()) { - String name = getLibraryEditor().getName(); + String name = libraryEditor instanceof ExistingLibraryEditor ? ((ExistingLibraryEditor)libraryEditor).getLibrary().getName() : libraryEditor.getName(); myModificationOfImportedModelWarningComponent.showWarning(name != null ? "Library '" + name + "'" : "Library", externalSource); } else { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java index a9ce78ef5c32..c648419f9cb6 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/LibraryConfigurable.java @@ -101,6 +101,9 @@ public class LibraryConfigurable extends ProjectStructureElementConfigurable Date: Tue, 2 May 2017 15:21:12 +0300 Subject: [PATCH 06/11] 5e205485c57b4de92518593004710d58fb7d62c7 (PY-23821, PY-23820) reverted due to IDEA-CR-20743 --- .../sm/runner/OutputToGeneralTestEventsConverter.java | 11 +---------- python/helpers/pycharm/_jb_runner_tools.py | 3 +++ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/OutputToGeneralTestEventsConverter.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/OutputToGeneralTestEventsConverter.java index e28964611ec9..cefb9228128f 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/OutputToGeneralTestEventsConverter.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/OutputToGeneralTestEventsConverter.java @@ -79,16 +79,7 @@ public class OutputToGeneralTestEventsConverter implements ProcessOutputConsumer } public void process(final String text, final Key outputType) { - // Test runner may generate message with protocol start inside of line i.e: "test_test.py.. ##teamcity[testStarted ..." - // Splitter only supports cases when message starts at the beginning of the line - // See https://github.com/JetBrains/teamcity-messages/issues/131 - final int messageProtocolPosition = text.indexOf(ServiceMessage.SERVICE_MESSAGE_START); - if (messageProtocolPosition > 0) { - mySplitter.process(text.substring(0, messageProtocolPosition), outputType); - mySplitter.process(text.substring(messageProtocolPosition), outputType); - } else { - mySplitter.process(text, outputType); - } + mySplitter.process(text, outputType); } /** diff --git a/python/helpers/pycharm/_jb_runner_tools.py b/python/helpers/pycharm/_jb_runner_tools.py index c0ca8d56f065..b18e99043d49 100644 --- a/python/helpers/pycharm/_jb_runner_tools.py +++ b/python/helpers/pycharm/_jb_runner_tools.py @@ -166,6 +166,9 @@ class NewTeamcityServiceMessages(_old_service_messages): _latest_subtest_result = None def message(self, messageName, **properties): + # Intellij may fail to process message if it has char just before it. + # New line has no visible affect, but saves from such cases + print("") if messageName in set(["enteredTheMatrix", "testCount"]): _old_service_messages.message(self, messageName, **properties) return From 3edca4497335eb85c79e74b3e1a808d926c309c6 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 2 May 2017 14:46:23 +0300 Subject: [PATCH 07/11] [groovy] type calculators: add docs --- .../groovy/lang/typing/GrTypeCalculator.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GrTypeCalculator.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GrTypeCalculator.java index 1335c359e145..67ea5531c102 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GrTypeCalculator.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/typing/GrTypeCalculator.java @@ -17,17 +17,30 @@ package org.jetbrains.plugins.groovy.lang.typing; import com.intellij.openapi.util.ClassExtension; import com.intellij.psi.PsiType; +import org.jetbrains.annotations.ApiStatus.Experimental; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +/** + * This API provides ability to plug into expression type calculation in Groovy. + * Each expression has it's default implementation which is executed last. + *

+ * The API is experimental at least until 2017.3. + * + * @param expression class + * @see DefaultListOrMapTypeCalculator + * @see DefaultIndexAccessTypeCalculator + */ +@Experimental public interface GrTypeCalculator { ClassExtension EP = new ClassExtension<>("org.intellij.groovy.typeCalculator"); - @Nullable - PsiType getType(@NotNull T expression); - + /** + * @return {@code expression} type if some implementation can calculate it, otherwise {@code null}.
+ * The result type is the first non-{@code null} value returned. + */ @Nullable static PsiType getTypeFromCalculators(@NotNull GrExpression expression) { for (GrTypeCalculator calculator : EP.forKey(expression.getClass())) { @@ -37,4 +50,10 @@ public interface GrTypeCalculator { } return null; } + + /** + * @return {@code null} if expression type cannot be calculated. + */ + @Nullable + PsiType getType(@NotNull T expression); } From 860f8ea9acfb6a9cc2bb0cc66a3528f6fc1a2ae1 Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Tue, 2 May 2017 14:53:04 +0300 Subject: [PATCH 08/11] [groovy] type calculators: set order of default implementation to 'last' --- plugins/groovy/src/META-INF/plugin.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index 6130169720eb..636474d369ef 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -161,18 +161,18 @@ implementation="org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.path.GrDescriptorReturnTypeCalculator"/> + - - - - + + From c080817c9228827d1894e3ee1e17ca58aa003681 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 2 May 2017 13:45:33 +0200 Subject: [PATCH 09/11] compute project name on init (to allow ProjectNameProvider to provide default name) --- .../openapi/project/impl/ProjectImpl.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index b99f3dc1552f..55a4f860ccb7 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -103,7 +103,7 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project myProjectManager = projectManager; - myName = projectName == null ? getStateStore().getProjectName() : projectName; + myName = projectName; // light project may be changed later during test, so we need to remember its initial state myLight = ApplicationManager.getApplication().isUnitTestMode() && filePath.contains(LIGHT_PROJECT_NAME); } @@ -243,13 +243,16 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project @NotNull @Override public String getName() { + if (myName == null) { + return getStateStore().getProjectName(); + } return myName; } @NonNls @Override public String getPresentableUrl() { - if (myName == null || isDefault()) { + if (isDefault()) { // not yet initialized return null; } @@ -295,6 +298,9 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project if (!isDefault() && !ApplicationManager.getApplication().isHeadlessEnvironment()) { distributeProgress(); } + if (myName == null) { + myName = getStateStore().getProjectName(); + } ApplicationManager.getApplication().getMessageBus().syncPublisher(ProjectLifecycleListener.TOPIC).projectComponentsInitialized(this); //noinspection SynchronizeOnThis @@ -416,10 +422,6 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project return Extensions.getArea(this).getExtensionPoint(extensionPointName).getExtensions(); } - public String getDefaultName() { - return isDefault() ? myName : getStateStore().getProjectName(); - } - private class MyProjectManagerListener extends ProjectManagerAdapter { @Override public void projectOpened(Project project) { @@ -454,7 +456,7 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project (isDisposed() ? " (Disposed" + (temporarilyDisposed ? " temporarily" : "") + ")" : isDefault() ? "" : " '" + getPresentableUrl() + "'") + (isDefault() ? " (Default)" : "") + - " " + myName; + " " + getName(); } @Override From 4a7f75c4d3aa2ce951ea934e057983c834940b96 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 2 May 2017 13:47:53 +0200 Subject: [PATCH 10/11] do not use project name to compute system cache file name, base dir name is enough --- .../src/com/intellij/openapi/compiler/CompilerPaths.java | 3 ++- .../execution/testDiscovery/TestDiscoveryExtension.java | 5 +++-- .../framework/detection/impl/DetectedFrameworksData.java | 6 +++--- .../projectModel-impl/src/com/intellij/project/project.kt | 8 ++++++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java index f10fef02631f..a7aaf85c7366 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/CompilerPaths.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -91,6 +91,7 @@ public class CompilerPaths { } public static String getCompilerSystemDirectoryName(Project project) { + // todo: use ProjectKt.getSystemCacheFileName() return ProjectUtilCore.getPresentableName(project) + "." + project.getLocationHash(); } diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java index ff964fdd6ef5..14038787be32 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryExtension.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.project.ProjectKt; import com.intellij.rt.coverage.data.ProjectData; import com.intellij.util.Alarm; import com.intellij.util.ArrayUtil; @@ -144,7 +145,7 @@ public class TestDiscoveryExtension extends RunConfigurationExtension { @NotNull public static String baseTestDiscoveryPathForProject(Project project) { - return PathManager.getSystemPath() + File.separator + "testDiscovery" + File.separator + project.getName() + "." + project.getLocationHash(); + return PathManager.getSystemPath() + File.separator + "testDiscovery" + File.separator + ProjectKt.getSystemCacheFileName(project, true, "."); } private static final Object ourTracesLock = new Object(); diff --git a/platform/lang-impl/src/com/intellij/framework/detection/impl/DetectedFrameworksData.java b/platform/lang-impl/src/com/intellij/framework/detection/impl/DetectedFrameworksData.java index 0032860b8203..1e240c905007 100644 --- a/platform/lang-impl/src/com/intellij/framework/detection/impl/DetectedFrameworksData.java +++ b/platform/lang-impl/src/com/intellij/framework/detection/impl/DetectedFrameworksData.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,8 @@ package com.intellij.framework.detection.impl; import com.intellij.framework.detection.DetectedFrameworkDescription; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.project.ProjectKt; import com.intellij.util.containers.MultiMap; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.io.DataExternalizer; @@ -50,7 +50,7 @@ public class DetectedFrameworksData { public DetectedFrameworksData(Project project) { myDetectedFrameworks = new MultiMap<>(); - File file = new File(FrameworkDetectorRegistryImpl.getDetectionDirPath() + File.separator + FileUtil.sanitizeFileName(project.getName(), false) + "." + project.getLocationHash() + + File file = new File(FrameworkDetectorRegistryImpl.getDetectionDirPath() + File.separator + ProjectKt.getSystemCacheFileName(project, true, ".") + File.separator + "files"); myNewFiles = new TIntObjectHashMap<>(); try { diff --git a/platform/projectModel-impl/src/com/intellij/project/project.kt b/platform/projectModel-impl/src/com/intellij/project/project.kt index 29a58e7b05b4..0c91a6a7ab54 100644 --- a/platform/projectModel-impl/src/com/intellij/project/project.kt +++ b/platform/projectModel-impl/src/com/intellij/project/project.kt @@ -29,6 +29,7 @@ import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.util.SystemInfo import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.vfs.VirtualFile +import com.intellij.util.PathUtilRt import com.intellij.util.io.basicAttributesIfExists import com.intellij.util.io.exists import java.nio.file.InvalidPathException @@ -120,4 +121,11 @@ fun Project.guessProjectDir() : VirtualFile { } } return this.baseDir!! +} + +// Use parameters only for migration purposes, once all usages will be migrated, parameters will be removed +@JvmOverloads +fun Project.getSystemCacheFileName(forceNameUse: Boolean = false, hashSeparator: String = "-"): String { + val name = if (!forceNameUse && isDirectoryBased) FileUtil.sanitizeFileName(PathUtilRt.getFileName(basePath), false) else name + return "$name$hashSeparator$locationHash" } \ No newline at end of file From 6515c83446c81dc0c5b1a67cf68b85bc10968623 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 2 May 2017 15:38:02 +0300 Subject: [PATCH 11/11] disable document changes during batch folding update and add bounds-checking assertions to EditorSizeManager (to prevent EA-82327) --- .../src/com/intellij/openapi/editor/impl/FoldingModelImpl.java | 1 + .../intellij/openapi/editor/impl/view/EditorSizeManager.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java index d3dd779431af..f4540b7d7309 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java @@ -561,6 +561,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu @Override public void beforeDocumentChange(DocumentEvent event) { + if (myIsBatchFoldingProcessing) LOG.error("Document changes are not allowed during batch folding update"); myDocumentChangeProcessed = false; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java index 5b6d786efd80..b997117c9de8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorSizeManager.java @@ -378,6 +378,8 @@ class EditorSizeManager extends InlayModel.SimpleAdapter implements PrioritizedD } void textLayoutPerformed(int startOffset, int endOffset) { + assert 0 <= startOffset && startOffset < endOffset && endOffset <= myDocument.getTextLength() + : "startOffset=" + startOffset + ", endOffset=" + endOffset; if (myDocument.isInBulkUpdate()) return; if (myEditor.getFoldingModel().isInBatchFoldingOperation()) { myDeferredRanges.add(new TextRange(startOffset, endOffset));