diff --git a/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml b/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml index 765a70d281bd..9d8fcea7e897 100644 --- a/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml +++ b/java/structuralsearch-java/src/META-INF/structuralsearch-java.xml @@ -2,5 +2,6 @@ + diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/IdeaOpenApiClassFinder.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/IdeaOpenApiClassFinder.java new file mode 100644 index 000000000000..c19793b809c9 --- /dev/null +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/IdeaOpenApiClassFinder.java @@ -0,0 +1,41 @@ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.structuralsearch; + +import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.NonClasspathClassFinder; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.structuralsearch.plugin.util.StructuralSearchScriptScope; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class IdeaOpenApiClassFinder extends NonClasspathClassFinder { + public IdeaOpenApiClassFinder(@NotNull Project project) { + super(project); + } + + @Override + protected List calcClassRoots() { + LocalFileSystem lfs = LocalFileSystem.getInstance(); + return Stream.of(PsiClass.class, PsiElement.class) + .map(PathManager::getJarPathForClass) + .filter(Objects::nonNull) + .map(File::new) + .map(lfs::refreshAndFindFileByIoFile) + .collect(Collectors.toList()); + } + + @Override + public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { + return !(scope instanceof StructuralSearchScriptScope) ? null : super.findClass(qualifiedName, scope); + } +} diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java index 576d81a2deb6..796afb4d3e53 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/EditVarConstraintsDialog.java @@ -1,24 +1,11 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.structuralsearch.plugin.ui; import com.intellij.codeInsight.template.impl.Variable; import com.intellij.find.impl.RegExHelpPopup; import com.intellij.icons.AllIcons; import com.intellij.ide.highlighter.HighlighterFactory; +import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; @@ -43,6 +30,7 @@ import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.psi.PsiCodeFragment; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; @@ -51,6 +39,7 @@ import com.intellij.structuralsearch.impl.matcher.predicates.ScriptLog; import com.intellij.structuralsearch.impl.matcher.predicates.ScriptSupport; import com.intellij.structuralsearch.plugin.replace.ReplaceOptions; import com.intellij.structuralsearch.plugin.replace.ui.ReplaceConfiguration; +import com.intellij.structuralsearch.plugin.util.StructuralSearchScriptScope; import com.intellij.ui.EditorTextField; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.containers.ContainerUtil; @@ -65,10 +54,8 @@ import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.Collection; -import java.util.HashSet; +import java.util.*; import java.util.List; -import java.util.Set; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -633,8 +620,23 @@ class EditVarConstraintsDialog extends DialogWrapper { } Editor createEditor(final Project project, final String text, final String fileName) { + Language groovy = Language.findLanguageByID("Groovy"); + Document doc = null; final FileType fileType = getFileType(fileName); - final Document doc = createDocument(fileName, fileType, text); + if (groovy != null) { + // there is no right way to create a code fragment for generic language, so we use this hole since we need extend resolve scope + for (StructuralSearchProfile profile : StructuralSearchProfile.EP_NAME.getExtensions()) { + if (profile.isMyLanguage(groovy)) { + PsiCodeFragment fragment = Objects.requireNonNull(profile.createCodeFragment(project, text, null)); + fragment.forceResolveScope(new StructuralSearchScriptScope(myProject)); + doc = PsiDocumentManager.getInstance(project).getDocument(fragment); + break; + } + } + } + if (doc == null) { + doc = createDocument(fileName, fileType, text); + } final Editor editor = EditorFactory.getInstance().createEditor(doc, project); ((EditorEx)editor).setEmbeddedIntoDialogWrapper(true); diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/util/StructuralSearchScriptScope.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/util/StructuralSearchScriptScope.java new file mode 100644 index 000000000000..8756f20c397b --- /dev/null +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/util/StructuralSearchScriptScope.java @@ -0,0 +1,13 @@ +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.structuralsearch.plugin.util; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.DelegatingGlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScope; +import org.jetbrains.annotations.NotNull; + +public class StructuralSearchScriptScope extends DelegatingGlobalSearchScope{ + public StructuralSearchScriptScope(@NotNull Project project) { + super(GlobalSearchScope.everythingScope(project)); + } +}