diff options
Diffstat (limited to 'java/java-impl/src/com/intellij/psi/impl')
7 files changed, 34 insertions, 393 deletions
diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java index 58476c6fc799..8ea592fd99aa 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java @@ -23,6 +23,7 @@ import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.module.EffectiveLanguageLevelUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; @@ -39,6 +40,7 @@ import com.intellij.psi.impl.compiled.ClsClassImpl; import com.intellij.psi.impl.source.codeStyle.ImportHelper; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; @@ -137,9 +139,35 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper return clsFile; } - @Nullable + @NotNull @Override - public LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile) { + public LanguageLevel getEffectiveLanguageLevel(@Nullable VirtualFile virtualFile) { + if (virtualFile == null) return PsiUtil.getLanguageLevel(myProject); + + final VirtualFile folder = virtualFile.getParent(); + if (folder != null) { + final LanguageLevel level = folder.getUserData(LanguageLevel.KEY); + if (level != null) return level; + } + + final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex(); + Module module = index.getModuleForFile(virtualFile); + if (module != null && index.isInSourceContent(virtualFile)) { + return EffectiveLanguageLevelUtil.getEffectiveLanguageLevel(module); + } + + LanguageLevel classesLanguageLevel = getClassesLanguageLevel(virtualFile); + return classesLanguageLevel != null ? classesLanguageLevel : PsiUtil.getLanguageLevel(myProject); + } + + /** + * For files under a library source root, returns the language level configured for the corresponding classes root. + * + * @param virtualFile virtual file for which language level is requested. + * @return language level for classes root or null if file is not under a library source root or no matching classes root is found. + */ + @Nullable + private LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile) { final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex(); final VirtualFile sourceRoot = index.getSourceRootForFile(virtualFile); final VirtualFile folder = virtualFile.getParent(); diff --git a/java/java-impl/src/com/intellij/psi/impl/file/JavaDirectoryServiceImpl.java b/java/java-impl/src/com/intellij/psi/impl/file/JavaDirectoryServiceImpl.java index 5464c6cbd83d..005629c81cd9 100644 --- a/java/java-impl/src/com/intellij/psi/impl/file/JavaDirectoryServiceImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/file/JavaDirectoryServiceImpl.java @@ -27,17 +27,13 @@ import com.intellij.ide.fileTemplates.JavaTemplateUtil; import com.intellij.ide.fileTemplates.ui.CreateFromTemplateDialog; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.module.LanguageLevelUtil; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.impl.JavaPsiImplementationHelper; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -162,7 +158,7 @@ public class JavaDirectoryServiceImpl extends CoreJavaDirectoryService { } private static String getIncorrectTemplateMessage(String templateName) { - return PsiBundle.message("psi.error.incorroect.class.template.message", + return PsiBundle.message("psi.error.incorrect.class.template.message", FileTemplateManager.getInstance().internalTemplateToSubject(templateName), templateName); } @@ -177,7 +173,7 @@ public class JavaDirectoryServiceImpl extends CoreJavaDirectoryService { String fileName = name + "." + StdFileTypes.JAVA.getDefaultExtension(); directory.checkCreateFile(fileName); - PsiNameHelper helper = JavaPsiFacade.getInstance(directory.getProject()).getNameHelper(); + PsiNameHelper helper = PsiNameHelper.getInstance(directory.getProject()); PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory); String qualifiedName = aPackage == null ? null : aPackage.getQualifiedName(); if (!StringUtil.isEmpty(qualifiedName) && !helper.isQualifiedName(qualifiedName)) { @@ -192,28 +188,9 @@ public class JavaDirectoryServiceImpl extends CoreJavaDirectoryService { return file.equals(sourceRoot); } - private static final Key<LanguageLevel> LANG_LEVEL_IN_DIRECTORY = new Key<LanguageLevel>("LANG_LEVEL_IN_DIRECTORY"); @Override public LanguageLevel getLanguageLevel(@NotNull PsiDirectory dir) { - synchronized (PsiLock.LOCK) { - LanguageLevel level = dir.getUserData(LANG_LEVEL_IN_DIRECTORY); - if (level == null) { - level = getLanguageLevelInner(dir); - dir.putUserData(LANG_LEVEL_IN_DIRECTORY, level); - } - return level; - } - } - - private static LanguageLevel getLanguageLevelInner(@NotNull PsiDirectory dir) { - final VirtualFile virtualFile = dir.getVirtualFile(); - final Project project = dir.getProject(); - final Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(virtualFile); - if (module != null) { - return LanguageLevelUtil.getEffectiveLanguageLevel(module); - } - - return LanguageLevelProjectExtension.getInstance(project).getLanguageLevel(); + return JavaPsiImplementationHelper.getInstance(dir.getProject()).getEffectiveLanguageLevel(dir.getVirtualFile()); } } diff --git a/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java deleted file mode 100644 index 8e52d775a846..000000000000 --- a/java/java-impl/src/com/intellij/psi/impl/search/AnnotatedPackagesSearcher.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2000-2013 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. - */ - -/* - * @author max - */ -package com.intellij.psi.impl.search; - -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.psi.impl.PsiManagerImpl; -import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.PsiSearchHelper; -import com.intellij.psi.search.SearchScope; -import com.intellij.psi.search.searches.AnnotatedPackagesSearch; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.Processor; -import com.intellij.util.QueryExecutor; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; - -public class AnnotatedPackagesSearcher implements QueryExecutor<PsiPackage, AnnotatedPackagesSearch.Parameters> { - private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.search.AnnotatedPackagesSearcher"); - - @Override - public boolean execute(@NotNull final AnnotatedPackagesSearch.Parameters p, @NotNull final Processor<PsiPackage> consumer) { - final PsiClass annClass = p.getAnnotationClass(); - assert annClass.isAnnotationType() : "Annotation type should be passed to annotated packages search"; - - final String annotationFQN = annClass.getQualifiedName(); - assert annotationFQN != null; - - final PsiManagerImpl psiManager = (PsiManagerImpl)annClass.getManager(); - final SearchScope useScope = p.getScope(); - - final String annotationShortName = annClass.getName(); - assert annotationShortName != null; - - final GlobalSearchScope scope = useScope instanceof GlobalSearchScope ? (GlobalSearchScope)useScope : null; - - final Collection<PsiAnnotation> annotations = JavaAnnotationIndex.getInstance().get(annotationShortName, psiManager.getProject(), scope); - for (PsiAnnotation annotation : annotations) { - PsiModifierList modlist = (PsiModifierList)annotation.getParent(); - final PsiElement owner = modlist.getParent(); - if (!(owner instanceof PsiClass)) continue; - PsiClass candidate = (PsiClass)owner; - if (!"package-info".equals(candidate.getName())) continue; - - LOG.assertTrue(candidate.isValid()); - - final PsiJavaCodeReferenceElement ref = annotation.getNameReferenceElement(); - if (ref == null) continue; - - if (!psiManager.areElementsEquivalent(ref.resolve(), annClass)) continue; - if (useScope instanceof GlobalSearchScope && - !((GlobalSearchScope)useScope).contains(candidate.getContainingFile().getVirtualFile())) { - continue; - } - final String qname = candidate.getQualifiedName(); - if (qname != null && !consumer.process(JavaPsiFacade.getInstance(psiManager.getProject()).findPackage( - qname.substring(0, qname.lastIndexOf('.'))))) { - return false; - } - } - - PsiSearchHelper helper = PsiSearchHelper.SERVICE.getInstance(psiManager.getProject()); - final GlobalSearchScope infoFilesFilter = new PackageInfoFilesOnly(); - - GlobalSearchScope infoFiles = - useScope instanceof GlobalSearchScope ? ((GlobalSearchScope)useScope).intersectWith(infoFilesFilter) : infoFilesFilter; - - final boolean[] wantmore = {true}; - helper.processAllFilesWithWord(annotationShortName, infoFiles, new Processor<PsiFile>() { - @Override - public boolean process(final PsiFile psiFile) { - PsiPackageStatement stmt = PsiTreeUtil.getChildOfType(psiFile, PsiPackageStatement.class); - if (stmt == null) return true; - - final PsiModifierList annotations = stmt.getAnnotationList(); - if (annotations == null) return true; - final PsiAnnotation ann = annotations.findAnnotation(annotationFQN); - if (ann == null) return true; - - final PsiJavaCodeReferenceElement ref = ann.getNameReferenceElement(); - if (ref == null) return true; - - if (!psiManager.areElementsEquivalent(ref.resolve(), annClass)) return true; - - wantmore[0] = consumer.process(JavaPsiFacade.getInstance(psiManager.getProject()).findPackage(stmt.getPackageName())); - return wantmore[0]; - } - }, true); - - return wantmore[0]; - } - - private static class PackageInfoFilesOnly extends GlobalSearchScope { - @Override - public int compare(@NotNull final VirtualFile file1, @NotNull final VirtualFile file2) { - return 0; - } - - @Override - public boolean contains(@NotNull final VirtualFile file) { - return "package-info.java".equals(file.getName()); - } - - @Override - public boolean isSearchInLibraries() { - return false; - } - - @Override - public boolean isSearchInModuleContent(@NotNull final Module aModule) { - return true; - } - } -}
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/search/VariableInIncompleteCodeSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/VariableInIncompleteCodeSearcher.java deleted file mode 100644 index fc0ca69b6a4c..000000000000 --- a/java/java-impl/src/com/intellij/psi/impl/search/VariableInIncompleteCodeSearcher.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2000-2011 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.search; - -import com.intellij.lang.java.JavaLanguage; -import com.intellij.openapi.application.QueryExecutorBase; -import com.intellij.psi.*; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.PsiElementProcessor; -import com.intellij.psi.search.SearchScope; -import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.Processor; -import org.jetbrains.annotations.NotNull; - -/** - * Looks for references to local variable or method parameter in invalid (incomplete) code. - */ -public class VariableInIncompleteCodeSearcher extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> { - public VariableInIncompleteCodeSearcher() { - super(true); - } - - @Override - public void processQuery(@NotNull final ReferencesSearch.SearchParameters p, @NotNull final Processor<PsiReference> consumer) { - final PsiElement refElement = p.getElementToSearch(); - if (!refElement.isValid() || !(refElement instanceof PsiLocalVariable || refElement instanceof PsiParameter)) return; - - final String name = ((PsiVariable)refElement).getName(); - if (name == null) return; - - final SearchScope scope = p.getEffectiveSearchScope(); - if (!(scope instanceof LocalSearchScope)) return; - - PsiElement[] elements = ((LocalSearchScope)scope).getScope(); - if (elements == null || elements.length == 0) return; - - PsiElementProcessor processor = new PsiElementProcessor() { - @Override - public boolean execute(@NotNull final PsiElement element) { - if (element instanceof PsiJavaCodeReferenceElement) { - final PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)element; - if (!ref.isQualified() && name.equals(ref.getText()) && - ref.resolve() == null && ref.advancedResolve(true).getElement() == refElement) { - consumer.process(ref); - } - } - return true; - } - }; - - for (PsiElement element : elements) { - if (element.getLanguage().isKindOf(JavaLanguage.INSTANCE)) { - PsiTreeUtil.processElements(element, processor); - } - } - } -} diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/manipulators/PsiDocTagValueManipulator.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/manipulators/PsiDocTagValueManipulator.java deleted file mode 100644 index 34c1d9df885f..000000000000 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/manipulators/PsiDocTagValueManipulator.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2014 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.source.resolve.reference.impl.manipulators; - -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.AbstractElementManipulator; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiElement; -import com.intellij.psi.javadoc.PsiDocTag; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; - -/** - * @author Gregory.Shrago - */ -public class PsiDocTagValueManipulator extends AbstractElementManipulator<PsiDocTag> { - - @Override - public PsiDocTag handleContentChange(@NotNull PsiDocTag tag, @NotNull TextRange range, String newContent) throws IncorrectOperationException { - final StringBuilder replacement = new StringBuilder( tag.getText() ); - - replacement.replace( - range.getStartOffset(), - range.getEndOffset(), - newContent - ); - return (PsiDocTag)tag.replace(JavaPsiFacade.getInstance(tag.getProject()).getElementFactory().createDocTagFromText(replacement.toString())); - } - - @NotNull - @Override - public TextRange getRangeInElement(@NotNull final PsiDocTag tag) { - final PsiElement[] elements = tag.getDataElements(); - if (elements.length == 0) { - final PsiElement name = tag.getNameElement(); - final int offset = name.getStartOffsetInParent() + name.getTextLength(); - return new TextRange(offset, offset); - } - final PsiElement first = elements[0]; - final PsiElement last = elements[elements.length - 1]; - return new TextRange(first.getStartOffsetInParent(), last.getStartOffsetInParent()+last.getTextLength()); - } -}
\ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/manipulators/StringLiteralManipulator.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/manipulators/StringLiteralManipulator.java deleted file mode 100644 index 9d9b1f1ce9e2..000000000000 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/manipulators/StringLiteralManipulator.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2014 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.source.resolve.reference.impl.manipulators; - -import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; - -/** - * @author ven - */ -public class StringLiteralManipulator extends AbstractElementManipulator<PsiLiteralExpression> { - @Override - public PsiLiteralExpression handleContentChange(@NotNull PsiLiteralExpression expr, @NotNull TextRange range, String newContent) throws IncorrectOperationException { - String oldText = expr.getText(); - if (oldText.startsWith("\"")) { - newContent = StringUtil.escapeStringCharacters(newContent); - } - else if (oldText.startsWith("'") && newContent.length() <= 1) { - newContent = newContent.length() == 1 && newContent.charAt(0) == '\''? "\\'" : newContent; - } - else { - throw new IncorrectOperationException("cannot handle content change for: " + oldText + ", expr: " + expr); - } - - String newText = oldText.substring(0, range.getStartOffset()) + newContent + oldText.substring(range.getEndOffset()); - final PsiExpression newExpr = JavaPsiFacade.getInstance(expr.getProject()).getElementFactory().createExpressionFromText(newText, null); - return (PsiLiteralExpression)expr.replace(newExpr); - } - - @NotNull - @Override - public TextRange getRangeInElement(@NotNull final PsiLiteralExpression element) { - return getValueRange(element); - } - - public static TextRange getValueRange(PsiLiteralExpression element) { - final Object value = element.getValue(); - if (!(value instanceof String || value instanceof Character)) return TextRange.from(0, element.getTextLength()); - return new TextRange(1, Math.max(1, element.getTextLength() - 1)); - } -} diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/GenericReferenceProvider.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/GenericReferenceProvider.java deleted file mode 100644 index 216dcddb351f..000000000000 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/GenericReferenceProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.psi.impl.source.resolve.reference.impl.providers; - -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiReferenceProvider; -import com.intellij.psi.scope.PsiScopeProcessor; -import com.intellij.psi.scope.util.PsiScopesUtil; - -/** - * Created by IntelliJ IDEA. - * User: ik - * Date: 27.03.2003 - * Time: 17:23:43 - * To change this template use Options | File Templates. - */ -public abstract class GenericReferenceProvider extends PsiReferenceProvider { - private boolean mySoft = false; - - public void handleEmptyContext(PsiScopeProcessor processor, PsiElement position) { - PsiScopesUtil.treeWalkUp(processor, position, null); - } - - public void setSoft(boolean softFlag) { - mySoft = softFlag; - } - - public boolean isSoft() { - return mySoft; - } -} |