diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 569ac7af0c1b..fa595e20de73 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -20,11 +20,7 @@ - - - - - + diff --git a/platform/lang-api/src/com/intellij/psi/search/ProjectAndLibrariesScope.java b/platform/indexing-api/src/com/intellij/psi/search/ProjectAndLibrariesScope.java similarity index 100% rename from platform/lang-api/src/com/intellij/psi/search/ProjectAndLibrariesScope.java rename to platform/indexing-api/src/com/intellij/psi/search/ProjectAndLibrariesScope.java diff --git a/platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java b/platform/indexing-api/src/com/intellij/psi/search/PsiSearchHelper.java similarity index 99% rename from platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java rename to platform/indexing-api/src/com/intellij/psi/search/PsiSearchHelper.java index 15ff4815a4b8..c5b9f538df76 100644 --- a/platform/lang-api/src/com/intellij/psi/search/PsiSearchHelper.java +++ b/platform/indexing-api/src/com/intellij/psi/search/PsiSearchHelper.java @@ -31,7 +31,7 @@ import org.jetbrains.annotations.Nullable; * * Use {@link com.intellij.psi.search.PsiSearchHelper.SERVICE#getInstance}() to get a search helper instance. */ -public interface PsiSearchHelper extends PsiTodoSearchHelper { +public interface PsiSearchHelper { class SERVICE { private SERVICE() { } diff --git a/platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java b/platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java similarity index 76% rename from platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java rename to platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java index 4a0d56fe312b..cda5223ece04 100644 --- a/platform/lang-api/src/com/intellij/psi/search/PsiSearchRequest.java +++ b/platform/indexing-api/src/com/intellij/psi/search/PsiSearchRequest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.psi.search; import org.jetbrains.annotations.NotNull; diff --git a/platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java b/platform/indexing-api/src/com/intellij/psi/search/QuerySearchRequest.java similarity index 68% rename from platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java rename to platform/indexing-api/src/com/intellij/psi/search/QuerySearchRequest.java index 158ee91dc151..cd0da9bad58e 100644 --- a/platform/lang-api/src/com/intellij/psi/search/QuerySearchRequest.java +++ b/platform/indexing-api/src/com/intellij/psi/search/QuerySearchRequest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.psi.search; import com.intellij.openapi.application.ReadActionProcessor; diff --git a/platform/lang-api/src/com/intellij/psi/search/RequestResultProcessor.java b/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java similarity index 60% rename from platform/lang-api/src/com/intellij/psi/search/RequestResultProcessor.java rename to platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java index e2a1d95c6a06..edc1b64d6e68 100644 --- a/platform/lang-api/src/com/intellij/psi/search/RequestResultProcessor.java +++ b/platform/indexing-api/src/com/intellij/psi/search/RequestResultProcessor.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.psi.search; import com.intellij.psi.PsiElement; diff --git a/platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java b/platform/indexing-api/src/com/intellij/psi/search/SearchRequestCollector.java similarity index 84% rename from platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java rename to platform/indexing-api/src/com/intellij/psi/search/SearchRequestCollector.java index 4a1f82d7903d..88881db85e1f 100644 --- a/platform/lang-api/src/com/intellij/psi/search/SearchRequestCollector.java +++ b/platform/indexing-api/src/com/intellij/psi/search/SearchRequestCollector.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.psi.search; import com.intellij.psi.PsiElement; diff --git a/platform/lang-api/src/com/intellij/psi/search/SearchRequestQuery.java b/platform/indexing-api/src/com/intellij/psi/search/SearchRequestQuery.java similarity index 100% rename from platform/lang-api/src/com/intellij/psi/search/SearchRequestQuery.java rename to platform/indexing-api/src/com/intellij/psi/search/SearchRequestQuery.java diff --git a/platform/indexing-api/src/com/intellij/psi/search/SearchSession.java b/platform/indexing-api/src/com/intellij/psi/search/SearchSession.java new file mode 100644 index 000000000000..0acfd9ba978c --- /dev/null +++ b/platform/indexing-api/src/com/intellij/psi/search/SearchSession.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2012 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.psi.search; + +import com.intellij.openapi.util.UserDataHolderBase; + +/** + * @author peter + */ +public class SearchSession extends UserDataHolderBase { +} diff --git a/platform/lang-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java b/platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java similarity index 69% rename from platform/lang-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java rename to platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java index edd55f417dfe..2f860e1e3527 100644 --- a/platform/lang-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java +++ b/platform/indexing-api/src/com/intellij/psi/search/SingleTargetRequestResultProcessor.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2012 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.psi.search; import com.intellij.psi.PsiElement; diff --git a/platform/lang-api/src/com/intellij/psi/search/TextOccurenceProcessor.java b/platform/indexing-api/src/com/intellij/psi/search/TextOccurenceProcessor.java similarity index 95% rename from platform/lang-api/src/com/intellij/psi/search/TextOccurenceProcessor.java rename to platform/indexing-api/src/com/intellij/psi/search/TextOccurenceProcessor.java index 283b9d8d5133..bd533a186bc7 100644 --- a/platform/lang-api/src/com/intellij/psi/search/TextOccurenceProcessor.java +++ b/platform/indexing-api/src/com/intellij/psi/search/TextOccurenceProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. diff --git a/platform/lang-api/src/com/intellij/psi/search/searches/ReferenceDescriptor.java b/platform/indexing-api/src/com/intellij/psi/search/searches/ReferenceDescriptor.java similarity index 100% rename from platform/lang-api/src/com/intellij/psi/search/searches/ReferenceDescriptor.java rename to platform/indexing-api/src/com/intellij/psi/search/searches/ReferenceDescriptor.java diff --git a/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java b/platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java similarity index 96% rename from platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java rename to platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java index 01a6f1f7f3b0..ce183fee50d9 100644 --- a/platform/lang-api/src/com/intellij/psi/search/searches/ReferencesSearch.java +++ b/platform/indexing-api/src/com/intellij/psi/search/searches/ReferencesSearch.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.search.searches; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.search.*; @@ -27,6 +28,7 @@ import org.jetbrains.annotations.Nullable; * @author max */ public class ReferencesSearch extends ExtensibleQueryFactory { + public static ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.referencesSearch"); private static final ReferencesSearch INSTANCE = new ReferencesSearch(); private ReferencesSearch() { diff --git a/platform/indexing-impl/indexing-impl.iml b/platform/indexing-impl/indexing-impl.iml index 8446a9dbc69c..f28700956c34 100644 --- a/platform/indexing-impl/indexing-impl.iml +++ b/platform/indexing-impl/indexing-impl.iml @@ -9,6 +9,7 @@ + diff --git a/platform/indexing-impl/src/com/intellij/openapi/module/impl/ModuleScopeProviderImpl.java b/platform/indexing-impl/src/com/intellij/openapi/module/impl/ModuleScopeProviderImpl.java new file mode 100644 index 000000000000..f90fe7876987 --- /dev/null +++ b/platform/indexing-impl/src/com/intellij/openapi/module/impl/ModuleScopeProviderImpl.java @@ -0,0 +1,109 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.module.impl; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.impl.scopes.ModuleWithDependenciesScope; +import com.intellij.openapi.module.impl.scopes.ModuleWithDependentsScope; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.util.containers.StripedLockIntObjectConcurrentHashMap; +import org.jetbrains.annotations.NotNull; + +/** + * Author: dmitrylomov + */ +public class ModuleScopeProviderImpl implements ModuleScopeProvider { + private final Module myModule; + private final StripedLockIntObjectConcurrentHashMap myScopeCache = new StripedLockIntObjectConcurrentHashMap(); + private GlobalSearchScope myModuleWithDependentsScope; + private GlobalSearchScope myModuleTestsWithDependentsScope; + + + public ModuleScopeProviderImpl(Module module) { + myModule = module; + } + + @NotNull + public GlobalSearchScope getCachedScope(@ModuleWithDependenciesScope.ScopeConstant int options) { + GlobalSearchScope scope = myScopeCache.get(options); + if (scope == null) { + scope = new ModuleWithDependenciesScope(myModule, options); + myScopeCache.put(options, scope); + } + return scope; + } + + + public GlobalSearchScope getModuleScope() { + return getCachedScope(ModuleWithDependenciesScope.COMPILE | ModuleWithDependenciesScope.TESTS); + } + + @Override + public GlobalSearchScope getModuleScope(boolean includeTests) { + return getCachedScope(ModuleWithDependenciesScope.COMPILE | (includeTests ? ModuleWithDependenciesScope.TESTS : 0)); + } + + public GlobalSearchScope getModuleWithLibrariesScope() { + return getCachedScope(ModuleWithDependenciesScope.COMPILE | ModuleWithDependenciesScope.TESTS | ModuleWithDependenciesScope.LIBRARIES); + } + + public GlobalSearchScope getModuleWithDependenciesScope() { + return getCachedScope(ModuleWithDependenciesScope.COMPILE | ModuleWithDependenciesScope.TESTS | ModuleWithDependenciesScope.MODULES); + } + + @Override + public GlobalSearchScope getModuleContentScope() { + return getCachedScope(ModuleWithDependenciesScope.CONTENT); + } + + @Override + public GlobalSearchScope getModuleContentWithDependenciesScope() { + return getCachedScope(ModuleWithDependenciesScope.CONTENT | ModuleWithDependenciesScope.MODULES); + } + + public GlobalSearchScope getModuleWithDependenciesAndLibrariesScope(boolean includeTests) { + return getCachedScope(ModuleWithDependenciesScope.COMPILE | + ModuleWithDependenciesScope.MODULES | + ModuleWithDependenciesScope.LIBRARIES | (includeTests ? ModuleWithDependenciesScope.TESTS : 0)); + } + + public GlobalSearchScope getModuleWithDependentsScope() { + if (myModuleWithDependentsScope == null) { + myModuleWithDependentsScope = new ModuleWithDependentsScope(myModule, false); + } + return myModuleWithDependentsScope; + } + + public GlobalSearchScope getModuleTestsWithDependentsScope() { + if (myModuleTestsWithDependentsScope == null) { + myModuleTestsWithDependentsScope = new ModuleWithDependentsScope(myModule, true); + } + return myModuleTestsWithDependentsScope; + } + + public GlobalSearchScope getModuleRuntimeScope(boolean includeTests) { + return getCachedScope( + ModuleWithDependenciesScope.MODULES | ModuleWithDependenciesScope.LIBRARIES | (includeTests ? ModuleWithDependenciesScope.TESTS : 0)); + } + + @Override + public void clearCache() { + myScopeCache.clear(); + myModuleWithDependentsScope = null; + myModuleTestsWithDependentsScope = null; + } + +} diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/JdkScope.java b/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/JdkScope.java similarity index 100% rename from platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/JdkScope.java rename to platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/JdkScope.java diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/LibraryRuntimeClasspathScope.java b/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/LibraryRuntimeClasspathScope.java similarity index 100% rename from platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/LibraryRuntimeClasspathScope.java rename to platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/LibraryRuntimeClasspathScope.java diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependenciesScope.java b/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependenciesScope.java similarity index 100% rename from platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependenciesScope.java rename to platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependenciesScope.java diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java b/platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java similarity index 100% rename from platform/lang-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java rename to platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/LibraryScopeCache.java b/platform/indexing-impl/src/com/intellij/openapi/roots/impl/LibraryScopeCache.java similarity index 100% rename from platform/lang-impl/src/com/intellij/openapi/roots/impl/LibraryScopeCache.java rename to platform/indexing-impl/src/com/intellij/openapi/roots/impl/LibraryScopeCache.java diff --git a/platform/lang-impl/src/com/intellij/psi/ResolveScopeEnlarger.java b/platform/indexing-impl/src/com/intellij/psi/ResolveScopeEnlarger.java similarity index 100% rename from platform/lang-impl/src/com/intellij/psi/ResolveScopeEnlarger.java rename to platform/indexing-impl/src/com/intellij/psi/ResolveScopeEnlarger.java diff --git a/platform/lang-impl/src/com/intellij/psi/ResolveScopeProvider.java b/platform/indexing-impl/src/com/intellij/psi/ResolveScopeProvider.java similarity index 96% rename from platform/lang-impl/src/com/intellij/psi/ResolveScopeProvider.java rename to platform/indexing-impl/src/com/intellij/psi/ResolveScopeProvider.java index 2176b1c01eb2..e00cc18a1e6c 100644 --- a/platform/lang-impl/src/com/intellij/psi/ResolveScopeProvider.java +++ b/platform/indexing-impl/src/com/intellij/psi/ResolveScopeProvider.java @@ -19,7 +19,6 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.SearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java similarity index 71% rename from platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java rename to platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java index 5773600672f6..54a3bf5ce979 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/CacheManager.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/CacheManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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,11 +18,8 @@ package com.intellij.psi.impl.cache; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.IndexPattern; -import com.intellij.psi.search.IndexPatternProvider; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; @@ -37,22 +34,6 @@ public interface CacheManager { } @NotNull PsiFile[] getFilesWithWord(@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively); - boolean processFilesWithWord(@NotNull Processor processor,@NotNull String word, short occurenceMask, @NotNull GlobalSearchScope scope, final boolean caseSensitively); - - /** - * @return all VirtualFile's that contain todo-items under project roots - */ - @NotNull PsiFile[] getFilesWithTodoItems(); - - /** - * @return -1 if it's not known - */ - int getTodoCount(@NotNull VirtualFile file, final IndexPatternProvider patternProvider); - - /** - * @return -1 if it's not known - */ - int getTodoCount(@NotNull VirtualFile file, IndexPattern pattern); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java similarity index 60% rename from platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java rename to platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java index 689b68b7725d..1a44cf491b54 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -16,17 +16,14 @@ package com.intellij.psi.impl.cache.impl; -import com.intellij.injected.editor.VirtualFileWindow; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadActionProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; @@ -34,18 +31,14 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.impl.cache.CacheManager; import com.intellij.psi.impl.cache.impl.id.IdIndex; import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; -import com.intellij.psi.impl.cache.impl.todo.TodoIndex; -import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.IndexPattern; -import com.intellij.psi.search.IndexPatternProvider; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.List; /** * @author Eugene Zhuravlev @@ -72,10 +65,6 @@ public class IndexCacheManagerImpl implements CacheManager{ return processor.getResults().isEmpty() ? PsiFile.EMPTY_ARRAY : processor.toArray(PsiFile.EMPTY_ARRAY); } - public static boolean shouldBeFound(GlobalSearchScope scope, VirtualFile virtualFile, FileIndexFacade index) { - return (scope.isSearchOutsideRootModel() || index.isInContent(virtualFile) || index.isInLibrarySource(virtualFile)) && !virtualFile.getFileType().isBinary(); - } - // IMPORTANT!!! // Since implementation of virtualFileProcessor.process() may call indices directly or indirectly, // we cannot call it inside FileBasedIndex.processValues() method except in collecting form @@ -95,9 +84,9 @@ public class IndexCacheManagerImpl implements CacheManager{ final FileIndexFacade index = FileIndexFacade.getInstance(myProject); @Override public boolean process(final VirtualFile file, final Integer value) { - ProgressManager.checkCanceled(); + ProgressIndicatorProvider.checkCanceled(); final int mask = value.intValue(); - if ((mask & occurrenceMask) != 0 && shouldBeFound(scope, file, index)) { + if ((mask & occurrenceMask) != 0 && index.shouldBeFound(scope, file)) { if (!fileProcessor.process(file)) return false; } return true; @@ -135,78 +124,11 @@ public class IndexCacheManagerImpl implements CacheManager{ // If we do, deadlocks are possible (IDEADEV-42137). So first we obtain files with the word specified, // and then process them not holding indices' read lock. for (VirtualFile vFile : vFiles) { - ProgressManager.checkCanceled(); + ProgressIndicatorProvider.checkCanceled(); if (!virtualFileProcessor.process(vFile)) { return false; } } return true; } - - @Override - @NotNull - public PsiFile[] getFilesWithTodoItems() { - if (myProject.isDefault()) { - return PsiFile.EMPTY_ARRAY; - } - final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); - final Set allFiles = new HashSet(); - final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); - for (IndexPattern indexPattern : IndexPatternUtil.getIndexPatterns()) { - final Collection files = fileBasedIndex.getContainingFiles( - TodoIndex.NAME, - new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), GlobalSearchScope.allScope(myProject)); - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - for (VirtualFile file : files) { - if (projectFileIndex.isInContent(file)) { - final PsiFile psiFile = myPsiManager.findFile(file); - if (psiFile != null) { - allFiles.add(psiFile); - } - } - } - } - }); - } - return allFiles.isEmpty() ? PsiFile.EMPTY_ARRAY : PsiUtilCore.toPsiFileArray(allFiles); - } - - @Override - public int getTodoCount(@NotNull final VirtualFile file, final IndexPatternProvider patternProvider) { - if (myProject.isDefault()) { - return 0; - } - if (file instanceof VirtualFileWindow) return -1; - final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); - int count = 0; - for (IndexPattern indexPattern : patternProvider.getIndexPatterns()) { - count += fetchCount(fileBasedIndex, file, indexPattern); - } - return count; - } - - @Override - public int getTodoCount(@NotNull final VirtualFile file, final IndexPattern pattern) { - if (myProject.isDefault()) { - return 0; - } - if (file instanceof VirtualFileWindow) return -1; - return fetchCount(FileBasedIndex.getInstance(), file, pattern); - } - - private int fetchCount(final FileBasedIndex fileBasedIndex, final VirtualFile file, final IndexPattern indexPattern) { - final int[] count = {0}; - fileBasedIndex.processValues( - TodoIndex.NAME, new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), file, - new FileBasedIndex.ValueProcessor() { - @Override - public boolean process(final VirtualFile file, final Integer value) { - count[0] += value.intValue(); - return true; - } - }, GlobalSearchScope.fileScope(myProject, file)); - return count[0]; - } } diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/id/IdTableBuilding.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/id/IdTableBuilding.java index e8cc0d0ba880..78861024d61b 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/id/IdTableBuilding.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/id/IdTableBuilding.java @@ -25,26 +25,17 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.impl.CustomSyntaxTableFileType; import com.intellij.psi.CustomHighlighterTokenType; -import com.intellij.psi.impl.cache.impl.IndexPatternUtil; -import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; -import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; -import com.intellij.psi.impl.cache.impl.todo.TodoIndexers; -import com.intellij.psi.search.IndexPattern; import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.tree.TokenSet; import com.intellij.util.Processor; -import com.intellij.util.indexing.DataIndexer; import com.intellij.util.indexing.FileContent; import com.intellij.util.indexing.IdDataConsumer; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class IdTableBuilding { private IdTableBuilding() { @@ -74,41 +65,6 @@ public class IdTableBuilding { } } - public static class PlainTextTodoIndexer implements DataIndexer { - @Override - @NotNull - public Map map(final FileContent inputData) { - final CharSequence chars = inputData.getContentAsText(); - - - final IndexPattern[] indexPatterns = IndexPatternUtil.getIndexPatterns(); - if (indexPatterns.length > 0) { - final OccurrenceConsumer occurrenceConsumer = new OccurrenceConsumer(null, true); - for (IndexPattern indexPattern : indexPatterns) { - Pattern pattern = indexPattern.getPattern(); - if (pattern != null) { - Matcher matcher = pattern.matcher(chars); - while (matcher.find()) { - if (matcher.start() != matcher.end()) { - occurrenceConsumer.incTodoOccurrence(indexPattern); - } - } - } - } - Map map = new HashMap(); - for (IndexPattern indexPattern : indexPatterns) { - final int count = occurrenceConsumer.getOccurrenceCount(indexPattern); - if (count > 0) { - map.put(new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), count); - } - } - return map; - } - return Collections.emptyMap(); - } - - } - private static final HashMap ourIdIndexers = new HashMap(); @Deprecated @@ -120,11 +76,6 @@ public class IdTableBuilding { return ourIdIndexers.containsKey(fileType) || IdIndexers.INSTANCE.forFileType(fileType) != null; } - public static boolean isTodoIndexerRegistered(FileType fileType) { - return ourIdIndexers.containsKey(fileType) || TodoIndexers.INSTANCE.forFileType(fileType) != null; - } - - @Nullable public static FileTypeIdIndexer getFileTypeIndexer(FileType fileType) { @@ -249,5 +200,4 @@ public class IdTableBuilding { processor.run(chars, charArray, index1, index); } } - } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java similarity index 95% rename from platform/lang-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java rename to platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java index 5e638f303b43..72c28304074c 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/file/impl/ResolveScopeManagerImpl.java @@ -15,10 +15,9 @@ */ package com.intellij.psi.impl.file.impl; -import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.impl.scopes.LibraryRuntimeClasspathScope; -import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.LibraryScopeCache; @@ -85,8 +84,9 @@ public class ResolveScopeManagerImpl extends ResolveScopeManager { ProjectFileIndex projectFileIndex = myProjectRootManager.getFileIndex(); Module module = projectFileIndex.getModuleForFile(vFile); if (module != null) { - boolean includeTests = projectFileIndex.isInTestSourceContent(vFile) || - !(vFile.getFileType() == StdFileTypes.JAVA && projectFileIndex.isContentSourceFile(vFile)); + boolean includeTests = projectFileIndex.isInTestSourceContent(vFile); + // TODO: dmitrylomov: removed this line to see what fails. + //!(vFile.getFileType() == StdFileTypes.JAVA && projectFileIndex.isContentSourceFile(vFile)); return GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, includeTests); } else { @@ -96,8 +96,6 @@ public class ResolveScopeManagerImpl extends ResolveScopeManager { LibraryOrderEntry lib = null; for (OrderEntry entry : orderEntries) { - ProgressManager.checkCanceled(); - if (entry instanceof JdkOrderEntry) { return LibraryScopeCache.getInstance(myProject).getScopeForSdk((JdkOrderEntry)entry); } @@ -134,7 +132,7 @@ public class ResolveScopeManagerImpl extends ResolveScopeManager { @Override @NotNull public GlobalSearchScope getResolveScope(@NotNull PsiElement element) { - ProgressManager.checkCanceled(); + ProgressIndicatorProvider.checkCanceled(); VirtualFile vFile; final PsiFile contextFile; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java similarity index 100% rename from platform/lang-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java rename to platform/indexing-impl/src/com/intellij/psi/impl/search/CachesBasedRefSearcher.java diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java similarity index 97% rename from platform/lang-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java rename to platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java index 3737b39d28c0..bf0f4ba81f26 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -24,9 +24,9 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; +import com.intellij.psi.impl.InjectedLanguageFacade; import com.intellij.psi.impl.source.tree.LeafElement; import com.intellij.psi.impl.source.tree.TreeElement; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.search.TextOccurenceProcessor; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.text.CharArrayUtil; @@ -49,7 +49,7 @@ public class LowLevelSearchUtil { final StringSearcher searcher, ProgressIndicator progress) { if (!(element instanceof PsiLanguageInjectionHost)) return null; - List> list = InjectedLanguageUtil.getInjectedPsiFiles(element); + List> list = InjectedLanguageFacade.getInstance().getInjectedPsiFiles(element); if (list == null) return null; for (Pair pair : list) { final PsiElement injected = pair.getFirst(); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java similarity index 87% rename from platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java rename to platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java index c8245d5fe416..102d132e8193 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/search/PsiSearchHelperImpl.java @@ -16,9 +16,7 @@ package com.intellij.psi.impl.search; -import com.intellij.codeInsight.CommentUtil; -import com.intellij.concurrency.JobUtil; -import com.intellij.ide.todo.TodoIndexPatternProvider; +import com.intellij.concurrency.JobLauncher; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.ReadActionProcessor; @@ -26,23 +24,25 @@ import com.intellij.openapi.application.Result; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.util.*; +import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.NullableComputable; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.cache.CacheManager; -import com.intellij.psi.impl.cache.impl.IndexCacheManagerImpl; import com.intellij.psi.impl.cache.impl.id.IdIndex; import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; import com.intellij.psi.search.*; -import com.intellij.psi.search.searches.IndexPatternSearch; -import com.intellij.psi.util.PsiUtilBase; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; import com.intellij.util.SmartList; +import com.intellij.util.codeInsight.CommentUtilCore; import com.intellij.util.containers.CollectionFactory; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; @@ -60,7 +60,6 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.search.PsiSearchHelperImpl"); private final PsiManagerEx myManager; - private static final TodoItem[] EMPTY_TODO_ITEMS = new TodoItem[0]; @Override @NotNull @@ -80,81 +79,6 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { myManager = manager; } - @Override - @NotNull - public PsiFile[] findFilesWithTodoItems() { - return CacheManager.SERVICE.getInstance(myManager.getProject()).getFilesWithTodoItems(); - } - - @Override - @NotNull - public TodoItem[] findTodoItems(@NotNull PsiFile file) { - return findTodoItems(file, 0, file.getTextLength()); - } - - @Override - @NotNull - public TodoItem[] findTodoItems(@NotNull PsiFile file, int startOffset, int endOffset) { - final Collection occurrences = IndexPatternSearch.search(file, TodoIndexPatternProvider.getInstance()).findAll(); - if (occurrences.isEmpty()) { - return EMPTY_TODO_ITEMS; - } - - return processTodoOccurences(startOffset, endOffset, occurrences); - } - - private TodoItem[] processTodoOccurences(int startOffset, int endOffset, Collection occurrences) { - List items = new ArrayList(occurrences.size()); - TextRange textRange = new TextRange(startOffset, endOffset); - final TodoItemsCreator todoItemsCreator = new TodoItemsCreator(); - for(IndexPatternOccurrence occurrence: occurrences) { - TextRange occurrenceRange = occurrence.getTextRange(); - if (textRange.contains(occurrenceRange)) { - items.add(todoItemsCreator.createTodo(occurrence)); - } - } - - return items.toArray(new TodoItem[items.size()]); - } - - @NotNull - @Override - public TodoItem[] findTodoItemsLight(@NotNull PsiFile file) { - return findTodoItemsLight(file, 0, file.getTextLength()); - } - - @NotNull - @Override - public TodoItem[] findTodoItemsLight(@NotNull PsiFile file, int startOffset, int endOffset) { - final Collection occurrences = - LightIndexPatternSearch.SEARCH.createQuery(new IndexPatternSearch.SearchParameters(file, TodoIndexPatternProvider.getInstance())).findAll(); - - if (occurrences.isEmpty()) { - return EMPTY_TODO_ITEMS; - } - - return processTodoOccurences(startOffset, endOffset, occurrences); - } - - @Override - public int getTodoItemsCount(@NotNull PsiFile file) { - int count = CacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), TodoIndexPatternProvider.getInstance()); - if (count != -1) return count; - return findTodoItems(file).length; - } - - @Override - public int getTodoItemsCount(@NotNull PsiFile file, @NotNull TodoPattern pattern) { - int count = CacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), pattern.getIndexPattern()); - if (count != -1) return count; - TodoItem[] items = findTodoItems(file); - count = 0; - for (TodoItem item : items) { - if (item.getPattern().equals(pattern)) count++; - } - return count; - } - @Override @NotNull public PsiElement[] findCommentsContainingIdentifier(@NotNull String identifier, @NotNull SearchScope searchScope) { @@ -169,7 +93,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { } }); synchronized (results) { - return PsiUtilBase.toPsiElementArray(results); + return PsiUtilCore.toPsiElementArray(results); } } @@ -180,7 +104,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { TextOccurenceProcessor occurrenceProcessor = new TextOccurenceProcessor() { @Override public boolean execute(PsiElement element, int offsetInElement) { - if (CommentUtil.isCommentTextElement(element)) { + if (CommentUtilCore.isCommentTextElement(element)) { if (element.findReferenceAt(offsetInElement) == null) { return processor.process(element); } @@ -200,7 +124,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { if (text.length() == 0) { throw new IllegalArgumentException("Cannot search for elements with empty text"); } - final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); + final ProgressIndicator progress = ProgressIndicatorProvider.getInstance().getProgressIndicator(); if (searchScope instanceof GlobalSearchScope) { StringSearcher searcher = new StringSearcher(text, caseSensitively, true); @@ -214,12 +138,17 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { PsiElement[] scopeElements = scope.getScope(); final boolean ignoreInjectedPsi = scope.isIgnoreInjectedPsi(); - return JobUtil.invokeConcurrentlyUnderProgress(Arrays.asList(scopeElements), progress, false, new Processor() { - @Override - public boolean process(PsiElement scopeElement) { - return processElementsWithWordInScopeElement(scopeElement, processor, text, caseSensitively, ignoreInjectedPsi, progress); - } - }); + return JobLauncher.getInstance().invokeConcurrentlyUnderProgress(Arrays.asList(scopeElements), progress, false, + new Processor() { + @Override + public boolean process(PsiElement scopeElement) { + return processElementsWithWordInScopeElement(scopeElement, + processor, text, + caseSensitively, + ignoreInjectedPsi, + progress); + } + }); } } @@ -283,7 +212,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { final AtomicBoolean pceThrown = new AtomicBoolean(false); final int size = files.size(); - boolean completed = JobUtil.invokeConcurrentlyUnderProgress(files, progress, false, new Processor() { + boolean completed = JobLauncher.getInstance().invokeConcurrentlyUnderProgress(files, progress, false, new Processor() { @Override public boolean process(final VirtualFile vfile) { final PsiFile file = ApplicationManager.getApplication().runReadAction(new Computable() { @@ -304,7 +233,14 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { for (PsiElement psiRoot : psiRoots) { if (progress != null) progress.checkCanceled(); if (!processed.add(psiRoot)) continue; - assert psiRoot != null : "One of the roots of file "+file + " is null. All roots: "+Arrays.asList(psiRoots)+"; Viewprovider: "+file.getViewProvider()+"; Virtual file: "+file.getViewProvider().getVirtualFile(); + assert psiRoot != null : "One of the roots of file " + + file + + " is null. All roots: " + + Arrays.asList(psiRoots) + + "; Viewprovider: " + + file.getViewProvider() + + "; Virtual file: " + + file.getViewProvider().getVirtualFile(); if (!psiRootProcessor.process(psiRoot)) { canceled.set(true); return; @@ -382,7 +318,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { return ContainerUtil.process(collectProcessor.getResults(), new ReadActionProcessor() { @Override public boolean processInReadAction(VirtualFile virtualFile) { - return !IndexCacheManagerImpl.shouldBeFound(scope, virtualFile, index) || processor.process(virtualFile); + return !index.shouldBeFound(scope, virtualFile) || processor.process(virtualFile); } }); } @@ -412,7 +348,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { if (qName.length() == 0) { throw new IllegalArgumentException("Cannot search for elements with empty text"); } - final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); + final ProgressIndicator progress = ProgressIndicatorProvider.getInstance().getProgressIndicator(); int dotIndex = qName.lastIndexOf('.'); int dollarIndex = qName.lastIndexOf('$'); @@ -541,7 +477,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { appendCollectorsFromQueryRequests(collectors); - ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); + ProgressIndicator progress = ProgressIndicatorProvider.getInstance().getProgressIndicator(); do { final MultiMap, RequestWithProcessor> globals = new MultiMap, RequestWithProcessor>(); final List> customs = CollectionFactory.arrayList(); @@ -699,7 +635,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { FileBasedIndex.getInstance().processValues(IdIndex.NAME, entry, file, new FileBasedIndex.ValueProcessor() { @Override public boolean process(VirtualFile file, Integer value) { - if (IndexCacheManagerImpl.shouldBeFound(commonScope, file, index)) { + if (index.shouldBeFound(commonScope, file)) { int mask = value.intValue(); for (RequestWithProcessor single : data) { final PsiSearchRequest request = single.request; @@ -754,7 +690,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { public boolean process(VirtualFile file, Integer value) { if (progress != null) progress.checkCanceled(); - if (IndexCacheManagerImpl.shouldBeFound(commonScope, file, index)) { + if (index.shouldBeFound(commonScope, file)) { int mask = value.intValue(); for (RequestWithProcessor single : data) { final PsiSearchRequest request = single.request; @@ -832,7 +768,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper { @Override public boolean process(VirtualFile file) { if (file == fileToIgnoreOccurencesInVirtualFile) return true; - if (!IndexCacheManagerImpl.shouldBeFound(scope, file, index)) return true; + if (!index.shouldBeFound(scope, file)) return true; final int value = count.incrementAndGet(); return value < 10; } diff --git a/platform/lang-impl/src/com/intellij/psi/search/ProjectScopeBuilderImpl.java b/platform/indexing-impl/src/com/intellij/psi/search/ProjectScopeBuilderImpl.java similarity index 100% rename from platform/lang-impl/src/com/intellij/psi/search/ProjectScopeBuilderImpl.java rename to platform/indexing-impl/src/com/intellij/psi/search/ProjectScopeBuilderImpl.java diff --git a/platform/lang-impl/src/com/intellij/psi/search/UseScopeEnlarger.java b/platform/indexing-impl/src/com/intellij/psi/search/UseScopeEnlarger.java similarity index 96% rename from platform/lang-impl/src/com/intellij/psi/search/UseScopeEnlarger.java rename to platform/indexing-impl/src/com/intellij/psi/search/UseScopeEnlarger.java index 149b051838fa..4158be2b0663 100644 --- a/platform/lang-impl/src/com/intellij/psi/search/UseScopeEnlarger.java +++ b/platform/indexing-impl/src/com/intellij/psi/search/UseScopeEnlarger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2012 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. diff --git a/platform/lang-api/src/com/intellij/codeInsight/template/TemplateBuilder.java b/platform/lang-api/src/com/intellij/codeInsight/template/TemplateBuilder.java index a6b955f6b850..3d938c68a3c4 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/template/TemplateBuilder.java +++ b/platform/lang-api/src/com/intellij/codeInsight/template/TemplateBuilder.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight.template; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; @@ -65,6 +66,15 @@ public interface TemplateBuilder { /** * Shows the live template and initiates editing process. + * @deprecated doesn't work correctly for files with multiple editors use #run(Editor, boolean) instead */ + @Deprecated void run(); + + /** + * Shows the live template and initiates editing process. + * @param editor editor to use to start editing process. + * @param inline if true then inline template will be created, regular otherwise + */ + void run(@NotNull Editor editor, boolean inline); } diff --git a/platform/lang-api/src/com/intellij/ide/actions/ElementCreator.java b/platform/lang-api/src/com/intellij/ide/actions/ElementCreator.java index e86642c1083e..0992221826a0 100644 --- a/platform/lang-api/src/com/intellij/ide/actions/ElementCreator.java +++ b/platform/lang-api/src/com/intellij/ide/actions/ElementCreator.java @@ -30,7 +30,6 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.SmartPointerManager; import com.intellij.psi.SmartPsiElementPointer; import com.intellij.psi.util.PsiUtilBase; -import com.intellij.util.IncorrectOperationException; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java index fdf5d8044391..59fc46c7f6ad 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/JdkUtil.java @@ -44,7 +44,6 @@ import java.util.List; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; -import java.util.zip.ZipEntry; public class JdkUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.projectRoots.JdkUtil"); @@ -96,7 +95,7 @@ public class JdkUtil { return null; } try { - ZipEntry entry = manifestJarFile.getEntry(JarFile.MANIFEST_NAME); + com.intellij.openapi.vfs.JarFile.JarEntry entry = manifestJarFile.getEntry(JarFile.MANIFEST_NAME); if (entry == null) { return null; } diff --git a/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java b/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java index fbfd06d5196d..c0d16c6ef762 100644 --- a/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java +++ b/platform/lang-api/src/com/intellij/psi/search/PsiTodoSearchHelper.java @@ -15,6 +15,8 @@ */ package com.intellij.psi.search; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -24,6 +26,15 @@ import org.jetbrains.annotations.NotNull; * Time: 10:08 AM */ public interface PsiTodoSearchHelper { + class SERVICE { + private SERVICE() { + } + + public static PsiTodoSearchHelper getInstance(Project project) { + return ServiceManager.getService(project, PsiTodoSearchHelper.class); + } + } + /** * Returns the list of all files in the project which have to do items. * diff --git a/platform/lang-api/src/com/intellij/psi/search/SearchSession.java b/platform/lang-api/src/com/intellij/psi/search/SearchSession.java deleted file mode 100644 index 6962de194566..000000000000 --- a/platform/lang-api/src/com/intellij/psi/search/SearchSession.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.intellij.psi.search; - -import com.intellij.openapi.util.UserDataHolderBase; - -/** - * @author peter - */ -public class SearchSession extends UserDataHolderBase { -} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java b/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java index 179f975b6ee9..bd7753874d63 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/AutoPopupController.java @@ -40,7 +40,7 @@ import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -157,7 +157,7 @@ public class AutoPopupController implements Disposable { if (file == null) return; if (!documentManager.isUncommited(editor.getDocument())) { - file = documentManager.getPsiFile(InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, file).getDocument()); + file = documentManager.getPsiFile(InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(editor, file).getDocument()); if (file == null) return; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/CommentUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/CommentUtil.java index a2ac211476b1..afcd6bb833b1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/CommentUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/CommentUtil.java @@ -16,19 +16,15 @@ package com.intellij.codeInsight; -import com.intellij.lang.*; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiComment; -import com.intellij.psi.PsiElement; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.Indent; -import com.intellij.psi.tree.IElementType; +import com.intellij.util.codeInsight.CommentUtilCore; import com.intellij.util.text.CharArrayUtil; -import org.jetbrains.annotations.Nullable; -public class CommentUtil { +public class CommentUtil extends CommentUtilCore { private CommentUtil() { } public static Indent getMinLineIndent(Project project, Document document, int line1, int line2, FileType fileType) { @@ -57,26 +53,4 @@ public class CommentUtil { //} return minIndent; } - - public static boolean isComment(@Nullable final PsiElement element) { - return element != null && isComment(element.getNode()); - } - - public static boolean isComment(@Nullable final ASTNode node) { - if (node == null) return false; - final IElementType type = node.getElementType(); - final ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(type.getLanguage()); - return parserDefinition != null && parserDefinition.getCommentTokens().contains(type); - } - - public static boolean isCommentTextElement(final PsiElement element) { - final Commenter commenter = LanguageCommenters.INSTANCE.forLanguage(element.getLanguage()); - if (commenter instanceof CodeDocumentationAwareCommenterEx) { - final CodeDocumentationAwareCommenterEx commenterEx = (CodeDocumentationAwareCommenterEx)commenter; - if (commenterEx.isDocumentationCommentText(element)) return true; - if (element instanceof PsiComment && commenterEx.isDocumentationComment((PsiComment)element)) return false; - } - - return isComment(element); - } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/actions/BaseCodeInsightAction.java b/platform/lang-impl/src/com/intellij/codeInsight/actions/BaseCodeInsightAction.java index 2a76da8174ba..d3fc7311dd0e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/actions/BaseCodeInsightAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/actions/BaseCodeInsightAction.java @@ -26,7 +26,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,7 +59,7 @@ public abstract class BaseCodeInsightAction extends CodeInsightAction { PsiFile psiFile = documentManager.getCachedPsiFile(editor.getDocument()); if (psiFile != null) { if (commit) documentManager.commitAllDocuments(); - injectedEditor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, psiFile); + injectedEditor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(editor, psiFile); } } return injectedEditor; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index e24f399eedaa..98303e02eab9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -60,7 +60,7 @@ import com.intellij.psi.impl.DebugUtil; import com.intellij.psi.impl.PsiFileEx; import com.intellij.psi.impl.PsiModificationTrackerImpl; import com.intellij.psi.impl.source.PostprocessReformattingAspect; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilBase; import com.intellij.reference.SoftReference; import com.intellij.util.Consumer; @@ -223,7 +223,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { int offset = editor.getCaretModel().getOffset(); int psiOffset = Math.max(0, offset - 1); - PsiElement elementAt = InjectedLanguageUtil.findInjectedElementNoCommit(psiFile, psiOffset); + PsiElement elementAt = InjectedLanguageFacadeImpl.findInjectedElementNoCommit(psiFile, psiOffset); if (elementAt == null) { elementAt = psiFile.findElementAt(psiOffset); } @@ -528,10 +528,10 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { } } }); - final PsiFile hostFile = InjectedLanguageUtil.getTopLevelFile(fileCopy[0]); + final PsiFile hostFile = InjectedLanguageFacadeImpl.getTopLevelFile(fileCopy[0]); final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); final int hostStartOffset = injectedLanguageManager.injectedToHost(fileCopy[0], initContext.getStartOffset()); - final Editor hostEditor = InjectedLanguageUtil.getTopLevelEditor(initContext.getEditor()); + final Editor hostEditor = InjectedLanguageFacadeImpl.getTopLevelEditor(initContext.getEditor()); final OffsetMap hostMap = new OffsetMap(hostEditor.getDocument()); final OffsetMap original = initContext.getOffsetMap(); @@ -595,13 +595,14 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(hostFile.getProject()); CompletionContext context; - PsiFile injected = InjectedLanguageUtil.findInjectedPsiNoCommit(hostFile, hostStartOffset); + PsiFile injected = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(hostFile, hostStartOffset); if (injected != null) { TextRange host = injectedLanguageManager.injectedToHost(injected, injected.getTextRange()); assert hostStartOffset >= host.getStartOffset() : "startOffset before injected"; assert hostStartOffset <= host.getEndOffset() : "startOffset after injected"; - EditorWindow injectedEditor = (EditorWindow)InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(hostEditor, hostFile, hostStartOffset); + EditorWindow injectedEditor = (EditorWindow)InjectedLanguageFacadeImpl + .getEditorForInjectedLanguageNoCommit(hostEditor, hostFile, hostStartOffset); assert injected == injectedEditor.getInjectedFile(); final OffsetMap map = new OffsetMap(injectedEditor.getDocument()); for (final OffsetKey key : hostMap.getAllOffsets()) { @@ -825,7 +826,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { } private static Runnable rememberDocumentState(final Editor _editor) { - final Editor editor = InjectedLanguageUtil.getTopLevelEditor(_editor); + final Editor editor = InjectedLanguageFacadeImpl.getTopLevelEditor(_editor); final String documentText = editor.getDocument().getText(); final int caret = editor.getCaretModel().getOffset(); final int selStart = editor.getSelectionModel().getSelectionStart(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java index 2d8c4eb47a3f..baff2b619c87 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CompletionServiceImpl.java @@ -31,7 +31,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.Weigher; import com.intellij.psi.WeighingService; import com.intellij.psi.impl.DebugUtil; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -140,7 +140,7 @@ public class CompletionServiceImpl extends CompletionService{ PsiFile positionFile = myParameters.getPosition().getContainingFile(); LOG.error("prefix should be some actual file string just before caret: " + matcher.getPrefix() + "\n text=" + fragment + - "\ninjected=" + (InjectedLanguageUtil.getTopLevelFile(positionFile) != positionFile) + + "\ninjected=" + (InjectedLanguageFacadeImpl.getTopLevelFile(positionFile) != positionFile) + "\nlang=" + positionFile.getLanguage()); } return new CompletionResultSetImpl(getConsumer(), myTextBeforePosition, matcher, myContributor, myParameters, mySorter, myProcess, this); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/ReferenceImporter.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/ReferenceImporter.java index dd21b3b2defa..d7e7ea32ad2b 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/ReferenceImporter.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/ReferenceImporter.java @@ -28,4 +28,5 @@ public interface ReferenceImporter { ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.referenceImporter"); boolean autoImportReferenceAtCursor(@NotNull Editor editor, @NotNull PsiFile file); + boolean autoImportReferenceAt(@NotNull Editor editor, @NotNull PsiFile file, int offset); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CodeFoldingPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CodeFoldingPass.java index 444f8828fb4b..ae9bcb6a03fa 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CodeFoldingPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/CodeFoldingPass.java @@ -25,7 +25,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.util.Key; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; class CodeFoldingPass extends TextEditorHighlightingPass implements DumbAware { @@ -72,7 +72,7 @@ class CodeFoldingPass extends TextEditorHighlightingPass implements DumbAware { } } - if (InjectedLanguageUtil.getTopLevelFile(myFile) == myFile) { + if (InjectedLanguageFacadeImpl.getTopLevelFile(myFile) == myFile) { clearFirstTimeFlag(myFile, myEditor, THE_FIRST_TIME); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java index c46689ceb342..9df986ee40cf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/GeneralHighlightingPass.java @@ -24,7 +24,7 @@ import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder; import com.intellij.codeInsight.daemon.impl.analysis.HighlightLevelUtil; import com.intellij.codeInsight.problems.ProblemImpl; import com.intellij.codeInsight.problems.WolfTheProblemSolverImpl; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.injected.editor.DocumentWindow; import com.intellij.lang.Language; import com.intellij.lang.annotation.HighlightSeverity; @@ -59,9 +59,9 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.problems.Problem; import com.intellij.problems.WolfTheProblemSolver; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.impl.source.tree.injected.Place; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.psi.tree.IElementType; import com.intellij.util.Processor; @@ -291,7 +291,7 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP @NotNull final List elements2, @NotNull final ProgressIndicator progress, @NotNull final Set outInjected) { - List injected = InjectedLanguageUtil.getCachedInjectedDocuments(myFile); + List injected = InjectedLanguageFacadeImpl.getCachedInjectedDocuments(myFile); Collection hosts = new THashSet(elements1.size() + elements2.size() + injected.size()); //rehighlight all injected PSI regardless the range, @@ -320,14 +320,15 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP } } }; - if (!JobUtil.invokeConcurrentlyUnderProgress(new ArrayList(hosts), progress, false, new Processor() { - @Override - public boolean process(PsiElement element) { - progress.checkCanceled(); - InjectedLanguageUtil.enumerate(element, myFile, false, visitor); - return true; - } - })) throw new ProcessCanceledException(); + if (!JobLauncher.getInstance().invokeConcurrentlyUnderProgress(new ArrayList(hosts), progress, false, + new Processor() { + @Override + public boolean process(PsiElement element) { + progress.checkCanceled(); + InjectedLanguageFacadeImpl.enumerate(element, myFile, false, visitor); + return true; + } + })) throw new ProcessCanceledException(); } // returns false if canceled @@ -338,59 +339,86 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(myProject); final TextAttributes injectedAttributes = myGlobalScheme.getAttributes(EditorColors.INJECTED_LANGUAGE_FRAGMENT); - return JobUtil.invokeConcurrentlyUnderProgress(new ArrayList(injectedFiles), progress, myFailFastOnAcquireReadAction, new Processor() { - @Override - public boolean process(final PsiFile injectedPsi) { - DocumentWindow documentWindow = (DocumentWindow)PsiDocumentManager.getInstance(myProject).getCachedDocument(injectedPsi); - if (documentWindow == null) return true; - Place places = InjectedLanguageUtil.getShreds(injectedPsi); - for (PsiLanguageInjectionHost.Shred place : places) { - TextRange textRange = place.getRangeInsideHost().shiftRight(place.getHost().getTextRange().getStartOffset()); - if (textRange.isEmpty()) continue; - String desc = injectedPsi.getLanguage().getDisplayName() + ": " + injectedPsi.getText(); - HighlightInfo info = HighlightInfo.createHighlightInfo(HighlightInfoType.INJECTED_LANGUAGE_BACKGROUND, textRange, null, desc, injectedAttributes); - info.fromInjection = true; - outInfos.add(info); - } + return JobLauncher.getInstance().invokeConcurrentlyUnderProgress(new ArrayList(injectedFiles), progress, + myFailFastOnAcquireReadAction, + new Processor() { + @Override + public boolean process(final PsiFile injectedPsi) { + DocumentWindow documentWindow = + (DocumentWindow)PsiDocumentManager.getInstance(myProject) + .getCachedDocument(injectedPsi); + if (documentWindow == null) return true; + Place places = InjectedLanguageFacadeImpl.getShreds(injectedPsi); + for (PsiLanguageInjectionHost.Shred place : places) { + TextRange textRange = place.getRangeInsideHost() + .shiftRight(place.getHost().getTextRange().getStartOffset()); + if (textRange.isEmpty()) continue; + String desc = + injectedPsi.getLanguage().getDisplayName() + + ": " + + injectedPsi.getText(); + HighlightInfo info = HighlightInfo + .createHighlightInfo( + HighlightInfoType.INJECTED_LANGUAGE_BACKGROUND, + textRange, null, desc, injectedAttributes); + info.fromInjection = true; + outInfos.add(info); + } - HighlightInfoHolder holder = createInfoHolder(injectedPsi); - runHighlightVisitorsForInjected(injectedPsi, holder, progress); - for (int i = 0; i < holder.size(); i++) { - HighlightInfo info = holder.get(i); - final int startOffset = documentWindow.injectedToHost(info.startOffset); - final TextRange fixedTextRange = getFixedTextRange(documentWindow, startOffset); - addPatchedInfos(info, injectedPsi, documentWindow, injectedLanguageManager, fixedTextRange, outInfos); - } - holder.clear(); - highlightInjectedSyntax(injectedPsi, holder); - for (int i = 0; i < holder.size(); i++) { - HighlightInfo info = holder.get(i); - final int startOffset = info.startOffset; - final TextRange fixedTextRange = getFixedTextRange(documentWindow, startOffset); - if (fixedTextRange == null) { - info.fromInjection = true; - outInfos.add(info); - } - else { - HighlightInfo patched = - new HighlightInfo(info.forcedTextAttributes, info.forcedTextAttributesKey, info.type, - fixedTextRange.getStartOffset(), fixedTextRange.getEndOffset(), - info.description, info.toolTip, info.type.getSeverity(null), info.isAfterEndOfLine, null, false); - patched.fromInjection = true; - outInfos.add(patched); - } - } + HighlightInfoHolder holder = createInfoHolder(injectedPsi); + runHighlightVisitorsForInjected(injectedPsi, holder, progress); + for (int i = 0; i < holder.size(); i++) { + HighlightInfo info = holder.get(i); + final int startOffset = + documentWindow.injectedToHost(info.startOffset); + final TextRange fixedTextRange = + getFixedTextRange(documentWindow, startOffset); + addPatchedInfos(info, injectedPsi, documentWindow, + injectedLanguageManager, + fixedTextRange, outInfos); + } + holder.clear(); + highlightInjectedSyntax(injectedPsi, holder); + for (int i = 0; i < holder.size(); i++) { + HighlightInfo info = holder.get(i); + final int startOffset = info.startOffset; + final TextRange fixedTextRange = + getFixedTextRange(documentWindow, startOffset); + if (fixedTextRange == null) { + info.fromInjection = true; + outInfos.add(info); + } + else { + HighlightInfo patched = + new HighlightInfo(info.forcedTextAttributes, + info.forcedTextAttributesKey, + info.type, + fixedTextRange.getStartOffset(), + fixedTextRange.getEndOffset(), + info.description, info.toolTip, + info.type.getSeverity(null), + info.isAfterEndOfLine, null, + false); + patched.fromInjection = true; + outInfos.add(patched); + } + } - if (!isDumbMode()) { - List todos = new ArrayList(); - highlightTodos(injectedPsi, injectedPsi.getText(), 0, injectedPsi.getTextLength(), progress, myPriorityRange, todos, todos); - for (HighlightInfo info : todos) { - addPatchedInfos(info, injectedPsi, documentWindow, injectedLanguageManager, null, outInfos); - } - } - return true; - } - }); + if (!isDumbMode()) { + List todos = new ArrayList(); + highlightTodos(injectedPsi, injectedPsi.getText(), 0, + injectedPsi.getTextLength(), progress, + myPriorityRange, todos, + todos); + for (HighlightInfo info : todos) { + addPatchedInfos(info, injectedPsi, documentWindow, + injectedLanguageManager, + null, outInfos); + } + } + return true; + } + }); } private static TextRange getFixedTextRange(@NotNull DocumentWindow documentWindow, int startOffset) { @@ -494,7 +522,8 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP } private void highlightInjectedSyntax(final PsiFile injectedPsi, HighlightInfoHolder holder) { - List, TextRange>> tokens = InjectedLanguageUtil.getHighlightTokens(injectedPsi); + List, TextRange>> tokens = InjectedLanguageFacadeImpl + .getHighlightTokens(injectedPsi); if (tokens == null) return; final Language injectedLanguage = injectedPsi.getLanguage(); @@ -802,7 +831,7 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP @NotNull ProperTextRange priorityRange, @NotNull Collection result, @NotNull Collection outsideResult) { - PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(file.getProject()); + PsiTodoSearchHelper helper = PsiTodoSearchHelper.SERVICE.getInstance(file.getProject()); TodoItem[] todoItems = helper.findTodoItems(file, startOffset, endOffset); if (todoItems.length == 0) return; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/IdentifierHighlighterPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/IdentifierHighlighterPass.java index 2012c5c95773..b52c21cf28a6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/IdentifierHighlighterPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/IdentifierHighlighterPass.java @@ -37,7 +37,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.util.Processor; @@ -100,7 +100,7 @@ public class IdentifierHighlighterPass extends TextEditorHighlightingPass { if (myTarget == null) { if (!PsiDocumentManager.getInstance(myProject).isUncommited(myEditor.getDocument())) { // when document is committed, try to check injected stuff - it's fast - Editor injectedEditor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, myFile, myCaretOffset); + Editor injectedEditor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(myEditor, myFile, myCaretOffset); if (injectedEditor != null) { myTarget = TargetElementUtilBase.getInstance().findTargetElement(injectedEditor, flags, injectedEditor.getCaretModel().getOffset()); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java index 07d4c0672e26..e961ecd989ff 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LineMarkersPass.java @@ -47,7 +47,7 @@ import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.Function; import com.intellij.util.FunctionUtil; import gnu.trove.THashSet; @@ -211,7 +211,7 @@ public class LineMarkersPass extends ProgressableTextEditorHighlightingPass impl } }; for (int i = 0, size = elements.size(); i < size; ++i) { - InjectedLanguageUtil.enumerate(elements.get(i), file, false, collectingVisitor); + InjectedLanguageFacadeImpl.enumerate(elements.get(i), file, false, collectingVisitor); } for (PsiFile injectedPsi : injectedFiles) { final Project project = injectedPsi.getProject(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java index 52fb9139dc94..b3f706976e75 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java @@ -25,7 +25,7 @@ import com.intellij.codeInsight.intention.EmptyIntentionAction; import com.intellij.codeInspection.*; import com.intellij.codeInspection.ex.*; import com.intellij.codeInspection.ui.ProblemDescriptionNode; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.injected.editor.DocumentWindow; import com.intellij.lang.Language; import com.intellij.lang.annotation.HighlightSeverity; @@ -53,7 +53,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.profile.codeInspection.SeverityProvider; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.Function; import com.intellij.util.Processor; @@ -300,39 +300,50 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass final ArrayList init = new ArrayList(); List>> entries = new ArrayList>>(tools.entrySet()); - boolean result = JobUtil.invokeConcurrentlyUnderProgress(entries, indicator, myFailFastOnAcquireReadAction, new Processor>>() { - @Override - public boolean process(final Map.Entry> pair) { - indicator.checkCanceled(); + boolean result = JobLauncher.getInstance().invokeConcurrentlyUnderProgress(entries, indicator, myFailFastOnAcquireReadAction, + new Processor>>() { + @Override + public boolean process(final Map.Entry> pair) { + indicator.checkCanceled(); - ApplicationManager.getApplication().assertReadAccessAllowed(); - final LocalInspectionToolWrapper wrapper = pair.getKey(); - LocalInspectionTool tool = wrapper.getTool(); - final boolean[] applyIncrementally = {isOnTheFly}; - ProblemsHolder holder = new ProblemsHolder(iManager, myFile, isOnTheFly) { - @Override - public void registerProblem(@NotNull ProblemDescriptor descriptor) { - super.registerProblem(descriptor); - if (applyIncrementally[0]) { - addDescriptorIncrementally(descriptor, wrapper, indicator); - } - } - }; - Set languages = (Set)pair.getValue(); - PsiElementVisitor visitor = createVisitorAndAcceptElements(tool, holder, isOnTheFly, session, elements, languages); + ApplicationManager.getApplication() + .assertReadAccessAllowed(); + final LocalInspectionToolWrapper wrapper = pair.getKey(); + LocalInspectionTool tool = wrapper.getTool(); + final boolean[] applyIncrementally = {isOnTheFly}; + ProblemsHolder holder = + new ProblemsHolder(iManager, myFile, isOnTheFly) { + @Override + public void registerProblem(@NotNull ProblemDescriptor descriptor) { + super.registerProblem(descriptor); + if (applyIncrementally[0]) { + addDescriptorIncrementally(descriptor, wrapper, + indicator); + } + } + }; + Set languages = (Set)pair.getValue(); + PsiElementVisitor visitor = + createVisitorAndAcceptElements(tool, holder, + isOnTheFly, session, + elements, languages); - synchronized (init) { - init.add(new InspectionContext(wrapper, holder, visitor, languages)); - } - advanceProgress(1); + synchronized (init) { + init.add( + new InspectionContext(wrapper, holder, visitor, + languages)); + } + advanceProgress(1); - if (holder.hasResults()) { - appendDescriptors(myFile, holder.getResults(), wrapper); - } - applyIncrementally[0] = false; // do not apply incrementally outside visible range - return true; - } - }); + if (holder.hasResults()) { + appendDescriptors(myFile, holder.getResults(), + wrapper); + } + applyIncrementally[0] = + false; // do not apply incrementally outside visible range + return true; + } + }); if (!result) throw new ProcessCanceledException(); inspectInjectedPsi(elements, isOnTheFly, indicator, iManager, true, checkDumbAwareness, wrappers); return init; @@ -381,7 +392,7 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass return true; } }; - boolean result = JobUtil.invokeConcurrentlyUnderProgress(init, indicator, myFailFastOnAcquireReadAction, processor); + boolean result = JobLauncher.getInstance().invokeConcurrentlyUnderProgress(init, indicator, myFailFastOnAcquireReadAction, processor); if (!result) { throw new ProcessCanceledException(); } @@ -408,7 +419,7 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass final boolean inVisibleRange, final boolean checkDumbAwareness, final List wrappers) { final Set injected = new THashSet(); for (PsiElement element : elements) { - InjectedLanguageUtil.enumerate(element, myFile, false, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(element, myFile, false, new PsiLanguageInjectionHost.InjectedPsiVisitor() { @Override public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { injected.add(injectedPsi); @@ -416,13 +427,17 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass }); } if (injected.isEmpty()) return; - if (!JobUtil.invokeConcurrentlyUnderProgress(new ArrayList(injected), indicator, myFailFastOnAcquireReadAction, new Processor() { - @Override - public boolean process(final PsiFile injectedPsi) { - doInspectInjectedPsi(injectedPsi, onTheFly, indicator, iManager, inVisibleRange, wrappers, checkDumbAwareness); - return true; - } - })) throw new ProcessCanceledException(); + if (!JobLauncher.getInstance().invokeConcurrentlyUnderProgress(new ArrayList(injected), indicator, + myFailFastOnAcquireReadAction, + new Processor() { + @Override + public boolean process(final PsiFile injectedPsi) { + doInspectInjectedPsi(injectedPsi, onTheFly, indicator, iManager, + inVisibleRange, + wrappers, checkDumbAwareness); + return true; + } + })) throw new ProcessCanceledException(); } @Nullable diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java index 8a27bba247ab..eae3cd4269a0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java @@ -20,7 +20,7 @@ import com.intellij.codeHighlighting.HighlightingPass; import com.intellij.codeHighlighting.TextEditorHighlightingPass; import com.intellij.concurrency.Job; import com.intellij.concurrency.JobImpl; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.injected.editor.EditorWindow; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; @@ -271,7 +271,7 @@ public abstract class PassExecutorService implements Disposable { private void submit(final ScheduledPass pass) { if (!pass.myUpdateProgress.isCanceled()) { - Job job = JobUtil.submitToJobThread(pass.myJobPriority, pass, new Consumer() { + Job job = JobLauncher.getInstance().submitToJobThread(pass.myJobPriority, pass, new Consumer() { @Override public void consume(Future future) { try { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PerThreadMap.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PerThreadMap.java index 74c6e3234e53..edf3a8a0225b 100755 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PerThreadMap.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PerThreadMap.java @@ -44,7 +44,9 @@ public abstract class PerThreadMap { } }; - private List cloneTemplates(Collection templates) { + @SuppressWarnings("unchecked") + @NotNull + private List cloneTemplates(@NotNull Collection templates) { List result = new ArrayList(templates.size()); PicoContainer container = ApplicationManager.getApplication().getPicoContainer(); for (T template : templates) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowAutoImportPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowAutoImportPass.java index 7b1b03ed7228..f01f7dcac22c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowAutoImportPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowAutoImportPass.java @@ -17,16 +17,21 @@ package com.intellij.codeInsight.daemon.impl; import com.intellij.codeHighlighting.TextEditorHighlightingPass; +import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.daemon.DaemonBundle; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings; +import com.intellij.codeInsight.daemon.ReferenceImporter; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.HintAction; +import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -70,9 +75,10 @@ public class ShowAutoImportPass extends TextEditorHighlightingPass { Application application = ApplicationManager.getApplication(); application.assertIsDispatchThread(); if (!application.isUnitTestMode() && !myEditor.getContentComponent().hasFocus()) return; + int caretOffset = myEditor.getCaretModel().getOffset(); + importUnambiguousImports(caretOffset); List visibleHighlights = getVisibleHighlights(myStartOffset, myEndOffset, myProject, myEditor); - int caretOffset = myEditor.getCaretModel().getOffset(); for (int i = visibleHighlights.size() - 1; i >= 0; i--) { HighlightInfo info = visibleHighlights.get(i); if (info.startOffset <= caretOffset && showAddImportHint(info)) return; @@ -83,6 +89,33 @@ public class ShowAutoImportPass extends TextEditorHighlightingPass { } } + private void importUnambiguousImports(final int caretOffset) { + if (!DaemonCodeAnalyzerSettings.getInstance().isImportHintEnabled()) return; + if (!DaemonCodeAnalyzer.getInstance(myProject).isImportHintsEnabled(myFile)) return; + if (!CodeInsightSettings.getInstance().ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY) return; + + Document document = getDocument(); + final List infos = new ArrayList(); + DaemonCodeAnalyzerImpl.processHighlights(document, myProject, null, 0, document.getTextLength(), new Processor() { + @Override + public boolean process(HighlightInfo info) { + if (!info.hasHint() || info.getSeverity() != HighlightSeverity.ERROR) { + return true; + } + if (TextRange.create(info.getActualStartOffset(), info.getActualEndOffset()).containsOffset(caretOffset)) return true; + infos.add(info); + return true; + } + }); + + ReferenceImporter[] importers = Extensions.getExtensions(ReferenceImporter.EP_NAME); + for (HighlightInfo info : infos) { + for(ReferenceImporter importer: importers) { + if (importer.autoImportReferenceAt(myEditor, myFile, info.getActualStartOffset())) break; + } + } + } + @NotNull private static List getVisibleHighlights(final int startOffset, final int endOffset, Project project, final Editor editor) { final List highlights = new ArrayList(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QuickFixAction.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QuickFixAction.java index 70d351d6092e..bad2d1853659 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QuickFixAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/QuickFixAction.java @@ -29,7 +29,7 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -145,8 +145,8 @@ public final class QuickFixAction { PsiFile fileToUse; if (info.fromInjection) { if (injectedEditor == null) { - injectedFile = InjectedLanguageUtil.findInjectedPsiNoCommit(file, offset); - injectedEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, injectedFile); + injectedFile = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(file, offset); + injectedEditor = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(editor, injectedFile); } editorToUse = injectedEditor; fileToUse = injectedFile; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java index fbe3f1ab5c55..d1ae61a6bcdd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java @@ -32,7 +32,7 @@ import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilBase; import com.intellij.ui.content.*; import com.intellij.util.ui.update.Activatable; @@ -174,7 +174,7 @@ public abstract class DockablePopupManager { final PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, myProject); - final Editor injectedEditor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, file); + final Editor injectedEditor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(editor, file); if (injectedEditor != null) { final PsiFile psiFile = PsiUtilBase.getPsiFileInEditor(injectedEditor, myProject); if (psiFile != null) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java index d0a8ae4db1c3..282890eec51a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CompletionAutoPopupHandler.java @@ -31,7 +31,7 @@ import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; /** @@ -83,16 +83,16 @@ public class CompletionAutoPopupHandler extends TypedHandlerDelegate { if (editor.isDisposed()) return; // retrieve the injected file from scratch since our typing might have destroyed the old one completely - Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(editor); + Editor topLevelEditor = InjectedLanguageFacadeImpl.getTopLevelEditor(editor); PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(topLevelEditor.getDocument()); if (file == null) return; - PsiFile topLevelFile = InjectedLanguageUtil.getTopLevelFile(file); + PsiFile topLevelFile = InjectedLanguageFacadeImpl.getTopLevelFile(file); if (!PsiDocumentManager.getInstance(project).isCommitted(editor.getDocument())) { LOG.error("Non-committed document"); PsiDocumentManager.getInstance(project).commitAllDocuments(); } - Editor newEditor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(topLevelEditor, topLevelFile); + Editor newEditor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(topLevelEditor, topLevelFile); try { new CodeCompletionHandlerBase(completionType, false, autopopup, false).invokeCompletion(project, newEditor, time, false); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordHandler.java index 7bc43282dcdc..04b49b51046c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SelectWordHandler.java @@ -32,7 +32,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.templateLanguages.OuterLanguageElement; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; @@ -52,7 +52,7 @@ public class SelectWordHandler extends EditorActionHandler { LOG.debug("enter: execute(editor='" + editor + "')"); } if (editor instanceof EditorWindow && editor.getSelectionModel().hasSelection() - && InjectedLanguageUtil.isSelectionIsAboutToOverflowInjectedFragment((EditorWindow)editor)) { + && InjectedLanguageFacadeImpl.isSelectionIsAboutToOverflowInjectedFragment((EditorWindow)editor)) { // selection about to spread beyond injected fragment editor = ((EditorWindow)editor).getDelegate(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java index a9261cc8d532..a9f107fd2935 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/TypedHandler.java @@ -50,7 +50,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.PsiUtilBase; @@ -270,10 +270,10 @@ public class TypedHandler extends TypedActionHandlerBase { // even for uncommitted document try to retrieve injected fragment that has been there recently // we are assuming here that when user is (even furiously) typing, injected language would not change // and thus we can use its lexer to insert closing braces etc - for (DocumentWindow documentWindow : InjectedLanguageUtil.getCachedInjectedDocuments(oldFile)) { + for (DocumentWindow documentWindow : InjectedLanguageFacadeImpl.getCachedInjectedDocuments(oldFile)) { if (documentWindow.isValid() && documentWindow.containsRange(offset, offset)) { PsiFile injectedFile = PsiDocumentManager.getInstance(oldFile.getProject()).getPsiFile(documentWindow); - final Editor injectedEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, injectedFile); + final Editor injectedEditor = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(editor, injectedFile); // IDEA-52375 fix: last quote sign should be handled by outer language quote handler final CharSequence charsSequence = editor.getDocument().getCharsSequence(); if (injectedEditor.getCaretModel().getOffset() == injectedEditor.getDocument().getTextLength() && diff --git a/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingUpdate.java b/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingUpdate.java index 51cf80b83161..e233872ba2d4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingUpdate.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/FoldingUpdate.java @@ -34,7 +34,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.ParameterizedCachedValue; @@ -151,7 +151,7 @@ public class FoldingUpdate { Object lastTimeStamp = editor.getUserData(LAST_UPDATE_INJECTED_STAMP_KEY); if (lastTimeStamp instanceof Long && ((Long)lastTimeStamp).longValue() == timeStamp) return null; - List injectedDocuments = InjectedLanguageUtil.getCachedInjectedDocuments(file); + List injectedDocuments = InjectedLanguageFacadeImpl.getCachedInjectedDocuments(file); if (injectedDocuments.isEmpty()) return null; final List injectedEditors = new ArrayList(); final List injectedFiles = new ArrayList(); @@ -159,7 +159,7 @@ public class FoldingUpdate { for (DocumentWindow injectedDocument : injectedDocuments) { PsiFile injectedFile = PsiDocumentManager.getInstance(project).getPsiFile(injectedDocument); if (injectedFile == null || !injectedFile.isValid() || !injectedDocument.isValid()) continue; - Editor injectedEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, injectedFile); + Editor injectedEditor = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(editor, injectedFile); if (!(injectedEditor instanceof EditorWindow)) continue; injectedEditors.add((EditorWindow)injectedEditor); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/OffsetsElementSignatureProvider.java b/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/OffsetsElementSignatureProvider.java index f1e78494c8a7..35a75cf476b0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/OffsetsElementSignatureProvider.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/folding/impl/OffsetsElementSignatureProvider.java @@ -18,7 +18,7 @@ package com.intellij.codeInsight.folding.impl; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -87,7 +87,7 @@ public class OffsetsElementSignatureProvider extends AbstractElementSignaturePro } if (result == null) { - final PsiElement injectedStartElement = InjectedLanguageUtil.findElementAtNoCommit(file, start); + final PsiElement injectedStartElement = InjectedLanguageFacadeImpl.findElementAtNoCommit(file, start); if (processingInfoStorage != null) { processingInfoStorage.append(String.format( "Trying to find injected element starting from the '%s'%s%n", diff --git a/platform/lang-impl/src/com/intellij/codeInsight/generation/actions/CommentByLineCommentAction.java b/platform/lang-impl/src/com/intellij/codeInsight/generation/actions/CommentByLineCommentAction.java index 4a7421675b9f..ec447bcdf6a7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/generation/actions/CommentByLineCommentAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/generation/actions/CommentByLineCommentAction.java @@ -23,8 +23,6 @@ import com.intellij.openapi.fileTypes.impl.AbstractFileType; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.DumbAware; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.lang.LanguageCommenters; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java index 88e8ce92db32..d58ad07377c2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/BraceHighlightingHandler.java @@ -27,7 +27,7 @@ package com.intellij.codeInsight.highlighting; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.hint.EditorFragmentComponent; import com.intellij.concurrency.Job; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.injected.editor.EditorWindow; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -52,7 +52,7 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiUtilBase; import com.intellij.util.Alarm; @@ -109,7 +109,7 @@ public class BraceHighlightingHandler { final Project project = editor.getProject(); if (project == null) return; final int offset = editor.getCaretModel().getOffset(); - JobUtil.submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() { + JobLauncher.getInstance().submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() { public void run() { final PsiFile injected; try { @@ -132,11 +132,11 @@ public class BraceHighlightingHandler { }); throw e; } - ApplicationManager.getApplication().invokeLater(new DumbAwareRunnable(){ + ApplicationManager.getApplication().invokeLater(new DumbAwareRunnable() { public void run() { try { if (!isReallyDisposed(editor, project)) { - Editor newEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, injected); + Editor newEditor = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(editor, injected); BraceHighlightingHandler handler = new BraceHighlightingHandler(project, newEditor, alarm, injected); processor.process(handler); } @@ -161,7 +161,7 @@ public class BraceHighlightingHandler { Document document = editor.getDocument(); // when document is committed, try to highlight braces in injected lang - it's fast if (!PsiDocumentManager.getInstance(project).isUncommited(document)) { - final PsiElement injectedElement = InjectedLanguageUtil.findInjectedElementNoCommit(psiFile, offset); + final PsiElement injectedElement = InjectedLanguageFacadeImpl.findInjectedElementNoCommit(psiFile, offset); if (injectedElement != null /*&& !(injectedElement instanceof PsiWhiteSpace)*/) { final PsiFile injected = injectedElement.getContainingFile(); if (injected != null) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightManagerImpl.java index 255f2353d97e..c0d1376c94cb 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HighlightManagerImpl.java @@ -41,7 +41,7 @@ import com.intellij.openapi.util.UserDataHolderEx; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -167,7 +167,7 @@ public class HighlightManagerImpl extends HighlightManager implements ProjectCom PsiFile containingFile = element.getContainingFile(); Project project = element.getProject(); // each reference can reside in its own injected editor - Editor textEditor = InjectedLanguageUtil.openEditorFor(containingFile, project); + Editor textEditor = InjectedLanguageFacadeImpl.openEditorFor(containingFile, project); if (textEditor != null) { addOccurrenceHighlight(textEditor, start, end, attributes, flags, outHighlighters, scrollmarkColor); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/IntentionListStep.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/IntentionListStep.java index b5759a2d63a9..d690edf18225 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/IntentionListStep.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/IntentionListStep.java @@ -36,7 +36,7 @@ import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Iconable; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilBase; import gnu.trove.THashSet; import gnu.trove.TObjectHashingStrategy; @@ -112,7 +112,7 @@ class IntentionListStep implements ListPopupStep } else { hostElement = myFile.getViewProvider().findElementAt(fileOffset, myFile.getLanguage()); - element = InjectedLanguageUtil.findElementAtNoCommit(myFile, fileOffset); + element = InjectedLanguageFacadeImpl.findElementAtNoCommit(myFile, fileOffset); } PsiFile injectedFile; Editor injectedEditor; @@ -122,7 +122,7 @@ class IntentionListStep implements ListPopupStep } else { injectedFile = element.getContainingFile(); - injectedEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(myEditor, injectedFile); + injectedEditor = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(myEditor, injectedFile); } boolean result = true; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java index df76329d288b..a109226d8b82 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditAction.java @@ -24,7 +24,7 @@ import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; @@ -58,7 +58,7 @@ public class QuickEditAction implements IntentionAction, LowPriorityAction { final PsiLanguageInjectionHost host = PsiTreeUtil.getParentOfType(file.findElementAt(offset), PsiLanguageInjectionHost.class, false); if (host == null) return null; - final List> injections = InjectedLanguageUtil.getInjectedPsiFiles(host); + final List> injections = InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(host); if (injections == null || injections.isEmpty()) return null; final int offsetInElement = offset - host.getTextRange().getStartOffset(); final Pair rangePair = ContainerUtil.find(injections, new Condition>() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java index 1a8b9ba856d2..814bad1e40dd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/QuickEditHandler.java @@ -48,7 +48,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.resolve.FileContextUtil; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.impl.source.tree.injected.Place; import com.intellij.testFramework.LightVirtualFile; import com.intellij.ui.awt.RelativePoint; @@ -86,7 +86,7 @@ public class QuickEditHandler extends DocumentAdapter implements Disposable { myEditor = editor; myAction = action; myOrigDocument = editor.getDocument(); - final Place shreds = InjectedLanguageUtil.getShreds(myInjectedFile); + final Place shreds = InjectedLanguageFacadeImpl.getShreds(myInjectedFile); final FileType fileType = injectedFile.getFileType(); final Language language = injectedFile.getLanguage(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java index b93aeb096594..4421b4d39641 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java @@ -40,7 +40,7 @@ import com.intellij.psi.PsiCodeFragment; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.IncorrectOperationException; import com.intellij.util.PairProcessor; import org.jetbrains.annotations.NotNull; @@ -56,7 +56,7 @@ public class ShowIntentionActionsHandler implements CodeInsightActionHandler { PsiDocumentManager.getInstance(project).commitAllDocuments(); if (editor instanceof EditorWindow) { editor = ((EditorWindow)editor).getDelegate(); - file = InjectedLanguageUtil.getTopLevelFile(file); + file = InjectedLanguageFacadeImpl.getTopLevelFile(file); } final LookupEx lookup = LookupManager.getActiveLookup(editor); @@ -122,9 +122,9 @@ public class ShowIntentionActionsHandler implements CodeInsightActionHandler { PsiFile fileToApply = null; int offset = hostEditor.getCaretModel().getOffset(); - PsiFile injectedFile = InjectedLanguageUtil.findInjectedPsiNoCommit(hostFile, offset); + PsiFile injectedFile = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(hostFile, offset); if (injectedFile != null) { - Editor injectedEditor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(hostEditor, injectedFile); + Editor injectedEditor = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(hostEditor, injectedFile); if (predicate.process(injectedFile, injectedEditor)) { editorToApply = injectedEditor; fileToApply = injectedFile; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java index a1a95fd65e09..cde7df077e25 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/LookupManager.java @@ -19,7 +19,7 @@ package com.intellij.codeInsight.lookup; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,7 +41,7 @@ public abstract class LookupManager { final LookupEx lookup = getInstance(project).getActiveLookup(); if (lookup == null) return null; - return InjectedLanguageUtil.getTopLevelEditor(lookup.getEditor()) == InjectedLanguageUtil.getTopLevelEditor(editor) ? lookup : null; + return InjectedLanguageFacadeImpl.getTopLevelEditor(lookup.getEditor()) == InjectedLanguageFacadeImpl.getTopLevelEditor(editor) ? lookup : null; } @Nullable diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java index a9010dac1ca5..6ae8ea014d38 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java @@ -60,7 +60,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.searches.DefinitionsSearch; import com.intellij.psi.util.PsiUtilBase; import com.intellij.ui.LightweightHint; @@ -154,7 +154,7 @@ public class CtrlMouseHandler extends AbstractProjectComponent { Point point = new Point(mouseEvent.getPoint()); if (PsiDocumentManager.getInstance(myProject).isCommitted(editor.getDocument())) { // when document is committed, try to check injected stuff - it's fast - editor = InjectedLanguageUtil + editor = InjectedLanguageFacadeImpl .getEditorForInjectedLanguageNoCommit(editor, psiFile, editor.logicalPositionToOffset(editor.xyToLogicalPosition(point))); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java b/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java index 656946038734..925052258b1d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java @@ -25,7 +25,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,11 +55,11 @@ public class CustomTemplateCallback { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); int offset = getOffset(wrapping, editor); - PsiElement element = InjectedLanguageUtil.findInjectedElementNoCommit(file, offset); + PsiElement element = InjectedLanguageFacadeImpl.findInjectedElementNoCommit(file, offset); myFile = element != null ? element.getContainingFile() : file; myInInjectedFragment = InjectedLanguageManager.getInstance(myProject).isInjectedFragment(myFile); - myEditor = myInInjectedFragment ? InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, file, offset) : editor; + myEditor = myInInjectedFragment ? InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(editor, file, offset) : editor; fixInitialState(wrapping); } @@ -164,7 +164,7 @@ public class CustomTemplateCallback { public static PsiElement getContext(@NotNull PsiFile file, int offset) { PsiElement element = null; if (!InjectedLanguageManager.getInstance(file.getProject()).isInjectedFragment(file)) { - element = InjectedLanguageUtil.findInjectedElementNoCommit(file, offset); + element = InjectedLanguageFacadeImpl.findInjectedElementNoCommit(file, offset); } if (element == null) { element = file.findElementAt(offset); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java index 04f26ab11815..2f2bb9a22488 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java @@ -32,7 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; @@ -60,7 +60,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { private static final Logger LOG = Logger.getInstance("#" + TemplateBuilderImpl.class.getName()); public TemplateBuilderImpl(@NotNull PsiElement element) { - myFile = InjectedLanguageUtil.getTopLevelFile(element); + myFile = InjectedLanguageFacadeImpl.getTopLevelFile(element); myDocument = myFile.getViewProvider().getDocument(); myContainerElement = wrapElement(element); } @@ -268,10 +268,17 @@ public class TemplateBuilderImpl implements TemplateBuilder { public void run() { final Project project = myFile.getProject(); VirtualFile file = myFile.getVirtualFile(); + assert file != null; OpenFileDescriptor descriptor = new OpenFileDescriptor(project, file); final Editor editor = FileEditorManager.getInstance(project).openTextEditor(descriptor, true); - final Template template = buildTemplate(); + assert editor != null : "Editor is null"; + run(editor, false); + } + + @Override + public void run(@NotNull final Editor editor, final boolean inline) { + final Template template = inline ? buildInlineTemplate() : buildTemplate(); editor.getDocument().replaceString(myContainerElement.getStartOffset(), myContainerElement.getEndOffset(), ""); editor.getCaretModel().moveToOffset(myContainerElement.getStartOffset()); diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java index 87e76ffe3409..9bfe60f7b633 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java @@ -25,7 +25,7 @@ import com.intellij.codeInspection.lang.GlobalInspectionContextExtension; import com.intellij.codeInspection.lang.InspectionExtensionsFactory; import com.intellij.codeInspection.reference.*; import com.intellij.codeInspection.ui.InspectionResultsView; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.notification.NotificationGroup; import com.intellij.openapi.actionSystem.ToggleAction; @@ -601,19 +601,19 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G } pass.doInspectInBatch((InspectionManagerEx)manager, lTools); - JobUtil.invokeConcurrentlyUnderProgress(globalSimpleTools, myProgressIndicator, false, new Processor() { - @Override - public boolean process(Tools tools) { - GlobalInspectionToolWrapper toolWrapper = (GlobalInspectionToolWrapper)tools.getTool(); - GlobalSimpleInspectionTool tool = (GlobalSimpleInspectionTool)toolWrapper.getTool(); - ProblemsHolder problemsHolder = new ProblemsHolder(manager, file, false); - GlobalInspectionToolWrapper problemDescriptionProcessor = getProblemDescriptionProcessor(toolWrapper, map); - tool.checkFile(file, manager, problemsHolder, GlobalInspectionContextImpl.this, problemDescriptionProcessor); - LocalInspectionToolWrapper.addProblemDescriptors(problemsHolder.getResults(), false, GlobalInspectionContextImpl.this, null, - CONVERT, toolWrapper); - return true; - } - }); + JobLauncher.getInstance().invokeConcurrentlyUnderProgress(globalSimpleTools, myProgressIndicator, false, new Processor() { + @Override + public boolean process(Tools tools) { + GlobalInspectionToolWrapper toolWrapper = (GlobalInspectionToolWrapper)tools.getTool(); + GlobalSimpleInspectionTool tool = (GlobalSimpleInspectionTool)toolWrapper.getTool(); + ProblemsHolder problemsHolder = new ProblemsHolder(manager, file, false); + GlobalInspectionToolWrapper problemDescriptionProcessor = getProblemDescriptionProcessor(toolWrapper, map); + tool.checkFile(file, manager, problemsHolder, GlobalInspectionContextImpl.this, problemDescriptionProcessor); + LocalInspectionToolWrapper.addProblemDescriptors(problemsHolder.getResults(), false, GlobalInspectionContextImpl.this, null, + CONVERT, toolWrapper); + return true; + } + }); } catch (ProcessCanceledException e) { throw e; diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/ProblemDescriptorImpl.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/ProblemDescriptorImpl.java index 86798bb39e6e..85d9534bf46d 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/ProblemDescriptorImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/ProblemDescriptorImpl.java @@ -26,7 +26,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.pom.Navigatable; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -142,7 +142,7 @@ public class ProblemDescriptorImpl extends CommonProblemDescriptorImpl implement if (psiElement == null) return -1; if (!psiElement.isValid()) return -1; LOG.assertTrue(psiElement.isPhysical()); - PsiFile containingFile = InjectedLanguageUtil.getTopLevelFile(psiElement); + PsiFile containingFile = InjectedLanguageFacadeImpl.getTopLevelFile(psiElement); Document document = PsiDocumentManager.getInstance(psiElement.getProject()).getDocument(containingFile); if (document == null) return -1; TextRange textRange = getTextRange(); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index c61e184c4209..b8b9d35a008d 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -344,7 +344,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo @Override public void scrollTo(final int offset) { - if (myEditor == null) return; + if (myEditor == null || myFlushAlarm.isDisposed()) return; class ScrollRunnable extends MyFlushRunnable { private int myOffset = offset; public void doRun() { @@ -367,7 +367,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo } public void requestScrollingToEnd() { - if (myEditor == null) return; + if (myEditor == null || myFlushAlarm.isDisposed()) return; final MyFlushRunnable scrollRunnable = new MyFlushRunnable() { @Override public void doRun() { @@ -556,7 +556,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo } private void requestFlushImmediately() { - if (myEditor != null) { + if (myEditor != null && !myFlushAlarm.isDisposed()) { addFlushRequest(new MyFlushRunnable()); } } diff --git a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java index f522efea13fc..4257468f1d77 100644 --- a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java +++ b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java @@ -180,7 +180,7 @@ public class ShowUsagesAction extends AnAction implements PopupAction { private void startFindUsages(@NotNull PsiElement element, RelativePoint popupPosition, Editor editor, int maxUsages) { Project project = element.getProject(); FindUsagesManager findUsagesManager = ((FindManagerImpl)FindManager.getInstance(project)).getFindUsagesManager(); - FindUsagesHandler handler = findUsagesManager.getFindUsagesHandler(element, false); + FindUsagesHandler handler = findUsagesManager.getNewFindUsagesHandler(element, false); if (handler == null) return; if (showSettingsDialogBefore) { showDialogAndFindUsages(handler, popupPosition, editor, maxUsages); @@ -279,6 +279,7 @@ public class ShowUsagesAction extends AnAction implements PopupAction { @Override public void addNotify() { mySearchEverywhereRunnable = new Runnable() { + @Override public void run() { searchEverywhere(options, handler, editor, popupPosition, maxUsages); } diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java index 6c43f9915857..8d535cb4505a 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/FindUsagesManager.java @@ -46,8 +46,11 @@ import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.StatusBar; import com.intellij.psi.*; -import com.intellij.psi.search.*; -import com.intellij.psi.util.PsiUtilBase; +import com.intellij.psi.search.LocalSearchScope; +import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.SearchRequestCollector; +import com.intellij.psi.search.SearchSession; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.ui.LightweightHint; import com.intellij.ui.content.Content; import com.intellij.usageView.UsageInfo; @@ -62,6 +65,7 @@ import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.picocontainer.defaults.ConstructorInjectionComponentAdapter; import javax.swing.*; import java.util.ArrayList; @@ -195,7 +199,7 @@ public class FindUsagesManager implements JDOMExternalizable { return PsiElement.EMPTY_ARRAY; } - return PsiUtilBase.toPsiElementArray(elements); + return PsiUtilCore.toPsiElementArray(elements); } private void initLastSearchElement(final FindUsagesOptions findUsagesOptions, @@ -229,6 +233,22 @@ public class FindUsagesManager implements JDOMExternalizable { return null; } + @Nullable + public FindUsagesHandler getNewFindUsagesHandler(PsiElement element, final boolean forHighlightUsages) { + for (FindUsagesHandlerFactory factory : Extensions.getExtensions(FindUsagesHandlerFactory.EP_NAME, myProject)) { + if (factory.canFindUsages(element)) { + Class aClass = factory.getClass(); + FindUsagesHandlerFactory copy = (FindUsagesHandlerFactory)new ConstructorInjectionComponentAdapter(aClass.getName(), aClass).getComponentInstance(myProject.getPicoContainer()); + final FindUsagesHandler handler = copy.createFindUsagesHandler(element, forHighlightUsages); + if (handler == FindUsagesHandler.NULL_HANDLER) return null; + if (handler != null) { + return handler; + } + } + } + return null; + } + public void findUsages(@NotNull PsiElement psiElement, final PsiFile scopeFile, final FileEditor editor) { final FindUsagesHandler handler = getFindUsagesHandler(psiElement, false); if (handler == null) return; @@ -449,11 +469,11 @@ public class FindUsagesManager implements JDOMExternalizable { String usagesString = generateUsagesString(findUsagesOptions); presentation.setUsagesString(usagesString); String title; - if (scopeString != null) { - title = FindBundle.message("find.usages.of.element.in.scope.panel.title", usagesString, UsageViewUtil.getLongName(psiElement), scopeString); + if (scopeString == null) { + title = FindBundle.message("find.usages.of.element.panel.title", usagesString, UsageViewUtil.getLongName(psiElement)); } else { - title = FindBundle.message("find.usages.of.element.panel.title", usagesString, UsageViewUtil.getLongName(psiElement)); + title = FindBundle.message("find.usages.of.element.in.scope.panel.title", usagesString, UsageViewUtil.getLongName(psiElement), scopeString); } presentation.setTabText(title); presentation.setTabName(FindBundle.message("find.usages.of.element.tab.name", usagesString, UsageViewUtil.getShortName(psiElement))); @@ -477,7 +497,7 @@ public class FindUsagesManager implements JDOMExternalizable { final UsageSearcher usageSearcher = createUsageSearcher(descriptor, handler, findUsagesOptions, scopeFile); final boolean[] usagesWereFound = {false}; - Usage fUsage = findSiblingUsage(myProject, usageSearcher, direction, currentLocation, usagesWereFound, fileEditor); + Usage fUsage = findSiblingUsage(usageSearcher, direction, currentLocation, usagesWereFound, fileEditor); if (fUsage != null) { fUsage.navigate(true); @@ -508,21 +528,20 @@ public class FindUsagesManager implements JDOMExternalizable { if (direction == FileSearchScope.AFTER_CARET) { AnAction action = ActionManager.getInstance().getAction(IdeActions.ACTION_FIND_NEXT); String shortcutsText = KeymapUtil.getFirstKeyboardShortcutText(action); - if (shortcutsText.length() > 0) { - message = FindBundle.message("find.search.again.from.top.hotkey.message", message, shortcutsText); + if (shortcutsText.isEmpty()) { + message = FindBundle.message("find.search.again.from.top.action.message", message); } else { - message = FindBundle.message("find.search.again.from.top.action.message", message); + message = FindBundle.message("find.search.again.from.top.hotkey.message", message, shortcutsText); } } else { - String shortcutsText = - KeymapUtil.getFirstKeyboardShortcutText(ActionManager.getInstance().getAction(IdeActions.ACTION_FIND_PREVIOUS)); - if (shortcutsText.length() > 0) { - message = FindBundle.message("find.search.again.from.bottom.hotkey.message", message, shortcutsText); + String shortcutsText = KeymapUtil.getFirstKeyboardShortcutText(ActionManager.getInstance().getAction(IdeActions.ACTION_FIND_PREVIOUS)); + if (shortcutsText.isEmpty()) { + message = FindBundle.message("find.search.again.from.bottom.action.message", message); } else { - message = FindBundle.message("find.search.again.from.bottom.action.message", message); + message = FindBundle.message("find.search.again.from.bottom.hotkey.message", message, shortcutsText); } } return message; @@ -538,12 +557,11 @@ public class FindUsagesManager implements JDOMExternalizable { } } - private static Usage findSiblingUsage(@NotNull final Project project, - @NotNull final UsageSearcher usageSearcher, - FileSearchScope dir, - final FileEditorLocation currentLocation, - @NotNull final boolean[] usagesWereFound, - @NotNull FileEditor fileEditor) { + private static Usage findSiblingUsage(@NotNull final UsageSearcher usageSearcher, + FileSearchScope dir, + final FileEditorLocation currentLocation, + @NotNull final boolean[] usagesWereFound, + @NotNull FileEditor fileEditor) { if (fileEditor.getUserData(KEY_START_USAGE_AGAIN) != null) { dir = dir == FileSearchScope.AFTER_CARET ? FileSearchScope.FROM_START : FileSearchScope.FROM_END; } @@ -561,7 +579,7 @@ public class FindUsagesManager implements JDOMExternalizable { foundUsage[0] = usage; return false; } - else if (direction == FileSearchScope.FROM_END) { + if (direction == FileSearchScope.FROM_END) { foundUsage[0] = usage; } else if (direction == FileSearchScope.AFTER_CARET) { diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java b/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java index fae0f9ee875a..146d03a1a1d9 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java @@ -29,7 +29,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.meta.PsiMetaData; import com.intellij.psi.meta.PsiMetaOwner; import com.intellij.psi.meta.PsiPresentableMetaData; @@ -131,7 +131,7 @@ public class PsiElement2UsageTargetAdapter implements PsiElementUsageTarget, Typ Collection refs; // in case of injected file, use host file to highlight all occurrences of the target in each injected file - PsiFile context = InjectedLanguageUtil.getTopLevelFile(file); + PsiFile context = InjectedLanguageFacadeImpl.getTopLevelFile(file); SearchScope searchScope = new LocalSearchScope(context); if (handler != null) { refs = handler.findReferencesToHighlight(target, searchScope); diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java index 175b8c97bfca..a5445696ec3f 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -242,6 +242,7 @@ public class FindInProjectUtil { } if (progress != null) { + progress.checkCanceled(); progress.setFraction((double)index / psiFiles.size()); String text = FindBundle.message("find.searching.for.string.in.file.progress", findModel.getStringToFind(), virtualFile.getPresentableUrl()); @@ -298,7 +299,7 @@ public class FindInProjectUtil { // fine } - if (progress != null) { + if (progress != null && !progress.isCanceled()) { progress.setText(FindBundle.message("find.progress.search.completed")); } } @@ -366,7 +367,9 @@ public class FindInProjectUtil { } @NotNull - private static Collection getFilesToSearchIn(@NotNull final FindModel findModel, @NotNull final Project project, final PsiDirectory psiDirectory) { + private static Collection getFilesToSearchIn(@NotNull final FindModel findModel, + @NotNull final Project project, + final PsiDirectory psiDirectory) { return ApplicationManager.getApplication().runReadAction(new Computable>() { @Override public Collection compute() { @@ -376,7 +379,9 @@ public class FindInProjectUtil { } @NotNull - private static Collection getFilesToSearchInReadAction(@NotNull final FindModel findModel, @NotNull final Project project, @Nullable final PsiDirectory psiDirectory) { + private static Collection getFilesToSearchInReadAction(@NotNull final FindModel findModel, + @NotNull final Project project, + @Nullable final PsiDirectory psiDirectory) { String moduleName = findModel.getModuleName(); Module module = moduleName == null ? null : ModuleManager.getInstance(project).findModuleByName(moduleName); final FileIndex fileIndex = module == null ? @@ -399,6 +404,7 @@ public class FindInProjectUtil { @Override public boolean processFile(@NotNull VirtualFile virtualFile) { + ProgressManager.checkCanceled(); if (!virtualFile.isDirectory() && (fileMaskRegExp == null || fileMaskRegExp.matcher(virtualFile.getName()).matches()) && (customScope == null || customScope.contains(virtualFile))) { @@ -415,7 +421,7 @@ public class FindInProjectUtil { return myFiles; } } - final EnumContentIterator iterator = new EnumContentIterator(); + EnumContentIterator iterator = new EnumContentIterator(); if (psiDirectory == null) { boolean success = fileIndex.iterateContent(iterator); @@ -430,18 +436,12 @@ public class FindInProjectUtil { } return iterator.getFiles(); } - else if (psiDirectory.isValid()) { + if (psiDirectory.isValid()) { Collection fileList = new THashSet(); - - addFilesUnderDirectory(psiDirectory, - fileList, - findModel.isWithSubdirectories(), - createFileMaskRegExp(findModel)); + addFilesUnderDirectory(psiDirectory, fileList, findModel.isWithSubdirectories(), createFileMaskRegExp(findModel)); return fileList; } - else { - return Collections.emptyList(); - } + return Collections.emptyList(); } private static boolean iterateAll(@NotNull VirtualFile[] files, @NotNull final GlobalSearchScope searchScope, @NotNull final ContentIterator iterator) { diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java index b8e596004f23..e34acf5b0d8a 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoFilter.java @@ -18,7 +18,7 @@ package com.intellij.ide.todo; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoPattern; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -52,7 +52,7 @@ public class TodoFilter implements Cloneable{ * @return true if and only if specified psiFile has * TodoItems accepted by the filter. */ - public boolean accept(PsiSearchHelper searchHelper,PsiFile psiFile){ + public boolean accept(PsiTodoSearchHelper searchHelper,PsiFile psiFile){ for(Iterator i=iterator();i.hasNext();){ TodoPattern todoPattern= i.next(); if(searchHelper.getTodoItemsCount(psiFile,todoPattern)>0){ diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java index fa524d04a5bc..893d69a8d795 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeBuilder.java @@ -42,7 +42,7 @@ import com.intellij.openapi.vcs.FileStatusListener; import com.intellij.openapi.vcs.FileStatusManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.usageView.UsageTreeColorsScheme; import com.intellij.util.containers.HashMap; @@ -77,7 +77,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder { protected final HashMap myFile2Highlighter; - protected final PsiSearchHelper mySearchHelper; + protected final PsiTodoSearchHelper mySearchHelper; /** * If this flag is false then the updateTree() method does nothing. But when * the flag becomes true and myDirtyFileSet isn't empty the update is invoked. @@ -99,7 +99,7 @@ public abstract class TodoTreeBuilder extends AbstractTreeBuilder { myFile2Highlighter = new HashMap(); PsiManager psiManager = PsiManager.getInstance(myProject); - mySearchHelper = PsiSearchHelper.SERVICE.getInstance(myProject); + mySearchHelper = PsiTodoSearchHelper.SERVICE.getInstance(myProject); psiManager.addPsiTreeChangeListener(new MyPsiTreeChangeListener()); myFileStatusListener = new MyFileStatusListener(); diff --git a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java index 03a550b848a3..67687fc6da10 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/TodoTreeStructure.java @@ -23,7 +23,6 @@ import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiSearchHelper; import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoPattern; @@ -44,7 +43,7 @@ public abstract class TodoTreeStructure extends AbstractTreeStructureBase implem private boolean myAreModulesShown; - protected final PsiSearchHelper mySearchHelper; + protected final PsiTodoSearchHelper mySearchHelper; /** * Current TodoFilter. If no filter is set then this field is null. */ @@ -54,7 +53,7 @@ public abstract class TodoTreeStructure extends AbstractTreeStructureBase implem super(project); myArePackagesShown=true; mySummaryElement=new ToDoSummary(); - mySearchHelper= PsiSearchHelper.SERVICE.getInstance(project); + mySearchHelper= PsiTodoSearchHelper.SERVICE.getInstance(project); } final void setTreeBuilder(TodoTreeBuilder builder){ diff --git a/platform/lang-impl/src/com/intellij/ide/todo/nodes/TodoFileNode.java b/platform/lang-impl/src/com/intellij/ide/todo/nodes/TodoFileNode.java index 89be7f2eca84..6a629737c801 100644 --- a/platform/lang-impl/src/com/intellij/ide/todo/nodes/TodoFileNode.java +++ b/platform/lang-impl/src/com/intellij/ide/todo/nodes/TodoFileNode.java @@ -31,7 +31,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.search.TodoItemImpl; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.ui.HighlightedRegion; @@ -102,13 +102,13 @@ public final class TodoFileNode extends PsiFileNode implements HighlightedRegion @Override public void visitElement(PsiElement element) { if (element instanceof PsiLanguageInjectionHost) { - InjectedLanguageUtil.enumerate(element, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(element, new PsiLanguageInjectionHost.InjectedPsiVisitor() { @Override public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { if (places.size() == 1) { Document document = PsiDocumentManager.getInstance(injectedPsi.getProject()).getCachedDocument(injectedPsi); if (!(document instanceof DocumentWindow)) return; - for(TodoItem item: helper.findTodoItems(injectedPsi)) { + for (TodoItem item : helper.findTodoItems(injectedPsi)) { TextRange rangeInHost = ((DocumentWindow)document).injectedToHost(item.getTextRange()); todoItems.add(new TodoItemImpl(psiFile, rangeInHost.getStartOffset(), rangeInHost.getEndOffset(), item.getPattern())); } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java index 01eda277a3cf..c205510199ac 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ContributorsBasedGotoByModel.java @@ -15,7 +15,7 @@ */ package com.intellij.ide.util.gotoByName; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.diagnostic.PluginException; import com.intellij.ide.plugins.PluginManager; import com.intellij.ide.util.NavigationItemListCellRenderer; @@ -32,7 +32,6 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.Processor; import com.intellij.util.containers.ConcurrentHashSet; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; @@ -66,26 +65,27 @@ public abstract class ContributorsBasedGotoByModel implements ChooseByNameModel public String[] getNames(final boolean checkBoxState) { final Set names = new ConcurrentHashSet(); - JobUtil.invokeConcurrentlyUnderProgress(filterDumb(myContributors), ProgressManager.getInstance().getProgressIndicator(), false, new Processor() { - @Override - public boolean process(ChooseByNameContributor contributor) { - try { - if (!myProject.isDisposed()) { - ContainerUtil.addAll(names, contributor.getNames(myProject, checkBoxState)); - } - } - catch (ProcessCanceledException ex) { - // index corruption detected, ignore - } - catch (IndexNotReadyException ex) { - // index corruption detected, ignore - } - catch (Exception ex) { - LOG.error(ex); - } - return true; - } - }); + JobLauncher.getInstance().invokeConcurrentlyUnderProgress(filterDumb(myContributors), ProgressManager.getInstance().getProgressIndicator(), false, + new Processor() { + @Override + public boolean process(ChooseByNameContributor contributor) { + try { + if (!myProject.isDisposed()) { + ContainerUtil.addAll(names, contributor.getNames(myProject, checkBoxState)); + } + } + catch (ProcessCanceledException ex) { + // index corruption detected, ignore + } + catch (IndexNotReadyException ex) { + // index corruption detected, ignore + } + catch (Exception ex) { + LOG.error(ex); + } + return true; + } + }); return ArrayUtil.toStringArray(names); } @@ -115,36 +115,40 @@ public abstract class ContributorsBasedGotoByModel implements ChooseByNameModel public Object[] getElementsByName(final String name, final boolean checkBoxState, final String pattern) { final List items = Collections.synchronizedList(new ArrayList()); - JobUtil.invokeConcurrentlyUnderProgress(filterDumb(myContributors), ProgressManager.getInstance().getProgressIndicator(), false, new Processor() { - @Override - public boolean process(ChooseByNameContributor contributor) { - try { - for (NavigationItem item : contributor.getItemsByName(name, pattern, myProject, checkBoxState)) { - if (item == null) { - final PluginId pluginId = PluginManager.getPluginByClassName(contributor.getClass().getName()); - if (pluginId != null) { - LOG.error(new PluginException("null item from contributor " + contributor + " for name " + name, pluginId)); - } - else { - LOG.error("null item from contributor " + contributor + " for name " + name); - } - continue; - } + JobLauncher.getInstance().invokeConcurrentlyUnderProgress(filterDumb(myContributors), ProgressManager.getInstance().getProgressIndicator(), false, + new Processor() { + @Override + public boolean process(ChooseByNameContributor contributor) { + try { + for (NavigationItem item : contributor + .getItemsByName(name, pattern, myProject, checkBoxState)) { + if (item == null) { + final PluginId pluginId = + PluginManager.getPluginByClassName(contributor.getClass().getName()); + if (pluginId != null) { + LOG.error(new PluginException( + "null item from contributor " + contributor + " for name " + name, pluginId)); + } + else { + LOG.error("null item from contributor " + contributor + " for name " + name); + } + continue; + } - if (acceptItem(item)) { - items.add(item); - } - } - } - catch (ProcessCanceledException ex) { - // index corruption detected, ignore - } - catch (Exception ex) { - LOG.error(ex); - } - return true; - } - }); + if (acceptItem(item)) { + items.add(item); + } + } + } + catch (ProcessCanceledException ex) { + // index corruption detected, ignore + } + catch (Exception ex) { + LOG.error(ex); + } + return true; + } + }); return ArrayUtil.toObjectArray(items); } diff --git a/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java b/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java index 46341c274783..ff69f00bccb2 100644 --- a/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java +++ b/platform/lang-impl/src/com/intellij/injected/editor/EditorWindow.java @@ -43,7 +43,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.containers.WeakList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -113,7 +113,7 @@ public class EditorWindow extends UserDataHolderBase implements EditorEx { if (!editorWindow.isValid()) { editorWindow.dispose(); - InjectedLanguageUtil.clearCaches(editorWindow.myInjectedFile, editorWindow.getDocument()); + InjectedLanguageFacadeImpl.clearCaches(editorWindow.myInjectedFile, editorWindow.getDocument()); iterator.remove(); } } diff --git a/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java b/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java index d1de1c60312c..0556784022bc 100644 --- a/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java +++ b/platform/lang-impl/src/com/intellij/internal/psiView/PsiViewerDialog.java @@ -23,6 +23,7 @@ import com.intellij.formatting.ASTBlock; import com.intellij.formatting.Block; import com.intellij.formatting.FormattingModel; import com.intellij.formatting.FormattingModelBuilder; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ide.util.treeView.AbstractTreeStructure; import com.intellij.ide.util.treeView.NodeRenderer; @@ -69,7 +70,6 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.impl.DebugUtil; import com.intellij.psi.impl.source.resolve.FileContextUtil; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.testFramework.LightVirtualFile; @@ -821,7 +821,8 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp } if (currentElem == null) { currentElem = - InjectedLanguageUtil.findElementAtNoCommit(psiEl.getContainingFile(), rootBlockNode.getBlock().getTextRange().getStartOffset()); + InjectedLanguageFacadeImpl + .findElementAtNoCommit(psiEl.getContainingFile(), rootBlockNode.getBlock().getTextRange().getStartOffset()); } myPsiToBlockMap.put(currentElem, rootBlockNode); @@ -979,7 +980,7 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp BlockTreeNode descriptor = (BlockTreeNode)blockElementsSet.iterator().next(); PsiElement rootPsi = ((ViewerTreeStructure)myPsiTreeBuilder.getTreeStructure()).getRootPsiElement(); int blockStart = descriptor.getBlock().getTextRange().getStartOffset(); - PsiElement currentPsiEl = InjectedLanguageUtil.findElementAtNoCommit(rootPsi.getContainingFile(), blockStart); + PsiElement currentPsiEl = InjectedLanguageFacadeImpl.findElementAtNoCommit(rootPsi.getContainingFile(), blockStart); int blockLength = descriptor.getBlock().getTextRange().getLength(); while (currentPsiEl.getParent() != null && currentPsiEl.getTextRange().getStartOffset() == blockStart && @@ -1236,7 +1237,7 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp final PsiElement rootElement = ((ViewerTreeStructure)myPsiTreeBuilder.getTreeStructure()).getRootPsiElement(); int baseOffset = rootPsiElement.getTextRange().getStartOffset(); final int offset = myEditor.getCaretModel().getOffset() + baseOffset; - final PsiElement element = InjectedLanguageUtil.findElementAtNoCommit(rootElement.getContainingFile(), offset); + final PsiElement element = InjectedLanguageFacadeImpl.findElementAtNoCommit(rootElement.getContainingFile(), offset); if (element != null && myBlockTreeBuilder != null) { TextRange rangeInHostFile = InjectedLanguageManager.getInstance(myProject).injectedToHost(element, element.getTextRange()); selectBlockNode(findBlockNode(rangeInHostFile, true)); @@ -1257,8 +1258,8 @@ public class PsiViewerDialog extends DialogWrapper implements DataProvider, Disp final int start = selection.getSelectionStart()+baseOffset; final int end = selection.getSelectionEnd()+baseOffset - 1; final PsiElement element = - findCommonParent(InjectedLanguageUtil.findElementAtNoCommit(rootElement.getContainingFile(), start), - InjectedLanguageUtil.findElementAtNoCommit(rootElement.getContainingFile(), end)); + findCommonParent(InjectedLanguageFacadeImpl.findElementAtNoCommit(rootElement.getContainingFile(), start), + InjectedLanguageFacadeImpl.findElementAtNoCommit(rootElement.getContainingFile(), end)); if (element != null && myBlockTreeBuilder != null) { if (myEditor.getContentComponent().hasFocus()) { TextRange rangeInHostFile = InjectedLanguageManager.getInstance(myProject).injectedToHost(element, element.getTextRange()); diff --git a/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java b/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java index 48f1e2d4c506..3f037ebdece6 100644 --- a/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/internal/psiView/ViewerTreeStructure.java @@ -29,7 +29,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.impl.source.SourceTreeToPsiMap; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; @@ -99,7 +99,7 @@ public class ViewerTreeStructure extends AbstractTreeStructure { } final PsiElement psi = root.getPsi(); if (psi instanceof PsiLanguageInjectionHost) { - InjectedLanguageUtil.enumerate(psi, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(psi, new PsiLanguageInjectionHost.InjectedPsiVisitor() { @Override public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { list.add(new Inject(psi, injectedPsi)); diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java index d5761461754b..e35ddf938039 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/PsiAwareFileEditorManagerImpl.java @@ -27,7 +27,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.problems.WolfTheProblemSolver; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.ui.ColorUtil; import com.intellij.ui.docking.DockManager; import org.jetbrains.annotations.NotNull; @@ -99,7 +99,7 @@ public class PsiAwareFileEditorManagerImpl extends FileEditorManagerImpl { return editor; } - return InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, psiFile); + return InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(editor, psiFile); } /** diff --git a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorPsiDataProvider.java b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorPsiDataProvider.java index 0238e016a128..ef799405eea6 100644 --- a/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorPsiDataProvider.java +++ b/platform/lang-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorPsiDataProvider.java @@ -28,7 +28,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilBase; import org.jetbrains.annotations.Nullable; @@ -48,7 +48,7 @@ public class TextEditorPsiDataProvider implements EditorDataProvider { return e; } else { - return InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(e, getPsiFile(e, file)); + return InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(e, getPsiFile(e, file)); } } if (dataId.equals(injectedId(PSI_ELEMENT.getName()))) { diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java index dc377069df0a..1fe19548c3e9 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java @@ -33,8 +33,6 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleComponent; -import com.intellij.openapi.module.impl.scopes.ModuleWithDependenciesScope; -import com.intellij.openapi.module.impl.scopes.ModuleWithDependentsScope; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.impl.storage.ClasspathStorage; import com.intellij.openapi.util.Comparing; @@ -43,7 +41,6 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.PathUtil; -import com.intellij.util.containers.StripedLockIntObjectConcurrentHashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,16 +61,12 @@ public class ModuleImpl extends ComponentManagerImpl implements ModuleEx { @NonNls private static final String OPTION_WORKSPACE = "workspace"; - private final StripedLockIntObjectConcurrentHashMap myScopeCache = new StripedLockIntObjectConcurrentHashMap(); - - private GlobalSearchScope myModuleWithDependentsScope; - private GlobalSearchScope myModuleTestsWithDependentsScope; - public static final Object MODULE_RENAMING_REQUESTOR = new Object(); private String myName; private IModuleStore myComponentStore; + private final ModuleScopeProvider myModuleScopeProvider; public ModuleImpl(String filePath, Project project) { super(project); @@ -81,8 +74,10 @@ public class ModuleImpl extends ComponentManagerImpl implements ModuleEx { getPicoContainer().registerComponentInstance(Module.class, this); myProject = project; + myModuleScopeProvider = new ModuleScopeProviderImpl(this); init(filePath); + } protected void bootstrapPicoContainer() { @@ -240,71 +235,51 @@ public class ModuleImpl extends ComponentManagerImpl implements ModuleEx { } public GlobalSearchScope getModuleScope() { - return getCachedScope(ModuleWithDependenciesScope.COMPILE | ModuleWithDependenciesScope.TESTS); + return myModuleScopeProvider.getModuleScope(); } @Override public GlobalSearchScope getModuleScope(boolean includeTests) { - return getCachedScope(ModuleWithDependenciesScope.COMPILE | (includeTests ? ModuleWithDependenciesScope.TESTS : 0)); + return myModuleScopeProvider.getModuleScope(includeTests); } public GlobalSearchScope getModuleWithLibrariesScope() { - return getCachedScope(ModuleWithDependenciesScope.COMPILE | ModuleWithDependenciesScope.TESTS | ModuleWithDependenciesScope.LIBRARIES); + return myModuleScopeProvider.getModuleWithLibrariesScope(); } public GlobalSearchScope getModuleWithDependenciesScope() { - return getCachedScope(ModuleWithDependenciesScope.COMPILE | ModuleWithDependenciesScope.TESTS | ModuleWithDependenciesScope.MODULES); + return myModuleScopeProvider.getModuleWithDependenciesScope(); } @Override public GlobalSearchScope getModuleContentScope() { - return getCachedScope(ModuleWithDependenciesScope.CONTENT); + return myModuleScopeProvider.getModuleContentScope(); } @Override public GlobalSearchScope getModuleContentWithDependenciesScope() { - return getCachedScope(ModuleWithDependenciesScope.CONTENT | ModuleWithDependenciesScope.MODULES); + return myModuleScopeProvider.getModuleContentWithDependenciesScope(); } public GlobalSearchScope getModuleWithDependenciesAndLibrariesScope(boolean includeTests) { - return getCachedScope(ModuleWithDependenciesScope.COMPILE | - ModuleWithDependenciesScope.MODULES | - ModuleWithDependenciesScope.LIBRARIES | (includeTests ? ModuleWithDependenciesScope.TESTS : 0)); + return myModuleScopeProvider.getModuleWithDependenciesAndLibrariesScope(includeTests); } public GlobalSearchScope getModuleWithDependentsScope() { - if (myModuleWithDependentsScope == null) { - myModuleWithDependentsScope = new ModuleWithDependentsScope(this, false); - } - return myModuleWithDependentsScope; + return myModuleScopeProvider.getModuleWithDependentsScope(); } public GlobalSearchScope getModuleTestsWithDependentsScope() { - if (myModuleTestsWithDependentsScope == null) { - myModuleTestsWithDependentsScope = new ModuleWithDependentsScope(this, true); - } - return myModuleTestsWithDependentsScope; + return myModuleScopeProvider.getModuleTestsWithDependentsScope(); } public GlobalSearchScope getModuleRuntimeScope(boolean includeTests) { - return getCachedScope( - ModuleWithDependenciesScope.MODULES | ModuleWithDependenciesScope.LIBRARIES | (includeTests ? ModuleWithDependenciesScope.TESTS : 0)); - } - - @NotNull - public GlobalSearchScope getCachedScope(@ModuleWithDependenciesScope.ScopeConstant int options) { - GlobalSearchScope scope = myScopeCache.get(options); - if (scope == null) { - scope = new ModuleWithDependenciesScope(this, options); - myScopeCache.put(options, scope); - } - return scope; + return myModuleScopeProvider.getModuleRuntimeScope(includeTests); } + @Override public void clearScopesCache() { - myScopeCache.clear(); - myModuleWithDependentsScope = null; - myModuleTestsWithDependentsScope = null; + myModuleScopeProvider.clearCache(); } @SuppressWarnings({"HardCodedStringLiteral"}) diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java index 4f527b4b3242..306cea8b17a5 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java @@ -27,6 +27,7 @@ import com.intellij.openapi.fileTypes.FileTypeListener; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.impl.ModuleEx; import com.intellij.openapi.module.impl.ModuleImpl; import com.intellij.openapi.project.DumbServiceImpl; import com.intellij.openapi.project.Project; @@ -304,7 +305,7 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl { super.clearScopesCachesForModules(); Module[] modules = ModuleManager.getInstance(myProject).getModules(); for (Module module : modules) { - ((ModuleImpl)module).clearScopesCache(); + ((ModuleEx)module).clearScopesCache(); } } diff --git a/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java b/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java index 142dc882e729..e16baef9e2dd 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java +++ b/platform/lang-impl/src/com/intellij/openapi/vcs/checkin/TodoCheckinHandlerWorker.java @@ -43,7 +43,7 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.impl.search.LightIndexPatternSearch; import com.intellij.psi.impl.search.TodoItemsCreator; import com.intellij.psi.search.IndexPatternOccurrence; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.psi.search.searches.IndexPatternSearch; import com.intellij.util.PairConsumer; @@ -65,7 +65,7 @@ public class TodoCheckinHandlerWorker { private final TodoFilter myTodoFilter; private final boolean myIncludePattern; private final PsiManager myPsiManager; - private final PsiSearchHelper mySearchHelper; + private final PsiTodoSearchHelper mySearchHelper; private final List myAddedOrEditedTodos; private final List myInChangedTodos; @@ -81,7 +81,7 @@ public class TodoCheckinHandlerWorker { myTodoFilter = todoFilter; myIncludePattern = includePattern; myPsiManager = PsiManager.getInstance(project); - mySearchHelper = PsiSearchHelper.SERVICE.getInstance(project); + mySearchHelper = PsiTodoSearchHelper.SERVICE.getInstance(project); myAddedOrEditedTodos = new ArrayList(); myInChangedTodos = new ArrayList(); mySkipped = new SmartList>(); diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java b/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java index c177b80b5dee..c0ab0725a6c1 100644 --- a/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/FormattingDocumentModelImpl.java @@ -28,7 +28,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.PsiDocumentManagerImpl; import com.intellij.psi.impl.PsiToDocumentSynchronizer; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -128,7 +128,7 @@ public class FormattingDocumentModelImpl implements FormattingDocumentModel { if (strategy.check(myDocument.getCharsSequence(), startOffset, endOffset) >= endOffset) { return true; } - PsiElement injectedElement = myFile != null ? InjectedLanguageUtil.findElementAtNoCommit(myFile, startOffset) : null; + PsiElement injectedElement = myFile != null ? InjectedLanguageFacadeImpl.findElementAtNoCommit(myFile, startOffset) : null; if (injectedElement != null) { Language injectedLanguage = injectedElement.getLanguage(); if (!injectedLanguage.equals(myFile.getLanguage())) { diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/PsiBasedFormattingModel.java b/platform/lang-impl/src/com/intellij/psi/formatter/PsiBasedFormattingModel.java index 5fb63836e61d..68bcf08c59ba 100644 --- a/platform/lang-impl/src/com/intellij/psi/formatter/PsiBasedFormattingModel.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/PsiBasedFormattingModel.java @@ -28,7 +28,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.TokenType; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.impl.source.SourceTreeToPsiMap; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -117,7 +117,7 @@ public class PsiBasedFormattingModel implements FormattingModel { Project project = containingFile.getProject(); assert !PsiDocumentManager.getInstance(project).isUncommited(myDocumentModel.getDocument()); // TODO:default project can not be used for injections, because latter might wants (unavailable) indices - PsiElement psiElement = project.isDefault() ? null : InjectedLanguageUtil.findInjectedElementNoCommit(containingFile, offset); + PsiElement psiElement = project.isDefault() ? null : InjectedLanguageFacadeImpl.findInjectedElementNoCommit(containingFile, offset); if (psiElement == null) psiElement = containingFile.findElementAt(offset); if (psiElement == null) return null; return psiElement.getNode(); diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/common/InjectedLanguageBlockBuilder.java b/platform/lang-impl/src/com/intellij/psi/formatter/common/InjectedLanguageBlockBuilder.java index 7070493c72a1..4d06bdc3b8e5 100644 --- a/platform/lang-impl/src/com/intellij/psi/formatter/common/InjectedLanguageBlockBuilder.java +++ b/platform/lang-impl/src/com/intellij/psi/formatter/common/InjectedLanguageBlockBuilder.java @@ -27,7 +27,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.codeStyle.CodeStyleSettings; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -76,7 +76,7 @@ public abstract class InjectedLanguageBlockBuilder { } } }; - InjectedLanguageUtil.enumerate(injectionHost.getPsi(), injectedPsiVisitor); + InjectedLanguageFacadeImpl.enumerate(injectionHost.getPsi(), injectedPsiVisitor); if (injectedFile[0] != null) { final Language childLanguage = injectedFile[0].getLanguage(); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/TodoCacheManager.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/TodoCacheManager.java new file mode 100644 index 000000000000..cd84cc568e5e --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/TodoCacheManager.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2012 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.psi.impl.cache; + +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.search.IndexPattern; +import com.intellij.psi.search.IndexPatternProvider; +import org.jetbrains.annotations.NotNull; + +public interface TodoCacheManager { + class SERVICE { + private SERVICE() { + } + + public static TodoCacheManager getInstance(Project project) { + return ServiceManager.getService(project, TodoCacheManager.class); + } + } + + + /** + * @return all VirtualFile's that contain todo-items under project roots + */ + @NotNull + PsiFile[] getFilesWithTodoItems(); + + /** + * @return -1 if it's not known + */ + int getTodoCount(@NotNull VirtualFile file, IndexPatternProvider patternProvider); + + /** + * @return -1 if it's not known + */ + int getTodoCount(@NotNull VirtualFile file, IndexPattern pattern); +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java index cdd9acdd156a..d297a9a0c4c5 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexTodoCacheManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexTodoCacheManagerImpl.java new file mode 100644 index 000000000000..0b1e5a10273e --- /dev/null +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexTodoCacheManagerImpl.java @@ -0,0 +1,126 @@ +/* + * Copyright 2000-2012 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.psi.impl.cache.impl; + +import com.intellij.injected.editor.VirtualFileWindow; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.FileIndexFacade; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.impl.cache.TodoCacheManager; +import com.intellij.psi.impl.cache.impl.todo.TodoIndex; +import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.IndexPattern; +import com.intellij.psi.search.IndexPatternProvider; +import com.intellij.psi.util.PsiUtilCore; +import com.intellij.util.indexing.FileBasedIndex; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +/** + * @author Eugene Zhuravlev + * Date: Jan 16, 2008 + */ +public class IndexTodoCacheManagerImpl implements TodoCacheManager { + private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.cache.impl.IndexTodoCacheManagerImpl"); + private final Project myProject; + private final PsiManager myPsiManager; + + public IndexTodoCacheManagerImpl(PsiManager psiManager) { + myPsiManager = psiManager; + myProject = psiManager.getProject(); + } + + public static boolean shouldBeFound(GlobalSearchScope scope, VirtualFile virtualFile, FileIndexFacade index) { + return (scope.isSearchOutsideRootModel() || index.isInContent(virtualFile) || index.isInLibrarySource(virtualFile)) && !virtualFile.getFileType().isBinary(); + } + + @NotNull + public PsiFile[] getFilesWithTodoItems() { + if (myProject.isDefault()) { + return PsiFile.EMPTY_ARRAY; + } + final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); + final Set allFiles = new HashSet(); + final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(myProject).getFileIndex(); + for (IndexPattern indexPattern : IndexPatternUtil.getIndexPatterns()) { + final Collection files = fileBasedIndex.getContainingFiles( + TodoIndex.NAME, + new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), GlobalSearchScope.allScope(myProject)); + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + for (VirtualFile file : files) { + if (projectFileIndex.isInContent(file)) { + final PsiFile psiFile = myPsiManager.findFile(file); + if (psiFile != null) { + allFiles.add(psiFile); + } + } + } + } + }); + } + return allFiles.isEmpty() ? PsiFile.EMPTY_ARRAY : PsiUtilCore.toPsiFileArray(allFiles); + } + + @Override + public int getTodoCount(@NotNull final VirtualFile file, final IndexPatternProvider patternProvider) { + if (myProject.isDefault()) { + return 0; + } + if (file instanceof VirtualFileWindow) return -1; + final FileBasedIndex fileBasedIndex = FileBasedIndex.getInstance(); + int count = 0; + for (IndexPattern indexPattern : patternProvider.getIndexPatterns()) { + count += fetchCount(fileBasedIndex, file, indexPattern); + } + return count; + } + + @Override + public int getTodoCount(@NotNull final VirtualFile file, final IndexPattern pattern) { + if (myProject.isDefault()) { + return 0; + } + if (file instanceof VirtualFileWindow) return -1; + return fetchCount(FileBasedIndex.getInstance(), file, pattern); + } + + private int fetchCount(final FileBasedIndex fileBasedIndex, final VirtualFile file, final IndexPattern indexPattern) { + final int[] count = {0}; + fileBasedIndex.processValues( + TodoIndex.NAME, new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), file, + new FileBasedIndex.ValueProcessor() { + @Override + public boolean process(final VirtualFile file, final Integer value) { + count[0] += value.intValue(); + return true; + } + }, GlobalSearchScope.fileScope(myProject, file)); + return count[0]; + } +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java index 2faaf0a649e4..94e663d5abe9 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java @@ -31,7 +31,7 @@ import com.intellij.openapi.fileTypes.impl.CustomSyntaxTableFileType; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.CustomHighlighterTokenType; import com.intellij.psi.impl.cache.impl.BaseFilterLexer; -import com.intellij.psi.impl.cache.impl.CacheUtil; +import com.intellij.psi.impl.cache.CacheUtil; import com.intellij.psi.impl.cache.impl.IndexPatternUtil; import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; @@ -50,6 +50,8 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Author: dmitrylomov @@ -114,6 +116,9 @@ public abstract class PlatformIdTableBuilding { ourTodoIndexers.put(fileType, indexer); } + public static boolean isTodoIndexerRegistered(FileType fileType) { + return ourTodoIndexers.containsKey(fileType) || TodoIndexers.INSTANCE.forFileType(fileType) != null; + } private static class CompositeTodoIndexer implements DataIndexer { @@ -201,9 +206,44 @@ public abstract class PlatformIdTableBuilding { } } + public static class PlainTextTodoIndexer implements DataIndexer { + @Override + @NotNull + public Map map(final FileContent inputData) { + final CharSequence chars = inputData.getContentAsText(); + + + final IndexPattern[] indexPatterns = IndexPatternUtil.getIndexPatterns(); + if (indexPatterns.length > 0) { + final OccurrenceConsumer occurrenceConsumer = new OccurrenceConsumer(null, true); + for (IndexPattern indexPattern : indexPatterns) { + Pattern pattern = indexPattern.getPattern(); + if (pattern != null) { + Matcher matcher = pattern.matcher(chars); + while (matcher.find()) { + if (matcher.start() != matcher.end()) { + occurrenceConsumer.incTodoOccurrence(indexPattern); + } + } + } + } + Map map = new HashMap(); + for (IndexPattern indexPattern : indexPatterns) { + final int count = occurrenceConsumer.getOccurrenceCount(indexPattern); + if (count > 0) { + map.put(new TodoIndexEntry(indexPattern.getPatternString(), indexPattern.isCaseSensitive()), count); + } + } + return map; + } + return Collections.emptyMap(); + } + + } + static { IdTableBuilding.registerIdIndexer(FileTypes.PLAIN_TEXT, new IdTableBuilding.PlainTextIndexer()); - registerTodoIndexer(FileTypes.PLAIN_TEXT, new IdTableBuilding.PlainTextTodoIndexer()); + registerTodoIndexer(FileTypes.PLAIN_TEXT, new PlainTextTodoIndexer()); IdTableBuilding.registerIdIndexer(StdFileTypes.IDEA_MODULE, null); IdTableBuilding.registerIdIndexer(StdFileTypes.IDEA_WORKSPACE, null); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java index 1998ac33fc83..dc8b30258269 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java @@ -25,7 +25,6 @@ import com.intellij.openapi.fileTypes.impl.CustomSyntaxTableFileType; import com.intellij.openapi.project.ProjectCoreUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.impl.cache.impl.id.IdTableBuilding; import com.intellij.psi.impl.cache.impl.id.PlatformIdTableBuilding; import com.intellij.psi.search.IndexPatternProvider; import com.intellij.psi.tree.TokenSet; @@ -130,7 +129,7 @@ public class TodoIndex extends FileBasedIndexExtension return commentTokens != null; } - return IdTableBuilding.isTodoIndexerRegistered(fileType) || + return PlatformIdTableBuilding.isTodoIndexerRegistered(fileType) || fileType instanceof CustomSyntaxTableFileType; } }; diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexEntry.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexEntry.java similarity index 100% rename from platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexEntry.java rename to platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexEntry.java diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java similarity index 100% rename from platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java rename to platform/lang-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java index 2104ff613b81..8cb9413279a1 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearchImpl.java @@ -17,7 +17,7 @@ package com.intellij.psi.impl.search; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.cache.CacheManager; +import com.intellij.psi.impl.cache.TodoCacheManager; import com.intellij.psi.search.IndexPattern; import com.intellij.psi.search.IndexPatternProvider; import com.intellij.psi.search.searches.IndexPatternSearch; @@ -32,14 +32,14 @@ class IndexPatternSearchImpl extends IndexPatternSearch { @Override protected int getOccurrencesCountImpl(PsiFile file, IndexPatternProvider provider) { - int count = CacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), provider); + int count = TodoCacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), provider); if (count != -1) return count; return search(file, provider).findAll().size(); } @Override protected int getOccurrencesCountImpl(PsiFile file, IndexPattern pattern) { - int count = CacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), pattern); + int count = TodoCacheManager.SERVICE.getInstance(file.getProject()).getTodoCount(file.getVirtualFile(), pattern); if (count != -1) return count; return search(file, pattern).findAll().size(); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java index 4f1c94e33001..2945ddf4d65c 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java @@ -29,7 +29,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.cache.CacheManager; +import com.intellij.psi.impl.cache.TodoCacheManager; import com.intellij.psi.search.IndexPattern; import com.intellij.psi.search.IndexPatternOccurrence; import com.intellij.psi.search.IndexPatternProvider; @@ -60,7 +60,7 @@ public class IndexPatternSearcher implements QueryExecutor occurrences = IndexPatternSearch.search(file, TodoIndexPatternProvider.getInstance()).findAll(); + if (occurrences.isEmpty()) { + return EMPTY_TODO_ITEMS; + } + + return processTodoOccurences(startOffset, endOffset, occurrences); + } + + private TodoItem[] processTodoOccurences(int startOffset, int endOffset, Collection occurrences) { + List items = new ArrayList(occurrences.size()); + TextRange textRange = new TextRange(startOffset, endOffset); + final TodoItemsCreator todoItemsCreator = new TodoItemsCreator(); + for(IndexPatternOccurrence occurrence: occurrences) { + TextRange occurrenceRange = occurrence.getTextRange(); + if (textRange.contains(occurrenceRange)) { + items.add(todoItemsCreator.createTodo(occurrence)); + } + } + + return items.toArray(new TodoItem[items.size()]); + } + + @NotNull + @Override + public TodoItem[] findTodoItemsLight(@NotNull PsiFile file) { + return findTodoItemsLight(file, 0, file.getTextLength()); + } + + @NotNull + @Override + public TodoItem[] findTodoItemsLight(@NotNull PsiFile file, int startOffset, int endOffset) { + final Collection occurrences = + LightIndexPatternSearch.SEARCH.createQuery(new IndexPatternSearch.SearchParameters(file, TodoIndexPatternProvider.getInstance())).findAll(); + + if (occurrences.isEmpty()) { + return EMPTY_TODO_ITEMS; + } + + return processTodoOccurences(startOffset, endOffset, occurrences); + } + + @Override + public int getTodoItemsCount(@NotNull PsiFile file) { + int count = TodoCacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), TodoIndexPatternProvider.getInstance()); + if (count != -1) return count; + return findTodoItems(file).length; + } + + @Override + public int getTodoItemsCount(@NotNull PsiFile file, @NotNull TodoPattern pattern) { + int count = TodoCacheManager.SERVICE.getInstance(myManager.getProject()).getTodoCount(file.getVirtualFile(), pattern.getIndexPattern()); + if (count != -1) return count; + TodoItem[] items = findTodoItems(file); + count = 0; + for (TodoItem item : items) { + if (item.getPattern().equals(pattern)) count++; + } + return count; + } + + private static ArrayList getWordEntries(String name, boolean caseSensitively) { + List words = StringUtil.getWordsInStringLongestFirst(name); + final ArrayList keys = new ArrayList(); + for (String word : words) { + keys.add(new IdIndexEntry(word, caseSensitively)); + } + return keys; + } +} diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java index f4a0db2a0ab2..e251006a5428 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java @@ -25,7 +25,7 @@ import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -86,7 +86,7 @@ class InjectedSelfElementInfo extends SelfElementInfo { PsiDocumentManager documentManager = PsiDocumentManager.getInstance(hostFile.getProject()); Document document = documentManager.getDocument(hostFile); if (document != null && documentManager.isUncommited(document)) { - for (DocumentWindow documentWindow : InjectedLanguageUtil.getCachedInjectedDocuments(hostFile)) { + for (DocumentWindow documentWindow : InjectedLanguageFacadeImpl.getCachedInjectedDocuments(hostFile)) { PsiFile injected = documentManager.getPsiFile(documentWindow); if (injected != null) { visitor.visit(injected, Collections.emptyList()); @@ -94,7 +94,7 @@ class InjectedSelfElementInfo extends SelfElementInfo { } } else { - InjectedLanguageUtil.enumerate(hostContext, hostFile, true, visitor); + InjectedLanguageFacadeImpl.enumerate(hostContext, hostFile, true, visitor); } return result.get(); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java index fb8722d0156b..29442fd80cdf 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerManagerImpl.java @@ -29,7 +29,7 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.ProperTextRange; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.reference.SoftReference; import com.intellij.util.containers.UnsafeWeakList; import org.jetbrains.annotations.NotNull; @@ -72,7 +72,7 @@ public class SmartPointerManagerImpl extends SmartPointerManager { } } - for (DocumentWindow injectedDoc : InjectedLanguageUtil.getCachedInjectedDocuments(file)) { + for (DocumentWindow injectedDoc : InjectedLanguageFacadeImpl.getCachedInjectedDocuments(file)) { PsiFile injectedFile = psiDocumentManager.getPsiFile(injectedDoc); if (injectedFile == null) continue; RangeMarker cachedMarker = getCachedRangeMarkerToInjectedFragment(injectedFile); @@ -114,7 +114,7 @@ public class SmartPointerManagerImpl extends SmartPointerManager { } } - for (DocumentWindow injectedDoc : InjectedLanguageUtil.getCachedInjectedDocuments(file)) { + for (DocumentWindow injectedDoc : InjectedLanguageFacadeImpl.getCachedInjectedDocuments(file)) { PsiFile injectedFile = psiDocumentManager.getPsiFile(injectedDoc); if (injectedFile == null) continue; unfastenBelts(injectedFile, 0); @@ -145,7 +145,7 @@ public class SmartPointerManagerImpl extends SmartPointerManager { } final PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(file.getProject()); - for (Document document : InjectedLanguageUtil.getCachedInjectedDocuments(file)) { + for (Document document : InjectedLanguageFacadeImpl.getCachedInjectedDocuments(file)) { PsiFile injectedfile = psiDocumentManager.getPsiFile(document); if (injectedfile == null) continue; _synchronizePointers(injectedfile); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java b/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java index 42b4ee1f167b..1f87406009a6 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/PostprocessReformattingAspect.java @@ -45,7 +45,7 @@ import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.psi.impl.source.codeStyle.CodeFormatterFacade; import com.intellij.psi.impl.source.codeStyle.IndentHelperImpl; import com.intellij.psi.impl.source.tree.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.LocalTimeCounter; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.TestOnly; @@ -168,7 +168,7 @@ public class PostprocessReformattingAspect implements PomModelAspect { if (changeSet == null) return; final PsiElement psiElement = changeSet.getRootElement().getPsi(); if (psiElement == null) return; - PsiFile containingFile = InjectedLanguageUtil.getTopLevelFile(psiElement); + PsiFile containingFile = InjectedLanguageFacadeImpl.getTopLevelFile(psiElement); final FileViewProvider viewProvider = containingFile.getViewProvider(); if (!viewProvider.isEventSystemEnabled()) return; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java index d9af7a4b628a..f6be88df1c35 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java @@ -45,7 +45,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.formatter.DocumentBasedFormattingModel; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.SourceTreeToPsiMap; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.testFramework.LightVirtualFile; @@ -88,7 +88,7 @@ public class CodeFormatterFacade { final Document document = file.getViewProvider().getDocument(); final RangeMarker rangeMarker = document != null && endOffset < document.getTextLength()? document.createRangeMarker(startOffset, endOffset):null; - PsiElement elementToFormat = document instanceof DocumentWindow ? InjectedLanguageUtil.getTopLevelFile(file) : psiElement; + PsiElement elementToFormat = document instanceof DocumentWindow ? InjectedLanguageFacadeImpl.getTopLevelFile(file) : psiElement; final PsiFile fileToFormat = elementToFormat.getContainingFile(); final FormattingModelBuilder builder = LanguageFormatting.INSTANCE.forContext(fileToFormat); @@ -137,7 +137,7 @@ public class CodeFormatterFacade { Document document = PsiDocumentManager.getInstance(project).getDocument(file); final List textRanges = ranges.getRanges(); if (document instanceof DocumentWindow) { - file = InjectedLanguageUtil.getTopLevelFile(file); + file = InjectedLanguageFacadeImpl.getTopLevelFile(file); final DocumentWindow documentWindow = (DocumentWindow)document; for (FormatTextRanges.FormatTextRange range : textRanges) { range.setTextRange(documentWindow.injectedToHost(range.getTextRange())); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java index c0d69b38c25c..b6685b1e5e08 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerImpl.java @@ -38,7 +38,7 @@ import com.intellij.psi.impl.CheckUtil; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.SourceTreeToPsiMap; import com.intellij.psi.impl.source.tree.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilBase; import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; @@ -274,7 +274,7 @@ public class CodeStyleManagerImpl extends CodeStyleManager { TextRange textRange = addedElement.getTextRange(); final Document document = fileViewProvider.getDocument(); if (document instanceof DocumentWindow) { - containingFile = InjectedLanguageUtil.getTopLevelFile(containingFile); + containingFile = InjectedLanguageFacadeImpl.getTopLevelFile(containingFile); textRange = ((DocumentWindow)document).injectedToHost(textRange); } @@ -614,7 +614,7 @@ public class CodeStyleManagerImpl extends CodeStyleManager { if (!(astNode instanceof FileElement)) { return new Pair(null, null); } - PsiElement elementAt = InjectedLanguageUtil.findInjectedElementNoCommit(file, offset); + PsiElement elementAt = InjectedLanguageFacadeImpl.findInjectedElementNoCommit(file, offset); final CharTable charTable = ((FileElement)astNode).getCharTable(); if (elementAt == null) { elementAt = findElementInTreeWithFormatterEnabled(file, offset); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerRunnable.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerRunnable.java index de0243002b23..3862e08e4749 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerRunnable.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeStyleManagerRunnable.java @@ -28,7 +28,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.formatter.DocumentBasedFormattingModel; import com.intellij.psi.impl.source.SourceTreeToPsiMap; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.Nullable; @@ -56,7 +56,7 @@ abstract class CodeStyleManagerRunnable { Document document = documentManager.getDocument(file); if (document instanceof DocumentWindow) { final DocumentWindow documentWindow = (DocumentWindow)document; - final PsiFile topLevelFile = InjectedLanguageUtil.getTopLevelFile(file); + final PsiFile topLevelFile = InjectedLanguageFacadeImpl.getTopLevelFile(file); if (!file.equals(topLevelFile)) { if (range != null) { range = documentWindow.injectedToHost(range); @@ -125,7 +125,7 @@ abstract class CodeStyleManagerRunnable { return false; } - if (element instanceof PsiLanguageInjectionHost && InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)element)) { + if (element instanceof PsiLanguageInjectionHost && InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)element)) { return false; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java index 2d73b9b02f82..b76d8c89d481 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReferenceSet.java @@ -25,7 +25,7 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -306,7 +306,7 @@ public class FileReferenceSet { @Nullable private PsiFile getContainingFile() { - final PsiFile file = InjectedLanguageUtil.getTopLevelFile(myElement.getContainingFile()); + final PsiFile file = InjectedLanguageFacadeImpl.getTopLevelFile(myElement.getContainingFile()); if (file == null) { LOG.error("Invalid element: " + myElement); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java index 4cd558854598..21b6a6a4841c 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedFileViewProvider.java @@ -90,7 +90,7 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider impleme PsiFile hostFile = documentManager.getPsiFile(hostDocument); Language language = getBaseLanguage(); PsiFile file = getPsi(language); - final Language hostFileLanguage = InjectedLanguageUtil.getTopLevelFile(file).getLanguage(); + final Language hostFileLanguage = InjectedLanguageFacadeImpl.getTopLevelFile(file).getLanguage(); PsiFile hostPsiFileCopy = (PsiFile)hostFile.copy(); Segment firstTextRange = oldDocumentWindow.getHostRanges()[0]; PsiElement hostElementCopy = hostPsiFileCopy.getViewProvider().findElementAt(firstTextRange.getStartOffset(), hostFileLanguage); @@ -108,7 +108,7 @@ public class InjectedFileViewProvider extends SingleRootFileViewProvider impleme for (PsiElement current = hostElementCopy; current != null && current != hostPsiFileCopy; current = current.getParent()) { current.putUserData(LANGUAGE_FOR_INJECTED_COPY_KEY, language); try { - InjectedLanguageUtil.enumerate(current, hostPsiFileCopy, false, visitor); + InjectedLanguageFacadeImpl.enumerate(current, hostPsiFileCopy, false, visitor); } finally { current.putUserData(LANGUAGE_FOR_INJECTED_COPY_KEY, null); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageFacadeImpl.java similarity index 98% rename from platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java rename to platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageFacadeImpl.java index 11784f3dcfb9..4a019a46fac2 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageFacadeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -30,6 +30,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.impl.InjectedLanguageFacade; import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.PsiParameterizedCachedValue; import com.intellij.psi.impl.source.DummyHolder; @@ -45,7 +46,7 @@ import java.util.List; /** * @author cdr */ -public class InjectedLanguageUtil { +public class InjectedLanguageFacadeImpl extends InjectedLanguageFacade { static final Key, TextRange>>> HIGHLIGHT_TOKENS = Key.create("HIGHLIGHT_TOKENS"); public static void forceInjectionOnElement(@NotNull PsiElement host) { @@ -75,8 +76,9 @@ public class InjectedLanguageUtil { return host; } + @Override @Nullable - public static List> getInjectedPsiFiles(@NotNull final PsiElement host) { + public List> getInjectedPsiFiles(@NotNull final PsiElement host) { if (!(host instanceof PsiLanguageInjectionHost) || !((PsiLanguageInjectionHost) host).isValidHost()) { return null; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java index 7aa201ea2521..8a086947820c 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageManagerImpl.java @@ -19,7 +19,7 @@ package com.intellij.psi.impl.source.tree.injected; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.daemon.impl.DaemonProgressIndicator; import com.intellij.concurrency.Job; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.injected.editor.DocumentWindow; import com.intellij.injected.editor.DocumentWindowImpl; import com.intellij.injected.editor.VirtualFileWindow; @@ -131,7 +131,7 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme if (hostPsiFile == null) return; final CopyOnWriteArrayList injected = - (CopyOnWriteArrayList)InjectedLanguageUtil.getCachedInjectedDocuments(hostPsiFile); + (CopyOnWriteArrayList)InjectedLanguageFacadeImpl.getCachedInjectedDocuments(hostPsiFile); if (injected.isEmpty()) return; if (myProgress.isCanceled()) { @@ -157,7 +157,7 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme } final DocumentWindow[] stillInjectedDocument = {null}; // it is here where the reparse happens and old file contents replaced - InjectedLanguageUtil.enumerate(element, hostPsiFile, true, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(element, hostPsiFile, true, new PsiLanguageInjectionHost.InjectedPsiVisitor() { @Override public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { stillInjectedDocument[0] = (DocumentWindow)injectedPsi.getViewProvider().getDocument(); @@ -181,7 +181,8 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme @Override public void run() { if (myProgress.isCanceled()) return; - JobUtil.invokeConcurrentlyUnderProgress(new ArrayList(injected), myProgress, !synchronously, commitProcessor); + JobLauncher.getInstance().invokeConcurrentlyUnderProgress(new ArrayList(injected), myProgress, !synchronously, + commitProcessor); } }; @@ -196,7 +197,7 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme } } else { - JobUtil.submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() { + JobLauncher.getInstance().submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() { @Override public void run() { ApplicationManagerEx.getApplicationEx().tryRunReadAction(commitInjectionsRunnable); @@ -332,7 +333,7 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme @SuppressWarnings({"ConstantConditions", "unchecked"}) @NotNull public List intersectWithAllEditableFragments(@NotNull PsiFile injectedPsi, @NotNull TextRange rangeToEdit) { - Place shreds = InjectedLanguageUtil.getShreds(injectedPsi); + Place shreds = InjectedLanguageFacadeImpl.getShreds(injectedPsi); if (shreds == null) return Collections.emptyList(); Object result = null; // optimization: TextRange or ArrayList int count = 0; @@ -380,12 +381,12 @@ public class InjectedLanguageManagerImpl extends InjectedLanguageManager impleme @Override public PsiElement findInjectedElementAt(@NotNull PsiFile hostFile, int hostDocumentOffset) { - return InjectedLanguageUtil.findInjectedElementNoCommit(hostFile, hostDocumentOffset); + return InjectedLanguageFacadeImpl.findInjectedElementNoCommit(hostFile, hostDocumentOffset); } @Override public void dropFileCaches(@NotNull PsiFile file) { - InjectedLanguageUtil.clearCachedInjectedFragmentsForFile(file); + InjectedLanguageFacadeImpl.clearCachedInjectedFragmentsForFile(file); } private final Map myInjectorsClone = new HashMap(); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java index d1ee84f27989..19ca2be6c298 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/MultiHostRegistrarImpl.java @@ -256,7 +256,7 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT PsiFile newFile = registerDocument(documentWindow, psiFile, place, myHostPsiFile, documentManager); boolean mergeHappened = newFile != psiFile; if (mergeHappened) { - InjectedLanguageUtil.clearCaches(psiFile, documentWindow); + InjectedLanguageFacadeImpl.clearCaches(psiFile, documentWindow); psiFile = newFile; viewProvider = (InjectedFileViewProvider)psiFile.getViewProvider(); documentWindow = (DocumentWindowImpl)viewProvider.getDocument(); @@ -274,7 +274,7 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT try { List, TextRange>> tokens = obtainHighlightTokensFromLexer(myLanguage, outChars, escapers, place, virtualFile, myProject); - psiFile.putUserData(InjectedLanguageUtil.HIGHLIGHT_TOKENS, tokens); + psiFile.putUserData(InjectedLanguageFacadeImpl.HIGHLIGHT_TOKENS, tokens); } catch (ProcessCanceledException e) { throw e; @@ -385,7 +385,7 @@ public class MultiHostRegistrarImpl implements MultiHostRegistrar, ModificationT final Place shreds, final PsiFile hostPsiFile, final PsiDocumentManager documentManager) { - List injected = InjectedLanguageUtil.getCachedInjectedDocuments(hostPsiFile); + List injected = InjectedLanguageFacadeImpl.getCachedInjectedDocuments(hostPsiFile); for (int i = injected.size()-1; i>=0; i--) { DocumentWindowImpl oldDocument = (DocumentWindowImpl)injected.get(i); diff --git a/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java b/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java index 6b0819711bd9..a3743bc49602 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/inline/InlineOptionsDialog.java @@ -22,13 +22,11 @@ import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiSearchHelper; import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.ui.RefactoringDialog; import com.intellij.refactoring.util.RadioUpDownListener; import javax.swing.*; import javax.swing.border.EmptyBorder; -import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java b/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java index e5fafd442a26..a15dfa42e4f2 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/FileReferenceContextUtil.java @@ -22,7 +22,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceOwner; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; @@ -43,10 +43,10 @@ public class FileReferenceContextUtil { element.accept(new PsiRecursiveElementWalkingVisitor(true) { @Override public void visitElement(PsiElement element) { if (element instanceof PsiLanguageInjectionHost) { - InjectedLanguageUtil.enumerate(element, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(element, new PsiLanguageInjectionHost.InjectedPsiVisitor() { public void visit(@NotNull final PsiFile injectedPsi, @NotNull final List places) { encodeFileReferences(injectedPsi); - } + } }); } @@ -89,7 +89,7 @@ public class FileReferenceContextUtil { } if (element instanceof PsiLanguageInjectionHost) { - InjectedLanguageUtil.enumerate(element, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(element, new PsiLanguageInjectionHost.InjectedPsiVisitor() { public void visit(@NotNull final PsiFile injectedPsi, @NotNull final List places) { decodeFileReferences(injectedPsi); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/PsiElementRenameHandler.java b/platform/lang-impl/src/com/intellij/refactoring/rename/PsiElementRenameHandler.java index c23fe24e664d..3b5c3f49bdfd 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/PsiElementRenameHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/PsiElementRenameHandler.java @@ -31,7 +31,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Condition; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.meta.PsiMetaOwner; import com.intellij.psi.meta.PsiWritableMetaData; import com.intellij.refactoring.RefactoringBundle; @@ -57,7 +57,7 @@ public class PsiElementRenameHandler implements RenameHandler { public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { PsiElement element = getElement(dataContext); editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); - final PsiElement nameSuggestionContext = InjectedLanguageUtil.findElementAtNoCommit(file, editor.getCaretModel().getOffset()); + final PsiElement nameSuggestionContext = InjectedLanguageFacadeImpl.findElementAtNoCommit(file, editor.getCaretModel().getOffset()); invoke(element, project, nameSuggestionContext, editor); } @@ -127,7 +127,7 @@ public class PsiElementRenameHandler implements RenameHandler { } } - if (InjectedLanguageUtil.isInInjectedLanguagePrefixSuffix(element)) { + if (InjectedLanguageFacadeImpl.isInInjectedLanguagePrefixSuffix(element)) { final String message = RefactoringBundle.message("error.in.injected.lang.prefix.suffix", UsageViewUtil.getType(element)); return RefactoringBundle.getCannotRefactorMessage(message); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java index f678387ef376..2064c37e185a 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java @@ -62,7 +62,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.ProjectScope; import com.intellij.psi.search.PsiSearchHelper; @@ -151,7 +151,7 @@ public abstract class InplaceRefactoring { public boolean performInplaceRefactoring(final LinkedHashSet nameSuggestions) { myNameSuggestions = nameSuggestions; - if (InjectedLanguageUtil.isInInjectedLanguagePrefixSuffix(myElementToRename)) { + if (InjectedLanguageFacadeImpl.isInInjectedLanguagePrefixSuffix(myElementToRename)) { return false; } @@ -274,7 +274,7 @@ public abstract class InplaceRefactoring { } else { revertState(); - final TemplateState templateState = TemplateManagerImpl.getTemplateState(InjectedLanguageUtil.getTopLevelEditor(myEditor)); + final TemplateState templateState = TemplateManagerImpl.getTemplateState(InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor)); if (templateState != null) { templateState.gotoEnd(true); } @@ -332,7 +332,7 @@ public abstract class InplaceRefactoring { TextRange range = myScope.getTextRange(); assert range != null; myHighlighters = new ArrayList(); - Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(myEditor); + Editor topLevelEditor = InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor); topLevelEditor.getCaretModel().moveToOffset(range.getStartOffset()); TemplateManager.getInstance(myProject).startTemplate(topLevelEditor, template, templateListener); @@ -508,7 +508,7 @@ public abstract class InplaceRefactoring { if (myOldName == null) return; CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { public void run() { - final Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(myEditor); + final Editor topLevelEditor = InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor); ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final TemplateState state = TemplateManagerImpl.getTemplateState(topLevelEditor); @@ -751,7 +751,7 @@ public abstract class InplaceRefactoring { finally { if (!bind) { try { - ((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).stopDumb(); + ((EditorImpl)InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor)).stopDumb(); } finally { FinishMarkAction.finish(myProject, myEditor, myMarkAction); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java index 45d74ff03420..f6a107357ad9 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenameHandler.java @@ -28,7 +28,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.PsiNamedElement; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.rename.RenamePsiElementProcessor; import org.jetbrains.annotations.NotNull; @@ -73,7 +73,7 @@ public class MemberInplaceRenameHandler extends VariableInplaceRenameHandler { else { final InplaceRefactoring inplaceRefactoring = editor.getUserData(InplaceRefactoring.INPLACE_RENAMER); if (inplaceRefactoring != null && inplaceRefactoring.getClass() == MemberInplaceRenamer.class) { - final TemplateState templateState = TemplateManagerImpl.getTemplateState(InjectedLanguageUtil.getTopLevelEditor(editor)); + final TemplateState templateState = TemplateManagerImpl.getTemplateState(InjectedLanguageFacadeImpl.getTopLevelEditor(editor)); if (templateState != null) { templateState.gotoEnd(true); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java index caf14daadbf3..062fc1aa8a65 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MemberInplaceRenamer.java @@ -30,7 +30,7 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.ProjectScope; import com.intellij.psi.search.SearchScope; @@ -202,7 +202,7 @@ public class MemberInplaceRenamer extends VariableInplaceRenamer { } finally { try { - ((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).stopDumb(); + ((EditorImpl)InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor)).stopDumb(); } finally { FinishMarkAction.finish(myProject, myEditor, markAction); @@ -248,7 +248,7 @@ public class MemberInplaceRenamer extends VariableInplaceRenamer { @Override protected void revertStateOnFinish() { - final Editor editor = InjectedLanguageUtil.getTopLevelEditor(myEditor); + final Editor editor = InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor); if (editor == FileEditorManager.getInstance(myProject).getSelectedTextEditor()) { ((EditorImpl)editor).startDumb(); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java index 7db3a3693faf..70960742e739 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/MyLookupExpression.java @@ -30,7 +30,7 @@ import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiNamedElement; import com.intellij.psi.codeStyle.SuggestedNameInfo; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.refactoring.rename.NameSuggestionProvider; import com.intellij.refactoring.rename.PreferrableNameSuggestionProvider; @@ -78,7 +78,7 @@ public class MyLookupExpression extends Expression { @Override public void handleInsert(InsertionContext context, LookupElement item) { if (shouldSelectAll) return; - final Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(context.getEditor()); + final Editor topLevelEditor = InjectedLanguageFacadeImpl.getTopLevelEditor(context.getEditor()); final TemplateState templateState = TemplateManagerImpl.getTemplateState(topLevelEditor); if (templateState != null) { final TextRange range = templateState.getCurrentVariableRange(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java index f52e6635ef16..222ca0db8098 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java @@ -32,7 +32,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiUtilCore; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.rename.AutomaticRenamingDialog; @@ -249,7 +249,7 @@ public class VariableInplaceRenamer extends InplaceRefactoring { } finally { try { - ((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).stopDumb(); + ((EditorImpl)InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor)).stopDumb(); } finally { FinishMarkAction.finish(myProject, myEditor, markAction); @@ -298,7 +298,7 @@ public class VariableInplaceRenamer extends InplaceRefactoring { revertStateOnFinish(); } else { - ((EditorImpl)InjectedLanguageUtil.getTopLevelEditor(myEditor)).stopDumb(); + ((EditorImpl)InjectedLanguageFacadeImpl.getTopLevelEditor(myEditor)).stopDumb(); } } diff --git a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java index 7624d5bd6827..9dfb6f5b52a0 100644 --- a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java @@ -20,7 +20,7 @@ package com.intellij.ui; import com.intellij.concurrency.Job; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.util.Ref; @@ -117,14 +117,15 @@ public class DeferredIconImpl implements DeferredIcon { paintingParentRec.set(((PaintingParent)pp).getChildRec(c)); } - JobUtil.submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() { + JobLauncher.getInstance().submitToJobThread(Job.DEFAULT_PRIORITY, new Runnable() { @Override public void run() { int oldWidth = myDelegateIcon.getIconWidth(); final Icon result = evaluate(); myDelegateIcon = result; - final boolean shouldRevalidate = Registry.is("ide.tree.deferredicon.invalidates.cache") && myDelegateIcon.getIconWidth() != oldWidth; + final boolean shouldRevalidate = + Registry.is("ide.tree.deferredicon.invalidates.cache") && myDelegateIcon.getIconWidth() != oldWidth; //noinspection SSBasedInspection SwingUtilities.invokeLater(new Runnable() { diff --git a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java index cc69e4b78d7b..f7ac237dbc15 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/Messages.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/Messages.java @@ -814,7 +814,7 @@ public class Messages { textField.setText(textArea.getText()); } }); - String s = textField.getText().replaceAll("[\\ ]*=[\\ ]*", "="); + String s = textField.getText().replaceAll("[ ]*=[ ]*", "=").replaceAll("\\-", "\\ \\-"); List lines = StringUtil.splitHonorQuotes(s, ' '); textArea.setText(StringUtil.join(lines, "\n")); InsertPathAction.copyFromTo(textField, textArea); diff --git a/platform/platform-impl/src/com/intellij/concurrency/JobUtil.java b/platform/platform-impl/src/com/intellij/concurrency/JobLauncherImpl.java similarity index 90% rename from platform/platform-impl/src/com/intellij/concurrency/JobUtil.java rename to platform/platform-impl/src/com/intellij/concurrency/JobLauncherImpl.java index eea654bf9d0e..e5910b81012e 100644 --- a/platform/platform-impl/src/com/intellij/concurrency/JobUtil.java +++ b/platform/platform-impl/src/com/intellij/concurrency/JobLauncherImpl.java @@ -34,13 +34,10 @@ import java.util.concurrent.Future; * @author cdr */ -public class JobUtil { - private static final Logger LOG = Logger.getInstance("#com.intellij.concurrency.JobUtil"); +public class JobLauncherImpl extends JobLauncher { + private static final Logger LOG = Logger.getInstance("#com.intellij.concurrency.JobLauncher"); - private JobUtil() { - } - - private static boolean invokeConcurrentlyForAll(@NotNull final List things, + private boolean invokeConcurrentlyForAll(@NotNull final List things, boolean failFastOnAcquireReadAction, @NotNull final Processor thingProcessor) throws ProcessCanceledException { final Job job = new JobImpl(Job.DEFAULT_PRIORITY, failFastOnAcquireReadAction); @@ -95,7 +92,8 @@ public class JobUtil { * or we were unable to start read action in at least one thread * @throws ProcessCanceledException if at least one task has thrown ProcessCanceledException */ - public static boolean invokeConcurrentlyUnderProgress(@NotNull List things, + @Override + public boolean invokeConcurrentlyUnderProgress(@NotNull List things, ProgressIndicator progress, boolean failFastOnAcquireReadAction, @NotNull final Processor thingProcessor) throws ProcessCanceledException { @@ -122,11 +120,8 @@ public class JobUtil { }); } - public static Job submitToJobThread(int priority, @NotNull final Runnable action) { - return submitToJobThread(priority, action, null); - } - - public static Job submitToJobThread(int priority, @NotNull final Runnable action, Consumer onDoneCallback) { + @Override + public Job submitToJobThread(int priority, @NotNull final Runnable action, Consumer onDoneCallback) { final JobImpl job = new JobImpl(priority, false); Callable callable = new Callable() { public Void call() throws Exception { diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java index 0fc2147f8a1a..7fd8d51578ae 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/DirectoryBasedStorage.java @@ -116,7 +116,7 @@ public class DirectoryBasedStorage implements StateStorage, Disposable { private DirectoryStorageData loadState() throws StateStorageException { DirectoryStorageData storageData = new DirectoryStorageData(); - storageData.loadFrom(myDir, myPathMacroSubstitutor); + storageData.loadFrom(LocalFileSystem.getInstance().findFileByIoFile(myDir), myPathMacroSubstitutor); return storageData; } @@ -289,7 +289,8 @@ public class DirectoryBasedStorage implements StateStorage, Disposable { myPathMacroSubstitutor.collapsePaths(element); } - if (!StorageUtil.contentEquals(element, file)) { + VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(file); + if (virtualFile == null || !StorageUtil.contentEquals(element, virtualFile)) { filesToSave.add(file); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java index 099dc37c6434..ce6cf2cae7f6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java @@ -154,8 +154,10 @@ public class FileBasedStorage extends XmlElementStorage { @Override protected boolean physicalContentNeedsSave() { - if (!myFile.exists()) return !myStorageData.isEmpty(); - return !StorageUtil.contentEquals(getDocumentToSave(), myFile); + VirtualFile file = getVirtualFile(); + if (file == null || !file.exists()) + return !myStorageData.isEmpty(); + return !StorageUtil.contentEquals(getDocumentToSave(), file); } @Override @@ -321,7 +323,8 @@ public class FileBasedStorage extends XmlElementStorage { } protected boolean physicalContentNeedsSave(final Document doc) { - return !myFile.exists() || !StorageUtil.contentEquals(doc, myFile); + VirtualFile file = getVirtualFile(); + return file == null || !file.exists() || !StorageUtil.contentEquals(doc, file); } @Nullable diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java index 1d5f917b1990..9eed25697766 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StorageUtil.java @@ -100,7 +100,7 @@ public class StorageUtil { try { final Ref refIOException = Ref.create(null); - final Pair pair = loadFile(file); + final Pair pair = loadFile(LocalFileSystem.getInstance().findFileByIoFile(file)); final byte[] text = JDOMUtil.writeParent(element, pair.second).getBytes(CharsetToolkit.UTF8); if (file.exists()) { if (new String(text).equals(pair.first)) return null; @@ -184,17 +184,17 @@ public class StorageUtil { /** * @return pair.first - file contents (null if file does not exist), pair.second - file line separators */ - public static Pair loadFile(@NotNull final IFile file) throws IOException { - if (!file.exists()) return Pair.create(null, SystemProperties.getLineSeparator()); + public static Pair loadFile(@Nullable final VirtualFile file) throws IOException { + if (file == null || !file.exists()) return Pair.create(null, SystemProperties.getLineSeparator()); - String fileText = new String(file.loadBytes(), CharsetToolkit.UTF8); + String fileText = new String(file.contentsToByteArray(), CharsetToolkit.UTF8); final int ndx = fileText.indexOf('\n'); return Pair.create(fileText, ndx == -1 ? SystemProperties.getLineSeparator() - : ndx - 1 >=0 ? fileText.charAt(ndx - 1) == '\r' ? "\r\n" : "\n" : "\n"); + : ndx - 1 >= 0 ? fileText.charAt(ndx - 1) == '\r' ? "\r\n" : "\n" : "\n"); } - public static boolean contentEquals(@NotNull final Document document, @NotNull final IFile file) { + public static boolean contentEquals(@NotNull final Document document, @NotNull final VirtualFile file) { try { final Pair pair = loadFile(file); return pair.first != null && pair.first.equals(printDocumentToString(document, pair.second)); @@ -205,7 +205,7 @@ public class StorageUtil { } } - public static boolean contentEquals(@NotNull final Element element, @NotNull final IFile file) { + public static boolean contentEquals(@NotNull final Element element, @NotNull final VirtualFile file) { try { final Pair pair = loadFile(file); return pair.first != null && pair.first.equals(printElement(element, pair.second)); diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java index 63ddf87e0c60..7e16b694280c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForBaseRevision.java @@ -19,7 +19,7 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.TextRange; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.util.Consumer; @@ -51,7 +51,7 @@ public class TodoForBaseRevision extends TodoForRanges { protected TodoItem[] getTodoItems() { final TodoItem[] items = (TodoItem[])myGetter.get(); if (items != null) return items; - final TodoItem[] todoItems = getTodoForText(PsiSearchHelper.SERVICE.getInstance(myProject)); + final TodoItem[] todoItems = getTodoForText(PsiTodoSearchHelper.SERVICE.getInstance(myProject)); if (todoItems != null) { mySaver.consume(todoItems); } diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java index 5a0f02dae3bc..ae89b44687df 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForExistingFile.java @@ -16,16 +16,14 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiManager; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import java.util.List; @@ -53,7 +51,7 @@ public class TodoForExistingFile extends TodoForRanges { return ApplicationManager.getApplication().runReadAction(new Computable() { @Override public TodoItem[] compute() { - final PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(myProject); + final PsiTodoSearchHelper helper = PsiTodoSearchHelper.SERVICE.getInstance(myProject); PsiFile psiFile = myFile == null ? null : PsiManager.getInstance(myProject).findFile(myFile); if (psiFile != null) { diff --git a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java index a6e65a39fa68..dac706fef5dd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java +++ b/platform/platform-impl/src/com/intellij/openapi/vcs/changes/TodoForRanges.java @@ -26,7 +26,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vcs.checkin.StepIntersection; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; import com.intellij.util.containers.Convertor; @@ -104,7 +104,7 @@ public abstract class TodoForRanges { protected abstract TodoItem[] getTodoItems(); - protected TodoItem[] getTodoForText(PsiSearchHelper helper) { + protected TodoItem[] getTodoForText(PsiTodoSearchHelper helper) { final PsiFile psiFile = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public PsiFile compute() { diff --git a/platform/platform-impl/src/com/intellij/ui/SlideComponent.java b/platform/platform-impl/src/com/intellij/ui/SlideComponent.java index b331220ffd54..5b075f6fd2bf 100644 --- a/platform/platform-impl/src/com/intellij/ui/SlideComponent.java +++ b/platform/platform-impl/src/com/intellij/ui/SlideComponent.java @@ -122,7 +122,8 @@ class SlideComponent extends JComponent { .setTextBg(HintUtil.INFORMATION_COLOR) .setShowImmediately(true); - myTooltipHint.show(this, point.x, point.y, (JComponent)KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), hint); + final Component owner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); + myTooltipHint.show(this, point.x, point.y, owner instanceof JComponent ? (JComponent)owner : null, hint); } else { myTooltipHint.setLocation(new RelativePoint(this, point)); } diff --git a/platform/platform-resources-en/src/messages/CodeInsightBundle.properties b/platform/platform-resources-en/src/messages/CodeInsightBundle.properties index 355e2c4179e8..499bdaaebf18 100644 --- a/platform/platform-resources-en/src/messages/CodeInsightBundle.properties +++ b/platform/platform-resources-en/src/messages/CodeInsightBundle.properties @@ -190,9 +190,10 @@ intention.error.cannot.create.class.message=Cannot Create Class ''{0}'' intention.error.cannot.create.class.title=Failed to Create Class intention.assign.field.from.parameter.text=Assign Parameter to Field ''{0}'' intention.assign.field.from.parameter.family=Assign Parameter to Field -intention.create.field.from.parameter.text=Create Field For Parameter ''{0}'' -intention.create.fields.from.parameters.text=Create Fields For {0} Parameters +intention.create.field.from.parameter.text=Create Field for Parameter ''{0}'' intention.create.field.from.parameter.family=Create Field for Parameter +intention.create.assign.fields.from.parameters.text=Create/Assign Fields from {0} Parameters +intention.create.assign.fields.from.parameters.family=Create/Assign Fields from Parameters intention.implement.abstract.method.searching.for.descendants.progress=Searching For Descendants... intention.implement.abstract.method.error.no.classes.message=There are no classes found where this method can be implemented intention.implement.abstract.method.error.no.classes.title=No Classes Found diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 37b415652433..78eedf74f4ef 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -15,6 +15,9 @@ + + @@ -47,6 +50,8 @@ + + + @@ -296,6 +304,8 @@ + () { - @Override - public boolean process(Object o) { - try { - doAsyncRefreshTest(); - } - catch (Throwable t) { - ex[0] = t; - } - return true; - } - }); + JobLauncher.getInstance().invokeConcurrentlyUnderProgress(Arrays.asList(new Object[8]), ProgressManager.getInstance().getProgressIndicator(), false, + new Processor() { + @Override + public boolean process(Object o) { + try { + doAsyncRefreshTest(); + } + catch (Throwable t) { + ex[0] = t; + } + return true; + } + }); if (ex[0] != null) throw ex[0]; } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/VirtualFilePointerTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/VirtualFilePointerTest.java index 29bd793693db..8cecf5265a11 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/VirtualFilePointerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/impl/VirtualFilePointerTest.java @@ -15,7 +15,7 @@ */ package com.intellij.openapi.vfs.impl; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ex.PathManagerEx; @@ -514,7 +514,7 @@ public class VirtualFilePointerTest extends PlatformLangTestCase { } private static void stressRead(@NotNull final VirtualFilePointer pointer) { - boolean b = JobUtil.invokeConcurrentlyUnderProgress(Collections.nCopies(10, null), null, false, new Processor() { + boolean b = JobLauncher.getInstance().invokeConcurrentlyUnderProgress(Collections.nCopies(10, null), null, false, new Processor() { @Override public boolean process(Object o) { ApplicationManager.getApplication().runReadAction(new Runnable() { diff --git a/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectRootManager.java b/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectRootManager.java index 04503f0e2865..2f6b4204bbff 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectRootManager.java +++ b/platform/projectModel-api/src/com/intellij/openapi/roots/ProjectRootManager.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.roots; +import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; @@ -37,6 +38,8 @@ public abstract class ProjectRootManager implements ModificationTracker { * @return the instance. */ public static ProjectRootManager getInstance(Project project) { + final ProjectRootManager service = ServiceManager.getService(project, ProjectRootManager.class); + if (service != null) return service; return project.getComponent(ProjectRootManager.class); } diff --git a/platform/projectModel-impl/src/com/intellij/core/CoreModule.java b/platform/projectModel-impl/src/com/intellij/core/CoreModule.java index e4d607ee7113..7c5544c7e511 100644 --- a/platform/projectModel-impl/src/com/intellij/core/CoreModule.java +++ b/platform/projectModel-impl/src/com/intellij/core/CoreModule.java @@ -24,6 +24,7 @@ import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.components.impl.ModulePathMacroManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.impl.ModuleEx; +import com.intellij.openapi.module.impl.ModuleScopeProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleExtension; import com.intellij.openapi.roots.ModuleRootManager; @@ -44,6 +45,7 @@ import org.jetbrains.annotations.NotNull; public class CoreModule extends MockComponentManager implements ModuleEx { private String myPath; private final Project myProject; + private final ModuleScopeProvider myModuleScopeProvider; public CoreModule(@NotNull Disposable parentDisposable, Project project, String moduleFilePath) { super(project.getPicoContainer(), parentDisposable); @@ -65,6 +67,11 @@ public class CoreModule extends MockComponentManager implements ModuleEx { VirtualFilePointerManager.getInstance()); getPicoContainer().registerComponentInstance(ModuleRootManager.class, moduleRootManager); getPicoContainer().registerComponentInstance(PathMacroManager.class, new ModulePathMacroManager(PathMacros.getInstance(), this)); + myModuleScopeProvider = createModuleScopeProvider(); + } + + protected ModuleScopeProvider createModuleScopeProvider() { + return new CoreModuleScopeProvider(); } @Override @@ -91,6 +98,11 @@ public class CoreModule extends MockComponentManager implements ModuleEx { public void rename(String newName) { } + @Override + public void clearScopesCache() { + myModuleScopeProvider.clearCache(); + } + @Override public VirtualFile getModuleFile() { throw new UnsupportedOperationException(); @@ -136,51 +148,51 @@ public class CoreModule extends MockComponentManager implements ModuleEx { @Override public GlobalSearchScope getModuleScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleScope(); } @Override public GlobalSearchScope getModuleScope(boolean includeTests) { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleScope(includeTests); } @Override public GlobalSearchScope getModuleWithLibrariesScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleWithLibrariesScope(); } @Override public GlobalSearchScope getModuleWithDependenciesScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleWithDependenciesScope(); } @Override public GlobalSearchScope getModuleContentScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleContentScope(); } @Override public GlobalSearchScope getModuleContentWithDependenciesScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleContentWithDependenciesScope(); } @Override public GlobalSearchScope getModuleWithDependenciesAndLibrariesScope(boolean includeTests) { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleWithDependenciesAndLibrariesScope(includeTests); } @Override public GlobalSearchScope getModuleWithDependentsScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleWithDependentsScope(); } @Override public GlobalSearchScope getModuleTestsWithDependentsScope() { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleTestsWithDependentsScope(); } @Override public GlobalSearchScope getModuleRuntimeScope(boolean includeTests) { - throw new UnsupportedOperationException(); + return myModuleScopeProvider.getModuleRuntimeScope(includeTests); } } diff --git a/platform/projectModel-impl/src/com/intellij/core/CoreModuleManager.java b/platform/projectModel-impl/src/com/intellij/core/CoreModuleManager.java index 28c41bac4e1f..59751192abc3 100644 --- a/platform/projectModel-impl/src/com/intellij/core/CoreModuleManager.java +++ b/platform/projectModel-impl/src/com/intellij/core/CoreModuleManager.java @@ -18,6 +18,7 @@ package com.intellij.core; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.StateStorageException; import com.intellij.openapi.components.impl.stores.StorageData; +import com.intellij.openapi.module.Module; import com.intellij.openapi.module.impl.ModuleEx; import com.intellij.openapi.module.impl.ModuleManagerImpl; import com.intellij.openapi.project.Project; @@ -49,7 +50,7 @@ public class CoreModuleManager extends ModuleManagerImpl { @Override protected ModuleEx createAndLoadModule(String filePath) throws IOException { - final CoreModule module = new CoreModule(myParentDisposable, myProject, filePath); + final ModuleEx module = createModule(filePath); VirtualFile vFile = StandardFileSystems.local().findFileByPath(filePath); try { StorageData storageData = CoreProjectLoader.loadStorageFile(module, vFile); @@ -73,4 +74,8 @@ public class CoreModuleManager extends ModuleManagerImpl { public void loadModules() { loadModules(myModuleModel); } + + protected Disposable getLifetime() { + return myParentDisposable; + } } diff --git a/platform/projectModel-impl/src/com/intellij/core/CoreModuleScopeProvider.java b/platform/projectModel-impl/src/com/intellij/core/CoreModuleScopeProvider.java new file mode 100644 index 000000000000..aeafc197aed5 --- /dev/null +++ b/platform/projectModel-impl/src/com/intellij/core/CoreModuleScopeProvider.java @@ -0,0 +1,82 @@ +/* + * Copyright 2000-2012 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.core; + +import com.intellij.openapi.module.impl.ModuleScopeProvider; +import com.intellij.psi.search.GlobalSearchScope; + +/** + * Author: dmitrylomov + */ +public class CoreModuleScopeProvider implements ModuleScopeProvider { + public CoreModuleScopeProvider() { + } + + @Override + public GlobalSearchScope getModuleScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleScope(boolean includeTests) { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleWithLibrariesScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleWithDependenciesScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleContentScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleContentWithDependenciesScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleWithDependenciesAndLibrariesScope(boolean includeTests) { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleWithDependentsScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleTestsWithDependentsScope() { + throw new UnsupportedOperationException(); + } + + @Override + public GlobalSearchScope getModuleRuntimeScope(boolean includeTests) { + throw new UnsupportedOperationException(); + } + + @Override + public void clearCache() { + throw new UnsupportedOperationException(); + } +} diff --git a/platform/projectModel-impl/src/com/intellij/core/CoreProjectLoader.java b/platform/projectModel-impl/src/com/intellij/core/CoreProjectLoader.java index 3e0319b3522a..dc6465e44bf2 100644 --- a/platform/projectModel-impl/src/com/intellij/core/CoreProjectLoader.java +++ b/platform/projectModel-impl/src/com/intellij/core/CoreProjectLoader.java @@ -29,7 +29,6 @@ import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.io.fs.FileSystem; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; @@ -77,8 +76,7 @@ public class CoreProjectLoader { VirtualFile libraries = dotIdea.findChild("libraries"); if (libraries != null) { DirectoryStorageData data = new DirectoryStorageData(); - data.loadFrom(FileSystem.FILE_SYSTEM.createFile(libraries.getPath()), - PathMacroManager.getInstance(project).createTrackingSubstitutor()); + data.loadFrom(libraries, PathMacroManager.getInstance(project).createTrackingSubstitutor()); final Element libraryTable = data.getMergedState("libraryTable", Element.class, new ProjectLibraryTable.LibraryStateSplitter(), null); ((LibraryTableBase) ProjectLibraryTable.getInstance(project)).loadState(libraryTable); } diff --git a/platform/projectModel-impl/src/com/intellij/core/ProjectModel.java b/platform/projectModel-impl/src/com/intellij/core/ProjectModel.java new file mode 100644 index 000000000000..5ace583e7d7f --- /dev/null +++ b/platform/projectModel-impl/src/com/intellij/core/ProjectModel.java @@ -0,0 +1,123 @@ +/* + * Copyright 2000-2012 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.core; + +import com.intellij.application.options.PathMacrosImpl; +import com.intellij.mock.MockProject; +import com.intellij.openapi.application.PathMacroFilter; +import com.intellij.openapi.application.PathMacros; +import com.intellij.openapi.components.ExtensionAreas; +import com.intellij.openapi.components.PathMacroManager; +import com.intellij.openapi.components.impl.ProjectPathMacroManager; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.fileTypes.FileTypeRegistry; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.ProjectJdkTable; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.ProjectExtension; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.impl.*; +import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable; +import com.intellij.openapi.roots.impl.libraries.LibraryTablesRegistrarImpl; +import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; +import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; + +/** + * @author yole + */ +public class ProjectModel { + + public static class InitApplicationEnvironment { + protected final CoreApplicationEnvironment myApplicationEnvironment; + public InitApplicationEnvironment(CoreApplicationEnvironment env) { + myApplicationEnvironment = env; + Extensions.registerAreaClass(ExtensionAreas.IDEA_MODULE, null); + CoreApplicationEnvironment.registerApplicationExtensionPoint(OrderRootType.EP_NAME, OrderRootType.class); + CoreApplicationEnvironment.registerApplicationExtensionPoint(SdkFinder.EP_NAME, SdkFinder.class); + CoreApplicationEnvironment.registerApplicationExtensionPoint(PathMacroFilter.EP_NAME, PathMacroFilter.class); + env.registerApplicationComponent(PathMacros.class, createPathMacros()); + env.getApplication().registerService(ProjectJdkTable.class, createProjectJdkTable()); + env.getApplication().registerService(ApplicationLibraryTable.class, createApplicationLibraryTable()); + env.getApplication().registerService(LibraryTablesRegistrar.class, createLibraryTablesRegistar()); + } + + protected PathMacros createPathMacros() { + return new PathMacrosImpl(); + } + + protected LibraryTablesRegistrar createLibraryTablesRegistar() { + return new LibraryTablesRegistrarImpl(); + } + + protected ApplicationLibraryTable createApplicationLibraryTable() { + return new ApplicationLibraryTable(); + } + + protected ProjectJdkTable createProjectJdkTable() { + return new CoreProjectJdkTable(); + } + } + + public static class InitProjectEnvironment { + protected final CoreProjectEnvironment myProjectEnvironment; + protected final Project myProject; + + public InitProjectEnvironment(CoreProjectEnvironment env) { + myProjectEnvironment = env; + final MockProject project = env.getProject(); + myProject = project; + + env.registerProjectExtensionPoint(DirectoryIndexExcludePolicy.EP_NAME, DirectoryIndexExcludePolicy.class); + env.registerProjectExtensionPoint(ProjectExtension.EP_NAME, ProjectExtension.class); + + env.registerProjectComponent(ModuleManager.class, createModuleManager()); + env.registerProjectComponent(PathMacroManager.class, createProjectPathMacroManager()); + DirectoryIndex index = createDirectoryIndex(); + //env.registerProjectComponent(DirectoryIndex.class, index); + project.registerService(DirectoryIndex.class, index); + env.registerProjectComponent(ProjectRootManager.class, createProjectRootManager(index)); + project.registerService(ProjectLibraryTable.class, createProjectLibraryTable()); + project.registerService(ProjectFileIndex.class, createProjectFileIndex(index)); + } + + protected ProjectFileIndexImpl createProjectFileIndex(DirectoryIndex index) { + return new ProjectFileIndexImpl(myProject, index, FileTypeRegistry.getInstance()); + } + + protected ProjectLibraryTable createProjectLibraryTable() { + return new ProjectLibraryTable(); + } + + protected ProjectRootManager createProjectRootManager(DirectoryIndex index) { + return new ProjectRootManagerImpl(myProject, index); + } + + protected DirectoryIndex createDirectoryIndex() { + return new DirectoryIndexImpl(myProject); + } + + private ProjectPathMacroManager createProjectPathMacroManager() { + return new ProjectPathMacroManager(PathMacros.getInstance(), myProject); + } + + protected ModuleManager createModuleManager() { + return new CoreModuleManager(myProject, myProjectEnvironment.getParentDisposable()); + } + + } +} diff --git a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java deleted file mode 100644 index e08d13d298c9..000000000000 --- a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2000-2012 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.core; - -import com.intellij.application.options.PathMacrosImpl; -import com.intellij.mock.MockProject; -import com.intellij.openapi.application.PathMacroFilter; -import com.intellij.openapi.application.PathMacros; -import com.intellij.openapi.components.ExtensionAreas; -import com.intellij.openapi.components.PathMacroManager; -import com.intellij.openapi.components.impl.ProjectPathMacroManager; -import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.fileTypes.FileTypeRegistry; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.projectRoots.ProjectJdkTable; -import com.intellij.openapi.roots.OrderRootType; -import com.intellij.openapi.roots.ProjectExtension; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.roots.impl.*; -import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable; -import com.intellij.openapi.roots.impl.libraries.LibraryTablesRegistrarImpl; -import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; -import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; - -/** - * @author yole - */ -public class ProjectModelEnvironment { - public static void registerApplicationEnvironment(CoreApplicationEnvironment env) { - Extensions.registerAreaClass(ExtensionAreas.IDEA_MODULE, null); - PathMacrosImpl pathMacros = new PathMacrosImpl(); - env.registerApplicationComponent(PathMacros.class, pathMacros); - CoreApplicationEnvironment.registerApplicationExtensionPoint(OrderRootType.EP_NAME, OrderRootType.class); - CoreApplicationEnvironment.registerApplicationExtensionPoint(SdkFinder.EP_NAME, SdkFinder.class); - CoreApplicationEnvironment.registerApplicationExtensionPoint(PathMacroFilter.EP_NAME, PathMacroFilter.class); - env.getApplication().registerService(ProjectJdkTable.class, new CoreProjectJdkTable()); - env.getApplication().registerService(ApplicationLibraryTable.class, new ApplicationLibraryTable()); - env.getApplication().registerService(LibraryTablesRegistrar.class, new LibraryTablesRegistrarImpl()); - } - - public static void registerProjectEnvironment(CoreProjectEnvironment env) { - final MockProject project = env.getProject(); - env.registerProjectComponent(ModuleManager.class, new CoreModuleManager(project, env.getParentDisposable())); - env.registerProjectComponent(PathMacroManager.class, new ProjectPathMacroManager(PathMacros.getInstance(), project)); - env.registerProjectExtensionPoint(DirectoryIndexExcludePolicy.EP_NAME, DirectoryIndexExcludePolicy.class); - env.registerProjectExtensionPoint(ProjectExtension.EP_NAME, ProjectExtension.class); - DirectoryIndex index = new DirectoryIndexImpl(project); - //env.registerProjectComponent(DirectoryIndex.class, index); - project.registerService(DirectoryIndex.class, index); - env.registerProjectComponent(ProjectRootManager.class, new ProjectRootManagerImpl(project, index)); - project.registerService(ProjectLibraryTable.class, new ProjectLibraryTable()); - project.registerService(ProjectFileIndex.class, new ProjectFileIndexImpl(project, index, FileTypeRegistry.getInstance())); - } -} diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index 7df0aeeecc55..b189459bb466 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -49,10 +49,14 @@ public class BasePathMacroManager extends PathMacroManager { if (f == null) return; addFileHierarchyReplacements(result, f.getParent(), macro + "/.."); - final String path = FileUtil.toSystemIndependentName(f.getPath()); - String s = macro; - if (StringUtil.endsWithChar(path, '/')) s += "/"; - result.put(s, path); + final String path = FileUtil.toSystemIndependentName(f.getCanonicalPath()); + if (StringUtil.endsWithChar(path, '/')) { + result.put(macro + "/", path); + result.put(macro, path.substring(0, path.length()-1)); + } + else { + result.put(macro, path); + } } protected static void addFileHierarchyReplacements(ReplacePathToMacroMap result, String macroName, @Nullable String path, @Nullable String stopAt) { @@ -64,17 +68,14 @@ public class BasePathMacroManager extends PathMacroManager { while (dir != null && dir.getParent() != null) { path = dir.getPath(); - String s = macro; - if (StringUtil.endsWithChar(path, '/')) s += "/"; - - putIfAbsent(result, "file:" + path, "file:" + s, check); - putIfAbsent(result, "file:/" + path, "file:/" + s, check); - putIfAbsent(result, "file://" + path, "file://" + s, check); - putIfAbsent(result, "jar:" + path, "jar:" + s, check); - putIfAbsent(result, "jar:/" + path, "jar:/" + s, check); - putIfAbsent(result, "jar://" + path, "jar://" + s, check); + putIfAbsent(result, "file:" + path, "file:" + macro, check); + putIfAbsent(result, "file:/" + path, "file:/" + macro, check); + putIfAbsent(result, "file://" + path, "file://" + macro, check); + putIfAbsent(result, "jar:" + path, "jar:" + macro, check); + putIfAbsent(result, "jar:/" + path, "jar:/" + macro, check); + putIfAbsent(result, "jar://" + path, "jar://" + macro, check); if (!path.equalsIgnoreCase("e:/") && !path.equalsIgnoreCase("r:/") && !path.equalsIgnoreCase("p:/")) { - putIfAbsent(result, path, s, check); + putIfAbsent(result, path, macro, check); } if (dir.getPath().equals(stopAt)) { @@ -87,6 +88,22 @@ public class BasePathMacroManager extends PathMacroManager { } } + private static void putIfAbsent(final ReplacePathToMacroMap result, + @NonNls final String pathWithPrefix, + @NonNls final String substitutionWithPrefix, + final boolean check) { + if (check && result.get(pathWithPrefix) != null) + return; + + if (StringUtil.endsWithChar(pathWithPrefix, '/')) { + result.put(pathWithPrefix, substitutionWithPrefix + "/"); + result.put(pathWithPrefix.substring(0, pathWithPrefix.length()-1), substitutionWithPrefix); + } + else { + result.put(pathWithPrefix, substitutionWithPrefix); + } + } + protected ExpandMacroToPathMap getExpandMacroMap() { ExpandMacroToPathMap result = new ExpandMacroToPathMap(); for (Map.Entry entry : PathMacrosImpl.getGlobalSystemMacros().entrySet()) { @@ -137,14 +154,6 @@ public class BasePathMacroManager extends PathMacroManager { return myPathMacros; } - protected static void putIfAbsent(final ReplacePathToMacroMap result, - @NonNls final String pathWithPrefix, - @NonNls final String substitutionWithPrefix, - final boolean check) { - if (check && result.get(pathWithPrefix) != null) return; - result.put(pathWithPrefix, substitutionWithPrefix); - } - private class MyTrackingPathMacroSubstitutor implements TrackingPathMacroSubstitutor { private final Map> myMacroToComponentNames = new FactoryMap>() { @Override diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DirectoryStorageData.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DirectoryStorageData.java index 3f3dec981d85..5ad062e547d4 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DirectoryStorageData.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DirectoryStorageData.java @@ -21,7 +21,9 @@ import com.intellij.openapi.components.TrackingPathMacroSubstitutor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PairConsumer; +import com.intellij.util.io.fs.FileSystem; import com.intellij.util.io.fs.IFile; import gnu.trove.THashMap; import org.jdom.Document; @@ -45,20 +47,19 @@ public class DirectoryStorageData { return myStates.keySet(); } - public void loadFrom(IFile dir, TrackingPathMacroSubstitutor pathMacroSubstitutor) { - if (!dir.exists()) { + public void loadFrom(final @Nullable VirtualFile dir, TrackingPathMacroSubstitutor pathMacroSubstitutor) { + if (dir == null || !dir.exists()) { return; } - final IFile[] files = dir.listFiles(); - for (IFile file : files) { + for (VirtualFile file : dir.getChildren()) { if (!StringUtil.endsWithIgnoreCase(file.getName(), ".xml")) { //do not load system files like .DS_Store on Mac continue; } try { - final Document document = JDOMUtil.loadDocument(file); + final Document document = JDOMUtil.loadDocument(file.contentsToByteArray()); final Element element = document.getRootElement(); assert element.getName().equals(StorageData.COMPONENT); @@ -72,7 +73,7 @@ public class DirectoryStorageData { pathMacroSubstitutor.addUnknownMacros(componentName, unknownMacros); } - put(componentName, file, element, true); + put(componentName, FileSystem.FILE_SYSTEM.createFile(file.getCanonicalPath()), element, true); } catch (IOException e) { LOG.info("Unable to load state", e); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleEx.java b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleEx.java index 4c650d007291..77f1d7ef888b 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleEx.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleEx.java @@ -27,4 +27,6 @@ public interface ModuleEx extends Module { void projectOpened(); void projectClosed(); void rename(String newName); + + void clearScopesCache(); } diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformCodeInsightTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformCodeInsightTestCase.java index 3edb127b33a7..15aab99d6495 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformCodeInsightTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformCodeInsightTestCase.java @@ -46,7 +46,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.impl.source.PostprocessReformattingAspect; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.rt.execution.junit.FileComparisonFailure; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -225,7 +225,7 @@ public abstract class LightPlatformCodeInsightTestCase extends LightPlatformTest } private static void setupEditorForInjectedLanguage() { - Editor editor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, myFile); + Editor editor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(myEditor, myFile); if (editor instanceof EditorWindow) { myFile = ((EditorWindow)editor).getInjectedFile(); myEditor = editor; @@ -444,13 +444,13 @@ public abstract class LightPlatformCodeInsightTestCase extends LightPlatformTest return myEditor; } if (dataId.equals(AnActionEvent.injectedId(PlatformDataKeys.EDITOR.getName()))) { - return InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(getEditor(), getFile()); + return InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(getEditor(), getFile()); } if (LangDataKeys.PSI_FILE.is(dataId)) { return myFile; } if (dataId.equals(AnActionEvent.injectedId(LangDataKeys.PSI_FILE.getName()))) { - Editor editor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(getEditor(), getFile()); + Editor editor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(getEditor(), getFile()); return editor instanceof EditorWindow ? ((EditorWindow)editor).getInjectedFile() : getFile(); } return super.getData(dataId); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 7e8b2360c90c..e017c1790cc6 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -95,7 +95,7 @@ import com.intellij.psi.impl.cache.CacheManager; import com.intellij.psi.impl.cache.impl.todo.TodoIndex; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.PsiFileImpl; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.statistics.StatisticsManager; @@ -955,7 +955,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig @Nullable protected Editor getCompletionEditor() { - return InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(myEditor, myFile); + return InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(myEditor, myFile); } @Override diff --git a/platform/util/src/com/intellij/openapi/util/JDOMUtil.java b/platform/util/src/com/intellij/openapi/util/JDOMUtil.java index 4c2f350679c1..8ee4efaebb1f 100644 --- a/platform/util/src/com/intellij/openapi/util/JDOMUtil.java +++ b/platform/util/src/com/intellij/openapi/util/JDOMUtil.java @@ -312,6 +312,18 @@ public class JDOMUtil { return getSaxBuilder().build(new CharArrayReader(chars, 0, length)); } + @NotNull + public static Document loadDocument(byte[] bytes) throws IOException, JDOMException { + final ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); + try { + return loadDocument(inputStream); + } + finally { + inputStream.close(); + } + + } + private static SAXBuilder getSaxBuilder() { SoftReference reference = ourSaxBuilder.get(); SAXBuilder saxBuilder = reference != null ? reference.get() : null; diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java index 527047d63270..a75f9185bf3e 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/TodoUtil.java @@ -18,7 +18,7 @@ package com.siyeh.ig.maturity; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiFile; -import com.intellij.psi.search.PsiSearchHelper; +import com.intellij.psi.search.PsiTodoSearchHelper; import com.intellij.psi.search.TodoItem; public class TodoUtil { @@ -28,7 +28,7 @@ public class TodoUtil { public static boolean isTodoComment(PsiComment comment) { final PsiFile file = comment.getContainingFile(); - final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(comment.getProject()); + final PsiTodoSearchHelper searchHelper = PsiTodoSearchHelper.SERVICE.getInstance(comment.getProject()); final TodoItem[] todoItems = searchHelper.findTodoItems(file); for (final TodoItem todoItem : todoItems) { final TextRange commentTextRange = comment.getTextRange(); diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/EditInjectionSettingsAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/EditInjectionSettingsAction.java index cc97dfd8c000..ee119a8a08e1 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/EditInjectionSettingsAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/EditInjectionSettingsAction.java @@ -26,7 +26,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.FileContentUtil; import com.intellij.util.IncorrectOperationException; import org.intellij.plugins.intelliLang.Configuration; @@ -53,7 +53,7 @@ public class EditInjectionSettingsAction implements IntentionAction, LowPriority public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { final int offset = editor.getCaretModel().getOffset(); - final PsiFile psiFile = InjectedLanguageUtil.findInjectedPsiNoCommit(file, offset); + final PsiFile psiFile = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(file, offset); if (psiFile == null) return false; final LanguageInjectionSupport support = psiFile.getUserData(LanguageInjectionSupport.SETTINGS_EDITOR); return support != null; @@ -68,7 +68,7 @@ public class EditInjectionSettingsAction implements IntentionAction, LowPriority } private static void invokeImpl(Project project, Editor editor, PsiFile file) { - final PsiFile psiFile = InjectedLanguageUtil.findInjectedPsiNoCommit(file, editor.getCaretModel().getOffset()); + final PsiFile psiFile = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(file, editor.getCaretModel().getOffset()); if (psiFile == null) return; final PsiLanguageInjectionHost host = InjectedLanguageManager.getInstance(project).getInjectionHost(psiFile); if (host == null) return; diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java index 4e916bb7d050..ff564b8899f7 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java @@ -16,6 +16,7 @@ package org.intellij.plugins.intelliLang.inject; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.ui.ListCellRendererWrapper; import com.intellij.injected.editor.EditorWindow; import com.intellij.lang.Language; @@ -31,7 +32,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.ui.components.JBList; import com.intellij.util.FileContentUtil; @@ -65,7 +65,7 @@ public class InjectLanguageAction implements IntentionAction { public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { final PsiLanguageInjectionHost host = findInjectionHost(editor, file); if (host == null) return false; - final List> injectedPsi = InjectedLanguageUtil.getInjectedPsiFiles(host); + final List> injectedPsi = InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(host); return injectedPsi == null || injectedPsi.isEmpty(); } diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java index 83a6b160497a..3829287efc27 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java @@ -28,7 +28,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.FileContentUtil; import com.intellij.util.IncorrectOperationException; import gnu.trove.THashSet; @@ -55,7 +55,7 @@ public class UnInjectLanguageAction implements IntentionAction, LowPriorityActio public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { final int offset = editor.getCaretModel().getOffset(); - final PsiFile psiFile = InjectedLanguageUtil.findInjectedPsiNoCommit(file, offset); + final PsiFile psiFile = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(file, offset); if (psiFile == null) return false; final LanguageInjectionSupport support = psiFile.getUserData(LanguageInjectionSupport.INJECTOR_SUPPORT); return support != null; @@ -70,7 +70,7 @@ public class UnInjectLanguageAction implements IntentionAction, LowPriorityActio } private static void invokeImpl(Project project, Editor editor, PsiFile file) { - final PsiFile psiFile = InjectedLanguageUtil.findInjectedPsiNoCommit(file, editor.getCaretModel().getOffset()); + final PsiFile psiFile = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(file, editor.getCaretModel().getOffset()); if (psiFile == null) return; final PsiLanguageInjectionHost host = InjectedLanguageManager.getInstance(project).getInjectionHost(psiFile); if (host == null) return; @@ -88,7 +88,7 @@ public class UnInjectLanguageAction implements IntentionAction, LowPriorityActio private static boolean defaultFunctionalityWorked(final PsiLanguageInjectionHost host) { final THashSet languages = new THashSet(); - final List> files = InjectedLanguageUtil.getInjectedPsiFiles(host); + final List> files = InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(host); if (files == null) return false; for (Pair pair : files) { for (Language lang = pair.first.getLanguage(); lang != null; lang = lang.getBaseLanguage()) { diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/comment/CommentOnLineWithSourcePredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/comment/CommentOnLineWithSourcePredicate.java index a76a86fedbbe..ed366ec1b1ef 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/comment/CommentOnLineWithSourcePredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/comment/CommentOnLineWithSourcePredicate.java @@ -16,7 +16,7 @@ package com.siyeh.ipp.comment; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; @@ -37,7 +37,7 @@ class CommentOnLineWithSourcePredicate implements PsiElementPredicate { } final PsiComment comment = (PsiComment)element; - if (comment instanceof PsiLanguageInjectionHost && InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)comment)) { + if (comment instanceof PsiLanguageInjectionHost && InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)comment)) { return false; } final IElementType type = comment.getTokenType(); diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java index 6dd95b4453e5..8ee2e1496769 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java +++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java @@ -33,6 +33,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.Border; import javax.swing.event.DocumentEvent; import java.awt.*; import java.awt.event.*; @@ -46,6 +47,10 @@ public class ResourceEditor extends PropertyEditor { private final ResourceType[] myTypes; private ComponentWithBrowseButton myEditor; protected RadComponent myRootComponent; + private JCheckBox myCheckBox; + private final Border myCheckBoxBorder = new JTextField().getBorder(); + private boolean myIgnoreCheckBoxValue; + private String myBooleanResourceValue; public ResourceEditor(Set formats, String[] values) { this(convertTypes(formats), formats, values); @@ -54,7 +59,25 @@ public class ResourceEditor extends PropertyEditor { public ResourceEditor(ResourceType[] types, Set formats, String[] values) { myTypes = types; - if (formats.contains(AttributeFormat.Enum) || formats.contains(AttributeFormat.Boolean)) { + if (formats.contains(AttributeFormat.Boolean)) { + myCheckBox = new JCheckBox(); + myEditor = new ComponentWithBrowseButton(myCheckBox, null) { + @Override + public Dimension getPreferredSize() { + return getComponentPreferredSize(); + } + }; + myCheckBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (!myIgnoreCheckBoxValue) { + myBooleanResourceValue = null; + fireValueCommitted(true, true); + } + } + }); + } + else if (formats.contains(AttributeFormat.Enum)) { ComboboxWithBrowseButton editor = new ComboboxWithBrowseButton() { @Override public Dimension getPreferredSize() { @@ -172,16 +195,44 @@ public class ResourceEditor extends PropertyEditor { @Override public JComponent getComponent(@NotNull RadComponent rootComponent, @Nullable RadComponent component, - Object value, + Object object, @Nullable InplaceContext inplaceContext) { myRootComponent = rootComponent; + String value = (String)object; JTextField text = getComboText(); - text.setText((String)value); - if (inplaceContext != null) { - text.setColumns(0); - if (inplaceContext.isStartChar()) { - text.setText(inplaceContext.getText(text.getText())); + if (text == null) { + if (StringUtil.isEmpty(value) || value.equals("true") || value.equals("false")) { + myBooleanResourceValue = null; + } + else { + myBooleanResourceValue = value; + } + + try { + myIgnoreCheckBoxValue = true; + myCheckBox.setSelected(Boolean.parseBoolean(value)); + } + finally { + myIgnoreCheckBoxValue = false; + } + + if (inplaceContext == null) { + myEditor.setBorder(null); + myCheckBox.setText(null); + } + else { + myEditor.setBorder(myCheckBoxBorder); + myCheckBox.setText(myBooleanResourceValue); + } + } + else { + text.setText(value); + if (inplaceContext != null) { + text.setColumns(0); + if (inplaceContext.isStartChar()) { + text.setText(inplaceContext.getText(text.getText())); + } } } return myEditor; @@ -189,12 +240,17 @@ public class ResourceEditor extends PropertyEditor { @Override public JComponent getPreferredFocusedComponent() { - return getComboText(); + JTextField text = getComboText(); + return text == null ? myCheckBox : text; } @Override public Object getValue() throws Exception { - String value = getComboText().getText(); + JTextField text = getComboText(); + if (text == null) { + return myBooleanResourceValue == null ? Boolean.toString(myCheckBox.isSelected()) : myBooleanResourceValue; + } + String value = text.getText(); return value == StringsComboEditor.UNSET || StringUtil.isEmpty(value) ? null : value; } @@ -211,11 +267,21 @@ public class ResourceEditor extends PropertyEditor { if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { setValue(dialog.getResourceName()); } + else if (myBooleanResourceValue != null) { + fireEditingCancelled(); + } } protected final void setValue(String value) { - getComboText().setText(value); - fireValueCommitted(true, true); + JTextField text = getComboText(); + if (text == null) { + myBooleanResourceValue = value; + fireValueCommitted(false, true); + } + else { + text.setText(value); + fireValueCommitted(true, true); + } } private JTextField getComboText() { @@ -223,7 +289,10 @@ public class ResourceEditor extends PropertyEditor { if (component instanceof JTextField) { return (JTextField)component; } - JComboBox combo = (JComboBox)component; - return (JTextField)combo.getEditor().getEditorComponent(); + if (component instanceof JComboBox) { + JComboBox combo = (JComboBox)component; + return (JTextField)combo.getEditor().getEditorComponent(); + } + return null; } } \ No newline at end of file diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/renderers/ResourceRenderer.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/renderers/ResourceRenderer.java index 6fdf76ee4e70..0f434e493cc0 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/renderers/ResourceRenderer.java +++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/renderers/ResourceRenderer.java @@ -60,7 +60,6 @@ public class ResourceRenderer implements PropertyRenderer { String value = (String)object; if (myBooleanRenderer != null && (StringUtil.isEmpty(value) || "false".equals(value) || "true".equals(value))) { - myBooleanRenderer.setText(value); return myBooleanRenderer.getComponent(component, "true".equals(value), selected, hasFocus); } diff --git a/plugins/android/src/org/jetbrains/android/augment/AndroidLightClass.java b/plugins/android/src/org/jetbrains/android/augment/AndroidLightClass.java index 51f02ddcd4d5..31bd51fdd5fd 100644 --- a/plugins/android/src/org/jetbrains/android/augment/AndroidLightClass.java +++ b/plugins/android/src/org/jetbrains/android/augment/AndroidLightClass.java @@ -27,7 +27,7 @@ import java.util.List; /** * @author Eugene.Kudelevsky */ -public abstract class AndroidLightClass extends LightElement implements PsiClass, SyntheticElement { +abstract class AndroidLightClass extends LightElement implements PsiClass, SyntheticElement { private final PsiClass myContainingClass; protected final String myName; @@ -42,6 +42,26 @@ public abstract class AndroidLightClass extends LightElement implements PsiClass return "AndroidRClass"; } + @Override + public void checkAdd(@NotNull PsiElement element) throws IncorrectOperationException { + throw new IncorrectOperationException("Cannot add elements to R class"); + } + + @Override + public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException { + return myContainingClass.add(element); + } + + @Override + public PsiElement addBefore(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + return myContainingClass.addBefore(element, anchor); + } + + @Override + public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { + return myContainingClass.addAfter(element, anchor); + } + @Override public String getQualifiedName() { return myContainingClass.getQualifiedName() + '.' + myName; diff --git a/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java b/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java index dfb8d14d6bf4..bc8927520257 100644 --- a/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java +++ b/plugins/android/src/org/jetbrains/android/augment/AndroidLightField.java @@ -1,5 +1,6 @@ package org.jetbrains.android.augment; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiType; @@ -14,11 +15,11 @@ import org.jetbrains.annotations.Nullable; * @author Eugene.Kudelevsky */ class AndroidLightField extends LightFieldBuilder { - private final AndroidLightClass myContext; + private final PsiClass myContext; private final PsiType myType; public AndroidLightField(@NotNull String name, - @NotNull AndroidLightClass context, + @NotNull PsiClass context, @NotNull PsiType type) { super(name, type, context); myContext = context; diff --git a/plugins/android/src/org/jetbrains/android/augment/AndroidPsiAugmentProvider.java b/plugins/android/src/org/jetbrains/android/augment/AndroidPsiAugmentProvider.java index d7a9a153bc98..117713c57c0f 100644 --- a/plugins/android/src/org/jetbrains/android/augment/AndroidPsiAugmentProvider.java +++ b/plugins/android/src/org/jetbrains/android/augment/AndroidPsiAugmentProvider.java @@ -1,9 +1,14 @@ package org.jetbrains.android.augment; +import com.android.resources.ResourceType; +import com.intellij.openapi.project.DumbService; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; import com.intellij.psi.PsiFile; import com.intellij.psi.augment.PsiAugmentProvider; +import com.intellij.psi.impl.source.PsiExtensibleClass; +import com.intellij.util.containers.HashSet; import org.jetbrains.android.dom.converters.ResourceReferenceConverter; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidResourceUtil; @@ -20,18 +25,14 @@ public class AndroidPsiAugmentProvider extends PsiAugmentProvider { @NotNull @Override public List getAugments(@NotNull PsiElement element, @NotNull Class type) { - if (type != PsiClass.class || - !(element instanceof PsiClass)) { + if ((type != PsiClass.class && type != PsiField.class) || + !(element instanceof PsiExtensibleClass) || + DumbService.isDumb(element.getProject())) { return Collections.emptyList(); } - final PsiClass aClass = (PsiClass)element; + final PsiExtensibleClass aClass = (PsiExtensibleClass)element; final String className = aClass.getName(); - if (!AndroidUtils.R_CLASS_NAME.equals(className) && - !AndroidUtils.MANIFEST_CLASS_NAME.equals(className)) { - return Collections.emptyList(); - } - final AndroidFacet facet = AndroidFacet.getInstance(element); if (facet == null) { return Collections.emptyList(); @@ -42,20 +43,70 @@ public class AndroidPsiAugmentProvider extends PsiAugmentProvider { return Collections.emptyList(); } - if (AndroidResourceUtil.isRJavaFile(facet, containingFile)) { - final Set types = ResourceReferenceConverter.getResourceTypesInCurrentModule(facet); - final List result = new ArrayList(types.size()); + if (type == PsiClass.class) { + if (AndroidUtils.R_CLASS_NAME.equals(className) && + AndroidResourceUtil.isRJavaFile(facet, containingFile)) { + final Set existingInnerClasses = getOwnInnerClasses(aClass); + final Set types = ResourceReferenceConverter.getResourceTypesInCurrentModule(facet); + final List result = new ArrayList(); - for (String resType : types) { - final AndroidLightClass resClass = new ResourceTypeClass(facet, resType, aClass); - result.add((Psi)resClass); + for (String resType : types) { + if (!existingInnerClasses.contains(resType)) { + final AndroidLightClass resClass = new ResourceTypeClass(facet, resType, aClass); + result.add((Psi)resClass); + } + } + return result; + } + else if (AndroidUtils.MANIFEST_CLASS_NAME.equals(className) && + AndroidResourceUtil.isManifestJavaFile(facet, containingFile)) { + return Arrays.asList((Psi)new PermissionClass(facet, aClass), + (Psi)new PermissionGroupClass(facet, aClass)); } - return result; } - else if (AndroidResourceUtil.isManifestJavaFile(facet, containingFile)) { - return Arrays.asList((Psi)new PermissionClass(facet, aClass), - (Psi)new PermissionGroupClass(facet, aClass)); + else if (type == PsiField.class && !(aClass instanceof AndroidLightClass)) { + // extend existing inner classes, not provided by this augment (ex. they can be generated by maven) + final PsiClass parentClass = aClass.getContainingClass(); + + if (parentClass != null && + AndroidUtils.R_CLASS_NAME.equals(parentClass.getName()) && + AndroidResourceUtil.isRJavaFile(facet, containingFile)) { + final String resClassName = aClass.getName(); + + if (resClassName != null && ResourceType.getEnum(resClassName) != null) { + final Set existingFields = getOwnFields(aClass); + final PsiField[] newFields = ResourceTypeClass.buildResourceFields(facet, resClassName, aClass); + final List result = new ArrayList(); + + for (PsiField field : newFields) { + if (!existingFields.contains(field.getName())) { + result.add((Psi)field); + } + } + return result; + } + } } return Collections.emptyList(); } + + @NotNull + private static Set getOwnInnerClasses(@NotNull PsiExtensibleClass aClass) { + final Set result = new HashSet(); + + for (PsiClass innerClass : aClass.getOwnInnerClasses()) { + result.add(innerClass.getName()); + } + return result; + } + + @NotNull + private static Set getOwnFields(@NotNull PsiExtensibleClass aClass) { + final Set result = new HashSet(); + + for (PsiField field : aClass.getOwnFields()) { + result.add(field.getName()); + } + return result; + } } diff --git a/plugins/android/src/org/jetbrains/android/augment/PermissionGroupClass.java b/plugins/android/src/org/jetbrains/android/augment/PermissionGroupClass.java index ff90a1899e08..51de2aeaa745 100644 --- a/plugins/android/src/org/jetbrains/android/augment/PermissionGroupClass.java +++ b/plugins/android/src/org/jetbrains/android/augment/PermissionGroupClass.java @@ -14,7 +14,7 @@ import java.util.List; /** * @author Eugene.Kudelevsky */ -public class PermissionGroupClass extends ManifestInnerClass { +class PermissionGroupClass extends ManifestInnerClass { PermissionGroupClass(@NotNull AndroidFacet facet, @NotNull PsiClass context) { super(facet, "permission_group", context); } diff --git a/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java b/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java index c05728a5e011..e4f1eda99bbf 100644 --- a/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java +++ b/plugins/android/src/org/jetbrains/android/augment/ResourceTypeClass.java @@ -40,9 +40,9 @@ class ResourceTypeClass extends AndroidLightClass { } @NotNull - private static PsiField[] buildResourceFields(@NotNull AndroidFacet facet, - @NotNull String resClassName, - @NotNull final AndroidLightClass context) { + static PsiField[] buildResourceFields(@NotNull AndroidFacet facet, + @NotNull String resClassName, + @NotNull final PsiClass context) { final PsiElementFactory factory = JavaPsiFacade.getElementFactory(facet.getModule().getProject()); final Collection resNames = facet.getLocalResourceManager().getResourceNames(resClassName); final PsiField[] result = new PsiField[resNames.size()]; diff --git a/plugins/android/src/org/jetbrains/android/inspections/CreateValueResourceQuickFix.java b/plugins/android/src/org/jetbrains/android/inspections/CreateValueResourceQuickFix.java index 2a4b02d71415..dd9bfdba0952 100644 --- a/plugins/android/src/org/jetbrains/android/inspections/CreateValueResourceQuickFix.java +++ b/plugins/android/src/org/jetbrains/android/inspections/CreateValueResourceQuickFix.java @@ -107,11 +107,6 @@ public class CreateValueResourceQuickFix implements LocalQuickFix, IntentionActi } PsiDocumentManager.getInstance(myFile.getProject()).commitAllDocuments(); UndoUtil.markPsiFileForUndo(myFile); - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - ApplicationManager.getApplication().saveAll(); - } - }); return true; } diff --git a/plugins/android/src/org/jetbrains/android/intentions/AndroidAddStringResourceAction.java b/plugins/android/src/org/jetbrains/android/intentions/AndroidAddStringResourceAction.java index bb62b105fa65..0438daeb1192 100644 --- a/plugins/android/src/org/jetbrains/android/intentions/AndroidAddStringResourceAction.java +++ b/plugins/android/src/org/jetbrains/android/intentions/AndroidAddStringResourceAction.java @@ -215,12 +215,6 @@ public class AndroidAddStringResourceAction extends AbstractIntentionAction impl PsiDocumentManager.getInstance(project).commitAllDocuments(); UndoUtil.markPsiFileForUndo(file); - - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - ApplicationManager.getApplication().saveAll(); - } - }); } private static void createJavaResourceReference(final Module module, @@ -239,13 +233,6 @@ public class AndroidAddStringResourceAction extends AbstractIntentionAction impl final boolean inStaticContext = RefactoringUtil.isInStaticContext(element, null); final Project project = module.getProject(); - ApplicationManager.getApplication().invokeLater(new Runnable() { - @Override - public void run() { - AndroidResourceUtil.createStubResourceField(module, aPackage, resType, rJavaFieldName); - } - }); - if (extendsContext && !inStaticContext) { if (ResourceType.STRING.getName().equals(resType)) { template = new TemplateImpl("", methodName + '(' + field + ')', ""); diff --git a/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java b/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java index c21fe0b33e11..4d36d8c7fadd 100644 --- a/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java +++ b/plugins/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java @@ -18,6 +18,9 @@ package org.jetbrains.android.maven; import com.android.sdklib.IAndroidTarget; import com.intellij.facet.FacetType; import com.intellij.ide.highlighter.ModuleFileType; +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationType; +import com.intellij.notification.Notifications; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.ModifiableModuleModel; @@ -107,12 +110,20 @@ public abstract class AndroidFacetImporterBase extends FacetImporter(resClassName, resFieldName); } - public static void createStubResourceField(@NotNull final Module module, - @NotNull final String aPackage, - @NotNull final String resClassName, - @NotNull final String resFieldName) { - ApplicationManager.getApplication().runWriteAction(new Runnable() { - @Override - public void run() { - final Project project = module.getProject(); - final PsiClass[] classes = - JavaPsiFacade.getInstance(project).findClasses(aPackage + ".R", GlobalSearchScope.moduleScope(module)); - if (classes.length == 1) { - final PsiClass aClass = classes[0]; - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - - PsiClass resTypeClass = aClass.findInnerClassByName(resClassName, false); - - if (resTypeClass == null) { - resTypeClass = (PsiClass)aClass.add(factory.createClass(resClassName)); - } - else if (resTypeClass.findFieldByName(resFieldName, false) != null) { - return; - } - final PsiField psiField = (PsiField)resTypeClass.add(factory.createField(resFieldName, PsiType.INT)); - PsiUtil.setModifierProperty(psiField, PsiModifier.PUBLIC, true); - PsiUtil.setModifierProperty(psiField, PsiModifier.STATIC, true); - PsiUtil.setModifierProperty(psiField, PsiModifier.FINAL, true); - } - } - }); - } - @NotNull public static XmlFile createFileResource(@NotNull String fileName, @NotNull PsiDirectory resSubdir, diff --git a/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java b/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java index c4d5b7819419..77c2c0b168ec 100644 --- a/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java +++ b/plugins/android/testSrc/org/jetbrains/android/AndroidRenameTest.java @@ -25,7 +25,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesProcessor; @@ -98,7 +98,7 @@ public class AndroidRenameTest extends AndroidTestCase { protected void run() throws Throwable { Editor editor = myFixture.getEditor(); PsiFile file = myFixture.getFile(); - Editor completionEditor = InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(editor, file); + Editor completionEditor = InjectedLanguageFacadeImpl.getEditorForInjectedLanguageNoCommit(editor, file); PsiElement element = TargetElementUtilBase.findTargetElement(completionEditor, TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED | TargetElementUtilBase.ELEMENT_NAME_ACCEPTED); assert element != null; diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index 2dcc24f0c017..b4da644ab6e0 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -104,7 +104,13 @@ public class GitUtil { } // this is standard for submodules, although probably it can - String content = readFile(child); + String content; + try { + content = readFile(child); + } + catch (IOException e) { + throw new RuntimeException("Couldn't read " + child, e); + } String pathToDir; String prefix = "gitdir:"; if (content.startsWith(prefix)) { @@ -124,18 +130,24 @@ public class GitUtil { return VcsUtil.getVirtualFile(pathToDir); } + /** + * Makes 3 attempts to get the contents of the file. If all 3 fail with an IOException, rethrows the exception. + */ @NotNull - private static String readFile(@NotNull VirtualFile file) { - Exception exception = null; - for (int attempts = 0; attempts < 3; attempts++) { + public static String readFile(@NotNull VirtualFile file) throws IOException { + final int ATTEMPTS = 3; + for (int attempt = 0; attempt < ATTEMPTS; attempt++) { try { return new String(file.contentsToByteArray()); } catch (IOException e) { - exception = e; + LOG.info(String.format("IOException while reading %s (attempt #%s)", file, attempt)); + if (attempt >= ATTEMPTS - 1) { + throw e; + } } } - throw new RuntimeException("Couldn't read " + file, exception); + throw new AssertionError("Shouldn't get here. Couldn't read " + file); } /** diff --git a/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java b/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java index b683b94decf4..03aefdeee6a5 100644 --- a/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java +++ b/plugins/git4idea/src/git4idea/branch/GitBranchOperationsProcessor.java @@ -257,7 +257,7 @@ public final class GitBranchOperationsProcessor { if (remoteUrl != null && GitHttpAdapter.shouldUseJGit(remoteUrl)) { String fullBranchName = branchName.startsWith(GitBranch.REFS_HEADS_PREFIX) ? branchName : GitBranch.REFS_HEADS_PREFIX + branchName; String spec = ":" + fullBranchName; - GitSimplePushResult simplePushResult = GitHttpAdapter.push(repository, remote, remoteUrl, spec); + GitSimplePushResult simplePushResult = GitHttpAdapter.push(repository, remote.getName(), remoteUrl, spec); return convertSimplePushResultToCommandResult(simplePushResult); } else { diff --git a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java index 928bafa7ea86..71b7f15b8262 100644 --- a/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java +++ b/plugins/git4idea/src/git4idea/jgit/GitHttpAdapter.java @@ -160,11 +160,13 @@ public final class GitHttpAdapter { } @NotNull - public static GitSimplePushResult push(@NotNull final GitRepository repository, @NotNull final GitRemote remote, @NotNull final String remoteUrl, @NotNull String pushSpec) { + public static GitSimplePushResult push(@NotNull final GitRepository repository, @NotNull final String remoteName, + @NotNull final String remoteUrl, @NotNull String pushSpec) { try { final Git git = convertToGit(repository); final GitHttpCredentialsProvider provider = new GitHttpCredentialsProvider(repository.getProject(), remoteUrl); - GitHttpRemoteCommand.Push pushCommand = new GitHttpRemoteCommand.Push(git, provider, remote.getName(), remoteUrl, convertRefSpecs(Collections.singletonList(pushSpec))); + GitHttpRemoteCommand.Push pushCommand = new GitHttpRemoteCommand.Push(git, provider, remoteName, remoteUrl, + convertRefSpecs(Collections.singletonList(pushSpec))); GeneralResult result = callWithAuthRetry(pushCommand, repository.getProject()); GitSimplePushResult pushResult = pushCommand.getResult(); if (pushResult == null) { @@ -180,15 +182,15 @@ public final class GitHttpAdapter { "If neither is possible, as a workaround you may add authentication data directly to the remote url in .git/config."); } catch (InvalidRemoteException e) { - logException(repository, remote.getName(), remoteUrl, e, "pushing"); + logException(repository, remoteName, remoteUrl, e, "pushing"); return makeErrorResultFromException(e); } catch (IOException e) { - logException(repository, remote.getName(), remoteUrl, e, "pushing"); + logException(repository, remoteName, remoteUrl, e, "pushing"); return makeErrorResultFromException(e); } catch (URISyntaxException e) { - logException(repository, remote.getName(), remoteUrl, e, "pushing"); + logException(repository, remoteName, remoteUrl, e, "pushing"); return makeErrorResultFromException(e); } } diff --git a/plugins/git4idea/src/git4idea/push/GitPusher.java b/plugins/git4idea/src/git4idea/push/GitPusher.java index b150324b3218..7f73d7bdb5c8 100644 --- a/plugins/git4idea/src/git4idea/push/GitPusher.java +++ b/plugins/git4idea/src/git4idea/push/GitPusher.java @@ -322,7 +322,7 @@ public final class GitPusher { GitSimplePushResult pushResult; boolean pushOverHttp = httpUrl != null; if (pushOverHttp) { - pushResult = GitHttpAdapter.push(repository, remote, httpUrl, formPushSpec(pushSpec, remote)); + pushResult = GitHttpAdapter.push(repository, remote.getName(), httpUrl, formPushSpec(pushSpec, remote)); } else { pushResult = pushNatively(repository, pushSpec); diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubCreateGistAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubCreateGistAction.java index 8531a4571217..c065efa5c0ce 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubCreateGistAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubCreateGistAction.java @@ -23,11 +23,13 @@ import com.intellij.notification.NotificationListener; import com.intellij.notification.NotificationType; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import git4idea.GitVcs; @@ -67,11 +69,6 @@ public class GithubCreateGistAction extends DumbAwareAction { e.getPresentation().setEnabled(false); return; } - if (!editor.getSelectionModel().hasSelection()){ - e.getPresentation().setVisible(false); - e.getPresentation().setEnabled(false); - return; - } e.getPresentation().setVisible(true); e.getPresentation().setEnabled(true); } @@ -151,11 +148,18 @@ public class GithubCreateGistAction extends DumbAwareAction { @Nullable private static String createGist(@NotNull Project project, @Nullable String login, @Nullable String password, boolean anonymous, - @NotNull String text, boolean isPrivate, @NotNull VirtualFile file, @NotNull String description) { + @Nullable String text, boolean isPrivate, @NotNull VirtualFile file, @NotNull String description) { if (anonymous) { login = null; password = null; } + if (text == null) { + text = readFile(file); + if (text == null) { + showError(project, "Failed to create gist", "Couldn't read the contents of the file " + file, null, null); + return null; + } + } String requestBody = prepareJsonRequest(description, isPrivate, text, file); try { JsonElement jsonElement = GithubUtil.postRequest("https://api.github.com", login, password, "/gists", requestBody); @@ -183,13 +187,29 @@ public class GithubCreateGistAction extends DumbAwareAction { } } + @Nullable + private static String readFile(@NotNull final VirtualFile file) { + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public String compute() { + try { + return new String(file.contentsToByteArray(), file.getCharset()); + } + catch (IOException e) { + LOG.info("Couldn't read contents of the file " + file); + return null; + } + } + }); + } + private static void showError(@NotNull Project project, @NotNull String title, @NotNull String content, @Nullable String details, @Nullable Exception e) { Notificator.getInstance(project).notifyError(title, content); LOG.info("Couldn't parse response as json data: \n" + content + "\n" + details, e); } - private static String prepareJsonRequest(String description, boolean isPrivate, String text, VirtualFile file) { + private static String prepareJsonRequest(@NotNull String description, boolean isPrivate, @NotNull String text, @NotNull VirtualFile file) { JsonObject json = new JsonObject(); json.addProperty("description", description); json.addProperty("public", Boolean.toString(!isPrivate)); diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java index 25fd38f4a482..8e343abba815 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java @@ -143,7 +143,7 @@ public class GithubRebaseAction extends DumbAwareAction { final String parent = repositoryInfo.getParentName(); LOG.assertTrue(parent != null, "Parent repository not found!"); final String parentRepoSuffix = parent + ".git"; - final String parentRepoUrl = "git://github.com/" + parentRepoSuffix; + final String parentRepoUrl = "https://github.com/" + parentRepoSuffix; // Check that corresponding remote branch is configured for the fork origin repo final Ref remoteForForkParentRepo = new Ref(); diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java index 09c71311c194..fe1806b8bd50 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java @@ -19,7 +19,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; -import com.intellij.notification.Notifications; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; @@ -38,7 +37,6 @@ import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.changes.ChangeListManager; import com.intellij.openapi.vcs.changes.ChangeListManagerImpl; import com.intellij.openapi.vcs.changes.InvokeAfterUpdateMode; -import com.intellij.openapi.vcs.changes.actions.RefreshAction; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.concurrency.Semaphore; @@ -46,11 +44,13 @@ import com.intellij.util.containers.HashSet; import git4idea.GitDeprecatedRemote; import git4idea.GitUtil; import git4idea.GitVcs; +import git4idea.Notificator; import git4idea.actions.BasicAction; import git4idea.actions.GitInit; import git4idea.commands.*; import git4idea.i18n.GitBundle; -import git4idea.push.GitPushUtils; +import git4idea.jgit.GitHttpAdapter; +import git4idea.push.GitSimplePushResult; import git4idea.repo.GitRepository; import git4idea.repo.GitRepositoryManager; import git4idea.util.GitFileUtils; @@ -208,14 +208,20 @@ public class GithubShareAction extends DumbAwareAction { return; } + GitRepositoryManager repositoryManager = ServiceManager.getService(project, GitRepositoryManager.class); + final GitRepository repository = repositoryManager.getRepositoryForRoot(root); + LOG.assertTrue(repository != null, "GitRepository is null for root " + root); + //git remote add origin git@github.com:login/name.git LOG.info("Adding GitHub as a remote host"); final GitSimpleHandler addRemoteHandler = new GitSimpleHandler(project, root, GitCommand.REMOTE); addRemoteHandler.setNoSSH(true); addRemoteHandler.setSilent(true); - addRemoteHandler.addParameters("add", "origin", "git@github.com:" + login + "/" + name + ".git"); + final String remoteUrl = "https://github.com/" + login + "/" + name + ".git"; + addRemoteHandler.addParameters("add", "origin", remoteUrl); try { addRemoteHandler.run(); + repository.update(GitRepository.TrackedTopic.CONFIG); if (addRemoteHandler.getExitCode() != 0) { Messages.showErrorDialog("Failed to add GitHub repository as remote", "Failed to add GitHub repository as remote"); return; @@ -229,31 +235,43 @@ public class GithubShareAction extends DumbAwareAction { //git push origin master - final ArrayList errors = new ArrayList(); new Task.Backgroundable(project, "Pushing to GitHub", false) { @Override public void run(@NotNull ProgressIndicator indicator) { - final GitLineHandler gitPushHandler = new GitLineHandler(project, root, GitCommand.PUSH); - gitPushHandler.addParameters("-u", "origin", "master"); - GitPushUtils.trackPushRejectedAsError(gitPushHandler, "Rejected push (" + root.getPresentableUrl() + "): "); - errors.addAll(GitHandlerUtil.doSynchronouslyWithExceptions(gitPushHandler)); - ApplicationManager.getApplication().invokeLater(new Runnable() { - @Override - public void run() { - if (!errors.isEmpty()) { - GitUIUtil.showOperationErrors(project, errors, GitBundle.getString("push.active.pushing")); - } - else { - RefreshAction.doRefresh(project); - Notifications.Bus.notify(new Notification("github", "Success", "Successfully created project ''" + name + "'' on github", - NotificationType.INFORMATION)); - } - } - }); + GitSimplePushResult pushResult = GitHttpAdapter.push(repository, "origin", remoteUrl, "refs/heads/master:refs/heads/master"); + switch (pushResult.getType()) { + case NOT_PUSHED: + showPushError(project, "Push failed:
" + pushResult.getOutput()); + break; + case REJECT: + showPushError(project, "Push was rejected:
" + pushResult.getOutput()); + break; + case CANCEL: + Notificator.getInstance(project).notify(new Notification(GithubUtil.GITHUB_NOTIFICATION_GROUP, "Push cancelled", + "The project was created on GitHub but wasn't pushed yet.", NotificationType.WARNING)); + break; + case NOT_AUTHORIZED: + showPushError(project, "Push authorization failure:
" + pushResult.getOutput()); + break; + case ERROR: + showPushError(project, "Push failed:
" + pushResult.getOutput()); + break; + case SUCCESS: + Notificator.getInstance(project).notify(new Notification(GithubUtil.GITHUB_NOTIFICATION_GROUP, "Success", + "Successfully created project ''" + name + "'' on github", + NotificationType.INFORMATION)); + break; + } } }.queue(); } + private static void showPushError(@NotNull Project project, @NotNull String message) { + Notification notification = new Notification(GithubUtil.GITHUB_NOTIFICATION_GROUP, "Push to GitHub failed", message, + NotificationType.ERROR); + Notificator.getInstance(project).notify(notification); + } + private boolean performFirstCommitIfRequired(final Project project, final VirtualFile root) { final GitVcs gitVcs = GitVcs.getInstance(project); if (gitVcs == null){ diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java index 04285624791a..7ef9d1c0c361 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java @@ -63,6 +63,7 @@ public class GithubUtil { public static final Icon GITHUB_ICON = IconLoader.getIcon("/org/jetbrains/plugins/github/github_icon.png"); private static final Logger LOG = Logger.getInstance(GithubUtil.class.getName()); + static final String GITHUB_NOTIFICATION_GROUP = "github"; /** * @deprecated The host may be defined in different formats. Use {@link #getApiUrl(String)} instead. diff --git a/plugins/groovy/resources/standardDsls/extensions.gdsl b/plugins/groovy/resources/standardDsls/extensions.gdsl index eeb7f4f4b3ad..d5170c0f915b 100644 --- a/plugins/groovy/resources/standardDsls/extensions.gdsl +++ b/plugins/groovy/resources/standardDsls/extensions.gdsl @@ -17,9 +17,6 @@ package standardDsls -//import com.intellij.psi.search.GlobalSearchScope -//import org.jetbrains.plugins.groovy.dgm.GroovyExtensionProvider - /** * @author Maxim.Medvedev */ @@ -37,13 +34,4 @@ contributor([:]) { category "org.codehaus.groovy.runtime.StringGroovyMethods" category "org.codehaus.groovy.runtime.SwingGroovyMethods" category "org.codehaus.groovy.runtime.XmlGroovyMethods" - -/* def pair = GroovyExtensionProvider.getInstance(project).collectExtensions(GlobalSearchScope.allScope(project)) - for (def inst : pair.first) { - category inst, false - } - - for (def stat : pair.second) { - category stat, true - }*/ } diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index 7561c19d5b88..957b92d6c0fd 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -81,6 +81,7 @@ + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyAddImportAction.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyAddImportAction.java index 5c683f21ea22..b08069ac6bfa 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyAddImportAction.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/GroovyAddImportAction.java @@ -21,6 +21,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMember; +import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement; @@ -35,17 +36,17 @@ public class GroovyAddImportAction extends ImportClassFixBase 0; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java new file mode 100644 index 000000000000..bce996105c84 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/DGMMemberContributor.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2012 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.dgm; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiType; +import com.intellij.psi.ResolveState; +import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor; + +import java.util.List; + +/** + * @author Max Medvedev + */ +public class DGMMemberContributor extends NonCodeMembersContributor { + @Override + public void processDynamicElements(@NotNull PsiType qualifierType, + PsiClass aClass, + PsiScopeProcessor processor, + GroovyPsiElement place, + ResolveState state) { + Project project = place.getProject(); + GlobalSearchScope resolveScope = place.getResolveScope(); + JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + + Pair, List> extensions = GroovyExtensionProvider.getInstance(project).collectExtensions(resolveScope); + + List instanceCategories = extensions.getFirst(); + List staticCategories = extensions.getSecond(); + + if (!processCategories(qualifierType, processor, state, project, resolveScope, facade, instanceCategories, false)) return; + if (!processCategories(qualifierType, processor, state, project, resolveScope, facade, staticCategories, true)) return; + } + + private static boolean processCategories(PsiType qualifierType, + PsiScopeProcessor processor, + ResolveState state, + Project project, + GlobalSearchScope resolveScope, + JavaPsiFacade facade, + List instanceCategories, + boolean isStatic) { + for (String category : instanceCategories) { + PsiClass clazz = facade.findClass(category, resolveScope); + if (clazz != null) { + if (!GdkMethodHolder.getHolderForClass(clazz, isStatic, resolveScope).processMethods(processor, state, qualifierType, project)) { + return false; + } + } + } + return true; + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GdkMethodHolder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GdkMethodHolder.java new file mode 100644 index 000000000000..fbc428939680 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dgm/GdkMethodHolder.java @@ -0,0 +1,129 @@ +/* + * Copyright 2000-2012 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.dgm; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.NotNullLazyValue; +import com.intellij.openapi.util.VolatileNotNullLazyValue; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.scope.NameHint; +import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.*; +import com.intellij.util.containers.ConcurrentFactoryMap; +import com.intellij.util.containers.MultiMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; +import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrGdkMethodImpl; +import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil; + +/** + * @author Max Medvedev + */ +public class GdkMethodHolder { + private static Key> CACHED_NON_STATIC = Key.create("Cached instance gdk method holder"); + private static Key> CACHED_STATIC = Key.create("Cached static gdk method holder"); + + + private final ConcurrentFactoryMap> myOriginalMethodsByNameAndType; + private final NotNullLazyValue> myOriginalMethodByType; + private final boolean myStatic; + private final GlobalSearchScope myScope; + private final PsiManager myPsiManager; + + private GdkMethodHolder(final PsiClass categoryClass, final boolean isStatic, final GlobalSearchScope scope) { + myStatic = isStatic; + myScope = scope; + final MultiMap byName = new MultiMap(); + myPsiManager = categoryClass.getManager(); + for (PsiMethod m : categoryClass.getMethods()) { + final PsiParameter[] params = m.getParameterList().getParameters(); + if (params.length == 0) continue; + + byName.putValue(m.getName(), m); + } + this.myOriginalMethodByType = new VolatileNotNullLazyValue>() { + @NotNull + @Override + protected MultiMap compute() { + MultiMap map = new MultiMap(); + for (PsiMethod method : byName.values()) { + map.putValue(getCategoryTargetType(method).getCanonicalText(), method); + } + return map; + } + }; + + myOriginalMethodsByNameAndType = new ConcurrentFactoryMap>() { + @Override + protected MultiMap create(String name) { + MultiMap map = new MultiMap(); + for (PsiMethod method : byName.get(name)) { + map.putValue(getCategoryTargetType(method).getCanonicalText(), method); + } + return map; + } + }; + } + + private PsiType getCategoryTargetType(PsiMethod method) { + final PsiType parameterType = method.getParameterList().getParameters()[0].getType(); + return TypesUtil.boxPrimitiveType(TypeConversionUtil.erasure(parameterType), myPsiManager, myScope); + } + + public boolean processMethods(PsiScopeProcessor processor, ResolveState state, PsiType qualifierType, Project project) { + if (qualifierType == null) return true; + + NameHint nameHint = processor.getHint(NameHint.KEY); + String name = nameHint == null ? null : nameHint.getName(state); + final MultiMap map = name != null ? myOriginalMethodsByNameAndType.get(name) : myOriginalMethodByType.getValue(); + if (map.isEmpty()) { + return true; + } + + for (String superType : ResolveUtil.getAllSuperTypes(qualifierType, project).keySet()) { + for (PsiMethod method : map.get(superType)) { + if (!processor.execute(GrGdkMethodImpl.createGdkMethod(method, myStatic), state)) { + return false; + } + } + } + + return true; + } + + public static GdkMethodHolder getHolderForClass(final PsiClass categoryClass, final boolean isStatic, final GlobalSearchScope scope) { + final Project project = categoryClass.getProject(); + Key> key = isStatic ? CACHED_STATIC : CACHED_NON_STATIC; + return CachedValuesManager.getManager(project).getCachedValue(categoryClass, key, new CachedValueProvider() { + @Override + public Result compute() { + GdkMethodHolder result = new GdkMethodHolder(categoryClass, isStatic, scope); + + final ProjectRootManager rootManager = ProjectRootManager.getInstance(project); + final VirtualFile vfile = categoryClass.getContainingFile().getVirtualFile(); + if (vfile != null && (rootManager.getFileIndex().isInLibraryClasses(vfile) || rootManager.getFileIndex().isInLibrarySource(vfile))) { + return Result.create(result, rootManager); + } + + return Result.create(result, PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, rootManager); + } + }, false); + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java index d9c0a9bb5600..3f87923baa46 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/GdkMethodDslProvider.java @@ -15,33 +15,24 @@ */ package org.jetbrains.plugins.groovy.lang.resolve; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.VolatileNotNullLazyValue; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.psi.scope.NameHint; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiClass; +import com.intellij.psi.ResolveState; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.util.*; -import com.intellij.util.containers.ConcurrentFactoryMap; -import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.dgm.GdkMethodHolder; import org.jetbrains.plugins.groovy.dsl.GdslMembersHolderConsumer; import org.jetbrains.plugins.groovy.dsl.GroovyClassDescriptor; import org.jetbrains.plugins.groovy.dsl.dsltop.GdslMembersProvider; import org.jetbrains.plugins.groovy.dsl.holders.CustomMembersHolder; -import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; -import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrGdkMethodImpl; /** * @author Maxim.Medvedev */ @SuppressWarnings({"MethodMayBeStatic"}) public class GdkMethodDslProvider implements GdslMembersProvider { - private static final Key> METHOD_KEY = Key.create("Category methods"); public void category(String className, GdslMembersHolderConsumer consumer) { processCategoryMethods(className, consumer, false); @@ -51,7 +42,7 @@ public class GdkMethodDslProvider implements GdslMembersProvider { processCategoryMethods(className, consumer, isStatic); } - public static void processCategoryMethods(final String className, final GdslMembersHolderConsumer consumer, final boolean isStatic) { + private static void processCategoryMethods(final String className, final GdslMembersHolderConsumer consumer, final boolean isStatic) { final GlobalSearchScope scope = consumer.getResolveScope(); final PsiClass categoryClass = JavaPsiFacade.getInstance(consumer.getProject()).findClass(className, scope); if (categoryClass == null) { @@ -62,7 +53,7 @@ public class GdkMethodDslProvider implements GdslMembersProvider { @NotNull @Override protected GdkMethodHolder compute() { - return retrieveMethodMap(consumer.getProject(), scope, isStatic, categoryClass); + return GdkMethodHolder.getHolderForClass(categoryClass, isStatic, scope); } }; @@ -70,100 +61,8 @@ public class GdkMethodDslProvider implements GdslMembersProvider { @Override public boolean processMembers(GroovyClassDescriptor descriptor, PsiScopeProcessor processor, ResolveState state) { - return methodsMap.getValue().processMethods(descriptor, processor, state); + return methodsMap.getValue().processMethods(processor, state, descriptor.getPsiType(), descriptor.getProject()); } }); } - - public static GdkMethodHolder retrieveMethodMap(final Project project, - final GlobalSearchScope scope, - final boolean isStatic, - @NotNull final PsiClass categoryClass) { - return CachedValuesManager.getManager(project) - .getCachedValue(categoryClass, METHOD_KEY, new CachedValueProvider() { - @Override - public Result compute() { - GdkMethodHolder result = new GdkMethodHolder(categoryClass, isStatic, scope); - - final ProjectRootManager rootManager = ProjectRootManager.getInstance(project); - final VirtualFile vfile = categoryClass.getContainingFile().getVirtualFile(); - if (vfile != null && - (rootManager.getFileIndex().isInLibraryClasses(vfile) || rootManager.getFileIndex().isInLibrarySource(vfile))) { - return Result.create(result, rootManager); - } - - return Result.create(result, PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT, rootManager); - } - }, false); - } - - private static class GdkMethodHolder { - private final ConcurrentFactoryMap> originalMethodsByNameAndType; - private final NotNullLazyValue> originalMethodByType; - private final boolean myStatic; - private final GlobalSearchScope myScope; - private final PsiManager myPsiManager; - - GdkMethodHolder(final PsiClass categoryClass, final boolean isStatic, final GlobalSearchScope scope) { - myStatic = isStatic; - myScope = scope; - final MultiMap byName = new MultiMap(); - myPsiManager = categoryClass.getManager(); - for (PsiMethod m : categoryClass.getMethods()) { - final PsiParameter[] params = m.getParameterList().getParameters(); - if (params.length == 0) continue; - - byName.putValue(m.getName(), m); - } - this.originalMethodByType = new VolatileNotNullLazyValue>() { - @NotNull - @Override - protected MultiMap compute() { - MultiMap map = new MultiMap(); - for (PsiMethod method : byName.values()) { - map.putValue(getCategoryTargetType(method).getCanonicalText(), method); - } - return map; - } - }; - - originalMethodsByNameAndType = new ConcurrentFactoryMap>() { - @Override - protected MultiMap create(String name) { - MultiMap map = new MultiMap(); - for (PsiMethod method : byName.get(name)) { - map.putValue(getCategoryTargetType(method).getCanonicalText(), method); - } - return map; - } - }; - } - - private PsiType getCategoryTargetType(PsiMethod method) { - final PsiType parameterType = method.getParameterList().getParameters()[0].getType(); - return TypesUtil.boxPrimitiveType(TypeConversionUtil.erasure(parameterType), myPsiManager, myScope); - } - - boolean processMethods(GroovyClassDescriptor descriptor, PsiScopeProcessor processor, ResolveState state) { - final PsiType psiType = descriptor.getPsiType(); - if (psiType == null) return true; - - NameHint nameHint = processor.getHint(NameHint.KEY); - String name = nameHint == null ? null : nameHint.getName(state); - final MultiMap map = name != null ? originalMethodsByNameAndType.get(name) : originalMethodByType.getValue(); - if (map.isEmpty()) { - return true; - } - - for (String superType : ResolveUtil.getAllSuperTypes(psiType, descriptor.getProject()).keySet()) { - for (PsiMethod method : map.get(superType)) { - if (!processor.execute(GrGdkMethodImpl.createGdkMethod(method, myStatic), state)) { - return false; - } - } - } - - return true; - } - } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunTargetHistoryService.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunTargetHistoryService.java index c5d93927585a..499588347494 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunTargetHistoryService.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunTargetHistoryService.java @@ -73,7 +73,7 @@ public class MvcRunTargetHistoryService implements PersistentStateComponent0) def offset = psiFile.getText().indexOf('"') + 1 assertNotNull(psiFile.findElementAt(offset)); - assert InjectedLanguageUtil.findInjectedPsiNoCommit(psiFile, offset) + assert InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(psiFile, offset) } public void testRegexInjections() { @@ -60,8 +62,8 @@ s.codePointAt(0) final PsiFile psiFile = myFixture.configureByText("script.groovy", 'new groovy.lang.GroovyShell().evaluate(/ blah-blah-blah \\ language won\'t be injected here /)'); assertNotNull(psiFile); - assert InjectedLanguageUtil.findInjectedPsiNoCommit(psiFile, psiFile.getText().indexOf('blah') + 1) - assert InjectedLanguageUtil.findInjectedPsiNoCommit(psiFile, psiFile.getText().indexOf('injected') + 1) + assert InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(psiFile, psiFile.getText().indexOf('blah') + 1) + assert InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(psiFile, psiFile.getText().indexOf('injected') + 1) } } diff --git a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/SuppressByCommentOutAction.java b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/SuppressByCommentOutAction.java index f674084163a0..dad8077bb62e 100644 --- a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/SuppressByCommentOutAction.java +++ b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/SuppressByCommentOutAction.java @@ -24,7 +24,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; @@ -45,7 +45,7 @@ class SuppressByCommentOutAction extends SuppressIntentionAction { if (!CodeInsightUtilBase.preparePsiElementForWrite(element)) return; element = findJavaCodeUpThere(element); PsiFile file = element.getContainingFile(); - editor = InjectedLanguageUtil.openEditorFor(file, project); + editor = InjectedLanguageFacadeImpl.openEditorFor(file, project); int endOffset = element.getTextRange().getEndOffset(); int line = editor.getDocument().getLineNumber(endOffset); int lineEndOffset = editor.getDocument().getLineEndOffset(line); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestClassFilter.java b/plugins/junit/src/com/intellij/execution/junit/TestClassFilter.java index d005a0e1bc40..8faffac37764 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestClassFilter.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestClassFilter.java @@ -29,6 +29,7 @@ import com.intellij.psi.util.PsiUtilBase; import org.jetbrains.annotations.NotNull; import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; public class TestClassFilter implements ClassFilter.ClassFilterWithScope { private final PsiClass myBase; @@ -65,15 +66,27 @@ public class TestClassFilter implements ClassFilter.ClassFilterWithScope { public static TestClassFilter create(final SourceScope sourceScope, Module module, final String pattern) throws JUnitUtil.NoJUnitException { if (sourceScope == null) throw new JUnitUtil.NoJUnitException(); PsiClass testCase = module == null ? JUnitUtil.getTestCaseClass(sourceScope) : JUnitUtil.getTestCaseClass(module); + final Pattern compilePattern = getCompilePattern(pattern); return new TestClassFilter(testCase, sourceScope.getGlobalSearchScope()){ - private final Pattern myPattern = Pattern.compile(pattern); + @Override public boolean isAccepted(PsiClass aClass) { - return super.isAccepted(aClass) && myPattern.matcher(aClass.getQualifiedName()).matches(); + return super.isAccepted(aClass) && compilePattern != null && compilePattern.matcher(aClass.getQualifiedName()).matches(); } }; } + private static Pattern getCompilePattern(String pattern) { + Pattern compilePattern; + try { + compilePattern = Pattern.compile(pattern); + } + catch (PatternSyntaxException e) { + compilePattern = null; + } + return compilePattern; + } + public GlobalSearchScope getScope() { return myScope; } public PsiClass getBase() { return myBase; } } diff --git a/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java b/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java index 866a2ffb6873..837383eb5480 100644 --- a/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java +++ b/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java @@ -18,7 +18,7 @@ package com.intellij.codeInspection.duplicatePropertyInspection; import com.intellij.codeInspection.*; import com.intellij.codeInspection.ex.GlobalInspectionContextImpl; import com.intellij.codeInspection.reference.RefManager; -import com.intellij.concurrency.JobUtil; +import com.intellij.concurrency.JobLauncher; import com.intellij.lang.properties.IProperty; import com.intellij.lang.properties.PropertiesBundle; import com.intellij.lang.properties.psi.PropertiesFile; @@ -162,7 +162,7 @@ public class DuplicatePropertyInspection extends GlobalSimpleInspectionTool { final ProgressIndicator progress = ProgressWrapper.wrap(original); ProgressManager.getInstance().runProcess(new Runnable() { public void run() { - if (!JobUtil.invokeConcurrentlyUnderProgress(properties, progress, false, new Processor() { + if (!JobLauncher.getInstance().invokeConcurrentlyUnderProgress(properties, progress, false, new Processor() { public boolean process(final IProperty property) { if (original != null) { if (original.isCanceled()) return false; diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java b/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java index 2bf1a9205d96..407a4cf0ccdc 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java +++ b/plugins/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java @@ -27,7 +27,7 @@ import com.intellij.openapi.fileEditor.impl.text.TextEditorPsiDataProvider; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.refactoring.actions.RenameElementAction; import com.intellij.refactoring.rename.NameSuggestionProvider; import com.intellij.refactoring.rename.RenameHandlerRegistry; @@ -86,7 +86,7 @@ public class RenameTo extends ShowSuggestions implements SpellCheckerQuickFix { HashMap map = new HashMap(); PsiElement psiElement = descriptor.getPsiElement(); PsiFile containingFile = psiElement.getContainingFile(); - Editor editor = InjectedLanguageUtil.openEditorFor(containingFile, project); + Editor editor = InjectedLanguageFacadeImpl.openEditorFor(containingFile, project); if (editor == null) { return; } diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/TokenizerBase.java b/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/TokenizerBase.java index 5210dbe5e639..d9b83abbd6c8 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/TokenizerBase.java +++ b/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/TokenizerBase.java @@ -17,7 +17,7 @@ package com.intellij.spellchecker.tokenizer; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLanguageInjectionHost; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.spellchecker.inspections.Splitter; import org.jetbrains.annotations.NotNull; @@ -37,7 +37,7 @@ public class TokenizerBase extends Tokenizer { @Override public void tokenize(@NotNull T element, TokenConsumer consumer) { - if (element instanceof PsiLanguageInjectionHost && InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)element)) { + if (element instanceof PsiLanguageInjectionHost && InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)element)) { return; } consumer.consumeToken(element, mySplitter); diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/XmlTextTokenizer.java b/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/XmlTextTokenizer.java index 3e66da49e6cb..3864f8e04691 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/XmlTextTokenizer.java +++ b/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/XmlTextTokenizer.java @@ -18,7 +18,7 @@ package com.intellij.spellchecker.tokenizer; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.xml.XmlText; import com.intellij.psi.xml.XmlToken; import com.intellij.psi.xml.XmlTokenType; @@ -30,7 +30,7 @@ import java.util.List; public class XmlTextTokenizer extends Tokenizer { @Override public void tokenize(@NotNull XmlText element, TokenConsumer consumer) { - List> list = InjectedLanguageUtil.getInjectedPsiFiles(element); + List> list = InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(element); if (list != null && list.size() > 0) return; final PsiElement[] children = element.getChildren(); for (PsiElement child : children) { diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java index a4d6b53f2345..55a4fc7f1faf 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java @@ -30,6 +30,7 @@ import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.IconLoader; +import com.intellij.openapi.vcs.FileStatus; import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy; import com.intellij.ui.*; import com.intellij.ui.table.JBTable; @@ -82,6 +83,8 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi private QuickFixManager myQuickFixManager; + private PropertyTablePanel myPropertyTablePanel; + public PropertyTable() { setModel(myModel); setSelectionMode(ListSelectionModel.SINGLE_SELECTION); @@ -110,6 +113,10 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi myQuickFixManager = new QuickFixManager(this, viewPort); } + public void setPropertyTablePanel(PropertyTablePanel propertyTablePanel) { + myPropertyTablePanel = propertyTablePanel; + } + public void setUI(TableUI ui) { super.setUI(ui); @@ -282,6 +289,10 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi restoreSelection(selection); } + + if (myPropertyTablePanel != null) { + myPropertyTablePanel.updateActions(); + } } finally { mySkipUpdate = false; @@ -659,7 +670,11 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi boolean isNewValue; try { - isNewValue = !Comparing.equal(getValue(property), newValue); + Object oldValue = getValue(property); + isNewValue = !Comparing.equal(oldValue, newValue); + if (newValue == null && oldValue instanceof String && ((String)oldValue).length() == 0) { + isNewValue = false; + } } catch (Throwable e) { isNewValue = true; @@ -678,8 +693,13 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi }, DesignerBundle.message("command.set.property.value"), false); } - if (property.needRefreshPropertyList() && isSetValue) { - updateProperties(); + if (isSetValue) { + if (property.needRefreshPropertyList()) { + updateProperties(); + } + else if (myPropertyTablePanel != null) { + myPropertyTablePanel.updateActions(); + } } return isSetValue; @@ -1029,16 +1049,19 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi column = table.convertColumnIndexToModel(column); Property property = (Property)value; Color background = table.getBackground(); + boolean isDefault = true; try { - if (isDefault(property)) { - background = Gray._240; - } + isDefault = isDefault(property); } catch (Throwable e) { LOG.debug(e); } + if (isDefault) { + background = Gray._240; + } + if (!selected) { myPropertyNameRenderer.setBackground(background); } @@ -1116,7 +1139,12 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi } if (!selected) { - myPropertyNameRenderer.setForeground(property.isExpert() ? Color.LIGHT_GRAY : table.getForeground()); + if (isDefault) { + myPropertyNameRenderer.setForeground(property.isExpert() ? Color.LIGHT_GRAY : table.getForeground()); + } + else { + myPropertyNameRenderer.setForeground(FileStatus.MODIFIED.getColor()); + } } } else { diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java index b37c2fa9bb6d..c28958ce3409 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java @@ -82,6 +82,8 @@ public final class PropertyTablePanel extends JPanel implements ListSelectionLis myPropertyTable.initQuickFixManager(scrollPane.getViewport()); add(scrollPane, new GridBagConstraints(0, 1, myActions.length + 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); + + myPropertyTable.setPropertyTablePanel(this); } public PropertyTable getPropertyTable() { @@ -90,6 +92,10 @@ public final class PropertyTablePanel extends JPanel implements ListSelectionLis @Override public void valueChanged(ListSelectionEvent e) { + updateActions(); + } + + public void updateActions() { for (AnAction action : myActions) { if (action instanceof IPropertyTableAction) { ((IPropertyTableAction)action).update(); diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java index 278754346a57..6ff644d0019a 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java @@ -62,5 +62,6 @@ public class RestoreDefault extends AnAction implements IPropertyTableAction { @Override public void actionPerformed(AnActionEvent e) { myTable.restoreDefaultValue(); + setEnabled(myTable, getTemplatePresentation()); } -} +} \ No newline at end of file diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/psi/impl/XPathElementImpl.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/psi/impl/XPathElementImpl.java index 728bbee7c3d3..b4ffb6a8298d 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/psi/impl/XPathElementImpl.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/psi/impl/XPathElementImpl.java @@ -21,7 +21,7 @@ import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.impl.PsiTreeDebugBuilder; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.util.IncorrectOperationException; import org.intellij.lang.xpath.XPath2ElementTypes; import org.intellij.lang.xpath.XPathElementTypes; @@ -141,7 +141,7 @@ public class XPathElementImpl extends ASTWrapperPsiElement implements XPathEleme } public final String getUnescapedText() { - if (InjectedLanguageUtil.isInInjectedLanguagePrefixSuffix(this)) { + if (InjectedLanguageFacadeImpl.isInInjectedLanguagePrefixSuffix(this)) { // do not attempt to decode text if PsiElement is part of prefix/suffix return getText(); } diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/XsltSupport.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/XsltSupport.java index 76887f89f3eb..a73a30a3e741 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/XsltSupport.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/XsltSupport.java @@ -22,7 +22,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.impl.PsiFileEx; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.*; import com.intellij.psi.xml.*; import com.intellij.ui.LayeredIcon; @@ -88,7 +88,7 @@ public class XsltSupport { final XmlAttributeValue value = attribute.getValueElement(); if (value != null) { final List files = new SmartList(); - InjectedLanguageUtil.enumerate(value, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(value, new PsiLanguageInjectionHost.InjectedPsiVisitor() { public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { if (injectedPsi instanceof XPathFile) { files.add(injectedPsi); diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/util/XsltCodeInsightUtil.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/util/XsltCodeInsightUtil.java index edf7225c60e2..65baf53f6eae 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/util/XsltCodeInsightUtil.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/util/XsltCodeInsightUtil.java @@ -23,7 +23,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.PsiRecursiveElementVisitor; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.util.PsiElementFilter; import com.intellij.psi.util.PsiTreeUtil; @@ -125,7 +125,7 @@ public class XsltCodeInsightUtil { public static TextRange getRangeInsideHostingFile(XPathElement expr) { final PsiLanguageInjectionHost host = PsiTreeUtil.getContextOfType(expr, PsiLanguageInjectionHost.class, true); assert host != null; - final List> psi = InjectedLanguageUtil.getInjectedPsiFiles(host); + final List> psi = InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(host); assert psi != null; for (Pair pair : psi) { if (PsiTreeUtil.isAncestor(pair.first, expr, false)) { @@ -140,7 +140,7 @@ public class XsltCodeInsightUtil { public static TextRange getRangeInsideHost(XPathElement expr) { final PsiLanguageInjectionHost host = PsiTreeUtil.getContextOfType(expr, PsiLanguageInjectionHost.class, true); assert host != null; - final List> psi = InjectedLanguageUtil.getInjectedPsiFiles(host); + final List> psi = InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(host); assert psi != null; for (Pair pair : psi) { if (PsiTreeUtil.isAncestor(pair.first, expr, false)) { diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/validation/XsltXmlAnnotator.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/validation/XsltXmlAnnotator.java index 444410b9d045..236012e7e968 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/validation/XsltXmlAnnotator.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/validation/XsltXmlAnnotator.java @@ -21,7 +21,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.XmlElementVisitor; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlAttributeValue; import org.intellij.lang.xpath.XPathFile; @@ -49,7 +49,7 @@ public class XsltXmlAnnotator extends XmlElementVisitor implements Annotator { if (s == null || s.length() == 0) { final PsiElement parent = value.getParent(); if (parent instanceof XmlAttribute && XsltSupport.isXPathAttribute((XmlAttribute)parent)) { - InjectedLanguageUtil.enumerate(value, new PsiLanguageInjectionHost.InjectedPsiVisitor() { + InjectedLanguageFacadeImpl.enumerate(value, new PsiLanguageInjectionHost.InjectedPsiVisitor() { @Override public void visit(@NotNull PsiFile injectedPsi, @NotNull List places) { if (injectedPsi instanceof XPathFile) { diff --git a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/Xslt2RefactoringTest.java b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/Xslt2RefactoringTest.java index 4f27becf8d88..2d65472b76d5 100644 --- a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/Xslt2RefactoringTest.java +++ b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/xslt/Xslt2RefactoringTest.java @@ -22,7 +22,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.formatter.xml.XmlCodeStyleSettings; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import org.intellij.lang.xpath.TestBase; import org.intellij.lang.xpath.psi.XPathExpression; import org.intellij.lang.xpath.xslt.refactoring.RefactoringOptions; @@ -77,8 +77,8 @@ public class Xslt2RefactoringTest extends TestBase { } }; - final PsiFile file = InjectedLanguageUtil.findInjectedPsiNoCommit(myFixture.getFile(), editor.getCaretModel().getOffset()); - final Editor editorWindow = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, file); + final PsiFile file = InjectedLanguageFacadeImpl.findInjectedPsiNoCommit(myFixture.getFile(), editor.getCaretModel().getOffset()); + final Editor editorWindow = InjectedLanguageFacadeImpl.getInjectedEditorForInjectedFile(editor, file); assertTrue(editorWindow instanceof EditorWindow); action.invoke(myFixture.getProject(), editorWindow, file, null); diff --git a/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/after.java.template b/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/after.java.template new file mode 100644 index 000000000000..52a8366b3b17 --- /dev/null +++ b/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/after.java.template @@ -0,0 +1,12 @@ +public class X { + int p1; + int p2; + int p3; + + void f(int p1, int p2, int p3) { + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + } +} + diff --git a/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/before.java.template b/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/before.java.template new file mode 100644 index 000000000000..48a3c9279bc1 --- /dev/null +++ b/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/before.java.template @@ -0,0 +1,6 @@ +public class X { + int p1; + + void f(int p1, int p2, int p3) { + } +} \ No newline at end of file diff --git a/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/description.html b/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/description.html new file mode 100644 index 000000000000..a02cdeded6c6 --- /dev/null +++ b/resources-en/src/intentionDescriptions/CreateAssignFieldsFromParametersAction/description.html @@ -0,0 +1,5 @@ + + +This intention allows to create or assign multiple fields from method parameters. + + \ No newline at end of file diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index f4bbd5083e5a..54571f9fba4b 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -587,6 +587,10 @@ com.intellij.codeInsight.intention.impl.AssignFieldFromParameterAction Declaration + + com.intellij.codeInsight.intention.impl.CreateAssignFieldsFromParametersAction + Declaration + com.intellij.codeInsight.daemon.impl.quickfix.CreateLocalVarFromInstanceofAction Declaration diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java b/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java index 4040ade8572a..8d53fae183a3 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/GenericValueReferenceProvider.java @@ -19,7 +19,7 @@ import com.intellij.javaee.web.PsiReferenceConverter; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.xml.*; import com.intellij.util.ProcessingContext; import com.intellij.util.ReflectionCache; @@ -61,10 +61,10 @@ public class GenericValueReferenceProvider extends PsiReferenceProvider { if (psiElement instanceof XmlTag) { for (XmlText text : ((XmlTag)psiElement).getValue().getTextElements()) { - if (InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)text)) return PsiReference.EMPTY_ARRAY; + if (InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)text)) return PsiReference.EMPTY_ARRAY; } } else { - if (InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)psiElement)) return PsiReference.EMPTY_ARRAY; + if (InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)psiElement)) return PsiReference.EMPTY_ARRAY; } final GenericDomValue domValue = (GenericDomValue)domElement; diff --git a/xml/dom-openapi/src/com/intellij/util/xml/AbstractDomDeclarationSearcher.java b/xml/dom-openapi/src/com/intellij/util/xml/AbstractDomDeclarationSearcher.java index f11d5ada84e9..ed613ed5d3c0 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/AbstractDomDeclarationSearcher.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/AbstractDomDeclarationSearcher.java @@ -19,7 +19,7 @@ import com.intellij.pom.PomDeclarationSearcher; import com.intellij.pom.PomTarget; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLanguageInjectionHost; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.tree.IElementType; import com.intellij.psi.xml.*; import com.intellij.util.Consumer; @@ -42,7 +42,7 @@ public abstract class AbstractDomDeclarationSearcher extends PomDeclarationSearc if (tokenType == XmlTokenType.XML_DATA_CHARACTERS && psiElement.getParent() instanceof XmlText && psiElement.getParent().getParent() instanceof XmlTag) { final XmlTag tag = (XmlTag)psiElement.getParent().getParent(); for (XmlText text : tag.getValue().getTextElements()) { - if (InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)text)) { + if (InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)text)) { return; } } @@ -50,7 +50,7 @@ public abstract class AbstractDomDeclarationSearcher extends PomDeclarationSearc nameElement = domManager.getDomElement(tag); } else if (tokenType == XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN && psiElement.getParent() instanceof XmlAttributeValue && psiElement.getParent().getParent() instanceof XmlAttribute) { final PsiElement attributeValue = psiElement.getParent(); - if (InjectedLanguageUtil.hasInjections((PsiLanguageInjectionHost)attributeValue)) { + if (InjectedLanguageFacadeImpl.hasInjections((PsiLanguageInjectionHost)attributeValue)) { return; } nameElement = domManager.getDomElement((XmlAttribute)attributeValue.getParent()); diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlAutoPopupHandler.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlAutoPopupHandler.java index 97cbbcef64c8..9995f3202056 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlAutoPopupHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlAutoPopupHandler.java @@ -26,7 +26,7 @@ import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiWhiteSpace; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; import com.intellij.psi.xml.XmlTag; import com.intellij.xml.util.XmlUtil; @@ -61,7 +61,7 @@ public class XmlAutoPopupHandler extends TypedHandlerDelegate { public boolean value(PsiFile file) { int offset = editor.getCaretModel().getOffset(); - PsiElement lastElement = InjectedLanguageUtil.findElementAtNoCommit(file, offset - 1); + PsiElement lastElement = InjectedLanguageFacadeImpl.findElementAtNoCommit(file, offset - 1); if (lastElement instanceof PsiFile) { //the very end of an injected file lastElement = file.findElementAt(offset - 1); } diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java b/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java index fb3329487988..c3cc4d979ee1 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java @@ -20,7 +20,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.html.HtmlTag; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; @@ -56,8 +56,8 @@ class XmlMover extends LineMover { final XmlText text2 = PsiTreeUtil.getParentOfType(movedEndElement, XmlText.class); // Let's do not care about injections for this mover - if ( ( text != null && InjectedLanguageUtil.getInjectedPsiFiles(text) != null) || - ( text2 != null && InjectedLanguageUtil.getInjectedPsiFiles(text2) != null)) { + if ( ( text != null && InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(text) != null) || + ( text2 != null && InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(text2) != null)) { return false; } diff --git a/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java b/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java index 075c8b9bbc2b..f0d3a014665d 100644 --- a/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java +++ b/xml/impl/src/com/intellij/psi/impl/cache/impl/idCache/XHtmlFilterLexer.java @@ -19,7 +19,7 @@ import com.intellij.lang.Language; import com.intellij.lang.xml.XMLLanguage; import com.intellij.lexer.Lexer; import com.intellij.psi.impl.cache.impl.BaseFilterLexer; -import com.intellij.psi.impl.cache.impl.CacheUtil; +import com.intellij.psi.impl.cache.CacheUtil; import com.intellij.psi.impl.cache.impl.OccurrenceConsumer; import com.intellij.psi.search.UsageSearchContext; import com.intellij.psi.tree.IElementType; diff --git a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTextImpl.java b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTextImpl.java index e5dd01f0d588..7adad3fb99e4 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTextImpl.java +++ b/xml/impl/src/com/intellij/psi/impl/source/xml/XmlTextImpl.java @@ -37,7 +37,7 @@ import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.psi.impl.source.tree.FileElement; import com.intellij.psi.impl.source.tree.LeafElement; import com.intellij.psi.impl.source.tree.TreeElement; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.impl.source.tree.injected.XmlTextLiteralEscaper; import com.intellij.psi.impl.source.xml.behavior.DefaultXmlPsiPolicy; import com.intellij.psi.tree.IElementType; @@ -365,7 +365,7 @@ public class XmlTextImpl extends XmlElementImpl implements XmlText, PsiLanguageI @Nullable public List> getInjectedPsi() { - return InjectedLanguageUtil.getInjectedPsiFiles(this); + return InjectedLanguageFacadeImpl.getInstance().getInjectedPsiFiles(this); } public TextRange getCDATAInterior() { @@ -520,6 +520,6 @@ public class XmlTextImpl extends XmlElementImpl implements XmlText, PsiLanguageI return new XmlTextLiteralEscaper(this); } public void processInjectedPsi(@NotNull InjectedPsiVisitor visitor) { - InjectedLanguageUtil.enumerate(this, visitor); + InjectedLanguageFacadeImpl.enumerate(this, visitor); } } diff --git a/xml/impl/src/com/intellij/xml/util/HtmlUtil.java b/xml/impl/src/com/intellij/xml/util/HtmlUtil.java index 27207f7d8178..1e8fb921b9c9 100644 --- a/xml/impl/src/com/intellij/xml/util/HtmlUtil.java +++ b/xml/impl/src/com/intellij/xml/util/HtmlUtil.java @@ -38,7 +38,7 @@ import com.intellij.psi.html.HtmlTag; import com.intellij.psi.impl.source.html.HtmlDocumentImpl; import com.intellij.psi.impl.source.parsing.xml.HtmlBuilderDriver; import com.intellij.psi.impl.source.parsing.xml.XmlBuilder; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageFacadeImpl; import com.intellij.psi.impl.source.xml.XmlAttributeImpl; import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; import com.intellij.psi.templateLanguages.TemplateLanguageUtil; @@ -471,7 +471,7 @@ public class HtmlUtil { for (final XmlText text : texts) { for (PsiElement _element : text.getChildren()) { if (_element instanceof PsiLanguageInjectionHost) { - InjectedLanguageUtil.enumerate(_element, injectedPsiVisitor); + InjectedLanguageFacadeImpl.enumerate(_element, injectedPsiVisitor); } } } @@ -481,7 +481,7 @@ public class HtmlUtil { if (comments != null && comments.length > 0) { for (final XmlComment comment : comments) { if (comment instanceof PsiLanguageInjectionHost) { - InjectedLanguageUtil.enumerate(comment, injectedPsiVisitor); + InjectedLanguageFacadeImpl.enumerate(comment, injectedPsiVisitor); } } }