/* * 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 org.jetbrains.plugins.groovy.lang.psi.util; import com.intellij.psi.PsiFile; import com.intellij.util.containers.MultiMap; 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; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.util.LightCacheKey; import java.util.Collection; /** * @author Max Medvedev */ public class GrImportUtil { private static final LightCacheKey<MultiMap<String, String>> KEY = LightCacheKey.createByFileModificationCount(); public static boolean acceptName(GrReferenceElement ref, String expected) { final String actual = ref.getReferenceName(); if (expected.equals(actual)) return true; if (ref.getQualifier() != null) return false; final PsiFile file = ref.getContainingFile(); if (file instanceof GroovyFile) { MultiMap<String, String> data = KEY.getCachedValue(file); if (data == null) { data = collectAliases((GroovyFile)file); KEY.putCachedValue(file, data); } final Collection<String> aliases = data.get(expected); return aliases.contains(actual); } return false; } @NotNull private static MultiMap<String, String> collectAliases(@NotNull GroovyFile file) { MultiMap<String, String> aliases = MultiMap.createSet(); for (GrImportStatement anImport : file.getImportStatements()) { if (anImport.isAliasedImport()) { final GrCodeReferenceElement importReference = anImport.getImportReference(); if (importReference != null) { final String refName = importReference.getReferenceName(); if (refName != null) { aliases.putValue(refName, anImport.getImportedName()); } } } } return aliases; } }