package com.intellij.lang.javascript.flex.projectStructure.conversion; import com.intellij.conversion.*; import com.intellij.lang.javascript.flex.library.FlexLibraryType; import com.intellij.openapi.roots.impl.OrderEntryFactory; import com.intellij.openapi.roots.impl.libraries.LibraryImpl; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.util.Function; import com.intellij.util.containers.hash.HashSet; import org.jdom.Element; import java.io.File; import java.util.Collection; import java.util.Set; class FlexLibrariesConverter extends ConversionProcessor<ProjectLibrariesSettings> { private final ConversionContext myContext; private final ConversionParams myParams; public FlexLibrariesConverter(final ConversionContext context, final ConversionParams params) { myContext = context; myParams = params; } public boolean isConversionNeeded(final ProjectLibrariesSettings projectLibrariesSettings) { Collection<String> projectLibrariesNames = getProjectLibrariesNames(projectLibrariesSettings); try { for (File moduleFile : myContext.getModuleFiles()) { ModuleSettings moduleSettings; if (!moduleFile.exists() || !FlexModuleConverter.isConversionNeededStatic(moduleSettings = myContext.getModuleSettings(moduleFile))) { continue; } for (Element orderEntry : moduleSettings.getOrderEntries()) { String orderEntryType = orderEntry.getAttributeValue(OrderEntryFactory.ORDER_ENTRY_TYPE_ATTR); if ("library".equals(orderEntryType)) { String libraryName = orderEntry.getAttributeValue("name"); String libraryLevel = orderEntry.getAttributeValue("level"); if (LibraryTablesRegistrar.PROJECT_LEVEL.equals(libraryLevel) && projectLibrariesNames.contains(libraryName)) { return true; } } } } return false; } catch (CannotConvertException e) { return false; } } public void process(final ProjectLibrariesSettings projectLibrariesSettings) throws CannotConvertException { } public void preProcess(final ProjectLibrariesSettings projectLibrariesSettings) throws CannotConvertException { myParams.setProjectLibrariesNames(getProjectLibrariesNames(projectLibrariesSettings)); } private Collection<String> getProjectLibrariesNames(final ProjectLibrariesSettings projectLibrariesSettings) { Set<String> librariesNames = new HashSet<>(); for (Element element : projectLibrariesSettings.getProjectLibraries()) { if (!FlexModuleConverter.isApplicableLibrary(element, s -> myParams.expandPath(s))) { // ignore non-flex project library continue; } librariesNames.add(LIB_NAME_MAPPER.fun(element)); } return librariesNames; } public void postProcess(final ProjectLibrariesSettings projectLibrariesSettings) throws CannotConvertException { final Set<String> librariesToMakeFlex = myParams.getProjectLibrariesToMakeFlex(); for (Element libraryElement : projectLibrariesSettings.getProjectLibraries()) { if (librariesToMakeFlex.contains(LIB_NAME_MAPPER.fun(libraryElement))) { libraryElement.setAttribute(LibraryImpl.LIBRARY_TYPE_ATTR, FlexLibraryType.FLEX_LIBRARY.getKindId()); } } } private static final Function<Element, String> LIB_NAME_MAPPER = element -> element.getAttributeValue(LibraryImpl.LIBRARY_NAME_ATTR); }