/* * 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.javascript.flex.refactoring; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; import com.intellij.lang.javascript.JSBundle; import com.intellij.lang.javascript.psi.JSNamespace; import com.intellij.lang.javascript.psi.JSNamespaceImpl; import com.intellij.lang.javascript.psi.JSQualifiedName; import com.intellij.lang.javascript.psi.ecmal4.JSAttributeList; import com.intellij.lang.javascript.psi.ecmal4.JSQualifiedNamedElement; import com.intellij.lang.javascript.psi.impl.JSPsiImplUtils; import com.intellij.lang.javascript.psi.types.JSContext; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.impl.DirectoryIndex; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.file.PsiPackageBase; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.usageView.UsageViewLongNameLocation; import com.intellij.usageView.UsageViewShortNameLocation; import com.intellij.usageView.UsageViewTypeLocation; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; public class FlexPackageImpl extends PsiPackageBase implements NavigationItem, JSQualifiedNamedElement { private volatile CachedValue<Collection<PsiDirectory>> myDirectories; public FlexPackageImpl(PsiManager manager, String qualifiedName) { super(manager, qualifiedName); } @Override protected PsiElement findPackage(String qName) { return createInstance(getManager(), qName); } @Override protected FlexPackageImpl createInstance(PsiManager manager, String qName) { return new FlexPackageImpl(manager, qName); } protected Collection<PsiDirectory> getAllDirectories(boolean includeLibrarySources) { if (myDirectories == null) { CachedValueProvider<Collection<PsiDirectory>> provider = () -> { final PsiManager manager = PsiManager.getInstance(getProject()); Collection<PsiDirectory> directories = ContainerUtil.map(DirectoryIndex.getInstance(getProject()) .getDirectoriesByPackageName(getQualifiedName(), true).findAll(), virtualFile -> manager.findDirectory(virtualFile)); return CachedValueProvider.Result.create(directories, PsiModificationTracker.MODIFICATION_COUNT, ProjectRootManager .getInstance(getProject())); }; myDirectories = CachedValuesManager.getManager(getProject()).createCachedValue(provider, false); } return myDirectories.getValue(); } @Override public boolean isValid() { return getDirectories().length > 0; } @NotNull public Language getLanguage() { return StdFileTypes.JS.getLanguage(); } public String toString() { return "Package:" + getQualifiedName(); } public void navigate(final boolean requestFocus) { // TODO //ToolWindow window = ToolWindowManager.getInstance(getProject()).getToolWindow(ToolWindowId.PROJECT_VIEW); //window.activate(null); //window.getActivation().doWhenDone(new Runnable() { // public void run() { // final ProjectView projectView = ProjectView.getInstance(getProject()); // projectView.changeView(PackageViewPane.ID); // final PsiDirectory[] directories = getDirectories(); // final VirtualFile firstDir = directories[0].getVirtualFile(); // final boolean isLibraryRoot = ProjectRootsUtil.isLibraryRoot(firstDir, getProject()); // // final Module module = ProjectRootManager.getInstance(getProject()).getFileIndex().getModuleForFile(firstDir); // final PackageElement packageElement = new PackageElement(module, PsiPackageImpl.this, isLibraryRoot); // projectView.getProjectViewPaneById(PackageViewPane.ID).select(packageElement, firstDir, requestFocus); // } //}); } @Override public ASTNode findNameIdentifier() { return null; } @Override public PsiElement getNameIdentifier() { return null; } @NotNull @Override public JSContext getJSContext() { return JSContext.UNKNOWN; } public static class DescriptionProvider implements ElementDescriptionProvider { @Override @Nullable public String getElementDescription(@NotNull PsiElement element, @NotNull ElementDescriptionLocation location) { if (!(element instanceof FlexPackageImpl)) { return null; } if (location instanceof UsageViewLongNameLocation) { return JSBundle.message("package.description", ((FlexPackageImpl)element).getQualifiedName()); } else if (location instanceof UsageViewShortNameLocation) { return StringUtil.notNullize(((FlexPackageImpl)element).getName()); } else if (location instanceof UsageViewTypeLocation) { return JSBundle.message("javascript.language.term.package"); } return null; } } @Nullable @Override public JSQualifiedName getNamespace() { return JSPsiImplUtils.buildNamespaceFromQualifiedName(this); } @Override public boolean isNamespaceExplicitlyDeclared() { return true; } @NotNull @Override public JSAttributeList.AccessType getAccessType() { return JSAttributeList.AccessType.PACKAGE_LOCAL; } @Override public boolean isDeprecated() { return false; } @NotNull @Override public ClassOrInterface isClassOrInterface() { return ClassOrInterface.NONE; } @NotNull @Override public JSNamespace getJSNamespace() { return new JSNamespaceImpl(getNamespace(), getJSContext(), isNamespaceExplicitlyDeclared()); } }